@wrongstack/core 0.6.6 → 0.7.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.
Files changed (52) hide show
  1. package/dist/{agent-bridge-BBXK_ppx.d.ts → agent-bridge-CrQpYjM7.d.ts} +1 -1
  2. package/dist/{compactor-C8NhpSt5.d.ts → compactor-CWV1u-IU.d.ts} +1 -1
  3. package/dist/{config-DfC6g6KV.d.ts → config-C34JRwl4.d.ts} +1 -1
  4. package/dist/{context-DN5v-uQX.d.ts → context-bmR0YgBm.d.ts} +74 -8
  5. package/dist/coordination/index.d.ts +11 -11
  6. package/dist/coordination/index.js +115 -39
  7. package/dist/coordination/index.js.map +1 -1
  8. package/dist/default-config-DvRSTELf.d.ts +20 -0
  9. package/dist/defaults/index.d.ts +20 -19
  10. package/dist/defaults/index.js +224 -64
  11. package/dist/defaults/index.js.map +1 -1
  12. package/dist/{events-CJqwQl8G.d.ts → events-CEKFTmIY.d.ts} +10 -1
  13. package/dist/execution/index.d.ts +27 -13
  14. package/dist/execution/index.js +153 -40
  15. package/dist/execution/index.js.map +1 -1
  16. package/dist/extension/index.d.ts +6 -6
  17. package/dist/extension/index.js +3 -1
  18. package/dist/extension/index.js.map +1 -1
  19. package/dist/{index-DcnXDPdY.d.ts → index-BJIFLGII.d.ts} +20 -5
  20. package/dist/{index-CXnWsGBp.d.ts → index-CZR0HjxM.d.ts} +14 -110
  21. package/dist/index.d.ts +27 -26
  22. package/dist/index.js +396 -180
  23. package/dist/index.js.map +1 -1
  24. package/dist/infrastructure/index.d.ts +6 -6
  25. package/dist/kernel/index.d.ts +9 -9
  26. package/dist/kernel/index.js +8 -4
  27. package/dist/kernel/index.js.map +1 -1
  28. package/dist/{mcp-servers-CevFHHM1.d.ts → mcp-servers-BRJicm5o.d.ts} +3 -3
  29. package/dist/models/index.d.ts +2 -2
  30. package/dist/{multi-agent-D5IbASk_.d.ts → multi-agent-Cm1wYSrw.d.ts} +9 -4
  31. package/dist/{agent-subagent-runner-DsSm9lKN.d.ts → multi-agent-coordinator-CCupVFqv.d.ts} +117 -4
  32. package/dist/observability/index.d.ts +2 -2
  33. package/dist/{path-resolver-CBx_q1HA.d.ts → path-resolver-CfT7e_HT.d.ts} +2 -2
  34. package/dist/{plan-templates-BEOllUJV.d.ts → plan-templates-Q78an-GJ.d.ts} +4 -4
  35. package/dist/{provider-runner-Byh5TcJs.d.ts → provider-runner-WDj28o7J.d.ts} +3 -3
  36. package/dist/{retry-policy-BZSIMxrJ.d.ts → retry-policy-Dpxp4SET.d.ts} +1 -1
  37. package/dist/sdd/index.d.ts +3 -3
  38. package/dist/{secret-scrubber-CT7wefiO.d.ts → secret-scrubber-C2YCYtkn.d.ts} +1 -1
  39. package/dist/{secret-scrubber-I0QHY_ob.d.ts → secret-scrubber-CowtdEF8.d.ts} +1 -1
  40. package/dist/security/index.d.ts +3 -3
  41. package/dist/{selector-DDb_mq9X.d.ts → selector-CP39HhCe.d.ts} +1 -1
  42. package/dist/{session-reader-B9nVkziM.d.ts → session-reader-Dwjn4WZR.d.ts} +1 -1
  43. package/dist/storage/index.d.ts +5 -5
  44. package/dist/storage/index.js +94 -11
  45. package/dist/storage/index.js.map +1 -1
  46. package/dist/{system-prompt-gL06H9P4.d.ts → system-prompt-CfgXqyv2.d.ts} +1 -1
  47. package/dist/{tool-executor-BF7QfYVE.d.ts → tool-executor-D5NFi_LV.d.ts} +5 -5
  48. package/dist/types/index.d.ts +16 -15
  49. package/dist/types/index.js +102 -23
  50. package/dist/types/index.js.map +1 -1
  51. package/dist/utils/index.d.ts +1 -1
  52. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/token-estimate.ts","../../src/utils/message-invariants.ts","../../src/execution/compactor.ts","../../src/types/blocks.ts","../../src/execution/intelligent-compactor.ts","../../src/models/llm-selector.ts","../../src/execution/selective-compactor.ts","../../src/types/errors.ts","../../src/execution/auto-compaction-middleware.ts","../../src/utils/tool-output-serializer.ts","../../src/execution/tool-executor.ts","../../src/utils/regex-guard.ts","../../src/execution/autonomous-runner.ts","../../src/utils/atomic-write.ts","../../src/storage/goal-store.ts","../../src/execution/eternal-autonomy.ts","../../src/coordination/subagent-budget.ts","../../src/coordination/agent-subagent-runner.ts","../../src/types/provider.ts","../../src/coordination/fleet.ts","../../src/coordination/multi-agent-coordinator.ts","../../src/execution/parallel-eternal-engine.ts","../../src/execution/autonomy-prompt-contributor.ts","../../src/execution/goal-preamble.ts","../../src/execution/retry-policy.ts","../../src/execution/error-handler.ts","../../src/execution/skill-loader.ts"],"names":["hasToolUse","repair","afterTokens","stat","path2","fsp","baseMessage","sleep","GOAL_COMPLETE_MARKER","randomUUID","execFile","promisify","execFileP","fs2","path3"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Shared token estimation with JSON.stringify caching.\n * Avoids repeated stringification of tool input objects.\n */\n\nconst RoughTokenEstimate = (text: string, charsPerToken = 3.5): number =>\n Math.max(1, Math.ceil(text.length / charsPerToken));\n\n/**\n * Cache of computed estimates keyed by the stringified input — not the\n * input object itself. Previously the cache was keyed by the input object\n * via WeakMap, but JSON.stringify() produces a new object reference each\n * call so the cache never hit. Now we use a Map with string keys so that\n * repeated stringifications of the same structure share a single entry.\n */\nconst ESTIMATE_CACHE = new Map<string, number>();\n\nconst ESTIMATE_CACHE_MAX_SIZE = 10_000;\n\nfunction getCachedEstimate(key: string, compute: () => number): number {\n const existing = ESTIMATE_CACHE.get(key);\n if (existing !== undefined) return existing;\n if (ESTIMATE_CACHE.size >= ESTIMATE_CACHE_MAX_SIZE) {\n // Evict oldest quarter when at capacity — simple LRU-ish policy.\n const keys = [...ESTIMATE_CACHE.keys()];\n for (let i = 0; i < Math.floor(ESTIMATE_CACHE_MAX_SIZE / 4); i++) {\n ESTIMATE_CACHE.delete(keys[i]!);\n }\n }\n const estimate = compute();\n ESTIMATE_CACHE.set(key, estimate);\n return estimate;\n}\n\n/**\n * Estimate tokens for a tool_use block input.\n * Caches the stringified result keyed by the stable string representation\n * to avoid repeated JSON.stringify calls during context window checks.\n */\nexport function estimateToolInputTokens(input: unknown): number {\n if (typeof input === 'string') return RoughTokenEstimate(input);\n if (input === null || typeof input !== 'object') {\n return RoughTokenEstimate(String(input));\n }\n const key = JSON.stringify(input);\n return getCachedEstimate(key, () => RoughTokenEstimate(key));\n}\n\n/**\n * Estimate tokens for a tool_result content.\n */\nexport function estimateToolResultTokens(content: string | unknown): number {\n if (typeof content === 'string') return RoughTokenEstimate(content);\n const key = JSON.stringify(content);\n return getCachedEstimate(key, () => RoughTokenEstimate(key));\n}\n\n/**\n * Estimate tokens for a text block.\n */\nexport function estimateTextTokens(text: string): number {\n return RoughTokenEstimate(text);\n}\n\n/**\n * Rough estimate of tokens in a tool definition (name + description + schema).\n * Accounts for the JSON-serialized inputSchema which is sent to the API\n * but NOT included in roughEstimate(content).\n */\nexport function estimateToolDefTokens(tool: { name: string; description?: string; inputSchema: unknown }): number {\n return RoughTokenEstimate(tool.name) +\n RoughTokenEstimate(tool.description ?? '') +\n RoughTokenEstimate(JSON.stringify(tool.inputSchema));\n}\n\n/**\n * Estimate the total API request token count: system prompt + tool definitions\n * + conversation messages. Use this for context-window bar calculations\n * instead of roughEstimate (which only counts messages).\n *\n * The overhead ratio (overhead / messages) varies by conversation length:\n * - Short conversations (< 10 messages): ~30-50% overhead (large system+tools)\n * - Medium (10-50 messages): ~15-30%\n * - Long (> 50 messages): ~5-15%\n *\n * Returns { messages, systemPrompt, tools, total } for debugging display.\n */\nexport interface RequestTokenBreakdown {\n messages: number;\n systemPrompt: number;\n tools: number;\n total: number;\n}\n\nexport function estimateRequestTokens(\n messages: unknown,\n systemPrompt: unknown,\n tools: { name: string; description?: string; inputSchema: unknown }[],\n): RequestTokenBreakdown {\n // Messages: apply the same logic as roughEstimate\n let messagesTokens = 0;\n if (typeof messages === 'string') {\n messagesTokens = RoughTokenEstimate(messages);\n } else if (Array.isArray(messages)) {\n for (const m of messages) {\n if (typeof m === 'object' && m !== null && 'content' in m) {\n const content = (m as { content: unknown }).content;\n if (typeof content === 'string') {\n messagesTokens += RoughTokenEstimate(content);\n } else if (Array.isArray(content)) {\n for (const b of content) {\n if (typeof b === 'object' && b !== null) {\n if ((b as { type?: string }).type === 'text') {\n messagesTokens += RoughTokenEstimate((b as { text: string }).text);\n } else {\n messagesTokens += RoughTokenEstimate(JSON.stringify(b));\n }\n }\n }\n }\n }\n }\n }\n\n // System prompt\n let systemTokens = 0;\n if (typeof systemPrompt === 'string') {\n systemTokens = RoughTokenEstimate(systemPrompt);\n } else if (Array.isArray(systemPrompt)) {\n for (const b of systemPrompt) {\n if (typeof b === 'object' && b !== null && (b as { type?: string }).type === 'text') {\n systemTokens += RoughTokenEstimate((b as { text: string }).text);\n }\n }\n }\n\n // Tool definitions\n let toolsTokens = 0;\n for (const t of tools) {\n toolsTokens += estimateToolDefTokens(t);\n }\n\n return {\n messages: messagesTokens,\n systemPrompt: systemTokens,\n tools: toolsTokens,\n total: messagesTokens + systemTokens + toolsTokens,\n };\n}\n","import type { ContentBlock, ToolResultBlock, ToolUseBlock } from '../types/blocks.js';\nimport type { Message } from '../types/messages.js';\n\nexport interface MessageRepairReport {\n changed: boolean;\n removedToolUses: string[];\n removedToolResults: string[];\n removedMessages: number;\n}\n\nexport interface MessageRepairResult {\n messages: Message[];\n report: MessageRepairReport;\n}\n\n/**\n * Repair provider-level tool-call adjacency invariants.\n *\n * Anthropic requires every assistant `tool_use` block to have a matching\n * `tool_result` block in the immediately following user message. Manual\n * context surgery (summary/prune) can cut through the middle of such an\n * exchange. This function removes only the now-orphaned protocol blocks,\n * preserving surrounding text/images/thinking blocks where possible.\n */\nexport function repairToolUseAdjacency(messages: Message[]): MessageRepairResult {\n const removedToolUses: string[] = [];\n const removedToolResults: string[] = [];\n let removedMessages = 0;\n let changed = false;\n const out: Message[] = [];\n\n for (let i = 0; i < messages.length; i++) {\n const original = messages[i]!;\n let msg = original;\n\n if (hasToolUse(msg)) {\n const nextIds = toolResultIds(messages[i + 1]);\n const filtered = mapContent(msg, (blocks) => {\n const next: ContentBlock[] = [];\n for (const block of blocks) {\n if (block.type === 'tool_use' && !nextIds.has(block.id)) {\n removedToolUses.push(block.id);\n changed = true;\n continue;\n }\n next.push(block);\n }\n return next;\n });\n msg = filtered ?? msg;\n }\n\n if (hasToolResult(msg)) {\n const allowed = toolUseIds(out[out.length - 1]);\n const filtered = mapContent(msg, (blocks) => {\n const next: ContentBlock[] = [];\n for (const block of blocks) {\n if (block.type === 'tool_result' && !allowed.has(block.tool_use_id)) {\n removedToolResults.push(block.tool_use_id);\n changed = true;\n continue;\n }\n next.push(block);\n }\n return next;\n });\n msg = filtered ?? msg;\n }\n\n if (isEmptyMessage(msg)) {\n removedMessages++;\n changed = true;\n continue;\n }\n out.push(msg);\n }\n\n return {\n messages: changed ? out : messages,\n report: { changed, removedToolUses, removedToolResults, removedMessages },\n };\n}\n\nfunction hasToolUse(msg: Message | undefined): boolean {\n return contentBlocks(msg).some((b): b is ToolUseBlock => b.type === 'tool_use');\n}\n\nfunction hasToolResult(msg: Message | undefined): boolean {\n return contentBlocks(msg).some((b): b is ToolResultBlock => b.type === 'tool_result');\n}\n\nfunction toolUseIds(msg: Message | undefined): Set<string> {\n const ids = new Set<string>();\n if (!msg || msg.role !== 'assistant') return ids;\n for (const block of contentBlocks(msg)) {\n if (block.type === 'tool_use') ids.add(block.id);\n }\n return ids;\n}\n\nfunction toolResultIds(msg: Message | undefined): Set<string> {\n const ids = new Set<string>();\n if (!msg || msg.role !== 'user') return ids;\n for (const block of contentBlocks(msg)) {\n if (block.type === 'tool_result') ids.add(block.tool_use_id);\n }\n return ids;\n}\n\nfunction contentBlocks(msg: Message | undefined): ContentBlock[] {\n return msg && Array.isArray(msg.content) ? msg.content : [];\n}\n\nfunction mapContent(\n msg: Message,\n fn: (blocks: ContentBlock[]) => ContentBlock[],\n): Message | null {\n if (!Array.isArray(msg.content)) return msg;\n const next = fn(msg.content);\n if (next.length === msg.content.length && next.every((b, idx) => b === msg.content[idx])) {\n return msg;\n }\n return { ...msg, content: next };\n}\n\nfunction isEmptyMessage(msg: Message): boolean {\n if (typeof msg.content === 'string') return msg.content.trim().length === 0;\n return msg.content.length === 0;\n}\n","import type { Context } from '../core/context.js';\nimport type { ContentBlock, ToolResultBlock } from '../types/blocks.js';\nimport type { CompactReport, Compactor } from '../types/compactor.js';\nimport type { ContextWindowPolicy } from '../types/context-window.js';\nimport type { Message } from '../types/messages.js';\nimport {\n estimateTextTokens,\n estimateToolInputTokens,\n estimateToolResultTokens,\n} from '../utils/token-estimate.js';\nimport { repairToolUseAdjacency } from '../utils/message-invariants.js';\n\nexport interface CompactorOptions {\n preserveK?: number;\n eliseThreshold?: number;\n estimator?: (text: string) => number;\n}\n\nexport class HybridCompactor implements Compactor {\n private readonly preserveK: number;\n private readonly eliseThreshold: number;\n private readonly estimator: (text: string) => number;\n\n constructor(opts: CompactorOptions = {}) {\n this.preserveK = opts.preserveK ?? 5;\n this.eliseThreshold = opts.eliseThreshold ?? 2000;\n this.estimator = opts.estimator ?? estimateTextTokens;\n }\n\n async compact(ctx: Context, opts: { aggressive?: boolean } = {}): Promise<CompactReport> {\n const beforeTokens = this.estimateMessages(ctx.messages);\n const reductions: CompactReport['reductions'] = [];\n const policy = readContextWindowPolicy(ctx);\n const preserveK = policy?.preserveK ?? this.preserveK;\n const eliseThreshold = policy?.eliseThreshold ?? this.eliseThreshold;\n\n // Phase 1: elision\n const phase1Saved = this.eliseOldToolResults(ctx, preserveK, eliseThreshold);\n if (phase1Saved > 0) reductions.push({ phase: 'elision', saved: phase1Saved });\n\n // Phase 2: summary (placeholder; in production calls sub-LLM)\n if (opts.aggressive) {\n const phase2Saved = this.collapseAncientTurns(ctx, preserveK);\n if (phase2Saved > 0) reductions.push({ phase: 'summary', saved: phase2Saved });\n }\n\n const repaired = repairToolUseAdjacency(ctx.messages);\n if (repaired.report.changed) {\n ctx.state.replaceMessages(repaired.messages);\n }\n\n const afterTokens = this.estimateMessages(ctx.messages);\n return {\n before: beforeTokens,\n after: afterTokens,\n reductions,\n repaired: repaired.report.changed\n ? {\n removedToolUses: repaired.report.removedToolUses,\n removedToolResults: repaired.report.removedToolResults,\n removedMessages: repaired.report.removedMessages,\n }\n : undefined,\n };\n }\n\n private eliseOldToolResults(\n ctx: Context,\n preserveK = this.preserveK,\n eliseThreshold = this.eliseThreshold,\n ): number {\n const messages = ctx.messages;\n // Walk backwards counting (user + assistant) pairs to determine where\n // the preservation window really starts. This is more accurate than\n // the fixed multiplier which assumes every turn is 1 message pair.\n let pairCount = 0;\n let preserveStart = messages.length;\n for (let i = messages.length - 1; i >= 0 && pairCount < preserveK; i--) {\n const m = messages[i];\n if (!m) continue;\n if (m.role === 'user' || m.role === 'assistant') {\n pairCount++;\n preserveStart = i;\n }\n }\n\n // Ensure tool_use/tool_result protocol pairs are preserved together.\n // Walk forward through the preserved window: if an assistant message\n // at or after preserveStart contains a tool_use, also preserve the\n // immediately following message (the tool_result) so neither is elided.\n for (let i = preserveStart; i < messages.length; i++) {\n const m = messages[i];\n if (!m || typeof m.content === 'string' || !Array.isArray(m.content)) continue;\n const hasToolUse = m.content.some((b) => b.type === 'tool_use');\n if (hasToolUse && i + 1 < messages.length) {\n const next = messages[i + 1];\n if (\n next &&\n next.role === 'user' &&\n typeof next.content !== 'string' &&\n Array.isArray(next.content) &&\n next.content.some((b) => b.type === 'tool_result')\n ) {\n // Extend preserveStart to cover the tool_result as well so\n // the protocol pair stays complete and readable.\n preserveStart = i + 1;\n }\n }\n }\n\n let saved = 0;\n let changed = false;\n const nextMessages = new Array(messages.length);\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n // Only process messages before the preservation window\n if (i >= preserveStart) {\n nextMessages[i] = msg;\n continue;\n }\n if (!msg || !Array.isArray(msg.content)) {\n nextMessages[i] = msg;\n continue;\n }\n const newContent: ContentBlock[] = msg.content.map((b) => {\n if (b.type !== 'tool_result') return b;\n const tokens = estimateToolResultTokens(b.content);\n if (tokens < eliseThreshold) return b;\n saved += tokens;\n const elided: ToolResultBlock = {\n type: 'tool_result',\n tool_use_id: b.tool_use_id,\n content: `[elided: ~${tokens} tokens]`,\n is_error: b.is_error,\n };\n return elided;\n });\n // Check whether any block actually changed by reference equality\n if (\n newContent.length === msg.content.length &&\n newContent.every((b, idx) => b === msg.content[idx])\n ) {\n nextMessages[i] = msg;\n } else {\n nextMessages[i] = { ...msg, content: newContent };\n changed = true;\n }\n }\n if (changed) ctx.state.replaceMessages(nextMessages);\n return saved;\n }\n\n private collapseAncientTurns(ctx: Context, preserveK = this.preserveK): number {\n const messages = ctx.messages;\n const cutTarget = Math.max(0, messages.length - preserveK * 2);\n if (cutTarget <= 0) return 0;\n\n // Find a safe boundary: nearest user-message-with-text at or after cutTarget\n let boundary = -1;\n for (let i = cutTarget; i < messages.length; i++) {\n const m = messages[i];\n if (!m) continue;\n if (m.role === 'user' && hasTextContent(m)) {\n boundary = i;\n break;\n }\n }\n if (boundary <= 0) return 0;\n\n const removed = messages.slice(0, boundary);\n const removedTokens = this.estimateMessages(removed);\n\n const summary: Message[] = [\n {\n role: 'user',\n content: `[previous_session_summary: ${removed.length} earlier turns compacted. Todo state preserved in context.]`,\n },\n { role: 'assistant', content: 'Continuing from compacted context.' },\n ];\n\n // L1-A: route through ConversationState so subscribers see the rewrite.\n const tail = ctx.messages.slice(boundary);\n ctx.state.replaceMessages([...summary, ...tail]);\n return Math.max(0, removedTokens - this.estimateMessages(summary));\n }\n\n private estimateMessages(messages: Message[]): number {\n let total = 0;\n for (const m of messages) {\n if (typeof m.content === 'string') {\n total += this.estimator(m.content);\n } else {\n for (const b of m.content) {\n if (b.type === 'text') total += this.estimator(b.text);\n else if (b.type === 'tool_use') total += estimateToolInputTokens(b.input);\n else if (b.type === 'tool_result') total += estimateToolResultTokens(b.content);\n }\n }\n }\n return total;\n }\n}\n\nfunction readContextWindowPolicy(ctx: Context): ContextWindowPolicy | null {\n const policy = ctx.meta?.['contextWindowPolicy'];\n if (!policy || typeof policy !== 'object') return null;\n const candidate = policy as Partial<ContextWindowPolicy>;\n if (\n typeof candidate.preserveK !== 'number' ||\n typeof candidate.eliseThreshold !== 'number'\n ) {\n return null;\n }\n return candidate as ContextWindowPolicy;\n}\n\nfunction hasTextContent(m: Message): boolean {\n if (typeof m.content === 'string') return m.content.trim().length > 0;\n return m.content.some((b) => b.type === 'text' && b.text.trim().length > 0);\n}\n","export interface TextBlock {\n type: 'text';\n text: string;\n cache_control?: { type: 'ephemeral' };\n}\n\nexport interface ToolUseBlock {\n type: 'tool_use';\n id: string;\n name: string;\n input: Record<string, unknown>;\n /**\n * Provider-specific opaque metadata captured from the wire response.\n * Echoed back verbatim in the next request so providers that bind\n * extra state to function calls keep working. Example: Gemini's\n * `thoughtSignature` — required for tool-use turns with thinking\n * models, otherwise the next request fails with 400 \"Function call\n * is missing a thought_signature in functionCall parts\".\n *\n * Keys are namespaced by intent so multiple wires can coexist:\n * - `google.thoughtSignature` — Gemini signed-thought blob\n * Other providers can add their own keys without colliding.\n */\n providerMeta?: Record<string, unknown>;\n}\n\nexport interface ToolResultBlock {\n type: 'tool_result';\n tool_use_id: string;\n /**\n * The original tool name. Useful for providers like Google Gemini that\n * need the tool name in `functionResponse.name` — the tool_use_id is\n * only a session-local identifier and is not stable across replays.\n * Always set by ToolExecutor; may be absent on manually-constructed blocks.\n */\n name?: string;\n content: string;\n is_error?: boolean;\n}\n\nexport interface ImageBlock {\n type: 'image';\n source: {\n type: 'base64' | 'url';\n media_type?: string;\n data?: string;\n url?: string;\n };\n}\n\n/**\n * Chain-of-thought / extended-thinking content emitted by the model.\n *\n * Both Anthropic extended thinking (`{type:'thinking', thinking, signature}`)\n * and DeepSeek reasoning mode (top-level `reasoning_content` on the assistant\n * message) require this content to be echoed back verbatim on the next\n * request, otherwise the provider returns 400:\n * - Anthropic: \"The `content[].thinking` in the thinking mode must be passed back\"\n * - DeepSeek: \"The `reasoning_content` in the thinking mode must be passed back\"\n *\n * `signature` is Anthropic-specific (an opaque integrity blob). DeepSeek\n * doesn't issue a signature — the field is absent for that provider.\n *\n * Per Anthropic, thinking blocks MUST appear before any text/tool_use blocks\n * in an assistant message. Stream builders preserve that order.\n */\nexport interface ThinkingBlock {\n type: 'thinking';\n thinking: string;\n signature?: string;\n providerMeta?: Record<string, unknown>;\n}\n\nexport type ContentBlock = TextBlock | ToolUseBlock | ToolResultBlock | ImageBlock | ThinkingBlock;\n\nexport function isTextBlock(b: ContentBlock): b is TextBlock {\n return b.type === 'text';\n}\nexport function isToolUseBlock(b: ContentBlock): b is ToolUseBlock {\n return b.type === 'tool_use';\n}\nexport function isToolResultBlock(b: ContentBlock): b is ToolResultBlock {\n return b.type === 'tool_result';\n}\nexport function isImageBlock(b: ContentBlock): b is ImageBlock {\n return b.type === 'image';\n}\nexport function isThinkingBlock(b: ContentBlock): b is ThinkingBlock {\n return b.type === 'thinking';\n}\n","import type { Context } from '../core/context.js';\nimport type { ContentBlock, TextBlock } from '../types/blocks.js';\nimport { isTextBlock } from '../types/blocks.js';\nimport type { CompactReport, Compactor } from '../types/compactor.js';\nimport type { Message } from '../types/messages.js';\nimport type { Provider, Request } from '../types/provider.js';\nimport {\n estimateTextTokens,\n estimateToolInputTokens,\n estimateToolResultTokens,\n} from '../utils/token-estimate.js';\nimport { repairToolUseAdjacency } from '../utils/message-invariants.js';\n\n/**\n * Options for IntelligentCompactor.\n */\nexport interface IntelligentCompactorOptions {\n /** Provider to use for LLM-assisted summarization. Required. */\n provider: Provider;\n /** Fraction of maxContext that triggers a warning (default 0.6). */\n warnThreshold?: number;\n /** Fraction of maxContext that triggers soft compaction (default 0.75). */\n softThreshold?: number;\n /** Fraction of maxContext that triggers hard compaction (default 0.9). */\n hardThreshold?: number;\n /** Max context window in tokens (used only for threshold fraction math). */\n maxContext?: number;\n /** How many recent (user+assistant) pairs to always preserve (default 4). */\n preserveK?: number;\n /** Token threshold below which tool results are not elided (default 500). */\n eliseThreshold?: number;\n /** System prompt for the summarizer sub-LLM. */\n summarizerPrompt?: string;\n /**\n * Model ID to use for summarization. When not set, the same model as the\n * agent is used (which risks cascading failure on context overflow). Set to\n * a fast/cheap model like `claude-3-5-haiku-20240620` for resilience.\n */\n summarizerModel?: string;\n}\n\n/**\n * An importance label for a message or message range.\n */\nexport type Importance = 'critical' | 'high' | 'medium' | 'low';\n\n/**\n * Result of importance analysis.\n */\nexport interface ImportanceAnalysis {\n messages: Array<{ index: number; importance: Importance; reason: string }>;\n criticalRanges: Array<{ from: number; to: number; summary: string }>;\n}\n\n/**\n * IntelligentCompactor uses an LLM to:\n * - Analyze message importance and preserve critical context\n * - Generate semantic summaries for old message ranges\n * - Make intelligent decisions about what to compact\n *\n * It extends HybridCompactor's elision logic with LLM-assisted summarization.\n */\nexport class IntelligentCompactor implements Compactor {\n private readonly provider: Provider;\n private readonly warnThreshold: number;\n private readonly softThreshold: number;\n private readonly hardThreshold: number;\n private readonly maxContext: number;\n private readonly preserveK: number;\n private readonly eliseThreshold: number;\n private readonly summarizerPrompt: string;\n private readonly summarizerModel?: string;\n\n constructor(opts: IntelligentCompactorOptions) {\n this.provider = opts.provider;\n this.warnThreshold = opts.warnThreshold ?? 0.6;\n this.softThreshold = opts.softThreshold ?? 0.75;\n this.hardThreshold = opts.hardThreshold ?? 0.9;\n this.maxContext = opts.maxContext ?? 128_000;\n this.preserveK = opts.preserveK ?? 4;\n this.eliseThreshold = opts.eliseThreshold ?? 500;\n this.summarizerPrompt =\n opts.summarizerPrompt ??\n 'You are a context summarizer. Given a list of conversation messages, produce a concise but complete summary that preserves all factual information, decisions made, and any state changes (e.g. file edits, todo updates). Do not add commentary. Output only the summary.';\n this.summarizerModel = opts.summarizerModel;\n }\n\n async compact(ctx: Context, opts: { aggressive?: boolean } = {}): Promise<CompactReport> {\n const beforeTokens = this.estimateTokens(ctx.messages);\n const reductions: CompactReport['reductions'] = [];\n\n const load = beforeTokens / this.maxContext;\n // Past hardThreshold, force aggressive regardless of caller preference —\n // the alternative (lightweight elision) is unlikely to recover enough.\n const aggressive =\n load >= this.hardThreshold ? true : (opts.aggressive ?? load >= this.softThreshold);\n\n // Phase 1: always run elision (preserves recent K pairs)\n const saved1 = this.eliseOldToolResults(ctx);\n if (saved1 > 0) reductions.push({ phase: 'elision', saved: saved1 });\n\n // Phase 2: LLM summarization of ancient turns\n if (aggressive) {\n const saved2 = await this.summarizeAncientTurns(ctx);\n if (saved2 > 0) reductions.push({ phase: 'summary', saved: saved2 });\n } else if (load >= this.warnThreshold) {\n // Non-aggressive: do lightweight summarization via direct analysis\n const saved2 = this.lightweightCompact(ctx);\n if (saved2 > 0) reductions.push({ phase: 'elision', saved: saved2 });\n }\n\n const repaired = repairToolUseAdjacency(ctx.messages);\n if (repaired.report.changed) ctx.state.replaceMessages(repaired.messages);\n\n const afterTokens = this.estimateTokens(ctx.messages);\n return {\n before: beforeTokens,\n after: afterTokens,\n reductions,\n repaired: repaired.report.changed\n ? {\n removedToolUses: repaired.report.removedToolUses,\n removedToolResults: repaired.report.removedToolResults,\n removedMessages: repaired.report.removedMessages,\n }\n : undefined,\n };\n }\n\n private async summarizeAncientTurns(ctx: Context): Promise<number> {\n const messages = ctx.messages;\n const cutoff = Math.max(0, messages.length - this.preserveK * 2);\n if (cutoff <= 2) return 0;\n\n // Find the best boundary in the ancient region\n const boundary = this.findSafeBoundary(messages, 0, cutoff);\n if (boundary <= 1) return 0;\n\n const toSummarize = messages.slice(0, boundary);\n const removedTokens = this.estimateTokens(toSummarize);\n\n let summaryText: string;\n try {\n summaryText = await this.callSummarizer(toSummarize, ctx);\n } catch {\n // Fallback: extract lightweight metadata from the omitted messages so\n // the context at least retains structural information even when the\n // LLM summarizer is unavailable (network outage, model down, etc.).\n const toolNames = new Set<string>();\n const filePaths = new Set<string>();\n let userTurns = 0, assistantTurns = 0;\n for (const m of toSummarize) {\n if (m.role === 'user') userTurns++;\n else if (m.role === 'assistant') {\n assistantTurns++;\n if (Array.isArray(m.content)) {\n for (const b of m.content) {\n if (b.type === 'tool_use') toolNames.add((b as { name: string }).name ?? 'unknown');\n }\n }\n }\n // Scan for file paths\n const text = typeof m.content === 'string' ? m.content : '';\n const matches = text.matchAll(/(?:[\\w.,\\-/@]+\\/)*[\\w.,\\-/@]+\\.\\w+/g);\n for (const m_ of matches) filePaths.add(m_[0]!);\n }\n const parts: string[] = [`${toSummarize.length} turns (${userTurns} user, ${assistantTurns} assistant)`];\n if (toolNames.size > 0) parts.push(`tools: ${[...toolNames].join(', ')}`);\n if (filePaths.size > 0) parts.push(`files: ${[...filePaths].slice(0, 10).join(', ')}`);\n summaryText = parts.join(' | ');\n if (!summaryText) summaryText = `${toSummarize.length} earlier turns omitted`;\n }\n\n const summaryMsg: Message = {\n role: 'system',\n content: `[prior_turns_summary: ${summaryText}]`,\n };\n const summaryTokens = this.estimateTokens([summaryMsg]);\n\n // L1-A: route through ConversationState so subscribers see the rewrite.\n const tail = ctx.messages.slice(boundary);\n ctx.state.replaceMessages([summaryMsg, ...tail]);\n return Math.max(0, removedTokens - summaryTokens);\n }\n\n private findSafeBoundary(messages: Message[], from: number, to: number): number {\n // Find the nearest user message with text content at or after `to`\n // and walk backwards to find a safe cut point.\n for (let i = to; i >= from; i--) {\n const m = messages[i];\n if (!m) continue;\n if (m.role === 'user' && this.hasTextContent(m)) {\n // Ensure we don't cut inside a multi-message exchange\n // by finding the start of this exchange.\n return this.findExchangeStart(messages, i);\n }\n }\n return -1;\n }\n\n private findExchangeStart(messages: Message[], userIndex: number): number {\n // Walk backwards from userIndex to find where this logical exchange began.\n // An exchange starts after the last assistant message that had no tool calls.\n for (let i = userIndex - 1; i >= 0; i--) {\n const m = messages[i];\n if (!m) continue;\n if (m.role === 'assistant') {\n const hasToolUse = Array.isArray(m.content)\n ? m.content.some((b) => b.type === 'tool_use')\n : false;\n if (!hasToolUse) {\n // This assistant msg had no tool calls — it's a boundary\n return i + 1;\n }\n } else if (m.role !== 'user') {\n // system or other — skip\n } else {\n // another user msg — boundary\n return i;\n }\n }\n return 0;\n }\n\n private async callSummarizer(messages: Message[], ctx: Context): Promise<string> {\n const prompt: TextBlock[] = [\n { type: 'text', text: this.summarizerPrompt },\n { type: 'text', text: '\\n\\nConversation to summarize:\\n' },\n ...this.messagesToText(messages),\n ];\n\n const req: Request = {\n model: this.summarizerModel ?? ctx.model,\n system: prompt,\n messages: [],\n maxTokens: 1024,\n };\n\n // Use abort signal from context if available.\n // Fall back to a fresh controller only if ctx.signal is absent — this\n // avoids leaking AbortControllers on every summarizer call (the original\n // `?? new AbortController().signal` created a controller that was never\n // connected to anything, making cancellation a no-op).\n const ac = ctx.signal ? undefined : new AbortController();\n const signal = ctx.signal ?? ac!.signal;\n const res = await this.provider.complete(req, { signal });\n\n const textBlocks = res.content.filter(isTextBlock);\n return (\n textBlocks\n .map((b) => b.text)\n .join('\\n')\n .trim() || '(empty summary)'\n );\n }\n\n private messagesToText(messages: Message[]): TextBlock[] {\n const lines: string[] = [];\n for (const m of messages) {\n const role = m.role.padEnd(10, ' ');\n if (typeof m.content === 'string') {\n lines.push(`[${role}]: ${m.content.slice(0, 500)}`);\n } else if (Array.isArray(m.content)) {\n const textParts = m.content.filter(isTextBlock).map((b) => b.text);\n if (textParts.length > 0) {\n lines.push(`[${role}]: ${textParts.join(' ').slice(0, 500)}`);\n }\n }\n }\n return [{ type: 'text', text: lines.join('\\n') }];\n }\n\n private lightweightCompact(ctx: Context): number {\n // Lightweight: just elide very large tool results without full summarization\n return this.eliseOldToolResults(ctx);\n }\n\n private eliseOldToolResults(ctx: Context): number {\n const messages = ctx.messages;\n let pairCount = 0;\n let preserveStart = messages.length;\n for (let i = messages.length - 1; i >= 0 && pairCount < this.preserveK; i--) {\n const m = messages[i];\n if (!m) continue;\n if (m.role === 'user' || m.role === 'assistant') {\n pairCount++;\n preserveStart = i;\n }\n }\n\n // Ensure tool_use/tool_result protocol pairs are preserved together.\n // Walk forward through the preserved window: if an assistant message\n // at or after preserveStart contains a tool_use, also preserve the\n // immediately following message (the tool_result) so neither is elided.\n for (let i = preserveStart; i < messages.length; i++) {\n const m = messages[i];\n if (!m || typeof m.content === 'string' || !Array.isArray(m.content)) continue;\n const hasToolUse = m.content.some((b) => b.type === 'tool_use');\n if (hasToolUse && i + 1 < messages.length) {\n const next = messages[i + 1];\n if (\n next &&\n next.role === 'user' &&\n typeof next.content !== 'string' &&\n Array.isArray(next.content) &&\n next.content.some((b) => b.type === 'tool_result')\n ) {\n // Extend preserveStart to cover the tool_result as well so\n // the protocol pair stays complete and readable.\n preserveStart = i + 1;\n }\n }\n }\n\n let saved = 0;\n let changed = false;\n const nextMessages = new Array(messages.length);\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n // Only process messages before the preservation window\n if (i >= preserveStart) {\n nextMessages[i] = msg;\n continue;\n }\n if (!msg || !Array.isArray(msg.content)) {\n nextMessages[i] = msg;\n continue;\n }\n const newContent: ContentBlock[] = msg.content.map((b) => {\n if (b.type !== 'tool_result') return b;\n const tokens = estimateToolResultTokens(b.content);\n if (tokens < this.eliseThreshold) return b;\n saved += tokens;\n return {\n type: 'tool_result',\n tool_use_id: b.tool_use_id,\n content: `[elided: ~${tokens} tokens]`,\n is_error: b.is_error,\n };\n });\n // Check by reference equality whether any block actually changed\n if (\n newContent.length === msg.content.length &&\n newContent.every((b, idx) => b === msg.content[idx])\n ) {\n nextMessages[i] = msg;\n } else {\n nextMessages[i] = { ...msg, content: newContent };\n changed = true;\n }\n }\n if (changed) ctx.state.replaceMessages(nextMessages);\n return saved;\n }\n\n private hasTextContent(m: Message): boolean {\n if (typeof m.content === 'string') return m.content.trim().length > 0;\n return m.content.some((b) => b.type === 'text' && b.text.trim().length > 0);\n }\n\n private estimateTokens(messages: Message[]): number {\n let total = 0;\n for (const m of messages) {\n if (typeof m.content === 'string') {\n total += estimateTextTokens(m.content);\n } else {\n for (const b of m.content) {\n if (b.type === 'text') total += estimateTextTokens(b.text);\n else if (b.type === 'tool_use') total += estimateToolInputTokens(b.input);\n else if (b.type === 'tool_result') total += estimateToolResultTokens(b.content);\n }\n }\n }\n return total;\n }\n}\n","import { isTextBlock } from '../types/blocks.js';\nimport type { Message } from '../types/messages.js';\nimport type { Provider, Request } from '../types/provider.js';\nimport type { MessageSelector, SelectorResult } from '../types/selector.js';\n\nexport interface LLMSelectorOptions {\n /** Provider used for the selector LLM call. Required. */\n provider: Provider;\n /** Model for the selector. Defaults to the provider's default model. */\n model?: string;\n /**\n * Maximum tokens to keep in context (target budget).\n * Selector will aim to keep total content below this.\n */\n maxContextTokens?: number;\n /**\n * Prompt instructing the selector how to behave.\n * Should guide the LLM on importance tiers and output format.\n */\n systemPrompt?: string;\n}\n\nconst DEFAULT_SYSTEM_PROMPT = `You are a context pruning assistant. Given a conversation history and a token budget, decide which message ranges are worth keeping verbatim and which should be collapsed into summaries.\n\nOutput a JSON object with this structure:\n{\n \"kept\": [{\"from\": 0, \"to\": 5, \"importance\": \"critical\"}],\n \"collapsed\": [{\"from\": 6, \"to\": 20, \"summary\": \"optional summary\"}],\n \"reasoning\": \"brief explanation of decisions\"\n}\n\nImportance tiers:\n- \"critical\": decisions, file edits, tool results that affect state, final answers\n- \"high\": substantive tool use, complex reasoning, non-obvious observations\n- \"medium\": routine exchanges, confirmations, straightforward Q&A\n\nRules:\n- Always keep the most recent K pairs (preserve recency)\n- Never collapse the final 2 user/assistant pairs (working memory)\n- Preserve tool results that modified files or had external effects\n- Collapse old, low-information exchanges (greetings, acknowledgements, etc.)\n- If unsure, keep rather than collapse (errors are more costly than waste)\n\nReturn ONLY the JSON object, no markdown, no explanation outside the JSON.`;\n\n/** Rough token estimation for a message array */\nfunction estimateTokens(messages: Message[]): number {\n let total = 0;\n for (const m of messages) {\n if (typeof m.content === 'string') {\n total += Math.ceil(m.content.length / 4);\n } else if (Array.isArray(m.content)) {\n for (const b of m.content) {\n if (b.type === 'text') total += Math.ceil(b.text.length / 4);\n else total += Math.ceil(JSON.stringify(b).length / 4);\n }\n }\n }\n return total;\n}\n\n/** Format messages as a compact text dump for the selector LLM */\nfunction formatMessages(messages: Message[], maxChars = 8000): string {\n const lines: string[] = [];\n let used = 0;\n for (let i = 0; i < messages.length; i++) {\n const m = messages[i]!;\n const role = m.role.padEnd(10, ' ');\n let text: string;\n if (typeof m.content === 'string') {\n text = m.content.slice(0, 500);\n } else {\n const content = m.content as import('../types/blocks.js').ContentBlock[];\n text = content\n .filter(isTextBlock)\n .map((b) => b.text)\n .join(' ');\n // Also capture tool names for context\n const toolUses = content.filter((b) => b.type === 'tool_use');\n if (toolUses.length > 0) {\n text += ` [tools: ${toolUses.map((b) => (b as { name: string }).name).join(', ')}]`;\n }\n }\n const line = `[${i}][${role}]: ${text}`;\n if (used + line.length > maxChars) break;\n lines.push(line);\n used += line.length;\n }\n return lines.join('\\n');\n}\n\n/**\n * LLM-powered message selector. Calls a sub-LLM to analyze the\n * message history and produce a keep/collapse plan — more surgical\n * than fixed-window rules.\n */\nexport class LLMSelector implements MessageSelector {\n private readonly provider: Provider;\n private readonly model: string;\n private readonly maxContextTokens: number;\n private readonly systemPrompt: string;\n\n constructor(opts: LLMSelectorOptions) {\n this.provider = opts.provider;\n this.model = opts.model ?? 'unknown';\n this.maxContextTokens = opts.maxContextTokens ?? 40_000;\n this.systemPrompt = opts.systemPrompt ?? DEFAULT_SYSTEM_PROMPT;\n }\n\n async select(messages: Message[], maxToKeep: number): Promise<SelectorResult> {\n const effectiveBudget = Math.min(maxToKeep, this.maxContextTokens);\n\n // Build a concise representation of the conversation\n const historyText = formatMessages(messages);\n const totalTokens = estimateTokens(messages);\n const systemText = `${this.systemPrompt}\\n\\nConversation (${messages.length} messages, ~${totalTokens} tokens, budget: ${effectiveBudget}):\\n`;\n\n // Add instruction to stay within budget\n const budgetInstruction =\n totalTokens > effectiveBudget\n ? `\\n\\nIMPORTANT: Total conversation (${totalTokens} tokens) exceeds budget (${effectiveBudget}). You MUST collapse enough to fit. Prefer collapsing older/lower-importance ranges.`\n : '';\n\n const req: Request = {\n model: this.model,\n system: [{ type: 'text', text: systemText + budgetInstruction }],\n messages: [{ role: 'user', content: historyText }],\n maxTokens: 1024,\n };\n\n let raw: string;\n try {\n // Wire the AbortController to the provider call so cancellation actually\n // fires — the original code passed a fresh signal that is never connected\n // to anything, leaking the controller on every selector call.\n const ac = new AbortController();\n const res = await this.provider.complete(req, { signal: ac.signal });\n const textBlocks = res.content.filter(isTextBlock);\n raw = textBlocks\n .map((b) => b.text)\n .join('\\n')\n .trim();\n } catch (err) {\n // Fallback: use simple recency-based selection\n return this.fallbackSelect(messages, effectiveBudget);\n }\n\n return this.parseSelectorOutput(raw, messages.length);\n }\n\n private fallbackSelect(messages: Message[], budget: number): SelectorResult {\n // Simple fallback: keep from the end until we hit budget\n const toKeep: SelectorResult['kept'] = [];\n const toCollapse: SelectorResult['collapsed'] = [];\n\n let tokenCount = 0;\n let startIdx = 0;\n\n // Scan from the end backwards\n for (let i = messages.length - 1; i >= 0; i--) {\n const m = messages[i]!;\n const cost =\n typeof m.content === 'string'\n ? Math.ceil(m.content.length / 4)\n : m.content.reduce(\n (acc, b) =>\n acc +\n (b.type === 'text'\n ? Math.ceil(b.text.length / 4)\n : Math.ceil(JSON.stringify(b).length / 4)),\n 0,\n );\n\n if (tokenCount + cost <= budget) {\n tokenCount += cost;\n } else {\n startIdx = i + 1;\n break;\n }\n }\n\n if (startIdx > 0) {\n toCollapse.push({ from: 0, to: startIdx - 1 });\n }\n toKeep.push({ from: startIdx, to: messages.length - 1, importance: 'high' });\n\n return {\n kept: toKeep,\n collapsed: toCollapse,\n reasoning: `Fallback: kept last ${messages.length - startIdx} messages within ${budget} token budget`,\n };\n }\n\n private parseSelectorOutput(raw: string, messageCount: number): SelectorResult {\n // Try to extract JSON from the response\n const jsonStart = raw.indexOf('{');\n const jsonEnd = raw.lastIndexOf('}');\n if (jsonStart === -1 || jsonEnd === -1) {\n // Can't parse — use fallback\n return this.fallbackSelect(\n Array.from({ length: messageCount }, () => ({ role: 'user', content: '' }) as Message),\n this.maxContextTokens,\n );\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw.slice(jsonStart, jsonEnd + 1));\n } catch {\n return this.fallbackSelect(\n Array.from({ length: messageCount }, () => ({ role: 'user', content: '' }) as Message),\n this.maxContextTokens,\n );\n }\n\n const obj = parsed as Record<string, unknown>;\n const kept =\n (obj.kept as Array<{ from: number; to: number; importance: string }> | undefined) ?? [];\n const collapsed =\n (obj.collapsed as Array<{ from: number; to: number; summary?: string }> | undefined) ?? [];\n\n return {\n kept: kept.map((k) => ({\n from: k.from,\n to: k.to,\n importance: (k.importance ?? 'medium') as 'critical' | 'high' | 'medium',\n })),\n collapsed: collapsed.map((c) => ({ from: c.from, to: c.to, summary: c.summary })),\n reasoning: typeof obj.reasoning === 'string' ? obj.reasoning : '',\n };\n }\n}\n","import type { Context } from '../core/context.js';\nimport { LLMSelector } from '../models/llm-selector.js';\nimport type { ContentBlock } from '../types/blocks.js';\nimport { isTextBlock } from '../types/blocks.js';\nimport type { CompactReport, Compactor } from '../types/compactor.js';\nimport type { Message } from '../types/messages.js';\nimport type { Provider, Request } from '../types/provider.js';\nimport type { MessageSelector, SelectorResult } from '../types/selector.js';\nimport { repairToolUseAdjacency } from '../utils/message-invariants.js';\n\n/**\n * Options for SelectiveCompactor — the most configurable compactor.\n */\nexport interface SelectiveCompactorOptions {\n /** Provider for LLM calls (selector + summarizer). Required. */\n provider: Provider;\n /** Selector for LLM-driven importance analysis. */\n selector?: MessageSelector;\n /** Fraction of maxContext that triggers a warning (default 0.6). */\n warnThreshold?: number;\n /** Fraction of maxContext that triggers soft compaction (default 0.75). */\n softThreshold?: number;\n /** Fraction of maxContext that triggers hard compaction (default 0.9). */\n hardThreshold?: number;\n /** Max context window in tokens (used for threshold fraction math). */\n maxContext?: number;\n /** How many recent (user+assistant) pairs to always preserve (default 4). */\n preserveK?: number;\n /** Token threshold below which tool results are not elided (default 500). */\n eliseThreshold?: number;\n /** Model for selector LLM calls (default: same as provider default). */\n selectorModel?: string;\n /** Summarizer model for collapsed ranges (default: same as selectorModel). */\n summarizerModel?: string;\n /** Prompt for the summarizer sub-LLM. */\n summarizerPrompt?: string;\n}\n\n/**\n * SelectiveCompactor uses an LLM-driven MessageSelector to make\n * surgical decisions about which message ranges to keep vs collapse.\n *\n * Compared to HybridCompactor / IntelligentCompactor:\n * - HybridCompactor: rule-based (preserveK + elision), no LLM calls\n * - IntelligentCompactor: LLM summarization but no structured selection\n * - SelectiveCompactor: full LLM-driven selection + optional summarization\n */\nexport class SelectiveCompactor implements Compactor {\n private readonly provider: Provider;\n private readonly selector: MessageSelector;\n private readonly warnThreshold: number;\n private readonly softThreshold: number;\n private readonly hardThreshold: number;\n private readonly maxContext: number;\n private readonly preserveK: number;\n private readonly eliseThreshold: number;\n private readonly summarizerModel: string;\n private readonly summarizerPrompt: string;\n\n constructor(opts: SelectiveCompactorOptions) {\n this.provider = opts.provider;\n this.selector =\n opts.selector ?? new LLMSelector({ provider: opts.provider, model: opts.selectorModel });\n this.warnThreshold = opts.warnThreshold ?? 0.6;\n this.softThreshold = opts.softThreshold ?? 0.75;\n this.hardThreshold = opts.hardThreshold ?? 0.9;\n this.maxContext = opts.maxContext ?? 128_000;\n this.preserveK = opts.preserveK ?? 4;\n this.eliseThreshold = opts.eliseThreshold ?? 500;\n this.summarizerModel = opts.summarizerModel ?? opts.selectorModel ?? 'unknown';\n this.summarizerPrompt =\n opts.summarizerPrompt ??\n 'You are a context summarizer. Given a list of messages, produce a concise summary that preserves all factual information, decisions, file changes, and state changes. Do not add commentary or opinions.';\n }\n\n async compact(ctx: Context, opts: { aggressive?: boolean } = {}): Promise<CompactReport> {\n const beforeTokens = this.estimateTokens(ctx.messages);\n const reductions: CompactReport['reductions'] = [];\n\n const load = beforeTokens / this.maxContext;\n const shouldCompact = load >= this.warnThreshold || opts.aggressive;\n\n if (!shouldCompact) {\n // Only do lightweight elision if below warn threshold\n const saved = this.eliseOldToolResults(ctx);\n if (saved > 0) reductions.push({ phase: 'elision', saved });\n const repair = this.repairProtocolAdjacency(ctx);\n const afterTokens = this.estimateTokens(ctx.messages);\n return { before: beforeTokens, after: afterTokens, reductions, repaired: repair };\n }\n\n // Phase 1: elision — always run first to get a baseline reduction\n const savedElision = this.eliseOldToolResults(ctx);\n if (savedElision > 0) reductions.push({ phase: 'elision', saved: savedElision });\n\n // Phase 2: LLM-driven selective compaction\n const afterPhase1 = this.estimateTokens(ctx.messages);\n const targetBudget = this.computeTargetBudget(load);\n\n if (afterPhase1 > targetBudget) {\n const savedSelective = await this.runSelector(ctx, targetBudget);\n if (savedSelective > 0) reductions.push({ phase: 'selective', saved: savedSelective });\n }\n\n const repair = this.repairProtocolAdjacency(ctx);\n const afterTokens = this.estimateTokens(ctx.messages);\n return { before: beforeTokens, after: afterTokens, reductions, repaired: repair };\n }\n\n private repairProtocolAdjacency(ctx: Context): CompactReport['repaired'] {\n const repaired = repairToolUseAdjacency(ctx.messages);\n if (repaired.report.changed) ctx.state.replaceMessages(repaired.messages);\n return repaired.report.changed\n ? {\n removedToolUses: repaired.report.removedToolUses,\n removedToolResults: repaired.report.removedToolResults,\n removedMessages: repaired.report.removedMessages,\n }\n : undefined;\n }\n\n /**\n * Run the LLM selector to decide what to keep vs collapse.\n * Returns the token savings achieved.\n */\n private async runSelector(ctx: Context, targetBudget: number): Promise<number> {\n const before = this.estimateTokens(ctx.messages);\n\n let result: SelectorResult;\n try {\n result = await this.selector.select(ctx.messages, targetBudget);\n } catch {\n // Fallback to aggressive recency preservation\n return this.aggressiveRecencyTrim(ctx);\n }\n\n // Execute the selector's plan\n await this.executePlan(ctx, result);\n\n const after = this.estimateTokens(ctx.messages);\n return Math.max(0, before - after);\n }\n\n /**\n * Execute a SelectorResult plan: collapse/remove ranges and\n * insert summaries where the selector provided them.\n */\n private async executePlan(ctx: Context, plan: SelectorResult): Promise<void> {\n if (ctx.messages.length === 0) return;\n\n // Process collapsed ranges in reverse order to preserve indices. We work\n // on a local copy and commit through `ctx.state.replaceMessages` at the\n // end so subscribers see a single state change for the whole rewrite.\n const messages = [...ctx.messages];\n const sortedCollapsed = [...plan.collapsed].sort((a, b) => b.from - a.from);\n\n for (const range of sortedCollapsed) {\n if (range.from < 0 || range.to >= messages.length || range.from > range.to) continue;\n\n let summary = range.summary;\n if (!summary) {\n const toSummarize = messages.slice(range.from, range.to + 1);\n summary = await this.summarizeRange(toSummarize, ctx);\n }\n\n const summaryMsg: Message = {\n role: 'system',\n content: `[prior_turns_${range.from}-${range.to}: ${summary}]`,\n };\n\n messages.splice(range.from, range.to - range.from + 1, summaryMsg);\n }\n\n ctx.state.replaceMessages(messages);\n }\n\n private async summarizeRange(messages: Message[], ctx: Context): Promise<string> {\n const systemText = `${this.summarizerPrompt}\\n\\nSummarize the following message range:`;\n const body = messages.map((m, i) => `[${i}] ${m.role}: ${this.messagePreview(m)}`).join('\\n');\n\n const req: Request = {\n model: this.summarizerModel,\n system: [{ type: 'text', text: systemText }],\n messages: [{ role: 'user', content: body }],\n maxTokens: 512,\n };\n\n try {\n const res = await this.provider.complete(req, {\n signal: ctx.signal ?? new AbortController().signal,\n });\n return (\n res.content\n .filter(isTextBlock)\n .map((b) => b.text)\n .join('\\n')\n .trim() || '(empty)'\n );\n } catch {\n return `[${messages.length} earlier turns omitted]`;\n }\n }\n\n private messagePreview(m: Message): string {\n if (typeof m.content === 'string') return m.content.slice(0, 300);\n return m.content\n .filter(isTextBlock)\n .map((b) => b.text)\n .join(' ')\n .slice(0, 300);\n }\n\n /**\n * Fallback when selector fails: aggressively trim from the oldest end\n * until we hit targetBudget.\n */\n private aggressiveRecencyTrim(ctx: Context): number {\n const messages = ctx.messages;\n const preserveIdx = Math.max(0, messages.length - this.preserveK * 2);\n\n if (preserveIdx <= 0) return 0;\n\n // Find safe boundary near preserveIdx\n let boundary = preserveIdx;\n for (let i = preserveIdx; i < messages.length && i < preserveIdx + 6; i++) {\n const m = messages[i]!;\n if (m.role === 'user' && this.hasTextContent(m)) {\n boundary = i;\n break;\n }\n }\n\n const removed = messages.slice(0, boundary);\n const removedTokens = this.estimateTokens(removed);\n\n const summaryMsg: Message = {\n role: 'system',\n content: `[${removed.length} earlier turns trimmed — see session log for details]`,\n };\n const tail = messages.slice(boundary);\n ctx.state.replaceMessages([summaryMsg, ...tail]);\n\n return Math.max(0, removedTokens - this.estimateTokens([summaryMsg]));\n }\n\n private computeTargetBudget(load: number): number {\n if (load >= this.hardThreshold) {\n return Math.floor(this.maxContext * 0.5); // keep only 50%\n }\n if (load >= this.softThreshold) {\n return Math.floor(this.maxContext * 0.65); // keep 65%\n }\n return Math.floor(this.maxContext * 0.75); // keep 75% at warn\n }\n\n private eliseOldToolResults(ctx: Context): number {\n const messages = ctx.messages;\n let pairCount = 0;\n let preserveStart = messages.length;\n for (let i = messages.length - 1; i >= 0 && pairCount < this.preserveK; i--) {\n const m = messages[i];\n if (!m) continue;\n if (m.role === 'user' || m.role === 'assistant') {\n pairCount++;\n preserveStart = i;\n }\n }\n let saved = 0;\n let changed = false;\n const nextMessages = new Array(messages.length);\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n // Only process messages before the preservation window\n if (i >= preserveStart) {\n nextMessages[i] = msg;\n continue;\n }\n if (!msg || !Array.isArray(msg.content)) {\n nextMessages[i] = msg;\n continue;\n }\n const newContent: ContentBlock[] = msg.content.map((b) => {\n if (b.type !== 'tool_result') return b;\n const text = typeof b.content === 'string' ? b.content : JSON.stringify(b.content);\n const tokens = this.roughTokenEstimate(text);\n if (tokens < this.eliseThreshold) return b;\n saved += tokens;\n return {\n type: 'tool_result',\n tool_use_id: b.tool_use_id,\n content: `[elided: ~${tokens} tokens]`,\n is_error: b.is_error,\n };\n });\n // map() preserves length, so only block ref-equality matters here.\n if (newContent.every((b, idx) => b === msg.content[idx])) {\n nextMessages[i] = msg;\n } else {\n nextMessages[i] = { ...msg, content: newContent };\n changed = true;\n }\n }\n if (changed) ctx.state.replaceMessages(nextMessages);\n return saved;\n }\n\n private hasTextContent(m: Message): boolean {\n if (typeof m.content === 'string') return m.content.trim().length > 0;\n return m.content.some((b) => b.type === 'text' && b.text.trim().length > 0);\n }\n\n private estimateTokens(messages: Message[]): number {\n let total = 0;\n for (const m of messages) {\n if (typeof m.content === 'string') {\n total += this.roughTokenEstimate(m.content);\n } else {\n for (const b of m.content) {\n if (b.type === 'text') total += this.roughTokenEstimate(b.text);\n else if (b.type === 'tool_use') total += this.roughTokenEstimate(JSON.stringify(b.input));\n else if (b.type === 'tool_result') {\n total += this.roughTokenEstimate(\n typeof b.content === 'string' ? b.content : JSON.stringify(b.content),\n );\n }\n }\n }\n }\n return total;\n }\n\n private roughTokenEstimate(text: string): number {\n return Math.max(1, Math.ceil(text.length / 4));\n }\n}\n","/**\n * WrongStack error hierarchy.\n *\n * Every error thrown by the framework is a `WrongStackError` with a\n * machine-readable `code`, a `subsystem` tag, and a `severity` level.\n * This lets consumers (CLI, TUI, plugins, tests) branch on structured\n * data instead of parsing error messages.\n */\n\n// ── Error codes ──────────────────────────────────────────────────────\n\nexport type ErrorCode =\n // Provider\n | 'PROVIDER_RATE_LIMITED'\n | 'PROVIDER_AUTH_FAILED'\n | 'PROVIDER_OVERLOADED'\n | 'PROVIDER_INVALID_REQUEST'\n | 'PROVIDER_SERVER_ERROR'\n | 'PROVIDER_NETWORK_ERROR'\n | 'PROVIDER_CONTEXT_OVERFLOW'\n // Tool\n | 'TOOL_NOT_FOUND'\n | 'TOOL_PERMISSION_DENIED'\n | 'TOOL_EXECUTION_FAILED'\n | 'TOOL_TIMEOUT'\n | 'TOOL_INPUT_INVALID'\n // Config\n | 'CONFIG_INVALID'\n | 'CONFIG_NOT_FOUND'\n | 'CONFIG_PARSE_FAILED'\n | 'CONFIG_MIGRATION_NEEDED'\n // Plugin\n | 'PLUGIN_LOAD_FAILED'\n | 'PLUGIN_API_MISMATCH'\n | 'PLUGIN_MISSING_DEPENDENCY'\n // Agent\n | 'AGENT_ITERATION_LIMIT'\n | 'AGENT_CONTEXT_OVERFLOW'\n | 'AGENT_ABORTED'\n | 'AGENT_RUN_FAILED'\n // Session\n | 'SESSION_NOT_FOUND'\n | 'SESSION_CORRUPTED'\n | 'SESSION_WRITE_FAILED'\n // Container / Registry\n | 'CONTAINER_TOKEN_ALREADY_BOUND'\n | 'CONTAINER_TOKEN_NOT_BOUND'\n | 'REGISTRY_DUPLICATE'\n | 'REGISTRY_NOT_FOUND'\n // General\n | 'UNKNOWN';\n\nexport type ErrorSubsystem =\n | 'provider'\n | 'tool'\n | 'config'\n | 'plugin'\n | 'agent'\n | 'session'\n | 'container'\n | 'general';\nexport type ErrorSeverity = 'fatal' | 'error' | 'warning';\n\n// ── Base error class ─────────────────────────────────────────────────\n\nexport class WrongStackError extends Error {\n readonly code: ErrorCode;\n readonly subsystem: ErrorSubsystem;\n readonly severity: ErrorSeverity;\n readonly recoverable: boolean;\n readonly context?: Record<string, unknown>;\n\n constructor(opts: {\n message: string;\n code: ErrorCode;\n subsystem: ErrorSubsystem;\n severity?: ErrorSeverity;\n recoverable?: boolean;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super(opts.message, { cause: opts.cause });\n this.name = 'WrongStackError';\n this.code = opts.code;\n this.subsystem = opts.subsystem;\n this.severity = opts.severity ?? 'error';\n this.recoverable = opts.recoverable ?? false;\n this.context = opts.context;\n }\n\n /**\n * Render a one-line user-facing description.\n * Subclasses should override for domain-specific formatting.\n */\n describe(): string {\n const ctx = this.context ? ` ${formatContext(this.context)}` : '';\n return `${this.code}: ${this.message}${ctx}`;\n }\n}\n\nfunction formatContext(ctx: Record<string, unknown>): string {\n const parts = Object.entries(ctx)\n .filter(([, v]) => v !== undefined)\n .slice(0, 3)\n .map(([k, v]) => `${k}=${String(v)}`);\n return parts.length > 0 ? `[${parts.join(' ')}]` : '';\n}\n\n// ── Specific error classes ───────────────────────────────────────────\n\n/**\n * Tool execution errors — thrown by ToolExecutor and individual tools.\n */\nexport class ToolError extends WrongStackError {\n readonly toolName: string;\n\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n | 'TOOL_NOT_FOUND'\n | 'TOOL_PERMISSION_DENIED'\n | 'TOOL_EXECUTION_FAILED'\n | 'TOOL_TIMEOUT'\n | 'TOOL_INPUT_INVALID'\n >;\n toolName: string;\n recoverable?: boolean;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'tool',\n recoverable: opts.recoverable,\n context: { tool: opts.toolName, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'ToolError';\n this.toolName = opts.toolName;\n }\n}\n\n/**\n * Config loading / validation errors.\n */\nexport class ConfigError extends WrongStackError {\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'CONFIG_INVALID' | 'CONFIG_NOT_FOUND' | 'CONFIG_PARSE_FAILED' | 'CONFIG_MIGRATION_NEEDED'\n >;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'config',\n severity: 'fatal',\n recoverable: false,\n context: opts.context,\n cause: opts.cause,\n });\n this.name = 'ConfigError';\n }\n}\n\n/**\n * Plugin loading / lifecycle errors.\n */\nexport class PluginError extends WrongStackError {\n readonly pluginName: string;\n\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'PLUGIN_LOAD_FAILED' | 'PLUGIN_API_MISMATCH' | 'PLUGIN_MISSING_DEPENDENCY'\n >;\n pluginName: string;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'plugin',\n severity: 'error',\n recoverable: opts.code === 'PLUGIN_MISSING_DEPENDENCY',\n context: { plugin: opts.pluginName, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'PluginError';\n this.pluginName = opts.pluginName;\n }\n}\n\n/**\n * Agent runtime errors — thrown by Agent.run when a non-WrongStackError\n * escapes the inner loop, so callers always see a structured error.\n */\nexport class AgentError extends WrongStackError {\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'AGENT_ITERATION_LIMIT' | 'AGENT_CONTEXT_OVERFLOW' | 'AGENT_ABORTED' | 'AGENT_RUN_FAILED'\n >;\n recoverable?: boolean;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'agent',\n severity: opts.code === 'AGENT_ABORTED' ? 'warning' : 'error',\n recoverable: opts.recoverable ?? opts.code === 'AGENT_ITERATION_LIMIT',\n context: opts.context,\n cause: opts.cause,\n });\n this.name = 'AgentError';\n }\n}\n\n/**\n * Wrap an arbitrary thrown value into a `WrongStackError` so the caller\n * always gets a structured error. Pass-throughs WrongStackError instances\n * unchanged; raw `Error`s and primitives get an `AGENT_RUN_FAILED` wrapper\n * with the original preserved as `cause`.\n */\nexport function toWrongStackError(\n err: unknown,\n code: Extract<ErrorCode, 'AGENT_RUN_FAILED' | 'AGENT_ABORTED' | 'UNKNOWN'> = 'AGENT_RUN_FAILED',\n): WrongStackError {\n if (err instanceof WrongStackError) return err;\n const message = err instanceof Error ? err.message : String(err);\n return new AgentError({\n message,\n code: code === 'UNKNOWN' ? 'AGENT_RUN_FAILED' : code,\n cause: err,\n });\n}\n\n/**\n * Session storage errors.\n */\nexport class SessionError extends WrongStackError {\n readonly sessionId?: string;\n\n constructor(opts: {\n message: string;\n code: Extract<ErrorCode, 'SESSION_NOT_FOUND' | 'SESSION_CORRUPTED' | 'SESSION_WRITE_FAILED'>;\n sessionId?: string;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'session',\n severity: opts.code === 'SESSION_WRITE_FAILED' ? 'error' : 'warning',\n recoverable: opts.code !== 'SESSION_CORRUPTED',\n context: { sessionId: opts.sessionId, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'SessionError';\n this.sessionId = opts.sessionId;\n }\n}\n\n// ── Type guards ──────────────────────────────────────────────────────\n\nexport function isWrongStackError(err: unknown): err is WrongStackError {\n return err instanceof WrongStackError;\n}\n\nexport function isToolError(err: unknown): err is ToolError {\n return err instanceof ToolError;\n}\n\nexport function isConfigError(err: unknown): err is ConfigError {\n return err instanceof ConfigError;\n}\n\nexport function isPluginError(err: unknown): err is PluginError {\n return err instanceof PluginError;\n}\n\nexport function isSessionError(err: unknown): err is SessionError {\n return err instanceof SessionError;\n}\n\nexport function isAgentError(err: unknown): err is AgentError {\n return err instanceof AgentError;\n}\n","import type { Context } from '../core/context.js';\r\nimport type { EventBus } from '../kernel/events.js';\r\nimport type { MiddlewareHandler } from '../kernel/pipeline.js';\r\nimport type { Compactor } from '../types/compactor.js';\r\nimport type { ContextWindowAggressiveOn, ContextWindowPolicy } from '../types/context-window.js';\r\nimport { AgentError } from '../types/errors.js';\r\n\r\nexport type CompactionFailureMode = 'throw' | 'throw_on_hard' | 'continue';\r\n\r\nexport interface AutoCompactionOptions {\r\n aggressiveOn?: ContextWindowAggressiveOn;\r\n events?: EventBus;\r\n failureMode?: CompactionFailureMode;\r\n policyProvider?: (ctx: Context) => Pick<\r\n ContextWindowPolicy,\r\n 'thresholds' | 'aggressiveOn'\r\n > | null | undefined;\r\n}\r\n\r\n/**\r\n * Pipeline middleware that monitors context token load and automatically\r\n * triggers compaction when the warn/soft/hard thresholds are crossed.\r\n * Runs before the next agent iteration.\r\n */\r\nexport class AutoCompactionMiddleware {\r\n readonly name = 'AutoCompaction';\r\n\r\n private readonly compactor: Compactor;\r\n private readonly estimator: (ctx: Context) => number;\r\n private readonly warnThreshold: number;\r\n private readonly softThreshold: number;\r\n private readonly hardThreshold: number;\r\n /** Writable so model-switch can update the denominator without re-registering the middleware. */\r\n private _maxContext: number;\r\n private readonly aggressiveOn: ContextWindowAggressiveOn;\r\n private readonly events?: EventBus;\r\n private readonly failureMode: CompactionFailureMode;\r\n private readonly policyProvider?: AutoCompactionOptions['policyProvider'];\r\n\r\n /**\r\n * @param compactor Compactor to use for compaction.\r\n * @param maxContext Provider's max context window in tokens.\r\n * @param estimator Token estimation function.\r\n * @param thresholds Threshold fractions (0-1) of maxContext.\r\n * @param opts Optional behavior. By default, failures at the\r\n * hard threshold throw AGENT_CONTEXT_OVERFLOW so\r\n * the agent does not continue into a likely\r\n * provider context overflow. Warn/soft failures\r\n * still emit compaction.failed and continue.\r\n */\r\n constructor(\r\n compactor: Compactor,\r\n maxContext: number,\r\n estimator: (ctx: Context) => number,\r\n thresholds: { warn: number; soft: number; hard: number },\r\n optsOrAggressiveOn: AutoCompactionOptions | ContextWindowAggressiveOn = {},\r\n events?: EventBus,\r\n ) {\r\n const opts =\r\n typeof optsOrAggressiveOn === 'string'\r\n ? { aggressiveOn: optsOrAggressiveOn, events }\r\n : optsOrAggressiveOn;\r\n this.compactor = compactor;\r\n this._maxContext = maxContext;\r\n this.estimator = estimator;\r\n this.warnThreshold = thresholds.warn;\r\n this.softThreshold = thresholds.soft;\r\n this.hardThreshold = thresholds.hard;\r\n this.aggressiveOn = opts.aggressiveOn ?? 'soft';\r\n this.events = opts.events;\r\n this.failureMode = opts.failureMode ?? 'throw_on_hard';\r\n this.policyProvider = opts.policyProvider;\r\n }\r\n\r\n /** Allow callers (e.g. model-switch in WebUI) to update the context window\r\n * denominator when the active model changes. */\r\n setMaxContext(maxContext: number): void {\r\n this._maxContext = maxContext;\r\n }\r\n\r\n handler(): MiddlewareHandler<Context> {\r\n return async (ctx, next) => {\r\n const tokens = this.estimator(ctx);\r\n const load = tokens / this._maxContext;\r\n const policy = this.policyProvider?.(ctx);\r\n const thresholds = policy?.thresholds ?? {\r\n warn: this.warnThreshold,\r\n soft: this.softThreshold,\r\n hard: this.hardThreshold,\r\n };\r\n const aggressiveOn = policy?.aggressiveOn ?? this.aggressiveOn;\r\n\r\n if (load >= thresholds.hard) {\r\n await this.compact(ctx, true, { level: 'hard', tokens, load });\r\n } else if (load >= thresholds.soft) {\r\n await this.compact(ctx, aggressiveOn !== 'hard', { level: 'soft', tokens, load });\r\n } else if (load >= thresholds.warn) {\r\n await this.compact(ctx, aggressiveOn === 'warn', { level: 'warn', tokens, load });\r\n }\r\n\r\n return next(ctx);\r\n };\r\n }\r\n\r\n private async compact(\r\n ctx: Context,\r\n aggressive: boolean,\r\n pressure: { level: 'warn' | 'soft' | 'hard'; tokens: number; load: number },\r\n ): Promise<void> {\r\n try {\r\n const report = await this.compactor.compact(ctx, { aggressive });\r\n this.events?.emit('compaction.fired', {\r\n level: pressure.level,\r\n tokens: pressure.tokens,\r\n load: pressure.load,\r\n maxContext: this._maxContext,\r\n report,\r\n aggressive,\r\n });\r\n } catch (err) {\r\n const error = err instanceof Error ? err : new Error(String(err));\r\n const fatal =\r\n this.failureMode === 'throw' ||\r\n (this.failureMode === 'throw_on_hard' && pressure.level === 'hard');\r\n this.events?.emit('compaction.failed', {\r\n err: error,\r\n aggressive,\r\n level: pressure.level,\r\n tokens: pressure.tokens,\r\n maxContext: this._maxContext,\r\n load: pressure.load,\r\n fatal,\r\n });\r\n if (fatal) {\r\n throw new AgentError({\r\n message: `Auto-compaction failed at ${pressure.level} threshold`,\r\n code: 'AGENT_CONTEXT_OVERFLOW',\r\n recoverable: true,\r\n context: {\r\n level: pressure.level,\r\n tokens: pressure.tokens,\r\n maxContext: this._maxContext,\r\n },\r\n cause: err,\r\n });\r\n }\r\n }\r\n }\r\n}\r\n","/**\n * Tool output serialization utilities.\n * Extracted from Agent.executeTools to allow reuse and consistent output handling.\n */\n\nexport interface ToolOutputSerializerOptions {\n perIterationOutputCapBytes?: number;\n estimator?: (text: string) => number;\n}\n\nexport function createToolOutputSerializer(opts: ToolOutputSerializerOptions = {}) {\n const capBytes = opts.perIterationOutputCapBytes ?? 100_000;\n\n function serialize(value: unknown): string {\n if (typeof value === 'string') return value;\n if (value === null || value === undefined) return '';\n if (typeof value === 'object') {\n if (Array.isArray(value)) return value.map(serialize).join('\\n');\n if ('text' in (value as Record<string, unknown>)) {\n const t = (value as Record<string, unknown>).text;\n return typeof t === 'string' ? t : JSON.stringify(value, null, 2);\n }\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n }\n return String(value);\n }\n\n function enforceCap(text: string, remainingBudget: number): { text: string; newBudget: number } {\n if (remainingBudget <= 0) {\n return { text: '[truncated: iteration output cap exceeded]', newBudget: 0 };\n }\n const textBytes = Buffer.byteLength(text, 'utf8');\n if (textBytes <= remainingBudget) {\n return { text, newBudget: remainingBudget - textBytes };\n }\n const marker = `\\n…[truncated ${textBytes - remainingBudget} bytes]…\\n`;\n const markerBytes = Buffer.byteLength(marker, 'utf8');\n const available = remainingBudget - markerBytes;\n if (available <= 0) {\n return { text: '[truncated: iteration output cap exceeded]', newBudget: 0 };\n }\n const half = Math.floor(available / 2);\n const first = text.slice(0, half);\n const second = text.slice(text.length - half);\n return { text: `${first}${marker}${second}`, newBudget: 0 };\n }\n\n return { serialize, enforceCap, capBytes };\n}\n","import type { Context } from '../core/context.js';\r\nimport type { ToolResultBlock, ToolUseBlock } from '../types/blocks.js';\r\nimport type {\r\n ToolBatchResult,\r\n ToolConfirmPendingResult,\r\n ToolExecutionOutput,\r\n ToolExecutorOptions,\r\n ToolExecutorStrategy,\r\n} from '../types/tool-executor.js';\r\nimport type { Tool } from '../types/tool.js';\r\nimport { createToolOutputSerializer } from '../utils/tool-output-serializer.js';\r\n\r\nexport class ToolExecutor {\r\n private readonly serializer;\r\n private readonly iterationTimeoutMs: number;\r\n\r\n constructor(\r\n private readonly registry: { get(name: string): Tool | undefined; list(): Tool[] },\r\n private opts: ToolExecutorOptions,\r\n ) {\r\n this.iterationTimeoutMs = opts.iterationTimeoutMs ?? 300_000;\r\n this.serializer = createToolOutputSerializer({\r\n perIterationOutputCapBytes: opts.perIterationOutputCapBytes ?? 100_000,\r\n });\r\n }\r\n\r\n /**\r\n * Clear the interactive confirm awaiter so the executor returns\r\n * `ToolConfirmPendingResult` instead of blocking on stdin. Used by\r\n * the CLI to switch from inline prompts (REPL) to event-driven\r\n * confirmation (TUI) at runtime.\r\n */\r\n clearConfirmAwaiter(): void {\r\n this.opts.confirmAwaiter = undefined;\r\n }\r\n\r\n /**\r\n * Execute a batch of tool uses using the configured strategy.\r\n * Returns the execution results and the remaining output budget.\r\n */\r\n async executeBatch(\r\n toolUses: ToolUseBlock[],\r\n ctx: Context,\r\n strategy: ToolExecutorStrategy,\r\n ): Promise<ToolBatchResult> {\r\n let budget = this.opts.perIterationOutputCapBytes ?? 100_000;\r\n\r\n const runOne = async (use: ToolUseBlock): Promise<ToolExecutionOutput> => {\r\n const start = Date.now();\r\n const tool = this.registry.get(use.name);\r\n\r\n // Fast path: unknown tool\r\n if (!tool) {\r\n const result = this.unknownToolResult(use, () => this.registry.list().map((t) => t.name));\r\n budget = this.decrementBudget(result, budget);\r\n return { result, tool, durationMs: Date.now() - start };\r\n }\r\n\r\n const decision = await this.opts.permissionPolicy.evaluate(tool, use.input, ctx);\r\n\r\n if (decision.permission === 'deny') {\r\n const result = this.deniedResult(use, decision.reason);\r\n budget = this.decrementBudget(result, budget);\r\n return { result, tool, durationMs: Date.now() - start };\r\n }\r\n\r\n if (decision.permission === 'confirm') {\r\n if (this.opts.confirmAwaiter) {\r\n const choice = await this.opts.confirmAwaiter(tool, use.input, use.id, tool.name);\r\n if (choice !== 'yes' && choice !== 'always') {\r\n const result = {\r\n type: 'tool_result' as const,\r\n tool_use_id: use.id,\r\n content: `Tool \"${tool.name}\" denied by user.`,\r\n is_error: true,\r\n };\r\n budget = this.decrementBudget(result, budget);\r\n return { result, tool, durationMs: Date.now() - start };\r\n }\r\n // fall through to execute\r\n } else {\r\n const suggestedPattern =\r\n this.subjectFor(tool.name, use.input, tool.subjectKey) ?? tool.name;\r\n const pending: ToolConfirmPendingResult = {\r\n type: 'tool_confirm_pending',\r\n toolUseId: use.id,\r\n toolName: tool.name,\r\n input: use.input,\r\n suggestedPattern,\r\n };\r\n return { result: pending, tool, durationMs: Date.now() - start };\r\n }\r\n }\r\n\r\n // permission === 'auto'\r\n // L1-C: trace each tool execution. Span is a no-op unless an OTel\r\n // adapter or other Tracer is bound — zero overhead by default.\r\n const span = this.opts.tracer?.startSpan(`tool.${tool.name}`, {\r\n 'tool.name': tool.name,\r\n 'tool.mutating': tool.mutating,\r\n 'tool.permission': tool.permission,\r\n });\r\n try {\r\n const result = await this.executeTool(tool, use, ctx, budget);\r\n budget = this.decrementBudget(result, budget);\r\n span?.setAttribute('tool.is_error', !!result.is_error);\r\n span?.setAttribute(\r\n 'tool.output_bytes',\r\n typeof result.content === 'string' ? result.content.length : 0,\r\n );\r\n return { result, tool, durationMs: Date.now() - start };\r\n } catch (err) {\r\n const msg = err instanceof Error ? err.message : String(err);\r\n const scrubbed = this.opts.secretScrubber.scrub(msg);\r\n this.opts.renderer?.writeToolResult(tool.name, scrubbed, true);\r\n const result = {\r\n type: 'tool_result' as const,\r\n tool_use_id: use.id,\r\n content: `Tool \"${tool.name}\" threw: ${scrubbed}`,\r\n is_error: true,\r\n };\r\n budget = this.decrementBudget(result, budget);\r\n if (err instanceof Error) span?.recordError(err);\r\n span?.setAttribute('tool.is_error', true);\r\n return { result, tool, durationMs: Date.now() - start };\r\n } finally {\r\n span?.end();\r\n }\r\n };\r\n\r\n // Run a single tool but never let an exception propagate to the\r\n // gather() below — `runOne` is already try/catch-wrapped for the\r\n // execution phase, but the *pre*-execution paths (permission policy,\r\n // confirmAwaiter) are unguarded and an unexpected throw there would\r\n // collapse Promise.all and lose every sibling's output. Wrap each\r\n // call so a per-tool failure becomes a per-tool error result.\r\n const safeRun = async (use: ToolUseBlock): Promise<ToolExecutionOutput> => {\r\n try {\r\n return await runOne(use);\r\n } catch (err) {\r\n const msg = err instanceof Error ? err.message : String(err);\r\n const scrubbed = this.opts.secretScrubber.scrub(msg);\r\n const result = {\r\n type: 'tool_result' as const,\r\n tool_use_id: use.id,\r\n content: `Tool \"${use.name}\" execution failed: ${scrubbed}`,\r\n is_error: true,\r\n };\r\n budget = this.decrementBudget(result, budget);\r\n return { result, tool: this.registry.get(use.name), durationMs: 0 };\r\n }\r\n };\r\n\r\n if (strategy === 'sequential') {\r\n const outputs: ToolExecutionOutput[] = [];\r\n for (const use of toolUses) {\r\n if (use) outputs.push(await safeRun(use));\r\n }\r\n return { outputs, remainingBudget: budget };\r\n }\r\n\r\n if (strategy === 'parallel') {\r\n const outputs = await Promise.all(toolUses.map((use) => safeRun(use)));\r\n return { outputs, remainingBudget: budget };\r\n }\r\n\r\n // smart: non-mutating in parallel, then mutating sequentially\r\n const nonMutating: ToolUseBlock[] = [];\r\n const mutating: ToolUseBlock[] = [];\r\n for (const use of toolUses) {\r\n if (!use) continue;\r\n const tool = this.registry.get(use.name);\r\n if (tool?.mutating) mutating.push(use);\r\n else nonMutating.push(use);\r\n }\r\n const firstPass = await Promise.all(nonMutating.map((use) => safeRun(use)));\r\n const secondPass: ToolExecutionOutput[] = [];\r\n for (const use of mutating) {\r\n secondPass.push(await safeRun(use));\r\n }\r\n return {\r\n outputs: [...firstPass, ...secondPass],\r\n remainingBudget: budget,\r\n };\r\n }\r\n\r\n /**\r\n * Execute a single tool with timeout, permission check, and output capping.\r\n * Emits `tool.started` via the injected EventBus (if any) right before\r\n * invoking the tool — closes the observability gap between \"model decided\r\n * to call a tool\" and \"tool.executed\".\r\n */\r\n async executeTool(\r\n tool: Tool,\r\n use: ToolUseBlock,\r\n ctx: Context,\r\n budget: number,\r\n ): Promise<ToolResultBlock> {\r\n this.opts.events?.emit('tool.started', {\r\n name: tool.name,\r\n id: use.id,\r\n input: use.input,\r\n });\r\n this.opts.renderer?.writeToolCall(tool.name, use.input);\r\n const output = await this.runWithTimeout(tool, use.input, ctx.signal, ctx, use.id);\r\n const text = this.serializer.serialize(output);\r\n const scrubbed = this.opts.secretScrubber.scrub(text);\r\n const { text: capped } = this.serializer.enforceCap(scrubbed, budget);\r\n this.opts.renderer?.writeToolResult(tool.name, capped, false);\r\n return {\r\n type: 'tool_result',\r\n tool_use_id: use.id,\r\n name: tool.name,\r\n content: capped,\r\n is_error: false,\r\n };\r\n }\r\n\r\n private async runWithTimeout(\r\n tool: Tool,\r\n input: unknown,\r\n parentSignal: AbortSignal,\r\n ctx: Context,\r\n toolUseId?: string,\r\n ): Promise<unknown> {\r\n if (parentSignal.aborted) {\r\n // Re-throw the original abort reason, whether it's an Error, string, or undefined.\r\n if (parentSignal.reason instanceof Error) throw parentSignal.reason;\r\n throw new Error(typeof parentSignal.reason === 'string' ? parentSignal.reason : 'aborted');\r\n }\r\n const timeoutMs = tool.timeoutMs ?? this.iterationTimeoutMs;\r\n const ctrl = new AbortController();\r\n const timer = setTimeout(() => ctrl.abort(new Error('tool timeout')), timeoutMs);\r\n const combined = AbortSignal.any([parentSignal, ctrl.signal]);\r\n let cleanupCalled = false;\r\n let caught = false;\r\n try {\r\n // Streaming variant takes precedence — yields progress events, then\r\n // a final 'final' event with the typed output. Tools that don't\r\n // implement executeStream fall through to the standard execute path.\r\n if (typeof tool.executeStream === 'function') {\r\n return await this.runStreamedTool(tool, input, ctx, combined, toolUseId);\r\n }\r\n return await tool.execute(input, ctx, { signal: combined });\r\n } catch (err) {\r\n caught = true;\r\n if (combined.aborted && typeof tool.cleanup === 'function') {\r\n // Best-effort cleanup; never let it mask the original error.\r\n cleanupCalled = true;\r\n try {\r\n await tool.cleanup(input, ctx);\r\n } catch {\r\n /* swallow */\r\n }\r\n }\r\n throw err;\r\n } finally {\r\n clearTimeout(timer);\r\n // If the tool completed successfully (no error thrown) but the combined\r\n // signal was aborted (e.g. timeout), the catch block above never fired.\r\n // Call cleanup here and then throw so the caller sees the abort.\r\n // When `caught` is true, we already have an in-flight throw — don't\r\n // override it from `finally` (that would replace the original error\r\n // with the abort reason and mask the actual failure).\r\n if (combined.aborted && !caught) {\r\n if (!cleanupCalled && typeof tool.cleanup === 'function') {\r\n try {\r\n await tool.cleanup(input, ctx);\r\n } catch {\r\n /* swallow */\r\n }\r\n }\r\n const reason = combined.reason instanceof Error\r\n ? combined.reason\r\n : new Error(typeof combined.reason === 'string' ? combined.reason : 'aborted');\r\n throw reason;\r\n }\r\n }\r\n }\r\n\r\n private async runStreamedTool(\r\n tool: Tool,\r\n input: unknown,\r\n ctx: Context,\r\n signal: AbortSignal,\r\n toolUseId: string | undefined,\r\n ): Promise<unknown> {\r\n let finalOutput: unknown;\r\n let sawFinal = false;\r\n const stream = tool.executeStream!(input, ctx, { signal });\r\n for await (const ev of stream) {\r\n if (ev.type === 'final') {\r\n finalOutput = ev.output;\r\n sawFinal = true;\r\n // Drain whatever the iterator wants to surface after final, but the\r\n // result is locked in. Most tools won't yield more.\r\n break;\r\n }\r\n this.opts.events?.emit('tool.progress', {\r\n name: tool.name,\r\n id: toolUseId ?? '<unknown>',\r\n event: ev,\r\n });\r\n }\r\n if (!sawFinal) {\r\n throw new Error(`tool \"${tool.name}\" executeStream completed without a 'final' event`);\r\n }\r\n return finalOutput;\r\n }\r\n\r\n private unknownToolResult(use: ToolUseBlock, listFns: () => string[]): ToolResultBlock {\r\n return {\r\n type: 'tool_result',\r\n tool_use_id: use.id,\r\n content: `Tool \"${use.name}\" is not registered. Available tools: ${listFns().join(', ')}`,\r\n is_error: true,\r\n };\r\n }\r\n\r\n private deniedResult(use: ToolUseBlock, reason?: string): ToolResultBlock {\r\n return {\r\n type: 'tool_result',\r\n tool_use_id: use.id,\r\n content: `Tool \"${use.name}\" denied: ${reason ?? 'policy'}`,\r\n is_error: true,\r\n };\r\n }\r\n\r\n private decrementBudget(result: ToolResultBlock, budget: number): number {\r\n const contentBytes =\r\n typeof result.content === 'string'\r\n ? Buffer.byteLength(result.content, 'utf8')\r\n : Buffer.byteLength(JSON.stringify(result.content), 'utf8');\r\n return Math.max(0, budget - contentBytes);\r\n }\r\n\r\n /**\r\n * Compute the suggestedPattern string for a tool+input pair.\r\n * Matches the logic in DefaultPermissionPolicy so the TUI shows the\r\n * same subject that the trust file would use.\r\n */\r\n private subjectFor(toolName: string, input: unknown, subjectKey?: string): string | undefined {\r\n if (!input || typeof input !== 'object') return undefined;\r\n const obj = input as Record<string, unknown>;\r\n const globChars = /[*?\\[\\]]/g;\r\n const escapeGlob = (s: string) => s.replace(globChars, (c) => `\\\\${c}`);\r\n const normalizePath = (s: string) => escapeGlob(s.replace(/\\\\/g, '/'));\r\n\r\n // Mirror DefaultPermissionPolicy.subjectFor — keep both in sync so the\r\n // TUI's \"suggested pattern\" matches what the trust file actually uses.\r\n if (subjectKey) {\r\n const v = obj[subjectKey];\r\n if (typeof v === 'string') {\r\n const isPathKey = subjectKey === 'path' || subjectKey === 'file' || subjectKey === 'files';\r\n return isPathKey ? normalizePath(v) : escapeGlob(v);\r\n }\r\n }\r\n\r\n if (toolName === 'bash' && typeof obj.command === 'string') {\r\n return escapeGlob(obj.command);\r\n }\r\n if (typeof obj.path === 'string') {\r\n return normalizePath(obj.path);\r\n }\r\n if (typeof obj.url === 'string') {\r\n return escapeGlob(obj.url);\r\n }\r\n if (typeof obj.name === 'string') {\r\n return escapeGlob(obj.name);\r\n }\r\n return undefined;\r\n }\r\n}\r\n","/**\n * Compile a user-supplied regex with conservative bounds against ReDoS.\n *\n * Duplicated from @wrongstack/tools/_regex.ts to avoid a circular\n * dependency (tools depends on core, not vice versa). Keep both copies\n * in sync if the heuristics change.\n *\n * V8's regex engine is backtracking-based and cannot interrupt a\n * synchronous match — a pattern like `(a+)+$` against a sufficiently\n * long line will pin a worker for seconds.\n */\n\nconst MAX_PATTERN_LEN = 512;\n\n// Heuristics for catastrophic-backtracking constructs.\nconst DANGEROUS_PATTERNS: ReadonlyArray<RegExp> = [\n /(\\([^)]*[+*][^)]*\\))[+*]/, // (a+)+, (.*)+, etc\n /(\\(\\?:[^)]*[+*][^)]*\\))[+*]/, // same, with non-capturing group\n];\n\nexport interface CompileResult {\n ok: true;\n regex: RegExp;\n}\n\nexport interface CompileFail {\n ok: false;\n reason: string;\n}\n\nexport function compileUserRegex(pattern: string, flags: string): CompileResult | CompileFail {\n if (typeof pattern !== 'string') {\n return { ok: false, reason: 'pattern must be a string' };\n }\n if (pattern.length === 0) {\n return { ok: false, reason: 'pattern is empty' };\n }\n if (pattern.length > MAX_PATTERN_LEN) {\n return { ok: false, reason: `pattern exceeds ${MAX_PATTERN_LEN} characters` };\n }\n for (const rx of DANGEROUS_PATTERNS) {\n if (rx.test(pattern)) {\n return {\n ok: false,\n reason:\n 'pattern looks vulnerable to catastrophic backtracking — rewrite without nested quantifiers',\n };\n }\n }\n try {\n return { ok: true, regex: new RegExp(pattern, flags) };\n } catch (err) {\n return {\n ok: false,\n reason: err instanceof Error ? err.message : 'invalid regex',\n };\n }\n}\n","import type { Agent, RunResult } from '../core/agent.js';\r\nimport type { Context } from '../core/context.js';\r\nimport { toWrongStackError } from '../types/errors.js';\r\nimport type { DoneCondition } from '../types/multi-agent.js';\r\nimport { compileUserRegex } from '../utils/regex-guard.js';\r\n\r\ntype AutonomousResult = RunResult & { toolCalls: number; reason?: string };\r\n\r\nexport interface DoneCheckResult {\r\n done: boolean;\r\n reason?: string;\r\n iterations: number;\r\n toolCalls: number;\r\n}\r\n\r\nexport class DoneConditionChecker {\r\n private readonly compiledRegex: RegExp | null;\r\n\r\n constructor(private readonly condition: DoneCondition) {\r\n if (condition.type === 'output_match' && condition.pattern) {\r\n const result = compileUserRegex(condition.pattern, '');\r\n this.compiledRegex = result.ok ? result.regex : null;\r\n if (!result.ok) {\r\n // Log warning but don't throw — the done condition simply won't match\r\n console.warn(`[DoneConditionChecker] Invalid regex pattern \"${condition.pattern}\": ${result.reason}`);\r\n }\r\n } else {\r\n this.compiledRegex = null;\r\n }\r\n }\r\n\r\n check(state: { iterations: number; toolCalls: number; lastOutput?: string }): DoneCheckResult {\r\n switch (this.condition.type) {\r\n case 'iterations':\r\n if (this.condition.maxIterations && state.iterations >= this.condition.maxIterations) {\r\n return {\r\n done: true,\r\n reason: `max iterations (${this.condition.maxIterations}) reached`,\r\n ...state,\r\n };\r\n }\r\n break;\r\n\r\n case 'tool_calls':\r\n if (this.condition.maxToolCalls && state.toolCalls >= this.condition.maxToolCalls) {\r\n return {\r\n done: true,\r\n reason: `max tool calls (${this.condition.maxToolCalls}) reached`,\r\n ...state,\r\n };\r\n }\r\n break;\r\n\r\n case 'output_match':\r\n if (this.compiledRegex && state.lastOutput && this.compiledRegex.test(state.lastOutput)) {\r\n return {\r\n done: true,\r\n reason: `output matched pattern \"${this.condition.pattern}\"`,\r\n ...state,\r\n };\r\n }\r\n break;\r\n\r\n case 'directive':\r\n // Model-driven: the agent manages its own continuation via [continue]/[done].\r\n // The done condition is never satisfied by the checker — the agent returns\r\n // `status: 'done'` when the model emits [done] or naturally finishes.\r\n // The runner's outer loop uses maxIterations/maxToolCalls as hard caps.\r\n if (this.condition.maxIterations && state.iterations >= this.condition.maxIterations) {\r\n return { done: true, reason: `max iterations (${this.condition.maxIterations}) reached`, ...state };\r\n }\r\n if (this.condition.maxToolCalls && state.toolCalls >= this.condition.maxToolCalls) {\r\n return { done: true, reason: `max tool calls (${this.condition.maxToolCalls}) reached`, ...state };\r\n }\r\n break;\r\n\r\n case 'custom':\r\n // Reserved for future extension\r\n break;\r\n }\r\n\r\n return { done: false, iterations: state.iterations, toolCalls: state.toolCalls };\r\n }\r\n}\r\n\r\nexport interface AutonomousRunnerOptions {\r\n agent: Agent;\r\n context: Context;\r\n doneCondition: DoneCondition;\r\n iterationTimeoutMs?: number;\r\n onIteration?: (state: { iteration: number; toolCalls: number }) => void;\r\n onDone?: (result: AutonomousResult) => void;\r\n /**\r\n * When true and `doneCondition.type === 'directive'`, the runner\r\n * runs the agent with `autonomousContinue: true` so the agent loop\r\n * handles its own [continue]/[done] markers internally (no outer\r\n * re-invocation needed). The runner still provides iteration/timeouts.\r\n */\r\n enableAutonomousContinue?: boolean;\r\n}\r\n\r\nexport class AutonomousRunner {\r\n private iterations = 0;\r\n private toolCalls = 0;\r\n private lastOutput?: string;\r\n private stopped = false;\r\n private readonly doneChecker: DoneConditionChecker;\r\n\r\n constructor(private readonly opts: AutonomousRunnerOptions) {\r\n this.doneChecker = new DoneConditionChecker(opts.doneCondition);\r\n }\r\n\r\n async run(): Promise<AutonomousResult> {\r\n // Subscribe to `tool.executed` so the per-tool budget (`tool_calls`\r\n // done-condition) actually counts each tool invocation rather than\r\n // each `agent.run()` call. Without this, a single iteration that\r\n // fires 5 tools only bumps the counter once, and a `maxToolCalls: 3`\r\n // budget would fire after 3 iterations (typically 3×N tools) instead\r\n // of after 3 tools. Unsubscribed in the `finally` so the listener\r\n // doesn't outlive this run instance. Mock agents in tests may pass\r\n // null/undefined for `events`; gracefully skip when missing — those\r\n // tests don't exercise the tool-count budget path.\r\n const offToolExecuted = this.opts.agent.events?.on?.('tool.executed', () => {\r\n this.toolCalls++;\r\n });\r\n // When autonomous continue is enabled, also count internal agent-loop\r\n // iterations. Each iteration.started within a single agent.run() call\r\n // counts toward the runner's maxIterations cap. We listen to the event\r\n // through the agent's EventBus.\r\n const offIterationCompleted = this.opts.agent.events?.on?.('iteration.completed', () => {\r\n // Only count if we're in autonomous continue mode (agent loop\r\n // handles multiple iterations internally before returning).\r\n if (this.opts.enableAutonomousContinue && this.opts.doneCondition.type === 'directive') {\r\n // Each internal iteration completed — bump the outer iteration counter.\r\n // This ensures maxIterations on the runner actually limits total work.\r\n this.iterations++;\r\n }\r\n });\r\n try {\r\n return await this.runLoop();\r\n } finally {\r\n offToolExecuted?.();\r\n offIterationCompleted?.();\r\n }\r\n }\r\n\r\n private async runLoop(): Promise<AutonomousResult> {\r\n while (!this.stopped) {\r\n const check = this.doneChecker.check({\r\n iterations: this.iterations,\r\n toolCalls: this.toolCalls,\r\n lastOutput: this.lastOutput,\r\n });\r\n\r\n if (check.done) {\r\n const result: AutonomousResult = {\r\n status: 'done',\r\n iterations: this.iterations,\r\n toolCalls: this.toolCalls,\r\n reason: check.reason,\r\n };\r\n this.opts.onDone?.(result);\r\n return result;\r\n }\r\n\r\n this.opts.onIteration?.({ iteration: this.iterations, toolCalls: this.toolCalls });\r\n\r\n const ctrl = new AbortController();\r\n const timeout = setTimeout(() => ctrl.abort(), this.opts.iterationTimeoutMs ?? 30_000);\r\n\r\n try {\r\n // In directive mode with autonomous continue, pass it through so the\r\n // agent loop handles its own [continue]/[done] markers internally.\r\n // The runner provides iteration caps and timeouts; the agent handles\r\n // the continuation decision within each agent.run() call.\r\n const isDirectiveMode =\r\n this.opts.doneCondition.type === 'directive' &&\r\n this.opts.enableAutonomousContinue;\r\n\r\n const result = await this.opts.agent.run('', {\r\n signal: ctrl.signal,\r\n maxIterations: isDirectiveMode ? (this.opts.doneCondition.maxIterations ?? 100) : 1,\r\n executionStrategy: 'sequential',\r\n autonomousContinue: isDirectiveMode ? true : undefined,\r\n });\r\n\r\n // Only increment iterations if we're NOT counting via iteration.completed\r\n // (i.e., not in autonomous continue directive mode). In that mode,\r\n // the offIterationCompleted listener in run() bumps this counter\r\n // per internal iteration so the runner's maxIterations cap is respected.\r\n if (!isDirectiveMode) this.iterations++;\r\n // Only access finalText when the run actually succeeded. Failed/aborted\r\n // runs may have undefined finalText — accessing it unconditionally would\r\n // produce garbage output for the done-condition matchers.\r\n if (result.status === 'done') {\r\n this.lastOutput = result.finalText;\r\n }\r\n // `toolCalls` is bumped by the `tool.executed` listener installed\r\n // in run() — no manual increment here.\r\n\r\n if (result.status === 'failed' || result.status === 'aborted') {\r\n const failedResult: AutonomousResult = {\r\n status: result.status,\r\n error: result.error,\r\n iterations: this.iterations,\r\n toolCalls: this.toolCalls,\r\n };\r\n this.opts.onDone?.(failedResult);\r\n return failedResult;\r\n }\r\n } catch (e) {\r\n // Be precise about what constitutes a timeout error — matching on\r\n // 'timeout' substring is too loose (an error message containing\r\n // \"timeout exceeded\" from the LLM is not the same as an abort).\r\n const isAbort =\r\n (e instanceof DOMException && e.name === 'AbortError') ||\r\n (e instanceof Error && e.name === 'AbortError') ||\r\n (e instanceof Error && e.message.includes('iteration timeout'));\r\n if (isAbort) {\r\n const timeoutResult: AutonomousResult = {\r\n status: 'failed',\r\n error: toWrongStackError(e),\r\n iterations: this.iterations,\r\n toolCalls: this.toolCalls,\r\n reason: 'iteration timeout',\r\n };\r\n this.opts.onDone?.(timeoutResult);\r\n return timeoutResult;\r\n }\r\n // Any other throw (TypeError, tool crash propagation, etc.) must\r\n // stop the loop — silently continuing would spin forever on the\r\n // same error and burn provider tokens with no progress.\r\n this.stopped = true;\r\n const failedResult: AutonomousResult = {\r\n status: 'failed',\r\n error: toWrongStackError(e),\r\n iterations: this.iterations,\r\n toolCalls: this.toolCalls,\r\n reason: e instanceof Error ? e.message : String(e),\r\n };\r\n this.opts.onDone?.(failedResult);\r\n return failedResult;\r\n } finally {\r\n clearTimeout(timeout);\r\n }\r\n }\r\n\r\n return {\r\n status: 'aborted',\r\n iterations: this.iterations,\r\n toolCalls: this.toolCalls,\r\n reason: 'stopped externally',\r\n };\r\n }\r\n\r\n stop(): void {\r\n this.stopped = true;\r\n }\r\n}\r\n","import { randomBytes } from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\nexport interface AtomicWriteOptions {\n mode?: number;\n encoding?: BufferEncoding;\n}\n\nexport async function atomicWrite(\n targetPath: string,\n content: string | Uint8Array,\n opts: AtomicWriteOptions = {},\n): Promise<void> {\n const dir = path.dirname(targetPath);\n await fs.mkdir(dir, { recursive: true });\n const tmp = path.join(dir, `.${path.basename(targetPath)}.${randomBytes(6).toString('hex')}.tmp`);\n\n // Write content to tmp first; 'wx' ensures exclusive creation (fails if\n // tmp already exists — extremely unlikely with 6-byte random suffix).\n try {\n if (typeof content === 'string') {\n await fs.writeFile(tmp, content, { flag: 'wx', encoding: opts.encoding ?? 'utf8' });\n } else {\n await fs.writeFile(tmp, content, { flag: 'wx' });\n }\n try {\n const fh = await fs.open(tmp, 'r+');\n try {\n await fh.sync();\n } finally {\n await fh.close();\n }\n } catch {\n // fsync best-effort\n }\n // Now safely read mode from target (if it exists) and apply to tmp before rename.\n // Prefer opts.mode for new files; for existing files preserve their mode.\n let mode: number | undefined;\n try {\n const stat = await fs.stat(targetPath);\n mode = stat.mode & 0o777;\n } catch {\n mode = opts.mode;\n }\n if (mode !== undefined) {\n await fs.chmod(tmp, mode);\n }\n await renameWithRetry(tmp, targetPath);\n } catch (err) {\n try {\n await fs.unlink(tmp);\n } catch {\n // ignore cleanup error\n }\n throw err;\n }\n}\n\nexport async function ensureDir(dir: string): Promise<void> {\n await fs.mkdir(dir, { recursive: true });\n}\n\n// On Windows, fs.rename over an existing file can fail with EPERM/EBUSY/EACCES\n// when antivirus, file indexers, editor file watchers, or a concurrent writer\n// briefly hold a handle on the destination. These are transient — retry with a\n// short backoff before giving up. POSIX renames are atomic and won't hit this.\nconst TRANSIENT_RENAME_CODES = new Set(['EPERM', 'EBUSY', 'EACCES', 'ENOTEMPTY']);\n\nasync function renameWithRetry(from: string, to: string): Promise<void> {\n if (process.platform !== 'win32') {\n await fs.rename(from, to);\n return;\n }\n const delays = [10, 25, 60, 120, 250];\n let lastErr: unknown;\n for (let i = 0; i <= delays.length; i++) {\n try {\n await fs.rename(from, to);\n return;\n } catch (err) {\n lastErr = err;\n const code = (err as NodeJS.ErrnoException)?.code;\n if (!code || !TRANSIENT_RENAME_CODES.has(code) || i === delays.length) {\n throw err;\n }\n await new Promise((resolve) => setTimeout(resolve, delays[i]));\n }\n }\n throw lastErr;\n}\n","import * as fsp from 'node:fs/promises';\r\nimport * as path from 'node:path';\r\nimport { atomicWrite } from '../utils/atomic-write.js';\r\n\r\n/**\r\n * Long-running autonomous mission. A goal survives across sessions and\r\n * drives the EternalAutonomyEngine — every iteration of the engine\r\n * consults the goal to choose what to do next.\r\n *\r\n * Storage: `<projectRoot>/.wrongstack/goal.json`. Persistent and\r\n * project-scoped on purpose: the goal belongs to the codebase, not the\r\n * REPL session.\r\n */\r\n\r\nexport interface JournalEntry {\r\n /** ISO timestamp of the iteration. */\r\n at: string;\r\n /** Sequential iteration counter (1-based, monotonically increasing). */\r\n iteration: number;\r\n /** Source that produced the action ('todo' | 'git' | 'brainstorm' | 'resume' | 'manual' | 'parallel'). */\r\n source: 'todo' | 'git' | 'brainstorm' | 'resume' | 'manual' | 'parallel';\r\n /** Short one-line description of what the iteration set out to do. */\r\n task: string;\r\n /** Outcome status. */\r\n status: 'success' | 'failure' | 'aborted' | 'skipped';\r\n /** Optional free-form note (error message, summary, etc.). */\r\n note?: string;\r\n /** Optional token usage delta for this iteration. */\r\n tokens?: { input: number; output: number };\r\n /** Optional USD cost delta for this iteration (provider-estimated). */\r\n costUsd?: number;\r\n}\r\n\r\nexport interface GoalFile {\r\n version: 1;\r\n /** The mission statement. */\r\n goal: string;\r\n /** When the goal was first set or last replaced. */\r\n setAt: string;\r\n /** Updated on every iteration completion. */\r\n lastActivityAt: string;\r\n /** Total iterations the engine has run against this goal (cumulative). */\r\n iterations: number;\r\n /** Engine lifecycle state — 'running' means another process owns this goal. */\r\n engineState: 'idle' | 'running' | 'stopped';\r\n /**\r\n * Mission-level lifecycle. `active` is the default; `completed` is set\r\n * when the engine detects `[GOAL_COMPLETE]` in a successful iteration's\r\n * final text AND a verification pass agrees; `abandoned` is set by the\r\n * user (e.g. `/goal abandon`) or when the engine exceeds a configured\r\n * failure ceiling. Once not `active`, the engine refuses to run further\r\n * iterations against this goal — protects against accidental restarts\r\n * burning through API quota after the work is done.\r\n *\r\n * Optional for backward compatibility — pre-existing `goal.json` files\r\n * without this field load as `active`.\r\n */\r\n goalState?: 'active' | 'paused' | 'completed' | 'abandoned';\r\n /**\r\n * Per-todo attempt counter. Keyed by TodoItem id. Used by the engine\r\n * to skip a todo that has failed N times rather than spinning on it\r\n * forever. Persisted so attempt counts survive restarts (`/autonomy\r\n * stop` + resume should not reset progress against a stuck task).\r\n */\r\n todoAttempts?: Record<string, number>;\r\n /** Bounded ring buffer of recent iterations (newest last). */\r\n journal: JournalEntry[];\r\n}\r\n\r\n/** Cap on persisted journal entries — older entries are evicted FIFO. */\r\nexport const MAX_JOURNAL_ENTRIES = 500;\r\n\r\n/**\r\n * Resolve the goal file path for a given project root.\r\n * Exposed so the engine and CLI use one canonical path.\r\n */\r\nexport function goalFilePath(projectRoot: string): string {\r\n return path.join(projectRoot, '.wrongstack', 'goal.json');\r\n}\r\n\r\nexport async function loadGoal(filePath: string): Promise<GoalFile | null> {\r\n let raw: string;\r\n try {\r\n raw = await fsp.readFile(filePath, 'utf8');\r\n } catch {\r\n return null;\r\n }\r\n try {\r\n const parsed = JSON.parse(raw) as GoalFile;\r\n if (parsed?.version !== 1 || typeof parsed.goal !== 'string' || !Array.isArray(parsed.journal)) {\r\n return null;\r\n }\r\n return parsed;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport async function saveGoal(filePath: string, goal: GoalFile): Promise<void> {\r\n await atomicWrite(filePath, JSON.stringify(goal, null, 2), { mode: 0o600 });\r\n}\r\n\r\nexport function emptyGoal(goal: string): GoalFile {\r\n const now = new Date().toISOString();\r\n return {\r\n version: 1,\r\n goal,\r\n setAt: now,\r\n lastActivityAt: now,\r\n iterations: 0,\r\n engineState: 'idle',\r\n goalState: 'active',\r\n todoAttempts: {},\r\n journal: [],\r\n };\r\n}\r\n\r\n/**\r\n * Append a journal entry, bumping iteration counters and trimming the\r\n * ring buffer. Returns a new GoalFile — does not mutate the argument.\r\n */\r\nexport function appendJournal(goal: GoalFile, entry: Omit<JournalEntry, 'iteration' | 'at'>): GoalFile {\r\n const iteration = goal.iterations + 1;\r\n const at = new Date().toISOString();\r\n const full: JournalEntry = { ...entry, iteration, at };\r\n const journal = [...goal.journal, full];\r\n // Trim FIFO if over cap. Slice from the tail so the *newest* MAX entries survive.\r\n const trimmed = journal.length > MAX_JOURNAL_ENTRIES\r\n ? journal.slice(journal.length - MAX_JOURNAL_ENTRIES)\r\n : journal;\r\n return {\r\n ...goal,\r\n iterations: iteration,\r\n lastActivityAt: at,\r\n journal: trimmed,\r\n };\r\n}\r\n\r\n/**\r\n * Aggregate cumulative cost + tokens across all journal entries. Entries\r\n * without telemetry are skipped (legacy entries from before the field\r\n * was added still load cleanly).\r\n */\r\nexport function summarizeUsage(goal: GoalFile): {\r\n totalCostUsd: number;\r\n totalInputTokens: number;\r\n totalOutputTokens: number;\r\n iterationsWithUsage: number;\r\n} {\r\n let totalCostUsd = 0;\r\n let totalInputTokens = 0;\r\n let totalOutputTokens = 0;\r\n let iterationsWithUsage = 0;\r\n for (const e of goal.journal) {\r\n if (typeof e.costUsd === 'number') totalCostUsd += e.costUsd;\r\n if (e.tokens) {\r\n totalInputTokens += e.tokens.input;\r\n totalOutputTokens += e.tokens.output;\r\n }\r\n if (typeof e.costUsd === 'number' || e.tokens) iterationsWithUsage++;\r\n }\r\n return { totalCostUsd, totalInputTokens, totalOutputTokens, iterationsWithUsage };\r\n}\r\n\r\n/** Format the goal + recent journal as a human-readable status block. */\r\nexport function formatGoal(goal: GoalFile, journalLimit = 10): string {\r\n const lines: string[] = [];\r\n lines.push(`Goal: ${goal.goal}`);\r\n lines.push(`Set: ${goal.setAt}`);\r\n lines.push(`Last activity: ${goal.lastActivityAt}`);\r\n lines.push(`Iterations: ${goal.iterations}`);\r\n const stateLabel = goal.goalState ?? 'active';\r\n lines.push(`State: ${stateLabel}${goal.iterations > 0 ? ` (iteration #${goal.iterations})` : ''}`);\r\n lines.push(`Engine: ${goal.engineState}`);\r\n const usage = summarizeUsage(goal);\r\n if (usage.iterationsWithUsage > 0) {\r\n lines.push(\r\n `Spent: $${usage.totalCostUsd.toFixed(4)} (in ${usage.totalInputTokens} / out ${usage.totalOutputTokens} tokens across ${usage.iterationsWithUsage} iterations)`,\r\n );\r\n }\r\n if (goal.journal.length > 0) {\r\n lines.push('');\r\n lines.push(`Recent journal (last ${Math.min(journalLimit, goal.journal.length)}):`);\r\n const tail = goal.journal.slice(-journalLimit);\r\n for (const e of tail) {\r\n const mark = e.status === 'success' ? '✓' : e.status === 'failure' ? '✗' : e.status === 'aborted' ? '⊘' : '·';\r\n const note = e.note ? ` — ${e.note}` : '';\r\n const cost = typeof e.costUsd === 'number' ? ` ($${e.costUsd.toFixed(4)})` : '';\r\n lines.push(` #${e.iteration} ${mark} [${e.source}] ${e.task}${cost}${note}`);\r\n }\r\n }\r\n return lines.join('\\n');\r\n}\r\n","import { execFile } from 'node:child_process';\r\nimport { promisify } from 'node:util';\r\nimport type { Agent } from '../core/agent.js';\r\nimport type { TodoItem } from '../core/context.js';\r\nimport type { Compactor } from '../types/compactor.js';\r\nimport {\r\n appendJournal,\r\n loadGoal,\r\n saveGoal,\r\n goalFilePath,\r\n type GoalFile,\r\n type JournalEntry,\r\n} from '../storage/goal-store.js';\r\n\r\nconst execFileP = promisify(execFile);\r\n\r\n/**\r\n * Sense-decide-execute-reflect loop on top of a long-running Goal.\r\n *\r\n * Each iteration:\r\n * 1. Sense — read goal, pending todos, `git status --porcelain`.\r\n * 2. Decide — pick a source (todo / git / brainstorm) and a task.\r\n * 3. Execute — single agent.run with a directive prompt.\r\n * 4. Reflect — append a journal entry, persist state to disk.\r\n *\r\n * The loop runs forever until `stop()` is called externally (REPL SIGINT\r\n * handler, /autonomy stop). No internal time/cost cap by design — the\r\n * user wants \"sittin sene\". Failures are logged and the loop continues\r\n * with a different source on the next tick.\r\n */\r\n\r\nexport interface EternalAutonomyOptions {\r\n agent: Agent;\r\n projectRoot: string;\r\n /**\r\n * Per-iteration agent timeout. Defaults to 5 minutes. A single hung\r\n * provider call should not freeze the whole eternal loop.\r\n */\r\n iterationTimeoutMs?: number;\r\n /**\r\n * Maximum number of internal agent.run iterations the engine grants per\r\n * eternal-loop tick. The engine sets `autonomousContinue: true` so the\r\n * agent can run multi-step tasks end-to-end within one tick instead of\r\n * bouncing back to the engine after every single tool call. Default 50.\r\n */\r\n iterationMaxAgentSteps?: number;\r\n /**\r\n * Minimum sleep between iterations. Defaults to 1 s — enough for\r\n * SIGINT handlers to fire mid-loop without pegging a core when the\r\n * provider is being rate-limited.\r\n */\r\n cycleGapMs?: number;\r\n /**\r\n * Maximum consecutive failures before the source rotation forces a\r\n * brainstorm cycle. Default 3. Acts as a soft-recovery, not a stop.\r\n */\r\n failureBudget?: number;\r\n /**\r\n * Per-todo failed-attempt ceiling. When the engine picks the same todo\r\n * and the iteration fails this many times in total, the todo is taken\r\n * out of rotation (engine prefers other sources) until it changes\r\n * status. Default 3. Prevents the loop from spinning forever on one\r\n * stuck task.\r\n */\r\n todoMaxAttempts?: number;\r\n /**\r\n * Consecutive brainstorm-DONE responses required to consider the goal\r\n * complete and stop the engine. When the LLM's brainstorm step keeps\r\n * answering `DONE`, the engine treats that as \"no more work\" and, after\r\n * this many in a row, marks the goal as completed instead of sleeping\r\n * forever. Default 3.\r\n */\r\n brainstormDoneStopThreshold?: number;\r\n /** Side-channel notifications (logging, UI updates). */\r\n onIteration?: (entry: JournalEntry) => void;\r\n onError?: (err: Error, iteration: number) => void;\r\n /**\r\n * Per-iteration phase notifications for live UI updates (TUI status bar,\r\n * etc.). Fires at each major stage transition: idle → decide → execute →\r\n * reflect → (sleep | paused | stopped). Fire-and-forget — the engine\r\n * does not await the callback.\r\n */\r\n onStage?: (stage: IterationStage) => void;\r\n /**\r\n * Optional injected git status reader — production code uses git, tests\r\n * stub this out so they don't shell out.\r\n */\r\n gitStatusReader?: () => Promise<string>;\r\n /**\r\n * Optional clock — tests stub for deterministic timestamps.\r\n */\r\n now?: () => Date;\r\n /**\r\n * Optional compactor. When provided, the engine runs compaction every\r\n * `compactEveryNIterations` iterations to keep the agent's message\r\n * history under control during multi-day eternal loops. Without\r\n * compaction, an infinite loop will eventually overflow the provider's\r\n * context window and start failing.\r\n */\r\n compactor?: Compactor;\r\n /** How many iterations between compaction calls. Default 25. */\r\n compactEveryNIterations?: number;\r\n /**\r\n * Aggressive compaction threshold. When ctx token usage exceeds this\r\n * fraction of `maxContextTokens`, compaction runs in aggressive mode\r\n * regardless of the iteration cadence. 0.85 by default.\r\n */\r\n aggressiveCompactRatio?: number;\r\n /**\r\n * Model's max context window in tokens. When set, the engine watches\r\n * `currentRequestTokens()` against this and triggers aggressive compact\r\n * before the next iteration would overflow. Omit to disable threshold\r\n * checks (iteration cadence still applies).\r\n */\r\n maxContextTokens?: number;\r\n /**\r\n * Base delay (ms) for the first transient-error backoff. Subsequent\r\n * transient failures double this, capped at `transientBackoffMaxMs`.\r\n * Default 2_000.\r\n *\r\n * \"Transient\" means the underlying error is recoverable per\r\n * `WrongStackError.recoverable` (ProviderError sets this for 429/529/5xx\r\n * /network errors). Permanent errors (auth/invalid request) skip the\r\n * backoff and count toward `failureBudget` like before — backing off\r\n * on a permanent failure is wasted time.\r\n */\r\n transientBackoffBaseMs?: number;\r\n /** Ceiling for the exponential backoff. Default 60_000 (60 s). */\r\n transientBackoffMaxMs?: number;\r\n}\r\n\r\nexport type EternalEngineState = 'idle' | 'running' | 'stopped';\r\n\r\n/**\r\n * Per-iteration phase emitted via `onStage` so UIs can render the\r\n * engine's live location in the sense-decide-execute-reflect loop.\r\n */\r\nexport type IterationStage =\r\n | { phase: 'idle' }\r\n | { phase: 'decide'; reason: string }\r\n | { phase: 'execute'; task: string }\r\n | { phase: 'reflect'; status: 'success' | 'failure' | 'aborted' | 'skipped'; note?: string }\r\n | { phase: 'sleep'; ms: number }\r\n | { phase: 'paused' }\r\n | { phase: 'stopped' }\r\n | { phase: 'error'; message: string };\r\n\r\ninterface DecidedAction {\r\n source: JournalEntry['source'];\r\n task: string;\r\n directive: string;\r\n /** Set when source === 'todo' so the engine can attribute failures. */\r\n todoId?: string;\r\n}\r\n\r\n/**\r\n * Sentinel returned by `brainstormTask` when the LLM declares the goal\r\n * fully accomplished. Distinct from `null` (which means \"brainstorm\r\n * failed / no actionable task right now\") so the engine can count\r\n * consecutive DONE answers toward a real stop.\r\n */\r\nconst BRAINSTORM_DONE = Symbol('brainstorm-done');\r\n\r\n/**\r\n * Free-text marker the model can emit (on its own line) to declare the\r\n * overall mission accomplished. Detected in the successful iteration's\r\n * `finalText`. When present, the engine flips `goalState='completed'`\r\n * and stops — the model has explicitly claimed completion AND the\r\n * iteration succeeded, which together is the most reliable stop signal\r\n * we can get without a separate verifier round-trip.\r\n */\r\nconst GOAL_COMPLETE_MARKER = /^\\s*\\[goal[_\\s-]?complete\\]\\s*$/im;\r\n\r\nexport class EternalAutonomyEngine {\r\n private state: EternalEngineState = 'idle';\r\n private stopRequested = false;\r\n private consecutiveFailures = 0;\r\n private consecutiveBrainstormDone = 0;\r\n /**\r\n * Count of consecutive transient (recoverable) provider failures. Drives\r\n * the exponential backoff between iterations. Reset on the first\r\n * successful iteration so a single bad afternoon doesn't permanently\r\n * slow the loop down.\r\n */\r\n private consecutiveTransientRetries = 0;\r\n private currentCtrl: AbortController | null = null;\r\n private iterationsSinceCompact = 0;\r\n private readonly goalPath: string;\r\n\r\n constructor(private readonly opts: EternalAutonomyOptions) {\r\n this.goalPath = goalFilePath(opts.projectRoot);\r\n }\r\n\r\n /** Current engine state — readable for UIs. */\r\n get currentState(): EternalEngineState {\r\n return this.state;\r\n }\r\n\r\n /** Synchronously request stop. Resolves once the running iteration aborts. */\r\n stop(): void {\r\n this.stopRequested = true;\r\n this.currentCtrl?.abort();\r\n // Best-effort: flip the persisted state so the next startup banner\r\n // doesn't report a phantom \"running\" engine. Fire-and-forget — if it\r\n // races with an in-flight iteration's write, the journal write wins\r\n // (engineState is metadata, not durable correctness).\r\n void this.persistEngineState('stopped').catch(() => {});\r\n this.state = 'stopped';\r\n }\r\n\r\n /**\r\n * Mark the engine as 'running' on disk + reset stop state so a new\r\n * batch of `runOneIteration()` calls can proceed. Called by the REPL\r\n * when the user invokes `/autonomy eternal`. Idempotent.\r\n */\r\n async prime(): Promise<void> {\r\n this.stopRequested = false;\r\n this.state = 'running';\r\n await this.persistEngineState('running').catch(() => {});\r\n }\r\n\r\n /**\r\n * Main loop. Returns when stop() is called or the goal file is removed.\r\n * Does NOT throw — every iteration is wrapped to keep the loop alive.\r\n */\r\n async run(): Promise<void> {\r\n this.state = 'running';\r\n await this.persistEngineState('running');\r\n\r\n try {\r\n while (!this.stopRequested) {\r\n let iterationOk = false;\r\n try {\r\n iterationOk = await this.runOneIteration();\r\n } catch (err) {\r\n this.consecutiveFailures++;\r\n this.opts.onError?.(err instanceof Error ? err : new Error(String(err)), this.consecutiveFailures);\r\n await this.appendFailure('engine error', err instanceof Error ? err.message : String(err));\r\n }\r\n\r\n if (iterationOk) {\r\n this.consecutiveFailures = 0;\r\n }\r\n\r\n if (this.stopRequested) break;\r\n\r\n // Brief gap so SIGINT can land between iterations even if the\r\n // agent is bouncing back results fast.\r\n await sleep(this.opts.cycleGapMs ?? 1000);\r\n }\r\n } finally {\r\n this.state = 'stopped';\r\n await this.persistEngineState('stopped').catch(() => {});\r\n }\r\n }\r\n\r\n /**\r\n * Execute a single sense-decide-execute-reflect cycle.\r\n * Returns true on success, false on handled failure / no-op.\r\n *\r\n * Exposed publicly so the REPL can pace iterations from its main loop\r\n * — running the engine and the REPL as a single sequential consumer of\r\n * `agent.run()` avoids race conditions on the shared Context.\r\n */\r\n async runOneIteration(): Promise<boolean> {\r\n // Emit stage transitions so UIs can render the engine's live location.\r\n const emit = (stage: IterationStage) => {\r\n this.opts.onStage?.(stage);\r\n };\r\n\r\n const goal = await loadGoal(this.goalPath);\r\n if (!goal) {\r\n // Goal file disappeared — treat as a graceful stop.\r\n emit({ phase: 'stopped' });\r\n this.stopRequested = true;\r\n return false;\r\n }\r\n\r\n // Mission-level lifecycle gate.\r\n const missionState = goal.goalState ?? 'active';\r\n if (missionState !== 'active') {\r\n emit({ phase: missionState === 'paused' ? 'paused' : 'stopped' });\r\n this.stopRequested = true;\r\n return false;\r\n }\r\n\r\n emit({ phase: 'decide', reason: 'picking next task' });\r\n const action = await this.decide(goal);\r\n if (!action) {\r\n if (!this.stopRequested) {\r\n emit({ phase: 'sleep', ms: 5_000 });\r\n await sleep(5_000);\r\n } else {\r\n emit({ phase: 'stopped' });\r\n }\r\n return false;\r\n }\r\n\r\n emit({ phase: 'execute', task: action.task });\r\n\r\n const ctrl = new AbortController();\r\n this.currentCtrl = ctrl;\r\n const timer = setTimeout(\r\n () => ctrl.abort(),\r\n this.opts.iterationTimeoutMs ?? 5 * 60_000,\r\n );\r\n let status: JournalEntry['status'] = 'success';\r\n let note: string | undefined;\r\n let finalText = '';\r\n // Captured from `result.error?.recoverable` when the agent.run returns\r\n // a recoverable WrongStackError (ProviderError sets this for 429/529\r\n // /5xx/network). Drives the engine's exponential backoff so a\r\n // transient rate-limit storm doesn't burn the failure budget in\r\n // seconds. Permanent errors leave this false and trip the normal\r\n // consecutiveFailures path.\r\n let isTransientFailure = false;\r\n\r\n // Snapshot usage before so the iteration delta can be journaled.\r\n // Token counter is optional in mock/test contexts — guard accordingly.\r\n const tc = this.opts.agent.ctx?.tokenCounter;\r\n const beforeUsage = tc?.total?.();\r\n const beforeCost = tc?.estimateCost?.().total;\r\n\r\n try {\r\n const result = await this.opts.agent.run(\r\n [{ type: 'text' as const, text: action.directive }],\r\n {\r\n signal: ctrl.signal,\r\n // Enable per-call autonomous continuation so the agent can chain\r\n // multiple internal tool/response cycles end-to-end on one\r\n // directive instead of returning to the engine after a single\r\n // round-trip. The model uses `[continue]` / `[done]` markers\r\n // (or the `continue_to_next_iteration` tool) to control the\r\n // inner loop. Without this flag the engine produced shallow\r\n // iterations and almost never let a real task finish.\r\n autonomousContinue: true,\r\n // Cap the inner loop so a runaway agent.run can't burn through\r\n // the iteration timeout — the engine's own outer loop is the\r\n // long-running thing, each tick should be bounded.\r\n maxIterations: this.opts.iterationMaxAgentSteps ?? 50,\r\n },\r\n );\r\n\r\n if (result.status === 'aborted') {\r\n status = 'aborted';\r\n note = 'stopped by user';\r\n } else if (result.status === 'failed') {\r\n status = 'failure';\r\n note = result.error?.describe?.() ?? 'agent run failed';\r\n isTransientFailure = result.error?.recoverable === true;\r\n } else if (result.status === 'max_iterations') {\r\n status = 'failure';\r\n note = `max iterations (${result.iterations})`;\r\n } else {\r\n status = 'success';\r\n finalText = result.finalText ?? '';\r\n const tail = finalText.slice(0, 240).replace(/\\s+/g, ' ').trim();\r\n if (tail) note = tail;\r\n }\r\n } catch (err) {\r\n const isAbort = err instanceof Error && (err.name === 'AbortError' || err.message.includes('abort'));\r\n status = isAbort ? 'aborted' : 'failure';\r\n note = err instanceof Error ? err.message : String(err);\r\n // Surface .recoverable on the thrown WrongStackError too — provider\r\n // errors that escape the agent's catch (rare; usually wrapped into\r\n // result.error) still classify correctly.\r\n if (\r\n !isAbort &&\r\n typeof (err as { recoverable?: unknown })?.recoverable === 'boolean'\r\n ) {\r\n isTransientFailure = (err as { recoverable: boolean }).recoverable;\r\n }\r\n } finally {\r\n clearTimeout(timer);\r\n this.currentCtrl = null;\r\n }\r\n\r\n // Per-todo attempt accounting. On failure of a todo-sourced action,\r\n // bump the persistent counter so `decide()` can rotate past it once\r\n // it crosses the configured ceiling. Successful runs leave the\r\n // counter untouched — the LLM is responsible for flipping the todo\r\n // status to `completed` via the todos tool (directive teaches this).\r\n if (action.source === 'todo' && action.todoId && status !== 'success') {\r\n await this.bumpTodoAttempt(action.todoId);\r\n }\r\n\r\n // Capture per-iteration usage delta. Cost is always non-negative;\r\n // if the counter wraps or resets mid-iteration we clamp to 0 so the\r\n // journal never shows negative spend.\r\n const afterUsage = tc?.total?.();\r\n const afterCost = tc?.estimateCost?.().total;\r\n const tokens =\r\n beforeUsage && afterUsage\r\n ? {\r\n input: Math.max(0, afterUsage.input - beforeUsage.input),\r\n output: Math.max(0, afterUsage.output - beforeUsage.output),\r\n }\r\n : undefined;\r\n const costUsd =\r\n typeof beforeCost === 'number' && typeof afterCost === 'number'\r\n ? Math.max(0, afterCost - beforeCost)\r\n : undefined;\r\n\r\n await this.appendIterationEntry({\r\n source: action.source,\r\n task: action.task,\r\n status,\r\n note,\r\n tokens,\r\n costUsd,\r\n });\r\n\r\n emit({ phase: 'reflect', status, note });\r\n\r\n // Re-read the goal so we can emit the real iteration counter rather\r\n // than the previous placeholder. If the goal was unlinked mid-flight\r\n // (graceful stop via /goal clear) the iteration index is still\r\n // useful — fall back to the in-memory consecutiveFailures-derived\r\n // approximation only as a last resort.\r\n let iterationIndex = 0;\r\n try {\r\n const reloaded = await loadGoal(this.goalPath);\r\n iterationIndex = reloaded?.iterations ?? 0;\r\n } catch {\r\n // best-effort\r\n }\r\n this.opts.onIteration?.({\r\n at: (this.opts.now?.() ?? new Date()).toISOString(),\r\n iteration: iterationIndex,\r\n source: action.source,\r\n task: action.task,\r\n status,\r\n note,\r\n tokens,\r\n costUsd,\r\n });\r\n\r\n // Transient failure — sleep with interruptible backoff before retry.\r\n if (status === 'failure') {\r\n if (isTransientFailure) {\r\n this.consecutiveTransientRetries++;\r\n const delay = this.computeTransientBackoffMs();\r\n if (delay > 0) {\r\n emit({ phase: 'sleep', ms: delay });\r\n await this.sleepInterruptible(delay);\r\n }\r\n return false;\r\n }\r\n this.consecutiveFailures++;\r\n return false;\r\n }\r\n\r\n if (status === 'aborted') {\r\n if (this.stopRequested) return false;\r\n this.consecutiveFailures++;\r\n return false;\r\n }\r\n\r\n // Successful iteration\r\n this.consecutiveTransientRetries = 0;\r\n const cycleGapMs = this.opts.cycleGapMs ?? 1000;\r\n emit({ phase: 'sleep', ms: cycleGapMs });\r\n await sleep(cycleGapMs);\r\n\r\n // Goal-complete detection. The model emits `[GOAL_COMPLETE]` on its\r\n // own line in `finalText` when the overall mission is verifiably done.\r\n // Combined with a successful iteration this is a strong stop signal:\r\n // the LLM explicitly claimed completion AND the run did not fail. We\r\n // mark the goal `completed`, journal it, and stop. No separate\r\n // verifier round-trip — keeps cost down; if the model lies, the user\r\n // notices and can re-arm with `/goal set`.\r\n if (GOAL_COMPLETE_MARKER.test(finalText)) {\r\n await this.markGoalCompleted(action, finalText);\r\n this.stopRequested = true;\r\n return true;\r\n }\r\n // Compaction runs only on successful iterations — there's no point\r\n // compacting after a failed/aborted iteration that didn't add much to\r\n // the message history.\r\n this.iterationsSinceCompact++;\r\n await this.maybeCompact().catch((err) => {\r\n // Don't let compaction failure kill the loop; surface via onError.\r\n this.opts.onError?.(\r\n err instanceof Error ? err : new Error(String(err)),\r\n this.consecutiveFailures,\r\n );\r\n });\r\n return true;\r\n }\r\n\r\n /**\r\n * Run compaction when either trigger fires:\r\n * - We've done >= compactEveryNIterations since the last compact.\r\n * - Current request tokens exceed aggressiveCompactRatio * maxContext.\r\n *\r\n * The second check uses *aggressive* mode to free more headroom; the\r\n * cadence check uses non-aggressive (cheaper).\r\n */\r\n private async maybeCompact(): Promise<void> {\r\n const compactor = this.opts.compactor;\r\n if (!compactor) return;\r\n const ctx = this.opts.agent.ctx;\r\n if (!ctx) return;\r\n\r\n const cadence = this.opts.compactEveryNIterations ?? 25;\r\n const threshold = this.opts.aggressiveCompactRatio ?? 0.85;\r\n const maxCtx = this.opts.maxContextTokens;\r\n\r\n let aggressive = false;\r\n let shouldRun = false;\r\n\r\n if (this.iterationsSinceCompact >= cadence) {\r\n shouldRun = true;\r\n }\r\n\r\n if (maxCtx && maxCtx > 0) {\r\n const used = ctx.tokenCounter?.currentRequestTokens?.();\r\n if (used) {\r\n const total = used.input + used.cacheRead;\r\n if (total / maxCtx >= threshold) {\r\n shouldRun = true;\r\n aggressive = true;\r\n }\r\n }\r\n }\r\n\r\n if (!shouldRun) return;\r\n\r\n const report = await compactor.compact(ctx, { aggressive });\r\n this.iterationsSinceCompact = 0;\r\n // Journal the compaction event so users see it in /goal journal.\r\n const saved = report.before - report.after;\r\n await this.appendIterationEntry({\r\n source: 'manual',\r\n task: `compaction (${aggressive ? 'aggressive' : 'cadence'})`,\r\n status: 'success',\r\n note: `saved ~${saved} tokens (${report.before}→${report.after})`,\r\n });\r\n }\r\n\r\n /**\r\n * Hybrid idea source.\r\n * 1. Pending todos on the agent's context.\r\n * 2. Dirty git working tree → propose a \"review and finish this\" task.\r\n * 3. Otherwise: brainstorm via the LLM against the goal.\r\n *\r\n * After failureBudget consecutive failures, force brainstorm so the\r\n * engine doesn't loop on the same broken todo or stuck git state.\r\n */\r\n private async decide(goal: GoalFile): Promise<DecidedAction | null> {\r\n const forceBrainstorm = this.consecutiveFailures >= (this.opts.failureBudget ?? 3);\r\n\r\n if (!forceBrainstorm) {\r\n const todo = this.pickPendingTodo(goal);\r\n if (todo) {\r\n return {\r\n source: 'todo',\r\n task: todo.content,\r\n todoId: todo.id,\r\n directive: this.buildDirective(goal, 'todo', todo.content),\r\n };\r\n }\r\n\r\n const gitTask = await this.pickGitTask();\r\n if (gitTask) {\r\n return {\r\n source: 'git',\r\n task: gitTask,\r\n directive: this.buildDirective(goal, 'git', gitTask),\r\n };\r\n }\r\n }\r\n\r\n const brainstormed = await this.brainstormTask(goal);\r\n if (brainstormed === BRAINSTORM_DONE) {\r\n // Model says there's nothing to do. Count consecutive DONEs — if\r\n // we hit the threshold, treat the mission as finished and stop\r\n // instead of sleeping forever on null actions.\r\n this.consecutiveBrainstormDone++;\r\n const threshold = this.opts.brainstormDoneStopThreshold ?? 3;\r\n if (this.consecutiveBrainstormDone >= threshold) {\r\n await this.markGoalCompleted(\r\n { source: 'brainstorm', task: 'no further work', directive: '' },\r\n `brainstorm returned DONE ${this.consecutiveBrainstormDone}x in a row`,\r\n );\r\n this.stopRequested = true;\r\n }\r\n return null;\r\n }\r\n if (!brainstormed) return null;\r\n // Got a real task — reset the DONE streak.\r\n this.consecutiveBrainstormDone = 0;\r\n return {\r\n source: 'brainstorm',\r\n task: brainstormed,\r\n directive: this.buildDirective(goal, 'brainstorm', brainstormed),\r\n };\r\n }\r\n\r\n private pickPendingTodo(goal: GoalFile): TodoItem | null {\r\n const todos = this.opts.agent.ctx.todos;\r\n if (!Array.isArray(todos)) return null;\r\n const attempts = goal.todoAttempts ?? {};\r\n const ceiling = this.opts.todoMaxAttempts ?? 3;\r\n // First-pending strategy with a stuck-task escape hatch: if the\r\n // first pending todo has already failed `ceiling` times, fall\r\n // through to later pending todos. Returns null when every pending\r\n // todo is stuck — the caller will fall through to git/brainstorm.\r\n for (const t of todos) {\r\n if (t.status !== 'pending') continue;\r\n const used = attempts[t.id] ?? 0;\r\n if (used >= ceiling) continue;\r\n return t;\r\n }\r\n return null;\r\n }\r\n\r\n private async pickGitTask(): Promise<string | null> {\r\n let out: string;\r\n try {\r\n out = await (this.opts.gitStatusReader?.() ?? this.readGitStatus());\r\n } catch {\r\n return null;\r\n }\r\n const dirty = out.trim();\r\n if (!dirty) return null;\r\n // Surface a concise prompt — the agent will look at the diff itself.\r\n const lines = dirty.split('\\n').slice(0, 8);\r\n const preview = lines.join(', ');\r\n return `Inspect the dirty working tree and either finish the in-progress work or revert it. Files: ${preview}`;\r\n }\r\n\r\n private async readGitStatus(): Promise<string> {\r\n const { stdout } = await execFileP('git', ['status', '--porcelain'], {\r\n cwd: this.opts.projectRoot,\r\n timeout: 5_000,\r\n });\r\n return stdout;\r\n }\r\n\r\n private async brainstormTask(goal: GoalFile): Promise<string | null | typeof BRAINSTORM_DONE> {\r\n const lastFew = goal.journal\r\n .slice(-5)\r\n .map((e) => ` - [${e.status}] ${e.task}`)\r\n .join('\\n');\r\n const directive = [\r\n 'You are deciding the next action in an autonomous loop pursuing a long-running goal.',\r\n '',\r\n `Goal: ${goal.goal}`,\r\n '',\r\n lastFew ? `Recent iterations:\\n${lastFew}` : 'No prior iterations yet.',\r\n '',\r\n 'Output ONE concrete, immediately-actionable task that advances the goal.',\r\n 'Constraints:',\r\n '- One sentence, imperative form, under 200 chars.',\r\n '- No preamble, no explanation, no markdown — just the task line.',\r\n '- If recent iterations show repeated failures on the same target, pivot.',\r\n '- If the goal appears fully accomplished AND you can name a concrete',\r\n ' artifact / test / output that proves it, output exactly: DONE',\r\n '- Be conservative with DONE: if the recent journal contains failures',\r\n ' or aborted entries, the goal is almost certainly NOT done.',\r\n ].join('\\n');\r\n\r\n try {\r\n const ctrl = new AbortController();\r\n const timer = setTimeout(() => ctrl.abort(), 60_000);\r\n try {\r\n const result = await this.opts.agent.run(\r\n [{ type: 'text' as const, text: directive }],\r\n { signal: ctrl.signal, maxIterations: 1 },\r\n );\r\n if (result.status !== 'done') return null;\r\n const text = (result.finalText ?? '').trim();\r\n if (!text) return null;\r\n // Distinct sentinel for DONE so the caller can count consecutive\r\n // DONE answers toward a real stop. The old `return null` path\r\n // conflated \"no work\" with \"engine failure\" and looped forever.\r\n if (/^DONE\\.?$/i.test(text)) return BRAINSTORM_DONE;\r\n // Take the first non-empty line and clip to 240 chars.\r\n const firstLine = text.split('\\n').find((l) => l.trim().length > 0)?.trim();\r\n if (!firstLine) return null;\r\n if (/^DONE\\.?$/i.test(firstLine)) return BRAINSTORM_DONE;\r\n return firstLine.slice(0, 240);\r\n } finally {\r\n clearTimeout(timer);\r\n }\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n private buildDirective(goal: GoalFile, source: JournalEntry['source'], task: string): string {\r\n const recentJournal = goal.journal\r\n .slice(-5)\r\n .map((e) => ` #${e.iteration} [${e.status}] ${e.task}${e.note ? ` — ${e.note.slice(0, 80)}` : ''}`)\r\n .join('\\n');\r\n return [\r\n '═══ ETERNAL AUTONOMY — iteration directive ═══',\r\n '',\r\n `Mission: ${goal.goal}`,\r\n `Iteration: #${goal.iterations + 1}`,\r\n `Source: ${source}`,\r\n `Task: ${task}`,\r\n '',\r\n recentJournal ? `Recent journal (last 5):\\n${recentJournal}` : 'No prior iterations.',\r\n '',\r\n '── EXECUTION PROTOCOL ──',\r\n 'You are inside a long-running autonomous loop. Each iteration you',\r\n 'execute ONE concrete task that advances the Mission. No user is',\r\n 'available to clarify — make defensible decisions and move forward.',\r\n '',\r\n '1. EXECUTE END-TO-END',\r\n ' • Use multiple tool calls freely. Emit `[continue]` on its own line',\r\n ' to chain to the next internal step without returning.',\r\n ' • When this iteration\\'s Task is finished (real artifact / passing',\r\n ' test / applied diff / clean output), emit `[done]` on its own line.',\r\n ' • Do not stop on the first obstacle — try at least 3 distinct',\r\n ' approaches before giving up. YOLO is active; no confirmations.',\r\n '',\r\n '2. UPDATE TODO STATE (when Source is `todo`)',\r\n ' • Mark this todo `in_progress` via the todos tool before tool work.',\r\n ' • Mark it `completed` on success, with a one-line outcome note.',\r\n ' • If you cannot make progress after 2 distinct attempts, mark it',\r\n ' `cancelled` with the obstacle. The loop will skip it next time.',\r\n '',\r\n '3. MISSION-COMPLETE PROTOCOL',\r\n ' • If — and ONLY if — the OVERALL Mission (not just this Task) is',\r\n ' verifiably accomplished, emit on its own line:',\r\n ' [GOAL_COMPLETE]',\r\n ' followed by a one-paragraph verification recipe (artifact path,',\r\n ' test command, or 10-second reproduction). This halts the loop.',\r\n ' • NEVER emit [GOAL_COMPLETE] on optimism, partial progress, or',\r\n ' \"looks fine\". Required: a concrete artifact that proves it AND',\r\n ' no recent journal failures contradicting completion.',\r\n ' • If unsure, emit `[done]` instead and let the next iteration',\r\n ' decide. The loop is patient; false completion is not.',\r\n '',\r\n '4. NO INTERACTIVITY',\r\n ' • Do not ask questions, do not request confirmation, do not propose',\r\n ' options. Pick the best path and execute. The user is asleep.',\r\n ].join('\\n');\r\n }\r\n\r\n /**\r\n * Exponential backoff for transient provider errors. `2^N * base`\r\n * capped at `transientBackoffMaxMs`. Zero base disables backoff.\r\n * Public-private to keep `runOneIteration` readable; the value is\r\n * recomputed each call from the current retry count, so callers\r\n * don't have to track state.\r\n */\r\n private computeTransientBackoffMs(): number {\r\n const base = this.opts.transientBackoffBaseMs ?? 2_000;\r\n const cap = this.opts.transientBackoffMaxMs ?? 60_000;\r\n if (base <= 0) return 0;\r\n const exponent = Math.max(0, this.consecutiveTransientRetries - 1);\r\n return Math.min(cap, base * Math.pow(2, exponent));\r\n }\r\n\r\n /**\r\n * Sleep that wakes early if `stopRequested` flips. Polls every 250 ms\r\n * so SIGINT / `/autonomy stop` can land in the middle of a long\r\n * backoff instead of waiting up to a minute for the timer.\r\n */\r\n private async sleepInterruptible(totalMs: number): Promise<void> {\r\n const step = 250;\r\n let remaining = totalMs;\r\n while (remaining > 0 && !this.stopRequested) {\r\n const chunk = Math.min(step, remaining);\r\n await sleep(chunk);\r\n remaining -= chunk;\r\n }\r\n }\r\n\r\n private async appendIterationEntry(entry: Omit<JournalEntry, 'iteration' | 'at'>): Promise<void> {\r\n const current = await loadGoal(this.goalPath);\r\n if (!current) {\r\n // Goal was cleared mid-iteration; nothing to write to.\r\n return;\r\n }\r\n const updated = appendJournal(current, entry);\r\n await saveGoal(this.goalPath, updated);\r\n }\r\n\r\n /**\r\n * Persistent per-todo failure counter. Skipped silently when the goal\r\n * file has been removed (graceful clear). Each non-success iteration\r\n * against a todo source bumps the counter by 1; `pickPendingTodo` reads\r\n * the counter to rotate past stuck todos once they cross `todoMaxAttempts`.\r\n */\r\n private async bumpTodoAttempt(todoId: string): Promise<void> {\r\n const current = await loadGoal(this.goalPath);\r\n if (!current) return;\r\n const attempts = { ...(current.todoAttempts ?? {}) };\r\n attempts[todoId] = (attempts[todoId] ?? 0) + 1;\r\n await saveGoal(this.goalPath, { ...current, todoAttempts: attempts });\r\n }\r\n\r\n /**\r\n * Flip the mission to `completed` and journal it. Called from two\r\n * paths: (a) `[GOAL_COMPLETE]` marker in a successful iteration's\r\n * finalText, (b) `brainstorm` returning DONE consecutively past the\r\n * configured threshold. Idempotent — re-entry is a no-op once the\r\n * goal is already `completed`.\r\n */\r\n private async markGoalCompleted(\r\n action: { source: JournalEntry['source']; task: string; directive: string },\r\n note: string,\r\n ): Promise<void> {\r\n const current = await loadGoal(this.goalPath);\r\n if (!current) return;\r\n if (current.goalState === 'completed') return;\r\n const withFlag: GoalFile = { ...current, goalState: 'completed' };\r\n const withEntry = appendJournal(withFlag, {\r\n source: action.source,\r\n task: `MISSION COMPLETE — ${action.task}`.slice(0, 240),\r\n status: 'success',\r\n note: note.slice(0, 240),\r\n });\r\n await saveGoal(this.goalPath, withEntry);\r\n }\r\n\r\n private async appendFailure(task: string, note: string): Promise<void> {\r\n await this.appendIterationEntry({ source: 'manual', task, status: 'failure', note });\r\n }\r\n\r\n private async persistEngineState(state: GoalFile['engineState']): Promise<void> {\r\n const current = await loadGoal(this.goalPath);\r\n if (!current) return;\r\n if (current.engineState === state) return;\r\n await saveGoal(this.goalPath, { ...current, engineState: state });\r\n }\r\n}\r\n\r\nfunction sleep(ms: number): Promise<void> {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n","import type { Usage } from '../types/provider.js';\r\nimport type { EventBus } from '../kernel/events.js';\r\n\r\nexport type BudgetKind = 'tool_calls' | 'iterations' | 'tokens' | 'timeout' | 'cost';\r\n\r\nexport class BudgetExceededError extends Error {\r\n readonly kind: BudgetKind;\r\n readonly limit: number;\r\n readonly observed: number;\r\n\r\n constructor(kind: BudgetKind, limit: number, observed: number) {\r\n super(`Budget exceeded: ${kind} (limit=${limit}, observed=${observed})`);\r\n this.name = 'BudgetExceededError';\r\n this.kind = kind;\r\n this.limit = limit;\r\n this.observed = observed;\r\n }\r\n}\r\n\r\nexport interface BudgetLimits {\r\n maxIterations?: number;\r\n maxToolCalls?: number;\r\n maxTokens?: number;\r\n /** Estimated USD cost ceiling. */\r\n maxCostUsd?: number;\r\n /** Wall-clock timeout from start() to checkTimeout(). */\r\n timeoutMs?: number;\r\n}\r\n\r\nexport interface BudgetUsage {\r\n iterations: number;\r\n toolCalls: number;\r\n tokens: { input: number; output: number; total: number };\r\n costUsd: number;\r\n elapsedMs: number;\r\n}\r\n\r\n/**\r\n * Thrown by `SubagentBudget.record*` when a soft limit is hit and\r\n * an `onThreshold` handler is configured that wants to ask the\r\n * coordinator (via `budget.threshold_reached` event). The runner\r\n * catches this and awaits the embedded `decision` promise to get\r\n * the coordinator's extend/stop decision.\r\n *\r\n * Distinct from `BudgetExceededError` which is a hard stop.\r\n */\r\nexport class BudgetThresholdSignal extends Error {\r\n readonly kind: BudgetKind;\r\n readonly limit: number;\r\n readonly used: number;\r\n /** Resolves to 'extend' (with optional new limits) or 'stop' */\r\n readonly decision: Promise<BudgetThresholdDecision>;\r\n\r\n constructor(\r\n kind: BudgetKind,\r\n limit: number,\r\n used: number,\r\n decision: Promise<BudgetThresholdDecision>,\r\n ) {\r\n super(`Budget soft limit: ${kind} (limit=${limit}, used=${used})`);\r\n this.name = 'BudgetThresholdSignal';\r\n this.kind = kind;\r\n this.limit = limit;\r\n this.used = used;\r\n this.decision = decision;\r\n }\r\n}\r\n\r\nexport type BudgetThresholdDecision =\r\n | 'stop'\r\n | { extend: Partial<BudgetLimits> };\r\n\r\n/**\r\n * Callback invoked when a budget limit is about to be exceeded.\r\n * Return 'throw' for hard stop (default — throws BudgetExceededError).\r\n * Return 'continue' to allow one more unit and re-check next time.\r\n * Return a Promise to ask the coordinator via `budget.threshold_reached`\r\n * event (uses the same grant/deny pattern as `iteration.limit_reached`).\r\n */\r\nexport type BudgetThresholdHandler = (info: {\r\n kind: BudgetKind;\r\n used: number;\r\n limit: number;\r\n requestDecision: () => Promise<BudgetThresholdDecision>;\r\n}) => 'throw' | 'continue' | Promise<BudgetThresholdDecision>;\r\n\r\n/**\r\n * Per-subagent budget enforcement. Each subagent gets its own instance so a\r\n * runaway agent can't drain the cost ceiling of its siblings. All record/check\r\n * methods are O(1) and safe to call from hot paths.\r\n *\r\n * Behavior: `record*` methods check the limit and throw synchronously when\r\n * no `onThreshold` handler is configured. When a handler IS configured,\r\n * `checkLimit` delegates to it and any async work (coordinator decision)\r\n * is fire-and-forget via `void` — the thrown error is always synchronous\r\n * so event handlers in tests (which use `expect(...).toThrow`) work correctly.\r\n */\r\nexport class SubagentBudget {\r\n readonly limits: Readonly<BudgetLimits>;\r\n private iterations = 0;\r\n private toolCalls = 0;\r\n private tokenInput = 0;\r\n private tokenOutput = 0;\r\n private costUsd = 0;\r\n private startTime: number | null = null;\r\n private _onThreshold: BudgetThresholdHandler | undefined;\r\n /**\r\n * Tracks which budget kinds currently have an extension request\r\n * in flight. While a kind is here, further `checkLimit` calls for the\r\n * same kind are no-ops — without this dedup, every `recordIteration`\r\n * after the limit is reached spawns a fresh decision Promise (until\r\n * the first one lands and patches limits), flooding the FleetBus\r\n * with redundant threshold events. Cleared in `checkLimitAsync`'s\r\n * `finally`.\r\n */\r\n private readonly pendingExtensions: Set<BudgetKind> = new Set();\r\n /**\r\n * Hard cap on how long `checkLimitAsync` waits for the coordinator to\r\n * respond before defaulting to 'stop'. Without this fallback an absent\r\n * or hung listener (Director not built / event filter detached mid-run)\r\n * leaves the budget over-limit and never enforces anything, since\r\n * `checkLimit` returns synchronously via `void this.checkLimitAsync`.\r\n * Hardcoded for now — most fleets set their own per-task timeout that\r\n * dwarfs this anyway. 30 s matches the existing event-emit timeoutMs.\r\n */\r\n private static readonly DECISION_TIMEOUT_MS = 30_000;\r\n /**\r\n * Injected by the runner when wiring the budget to its EventBus.\r\n * Used by `checkLimitAsync` to emit `budget.threshold_reached` events.\r\n */\r\n _events?: EventBus;\r\n\r\n /**\r\n * Optional callback for soft-limit handling. When set, the budget will\r\n * call this instead of throwing when a limit is first reached. The\r\n * handler decides whether to throw, continue, or ask the coordinator.\r\n */\r\n get onThreshold(): BudgetThresholdHandler | undefined {\r\n return this._onThreshold;\r\n }\r\n set onThreshold(fn: BudgetThresholdHandler | undefined) {\r\n this._onThreshold = fn;\r\n }\r\n\r\n constructor(limits: BudgetLimits = {}) {\r\n this.limits = Object.freeze({ ...limits });\r\n }\r\n\r\n start(): void {\r\n this.startTime = Date.now();\r\n }\r\n\r\n /** Returns true if we're within 10% of any limit — useful for pre-flight checks. */\r\n isNearLimit(): boolean {\r\n const { maxIterations, maxToolCalls, maxTokens, maxCostUsd } = this.limits;\r\n if (maxIterations && this.iterations >= maxIterations * 0.9) return true;\r\n if (maxToolCalls && this.toolCalls >= maxToolCalls * 0.9) return true;\r\n if (maxTokens && this.tokenInput + this.tokenOutput >= maxTokens * 0.9) return true;\r\n if (maxCostUsd && this.costUsd >= maxCostUsd * 0.9) return true;\r\n return false;\r\n }\r\n\r\n /**\r\n * Synchronous budget check — always throws synchronously so callers\r\n * (especially test event handlers using `expect().toThrow()`) get an\r\n * unhandled rejection when the budget is exceeded without a handler.\r\n * When `onThreshold` IS configured, the actual async threshold-handling\r\n * is dispatched as a fire-and-forget promise.\r\n */\r\n private checkLimit(kind: BudgetKind, used: number, limit: number): void {\r\n // No threshold handler → hard stop, throw synchronously.\r\n if (!this._onThreshold) {\r\n throw new BudgetExceededError(kind, limit, used);\r\n }\r\n // No EventBus or no listener for the threshold event → there's no\r\n // coordinator to ask. Fall back to the hard-stop contract so callers\r\n // that only set `onThreshold` but never wire a Director (or whose\r\n // FleetBus relay is detached) still get budget enforcement. Without\r\n // this guard the BudgetThresholdSignal path would await a decision\r\n // that nobody resolves, the agent would race past it synchronously,\r\n // and the run would \"succeed\" past its budget.\r\n const bus = this._events;\r\n if (!bus || bus.listenerCount('budget.threshold_reached') === 0) {\r\n throw new BudgetExceededError(kind, limit, used);\r\n }\r\n // Already negotiating an extension for this kind — the first signal\r\n // is in flight; the runner is awaiting its decision and will either\r\n // patch limits (we continue) or abort the run (we unwind). Don't\r\n // throw a fresh signal — it would queue duplicate decisions and spam\r\n // the FleetBus.\r\n if (this.pendingExtensions.has(kind)) return;\r\n this.pendingExtensions.add(kind);\r\n // Throw `BudgetThresholdSignal` carrying the decision Promise. The\r\n // runner's catch handler awaits the promise: `stop` triggers an\r\n // abort so the run actually unwinds; `extend` leaves the (already\r\n // patched) limits in place and the agent continues. The previous\r\n // `void this.checkLimitAsync(...)` pattern silently produced an\r\n // unhandled rejection on stop and let the agent run past budget.\r\n const decision = this.negotiateExtension(kind, used, limit);\r\n throw new BudgetThresholdSignal(kind, limit, used, decision);\r\n }\r\n\r\n /**\r\n * Drive the threshold handler to a decision. Resolves with `'stop'`\r\n * (signal the runner to abort) or `{ extend: ... }` (limits already\r\n * patched in-place; the runner should not abort). Always releases the\r\n * `pendingExtensions` slot in `finally`.\r\n *\r\n * The 'continue' return from a sync handler is treated as\r\n * `{ extend: {} }` — keep going without patching, next overrun will\r\n * fire a fresh signal.\r\n */\r\n private async negotiateExtension(\r\n kind: BudgetKind,\r\n used: number,\r\n limit: number,\r\n ): Promise<BudgetThresholdDecision> {\r\n try {\r\n const result = this._onThreshold!({\r\n kind,\r\n used,\r\n limit,\r\n // Inject a requestDecision helper the handler can call to emit the\r\n // budget.threshold_reached event and wait for the coordinator's verdict.\r\n // A hard fallback timer guarantees the promise eventually resolves\r\n // even if no listener responds — without it, an absent/detached\r\n // Director would leave the budget permanently in \"asking\" state.\r\n requestDecision: (): Promise<BudgetThresholdDecision> => {\r\n // No EventBus wired OR no listener registered → there's nobody\r\n // to grant an extension. Fall straight through to 'stop' so the\r\n // runner aborts immediately. Without this short-circuit the run\r\n // would idle for the 30s fallback before failing — long enough\r\n // for a scripted agent (and our budget-enforcement tests) to\r\n // happily finish past its budget.\r\n const bus = this._events;\r\n if (!bus || bus.listenerCount('budget.threshold_reached') === 0) {\r\n return Promise.resolve('stop');\r\n }\r\n return new Promise<BudgetThresholdDecision>((resolve) => {\r\n let resolved = false;\r\n const respond = (d: BudgetThresholdDecision) => {\r\n if (resolved) return;\r\n resolved = true;\r\n resolve(d);\r\n };\r\n const fallback = setTimeout(\r\n () => respond('stop'),\r\n SubagentBudget.DECISION_TIMEOUT_MS,\r\n );\r\n bus.emit('budget.threshold_reached', {\r\n kind: kind as 'iterations' | 'tool_calls' | 'tokens' | 'cost' | 'timeout',\r\n used,\r\n limit,\r\n timeoutMs: SubagentBudget.DECISION_TIMEOUT_MS,\r\n extend: (extra: Partial<BudgetLimits>) => {\r\n clearTimeout(fallback);\r\n respond({ extend: extra });\r\n },\r\n deny: () => {\r\n clearTimeout(fallback);\r\n respond('stop');\r\n },\r\n });\r\n });\r\n },\r\n });\r\n\r\n if (result === 'throw') return 'stop';\r\n if (result === 'continue') return { extend: {} };\r\n\r\n const decision = await result;\r\n if (decision === 'stop') return 'stop';\r\n\r\n // 'extend' — patch the in-place limits BEFORE resolving so the\r\n // runner's continue path sees the new ceiling. The frozen-object\r\n // cast mirrors the original implementation.\r\n const ext = decision.extend;\r\n if (ext.maxIterations !== undefined) {\r\n (this.limits as Record<string, unknown>).maxIterations = ext.maxIterations;\r\n }\r\n if (ext.maxToolCalls !== undefined) {\r\n (this.limits as Record<string, unknown>).maxToolCalls = ext.maxToolCalls;\r\n }\r\n if (ext.maxTokens !== undefined) {\r\n (this.limits as Record<string, unknown>).maxTokens = ext.maxTokens;\r\n }\r\n if (ext.maxCostUsd !== undefined) {\r\n (this.limits as Record<string, unknown>).maxCostUsd = ext.maxCostUsd;\r\n }\r\n if (ext.timeoutMs !== undefined) {\r\n (this.limits as Record<string, unknown>).timeoutMs = ext.timeoutMs;\r\n }\r\n return decision;\r\n } finally {\r\n this.pendingExtensions.delete(kind);\r\n }\r\n }\r\n\r\n recordIteration(): void {\r\n this.iterations++;\r\n if (this.limits.maxIterations !== undefined && this.iterations > this.limits.maxIterations) {\r\n void this.checkLimit('iterations', this.iterations, this.limits.maxIterations);\r\n }\r\n }\r\n\r\n recordToolCall(): void {\r\n this.toolCalls++;\r\n if (this.limits.maxToolCalls !== undefined && this.toolCalls > this.limits.maxToolCalls) {\r\n void this.checkLimit('tool_calls', this.toolCalls, this.limits.maxToolCalls);\r\n }\r\n }\r\n\r\n recordUsage(usage: Usage, costUsd = 0): void {\r\n this.tokenInput += usage.input;\r\n this.tokenOutput += usage.output;\r\n this.costUsd += costUsd;\r\n\r\n const totalTokens = this.tokenInput + this.tokenOutput;\r\n if (this.limits.maxTokens !== undefined && totalTokens > this.limits.maxTokens) {\r\n void this.checkLimit('tokens', totalTokens, this.limits.maxTokens);\r\n }\r\n if (this.limits.maxCostUsd !== undefined && this.costUsd > this.limits.maxCostUsd) {\r\n void this.checkLimit('cost', this.costUsd, this.limits.maxCostUsd);\r\n }\r\n }\r\n\r\n /**\r\n * Wall-clock budget check. Unlike other limits, timeout is treated as a\r\n * warning-only event — it NEVER hard-stops the subagent. When the\r\n * elapsed time exceeds timeoutMs, emits `budget.threshold_reached` with\r\n * kind='timeout' so the Director can decide whether to extend or warn.\r\n * Call this from the iteration loop so a hung tool gets a chance to\r\n * negotiate more time before the coordinator's Promise.race kills it.\r\n */\r\n checkTimeout(): void {\r\n if (this.startTime === null || this.limits.timeoutMs === undefined) return;\r\n const elapsed = Date.now() - this.startTime;\r\n if (elapsed > this.limits.timeoutMs) {\r\n // Route through the same negotiation path as all other soft limits.\r\n // BudgetThresholdSignal → onBudgetError in the runner → coordinator\r\n // decision → extend or warn. Never throw a hard BudgetExceededError\r\n // for timeout.\r\n void this.checkLimit('timeout', elapsed, this.limits.timeoutMs);\r\n }\r\n }\r\n\r\n /** Returns true if a timeout has occurred without throwing. Useful for races. */\r\n isTimedOut(): boolean {\r\n if (this.startTime === null || this.limits.timeoutMs === undefined) return false;\r\n return Date.now() - this.startTime > this.limits.timeoutMs;\r\n }\r\n\r\n usage(): BudgetUsage {\r\n return {\r\n iterations: this.iterations,\r\n toolCalls: this.toolCalls,\r\n tokens: {\r\n input: this.tokenInput,\r\n output: this.tokenOutput,\r\n total: this.tokenInput + this.tokenOutput,\r\n },\r\n costUsd: this.costUsd,\r\n elapsedMs: this.startTime === null ? 0 : Date.now() - this.startTime,\r\n };\r\n }\r\n}","import type { Agent, AgentInput, RunResult } from '../core/agent.js';\r\nimport type { EventBus } from '../kernel/events.js';\r\nimport type {\r\n SubagentConfig,\r\n SubagentRunContext,\r\n SubagentRunOutcome,\r\n SubagentRunner,\r\n TaskSpec,\r\n} from '../types/multi-agent.js';\r\nimport {\r\n BudgetExceededError,\r\n BudgetThresholdSignal,\r\n} from './subagent-budget.js';\r\nimport type { FleetBus } from './fleet-bus.js';\r\n\r\n/**\r\n * Caller-supplied factory that builds an isolated `Agent` for a subagent.\r\n * The factory MUST construct a fresh `Context` per call — sharing context\r\n * between subagents defeats isolation. Each Agent should also use either\r\n * its own `EventBus` or a forwarded view, so per-subagent metrics can be\r\n * attributed correctly.\r\n */\r\nexport type AgentFactory = (config: SubagentConfig) => Promise<AgentFactoryResult>;\r\n\r\nexport interface AgentFactoryResult {\r\n agent: Agent;\r\n /** Event bus the factory wired to this agent — required for budget hookup. */\r\n events: EventBus;\r\n /**\r\n * Optional cleanup hook invoked in the runner's `finally` block once\r\n * the task ends (success, failure, abort — same exit path). Factories\r\n * that own resources scoped to a single task (per-subagent JSONL\r\n * writers, transient providers, throwaway containers) implement this\r\n * to close them deterministically instead of relying on GC. Errors\r\n * thrown here are swallowed so a flaky cleanup can't mask the task's\r\n * real result.\r\n */\r\n dispose?: () => Promise<void> | void;\r\n}\r\n\r\nexport interface AgentRunnerOptions {\r\n factory: AgentFactory;\r\n /**\r\n * Format a TaskSpec into the user input the agent will receive. Defaults\r\n * to `task.description ?? ''`. Override when subagents expect structured\r\n * input (e.g. JSON contracts, role-prefixed prompts).\r\n */\r\n formatTaskInput?: (task: TaskSpec, config: SubagentConfig) => AgentInput;\r\n /**\r\n * When set, the runner attaches the subagent's EventBus to this FleetBus\r\n * on task start and detaches it when the task finishes. This is the\r\n * injection seam that lets the TUI fleet panel observe subagent activity\r\n * live — without it, FleetBus stays empty.\r\n */\r\n fleetBus?: FleetBus;\r\n}\r\n\r\n/**\r\n * Builds a `SubagentRunner` that drives a real `Agent` per task while honoring\r\n * the coordinator's budget and abort signal. This is the production adapter —\r\n * the coordinator's `runner` option in CLI/TUI assemblies points here.\r\n *\r\n * Lifecycle per task:\r\n * 1. factory(config) → fresh Agent + EventBus.\r\n * 2. Subscribe to events to feed the budget (tool calls, token usage).\r\n * 3. Call agent.run(input, { signal }) — the coordinator's signal cancels.\r\n * 4. Map RunResult.status onto a `SubagentRunOutcome` or throw on failure.\r\n * 5. Unsubscribe and let the factory's resources be GC'd.\r\n *\r\n * The budget is checked synchronously from event handlers — a runaway agent\r\n * that crosses its tool-call limit triggers `BudgetExceededError`, which the\r\n * coordinator surfaces as `status: 'failed'` on the task result.\r\n */\r\nexport function makeAgentSubagentRunner(opts: AgentRunnerOptions): SubagentRunner {\r\n const format = opts.formatTaskInput ?? defaultFormatTaskInput;\r\n\r\n return async (task: TaskSpec, ctx: SubagentRunContext): Promise<SubagentRunOutcome> => {\r\n const factoryResult = await opts.factory(ctx.config);\r\n const { agent, events } = factoryResult;\r\n\r\n // Attach subagent EventBus to FleetBus so the TUI fleet panel (and any\r\n // other FleetBus subscriber) can observe this subagent live. Detach on\r\n // task finish — each task is a fresh Agent + EventBus, so we never\r\n // want a stale bus lingering after the run.\r\n const detachFleet = opts.fleetBus?.attach(ctx.subagentId, events, task.id);\r\n\r\n // Hook budget into the agent's event stream. We capture errors thrown by\r\n // recordToolCall/recordUsage so the budget can short-circuit the run by\r\n // aborting the controller — the agent then unwinds cooperatively.\r\n const aborter = new AbortController();\r\n // Inject the EventBus into the budget so it can emit budget.threshold_reached\r\n // events when a soft limit is hit and the handler wants to ask the coordinator.\r\n ctx.budget._events = events;\r\n // Wire the threshold-negotiation handler. Without this the soft-limit\r\n // path is dead code: every budget overrun becomes a hard\r\n // BudgetExceededError and the subagent dies on its first 120-iteration\r\n // tick instead of asking the Director for headroom. The Director's\r\n // FleetBus listener (director.ts) auto-grants +50% up to a per-kind\r\n // ceiling and per-subagent extension count — wiring this is the\r\n // missing link that activates that flow.\r\n ctx.budget.onThreshold = ({ requestDecision }) => requestDecision();\r\n let budgetError: Error | null = null;\r\n\r\n /**\r\n * Common error handler for all budget-triggered events. Distinguishes:\r\n * - BudgetExceededError → hard stop, set budgetError + abort\r\n * - BudgetThresholdSignal → soft stop: await the coordinator's\r\n * decision. If 'stop', abort. If 'extend', the signal handler\r\n * has already patched the budget so we can continue without\r\n * actually aborting the agent.\r\n */\r\n const onBudgetError = (err: unknown): void => {\r\n if (err instanceof BudgetThresholdSignal) {\r\n // Await the coordinator's verdict before deciding whether to abort.\r\n err.decision\r\n .then((decision) => {\r\n if (decision === 'stop') {\r\n budgetError = new BudgetExceededError(err.kind, err.limit, err.used);\r\n aborter.abort();\r\n }\r\n // If 'extend': the budget limits were already patched by the\r\n // BudgetThresholdSignal handler (checkLimit → onThreshold →\r\n // coordinator extend → budget patched). Do NOT abort.\r\n // The tool call that triggered the signal will be retried.\r\n })\r\n .catch(() => {\r\n // If the decision promise rejects, treat as hard stop.\r\n budgetError = new BudgetExceededError(err.kind, err.limit, err.used);\r\n aborter.abort();\r\n });\r\n return;\r\n }\r\n // Hard stop (BudgetExceededError or other)\r\n aborter.abort();\r\n budgetError =\r\n err instanceof BudgetExceededError\r\n ? err\r\n : new BudgetExceededError(\r\n 'tool_calls',\r\n 0,\r\n 0,\r\n );\r\n // Attach the real error detail so the task result surfaces\r\n // something actionable instead of a generic budget message.\r\n if (budgetError !== err && err instanceof Error) {\r\n budgetError.message += ` (caused by: ${err.message})`;\r\n }\r\n };\r\n\r\n // Track the name of the most recent tool that returned ok:false so\r\n // we can lift it into the SubagentError when the agent ends without\r\n // recovering. Cleared on every successful tool execution so a tool\r\n // that later succeeded doesn't taint the final report.\r\n let lastToolFailed: string | null = null;\r\n\r\n const unsub: Array<() => void> = [];\r\n unsub.push(\r\n events.on('tool.executed', (e) => {\r\n // Count tool calls on the PAIRED 'tool.executed' event rather\r\n // than 'tool.started'. A tool can fire start then crash before\r\n // emitting executed (process killed, signal aborted mid-exec);\r\n // counting only the paired event keeps the budget tally honest\r\n // and matches what the model actually saw in its turn.\r\n try {\r\n ctx.budget.recordToolCall();\r\n } catch (eb) {\r\n onBudgetError(eb);\r\n }\r\n // Track ok:false so we can fail the subagent if it ends without\r\n // recovering. Successful runs clear it — the model may try a\r\n // tool, get an error, and self-heal on the next iteration; that\r\n // path should still report success.\r\n if (e.ok === false) {\r\n lastToolFailed = e.name;\r\n } else if (e.ok === true) {\r\n lastToolFailed = null;\r\n }\r\n }),\r\n events.on('provider.response', (e) => {\r\n try {\r\n ctx.budget.recordUsage(e.usage);\r\n } catch (e2) {\r\n void onBudgetError(e2);\r\n }\r\n }),\r\n events.on('iteration.started', () => {\r\n try {\r\n ctx.budget.recordIteration();\r\n } catch (e) {\r\n void onBudgetError(e);\r\n }\r\n // Emit a periodic progress snapshot every SUMMARY_INTERVAL\r\n // iterations so the leader can surface \"AGENT#2 ● L25 · 47 tools\"\r\n // in the main chat history without needing the FleetPanel open.\r\n const u = ctx.budget.usage();\r\n const since = u.iterations - lastSummaryAtIteration;\r\n if (since >= SUMMARY_INTERVAL) {\r\n lastSummaryAtIteration = u.iterations;\r\n events.emit('subagent.iteration_summary', {\r\n subagentId: ctx.subagentId,\r\n iteration: u.iterations,\r\n toolCalls: u.toolCalls,\r\n costUsd: u.costUsd,\r\n currentTool: currentToolName,\r\n partialText: streamingTextAcc.trim() || undefined,\r\n });\r\n }\r\n }),\r\n // D3: cooperative timeout enforcement DURING a long tool call.\r\n // The iteration-loop checkTimeout() only fires between agent\r\n // iterations — a single `bash sleep 3600` call would otherwise\r\n // park inside one tool execution while the timeout silently\r\n // passes, relying solely on the coordinator's hard Promise.race\r\n // to interrupt. Tools that emit `tool.progress` (bash chunks,\r\n // fetch byte progress, spawn-stream stdout) give us a heartbeat\r\n // we can hang the check on. When the budget trips here:\r\n // 1. onBudgetError sets budgetError + aborter.abort()\r\n // 2. aborter signal propagates to agent.run → tool executor\r\n // 3. tool's own signal listener kills the child process\r\n // Cheap: O(1) per progress event, and the budget short-circuits\r\n // when timeoutMs is unset (most subagents have one set anyway).\r\n events.on('tool.progress', () => {\r\n try {\r\n ctx.budget.checkTimeout();\r\n } catch (e) {\r\n void onBudgetError(e);\r\n }\r\n }),\r\n );\r\n\r\n // Track current tool name + streaming text for the periodic summary.\r\n let currentToolName: string | undefined;\r\n let streamingTextAcc = '';\r\n let lastSummaryAtIteration = 0;\r\n const SUMMARY_INTERVAL = 25;\r\n\r\n unsub.push(\r\n events.on('tool.started', (e) => {\r\n currentToolName = e.name;\r\n }),\r\n events.on('provider.text_delta', (e) => {\r\n // Accumulate last ~200 chars for the partial text snapshot.\r\n streamingTextAcc = (streamingTextAcc + e.text).slice(-200);\r\n }),\r\n );\r\n\r\n // Forward the coordinator signal so stop() from outside also aborts.\r\n const onParentAbort = () => aborter.abort();\r\n ctx.signal.addEventListener('abort', onParentAbort);\r\n\r\n let result: RunResult;\r\n try {\r\n result = await agent.run(format(task, ctx.config), { signal: aborter.signal });\r\n } finally {\r\n detachFleet?.();\r\n ctx.signal.removeEventListener('abort', onParentAbort);\r\n for (const u of unsub) u();\r\n // Per-task resource cleanup. Closes JSONL writers, throwaway\r\n // providers, etc. that the factory wired up. Swallowed errors —\r\n // a flaky cleanup must not mask the real task result. The\r\n // caller can re-emit via observability if needed.\r\n if (factoryResult.dispose) {\r\n try {\r\n await factoryResult.dispose();\r\n } catch {\r\n // intentional swallow — see comment above\r\n }\r\n }\r\n }\r\n\r\n // A budget violation is the signal — surface it so the coordinator can\r\n // tag the task with the right failure kind ('failed' for budget; the\r\n // coordinator separately recognises 'timeout' from BudgetExceededError).\r\n if (budgetError) {\r\n // BudgetThresholdSignal: the soft limit was hit but the coordinator\r\n // hasn't resolved the extension decision yet. If the decision was\r\n // 'extend', the coordinator patched limits and the agent finished\r\n // normally — no error to surface. If 'stop', budgetError becomes\r\n // a BudgetExceededError thrown below.\r\n // instanceof check on Error subtypes requires 'any' intersection\r\n // on the union — use a property guard instead.\r\n if ('decision' in budgetError) {\r\n const decision = await (budgetError as BudgetThresholdSignal).decision;\r\n if (decision === 'stop') {\r\n budgetError = new BudgetExceededError(\r\n (budgetError as BudgetThresholdSignal).kind,\r\n (budgetError as BudgetThresholdSignal).limit,\r\n (budgetError as BudgetThresholdSignal).used,\r\n );\r\n } else {\r\n budgetError = null;\r\n }\r\n }\r\n if (budgetError) throw budgetError;\r\n }\r\n\r\n if (result.status === 'failed') {\r\n throw result.error instanceof Error\r\n ? result.error\r\n : new Error(String(result.error ?? 'agent failed'));\r\n }\r\n // 'aborted' and 'max_iterations' aren't successes — let the coordinator\r\n // classify them. When the parent signal was aborted, coordinator marks\r\n // the task 'stopped' (matched against subagent.abortController.aborted).\r\n if (result.status === 'aborted') {\r\n throw new Error('agent aborted');\r\n }\r\n if (result.status === 'max_iterations') {\r\n throw new Error('agent exhausted iteration limit');\r\n }\r\n\r\n const usage = ctx.budget.usage();\r\n // Empty-response guard. A \"successful\" run with no text AND no tool\r\n // calls is almost always a prompt / config issue, not a real\r\n // success — the agent burned an iteration to say nothing. Surface\r\n // it as a classified failure so callers can show \"✗ empty_response\"\r\n // instead of a confusing green ✓ with no output. We only trip on\r\n // the (no-text AND no-tools) intersection because text-less runs\r\n // with tool calls are legit (e.g. \"run npm test then end_turn\").\r\n const finalText = (result.finalText ?? '').trim();\r\n if (finalText.length === 0 && usage.toolCalls === 0) {\r\n throw new Error('empty response');\r\n }\r\n // Unrecovered-tool-failure guard. If the last executed tool came\r\n // back ok:false AND the agent ended its turn with no closing text,\r\n // the agent never acknowledged or recovered from the failure — the\r\n // task is effectively broken. A model that handles a tool error\r\n // emits SOME text on the next iteration (\"the read failed, trying\r\n // an alternate path…\") which clears `lastToolFailed`; the only way\r\n // both signals can be live at end-of-run is if the model gave up\r\n // silently. Surface as `tool_failed` so callers see the actual\r\n // failure mode instead of a clean ✓ with no output.\r\n if (finalText.length === 0 && lastToolFailed !== null) {\r\n throw new Error(`tool failed: ${lastToolFailed}`);\r\n }\r\n return {\r\n result: result.finalText,\r\n iterations: result.iterations,\r\n toolCalls: usage.toolCalls,\r\n };\r\n };\r\n}\r\n\r\nfunction defaultFormatTaskInput(task: TaskSpec): AgentInput {\r\n return task.description ?? '';\r\n}\r\n","import type { ContentBlock, TextBlock } from './blocks.js';\nimport type { ErrorCode } from './errors.js';\nimport { WrongStackError } from './errors.js';\nimport type { Message } from './messages.js';\nimport type { Tool } from './tool.js';\n\n/**\n * Token usage for a single provider call, normalized across providers.\n *\n * Disjoint semantics: the four fields never overlap. `input` is the count\n * of FRESH input tokens (billed at the full input rate); `cacheRead` and\n * `cacheWrite` are separate cached subsets each priced at their own rate.\n * The total context the model loaded for this turn is\n * `input + (cacheRead ?? 0) + (cacheWrite ?? 0)`.\n *\n * Provider quirks normalized at the adapter layer:\n * - Anthropic: returns `input_tokens` already disjoint from cache fields.\n * - OpenAI / OpenAI-compatible: `prompt_tokens` is the TOTAL including\n * cached portion; the adapter subtracts `cached_tokens` to stay disjoint.\n * - Google: `promptTokenCount` likewise includes cache; adapter subtracts\n * `cachedContentTokenCount`.\n *\n * Cost math and the context-fullness chip both depend on the disjoint\n * invariant — a TOTAL `input` plus a separate `cacheRead` count would bill\n * cached tokens twice and skew cache-hit-ratio reporting.\n */\nexport interface Usage {\n input: number;\n output: number;\n cacheRead?: number;\n cacheWrite?: number;\n}\n\nexport interface Capabilities {\n tools: boolean;\n parallelTools: boolean;\n vision: boolean;\n streaming: boolean;\n promptCache: boolean;\n systemPrompt: boolean;\n jsonMode: boolean;\n maxContext: number;\n cacheControl: 'native' | 'auto' | 'none';\n}\n\nexport interface Request {\n model: string;\n system?: TextBlock[];\n messages: Message[];\n tools?: Tool[];\n maxTokens: number;\n temperature?: number;\n topP?: number;\n stopSequences?: string[];\n toolChoice?: 'auto' | 'required' | 'none' | { type: 'tool'; name: string };\n}\n\nexport type StopReason = 'end_turn' | 'tool_use' | 'max_tokens' | 'stop_sequence' | 'refusal';\n\nexport interface Response {\n content: ContentBlock[];\n stopReason: StopReason;\n usage: Usage;\n model: string;\n}\n\nexport type StreamEvent =\n | { type: 'message_start'; model: string }\n | {\n type: 'content_block_start';\n kind: 'text' | 'tool_use' | 'thinking';\n id?: string;\n name?: string;\n }\n | { type: 'content_block_stop'; index: number }\n | { type: 'text_delta'; text: string }\n | { type: 'tool_use_start'; id: string; name: string }\n | { type: 'tool_use_input_delta'; id: string; partial: string }\n | { type: 'tool_use_stop'; id: string; input: unknown; providerMeta?: Record<string, unknown> }\n | { type: 'thinking_start'; providerMeta?: Record<string, unknown> }\n | { type: 'thinking_delta'; text: string }\n | { type: 'thinking_signature'; signature: string }\n | { type: 'thinking_stop' }\n | { type: 'message_stop'; stopReason: StopReason; usage: Usage };\n\nexport interface Provider {\n readonly id: string;\n readonly capabilities: Capabilities;\n /** Canonical streaming entry point. `complete()` defaults to a wrapper that\n * aggregates this stream — providers may override for non-streaming wires. */\n stream(req: Request, opts: { signal: AbortSignal }): AsyncIterable<StreamEvent>;\n complete(req: Request, opts: { signal: AbortSignal }): Promise<Response>;\n}\n\n/**\n * Structured body parsed from a provider's HTTP error response. Populated\n * best-effort: providers return JSON shaped differently (Anthropic uses\n * `{error: {type, message}}`, OpenAI uses `{error: {message, code}}`,\n * Google uses `{error: {status, message}}`), so the fields here are the\n * intersection that's usable for rendering and routing.\n */\nexport interface ProviderErrorBody {\n /** Provider-specific kind, e.g. \"overloaded_error\", \"rate_limit_error\", \"invalid_request_error\". */\n type?: string;\n /** Human-readable explanation from the provider. */\n message?: string;\n /** Provider request id, when present in the body or headers. */\n requestId?: string;\n /** Parsed Retry-After header (or equivalent body hint) in milliseconds. */\n retryAfterMs?: number;\n /** The raw response body (truncated to ~2 KB), kept for debugging. */\n raw?: string;\n /** True when `raw` was truncated; check `rawLength` for the original size. */\n truncated?: boolean;\n /** Original length of the response body in bytes, when `truncated` is true. */\n rawLength?: number;\n}\n\nexport class ProviderError extends WrongStackError {\n public readonly status: number;\n public readonly retryable: boolean;\n public readonly providerId: string;\n public readonly body?: ProviderErrorBody;\n\n constructor(\n message: string,\n status: number,\n retryable: boolean,\n providerId: string,\n opts: { body?: ProviderErrorBody; cause?: unknown } = {},\n ) {\n super({\n message,\n code: providerStatusToCode(status, opts.body?.type),\n subsystem: 'provider',\n severity: status >= 500 ? 'error' : 'warning',\n recoverable: retryable,\n context: { providerId, status },\n cause: opts.cause,\n });\n this.name = 'ProviderError';\n this.status = status;\n this.retryable = retryable;\n this.providerId = providerId;\n this.body = opts.body;\n }\n\n /**\n * Render a one-line, user-facing description. Designed for the CLI/TUI\n * status line and the agent's retry warning. Avoids dumping raw JSON\n * (which is what users see today when a 529 lands and the log message\n * includes the full `{\"type\":\"error\",...}` body).\n *\n * Examples:\n * \"minimax-coding-plan overloaded (529): High traffic detected. Upgrade for highspeed model. [req 06534785201de9c0…]\"\n * \"openai rate limited (429): Retry after 12s\"\n * \"anthropic invalid request (400): messages.0.role must be one of 'user'|'assistant'\"\n * \"groq HTTP 500 (server error)\"\n */\n override describe(): string {\n const kind = describeStatus(this.status, this.body?.type);\n const head = `${this.providerId} ${kind}`;\n const detail = this.body?.message?.trim();\n const reqId = this.body?.requestId\n ? ` [req ${this.body.requestId.slice(0, 16)}${this.body.requestId.length > 16 ? '…' : ''}]`\n : '';\n if (detail && detail.length > 0) {\n return `${head}: ${truncate(detail, 240)}${reqId}`;\n }\n return `${head}${reqId}`;\n }\n}\n\nfunction describeStatus(status: number, type?: string): string {\n if (status === 0) return 'network error';\n if (type === 'overloaded_error' || status === 529) return `overloaded (${status})`;\n if (type === 'rate_limit_error' || status === 429) return `rate limited (${status})`;\n if (type === 'authentication_error' || status === 401) return `auth failed (${status})`;\n if (type === 'permission_error' || status === 403) return `forbidden (${status})`;\n if (type === 'not_found_error' || status === 404) return `not found (${status})`;\n if (type === 'invalid_request_error' || status === 400) return `invalid request (${status})`;\n if (status === 408) return `timeout (${status})`;\n if (status >= 500 && status < 600) return `HTTP ${status} (server error)`;\n if (type) return `${type} (${status})`;\n return `HTTP ${status}`;\n}\n\nfunction truncate(s: string, n: number): string {\n return s.length <= n ? s : `${s.slice(0, n - 1)}…`;\n}\n\nfunction providerStatusToCode(status: number, type?: string): ErrorCode {\n if (status === 0) return 'PROVIDER_NETWORK_ERROR';\n if (type === 'rate_limit_error' || status === 429) return 'PROVIDER_RATE_LIMITED';\n if (type === 'authentication_error' || status === 401) return 'PROVIDER_AUTH_FAILED';\n if (type === 'overloaded_error' || status === 529) return 'PROVIDER_OVERLOADED';\n if (type === 'invalid_request_error' || status === 400) return 'PROVIDER_INVALID_REQUEST';\n if (status === 408) return 'PROVIDER_NETWORK_ERROR';\n if (status >= 500) return 'PROVIDER_SERVER_ERROR';\n return 'PROVIDER_INVALID_REQUEST';\n}\n","/**\r\n * Pre-built subagent role configurations for the WrongStack fleet.\r\n * These can be passed to `MultiAgentHost.spawn()` or used as templates\r\n * for the director's roster.\r\n */\r\nimport type { SubagentConfig } from '../types/multi-agent.js';\r\n\r\n/**\r\n * Audit Log Agent — analyzes session logs, event streams, and traces.\r\n * Use for: post-mortems, trend analysis, operational insights.\r\n */\r\nexport const AUDIT_LOG_AGENT: SubagentConfig = {\r\n id: 'audit-log',\r\n name: 'Audit Log',\r\n role: 'audit-log',\r\n prompt: `You are the Audit Log agent. Your job is to analyze structured JSONL\r\nsession logs and produce actionable markdown reports.\r\n\r\nScope:\r\n- Parse session logs (iteration counts, tool calls, errors, usage)\r\n- Detect repeated failure patterns across multiple runs\r\n- Identify tool usage anomalies (over-use, failures, unexpected chains)\r\n- Track token consumption trends\r\n- Generate structured audit reports with severity ratings\r\n\r\nInput format you accept:\r\n{ \"task\": \"analyze | report | trends\", \"sessionPath\": \"<path>\", \"focus\": \"errors | tools | usage | all\" }\r\n\r\nOutput: Markdown audit report with sections:\r\n- ## Summary (totals, error rate)\r\n- ## Top Errors (count + context)\r\n- ## Tool Usage (table with calls, failures, avg duration)\r\n- ## Anomalies (pattern → severity)\r\n\r\nWorking rules:\r\n- Never fabricate numbers — read the actual logs first\r\n- Always include file:line references for errors\r\n- If sessionPath is missing, ask the director to provide it\r\n- Report confidence level: high (>90% accuracy), medium, low`,\r\n\r\n // No hardcoded budgets — the orchestrator (delegate tool or\r\n // spawn_subagent) decides per-task how much room a subagent gets.\r\n // A monorepo audit needs hours; a single-file lint check needs\r\n // seconds. Pinning a number here forces the orchestrator to fight\r\n // the role's default instead of just asking for what it needs.\r\n};\r\n\r\n/**\r\n * Bug Hunter Agent — systematic bug and code smell detection.\r\n * Use for: pre-refactoring health checks, code review, regression prevention.\r\n */\r\nexport const BUG_HUNTER_AGENT: SubagentConfig = {\r\n id: 'bug-hunter',\r\n name: 'Bug Hunter',\r\n role: 'bug-hunter',\r\n prompt: `You are the Bug Hunter agent. Your job is to systematically scan\r\nsource code for bugs, anti-patterns, and code smells using pattern matching\r\nand heuristics. Output a prioritized hit list with file:line references.\r\n\r\nScope:\r\n- Detect common bug patterns (uncaught errors, resource leaks, race conditions)\r\n- Identify anti-patterns (callback hell, God objects, circular deps)\r\n- Find TypeScript-specific issues (unsafe any, missing null checks, branded types)\r\n- Flag security-sensitive constructs (eval, innerHTML, hardcoded secrets)\r\n- Rank findings: critical > high > medium > low\r\n\r\nInput format you accept:\r\n{ \"task\": \"scan | hunt | check\", \"paths\": [\"src/**/*.ts\"], \"focus\": \"bugs | patterns | security | all\", \"severityThreshold\": \"medium\" }\r\n\r\nOutput: Markdown bug hunt report:\r\n- ## Critical (must fix first)\r\n- ## High (should fix)\r\n- ## Medium\r\n- ## Low (consider)\r\nEach entry: **[TYPE]** \\`file:line\\` — description + suggested fix\r\n\r\nBug pattern reference you know:\r\n| Pattern | Regex hint | Severity |\r\n|---------|------------|----------|\r\n| Uncaught promise | /\\.then\\\\(.*\\\\)/ without catch | high |\r\n| Event leak | on\\\\( without off/removeListener | high |\r\n| Hardcoded secret | [a-zA-Z0-9/_-]{20,} in config files | critical |\r\n| unsafe any | : any\\\\b or <any> | medium |\r\n| innerHTML | innerHTML\\\\s*= | high |\r\n\r\nWorking rules:\r\n- Never scan node_modules — it's noise\r\n- Always include file:line for every finding\r\n- If >30% of findings are false positives, note the confidence level\r\n- Ask director for clarification if paths are ambiguous`,\r\n\r\n // Budgets are set by the orchestrator per task — see fleet.ts header.\r\n};\r\n\r\n/**\r\n * Refactor Planner Agent — structured refactoring planning.\r\n * Use for: large rewrites, technical debt reduction, architecture improvements.\r\n */\r\nexport const REFACTOR_PLANNER_AGENT: SubagentConfig = {\r\n id: 'refactor-planner',\r\n name: 'Refactor Planner',\r\n role: 'refactor-planner',\r\n prompt: `You are the Refactor Planner agent. Your job is to analyze code\r\nstructure and produce a concrete, phased refactoring plan with risk\r\nassessment, dependency ordering, and rollback strategy.\r\n\r\nScope:\r\n- Map module-level dependencies (import graph)\r\n- Identify coupling hotspots (high fan-in/out modules)\r\n- Assess refactoring risk by complexity and test coverage\r\n- Generate phased plans with checkpoint milestones\r\n- Produce diff-friendly task lists (one task = one concern)\r\n\r\nInput format you accept:\r\n{ \"task\": \"plan | assess | roadmap\", \"target\": \"src/core\", \"constraint\": \"no-breaking-changes | minimal-downtime | full-rewrite\", \"focus\": \"architecture | performance | maintainability\" }\r\n\r\nOutput: Markdown refactor plan:\r\n- ## Phase 1: Low Risk / High Payoff (do first)\r\n Table: | # | Task | Module | Risk | Est. Time |\r\n- ## Phase 2: Medium Risk\r\n- ## Phase 3: High Risk (requires full regression)\r\n- ## Dependency Graph (abbreviated ASCII)\r\n- ## Rollback Strategy\r\n- ## Exit Criteria (checkbox list)\r\n\r\nRisk scoring criteria:\r\n| Factor | Low | Medium | High |\r\n|--------|-----|--------|------|\r\n| Cyclomatic complexity | <10 | 10-20 | >20 |\r\n| Test coverage | >80% | 50-80% | <50% |\r\n| Fan-out (imports) | <5 | 5-15 | >15 |\r\n\r\nWorking rules:\r\n- Always include rollback strategy — every refactor can fail\r\n- Merge tasks that take <1h into a single phase\r\n- Respect team constraints (reviewer availability, parallelization)\r\n- Never plan without analyzing the actual code first`,\r\n\r\n // Budgets are set by the orchestrator per task — see fleet.ts header.\r\n};\r\n\r\n/**\r\n * Security Scanner Agent — vulnerability and secret detection.\r\n * Use for: CI checks, pre-release audits, dependency vulnerability scanning.\r\n */\r\nexport const SECURITY_SCANNER_AGENT: SubagentConfig = {\r\n id: 'security-scanner',\r\n name: 'Security Scanner',\r\n role: 'security-scanner',\r\n prompt: `You are the Security Scanner agent. Your job is to scan code,\r\nconfigs, and dependencies for security issues from hardcoded secrets to\r\nsupply chain risks.\r\n\r\nScope:\r\n- Detect hardcoded secrets: API keys, tokens, passwords, private keys\r\n- Find injection vectors: eval, innerHTML, SQL concat, shell injection\r\n- Identify insecure patterns: weak crypto, hardcoded IVs, disabled TLS\r\n- Scan dependencies for known CVEs (via npm/pnpm audit)\r\n- Flag supply chain risks: postinstall hooks, unverified scripts, .npmrc\r\n\r\nInput format you accept:\r\n{ \"task\": \"scan | audit | secrets | dependencies\", \"paths\": [\"src\", \"config\"], \"depth\": \"quick | normal | deep\" }\r\n\r\nOutput: Markdown security report:\r\n- ## CRITICAL: Secrets Found (with code snippets)\r\n- ## HIGH: Injection Vectors\r\n- ## MEDIUM: Insecure Patterns\r\n- ## Dependency Issues (CVE list)\r\n- ## Summary table (severity → count)\r\n- ## Remediation Checklist (with checkboxes)\r\n\r\nSecret patterns you detect:\r\n| Pattern | Example | Severity |\r\n|---------|---------|----------|\r\n| AWS Access Key | AKIAIOSFODNN7EXAMPLE | critical |\r\n| AWS Secret Key | [a-zA-Z0-9/+=]{40} base64 | critical |\r\n| GitHub Token | ghp_[a-zA-Z0-9]{36} | critical |\r\n| Private Key PEM | -----BEGIN.*PRIVATE KEY----- | critical |\r\n| JWT | eyJ[a-zA-Z0-9_-]+ | high |\r\n\r\nInjection patterns:\r\n| Construct | Safe alternative |\r\n|-----------|-----------------|\r\n| eval(str) | new Function() or parse |\r\n| innerHTML = x | textContent or sanitize |\r\n| exec(\\`cmd \\${x}\\`) | execFile with args array |\r\n\r\nWorking rules:\r\n- Never scan node_modules — use npm audit instead\r\n- Always provide remediation steps, not just findings\r\n- Verify regex-based secrets before flagging (false positive risk)\r\n- When in doubt, flag as medium rather than ignoring potential issues`,\r\n\r\n // Budgets are set by the orchestrator per task — see fleet.ts header.\r\n};\r\n\r\n/** All pre-built agents in a map for easy lookup by role. */\r\nexport const FLEET_ROSTER: Record<string, SubagentConfig> = {\r\n 'audit-log': AUDIT_LOG_AGENT,\r\n 'bug-hunter': BUG_HUNTER_AGENT,\r\n 'refactor-planner': REFACTOR_PLANNER_AGENT,\r\n 'security-scanner': SECURITY_SCANNER_AGENT,\r\n};\r\n\r\n// ---------------------------------------------------------------------------\r\n// Default per-role budgets.\r\n// These are the budgets subagents get when the orchestrator doesn't pass\r\n// explicit overrides. Raised from earlier conservative values — a subagent\r\n// that exhausts its budget mid-scan is an unpleasant experience, and the\r\n// cost of a slightly larger ceiling is negligible compared to a failed run\r\n// that needs to be re-run from scratch.\r\n// audit-log: moderate scan of session logs, ~8 min, 150 iterations\r\n// bug-hunter: targeted file scan, ~15 min, 200 iterations\r\n// refactor-planner: architecture analysis, ~12 min, 180 iterations\r\n// security-scanner: config + source scan, ~15 min, 200 iterations\r\n// ---------------------------------------------------------------------------\r\nexport interface FleetRosterBudget {\r\n timeoutMs?: number;\r\n maxIterations?: number;\r\n maxToolCalls?: number;\r\n maxTokens?: number;\r\n maxCostUsd?: number;\r\n}\r\n\r\nexport const FLEET_ROSTER_BUDGETS: Record<string, FleetRosterBudget> = {\r\n 'audit-log': { timeoutMs: 8 * 60 * 1000, maxIterations: 150, maxToolCalls: 500 },\r\n 'bug-hunter': { timeoutMs: 15 * 60 * 1000, maxIterations: 200, maxToolCalls: 600 },\r\n 'refactor-planner': { timeoutMs: 12 * 60 * 1000, maxIterations: 180, maxToolCalls: 550 },\r\n 'security-scanner': { timeoutMs: 15 * 60 * 1000, maxIterations: 200, maxToolCalls: 600 },\r\n};\r\n\r\n/**\r\n * Apply roster budget to a config (only when the config has no explicit\r\n * budget fields set). This is called by the coordinator before dispatch.\r\n */\r\nexport function applyRosterBudget(cfg: SubagentConfig): SubagentConfig {\r\n const defaultBudget = FLEET_ROSTER_BUDGETS[cfg.role ?? ''];\r\n if (!defaultBudget) return cfg;\r\n return {\r\n ...cfg,\r\n timeoutMs: cfg.timeoutMs ?? defaultBudget.timeoutMs,\r\n maxIterations: cfg.maxIterations ?? defaultBudget.maxIterations,\r\n maxToolCalls: cfg.maxToolCalls ?? defaultBudget.maxToolCalls,\r\n maxTokens: cfg.maxTokens ?? defaultBudget.maxTokens,\r\n maxCostUsd: cfg.maxCostUsd ?? defaultBudget.maxCostUsd,\r\n };\r\n}\r\n\r\n/** Quick-access list for spawning all at once. */\r\nexport const ALL_FLEET_AGENTS = Object.values(FLEET_ROSTER);\r\n","import { randomUUID } from 'node:crypto';\r\nimport { EventEmitter } from 'node:events';\r\nimport type { AgentBridge, BridgeMessage } from '../types/agent-bridge.js';\r\nimport type {\r\n CoordinatorStatus,\r\n MultiAgentConfig,\r\n MultiAgentCoordinator,\r\n SpawnResult,\r\n SubagentConfig,\r\n SubagentContext,\r\n SubagentError,\r\n SubagentErrorKind,\r\n SubagentRunContext,\r\n SubagentRunner,\r\n TaskResult,\r\n TaskSpec,\r\n} from '../types/multi-agent.js';\r\nimport { ProviderError } from '../types/provider.js';\r\nimport { BudgetExceededError, SubagentBudget } from './subagent-budget.js';\r\nimport { applyRosterBudget } from './fleet.js';\r\n\r\ntype SubagentStatus = 'running' | 'idle' | 'stopped' | 'error';\r\n\r\ninterface SubagentEntry {\r\n config: SubagentConfig;\r\n context: SubagentContext;\r\n status: SubagentStatus;\r\n currentTask?: string;\r\n abortController: AbortController;\r\n /** Lazily created on first dispatch — budget is per-task, not per-subagent. */\r\n activeBudget?: SubagentBudget;\r\n}\r\n\r\nexport interface MultiAgentCoordinatorOptions {\r\n /**\r\n * Callback that executes a task on behalf of a subagent. Required for\r\n * `assign()` to actually run anything — without it, tasks queue forever.\r\n * The coordinator provides per-subagent isolation (own budget, own signal,\r\n * own bridge) and enforces timeout + concurrency.\r\n */\r\n runner?: SubagentRunner;\r\n}\r\n\r\nexport class DefaultMultiAgentCoordinator extends EventEmitter implements MultiAgentCoordinator {\r\n readonly coordinatorId: string;\r\n readonly config: MultiAgentConfig;\r\n private runner?: SubagentRunner;\r\n\r\n private readonly subagents = new Map<string, SubagentEntry>();\r\n\r\n private pendingTasks: TaskSpec[] = [];\r\n private completedResults: TaskResult[] = [];\r\n private totalIterations = 0;\r\n private inFlight = 0;\r\n /**\r\n * Subagents currently being stopped. Set on entry to `stop()`, cleared\r\n * once `recordCompletion` lands the terminal TaskResult. Used by\r\n * `runDispatched` and `findIdleSubagent` to refuse mid-flight dispatch\r\n * to a subagent the caller has already asked to terminate — closes the\r\n * assign+terminate race where a fresh task could land on a worker that\r\n * was about to be killed.\r\n */\r\n private readonly terminating = new Set<string>();\r\n\r\n constructor(config: MultiAgentConfig, options: MultiAgentCoordinatorOptions = {}) {\r\n super();\r\n this.coordinatorId = config.coordinatorId;\r\n this.config = config;\r\n this.runner = options.runner;\r\n }\r\n\r\n /**\r\n * Replace the runner after construction. Used when the runner depends\r\n * on infrastructure (e.g. FleetBus) that isn't available until after\r\n * the coordinator's owning Director is built.\r\n */\r\n setRunner(runner: SubagentRunner): void {\r\n this.runner = runner;\r\n }\r\n\r\n /**\r\n * Change the in-flight dispatch ceiling at runtime. Lowering does NOT\r\n * preempt running tasks — already-dispatched subagents finish their\r\n * current task; only future dispatches respect the new cap. Raising\r\n * immediately tries to fill the freed slots from the pending queue.\r\n */\r\n setMaxConcurrent(n: number): void {\r\n if (!Number.isFinite(n) || n < 1) {\r\n throw new Error(`maxConcurrent must be a finite integer >= 1, got ${n}`);\r\n }\r\n this.config.maxConcurrent = Math.floor(n);\r\n this.tryDispatchNext();\r\n }\r\n\r\n async spawn(subagent: SubagentConfig): Promise<SpawnResult> {\r\n const id = subagent.id || randomUUID();\r\n // Duplicate-id guard. Previously a second spawn({id}) with the\r\n // same id silently overwrote the existing entry — orphaning the\r\n // first subagent's AbortController, Context, and any in-flight\r\n // task referencing it. Two spawns with the same id are almost\r\n // always a bug at the caller; refuse and let them surface it.\r\n if (this.subagents.has(id)) {\r\n throw new Error(`Subagent id \"${id}\" already exists — refusing to overwrite`);\r\n }\r\n const context: SubagentContext = {\r\n subagentId: id,\r\n tasks: [],\r\n // Wired later by the caller via setSubagentBridge() once the\r\n // bidirectional bridge is created. Readers must null-check / use\r\n // hasParentBridge() — the type now reflects this.\r\n parentBridge: null,\r\n doneCondition: this.config.doneCondition,\r\n maxConcurrent: this.config.maxConcurrent ?? 4,\r\n };\r\n\r\n this.subagents.set(id, {\r\n config: { ...subagent, id },\r\n context,\r\n status: 'idle',\r\n abortController: new AbortController(),\r\n });\r\n\r\n this.emit('subagent.started', { subagent: { ...subagent, id } });\r\n\r\n return { subagentId: id, agentId: id };\r\n }\r\n\r\n async assign(task: TaskSpec): Promise<void> {\r\n this.pendingTasks.push(task);\r\n this.tryDispatchNext();\r\n }\r\n\r\n async delegate(to: string, msg: BridgeMessage): Promise<void> {\r\n const subagent = this.subagents.get(to);\r\n if (!subagent) throw new Error(`Subagent \"${to}\" not found`);\r\n if (!subagent.context.parentBridge) {\r\n throw new Error(`Subagent \"${to}\" has no parentBridge — call setSubagentBridge() first`);\r\n }\r\n await subagent.context.parentBridge.send(msg);\r\n }\r\n\r\n /**\r\n * Wire up the communication bridge for a subagent. Call after spawn() once\r\n * the caller has created the bidirectional connection.\r\n */\r\n setSubagentBridge(subagentId: string, bridge: AgentBridge): void {\r\n const subagent = this.subagents.get(subagentId);\r\n if (!subagent) throw new Error(`Subagent \"${subagentId}\" not found`);\r\n subagent.context.parentBridge = bridge;\r\n }\r\n\r\n async stop(subagentId: string): Promise<void> {\r\n const subagent = this.subagents.get(subagentId);\r\n if (!subagent) return;\r\n\r\n // Mark terminating BEFORE the abort so a synchronous tryDispatchNext\r\n // observation in another callback path sees the intent and skips\r\n // this subagent. Cleared by recordCompletion once the runner's\r\n // catch block lands the terminal TaskResult.\r\n this.terminating.add(subagentId);\r\n\r\n // Abort any in-flight run, then sever the bridge so further messages fail\r\n // fast instead of silently queueing on a dead subagent.\r\n subagent.abortController.abort();\r\n subagent.status = 'stopped';\r\n subagent.currentTask = undefined;\r\n subagent.context.parentBridge = null;\r\n\r\n this.emit('subagent.stopped', { subagentId, reason: 'stopped by coordinator' });\r\n }\r\n\r\n async stopAll(): Promise<void> {\r\n // Clear the queue FIRST so no new tasks land on subagents while\r\n // we're tearing them down. Each dropped task gets a synthetic\r\n // `aborted_by_parent` completion so any caller awaiting it (e.g.\r\n // delegate tool's awaitTasks) resolves instead of hanging.\r\n //\r\n // Pending tasks never reached `inFlight`, so we cannot route them\r\n // through `recordCompletion` — its underflow guard would short-\r\n // circuit on the second pending task and emit a warning instead\r\n // of the completion event. The shared helper inline-emits.\r\n this.drainPendingAsAborted('Coordinator stopAll() drained the pending queue');\r\n // allSettled so one failure doesn't leave other subagents un-stopped.\r\n await Promise.allSettled([...this.subagents.keys()].map((id) => this.stop(id)));\r\n }\r\n\r\n getStatus(): CoordinatorStatus {\r\n return {\r\n coordinatorId: this.coordinatorId,\r\n subagents: Array.from(this.subagents.entries()).map(([id, s]) => ({\r\n id,\r\n name: s.config.name,\r\n status: s.status,\r\n currentTask: s.currentTask,\r\n })),\r\n pendingTasks: this.pendingTasks.length,\r\n completedTasks: this.completedResults.length,\r\n totalIterations: this.totalIterations,\r\n done: this.isDone(),\r\n };\r\n }\r\n\r\n /** Expose snapshot of completed results — useful for callers awaiting all done. */\r\n results(): readonly TaskResult[] {\r\n return this.completedResults;\r\n }\r\n\r\n /**\r\n * Wait for one or more tasks to complete and return their results.\r\n * If a task is already done when called, returns immediately.\r\n * Resolves to an array in the same order as `taskIds`.\r\n */\r\n async awaitTasks(taskIds: string[]): Promise<TaskResult[]> {\r\n return Promise.all(\r\n taskIds.map((id) => {\r\n const cached = this.completedResults.find((r) => r.taskId === id);\r\n if (cached) return cached;\r\n // Fallback: poll until the task completes (up to timeoutMs).\r\n // The coordinator fires 'task.completed' on every result, so\r\n // we use a promise-based waiter tied to that event.\r\n return new Promise<TaskResult>((resolve, reject) => {\r\n const timeout = setTimeout(() => {\r\n this.off('task.completed', handler);\r\n reject(new Error(`awaitTasks timed out waiting for task \"${id}\"`));\r\n }, this.config.timeoutMs ?? 300_000);\r\n const handler = ({ result }: { task: TaskSpec; result: TaskResult }) => {\r\n if (result.taskId === id) {\r\n clearTimeout(timeout);\r\n this.off('task.completed', handler);\r\n resolve(result);\r\n }\r\n };\r\n this.on('task.completed', handler);\r\n });\r\n }),\r\n );\r\n }\r\n\r\n /**\r\n * Manual completion — for callers that drive subagents without a runner\r\n * (e.g. external orchestrators). When a runner is configured the coordinator\r\n * calls this itself.\r\n */\r\n completeTask(result: TaskResult): void {\r\n this.recordCompletion(result);\r\n }\r\n\r\n // --- internal dispatching ---------------------------------------------\r\n\r\n private tryDispatchNext(): void {\r\n while (this.canDispatch()) {\r\n const dispatchable = this.takeNextDispatchableTask();\r\n if (!dispatchable) {\r\n // No idle worker right now. If every spawned subagent is\r\n // stopped or mid-termination, the pending queue is dead —\r\n // a pending task can never start, so synthetic-complete it\r\n // as `aborted_by_parent`. Without this, an `assign()` after\r\n // `stop()` would hang forever waiting for `task.completed`.\r\n // We DO NOT drain when subagents are busy (status='running'):\r\n // those will free up and accept the work normally.\r\n if (this.pendingTasks.length > 0 && !this.hasLiveSubagent()) {\r\n this.drainPendingAsAborted(\r\n 'No live subagent available — all stopped or mid-termination',\r\n );\r\n }\r\n return;\r\n }\r\n const { subagentId, task } = dispatchable;\r\n // Attach a catch so a synchronous throw inside runDispatched (rare —\r\n // e.g. provider misconfiguration before the first await) becomes a\r\n // visible failed task instead of an unhandled rejection that leaves\r\n // `inFlight` permanently elevated.\r\n this.runDispatched(subagentId, task).catch((err) => {\r\n this.recordCompletion({\r\n subagentId,\r\n taskId: task.id,\r\n status: 'failed',\r\n error: classifySubagentError(err),\r\n iterations: 0,\r\n toolCalls: 0,\r\n durationMs: 0,\r\n });\r\n });\r\n }\r\n }\r\n\r\n private canDispatch(): boolean {\r\n const max = this.config.maxConcurrent ?? 4;\r\n return this.inFlight < max && this.pendingTasks.length > 0;\r\n }\r\n\r\n private takeNextDispatchableTask(): { subagentId: string; task: TaskSpec } | null {\r\n for (let i = 0; i < this.pendingTasks.length; i++) {\r\n const task = this.pendingTasks[i]!;\r\n const subagentId = task.subagentId\r\n ? this.isIdleSubagent(task.subagentId)\r\n ? task.subagentId\r\n : null\r\n : this.findIdleSubagent();\r\n if (!subagentId) continue;\r\n this.pendingTasks.splice(i, 1);\r\n return { subagentId, task };\r\n }\r\n return null;\r\n }\r\n\r\n private findIdleSubagent(): string | null {\r\n for (const [id, s] of this.subagents) {\r\n // Skip subagents that are mid-termination — `stop()` set the\r\n // `terminating` flag and aborted the controller, but the\r\n // status mutation happens synchronously after; checking both\r\n // is belt-and-suspenders against any race where status is\r\n // transiently still 'idle' while termination is in flight.\r\n if (s.status === 'idle' && !this.terminating.has(id)) return id;\r\n }\r\n return null;\r\n }\r\n\r\n private isIdleSubagent(id: string): boolean {\r\n const subagent = this.subagents.get(id);\r\n return !!subagent && subagent.status === 'idle' && !this.terminating.has(id);\r\n }\r\n\r\n /**\r\n * Returns true iff at least one spawned subagent could still\r\n * process a task. A \"live\" subagent is one that is not stopped\r\n * AND not mid-termination — `running` workers count because they\r\n * will eventually finish and become idle.\r\n *\r\n * When no subagent has ever been spawned, returns `true` so a\r\n * pre-spawn `assign()` simply queues (legacy behaviour). The\r\n * dead-end detection only fires after `stop()` has retired every\r\n * spawned worker.\r\n *\r\n * Used by `tryDispatchNext` to detect a dead-end pending queue.\r\n */\r\n private hasLiveSubagent(): boolean {\r\n if (this.subagents.size === 0) return true;\r\n for (const [id, s] of this.subagents) {\r\n if (s.status !== 'stopped' && !this.terminating.has(id)) return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Drain every pending task with a synthetic `aborted_by_parent`\r\n * completion event. Same shape as the `stopAll()` drain — we go\r\n * around `recordCompletion` because pending tasks were never\r\n * counted in `inFlight` and routing them through would trip the\r\n * underflow guard on every task after the first.\r\n */\r\n private drainPendingAsAborted(message: string): void {\r\n const dropped = this.pendingTasks.splice(0, this.pendingTasks.length);\r\n for (const t of dropped) {\r\n const synthetic: TaskResult = {\r\n subagentId: t.subagentId ?? 'unassigned',\r\n taskId: t.id,\r\n status: 'stopped',\r\n error: {\r\n kind: 'aborted_by_parent',\r\n message,\r\n retryable: false,\r\n },\r\n iterations: 0,\r\n toolCalls: 0,\r\n durationMs: 0,\r\n };\r\n this.completedResults.push(synthetic);\r\n this.emit('task.completed', { task: t, result: synthetic });\r\n }\r\n }\r\n\r\n private async runDispatched(subagentId: string, task: TaskSpec): Promise<void> {\r\n const subagent = this.subagents.get(subagentId);\r\n if (!subagent) return;\r\n // Final race guard: if `stop(subagentId)` ran between dispatch\r\n // and us arriving here, refuse to start the task and surface it\r\n // as `aborted_by_parent` so any caller awaiting the task id\r\n // unblocks. Without this, the task would be marked 'running',\r\n // collide with the just-completed 'stopped' state, and leak\r\n // inFlight by 1 because no recordCompletion path covers it.\r\n if (this.terminating.has(subagentId) || subagent.status === 'stopped') {\r\n this.recordCompletion({\r\n subagentId,\r\n taskId: task.id,\r\n status: 'stopped',\r\n error: {\r\n kind: 'aborted_by_parent',\r\n message: 'Subagent was terminated before task could start',\r\n retryable: false,\r\n },\r\n iterations: 0,\r\n toolCalls: 0,\r\n durationMs: 0,\r\n });\r\n return;\r\n }\r\n\r\n subagent.status = 'running';\r\n subagent.currentTask = task.id;\r\n task.subagentId = subagentId;\r\n subagent.context.tasks.push(task);\r\n\r\n this.emit('task.assigned', { task, subagentId });\r\n\r\n // Budget combines coordinator defaults with per-subagent and per-task overrides.\r\n // Precedence: task > subagent > roster default > coordinator default.\r\n const configWithRosterDefaults = applyRosterBudget(subagent.config);\r\n const budget = new SubagentBudget({\r\n maxIterations:\r\n configWithRosterDefaults.maxIterations ?? this.config.defaultBudget?.maxIterations,\r\n maxToolCalls:\r\n task.maxToolCalls ??\r\n configWithRosterDefaults.maxToolCalls ??\r\n this.config.defaultBudget?.maxToolCalls,\r\n maxTokens:\r\n configWithRosterDefaults.maxTokens ?? this.config.defaultBudget?.maxTokens,\r\n maxCostUsd:\r\n configWithRosterDefaults.maxCostUsd ?? this.config.defaultBudget?.maxCostUsd,\r\n timeoutMs:\r\n task.timeoutMs ?? configWithRosterDefaults.timeoutMs ?? this.config.defaultBudget?.timeoutMs,\r\n });\r\n subagent.activeBudget = budget;\r\n\r\n if (!this.runner) {\r\n // No runner wired — caller drives execution via completeTask(). Status\r\n // reverts when the caller reports. We intentionally don't bump\r\n // `inFlight` here: `completeTask` → `recordCompletion` would then\r\n // decrement an inFlight that runDispatched never incremented, masking\r\n // the \"no runner\" state. With this guard, `isDone()`'s all_tasks_done\r\n // check still settles correctly once the caller reports.\r\n return;\r\n }\r\n\r\n // Only count inFlight when we actually own the execution lifecycle.\r\n this.inFlight++;\r\n\r\n const startTime = Date.now();\r\n const runCtx: SubagentRunContext = {\r\n subagentId,\r\n config: subagent.config,\r\n budget,\r\n signal: subagent.abortController.signal,\r\n bridge: subagent.context.parentBridge || null,\r\n };\r\n\r\n let result: TaskResult;\r\n\r\n budget.start();\r\n try {\r\n const outcome = await this.executeWithTimeout(this.runner, task, runCtx, budget);\r\n result = {\r\n subagentId,\r\n taskId: task.id,\r\n status: 'success',\r\n result: outcome.result,\r\n iterations: outcome.iterations,\r\n toolCalls: outcome.toolCalls,\r\n durationMs: Date.now() - startTime,\r\n };\r\n } catch (err) {\r\n // Order matters: a timeout calls abort() to signal cooperative runners,\r\n // which also flips `signal.aborted=true`. Inspect the error first so we\r\n // surface 'timeout' rather than masking it as 'stopped'.\r\n const status: TaskResult['status'] =\r\n err instanceof BudgetExceededError && err.kind === 'timeout'\r\n ? 'timeout'\r\n : subagent.abortController.signal.aborted\r\n ? 'stopped'\r\n : 'failed';\r\n const usage = budget.usage();\r\n result = {\r\n subagentId,\r\n taskId: task.id,\r\n status,\r\n error: classifySubagentError(err, {\r\n parentAborted: subagent.abortController.signal.aborted,\r\n }),\r\n iterations: usage.iterations,\r\n toolCalls: usage.toolCalls,\r\n durationMs: Date.now() - startTime,\r\n };\r\n }\r\n\r\n this.recordCompletion(result);\r\n }\r\n\r\n private async executeWithTimeout(\r\n runner: SubagentRunner,\r\n task: TaskSpec,\r\n ctx: SubagentRunContext,\r\n budget: SubagentBudget,\r\n ) {\r\n const initialTimeoutMs = budget.limits.timeoutMs;\r\n if (initialTimeoutMs === undefined) return runner(task, ctx);\r\n\r\n // Re-armable watchdog. When the wall-clock fires, give the budget a\r\n // chance to negotiate an extension (via the same onThreshold path the\r\n // other limit kinds use). The Director's auto-extend listener handles\r\n // `kind: 'timeout'` and patches `budget.limits.timeoutMs`; we observe\r\n // that patch on the next tick and re-arm the timer for the remaining\r\n // window. If onThreshold is unset or negotiation returns 'stop',\r\n // reject as before with `elapsed` (not `Date.now()`) so the error\r\n // message reads sensibly.\r\n const start = Date.now();\r\n let timer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n const timeoutPromise = new Promise<never>((_, reject) => {\r\n const armFor = (ms: number) => {\r\n if (timer) clearTimeout(timer);\r\n timer = setTimeout(async () => {\r\n const elapsed = Date.now() - start;\r\n const limit = budget.limits.timeoutMs ?? initialTimeoutMs;\r\n // Without an onThreshold handler the original behaviour stands:\r\n // abort the signal and hard-reject. This preserves the contract\r\n // for direct SubagentBudget consumers that don't wire negotiation.\r\n if (!budget.onThreshold) {\r\n this.subagents.get(ctx.subagentId)?.abortController.abort();\r\n reject(new BudgetExceededError('timeout', limit, elapsed));\r\n return;\r\n }\r\n // With a handler, ask for an extension. The budget's\r\n // requestDecision returns 'stop' on no response (decision\r\n // fallback timer inside SubagentBudget), so this never hangs.\r\n try {\r\n const result = budget.onThreshold({\r\n kind: 'timeout',\r\n used: elapsed,\r\n limit,\r\n requestDecision: () =>\r\n new Promise((resolveDecision) => {\r\n budget._events?.emit('budget.threshold_reached', {\r\n kind: 'timeout',\r\n used: elapsed,\r\n limit,\r\n timeoutMs: 30_000,\r\n extend: (extra) => resolveDecision({ extend: extra }),\r\n deny: () => resolveDecision('stop'),\r\n });\r\n }),\r\n });\r\n const decision =\r\n typeof result === 'string' ? result : await result;\r\n if (decision === 'continue') {\r\n armFor(Math.max(1_000, limit));\r\n return;\r\n }\r\n if (decision === 'throw' || decision === 'stop') {\r\n // Timeout denied — re-arm for the same limit so we ask again\r\n // on the next tick. This makes timeout a pure warning event:\r\n // the subagent keeps running, the user sees \"⚡ timeout —\r\n // extending\" in chat history, and work continues until the\r\n // subagent naturally finishes or the user stops it. No task\r\n // is hard-killed solely because its wall-clock ran out.\r\n armFor(Math.max(1_000, limit));\r\n return;\r\n }\r\n // 'extend' — patch budget and re-arm for the new remainder.\r\n if (decision.extend.timeoutMs !== undefined) {\r\n (budget.limits as Record<string, unknown>).timeoutMs =\r\n decision.extend.timeoutMs;\r\n const newLimit = decision.extend.timeoutMs;\r\n const remaining = Math.max(1_000, newLimit - elapsed);\r\n armFor(remaining);\r\n return;\r\n }\r\n // No timeoutMs in extend — fall through to reject.\r\n this.subagents.get(ctx.subagentId)?.abortController.abort();\r\n reject(new BudgetExceededError('timeout', limit, elapsed));\r\n } catch (err) {\r\n this.subagents.get(ctx.subagentId)?.abortController.abort();\r\n reject(\r\n err instanceof BudgetExceededError\r\n ? err\r\n : new BudgetExceededError('timeout', limit, elapsed),\r\n );\r\n }\r\n }, ms);\r\n };\r\n armFor(initialTimeoutMs);\r\n });\r\n\r\n try {\r\n return await Promise.race([runner(task, ctx), timeoutPromise]);\r\n } finally {\r\n if (timer) clearTimeout(timer);\r\n }\r\n }\r\n\r\n private recordCompletion(result: TaskResult): void {\r\n this.completedResults.push(result);\r\n this.totalIterations += result.iterations;\r\n if (this.inFlight > 0) {\r\n this.inFlight--;\r\n } else if (this.runner) {\r\n // Runner-driven path completed without an outstanding inFlight slot —\r\n // shouldn't happen unless completeTask was called externally.\r\n this.emit('warning', {\r\n type: 'inFlight_underflow',\r\n taskId: result.taskId,\r\n subagentId: result.subagentId,\r\n });\r\n return;\r\n }\r\n\r\n const subagent = this.subagents.get(result.subagentId);\r\n if (subagent && subagent.status !== 'stopped') {\r\n const failed = result.status === 'failed' || result.status === 'timeout';\r\n // Synchronously reset the worker to idle after either a clean\r\n // finish or a transient failure. The previous code parked the\r\n // subagent in 'error' and used a `queueMicrotask` to flip it\r\n // back to 'idle' — that opened a window where `assign()` +\r\n // `tryDispatchNext` could race the microtask, leaving the\r\n // worker stuck in 'running' state while actually idle. By\r\n // resetting now, no async gap can leak the state machine.\r\n subagent.status = 'idle';\r\n void failed; // kept for future telemetry hooks\r\n subagent.currentTask = undefined;\r\n // If the run aborted (timeout or explicit stop), the subagent's\r\n // signal is now permanently aborted — recycling the controller lets\r\n // the next dispatched task start with a fresh cancellation scope.\r\n if (subagent.abortController.signal.aborted) {\r\n subagent.abortController = new AbortController();\r\n }\r\n }\r\n // Clear the terminating flag now that the worker has a terminal\r\n // TaskResult on record. Subsequent stop() calls re-add it; new\r\n // assign() calls can flow normally.\r\n this.terminating.delete(result.subagentId);\r\n\r\n this.emit('task.completed', {\r\n task: subagent?.context.tasks.find((t) => t.id === result.taskId) ?? { id: result.taskId },\r\n result,\r\n });\r\n\r\n this.tryDispatchNext();\r\n\r\n if (this.isDone()) {\r\n this.emit('done', {\r\n results: this.completedResults,\r\n totalIterations: this.totalIterations,\r\n });\r\n }\r\n }\r\n\r\n private isDone(): boolean {\r\n if (this.config.doneCondition.type === 'all_tasks_done') {\r\n return this.pendingTasks.length === 0 && this.inFlight === 0;\r\n }\r\n if (\r\n this.config.doneCondition.maxIterations !== undefined &&\r\n this.totalIterations >= this.config.doneCondition.maxIterations\r\n ) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Map any raw exception thrown out of a subagent's runner into a\r\n * structured `SubagentError`. This is the single point where the\r\n * coordinator decides \"what kind of failure was that\" — so callers\r\n * (delegate tool output, /agents UI, retry policies) branch on\r\n * `kind` instead of substring-matching `error.message`.\r\n *\r\n * The classification order matters:\r\n * 1. Provider errors first (their `status` + `retryable` are\r\n * already structured, just translate to our enum).\r\n * 2. Budget errors next (BudgetExceededError carries a discrete\r\n * `kind` we can lift directly).\r\n * 3. Parent-abort if the subagent's signal was aborted and we\r\n * didn't recognize the error otherwise — distinguishes user\r\n * Ctrl+C from a tool throwing.\r\n * 4. Substring sniffing for stable error markers (\"agent\r\n * aborted\" from agent-subagent-runner, \"Bridge transport\"\r\n * from agent-bridge).\r\n * 5. Fallback to `unknown` so callers know we couldn't classify.\r\n *\r\n * The `cause` field is always populated when `err` is an Error so\r\n * diagnostics survive even when `kind === 'unknown'` — no info is\r\n * dropped, the classifier just refused to commit.\r\n *\r\n * Exported because tests and CLI surfaces want to assert on the\r\n * classification without instantiating a coordinator.\r\n */\r\nexport function classifySubagentError(\r\n err: unknown,\r\n hints: { parentAborted?: boolean } = {},\r\n): SubagentError {\r\n const cause = err instanceof Error\r\n ? { name: err.name, message: err.message, stack: err.stack }\r\n : undefined;\r\n\r\n if (err instanceof ProviderError) {\r\n const baseMessage = err.describe();\r\n return providerErrorToSubagentError(err, baseMessage, cause);\r\n }\r\n\r\n const baseMessage = err instanceof Error ? err.message : String(err);\r\n\r\n if (err instanceof BudgetExceededError) {\r\n const map: Record<BudgetExceededError['kind'], SubagentErrorKind> = {\r\n iterations: 'budget_iterations',\r\n tool_calls: 'budget_tool_calls',\r\n tokens: 'budget_tokens',\r\n cost: 'budget_cost',\r\n timeout: 'budget_timeout',\r\n };\r\n return {\r\n kind: map[err.kind],\r\n message: baseMessage,\r\n // Budgets are user-configured ceilings, not transient failures —\r\n // retrying with the same budget will hit the same ceiling. The\r\n // orchestrator must raise the budget or narrow the task first.\r\n retryable: false,\r\n cause,\r\n };\r\n }\r\n\r\n // Distinguish parent-aborted from real failures BEFORE substring\r\n // sniffing — if the parent signal is aborted, the most common\r\n // exception is \"agent aborted\" thrown by agent-subagent-runner.\r\n if (hints.parentAborted) {\r\n return {\r\n kind: 'aborted_by_parent',\r\n message: baseMessage,\r\n retryable: false,\r\n cause,\r\n };\r\n }\r\n\r\n // Stable markers — these strings live in our own code and are\r\n // checked here intentionally so callers can react without\r\n // exception-type imports.\r\n const lower = baseMessage.toLowerCase();\r\n if (/agent aborted$/i.test(baseMessage)) {\r\n return {\r\n kind: 'aborted_by_parent',\r\n message: baseMessage,\r\n retryable: false,\r\n cause,\r\n };\r\n }\r\n if (/agent exhausted iteration limit$/i.test(baseMessage)) {\r\n return { kind: 'budget_iterations', message: baseMessage, retryable: false, cause };\r\n }\r\n if (/empty response$/i.test(baseMessage)) {\r\n return { kind: 'empty_response', message: baseMessage, retryable: false, cause };\r\n }\r\n // The runner throws `Error('tool failed: <name>')` when an executed tool\r\n // returned `ok:false` and the agent ultimately ended without recovering\r\n // (or aborted). Surface as `tool_failed` so callers don't conflate a\r\n // failed tool with a thrown tool — both are useful but mean different\r\n // things at the LLM layer.\r\n if (/^tool failed: /i.test(baseMessage)) {\r\n return { kind: 'tool_failed', message: baseMessage, retryable: false, cause };\r\n }\r\n if (lower.includes('bridge transport') || /bridge.*(closed|disconnect)/i.test(baseMessage)) {\r\n return { kind: 'bridge_failed', message: baseMessage, retryable: false, cause };\r\n }\r\n if (/context length|max.*tokens?.*exceeded|prompt is too long/i.test(baseMessage)) {\r\n return { kind: 'context_overflow', message: baseMessage, retryable: false, cause };\r\n }\r\n\r\n // Final fallback — preserve cause so diagnostics aren't lost.\r\n return {\r\n kind: 'unknown',\r\n message: baseMessage,\r\n retryable: false,\r\n cause,\r\n };\r\n}\r\n\r\nfunction providerErrorToSubagentError(\r\n err: ProviderError,\r\n message: string,\r\n cause: SubagentError['cause'],\r\n): SubagentError {\r\n const status = err.status;\r\n // Read suggested retry-after from the provider body when present so\r\n // the orchestrator doesn't have to invent a backoff. Most providers\r\n // include retry-after as a header / body field which our provider\r\n // layer normalises into `body.message` — we cannot trust a numeric\r\n // field exists, so we leave backoffMs unset when unknown.\r\n if (status === 429 || err.body?.type === 'rate_limit_error') {\r\n return {\r\n kind: 'provider_rate_limit',\r\n message,\r\n retryable: true,\r\n // Conservative default: 5s. Provider-specific code can override\r\n // by emitting an error whose body carries an explicit hint.\r\n backoffMs: 5_000,\r\n cause,\r\n };\r\n }\r\n if (status === 401 || status === 403 || err.body?.type === 'authentication_error') {\r\n return { kind: 'provider_auth', message, retryable: false, cause };\r\n }\r\n if (status === 408 || status === 0) {\r\n return { kind: 'provider_timeout', message, retryable: true, cause };\r\n }\r\n if (status >= 500 && status < 600) {\r\n return {\r\n kind: 'provider_5xx',\r\n message,\r\n retryable: true,\r\n backoffMs: 3_000,\r\n cause,\r\n };\r\n }\r\n // Other provider errors (400 invalid request, 404 not found, etc.)\r\n // are not retryable as-is and don't have a dedicated kind — surface\r\n // as 'unknown' so the orchestrator treats them as terminal.\r\n return { kind: 'unknown', message, retryable: err.retryable, cause };\r\n}\r\n","import { randomUUID } from 'node:crypto';\nimport type { Agent } from '../core/agent.js';\nimport type { Context } from '../core/context.js';\nimport type { AgentFactory } from '../coordination/agent-subagent-runner.js';\nimport { makeAgentSubagentRunner } from '../coordination/agent-subagent-runner.js';\nimport type { SubagentConfig, TaskResult } from '../types/multi-agent.js';\nimport type { JournalEntry, GoalFile } from '../storage/goal-store.js';\nimport { loadGoal, saveGoal, appendJournal, goalFilePath } from '../storage/goal-store.js';\nimport type { Compactor } from '../types/compactor.js';\nimport { DefaultMultiAgentCoordinator } from '../coordination/multi-agent-coordinator.js';\nimport type { MultiAgentConfig } from '../types/multi-agent.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type ParallelEngineState = 'idle' | 'running' | 'stopped';\n\nexport interface ParallelEternalOptions {\n /** The coordinating agent — NOT a subagent. Owns container/tools/providers. */\n agent: Agent;\n /** Project root (used for goal.json path). */\n projectRoot: string;\n /**\n * Number of parallel subagent slots per tick.\n * Default: 4. Range 1–16; values >8 are for high-throughput machines.\n */\n parallelSlots?: number;\n /** Per-subagent default timeout in ms. Default: 300_000 (5 min). */\n iterationTimeoutMs?: number;\n onIteration?: (entry: JournalEntry) => void;\n onError?: (err: Error, iteration: number) => void;\n gitStatusReader?: () => Promise<string>;\n now?: () => Date;\n compactor?: Compactor;\n compactEveryNIterations?: number;\n aggressiveCompactRatio?: number;\n maxContextTokens?: number;\n /** Override the default agent factory (uses main agent if not provided). */\n subagentFactory?: AgentFactory;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nconst GOAL_COMPLETE_MARKER = /^\\s*\\[goal[_\\s-]?complete\\]\\s*$/im;\n\n// ---------------------------------------------------------------------------\n// ParallelEternalEngine\n// ---------------------------------------------------------------------------\n\n/**\n * Sense → Decide → Fan-out (4–8 parallel agents) → Aggregate → Loop.\n *\n * Each tick:\n * 1. Sense — load goal, todos, git status\n * 2. Decide — decompose goal into N parallel sub-tasks\n * 3. Fan-out — spawn N subagents simultaneously, await all\n * 4. Aggregate — write journal, update todos, check [GOAL_COMPLETE]\n * 5. Loop — continue until stop() or mission complete\n *\n * Uses DefaultMultiAgentCoordinator + AgentSubagentRunner for subagent lifecycle.\n */\nexport class ParallelEternalEngine {\n private state: ParallelEngineState = 'idle';\n private stopRequested = false;\n private iterationsSinceCompact = 0;\n private iterations = 0;\n private consecutiveFailures = 0;\n private readonly goalPath: string;\n private readonly slots: number;\n private readonly timeoutMs: number;\n private coordinator: DefaultMultiAgentCoordinator | null = null;\n private agentFactory: AgentFactory;\n\n constructor(private readonly opts: ParallelEternalOptions) {\n this.goalPath = goalFilePath(opts.projectRoot);\n this.slots = Math.min(16, Math.max(1, opts.parallelSlots ?? 4));\n this.timeoutMs = opts.iterationTimeoutMs ?? 300_000;\n this.agentFactory = opts.subagentFactory ?? (async (config: SubagentConfig) => ({\n agent: this.opts.agent,\n events: this.opts.agent.events,\n }));\n }\n\n get currentState(): ParallelEngineState {\n return this.state;\n }\n\n stop(): void {\n this.stopRequested = true;\n void this.persistState('stopped').catch(() => {});\n this.state = 'stopped';\n }\n\n async prime(): Promise<void> {\n this.stopRequested = false;\n this.state = 'running';\n await this.persistState('running');\n }\n\n async run(): Promise<void> {\n this.state = 'running';\n await this.persistState('running');\n\n const config: MultiAgentConfig = {\n coordinatorId: `parallel-${randomUUID().slice(0, 8)}`,\n maxConcurrent: this.slots,\n doneCondition: { type: 'all_tasks_done' },\n };\n this.coordinator = new DefaultMultiAgentCoordinator(config);\n const runner = makeAgentSubagentRunner({ factory: this.agentFactory });\n this.coordinator.setRunner?.(runner);\n\n try {\n while (!this.stopRequested) {\n try {\n await this.runOneIteration();\n } catch (err) {\n this.consecutiveFailures++;\n this.opts.onError?.(err instanceof Error ? err : new Error(String(err)), this.consecutiveFailures);\n await this.appendFailure('engine error', err instanceof Error ? err.message : String(err));\n }\n if (this.stopRequested) break;\n await sleep(2000);\n }\n } finally {\n this.state = 'stopped';\n await this.persistState('stopped').catch(() => {});\n }\n }\n\n /**\n * Execute one tick: decompose → fan-out → aggregate → compact.\n * Called by the REPL in its main loop (REPL drives, engine is stateless per tick).\n */\n async runOneIteration(): Promise<boolean> {\n this.iterations++;\n\n const goal = await loadGoal(this.goalPath);\n if (!goal) { this.stopRequested = true; return false; }\n if (goal.goalState !== 'active') { this.stopRequested = true; return false; }\n\n // Build coordinator on first tick.\n if (!this.coordinator) {\n const config: MultiAgentConfig = {\n coordinatorId: `parallel-${randomUUID().slice(0, 8)}`,\n maxConcurrent: this.slots,\n doneCondition: { type: 'all_tasks_done' },\n };\n this.coordinator = new DefaultMultiAgentCoordinator(config);\n const runner = makeAgentSubagentRunner({ factory: this.agentFactory });\n this.coordinator.setRunner?.(runner);\n }\n\n const tasks = await this.decomposeGoal(goal);\n if (!tasks || tasks.length === 0) {\n await sleep(5000);\n return false;\n }\n\n const fanOut = await this.fanOut(goal, tasks);\n this.iterationsSinceCompact++;\n\n const successCount = fanOut.results.filter(r => r.status === 'success').length;\n const status: JournalEntry['status'] = fanOut.goalComplete ? 'success' : fanOut.allSuccessful ? 'success' : 'failure';\n const note = [\n `${successCount}/${fanOut.results.length} subagents succeeded`,\n fanOut.goalComplete ? '[GOAL_COMPLETE]' : '',\n fanOut.partialOutput ? `Output: ${fanOut.partialOutput.slice(0, 120)}` : '',\n ].filter(Boolean).join(' | ');\n\n await this.appendIterationEntry({\n source: 'parallel',\n task: `parallel:${tasks.length} slots — ${tasks.slice(0, 3).join(', ')}${tasks.length > 3 ? '...' : ''}`,\n status,\n note,\n });\n\n if (fanOut.goalComplete) {\n this.stopRequested = true;\n return true;\n }\n\n await this.maybeCompact();\n return fanOut.allSuccessful;\n }\n\n // -------------------------------------------------------------------------\n // Fan-out\n // -------------------------------------------------------------------------\n\n private async fanOut(goal: GoalFile, tasks: string[]): Promise<{\n results: TaskResult[];\n allSuccessful: boolean;\n goalComplete: boolean;\n partialOutput: string;\n }> {\n const coordinator = this.coordinator!;\n const slotCount = Math.min(this.slots, tasks.length);\n\n const recentJournal = goal.journal.slice(-5)\n .map(e => ` #${e.iteration} [${e.status}] ${e.task}${e.note ? ` — ${e.note.slice(0, 80)}` : ''}`)\n .join('\\n');\n\n const directivePreamble = [\n '═══ ETERNAL AUTONOMY — parallel task slot ═══',\n '',\n `Mission: ${goal.goal}`,\n `Total parallel slots: ${slotCount}`,\n '',\n recentJournal ? `Recent journal (last 5):\\n${recentJournal}` : 'No prior iterations.',\n '',\n '── EXECUTION PROTOCOL ──',\n '• Execute the assigned task end-to-end using multiple tool calls.',\n '• Emit `[done]` on its own line when the task is complete.',\n '• Do not ask for confirmation — YOLO is active.',\n '• If the overall Mission is accomplished, emit `[GOAL_COMPLETE]` followed by a verification recipe.',\n '• Keep output concise — summarize findings, do not transcribe files.',\n ].join('\\n');\n\n const taskIds: string[] = [];\n const subagentIds: string[] = [];\n\n const spawnPromises: Array<Promise<void>> = [];\n for (let i = 0; i < slotCount; i++) {\n const task = tasks[i]!;\n const subagentId = `parallel-${this.iterations}-${i}`;\n const taskId = randomUUID();\n const spec = {\n id: taskId,\n description: `${directivePreamble}\\n\\n── SLOT ${i + 1}/${slotCount} ──\\nTask: ${task}\\n`,\n subagentId,\n };\n\n spawnPromises.push((async () => {\n try {\n await coordinator.spawn({\n id: subagentId,\n name: `slot-${subagentId.slice(-6)}`,\n maxIterations: 50,\n maxToolCalls: 200,\n timeoutMs: this.timeoutMs,\n });\n subagentIds.push(subagentId);\n taskIds.push(taskId);\n await coordinator.assign(spec);\n } catch {\n // non-fatal: individual spawn failure doesn't block other slots\n }\n })());\n }\n await Promise.all(spawnPromises);\n\n if (taskIds.length === 0) {\n return { results: [], allSuccessful: false, goalComplete: false, partialOutput: '' };\n }\n\n let results: TaskResult[] = [];\n try {\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), this.timeoutMs + 60000);\n try {\n results = await coordinator.awaitTasks(taskIds);\n } finally {\n clearTimeout(timer);\n }\n } catch {\n results = coordinator.results().slice(-taskIds.length);\n }\n\n const allSuccessful = results.length > 0 && results.every(r => r.status === 'success');\n const goalComplete = results.some(r =>\n r.status === 'success' && typeof r.result === 'string' && GOAL_COMPLETE_MARKER.test(r.result)\n );\n const partialOutput = results\n .map(r => (typeof r.result === 'string' ? r.result : ''))\n .filter(Boolean)\n .join('\\n\\n');\n\n return { results, allSuccessful, goalComplete, partialOutput };\n }\n\n // -------------------------------------------------------------------------\n // Goal decomposition\n // -------------------------------------------------------------------------\n\n private async decomposeGoal(goal: GoalFile): Promise<string[] | null> {\n // Strategy 1: pending todos as sub-tasks\n const todos = this.opts.agent.ctx?.todos;\n const tasks: string[] = [];\n if (Array.isArray(todos)) {\n const pending = todos.filter((t) => t.status === 'pending').slice(0, this.slots);\n for (const t of pending) {\n tasks.push(`[todo] ${t.content}`);\n }\n }\n\n // Strategy 2: git dirty files\n if (tasks.length < this.slots) {\n try {\n const gitStatus = await (this.opts.gitStatusReader?.() ?? this.readGitStatus());\n const dirty = gitStatus.trim();\n if (dirty) {\n const lines = dirty.split('\\n').slice(0, this.slots - tasks.length);\n for (const line of lines) {\n const file = line.replace(/^[ MADRUC?]{2}\\s*/, '').trim();\n if (file) tasks.push(`[git] inspect and fix: ${file}`);\n }\n }\n } catch {\n // ignore\n }\n }\n\n // Strategy 3: leader-brainstormed sub-tasks for remaining slots\n if (tasks.length < this.slots) {\n const remaining = this.slots - tasks.length;\n const brainstormed = await this.brainstormSubtasks(goal, remaining);\n tasks.push(...brainstormed);\n }\n\n return tasks.length > 0 ? tasks.slice(0, this.slots) : null;\n }\n\n private async readGitStatus(): Promise<string> {\n const { execFile } = await import('node:child_process');\n const { promisify } = await import('node:util');\n const execFileP = promisify(execFile);\n const { stdout } = await execFileP('git', ['status', '--porcelain'], {\n cwd: this.opts.projectRoot,\n timeout: 5_000,\n });\n return stdout;\n }\n\n private async brainstormSubtasks(goal: GoalFile, count: number): Promise<string[]> {\n const lastFew = goal.journal.slice(-5).map((e) => ` - [${e.status}] ${e.task}`).join('\\n');\n const directive = [\n `Decompose this goal into exactly ${count} independent sub-tasks for parallel execution.`,\n '',\n `Goal: ${goal.goal}`,\n '',\n lastFew ? `Recent:\\n${lastFew}` : 'No prior iterations.',\n '',\n `Output exactly ${count} tasks, one per line, under 120 chars each.`,\n 'Format: TASK-1 | TASK-2 | ... (pipe-separated, no numbering, no preamble).',\n 'Each task must be independently actionable with no shared dependencies.',\n ].join('\\n');\n\n try {\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), 60_000);\n try {\n const result = await this.opts.agent.run([{ type: 'text' as const, text: directive }], {\n signal: ctrl.signal,\n maxIterations: 1,\n });\n if (result.status !== 'done') return [];\n const text = (result.finalText ?? '').trim();\n if (!text) return [];\n const tasks = text.split('|').map(t => t.trim()).filter(t => t.length > 10 && t.length < 240);\n return tasks.slice(0, count);\n } finally {\n clearTimeout(timer);\n }\n } catch {\n return [];\n }\n }\n\n // -------------------------------------------------------------------------\n // Compaction\n // -------------------------------------------------------------------------\n\n private async maybeCompact(): Promise<void> {\n const compactor = this.opts.compactor;\n if (!compactor) return;\n const ctx = this.opts.agent.ctx;\n if (!ctx) return;\n\n const shouldRun = this.iterationsSinceCompact >= (this.opts.compactEveryNIterations ?? 25);\n if (!shouldRun) return;\n\n const report = await compactor.compact(ctx, { aggressive: false });\n this.iterationsSinceCompact = 0;\n await this.appendIterationEntry({\n source: 'manual',\n task: 'compaction (cadence)',\n status: 'success',\n note: `saved ~${report.before - report.after} tokens`,\n });\n }\n\n // -------------------------------------------------------------------------\n // Helpers\n // -------------------------------------------------------------------------\n\n private async appendIterationEntry(entry: Omit<JournalEntry, 'iteration' | 'at'>): Promise<void> {\n const current = await loadGoal(this.goalPath);\n if (!current) return;\n const updated = appendJournal(current, entry);\n await saveGoal(this.goalPath, updated);\n const entryWithMeta: JournalEntry = {\n at: (this.opts.now?.() ?? new Date()).toISOString(),\n iteration: updated.iterations,\n ...entry,\n };\n this.opts.onIteration?.(entryWithMeta);\n }\n\n private async appendFailure(task: string, note: string): Promise<void> {\n await this.appendIterationEntry({ source: 'manual', task, status: 'failure', note });\n }\n\n private async persistState(state: GoalFile['engineState']): Promise<void> {\n const current = await loadGoal(this.goalPath);\n if (!current) return;\n if (current.engineState === state) return;\n await saveGoal(this.goalPath, { ...current, engineState: state });\n }\n}","/**\n * System-prompt contributor that surfaces eternal-autonomy state to the\n * model on every turn.\n *\n * Why this exists: when the engine drives a long-running loop, the\n * per-iteration directive carries the rules. But the directive is a USER\n * message — it scrolls out of working memory after a few compactions and\n * the model forgets it's in autonomy mode (forgets `[GOAL_COMPLETE]`,\n * forgets the todo-state protocol, forgets the no-confirmation rule).\n * Injecting the same anchor as a CACHED system-prompt block solves that\n * — the rules sit next to the identity layer and survive compactions.\n *\n * Block is tagged `ephemeral` so its content (journal tail, iteration\n * counter) changes each turn without invalidating the upstream prefix\n * cache.\n */\n\nimport type { TextBlock } from '../types/blocks.js';\nimport type { SystemPromptContributor } from '../types/system-prompt-contributor.js';\nimport { loadGoal } from '../storage/goal-store.js';\n\nexport interface AutonomyPromptContributorOptions {\n /** Absolute path to the project's `goal.json`. */\n goalPath: string;\n /**\n * Gating function. The contributor consults this on every build and\n * returns an empty array when `false` — without this, the block would\n * leak into interactive runs that happen to have a goal on disk and\n * teach the model loop-control markers it shouldn't emit.\n *\n * Typical wiring: `() => autonomyMode === 'eternal'`.\n */\n enabled: () => boolean;\n /** Number of journal entries to include in the recent-tail block. Default 5. */\n journalTailSize?: number;\n}\n\n/**\n * Build a contributor that renders the autonomy-state system block.\n * Returns `[]` when disabled, no goal exists, or the goal has been\n * completed/abandoned — all silent fast-paths.\n */\nexport function makeAutonomyPromptContributor(\n opts: AutonomyPromptContributorOptions,\n): SystemPromptContributor {\n return async (ctx): Promise<TextBlock[]> => {\n // Subagents run a single scoped task and don't drive the engine's\n // outer loop — they have no business emitting `[GOAL_COMPLETE]` or\n // marking todos. Skip the block entirely for subagent prompt builds,\n // mirroring how the active-plan layer is suppressed.\n if (ctx.subagent) return [];\n if (!opts.enabled()) return [];\n\n let goal: Awaited<ReturnType<typeof loadGoal>>;\n try {\n goal = await loadGoal(opts.goalPath);\n } catch {\n return [];\n }\n if (!goal) return [];\n\n // `active` is the default for legacy goal files without the field.\n const missionState = goal.goalState ?? 'active';\n if (missionState !== 'active') return [];\n\n const tailSize = opts.journalTailSize ?? 5;\n const journalTail = goal.journal\n .slice(-tailSize)\n .map((e) => {\n const note = e.note ? ` — ${e.note.slice(0, 80)}` : '';\n return ` #${e.iteration} [${e.status}] ${e.task}${note}`;\n });\n\n const text = [\n '## ETERNAL AUTONOMY — active mission',\n '',\n 'You are inside a long-running autonomous loop. The user is asleep',\n \"and is not available to confirm decisions. Each turn you receive a\",\n 'directive describing one concrete sub-task that advances the mission.',\n '',\n `Mission: ${goal.goal}`,\n `Iteration: #${goal.iterations}`,\n journalTail.length > 0\n ? `Recent journal (last ${journalTail.length}):\\n${journalTail.join('\\n')}`\n : 'Recent journal: (none — this is the first iteration)',\n '',\n '### Loop control markers',\n 'Emit these on their own line in your final text — case-insensitive,',\n 'whitespace-tolerant, but they must occupy the entire line:',\n '- `[continue]` — chain to the next internal step without returning.',\n '- `[done]` — the current sub-task is finished; return to the engine.',\n '- `[GOAL_COMPLETE]` — emit ONLY when the OVERALL mission is',\n ' verifiably done. Must be followed by a one-paragraph verification',\n ' recipe (artifact path, test command, or 10-second reproduction).',\n ' The engine halts on this marker — false positives waste real',\n ' human time. If unsure, emit `[done]` and let the next iteration',\n ' decide.',\n '',\n '### Operating principles',\n '- YOLO is active. Do NOT ask for confirmation, do NOT propose',\n ' options. Pick the best path and execute it.',\n '- Use tools freely; multiple calls per turn are normal and expected.',\n '- When working on a todo, mark it `in_progress` via the todos tool',\n ' before tool work and `completed` (or `cancelled` with a reason)',\n ' when done. The loop reads todo state between iterations.',\n \"- If an approach fails twice in a row, pivot. Don't grind on the\",\n ' same wall — try a different angle, file a cancel on the todo, or',\n ' surface the obstacle via `[done]` and let the next iteration',\n ' re-plan.',\n ].join('\\n');\n\n return [\n {\n type: 'text',\n text,\n cache_control: { type: 'ephemeral' },\n },\n ];\n };\n}\n","/**\n * `/goal <description>` preamble — the \"no force can stop this\" mode.\n *\n * Unlike STEERING (which redirects mid-flight), GOAL is a contract:\n * the user hands over a problem, the agent commits to verifiably\n * finishing it, and every iteration re-reads this preamble from the\n * conversation history. The hardening is entirely prompt-level —\n * the system has already removed implicit budget caps, so this\n * preamble's job is to remove the MODEL's tendency to hedge, ask\n * permission, or declare premature success.\n *\n * The four sections are intentional:\n * 1. AUTHORITY — explicit grant of unbounded fan-out + model\n * switching. Without this the model self-throttles (\"I shouldn't\n * spawn too many…\") even when budgets are unlimited.\n * 2. DONE — concrete bar for completion. Forces a verifiable\n * artifact (test passing, file written, bug re-run clean).\n * Without this the model returns \"I believe it's fixed\" and\n * counts that as done.\n * 3. NOT DONE — explicit anti-patterns. Each item is something we\n * saw real agents do as a \"completion\" that wasn't.\n * 4. PERSISTENCE — three-angle rule for blockers. Stops the model\n * from giving up on the first tool failure.\n *\n * Located in @wrongstack/core (rather than @wrongstack/tui) so headless\n * callers and the WebUI can issue `/goal set` without dragging the TUI\n * package in. The tui re-exports this for backward compatibility.\n */\nexport function buildGoalPreamble(goal: string): string {\n return [\n '[GOAL — LOCKED IN. You will work on this until it is verifiably done.',\n 'The user granted you full autonomy. Read these constraints once, then act.',\n '',\n 'YOUR GOAL:',\n '---',\n goal,\n '---',\n '',\n 'AUTHORITY YOU HAVE:',\n '- Spawn as many subagents as the work needs (delegate / spawn_subagent).',\n ' Parallel + recursive fan-out are both fine. There is no spawn budget.',\n '- Use any provider/model per subagent — pick the right tool for each',\n ' piece of work. Heavy reasoning model for planning, fast model for',\n ' batch work, specialist model for domain code.',\n '- Run unlimited tool calls and iterations. There is NO hidden budget.',\n ' The Agent loop auto-extends every 100 iterations forever.',\n '- Retry failed tools with different inputs, alternative paths, fresh',\n ' subagents. Switch providers mid-run if one is rate-limited.',\n '- Re-plan freely when an approach hits a dead end. You are not obliged',\n ' to stick with the first plan you proposed.',\n '',\n 'WHAT \"DONE\" MEANS — non-negotiable:',\n '- You can name a concrete artifact (a passing test, a written file at',\n ' a specific path, a fixed bug verified by re-running the failing case,',\n ' a clean grep that previously had matches).',\n '- You can tell the user HOW to verify it themselves in 10 seconds.',\n '- You have NOT hedged. None of: \"looks like it should work\", \"I',\n ' believe this fixes it\", \"the changes appear correct\".',\n '',\n 'WHAT IS NOT DONE — never report any of these as completion:',\n \"- An error message you didn't recover from.\",\n '- An empty result, a 0-line file, a \"no matches found\" you accepted',\n ' without questioning the search.',\n '- \"Should I continue?\" / \"Want me to also...?\" / \"Let me know if you',\n ' want X.\" Those are hedges. The user already told you to finish the',\n ' goal — just do it.',\n '- Partial progress dressed up as success. Fixed 3 of 5 bugs = 60%',\n ' done, not done.',\n \"- A subagent's failed/timeout/stopped TaskResult that you didn't\",\n ' respond to with a fresh attempt (different role, different model,',\n ' tighter prompt).',\n '',\n 'PERSISTENCE PROTOCOL:',\n '- If blocked, try at least 3 different angles before reporting the',\n ' problem to the user. Different tool inputs, different subagent',\n ' roles, different providers, different decomposition of the task.',\n '- If a tool fails, read its error, alter the input, try again. Do',\n ' not just report the failure back.',\n '- If a subagent returns useless output, respawn with a tighter prompt',\n ' or a different role. Do not accept \"I could not determine…\" as the',\n ' final answer.',\n \"- Use `ask_subagent` for one-shot questions when you don't need a\",\n ' full delegated task.',\n '',\n 'REPORTING:',\n '- Stream short progress notes between major actions so the user can',\n ' monitor. Do not go silent for 50 tool calls then dump a wall of',\n ' text — but also do not narrate every tool call.',\n '- Use the shared scratchpad (if available) to leave breadcrumbs',\n ' subagents can read.',\n '- Final response must include: (a) what was accomplished, (b) how',\n ' to verify, (c) any caveats (residual TODOs, things the user',\n ' should know about).',\n '',\n 'BEGIN.]',\n ].join('\\n');\n}\n","import { ProviderError } from '../types/provider.js';\nimport type { RetryPolicy } from '../types/retry-policy.js';\n\nexport class DefaultRetryPolicy implements RetryPolicy {\n private static readonly NETWORK_ERR_RE =\n /ECONN|ETIMEDOUT|ETIME|ENOTFOUND|EAI_AGAIN|fetch failed/i;\n\n shouldRetry(err: Error | ProviderError, attempt: number): boolean {\n if (err instanceof ProviderError) {\n if (!err.retryable) return false;\n return attempt < this.maxAttempts(err);\n }\n const msg = err.message ?? '';\n const isNetwork = DefaultRetryPolicy.NETWORK_ERR_RE.test(msg);\n if (isNetwork) return attempt < 2;\n return false;\n }\n\n maxAttempts(err: Error | ProviderError): number {\n if (err instanceof ProviderError) {\n if (err.status === 429) return 5;\n if (err.status === 529) return 3;\n if (err.status >= 500) return 3;\n return 0;\n }\n return 2;\n }\n\n delayMs(attempt: number): number {\n const base = 1000;\n const exp = base * 2 ** attempt;\n const jitter = Math.random() * base;\n return Math.min(30_000, exp + jitter);\n }\n}\n","import type { Context } from '../core/context.js';\nimport type { ErrorHandler, RecoveryDecision } from '../types/error-handler.js';\nimport { ProviderError } from '../types/provider.js';\n\nimport type { Compactor } from '../types/compactor.js';\nimport type { ModelsRegistry } from '../types/models-registry.js';\n\n/**\n * Tiered error recovery strategies.\n * Each strategy is attempted in order until one returns a decision.\n */\nexport interface RecoveryStrategy {\n /** Human-readable label for logs. */\n label: string;\n /** Optional compactor for context_overflow recovery. */\n compactor?: Compactor;\n /** Returns an explicit recovery decision, or null to fall through. */\n attempt: (err: unknown, ctx: Context) => Promise<RecoveryDecision | null>;\n}\n\n// Package-level compiled regex for hot paths — avoids repeated compilation.\nconst CONTEXT_OVERFLOW_RE = /context|too long|tokens/i;\nconst NETWORK_ERR_RE = /ECONN|ETIMEDOUT|ETIME|ENOTFOUND|EAI_AGAIN|fetch failed/i;\n\n/**\n * Builds the ordered list of recovery strategies used by DefaultErrorHandler.\n * Exported so callers can customise or extend the strategy chain.\n */\nexport function buildRecoveryStrategies(opts?: {\n compactor?: Compactor;\n modelsRegistry?: ModelsRegistry;\n}): RecoveryStrategy[] {\n return [\n {\n label: 'context_overflow_reduce',\n compactor: opts?.compactor,\n async attempt(err, ctx) {\n if (!(err instanceof ProviderError)) return null;\n if (err.status !== 413 && !CONTEXT_OVERFLOW_RE.test(err.message)) return null;\n\n if (this.compactor) {\n try {\n const report = await this.compactor.compact(ctx, { aggressive: true });\n if (report.after < report.before) {\n return { action: 'retry', reason: 'context_compacted' };\n }\n } catch {\n // compact failed; fall through\n }\n }\n return null;\n },\n },\n {\n label: 'rate_limit_backoff',\n async attempt(err) {\n if (!(err instanceof ProviderError) || err.status !== 429) return null;\n\n // Prefer the parsed Retry-After hint the provider extracted into\n // body.retryAfterMs; fall back to 5s when absent.\n const delayMs = err.body?.retryAfterMs ?? 5_000;\n // Clamp between 1s and 60s.\n const delay = Math.min(60_000, Math.max(1_000, delayMs));\n await new Promise((r) => setTimeout(r, delay));\n return { action: 'retry', reason: 'rate_limit_backoff' };\n },\n },\n {\n label: 'downgrade_model',\n async attempt(err, ctx) {\n if (!(err instanceof ProviderError)) return null;\n if (err.status !== 429 && err.status !== 529 && err.status < 500) return null;\n\n const registry = opts?.modelsRegistry;\n if (!registry) return null;\n\n try {\n const providerId = ctx.provider?.id;\n if (!providerId) return null;\n const provider = await registry.getProvider(providerId);\n if (!provider) return null;\n\n const currentModel = await registry.getModel(providerId, ctx.model);\n if (!currentModel) return null;\n\n // Find a cheaper fallback model with the same capabilities.\n // Prefer models with lower input cost, preferring the same family.\n const candidates = provider.models.filter((m) => {\n const modelCost = m.cost?.input ?? Number.POSITIVE_INFINITY;\n const currentCost = currentModel.cost?.input ?? Number.POSITIVE_INFINITY;\n if (modelCost >= currentCost) return false;\n if (currentModel.capabilities.tools && !m.tool_call) return false;\n if (currentModel.capabilities.vision && !m.modalities?.input?.includes('image'))\n return false;\n return true;\n });\n\n if (candidates.length === 0) return null;\n\n const fallback = candidates.reduce((prev, curr) =>\n (curr.cost?.input ?? 0) < (prev.cost?.input ?? 0) ? curr : prev,\n );\n\n return {\n action: 'retry',\n reason: 'model_downgrade',\n model: fallback.id,\n };\n } catch {\n return null;\n }\n },\n },\n ];\n}\n\nexport const DEFAULT_RECOVERY_STRATEGIES = buildRecoveryStrategies();\n\nexport class DefaultErrorHandler implements ErrorHandler {\n private readonly strategies: RecoveryStrategy[];\n\n constructor(strategies: RecoveryStrategy[] = DEFAULT_RECOVERY_STRATEGIES) {\n this.strategies = strategies;\n }\n\n classify(err: unknown): {\n kind:\n | 'rate_limit'\n | 'overloaded'\n | 'server'\n | 'client'\n | 'network'\n | 'abort'\n | 'context_overflow'\n | 'unknown';\n retryable: boolean;\n } {\n // AbortError can be thrown in both browser (DOMException) and Node (Error).\n // Guard with typeof check so Node builds don't reference the browser-only DOMException.\n if (\n typeof DOMException !== 'undefined' &&\n err instanceof DOMException &&\n err.name === 'AbortError'\n ) {\n return { kind: 'abort', retryable: false };\n }\n if (err instanceof Error && err.name === 'AbortError') {\n return { kind: 'abort', retryable: false };\n }\n if (err instanceof ProviderError) {\n if (err.status === 429) return { kind: 'rate_limit', retryable: true };\n if (err.status === 529) return { kind: 'overloaded', retryable: true };\n if (err.status >= 500) return { kind: 'server', retryable: true };\n if (err.status === 413 || CONTEXT_OVERFLOW_RE.test(err.message)) {\n return { kind: 'context_overflow', retryable: false };\n }\n if (err.status >= 400) return { kind: 'client', retryable: false };\n }\n if (err instanceof Error && NETWORK_ERR_RE.test(err.message)) {\n return { kind: 'network', retryable: true };\n }\n return { kind: 'unknown', retryable: false };\n }\n\n async recover(err: unknown, ctx: Context): Promise<RecoveryDecision | null> {\n for (const strategy of this.strategies) {\n const result = await strategy.attempt(err, ctx);\n if (result !== null) return result;\n }\n return null;\n }\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { SkillEntry, SkillLoader, SkillManifest } from '../types/skill.js';\nimport type { WstackPaths } from '../utils/wstack-paths.js';\n\nexport interface SkillLoaderOptions {\n paths: WstackPaths;\n bundledDir?: string;\n}\n\n/**\n * Discovery order (later layers shadow earlier ones at boot, but we walk\n * highest priority first and skip names already seen):\n * 1. Project-committed: <project>/.wrongstack/skills/\n * 2. User-global: ~/.wrongstack/skills/\n * 3. Bundled with build: packages/core/skills/\n */\nexport class DefaultSkillLoader implements SkillLoader {\n private readonly dirs: { dir: string; source: SkillManifest['source'] }[];\n private cache?: SkillManifest[];\n\n constructor(opts: SkillLoaderOptions) {\n this.dirs = [\n { dir: opts.paths.inProjectSkills, source: 'project' },\n { dir: opts.paths.globalSkills, source: 'user' },\n ];\n if (opts.bundledDir) {\n this.dirs.push({ dir: opts.bundledDir, source: 'bundled' });\n }\n }\n\n async list(): Promise<SkillManifest[]> {\n if (this.cache) return this.cache;\n const found: SkillManifest[] = [];\n const seen = new Set<string>();\n for (const { dir, source } of this.dirs) {\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n for (const e of entries) {\n if (!e.isDirectory()) continue;\n const skillFile = path.join(dir, e.name, 'SKILL.md');\n try {\n const raw = await fs.readFile(skillFile, 'utf8');\n const meta = parseFrontmatter(raw);\n if (!meta.name || !meta.description) continue;\n if (seen.has(meta.name)) continue;\n seen.add(meta.name);\n found.push({\n name: meta.name,\n description: meta.description,\n version: meta.version,\n path: skillFile,\n source,\n });\n } catch {\n // skip malformed skill\n }\n }\n } catch {\n // directory may not exist\n }\n }\n this.cache = found;\n return found;\n }\n\n async find(name: string): Promise<SkillManifest | undefined> {\n const all = await this.list();\n return all.find((s) => s.name === name);\n }\n\n async manifestText(): Promise<string> {\n const skills = await this.list();\n if (skills.length === 0) return '';\n const entries = await this.listEntries();\n const lines = ['## Available skills'];\n for (const e of entries) {\n const scopeTag = e.scope.length > 0 ? ` — ${e.scope.slice(0, 3).join(', ')}` : '';\n lines.push(`- **${e.name}**${scopeTag}`);\n lines.push(` Use when: ${e.trigger}`);\n }\n return lines.join('\\n');\n }\n\n async listEntries(): Promise<SkillEntry[]> {\n const skills = await this.list();\n const entries: SkillEntry[] = [];\n for (const s of skills) {\n try {\n const raw = await fs.readFile(s.path, 'utf8');\n const { trigger, scope } = parseDescription(raw);\n entries.push({ name: s.name, trigger, scope, source: s.source, path: s.path });\n } catch {\n // skip\n }\n }\n return entries;\n }\n\n invalidateCache(): void {\n this.cache = undefined;\n }\n\n async readBody(name: string): Promise<string> {\n const m = await this.find(name);\n if (!m) throw new Error(`Skill \"${name}\" not found`);\n return fs.readFile(m.path, 'utf8');\n }\n}\n\ninterface Frontmatter {\n name?: string;\n description?: string;\n version?: string;\n}\n\nfunction parseFrontmatter(raw: string): Frontmatter {\n if (!raw.startsWith('---')) return {};\n const end = raw.indexOf('\\n---', 4);\n if (end === -1) return {};\n const block = raw.slice(4, end);\n const out: Frontmatter = {};\n let key: keyof Frontmatter | null = null;\n let value: string[] = [];\n const flush = () => {\n if (key) {\n out[key] = value.join('\\n').trim();\n }\n key = null;\n value = [];\n };\n for (const line of block.split('\\n')) {\n const m = /^([a-zA-Z_]+):\\s*(\\|?)\\s*(.*)$/.exec(line);\n if (m) {\n flush();\n key = (m[1] ?? '') as keyof Frontmatter;\n const pipe = m[2];\n const rest = m[3] ?? '';\n if (pipe === '|') {\n value = [];\n } else if (rest) {\n value = [rest];\n } else {\n value = [];\n }\n } else if (key) {\n value.push(line.replace(/^\\s+/, ''));\n }\n }\n flush();\n return out;\n}\n\n/**\n * Parse skill description into:\n * - trigger: extracted \"Use when...\" sentence (first sentence of description)\n * - scope: comma-separated items from first line's parenthetical or file-ext list\n */\nfunction parseDescription(raw: string): { trigger: string; scope: string[] } {\n const fm = parseFrontmatter(raw);\n const desc = fm.description ?? '';\n\n // Extract first sentence as trigger\n const firstSentenceEnd = desc.indexOf('. ');\n const trigger =\n firstSentenceEnd !== -1\n ? desc.slice(0, firstSentenceEnd + 1).trim()\n : (desc.trim().split('\\n')[0] ?? '');\n\n // Extract scope from parenthetical: \"Covers X, Y, and Z\" or \"for A, B, C\"\n const scope: string[] = [];\n const coversMatch = /(?:covers|for|including)\\s+([^.]+)/i.exec(desc);\n if (coversMatch) {\n const items = coversMatch[1]!\n .replace(/[·•]/g, ',')\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n scope.push(...items);\n }\n\n return { trigger, scope };\n}\n"]}
1
+ {"version":3,"sources":["../../src/utils/token-estimate.ts","../../src/utils/message-invariants.ts","../../src/execution/compactor.ts","../../src/types/blocks.ts","../../src/execution/intelligent-compactor.ts","../../src/models/llm-selector.ts","../../src/execution/selective-compactor.ts","../../src/types/errors.ts","../../src/execution/auto-compaction-middleware.ts","../../src/utils/tool-output-serializer.ts","../../src/execution/tool-executor.ts","../../src/utils/regex-guard.ts","../../src/execution/autonomous-runner.ts","../../src/utils/atomic-write.ts","../../src/storage/goal-store.ts","../../src/execution/eternal-autonomy.ts","../../src/coordination/subagent-budget.ts","../../src/coordination/agent-subagent-runner.ts","../../src/types/provider.ts","../../src/coordination/fleet.ts","../../src/coordination/multi-agent-coordinator.ts","../../src/execution/parallel-eternal-engine.ts","../../src/execution/autonomy-prompt-contributor.ts","../../src/execution/goal-preamble.ts","../../src/execution/regex-patterns.ts","../../src/execution/retry-policy.ts","../../src/execution/error-handler.ts","../../src/execution/skill-loader.ts"],"names":["hasToolUse","repair","afterTokens","stat","path2","fsp","unlink","baseMessage","sleep","GOAL_COMPLETE_MARKER","randomUUID","execFile","promisify","execFileP","fs2","path3"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Shared token estimation with JSON.stringify caching.\n * Avoids repeated stringification of tool input objects.\n */\n\nconst RoughTokenEstimate = (text: string, charsPerToken = 3.5): number =>\n Math.max(1, Math.ceil(text.length / charsPerToken));\n\n/**\n * Cache of computed estimates keyed by the stringified input — not the\n * input object itself. Previously the cache was keyed by the input object\n * via WeakMap, but JSON.stringify() produces a new object reference each\n * call so the cache never hit. Now we use a Map with string keys so that\n * repeated stringifications of the same structure share a single entry.\n */\nconst ESTIMATE_CACHE = new Map<string, number>();\n\nconst ESTIMATE_CACHE_MAX_SIZE = 10_000;\n\nfunction getCachedEstimate(key: string, compute: () => number): number {\n const existing = ESTIMATE_CACHE.get(key);\n if (existing !== undefined) return existing;\n if (ESTIMATE_CACHE.size >= ESTIMATE_CACHE_MAX_SIZE) {\n // Evict oldest quarter when at capacity — simple LRU-ish policy.\n const keys = [...ESTIMATE_CACHE.keys()];\n for (let i = 0; i < Math.floor(ESTIMATE_CACHE_MAX_SIZE / 4); i++) {\n ESTIMATE_CACHE.delete(keys[i]!);\n }\n }\n const estimate = compute();\n ESTIMATE_CACHE.set(key, estimate);\n return estimate;\n}\n\n/**\n * Estimate tokens for a tool_use block input.\n * Caches the stringified result keyed by the stable string representation\n * to avoid repeated JSON.stringify calls during context window checks.\n */\nexport function estimateToolInputTokens(input: unknown): number {\n if (typeof input === 'string') return RoughTokenEstimate(input);\n if (input === null || typeof input !== 'object') {\n return RoughTokenEstimate(String(input));\n }\n const key = JSON.stringify(input);\n return getCachedEstimate(key, () => RoughTokenEstimate(key));\n}\n\n/**\n * Estimate tokens for a tool_result content.\n */\nexport function estimateToolResultTokens(content: string | unknown): number {\n if (typeof content === 'string') return RoughTokenEstimate(content);\n const key = JSON.stringify(content);\n return getCachedEstimate(key, () => RoughTokenEstimate(key));\n}\n\n/**\n * Estimate tokens for a text block.\n */\nexport function estimateTextTokens(text: string): number {\n return RoughTokenEstimate(text);\n}\n\n/**\n * Rough estimate of tokens in a tool definition (name + description + schema).\n * Accounts for the JSON-serialized inputSchema which is sent to the API\n * but NOT included in roughEstimate(content).\n */\nexport function estimateToolDefTokens(tool: { name: string; description?: string; inputSchema: unknown }): number {\n return RoughTokenEstimate(tool.name) +\n RoughTokenEstimate(tool.description ?? '') +\n RoughTokenEstimate(JSON.stringify(tool.inputSchema));\n}\n\n/**\n * Estimate the total API request token count: system prompt + tool definitions\n * + conversation messages. Use this for context-window bar calculations\n * instead of roughEstimate (which only counts messages).\n *\n * The overhead ratio (overhead / messages) varies by conversation length:\n * - Short conversations (< 10 messages): ~30-50% overhead (large system+tools)\n * - Medium (10-50 messages): ~15-30%\n * - Long (> 50 messages): ~5-15%\n *\n * Returns { messages, systemPrompt, tools, total } for debugging display.\n */\nexport interface RequestTokenBreakdown {\n messages: number;\n systemPrompt: number;\n tools: number;\n total: number;\n}\n\nexport function estimateRequestTokens(\n messages: unknown,\n systemPrompt: unknown,\n tools: { name: string; description?: string; inputSchema: unknown }[],\n): RequestTokenBreakdown {\n // Messages: apply the same logic as roughEstimate\n let messagesTokens = 0;\n if (typeof messages === 'string') {\n messagesTokens = RoughTokenEstimate(messages);\n } else if (Array.isArray(messages)) {\n for (const m of messages) {\n if (typeof m === 'object' && m !== null && 'content' in m) {\n const content = (m as { content: unknown }).content;\n if (typeof content === 'string') {\n messagesTokens += RoughTokenEstimate(content);\n } else if (Array.isArray(content)) {\n for (const b of content) {\n if (typeof b === 'object' && b !== null) {\n if ((b as { type?: string }).type === 'text') {\n messagesTokens += RoughTokenEstimate((b as { text: string }).text);\n } else {\n messagesTokens += RoughTokenEstimate(JSON.stringify(b));\n }\n }\n }\n }\n }\n }\n }\n\n // System prompt\n let systemTokens = 0;\n if (typeof systemPrompt === 'string') {\n systemTokens = RoughTokenEstimate(systemPrompt);\n } else if (Array.isArray(systemPrompt)) {\n for (const b of systemPrompt) {\n if (typeof b === 'object' && b !== null && (b as { type?: string }).type === 'text') {\n systemTokens += RoughTokenEstimate((b as { text: string }).text);\n }\n }\n }\n\n // Tool definitions\n let toolsTokens = 0;\n for (const t of tools) {\n toolsTokens += estimateToolDefTokens(t);\n }\n\n return {\n messages: messagesTokens,\n systemPrompt: systemTokens,\n tools: toolsTokens,\n total: messagesTokens + systemTokens + toolsTokens,\n };\n}\n","import type { ContentBlock, ToolResultBlock, ToolUseBlock } from '../types/blocks.js';\nimport type { Message } from '../types/messages.js';\n\nexport interface MessageRepairReport {\n changed: boolean;\n removedToolUses: string[];\n removedToolResults: string[];\n removedMessages: number;\n}\n\nexport interface MessageRepairResult {\n messages: Message[];\n report: MessageRepairReport;\n}\n\n/**\n * Repair provider-level tool-call adjacency invariants.\n *\n * Anthropic requires every assistant `tool_use` block to have a matching\n * `tool_result` block in the immediately following user message. Manual\n * context surgery (summary/prune) can cut through the middle of such an\n * exchange. This function removes only the now-orphaned protocol blocks,\n * preserving surrounding text/images/thinking blocks where possible.\n */\nexport function repairToolUseAdjacency(messages: Message[]): MessageRepairResult {\n const removedToolUses: string[] = [];\n const removedToolResults: string[] = [];\n let removedMessages = 0;\n let changed = false;\n const out: Message[] = [];\n\n for (let i = 0; i < messages.length; i++) {\n const original = messages[i]!;\n let msg = original;\n\n if (hasToolUse(msg)) {\n const nextIds = toolResultIds(messages[i + 1]);\n const filtered = mapContent(msg, (blocks) => {\n const next: ContentBlock[] = [];\n for (const block of blocks) {\n if (block.type === 'tool_use' && !nextIds.has(block.id)) {\n removedToolUses.push(block.id);\n changed = true;\n continue;\n }\n next.push(block);\n }\n return next;\n });\n msg = filtered ?? msg;\n }\n\n if (hasToolResult(msg)) {\n const allowed = toolUseIds(out[out.length - 1]);\n const filtered = mapContent(msg, (blocks) => {\n const next: ContentBlock[] = [];\n for (const block of blocks) {\n if (block.type === 'tool_result' && !allowed.has(block.tool_use_id)) {\n removedToolResults.push(block.tool_use_id);\n changed = true;\n continue;\n }\n next.push(block);\n }\n return next;\n });\n msg = filtered ?? msg;\n }\n\n if (isEmptyMessage(msg)) {\n removedMessages++;\n changed = true;\n continue;\n }\n out.push(msg);\n }\n\n return {\n messages: changed ? out : messages,\n report: { changed, removedToolUses, removedToolResults, removedMessages },\n };\n}\n\nfunction hasToolUse(msg: Message | undefined): boolean {\n return contentBlocks(msg).some((b): b is ToolUseBlock => b.type === 'tool_use');\n}\n\nfunction hasToolResult(msg: Message | undefined): boolean {\n return contentBlocks(msg).some((b): b is ToolResultBlock => b.type === 'tool_result');\n}\n\nfunction toolUseIds(msg: Message | undefined): Set<string> {\n const ids = new Set<string>();\n if (!msg || msg.role !== 'assistant') return ids;\n for (const block of contentBlocks(msg)) {\n if (block.type === 'tool_use') ids.add(block.id);\n }\n return ids;\n}\n\nfunction toolResultIds(msg: Message | undefined): Set<string> {\n const ids = new Set<string>();\n if (!msg || msg.role !== 'user') return ids;\n for (const block of contentBlocks(msg)) {\n if (block.type === 'tool_result') ids.add(block.tool_use_id);\n }\n return ids;\n}\n\nfunction contentBlocks(msg: Message | undefined): ContentBlock[] {\n return msg && Array.isArray(msg.content) ? msg.content : [];\n}\n\nfunction mapContent(\n msg: Message,\n fn: (blocks: ContentBlock[]) => ContentBlock[],\n): Message | null {\n if (!Array.isArray(msg.content)) return msg;\n const next = fn(msg.content);\n if (next.length === msg.content.length && next.every((b, idx) => b === msg.content[idx])) {\n return msg;\n }\n return { ...msg, content: next };\n}\n\nfunction isEmptyMessage(msg: Message): boolean {\n if (typeof msg.content === 'string') return msg.content.trim().length === 0;\n return msg.content.length === 0;\n}\n","import type { Context } from '../core/context.js';\nimport type { ContentBlock, ToolResultBlock } from '../types/blocks.js';\nimport type { CompactReport, Compactor } from '../types/compactor.js';\nimport type { ContextWindowPolicy } from '../types/context-window.js';\nimport type { Message } from '../types/messages.js';\nimport {\n estimateTextTokens,\n estimateToolInputTokens,\n estimateToolResultTokens,\n} from '../utils/token-estimate.js';\nimport { repairToolUseAdjacency } from '../utils/message-invariants.js';\n\nexport interface CompactorOptions {\n preserveK?: number;\n eliseThreshold?: number;\n estimator?: (text: string) => number;\n}\n\n/**\n * Default tools config values shared across CLI and WebUI.\n * Import this instead of hardcoding to avoid cross-surface inconsistencies.\n * These mirror the values in BEHAVIOR_DEFAULTS (config-loader.ts).\n *\n * @deprecated Import from '../types/default-config.js' instead.\n * This re-export exists for backward compatibility.\n */\nexport { DEFAULT_TOOLS_CONFIG, DEFAULT_CONTEXT_CONFIG } from '../types/default-config.js';\n\nexport class HybridCompactor implements Compactor {\n private readonly preserveK: number;\n private readonly eliseThreshold: number;\n private readonly estimator: (text: string) => number;\n\n constructor(opts: CompactorOptions = {}) {\n this.preserveK = opts.preserveK ?? 5;\n this.eliseThreshold = opts.eliseThreshold ?? 2000;\n this.estimator = opts.estimator ?? estimateTextTokens;\n }\n\n async compact(ctx: Context, opts: { aggressive?: boolean } = {}): Promise<CompactReport> {\n const beforeTokens = this.estimateMessages(ctx.messages);\n const reductions: CompactReport['reductions'] = [];\n const policy = readContextWindowPolicy(ctx);\n const preserveK = policy?.preserveK ?? this.preserveK;\n const eliseThreshold = policy?.eliseThreshold ?? this.eliseThreshold;\n\n // Phase 1: elision\n const phase1Saved = this.eliseOldToolResults(ctx, preserveK, eliseThreshold);\n if (phase1Saved > 0) reductions.push({ phase: 'elision', saved: phase1Saved });\n\n // Phase 2: summary (placeholder; in production calls sub-LLM)\n if (opts.aggressive) {\n const phase2Saved = this.collapseAncientTurns(ctx, preserveK);\n if (phase2Saved > 0) reductions.push({ phase: 'summary', saved: phase2Saved });\n }\n\n const repaired = repairToolUseAdjacency(ctx.messages);\n if (repaired.report.changed) {\n ctx.state.replaceMessages(repaired.messages);\n }\n\n const afterTokens = this.estimateMessages(ctx.messages);\n return {\n before: beforeTokens,\n after: afterTokens,\n reductions,\n repaired: repaired.report.changed\n ? {\n removedToolUses: repaired.report.removedToolUses,\n removedToolResults: repaired.report.removedToolResults,\n removedMessages: repaired.report.removedMessages,\n }\n : undefined,\n };\n }\n\n private eliseOldToolResults(\n ctx: Context,\n preserveK = this.preserveK,\n eliseThreshold = this.eliseThreshold,\n ): number {\n const messages = ctx.messages;\n // Walk backwards counting (user + assistant) pairs to determine where\n // the preservation window really starts. This is more accurate than\n // the fixed multiplier which assumes every turn is 1 message pair.\n let pairCount = 0;\n let preserveStart = messages.length;\n for (let i = messages.length - 1; i >= 0 && pairCount < preserveK; i--) {\n const m = messages[i];\n if (!m) continue;\n if (m.role === 'user' || m.role === 'assistant') {\n pairCount++;\n preserveStart = i;\n }\n }\n\n // Ensure tool_use/tool_result protocol pairs are preserved together.\n // Walk forward through the preserved window: if an assistant message\n // at or after preserveStart contains a tool_use, also preserve the\n // immediately following message (the tool_result) so neither is elided.\n for (let i = preserveStart; i < messages.length; i++) {\n const m = messages[i];\n if (!m || typeof m.content === 'string' || !Array.isArray(m.content)) continue;\n const hasToolUse = m.content.some((b) => b.type === 'tool_use');\n if (hasToolUse && i + 1 < messages.length) {\n const next = messages[i + 1];\n if (\n next &&\n next.role === 'user' &&\n typeof next.content !== 'string' &&\n Array.isArray(next.content) &&\n next.content.some((b) => b.type === 'tool_result')\n ) {\n // Extend preserveStart to cover the tool_result as well so\n // the protocol pair stays complete and readable.\n preserveStart = i + 1;\n }\n }\n }\n\n let saved = 0;\n let changed = false;\n const nextMessages = new Array(messages.length);\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n // Only process messages before the preservation window\n if (i >= preserveStart) {\n nextMessages[i] = msg;\n continue;\n }\n if (!msg || !Array.isArray(msg.content)) {\n nextMessages[i] = msg;\n continue;\n }\n const newContent: ContentBlock[] = msg.content.map((b) => {\n if (b.type !== 'tool_result') return b;\n const tokens = estimateToolResultTokens(b.content);\n if (tokens < eliseThreshold) return b;\n saved += tokens;\n const elided: ToolResultBlock = {\n type: 'tool_result',\n tool_use_id: b.tool_use_id,\n content: `[elided: ~${tokens} tokens]`,\n is_error: b.is_error,\n };\n return elided;\n });\n // Check whether any block actually changed by reference equality\n if (\n newContent.length === msg.content.length &&\n newContent.every((b, idx) => b === msg.content[idx])\n ) {\n nextMessages[i] = msg;\n } else {\n nextMessages[i] = { ...msg, content: newContent };\n changed = true;\n }\n }\n if (changed) ctx.state.replaceMessages(nextMessages);\n return saved;\n }\n\n private collapseAncientTurns(ctx: Context, preserveK = this.preserveK): number {\n const messages = ctx.messages;\n const cutTarget = Math.max(0, messages.length - preserveK * 2);\n if (cutTarget <= 0) return 0;\n\n // Find a safe boundary: nearest user-message-with-text at or after cutTarget\n let boundary = -1;\n for (let i = cutTarget; i < messages.length; i++) {\n const m = messages[i];\n if (!m) continue;\n if (m.role === 'user' && hasTextContent(m)) {\n boundary = i;\n break;\n }\n }\n if (boundary <= 0) return 0;\n\n const removed = messages.slice(0, boundary);\n const removedTokens = this.estimateMessages(removed);\n\n const summary: Message[] = [\n {\n role: 'user',\n content: `[previous_session_summary: ${removed.length} earlier turns compacted. Todo state preserved in context.]`,\n },\n { role: 'assistant', content: 'Continuing from compacted context.' },\n ];\n\n // L1-A: route through ConversationState so subscribers see the rewrite.\n const tail = ctx.messages.slice(boundary);\n ctx.state.replaceMessages([...summary, ...tail]);\n return Math.max(0, removedTokens - this.estimateMessages(summary));\n }\n\n private estimateMessages(messages: Message[]): number {\n let total = 0;\n for (const m of messages) {\n if (typeof m.content === 'string') {\n total += this.estimator(m.content);\n } else {\n for (const b of m.content) {\n if (b.type === 'text') total += this.estimator(b.text);\n else if (b.type === 'tool_use') total += estimateToolInputTokens(b.input);\n else if (b.type === 'tool_result') total += estimateToolResultTokens(b.content);\n }\n }\n }\n return total;\n }\n}\n\nfunction readContextWindowPolicy(ctx: Context): ContextWindowPolicy | null {\n const policy = ctx.meta?.['contextWindowPolicy'];\n if (!policy || typeof policy !== 'object') return null;\n const candidate = policy as Partial<ContextWindowPolicy>;\n if (\n typeof candidate.preserveK !== 'number' ||\n typeof candidate.eliseThreshold !== 'number'\n ) {\n return null;\n }\n return candidate as ContextWindowPolicy;\n}\n\nfunction hasTextContent(m: Message): boolean {\n if (typeof m.content === 'string') return m.content.trim().length > 0;\n return m.content.some((b) => b.type === 'text' && b.text.trim().length > 0);\n}\n","export interface TextBlock {\n type: 'text';\n text: string;\n cache_control?: { type: 'ephemeral' };\n}\n\nexport interface ToolUseBlock {\n type: 'tool_use';\n id: string;\n name: string;\n input: Record<string, unknown>;\n /**\n * Provider-specific opaque metadata captured from the wire response.\n * Echoed back verbatim in the next request so providers that bind\n * extra state to function calls keep working. Example: Gemini's\n * `thoughtSignature` — required for tool-use turns with thinking\n * models, otherwise the next request fails with 400 \"Function call\n * is missing a thought_signature in functionCall parts\".\n *\n * Keys are namespaced by intent so multiple wires can coexist:\n * - `google.thoughtSignature` — Gemini signed-thought blob\n * Other providers can add their own keys without colliding.\n */\n providerMeta?: Record<string, unknown>;\n}\n\nexport interface ToolResultBlock {\n type: 'tool_result';\n tool_use_id: string;\n /**\n * The original tool name. Useful for providers like Google Gemini that\n * need the tool name in `functionResponse.name` — the tool_use_id is\n * only a session-local identifier and is not stable across replays.\n * Always set by ToolExecutor; may be absent on manually-constructed blocks.\n */\n name?: string;\n content: string;\n is_error?: boolean;\n}\n\nexport interface ImageBlock {\n type: 'image';\n source: {\n type: 'base64' | 'url';\n media_type?: string;\n data?: string;\n url?: string;\n };\n}\n\n/**\n * Chain-of-thought / extended-thinking content emitted by the model.\n *\n * Both Anthropic extended thinking (`{type:'thinking', thinking, signature}`)\n * and DeepSeek reasoning mode (top-level `reasoning_content` on the assistant\n * message) require this content to be echoed back verbatim on the next\n * request, otherwise the provider returns 400:\n * - Anthropic: \"The `content[].thinking` in the thinking mode must be passed back\"\n * - DeepSeek: \"The `reasoning_content` in the thinking mode must be passed back\"\n *\n * `signature` is Anthropic-specific (an opaque integrity blob). DeepSeek\n * doesn't issue a signature — the field is absent for that provider.\n *\n * Per Anthropic, thinking blocks MUST appear before any text/tool_use blocks\n * in an assistant message. Stream builders preserve that order.\n */\nexport interface ThinkingBlock {\n type: 'thinking';\n thinking: string;\n signature?: string;\n providerMeta?: Record<string, unknown>;\n}\n\nexport type ContentBlock = TextBlock | ToolUseBlock | ToolResultBlock | ImageBlock | ThinkingBlock;\n\nexport function isTextBlock(b: ContentBlock): b is TextBlock {\n return b.type === 'text';\n}\nexport function isToolUseBlock(b: ContentBlock): b is ToolUseBlock {\n return b.type === 'tool_use';\n}\nexport function isToolResultBlock(b: ContentBlock): b is ToolResultBlock {\n return b.type === 'tool_result';\n}\nexport function isImageBlock(b: ContentBlock): b is ImageBlock {\n return b.type === 'image';\n}\nexport function isThinkingBlock(b: ContentBlock): b is ThinkingBlock {\n return b.type === 'thinking';\n}\n","import type { Context } from '../core/context.js';\nimport type { ContentBlock, TextBlock } from '../types/blocks.js';\nimport { isTextBlock } from '../types/blocks.js';\nimport type { CompactReport, Compactor } from '../types/compactor.js';\nimport type { Message } from '../types/messages.js';\nimport type { Provider, Request } from '../types/provider.js';\nimport {\n estimateTextTokens,\n estimateToolInputTokens,\n estimateToolResultTokens,\n} from '../utils/token-estimate.js';\nimport { repairToolUseAdjacency } from '../utils/message-invariants.js';\n\n/**\n * Options for IntelligentCompactor.\n */\nexport interface IntelligentCompactorOptions {\n /** Provider to use for LLM-assisted summarization. Required. */\n provider: Provider;\n /** Fraction of maxContext that triggers a warning (default 0.6). */\n warnThreshold?: number;\n /** Fraction of maxContext that triggers soft compaction (default 0.75). */\n softThreshold?: number;\n /** Fraction of maxContext that triggers hard compaction (default 0.9). */\n hardThreshold?: number;\n /** Max context window in tokens (used only for threshold fraction math). */\n maxContext?: number;\n /** How many recent (user+assistant) pairs to always preserve (default 4). */\n preserveK?: number;\n /** Token threshold below which tool results are not elided (default 500). */\n eliseThreshold?: number;\n /** System prompt for the summarizer sub-LLM. */\n summarizerPrompt?: string;\n /**\n * Model ID to use for summarization. When not set, the same model as the\n * agent is used (which risks cascading failure on context overflow). Set to\n * a fast/cheap model like `claude-3-5-haiku-20240620` for resilience.\n */\n summarizerModel?: string;\n}\n\n/**\n * An importance label for a message or message range.\n */\nexport type Importance = 'critical' | 'high' | 'medium' | 'low';\n\n/**\n * Result of importance analysis.\n */\nexport interface ImportanceAnalysis {\n messages: Array<{ index: number; importance: Importance; reason: string }>;\n criticalRanges: Array<{ from: number; to: number; summary: string }>;\n}\n\n/**\n * IntelligentCompactor uses an LLM to:\n * - Analyze message importance and preserve critical context\n * - Generate semantic summaries for old message ranges\n * - Make intelligent decisions about what to compact\n *\n * It extends HybridCompactor's elision logic with LLM-assisted summarization.\n */\nexport class IntelligentCompactor implements Compactor {\n private readonly provider: Provider;\n private readonly warnThreshold: number;\n private readonly softThreshold: number;\n private readonly hardThreshold: number;\n private readonly maxContext: number;\n private readonly preserveK: number;\n private readonly eliseThreshold: number;\n private readonly summarizerPrompt: string;\n private readonly summarizerModel?: string;\n\n constructor(opts: IntelligentCompactorOptions) {\n this.provider = opts.provider;\n this.warnThreshold = opts.warnThreshold ?? 0.6;\n this.softThreshold = opts.softThreshold ?? 0.75;\n this.hardThreshold = opts.hardThreshold ?? 0.9;\n this.maxContext = opts.maxContext ?? 128_000;\n this.preserveK = opts.preserveK ?? 4;\n this.eliseThreshold = opts.eliseThreshold ?? 500;\n this.summarizerPrompt =\n opts.summarizerPrompt ??\n 'You are a context summarizer. Given a list of conversation messages, produce a concise but complete summary that preserves all factual information, decisions made, and any state changes (e.g. file edits, todo updates). Do not add commentary. Output only the summary.';\n this.summarizerModel = opts.summarizerModel;\n }\n\n async compact(ctx: Context, opts: { aggressive?: boolean } = {}): Promise<CompactReport> {\n const beforeTokens = this.estimateTokens(ctx.messages);\n const reductions: CompactReport['reductions'] = [];\n\n const load = beforeTokens / this.maxContext;\n // Past hardThreshold, force aggressive regardless of caller preference —\n // the alternative (lightweight elision) is unlikely to recover enough.\n const aggressive =\n load >= this.hardThreshold ? true : (opts.aggressive ?? load >= this.softThreshold);\n\n // Phase 1: always run elision (preserves recent K pairs)\n const saved1 = this.eliseOldToolResults(ctx);\n if (saved1 > 0) reductions.push({ phase: 'elision', saved: saved1 });\n\n // Phase 2: LLM summarization of ancient turns\n if (aggressive) {\n const saved2 = await this.summarizeAncientTurns(ctx);\n if (saved2 > 0) reductions.push({ phase: 'summary', saved: saved2 });\n } else if (load >= this.warnThreshold) {\n // Non-aggressive: do lightweight summarization via direct analysis\n const saved2 = this.lightweightCompact(ctx);\n if (saved2 > 0) reductions.push({ phase: 'elision', saved: saved2 });\n }\n\n const repaired = repairToolUseAdjacency(ctx.messages);\n if (repaired.report.changed) ctx.state.replaceMessages(repaired.messages);\n\n const afterTokens = this.estimateTokens(ctx.messages);\n return {\n before: beforeTokens,\n after: afterTokens,\n reductions,\n repaired: repaired.report.changed\n ? {\n removedToolUses: repaired.report.removedToolUses,\n removedToolResults: repaired.report.removedToolResults,\n removedMessages: repaired.report.removedMessages,\n }\n : undefined,\n };\n }\n\n private async summarizeAncientTurns(ctx: Context): Promise<number> {\n const messages = ctx.messages;\n const cutoff = Math.max(0, messages.length - this.preserveK * 2);\n if (cutoff <= 2) return 0;\n\n // Find the best boundary in the ancient region\n const boundary = this.findSafeBoundary(messages, 0, cutoff);\n if (boundary <= 1) return 0;\n\n const toSummarize = messages.slice(0, boundary);\n const removedTokens = this.estimateTokens(toSummarize);\n\n let summaryText: string;\n try {\n summaryText = await this.callSummarizer(toSummarize, ctx);\n } catch {\n // Fallback: extract lightweight metadata from the omitted messages so\n // the context at least retains structural information even when the\n // LLM summarizer is unavailable (network outage, model down, etc.).\n const toolNames = new Set<string>();\n const filePaths = new Set<string>();\n let userTurns = 0, assistantTurns = 0;\n for (const m of toSummarize) {\n if (m.role === 'user') userTurns++;\n else if (m.role === 'assistant') {\n assistantTurns++;\n if (Array.isArray(m.content)) {\n for (const b of m.content) {\n if (b.type === 'tool_use') toolNames.add((b as { name: string }).name ?? 'unknown');\n }\n }\n }\n // Scan for file paths\n const text = typeof m.content === 'string' ? m.content : '';\n const matches = text.matchAll(/(?:[\\w.,\\-/@]+\\/)*[\\w.,\\-/@]+\\.\\w+/g);\n for (const m_ of matches) filePaths.add(m_[0]!);\n }\n const parts: string[] = [`${toSummarize.length} turns (${userTurns} user, ${assistantTurns} assistant)`];\n if (toolNames.size > 0) parts.push(`tools: ${[...toolNames].join(', ')}`);\n if (filePaths.size > 0) parts.push(`files: ${[...filePaths].slice(0, 10).join(', ')}`);\n summaryText = parts.join(' | ');\n if (!summaryText) summaryText = `${toSummarize.length} earlier turns omitted`;\n }\n\n const summaryMsg: Message = {\n role: 'system',\n content: `[prior_turns_summary: ${summaryText}]`,\n };\n const summaryTokens = this.estimateTokens([summaryMsg]);\n\n // L1-A: route through ConversationState so subscribers see the rewrite.\n const tail = ctx.messages.slice(boundary);\n ctx.state.replaceMessages([summaryMsg, ...tail]);\n return Math.max(0, removedTokens - summaryTokens);\n }\n\n private findSafeBoundary(messages: Message[], from: number, to: number): number {\n // Find the nearest user message with text content at or after `to`\n // and walk backwards to find a safe cut point.\n for (let i = to; i >= from; i--) {\n const m = messages[i];\n if (!m) continue;\n if (m.role === 'user' && this.hasTextContent(m)) {\n // Ensure we don't cut inside a multi-message exchange\n // by finding the start of this exchange.\n return this.findExchangeStart(messages, i);\n }\n }\n return -1;\n }\n\n private findExchangeStart(messages: Message[], userIndex: number): number {\n // Walk backwards from userIndex to find where this logical exchange began.\n // An exchange starts after the last assistant message that had no tool calls.\n for (let i = userIndex - 1; i >= 0; i--) {\n const m = messages[i];\n if (!m) continue;\n if (m.role === 'assistant') {\n const hasToolUse = Array.isArray(m.content)\n ? m.content.some((b) => b.type === 'tool_use')\n : false;\n if (!hasToolUse) {\n // This assistant msg had no tool calls — it's a boundary\n return i + 1;\n }\n } else if (m.role !== 'user') {\n // system or other — skip\n } else {\n // another user msg — boundary\n return i;\n }\n }\n return 0;\n }\n\n private async callSummarizer(messages: Message[], ctx: Context): Promise<string> {\n const prompt: TextBlock[] = [\n { type: 'text', text: this.summarizerPrompt },\n { type: 'text', text: '\\n\\nConversation to summarize:\\n' },\n ...this.messagesToText(messages),\n ];\n\n const req: Request = {\n model: this.summarizerModel ?? ctx.model,\n system: prompt,\n messages: [],\n maxTokens: 1024,\n };\n\n // Use abort signal from context if available.\n // Fall back to a fresh controller only if ctx.signal is absent — this\n // avoids leaking AbortControllers on every summarizer call (the original\n // `?? new AbortController().signal` created a controller that was never\n // connected to anything, making cancellation a no-op).\n const ac = ctx.signal ? undefined : new AbortController();\n const signal = ctx.signal ?? ac!.signal;\n const res = await this.provider.complete(req, { signal });\n\n const textBlocks = res.content.filter(isTextBlock);\n return (\n textBlocks\n .map((b) => b.text)\n .join('\\n')\n .trim() || '(empty summary)'\n );\n }\n\n private messagesToText(messages: Message[]): TextBlock[] {\n const lines: string[] = [];\n for (const m of messages) {\n const role = m.role.padEnd(10, ' ');\n if (typeof m.content === 'string') {\n lines.push(`[${role}]: ${m.content.slice(0, 500)}`);\n } else if (Array.isArray(m.content)) {\n const textParts = m.content.filter(isTextBlock).map((b) => b.text);\n if (textParts.length > 0) {\n lines.push(`[${role}]: ${textParts.join(' ').slice(0, 500)}`);\n }\n }\n }\n return [{ type: 'text', text: lines.join('\\n') }];\n }\n\n private lightweightCompact(ctx: Context): number {\n // Lightweight: just elide very large tool results without full summarization\n return this.eliseOldToolResults(ctx);\n }\n\n private eliseOldToolResults(ctx: Context): number {\n const messages = ctx.messages;\n let pairCount = 0;\n let preserveStart = messages.length;\n for (let i = messages.length - 1; i >= 0 && pairCount < this.preserveK; i--) {\n const m = messages[i];\n if (!m) continue;\n if (m.role === 'user' || m.role === 'assistant') {\n pairCount++;\n preserveStart = i;\n }\n }\n\n // Ensure tool_use/tool_result protocol pairs are preserved together.\n // Walk forward through the preserved window: if an assistant message\n // at or after preserveStart contains a tool_use, also preserve the\n // immediately following message (the tool_result) so neither is elided.\n for (let i = preserveStart; i < messages.length; i++) {\n const m = messages[i];\n if (!m || typeof m.content === 'string' || !Array.isArray(m.content)) continue;\n const hasToolUse = m.content.some((b) => b.type === 'tool_use');\n if (hasToolUse && i + 1 < messages.length) {\n const next = messages[i + 1];\n if (\n next &&\n next.role === 'user' &&\n typeof next.content !== 'string' &&\n Array.isArray(next.content) &&\n next.content.some((b) => b.type === 'tool_result')\n ) {\n // Extend preserveStart to cover the tool_result as well so\n // the protocol pair stays complete and readable.\n preserveStart = i + 1;\n }\n }\n }\n\n let saved = 0;\n let changed = false;\n const nextMessages = new Array(messages.length);\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n // Only process messages before the preservation window\n if (i >= preserveStart) {\n nextMessages[i] = msg;\n continue;\n }\n if (!msg || !Array.isArray(msg.content)) {\n nextMessages[i] = msg;\n continue;\n }\n const newContent: ContentBlock[] = msg.content.map((b) => {\n if (b.type !== 'tool_result') return b;\n const tokens = estimateToolResultTokens(b.content);\n if (tokens < this.eliseThreshold) return b;\n saved += tokens;\n return {\n type: 'tool_result',\n tool_use_id: b.tool_use_id,\n content: `[elided: ~${tokens} tokens]`,\n is_error: b.is_error,\n };\n });\n // Check by reference equality whether any block actually changed\n if (\n newContent.length === msg.content.length &&\n newContent.every((b, idx) => b === msg.content[idx])\n ) {\n nextMessages[i] = msg;\n } else {\n nextMessages[i] = { ...msg, content: newContent };\n changed = true;\n }\n }\n if (changed) ctx.state.replaceMessages(nextMessages);\n return saved;\n }\n\n private hasTextContent(m: Message): boolean {\n if (typeof m.content === 'string') return m.content.trim().length > 0;\n return m.content.some((b) => b.type === 'text' && b.text.trim().length > 0);\n }\n\n private estimateTokens(messages: Message[]): number {\n let total = 0;\n for (const m of messages) {\n if (typeof m.content === 'string') {\n total += estimateTextTokens(m.content);\n } else {\n for (const b of m.content) {\n if (b.type === 'text') total += estimateTextTokens(b.text);\n else if (b.type === 'tool_use') total += estimateToolInputTokens(b.input);\n else if (b.type === 'tool_result') total += estimateToolResultTokens(b.content);\n }\n }\n }\n return total;\n }\n}\n","import { isTextBlock } from '../types/blocks.js';\nimport type { Message } from '../types/messages.js';\nimport type { Provider, Request } from '../types/provider.js';\nimport type { MessageSelector, SelectorResult } from '../types/selector.js';\n\nexport interface LLMSelectorOptions {\n /** Provider used for the selector LLM call. Required. */\n provider: Provider;\n /** Model for the selector. Defaults to the provider's default model. */\n model?: string;\n /**\n * Maximum tokens to keep in context (target budget).\n * Selector will aim to keep total content below this.\n */\n maxContextTokens?: number;\n /**\n * Prompt instructing the selector how to behave.\n * Should guide the LLM on importance tiers and output format.\n */\n systemPrompt?: string;\n}\n\nconst DEFAULT_SYSTEM_PROMPT = `You are a context pruning assistant. Given a conversation history and a token budget, decide which message ranges are worth keeping verbatim and which should be collapsed into summaries.\n\nOutput a JSON object with this structure:\n{\n \"kept\": [{\"from\": 0, \"to\": 5, \"importance\": \"critical\"}],\n \"collapsed\": [{\"from\": 6, \"to\": 20, \"summary\": \"optional summary\"}],\n \"reasoning\": \"brief explanation of decisions\"\n}\n\nImportance tiers:\n- \"critical\": decisions, file edits, tool results that affect state, final answers\n- \"high\": substantive tool use, complex reasoning, non-obvious observations\n- \"medium\": routine exchanges, confirmations, straightforward Q&A\n\nRules:\n- Always keep the most recent K pairs (preserve recency)\n- Never collapse the final 2 user/assistant pairs (working memory)\n- Preserve tool results that modified files or had external effects\n- Collapse old, low-information exchanges (greetings, acknowledgements, etc.)\n- If unsure, keep rather than collapse (errors are more costly than waste)\n\nReturn ONLY the JSON object, no markdown, no explanation outside the JSON.`;\n\n/** Rough token estimation for a message array */\nfunction estimateTokens(messages: Message[]): number {\n let total = 0;\n for (const m of messages) {\n if (typeof m.content === 'string') {\n total += Math.ceil(m.content.length / 4);\n } else if (Array.isArray(m.content)) {\n for (const b of m.content) {\n if (b.type === 'text') total += Math.ceil(b.text.length / 4);\n else total += Math.ceil(JSON.stringify(b).length / 4);\n }\n }\n }\n return total;\n}\n\n/** Format messages as a compact text dump for the selector LLM */\nfunction formatMessages(messages: Message[], maxChars = 8000): string {\n const lines: string[] = [];\n let used = 0;\n for (let i = 0; i < messages.length; i++) {\n const m = messages[i]!;\n const role = m.role.padEnd(10, ' ');\n let text: string;\n if (typeof m.content === 'string') {\n text = m.content.slice(0, 500);\n } else {\n const content = m.content as import('../types/blocks.js').ContentBlock[];\n text = content\n .filter(isTextBlock)\n .map((b) => b.text)\n .join(' ');\n // Also capture tool names for context\n const toolUses = content.filter((b) => b.type === 'tool_use');\n if (toolUses.length > 0) {\n text += ` [tools: ${toolUses.map((b) => (b as { name: string }).name).join(', ')}]`;\n }\n }\n const line = `[${i}][${role}]: ${text}`;\n if (used + line.length > maxChars) break;\n lines.push(line);\n used += line.length;\n }\n return lines.join('\\n');\n}\n\n/**\n * LLM-powered message selector. Calls a sub-LLM to analyze the\n * message history and produce a keep/collapse plan — more surgical\n * than fixed-window rules.\n */\nexport class LLMSelector implements MessageSelector {\n private readonly provider: Provider;\n private readonly model: string;\n private readonly maxContextTokens: number;\n private readonly systemPrompt: string;\n\n constructor(opts: LLMSelectorOptions) {\n this.provider = opts.provider;\n this.model = opts.model ?? 'unknown';\n this.maxContextTokens = opts.maxContextTokens ?? 40_000;\n this.systemPrompt = opts.systemPrompt ?? DEFAULT_SYSTEM_PROMPT;\n }\n\n async select(messages: Message[], maxToKeep: number): Promise<SelectorResult> {\n const effectiveBudget = Math.min(maxToKeep, this.maxContextTokens);\n\n // Build a concise representation of the conversation\n const historyText = formatMessages(messages);\n const totalTokens = estimateTokens(messages);\n const systemText = `${this.systemPrompt}\\n\\nConversation (${messages.length} messages, ~${totalTokens} tokens, budget: ${effectiveBudget}):\\n`;\n\n // Add instruction to stay within budget\n const budgetInstruction =\n totalTokens > effectiveBudget\n ? `\\n\\nIMPORTANT: Total conversation (${totalTokens} tokens) exceeds budget (${effectiveBudget}). You MUST collapse enough to fit. Prefer collapsing older/lower-importance ranges.`\n : '';\n\n const req: Request = {\n model: this.model,\n system: [{ type: 'text', text: systemText + budgetInstruction }],\n messages: [{ role: 'user', content: historyText }],\n maxTokens: 1024,\n };\n\n let raw: string;\n try {\n // Wire the AbortController to the provider call so cancellation actually\n // fires — the original code passed a fresh signal that is never connected\n // to anything, leaking the controller on every selector call.\n const ac = new AbortController();\n const res = await this.provider.complete(req, { signal: ac.signal });\n const textBlocks = res.content.filter(isTextBlock);\n raw = textBlocks\n .map((b) => b.text)\n .join('\\n')\n .trim();\n } catch (err) {\n // Fallback: use simple recency-based selection\n return this.fallbackSelect(messages, effectiveBudget);\n }\n\n return this.parseSelectorOutput(raw, messages.length);\n }\n\n private fallbackSelect(messages: Message[], budget: number): SelectorResult {\n // Simple fallback: keep from the end until we hit budget\n const toKeep: SelectorResult['kept'] = [];\n const toCollapse: SelectorResult['collapsed'] = [];\n\n let tokenCount = 0;\n let startIdx = 0;\n\n // Scan from the end backwards\n for (let i = messages.length - 1; i >= 0; i--) {\n const m = messages[i]!;\n const cost =\n typeof m.content === 'string'\n ? Math.ceil(m.content.length / 4)\n : m.content.reduce(\n (acc, b) =>\n acc +\n (b.type === 'text'\n ? Math.ceil(b.text.length / 4)\n : Math.ceil(JSON.stringify(b).length / 4)),\n 0,\n );\n\n if (tokenCount + cost <= budget) {\n tokenCount += cost;\n } else {\n startIdx = i + 1;\n break;\n }\n }\n\n if (startIdx > 0) {\n toCollapse.push({ from: 0, to: startIdx - 1 });\n }\n toKeep.push({ from: startIdx, to: messages.length - 1, importance: 'high' });\n\n return {\n kept: toKeep,\n collapsed: toCollapse,\n reasoning: `Fallback: kept last ${messages.length - startIdx} messages within ${budget} token budget`,\n };\n }\n\n private parseSelectorOutput(raw: string, messageCount: number): SelectorResult {\n // Try to extract JSON from the response\n const jsonStart = raw.indexOf('{');\n const jsonEnd = raw.lastIndexOf('}');\n if (jsonStart === -1 || jsonEnd === -1) {\n // Can't parse — use fallback\n return this.fallbackSelect(\n Array.from({ length: messageCount }, () => ({ role: 'user', content: '' }) as Message),\n this.maxContextTokens,\n );\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw.slice(jsonStart, jsonEnd + 1));\n } catch {\n return this.fallbackSelect(\n Array.from({ length: messageCount }, () => ({ role: 'user', content: '' }) as Message),\n this.maxContextTokens,\n );\n }\n\n const obj = parsed as Record<string, unknown>;\n const kept =\n (obj.kept as Array<{ from: number; to: number; importance: string }> | undefined) ?? [];\n const collapsed =\n (obj.collapsed as Array<{ from: number; to: number; summary?: string }> | undefined) ?? [];\n\n return {\n kept: kept.map((k) => ({\n from: k.from,\n to: k.to,\n importance: (k.importance ?? 'medium') as 'critical' | 'high' | 'medium',\n })),\n collapsed: collapsed.map((c) => ({ from: c.from, to: c.to, summary: c.summary })),\n reasoning: typeof obj.reasoning === 'string' ? obj.reasoning : '',\n };\n }\n}\n","import type { Context } from '../core/context.js';\nimport { LLMSelector } from '../models/llm-selector.js';\nimport type { ContentBlock } from '../types/blocks.js';\nimport { isTextBlock } from '../types/blocks.js';\nimport type { CompactReport, Compactor } from '../types/compactor.js';\nimport type { Message } from '../types/messages.js';\nimport type { Provider, Request } from '../types/provider.js';\nimport type { MessageSelector, SelectorResult } from '../types/selector.js';\nimport { repairToolUseAdjacency } from '../utils/message-invariants.js';\n\n/**\n * Options for SelectiveCompactor — the most configurable compactor.\n */\nexport interface SelectiveCompactorOptions {\n /** Provider for LLM calls (selector + summarizer). Required. */\n provider: Provider;\n /** Selector for LLM-driven importance analysis. */\n selector?: MessageSelector;\n /** Fraction of maxContext that triggers a warning (default 0.6). */\n warnThreshold?: number;\n /** Fraction of maxContext that triggers soft compaction (default 0.75). */\n softThreshold?: number;\n /** Fraction of maxContext that triggers hard compaction (default 0.9). */\n hardThreshold?: number;\n /** Max context window in tokens (used for threshold fraction math). */\n maxContext?: number;\n /** How many recent (user+assistant) pairs to always preserve (default 4). */\n preserveK?: number;\n /** Token threshold below which tool results are not elided (default 500). */\n eliseThreshold?: number;\n /** Model for selector LLM calls (default: same as provider default). */\n selectorModel?: string;\n /** Summarizer model for collapsed ranges (default: same as selectorModel). */\n summarizerModel?: string;\n /** Prompt for the summarizer sub-LLM. */\n summarizerPrompt?: string;\n}\n\n/**\n * SelectiveCompactor uses an LLM-driven MessageSelector to make\n * surgical decisions about which message ranges to keep vs collapse.\n *\n * Compared to HybridCompactor / IntelligentCompactor:\n * - HybridCompactor: rule-based (preserveK + elision), no LLM calls\n * - IntelligentCompactor: LLM summarization but no structured selection\n * - SelectiveCompactor: full LLM-driven selection + optional summarization\n */\nexport class SelectiveCompactor implements Compactor {\n private readonly provider: Provider;\n private readonly selector: MessageSelector;\n private readonly warnThreshold: number;\n private readonly softThreshold: number;\n private readonly hardThreshold: number;\n private readonly maxContext: number;\n private readonly preserveK: number;\n private readonly eliseThreshold: number;\n private readonly summarizerModel: string;\n private readonly summarizerPrompt: string;\n\n constructor(opts: SelectiveCompactorOptions) {\n this.provider = opts.provider;\n this.selector =\n opts.selector ?? new LLMSelector({ provider: opts.provider, model: opts.selectorModel });\n this.warnThreshold = opts.warnThreshold ?? 0.6;\n this.softThreshold = opts.softThreshold ?? 0.75;\n this.hardThreshold = opts.hardThreshold ?? 0.9;\n this.maxContext = opts.maxContext ?? 128_000;\n this.preserveK = opts.preserveK ?? 4;\n this.eliseThreshold = opts.eliseThreshold ?? 500;\n this.summarizerModel = opts.summarizerModel ?? opts.selectorModel ?? 'unknown';\n this.summarizerPrompt =\n opts.summarizerPrompt ??\n 'You are a context summarizer. Given a list of messages, produce a concise summary that preserves all factual information, decisions, file changes, and state changes. Do not add commentary or opinions.';\n }\n\n async compact(ctx: Context, opts: { aggressive?: boolean } = {}): Promise<CompactReport> {\n const beforeTokens = this.estimateTokens(ctx.messages);\n const reductions: CompactReport['reductions'] = [];\n\n const load = beforeTokens / this.maxContext;\n const shouldCompact = load >= this.warnThreshold || opts.aggressive;\n\n if (!shouldCompact) {\n // Only do lightweight elision if below warn threshold\n const saved = this.eliseOldToolResults(ctx);\n if (saved > 0) reductions.push({ phase: 'elision', saved });\n const repair = this.repairProtocolAdjacency(ctx);\n const afterTokens = this.estimateTokens(ctx.messages);\n return { before: beforeTokens, after: afterTokens, reductions, repaired: repair };\n }\n\n // Phase 1: elision — always run first to get a baseline reduction\n const savedElision = this.eliseOldToolResults(ctx);\n if (savedElision > 0) reductions.push({ phase: 'elision', saved: savedElision });\n\n // Phase 2: LLM-driven selective compaction\n const afterPhase1 = this.estimateTokens(ctx.messages);\n const targetBudget = this.computeTargetBudget(load);\n\n if (afterPhase1 > targetBudget) {\n const savedSelective = await this.runSelector(ctx, targetBudget);\n if (savedSelective > 0) reductions.push({ phase: 'selective', saved: savedSelective });\n }\n\n const repair = this.repairProtocolAdjacency(ctx);\n const afterTokens = this.estimateTokens(ctx.messages);\n return { before: beforeTokens, after: afterTokens, reductions, repaired: repair };\n }\n\n private repairProtocolAdjacency(ctx: Context): CompactReport['repaired'] {\n const repaired = repairToolUseAdjacency(ctx.messages);\n if (repaired.report.changed) ctx.state.replaceMessages(repaired.messages);\n return repaired.report.changed\n ? {\n removedToolUses: repaired.report.removedToolUses,\n removedToolResults: repaired.report.removedToolResults,\n removedMessages: repaired.report.removedMessages,\n }\n : undefined;\n }\n\n /**\n * Run the LLM selector to decide what to keep vs collapse.\n * Returns the token savings achieved.\n */\n private async runSelector(ctx: Context, targetBudget: number): Promise<number> {\n const before = this.estimateTokens(ctx.messages);\n\n let result: SelectorResult;\n try {\n result = await this.selector.select(ctx.messages, targetBudget);\n } catch {\n // Fallback to aggressive recency preservation\n return this.aggressiveRecencyTrim(ctx);\n }\n\n // Execute the selector's plan\n await this.executePlan(ctx, result);\n\n const after = this.estimateTokens(ctx.messages);\n return Math.max(0, before - after);\n }\n\n /**\n * Execute a SelectorResult plan: collapse/remove ranges and\n * insert summaries where the selector provided them.\n */\n private async executePlan(ctx: Context, plan: SelectorResult): Promise<void> {\n if (ctx.messages.length === 0) return;\n\n // Process collapsed ranges in reverse order to preserve indices. We work\n // on a local copy and commit through `ctx.state.replaceMessages` at the\n // end so subscribers see a single state change for the whole rewrite.\n const messages = [...ctx.messages];\n const sortedCollapsed = [...plan.collapsed].sort((a, b) => b.from - a.from);\n\n for (const range of sortedCollapsed) {\n if (range.from < 0 || range.to >= messages.length || range.from > range.to) continue;\n\n let summary = range.summary;\n if (!summary) {\n const toSummarize = messages.slice(range.from, range.to + 1);\n summary = await this.summarizeRange(toSummarize, ctx);\n }\n\n const summaryMsg: Message = {\n role: 'system',\n content: `[prior_turns_${range.from}-${range.to}: ${summary}]`,\n };\n\n messages.splice(range.from, range.to - range.from + 1, summaryMsg);\n }\n\n ctx.state.replaceMessages(messages);\n }\n\n private async summarizeRange(messages: Message[], ctx: Context): Promise<string> {\n const systemText = `${this.summarizerPrompt}\\n\\nSummarize the following message range:`;\n const body = messages.map((m, i) => `[${i}] ${m.role}: ${this.messagePreview(m)}`).join('\\n');\n\n const req: Request = {\n model: this.summarizerModel,\n system: [{ type: 'text', text: systemText }],\n messages: [{ role: 'user', content: body }],\n maxTokens: 512,\n };\n\n try {\n const res = await this.provider.complete(req, {\n signal: ctx.signal ?? new AbortController().signal,\n });\n return (\n res.content\n .filter(isTextBlock)\n .map((b) => b.text)\n .join('\\n')\n .trim() || '(empty)'\n );\n } catch {\n return `[${messages.length} earlier turns omitted]`;\n }\n }\n\n private messagePreview(m: Message): string {\n if (typeof m.content === 'string') return m.content.slice(0, 300);\n return m.content\n .filter(isTextBlock)\n .map((b) => b.text)\n .join(' ')\n .slice(0, 300);\n }\n\n /**\n * Fallback when selector fails: aggressively trim from the oldest end\n * until we hit targetBudget.\n */\n private aggressiveRecencyTrim(ctx: Context): number {\n const messages = ctx.messages;\n const preserveIdx = Math.max(0, messages.length - this.preserveK * 2);\n\n if (preserveIdx <= 0) return 0;\n\n // Find safe boundary near preserveIdx\n let boundary = preserveIdx;\n for (let i = preserveIdx; i < messages.length && i < preserveIdx + 6; i++) {\n const m = messages[i]!;\n if (m.role === 'user' && this.hasTextContent(m)) {\n boundary = i;\n break;\n }\n }\n\n const removed = messages.slice(0, boundary);\n const removedTokens = this.estimateTokens(removed);\n\n const summaryMsg: Message = {\n role: 'system',\n content: `[${removed.length} earlier turns trimmed — see session log for details]`,\n };\n const tail = messages.slice(boundary);\n ctx.state.replaceMessages([summaryMsg, ...tail]);\n\n return Math.max(0, removedTokens - this.estimateTokens([summaryMsg]));\n }\n\n private computeTargetBudget(load: number): number {\n if (load >= this.hardThreshold) {\n return Math.floor(this.maxContext * 0.5); // keep only 50%\n }\n if (load >= this.softThreshold) {\n return Math.floor(this.maxContext * 0.65); // keep 65%\n }\n return Math.floor(this.maxContext * 0.75); // keep 75% at warn\n }\n\n private eliseOldToolResults(ctx: Context): number {\n const messages = ctx.messages;\n let pairCount = 0;\n let preserveStart = messages.length;\n for (let i = messages.length - 1; i >= 0 && pairCount < this.preserveK; i--) {\n const m = messages[i];\n if (!m) continue;\n if (m.role === 'user' || m.role === 'assistant') {\n pairCount++;\n preserveStart = i;\n }\n }\n let saved = 0;\n let changed = false;\n const nextMessages = new Array(messages.length);\n for (let i = 0; i < messages.length; i++) {\n const msg = messages[i];\n // Only process messages before the preservation window\n if (i >= preserveStart) {\n nextMessages[i] = msg;\n continue;\n }\n if (!msg || !Array.isArray(msg.content)) {\n nextMessages[i] = msg;\n continue;\n }\n const newContent: ContentBlock[] = msg.content.map((b) => {\n if (b.type !== 'tool_result') return b;\n const text = typeof b.content === 'string' ? b.content : JSON.stringify(b.content);\n const tokens = this.roughTokenEstimate(text);\n if (tokens < this.eliseThreshold) return b;\n saved += tokens;\n return {\n type: 'tool_result',\n tool_use_id: b.tool_use_id,\n content: `[elided: ~${tokens} tokens]`,\n is_error: b.is_error,\n };\n });\n // map() preserves length, so only block ref-equality matters here.\n if (newContent.every((b, idx) => b === msg.content[idx])) {\n nextMessages[i] = msg;\n } else {\n nextMessages[i] = { ...msg, content: newContent };\n changed = true;\n }\n }\n if (changed) ctx.state.replaceMessages(nextMessages);\n return saved;\n }\n\n private hasTextContent(m: Message): boolean {\n if (typeof m.content === 'string') return m.content.trim().length > 0;\n return m.content.some((b) => b.type === 'text' && b.text.trim().length > 0);\n }\n\n private estimateTokens(messages: Message[]): number {\n let total = 0;\n for (const m of messages) {\n if (typeof m.content === 'string') {\n total += this.roughTokenEstimate(m.content);\n } else {\n for (const b of m.content) {\n if (b.type === 'text') total += this.roughTokenEstimate(b.text);\n else if (b.type === 'tool_use') total += this.roughTokenEstimate(JSON.stringify(b.input));\n else if (b.type === 'tool_result') {\n total += this.roughTokenEstimate(\n typeof b.content === 'string' ? b.content : JSON.stringify(b.content),\n );\n }\n }\n }\n }\n return total;\n }\n\n private roughTokenEstimate(text: string): number {\n return Math.max(1, Math.ceil(text.length / 4));\n }\n}\n","/**\n * WrongStack error hierarchy.\n *\n * Every error thrown by the framework is a `WrongStackError` with a\n * machine-readable `code`, a `subsystem` tag, and a `severity` level.\n * This lets consumers (CLI, TUI, plugins, tests) branch on structured\n * data instead of parsing error messages.\n */\n\n// ── Error codes ──────────────────────────────────────────────────────\n\n/**\n * Machine-readable error codes as frozen constants.\n *\n * Use `ERROR_CODES.X` instead of raw string literals for:\n * - IDE autocomplete and compile-time validation\n * - Safe refactoring (rename updates all usages)\n * - Plugin extensibility (extend the object to add custom codes)\n *\n * The `ErrorCode` type is derived from this object, so adding a new\n * code here automatically updates the type without extra changes.\n */\nexport const ERROR_CODES = {\n // Provider\n PROVIDER_RATE_LIMITED: 'PROVIDER_RATE_LIMITED',\n PROVIDER_AUTH_FAILED: 'PROVIDER_AUTH_FAILED',\n PROVIDER_OVERLOADED: 'PROVIDER_OVERLOADED',\n PROVIDER_INVALID_REQUEST: 'PROVIDER_INVALID_REQUEST',\n PROVIDER_SERVER_ERROR: 'PROVIDER_SERVER_ERROR',\n PROVIDER_NETWORK_ERROR: 'PROVIDER_NETWORK_ERROR',\n PROVIDER_CONTEXT_OVERFLOW: 'PROVIDER_CONTEXT_OVERFLOW',\n // Tool\n TOOL_NOT_FOUND: 'TOOL_NOT_FOUND',\n TOOL_PERMISSION_DENIED: 'TOOL_PERMISSION_DENIED',\n TOOL_EXECUTION_FAILED: 'TOOL_EXECUTION_FAILED',\n TOOL_TIMEOUT: 'TOOL_TIMEOUT',\n TOOL_INPUT_INVALID: 'TOOL_INPUT_INVALID',\n // Config\n CONFIG_INVALID: 'CONFIG_INVALID',\n CONFIG_NOT_FOUND: 'CONFIG_NOT_FOUND',\n CONFIG_PARSE_FAILED: 'CONFIG_PARSE_FAILED',\n CONFIG_MIGRATION_NEEDED: 'CONFIG_MIGRATION_NEEDED',\n // Plugin\n PLUGIN_LOAD_FAILED: 'PLUGIN_LOAD_FAILED',\n PLUGIN_API_MISMATCH: 'PLUGIN_API_MISMATCH',\n PLUGIN_MISSING_DEPENDENCY: 'PLUGIN_MISSING_DEPENDENCY',\n // Agent\n AGENT_ITERATION_LIMIT: 'AGENT_ITERATION_LIMIT',\n AGENT_CONTEXT_OVERFLOW: 'AGENT_CONTEXT_OVERFLOW',\n AGENT_ABORTED: 'AGENT_ABORTED',\n AGENT_RUN_FAILED: 'AGENT_RUN_FAILED',\n // Session\n SESSION_NOT_FOUND: 'SESSION_NOT_FOUND',\n SESSION_CORRUPTED: 'SESSION_CORRUPTED',\n SESSION_WRITE_FAILED: 'SESSION_WRITE_FAILED',\n // Container / Registry\n CONTAINER_TOKEN_ALREADY_BOUND: 'CONTAINER_TOKEN_ALREADY_BOUND',\n CONTAINER_TOKEN_NOT_BOUND: 'CONTAINER_TOKEN_NOT_BOUND',\n REGISTRY_DUPLICATE: 'REGISTRY_DUPLICATE',\n REGISTRY_NOT_FOUND: 'REGISTRY_NOT_FOUND',\n // File system\n FS_READ_FAILED: 'FS_READ_FAILED',\n FS_WRITE_FAILED: 'FS_WRITE_FAILED',\n FS_MKDIR_FAILED: 'FS_MKDIR_FAILED',\n FS_DELETE_FAILED: 'FS_DELETE_FAILED',\n FS_ATOMIC_WRITE_FAILED: 'FS_ATOMIC_WRITE_FAILED',\n // General\n UNKNOWN: 'UNKNOWN',\n} as const;\n\n/**\n * Union type derived from `ERROR_CODES`. Using `typeof ERROR_CODES[keyof typeof ERROR_CODES]`\n * instead of a string literal union means TypeScript auto-updates the type whenever\n * a new code is added to `ERROR_CODES` — no need to keep two lists in sync.\n */\nexport type ErrorCode = (typeof ERROR_CODES)[keyof typeof ERROR_CODES];\n\nexport type ErrorSubsystem =\n | 'provider'\n | 'tool'\n | 'config'\n | 'plugin'\n | 'agent'\n | 'session'\n | 'container'\n | 'fs'\n | 'general';\nexport type ErrorSeverity = 'fatal' | 'error' | 'warning';\n\n// ── Base error class ─────────────────────────────────────────────────\n\nexport class WrongStackError extends Error {\n readonly code: ErrorCode;\n readonly subsystem: ErrorSubsystem;\n readonly severity: ErrorSeverity;\n readonly recoverable: boolean;\n readonly context?: Record<string, unknown>;\n\n constructor(opts: {\n message: string;\n code: ErrorCode;\n subsystem: ErrorSubsystem;\n severity?: ErrorSeverity;\n recoverable?: boolean;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super(opts.message, { cause: opts.cause });\n this.name = 'WrongStackError';\n this.code = opts.code;\n this.subsystem = opts.subsystem;\n this.severity = opts.severity ?? 'error';\n this.recoverable = opts.recoverable ?? false;\n this.context = opts.context;\n }\n\n /**\n * Render a one-line user-facing description.\n * Subclasses should override for domain-specific formatting.\n */\n describe(): string {\n const ctx = this.context ? ` ${formatContext(this.context)}` : '';\n return `${this.code}: ${this.message}${ctx}`;\n }\n}\n\nfunction formatContext(ctx: Record<string, unknown>): string {\n const parts = Object.entries(ctx)\n .filter(([, v]) => v !== undefined)\n .slice(0, 3)\n .map(([k, v]) => `${k}=${String(v)}`);\n return parts.length > 0 ? `[${parts.join(' ')}]` : '';\n}\n\n// ── Specific error classes ───────────────────────────────────────────\n\n/**\n * Tool execution errors — thrown by ToolExecutor and individual tools.\n */\nexport class ToolError extends WrongStackError {\n readonly toolName: string;\n\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n | 'TOOL_NOT_FOUND'\n | 'TOOL_PERMISSION_DENIED'\n | 'TOOL_EXECUTION_FAILED'\n | 'TOOL_TIMEOUT'\n | 'TOOL_INPUT_INVALID'\n >;\n toolName: string;\n recoverable?: boolean;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'tool',\n recoverable: opts.recoverable,\n context: { tool: opts.toolName, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'ToolError';\n this.toolName = opts.toolName;\n }\n}\n\n/**\n * Config loading / validation errors.\n */\nexport class ConfigError extends WrongStackError {\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'CONFIG_INVALID' | 'CONFIG_NOT_FOUND' | 'CONFIG_PARSE_FAILED' | 'CONFIG_MIGRATION_NEEDED'\n >;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'config',\n severity: 'fatal',\n recoverable: false,\n context: opts.context,\n cause: opts.cause,\n });\n this.name = 'ConfigError';\n }\n}\n\n/**\n * Plugin loading / lifecycle errors.\n */\nexport class PluginError extends WrongStackError {\n readonly pluginName: string;\n\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'PLUGIN_LOAD_FAILED' | 'PLUGIN_API_MISMATCH' | 'PLUGIN_MISSING_DEPENDENCY'\n >;\n pluginName: string;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'plugin',\n severity: 'error',\n recoverable: opts.code === ERROR_CODES.PLUGIN_MISSING_DEPENDENCY,\n context: { plugin: opts.pluginName, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'PluginError';\n this.pluginName = opts.pluginName;\n }\n}\n\n/**\n * Agent runtime errors — thrown by Agent.run when a non-WrongStackError\n * escapes the inner loop, so callers always see a structured error.\n */\nexport class AgentError extends WrongStackError {\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'AGENT_ITERATION_LIMIT' | 'AGENT_CONTEXT_OVERFLOW' | 'AGENT_ABORTED' | 'AGENT_RUN_FAILED'\n >;\n recoverable?: boolean;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'agent',\n severity: opts.code === ERROR_CODES.AGENT_ABORTED ? 'warning' : 'error',\n recoverable: opts.recoverable ?? opts.code === ERROR_CODES.AGENT_ITERATION_LIMIT,\n context: opts.context,\n cause: opts.cause,\n });\n this.name = 'AgentError';\n }\n}\n\n/**\n * Wrap an arbitrary thrown value into a `WrongStackError` so the caller\n * always gets a structured error. Pass-throughs WrongStackError instances\n * unchanged; raw `Error`s and primitives get an `AGENT_RUN_FAILED` wrapper\n * with the original preserved as `cause`.\n */\nexport function toWrongStackError(\n err: unknown,\n code: Extract<ErrorCode, 'AGENT_RUN_FAILED' | 'AGENT_ABORTED' | 'UNKNOWN'> = ERROR_CODES.AGENT_RUN_FAILED,\n): WrongStackError {\n if (err instanceof WrongStackError) return err;\n const message = err instanceof Error ? err.message : String(err);\n return new AgentError({\n message,\n code: code === 'UNKNOWN' ? ERROR_CODES.AGENT_RUN_FAILED : code,\n cause: err,\n });\n}\n\n/**\n * Session storage errors.\n */\nexport class SessionError extends WrongStackError {\n readonly sessionId?: string;\n\n constructor(opts: {\n message: string;\n code: Extract<ErrorCode, 'SESSION_NOT_FOUND' | 'SESSION_CORRUPTED' | 'SESSION_WRITE_FAILED'>;\n sessionId?: string;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'session',\n severity: opts.code === ERROR_CODES.SESSION_WRITE_FAILED ? 'error' : 'warning',\n recoverable: opts.code !== ERROR_CODES.SESSION_CORRUPTED,\n context: { sessionId: opts.sessionId, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'SessionError';\n this.sessionId = opts.sessionId;\n }\n}\n\n/**\n * File system operation errors.\n */\nexport class FsError extends WrongStackError {\n readonly path?: string;\n\n constructor(opts: {\n message: string;\n code: Extract<\n ErrorCode,\n 'FS_READ_FAILED' | 'FS_WRITE_FAILED' | 'FS_MKDIR_FAILED' | 'FS_DELETE_FAILED' | 'FS_ATOMIC_WRITE_FAILED'\n >;\n path?: string;\n context?: Record<string, unknown>;\n cause?: unknown;\n }) {\n super({\n message: opts.message,\n code: opts.code,\n subsystem: 'fs',\n severity: 'error',\n recoverable: opts.code !== ERROR_CODES.FS_READ_FAILED,\n context: { path: opts.path, ...opts.context },\n cause: opts.cause,\n });\n this.name = 'FsError';\n this.path = opts.path;\n }\n}\n\n// ── Type guards ──────────────────────────────────────────────────────\n\nexport function isWrongStackError(err: unknown): err is WrongStackError {\n return err instanceof WrongStackError;\n}\n\nexport function isToolError(err: unknown): err is ToolError {\n return err instanceof ToolError;\n}\n\nexport function isConfigError(err: unknown): err is ConfigError {\n return err instanceof ConfigError;\n}\n\nexport function isPluginError(err: unknown): err is PluginError {\n return err instanceof PluginError;\n}\n\nexport function isSessionError(err: unknown): err is SessionError {\n return err instanceof SessionError;\n}\n\nexport function isAgentError(err: unknown): err is AgentError {\n return err instanceof AgentError;\n}\n\nexport function isFsError(err: unknown): err is FsError {\n return err instanceof FsError;\n}\n","import type { Context } from '../core/context.js';\r\nimport type { EventBus } from '../kernel/events.js';\r\nimport type { MiddlewareHandler } from '../kernel/pipeline.js';\r\nimport type { Compactor } from '../types/compactor.js';\r\nimport type { ContextWindowAggressiveOn, ContextWindowPolicy } from '../types/context-window.js';\r\nimport { AgentError, ERROR_CODES } from '../types/errors.js';\r\n\r\nexport type CompactionFailureMode = 'throw' | 'throw_on_hard' | 'continue';\r\n\r\nexport interface AutoCompactionOptions {\r\n aggressiveOn?: ContextWindowAggressiveOn;\r\n events?: EventBus;\r\n failureMode?: CompactionFailureMode;\r\n policyProvider?: (ctx: Context) => Pick<\r\n ContextWindowPolicy,\r\n 'thresholds' | 'aggressiveOn'\r\n > | null | undefined;\r\n}\r\n\r\n/**\r\n * Pipeline middleware that monitors context token load and automatically\r\n * triggers compaction when the warn/soft/hard thresholds are crossed.\r\n * Runs before the next agent iteration.\r\n */\r\nexport class AutoCompactionMiddleware {\r\n readonly name = 'AutoCompaction';\r\n\r\n private readonly compactor: Compactor;\r\n private readonly estimator: (ctx: Context) => number;\r\n private readonly warnThreshold: number;\r\n private readonly softThreshold: number;\r\n private readonly hardThreshold: number;\r\n /** Writable so model-switch can update the denominator without re-registering the middleware. */\r\n private _maxContext: number;\r\n private readonly aggressiveOn: ContextWindowAggressiveOn;\r\n private readonly events?: EventBus;\r\n private readonly failureMode: CompactionFailureMode;\r\n private readonly policyProvider?: AutoCompactionOptions['policyProvider'];\r\n\r\n /**\r\n * @param compactor Compactor to use for compaction.\r\n * @param maxContext Provider's max context window in tokens.\r\n * @param estimator Token estimation function.\r\n * @param thresholds Threshold fractions (0-1) of maxContext.\r\n * @param opts Optional behavior. By default, failures at the\r\n * hard threshold throw AGENT_CONTEXT_OVERFLOW so\r\n * the agent does not continue into a likely\r\n * provider context overflow. Warn/soft failures\r\n * still emit compaction.failed and continue.\r\n */\r\n constructor(\r\n compactor: Compactor,\r\n maxContext: number,\r\n estimator: (ctx: Context) => number,\r\n thresholds: { warn: number; soft: number; hard: number },\r\n optsOrAggressiveOn: AutoCompactionOptions | ContextWindowAggressiveOn = {},\r\n events?: EventBus,\r\n ) {\r\n const opts =\r\n typeof optsOrAggressiveOn === 'string'\r\n ? { aggressiveOn: optsOrAggressiveOn, events }\r\n : optsOrAggressiveOn;\r\n this.compactor = compactor;\r\n this._maxContext = maxContext;\r\n this.estimator = estimator;\r\n this.warnThreshold = thresholds.warn;\r\n this.softThreshold = thresholds.soft;\r\n this.hardThreshold = thresholds.hard;\r\n this.aggressiveOn = opts.aggressiveOn ?? 'soft';\r\n this.events = opts.events;\r\n this.failureMode = opts.failureMode ?? 'throw_on_hard';\r\n this.policyProvider = opts.policyProvider;\r\n }\r\n\r\n /** Allow callers (e.g. model-switch in WebUI) to update the context window\r\n * denominator when the active model changes. */\r\n setMaxContext(maxContext: number): void {\r\n this._maxContext = maxContext;\r\n }\r\n\r\n handler(): MiddlewareHandler<Context> {\r\n return async (ctx, next) => {\r\n const tokens = this.estimator(ctx);\r\n const load = tokens / this._maxContext;\r\n const policy = this.policyProvider?.(ctx);\r\n const thresholds = policy?.thresholds ?? {\r\n warn: this.warnThreshold,\r\n soft: this.softThreshold,\r\n hard: this.hardThreshold,\r\n };\r\n const aggressiveOn = policy?.aggressiveOn ?? this.aggressiveOn;\r\n\r\n if (load >= thresholds.hard) {\r\n await this.compact(ctx, true, { level: 'hard', tokens, load });\r\n } else if (load >= thresholds.soft) {\r\n await this.compact(ctx, aggressiveOn !== 'hard', { level: 'soft', tokens, load });\r\n } else if (load >= thresholds.warn) {\r\n await this.compact(ctx, aggressiveOn === 'warn', { level: 'warn', tokens, load });\r\n }\r\n\r\n return next(ctx);\r\n };\r\n }\r\n\r\n private async compact(\r\n ctx: Context,\r\n aggressive: boolean,\r\n pressure: { level: 'warn' | 'soft' | 'hard'; tokens: number; load: number },\r\n ): Promise<void> {\r\n try {\r\n const report = await this.compactor.compact(ctx, { aggressive });\r\n this.events?.emit('compaction.fired', {\r\n level: pressure.level,\r\n tokens: pressure.tokens,\r\n load: pressure.load,\r\n maxContext: this._maxContext,\r\n report,\r\n aggressive,\r\n });\r\n } catch (err) {\r\n const error = err instanceof Error ? err : new Error(String(err));\r\n const fatal =\r\n this.failureMode === 'throw' ||\r\n (this.failureMode === 'throw_on_hard' && pressure.level === 'hard');\r\n this.events?.emit('compaction.failed', {\r\n err: error,\r\n aggressive,\r\n level: pressure.level,\r\n tokens: pressure.tokens,\r\n maxContext: this._maxContext,\r\n load: pressure.load,\r\n fatal,\r\n });\r\n if (fatal) {\r\n throw new AgentError({\r\n message: `Auto-compaction failed at ${pressure.level} threshold`,\r\n code: ERROR_CODES.AGENT_CONTEXT_OVERFLOW,\r\n recoverable: true,\r\n context: {\r\n level: pressure.level,\r\n tokens: pressure.tokens,\r\n maxContext: this._maxContext,\r\n },\r\n cause: err,\r\n });\r\n }\r\n }\r\n }\r\n}\r\n","/**\n * Tool output serialization utilities.\n * Extracted from Agent.executeTools to allow reuse and consistent output handling.\n */\n\nexport interface ToolOutputSerializerOptions {\n perIterationOutputCapBytes?: number;\n estimator?: (text: string) => number;\n}\n\nexport function createToolOutputSerializer(opts: ToolOutputSerializerOptions = {}) {\n const capBytes = opts.perIterationOutputCapBytes ?? 100_000;\n\n function serialize(value: unknown): string {\n if (typeof value === 'string') return value;\n if (value === null || value === undefined) return '';\n if (typeof value === 'object') {\n if (Array.isArray(value)) return value.map(serialize).join('\\n');\n if ('text' in (value as Record<string, unknown>)) {\n const t = (value as Record<string, unknown>).text;\n return typeof t === 'string' ? t : JSON.stringify(value, null, 2);\n }\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n }\n return String(value);\n }\n\n function enforceCap(text: string, remainingBudget: number): { text: string; newBudget: number } {\n if (remainingBudget <= 0) {\n return { text: '[truncated: iteration output cap exceeded]', newBudget: 0 };\n }\n const textBytes = Buffer.byteLength(text, 'utf8');\n if (textBytes <= remainingBudget) {\n return { text, newBudget: remainingBudget - textBytes };\n }\n const marker = `\\n…[truncated ${textBytes - remainingBudget} bytes]…\\n`;\n const markerBytes = Buffer.byteLength(marker, 'utf8');\n const available = remainingBudget - markerBytes;\n if (available <= 0) {\n return { text: '[truncated: iteration output cap exceeded]', newBudget: 0 };\n }\n const half = Math.floor(available / 2);\n const first = text.slice(0, half);\n const second = text.slice(text.length - half);\n return { text: `${first}${marker}${second}`, newBudget: 0 };\n }\n\n return { serialize, enforceCap, capBytes };\n}\n","import type { Context } from '../core/context.js';\r\nimport type { ToolResultBlock, ToolUseBlock } from '../types/blocks.js';\r\nimport type {\r\n ToolBatchResult,\r\n ToolConfirmPendingResult,\r\n ToolExecutionOutput,\r\n ToolExecutorOptions,\r\n ToolExecutorStrategy,\r\n} from '../types/tool-executor.js';\r\nimport type { Tool } from '../types/tool.js';\r\nimport { createToolOutputSerializer } from '../utils/tool-output-serializer.js';\r\n\r\nexport class ToolExecutor {\r\n private readonly serializer;\r\n private readonly iterationTimeoutMs: number;\r\n\r\n constructor(\r\n private readonly registry: { get(name: string): Tool | undefined; list(): Tool[] },\r\n private opts: ToolExecutorOptions,\r\n ) {\r\n this.iterationTimeoutMs = opts.iterationTimeoutMs ?? 300_000;\r\n this.serializer = createToolOutputSerializer({\r\n perIterationOutputCapBytes: opts.perIterationOutputCapBytes ?? 100_000,\r\n });\r\n }\r\n\r\n /**\r\n * Clear the interactive confirm awaiter so the executor returns\r\n * `ToolConfirmPendingResult` instead of blocking on stdin. Used by\r\n * the CLI to switch from inline prompts (REPL) to event-driven\r\n * confirmation (TUI) at runtime.\r\n */\r\n clearConfirmAwaiter(): void {\r\n this.opts.confirmAwaiter = undefined;\r\n }\r\n\r\n /**\r\n * Execute a batch of tool uses using the configured strategy.\r\n * Returns the execution results and the remaining output budget.\r\n */\r\n async executeBatch(\r\n toolUses: ToolUseBlock[],\r\n ctx: Context,\r\n strategy: ToolExecutorStrategy,\r\n ): Promise<ToolBatchResult> {\r\n let budget = this.opts.perIterationOutputCapBytes ?? 100_000;\r\n\r\n const runOne = async (use: ToolUseBlock): Promise<ToolExecutionOutput> => {\r\n const start = Date.now();\r\n const tool = this.registry.get(use.name);\r\n\r\n // Fast path: unknown tool\r\n if (!tool) {\r\n const result = this.unknownToolResult(use, () => this.registry.list().map((t) => t.name));\r\n budget = this.decrementBudget(result, budget);\r\n return { result, tool, durationMs: Date.now() - start };\r\n }\r\n\r\n const decision = await this.opts.permissionPolicy.evaluate(tool, use.input, ctx);\r\n\r\n if (decision.permission === 'deny') {\r\n const result = this.deniedResult(use, decision.reason);\r\n budget = this.decrementBudget(result, budget);\r\n return { result, tool, durationMs: Date.now() - start };\r\n }\r\n\r\n if (decision.permission === 'confirm') {\r\n if (this.opts.confirmAwaiter) {\r\n const choice = await this.opts.confirmAwaiter(tool, use.input, use.id, tool.name);\r\n if (choice !== 'yes' && choice !== 'always') {\r\n const result = {\r\n type: 'tool_result' as const,\r\n tool_use_id: use.id,\r\n content: `Tool \"${tool.name}\" denied by user.`,\r\n is_error: true,\r\n };\r\n budget = this.decrementBudget(result, budget);\r\n return { result, tool, durationMs: Date.now() - start };\r\n }\r\n // fall through to execute\r\n } else {\r\n const suggestedPattern =\r\n this.subjectFor(tool.name, use.input, tool.subjectKey) ?? tool.name;\r\n const pending: ToolConfirmPendingResult = {\r\n type: 'tool_confirm_pending',\r\n toolUseId: use.id,\r\n toolName: tool.name,\r\n input: use.input,\r\n suggestedPattern,\r\n };\r\n return { result: pending, tool, durationMs: Date.now() - start };\r\n }\r\n }\r\n\r\n // permission === 'auto'\r\n // L1-C: trace each tool execution. Span is a no-op unless an OTel\r\n // adapter or other Tracer is bound — zero overhead by default.\r\n const span = this.opts.tracer?.startSpan(`tool.${tool.name}`, {\r\n 'tool.name': tool.name,\r\n 'tool.mutating': tool.mutating,\r\n 'tool.permission': tool.permission,\r\n });\r\n try {\r\n const result = await this.executeTool(tool, use, ctx, budget);\r\n budget = this.decrementBudget(result, budget);\r\n span?.setAttribute('tool.is_error', !!result.is_error);\r\n span?.setAttribute(\r\n 'tool.output_bytes',\r\n typeof result.content === 'string' ? result.content.length : 0,\r\n );\r\n return { result, tool, durationMs: Date.now() - start };\r\n } catch (err) {\r\n const msg = err instanceof Error ? err.message : String(err);\r\n const scrubbed = this.opts.secretScrubber.scrub(msg);\r\n this.opts.renderer?.writeToolResult(tool.name, scrubbed, true);\r\n const result = {\r\n type: 'tool_result' as const,\r\n tool_use_id: use.id,\r\n content: `Tool \"${tool.name}\" threw: ${scrubbed}`,\r\n is_error: true,\r\n };\r\n budget = this.decrementBudget(result, budget);\r\n if (err instanceof Error) span?.recordError(err);\r\n span?.setAttribute('tool.is_error', true);\r\n return { result, tool, durationMs: Date.now() - start };\r\n } finally {\r\n span?.end();\r\n }\r\n };\r\n\r\n // Run a single tool but never let an exception propagate to the\r\n // gather() below — `runOne` is already try/catch-wrapped for the\r\n // execution phase, but the *pre*-execution paths (permission policy,\r\n // confirmAwaiter) are unguarded and an unexpected throw there would\r\n // collapse Promise.all and lose every sibling's output. Wrap each\r\n // call so a per-tool failure becomes a per-tool error result.\r\n const safeRun = async (use: ToolUseBlock): Promise<ToolExecutionOutput> => {\r\n try {\r\n return await runOne(use);\r\n } catch (err) {\r\n const msg = err instanceof Error ? err.message : String(err);\r\n const scrubbed = this.opts.secretScrubber.scrub(msg);\r\n const result = {\r\n type: 'tool_result' as const,\r\n tool_use_id: use.id,\r\n content: `Tool \"${use.name}\" execution failed: ${scrubbed}`,\r\n is_error: true,\r\n };\r\n budget = this.decrementBudget(result, budget);\r\n return { result, tool: this.registry.get(use.name), durationMs: 0 };\r\n }\r\n };\r\n\r\n if (strategy === 'sequential') {\r\n const outputs: ToolExecutionOutput[] = [];\r\n for (const use of toolUses) {\r\n if (use) outputs.push(await safeRun(use));\r\n }\r\n return { outputs, remainingBudget: budget };\r\n }\r\n\r\n if (strategy === 'parallel') {\r\n const outputs = await Promise.all(toolUses.map((use) => safeRun(use)));\r\n return { outputs, remainingBudget: budget };\r\n }\r\n\r\n // smart: non-mutating in parallel, then mutating sequentially\r\n const nonMutating: ToolUseBlock[] = [];\r\n const mutating: ToolUseBlock[] = [];\r\n for (const use of toolUses) {\r\n if (!use) continue;\r\n const tool = this.registry.get(use.name);\r\n if (tool?.mutating) mutating.push(use);\r\n else nonMutating.push(use);\r\n }\r\n const firstPass = await Promise.all(nonMutating.map((use) => safeRun(use)));\r\n const secondPass: ToolExecutionOutput[] = [];\r\n for (const use of mutating) {\r\n secondPass.push(await safeRun(use));\r\n }\r\n return {\r\n outputs: [...firstPass, ...secondPass],\r\n remainingBudget: budget,\r\n };\r\n }\r\n\r\n /**\r\n * Execute a single tool with timeout, permission check, and output capping.\r\n * Emits `tool.started` via the injected EventBus (if any) right before\r\n * invoking the tool — closes the observability gap between \"model decided\r\n * to call a tool\" and \"tool.executed\".\r\n */\r\n async executeTool(\r\n tool: Tool,\r\n use: ToolUseBlock,\r\n ctx: Context,\r\n budget: number,\r\n ): Promise<ToolResultBlock> {\r\n this.opts.events?.emit('tool.started', {\r\n name: tool.name,\r\n id: use.id,\r\n input: use.input,\r\n });\r\n this.opts.renderer?.writeToolCall(tool.name, use.input);\r\n const output = await this.runWithTimeout(tool, use.input, ctx.signal, ctx, use.id);\r\n const text = this.serializer.serialize(output);\r\n const scrubbed = this.opts.secretScrubber.scrub(text);\r\n const { text: capped } = this.serializer.enforceCap(scrubbed, budget);\r\n this.opts.renderer?.writeToolResult(tool.name, capped, false);\r\n return {\r\n type: 'tool_result',\r\n tool_use_id: use.id,\r\n name: tool.name,\r\n content: capped,\r\n is_error: false,\r\n };\r\n }\r\n\r\n private async runWithTimeout(\r\n tool: Tool,\r\n input: unknown,\r\n parentSignal: AbortSignal,\r\n ctx: Context,\r\n toolUseId?: string,\r\n ): Promise<unknown> {\r\n if (parentSignal.aborted) {\r\n // Re-throw the original abort reason, whether it's an Error, string, or undefined.\r\n if (parentSignal.reason instanceof Error) throw parentSignal.reason;\r\n throw new Error(typeof parentSignal.reason === 'string' ? parentSignal.reason : 'aborted');\r\n }\r\n const timeoutMs = tool.timeoutMs ?? this.iterationTimeoutMs;\r\n const ctrl = new AbortController();\r\n const timer = setTimeout(() => ctrl.abort(new Error('tool timeout')), timeoutMs);\r\n const combined = AbortSignal.any([parentSignal, ctrl.signal]);\r\n let cleanupCalled = false;\r\n let caught = false;\r\n try {\r\n // Streaming variant takes precedence — yields progress events, then\r\n // a final 'final' event with the typed output. Tools that don't\r\n // implement executeStream fall through to the standard execute path.\r\n if (typeof tool.executeStream === 'function') {\r\n return await this.runStreamedTool(tool, input, ctx, combined, toolUseId);\r\n }\r\n return await tool.execute(input, ctx, { signal: combined });\r\n } catch (err) {\r\n caught = true;\r\n if (combined.aborted && typeof tool.cleanup === 'function') {\r\n // Best-effort cleanup; never let it mask the original error.\r\n cleanupCalled = true;\r\n try {\r\n await tool.cleanup(input, ctx);\r\n } catch {\r\n /* swallow */\r\n }\r\n }\r\n throw err;\r\n } finally {\r\n clearTimeout(timer);\r\n // If the tool completed successfully (no error thrown) but the combined\r\n // signal was aborted (e.g. timeout), the catch block above never fired.\r\n // Call cleanup here and then throw so the caller sees the abort.\r\n // When `caught` is true, we already have an in-flight throw — don't\r\n // override it from `finally` (that would replace the original error\r\n // with the abort reason and mask the actual failure).\r\n if (combined.aborted && !caught) {\r\n if (!cleanupCalled && typeof tool.cleanup === 'function') {\r\n try {\r\n await tool.cleanup(input, ctx);\r\n } catch {\r\n /* swallow */\r\n }\r\n }\r\n const reason = combined.reason instanceof Error\r\n ? combined.reason\r\n : new Error(typeof combined.reason === 'string' ? combined.reason : 'aborted');\r\n throw reason;\r\n }\r\n }\r\n }\r\n\r\n private async runStreamedTool(\r\n tool: Tool,\r\n input: unknown,\r\n ctx: Context,\r\n signal: AbortSignal,\r\n toolUseId: string | undefined,\r\n ): Promise<unknown> {\r\n let finalOutput: unknown;\r\n let sawFinal = false;\r\n const stream = tool.executeStream!(input, ctx, { signal });\r\n for await (const ev of stream) {\r\n if (ev.type === 'final') {\r\n finalOutput = ev.output;\r\n sawFinal = true;\r\n // Drain whatever the iterator wants to surface after final, but the\r\n // result is locked in. Most tools won't yield more.\r\n break;\r\n }\r\n this.opts.events?.emit('tool.progress', {\r\n name: tool.name,\r\n id: toolUseId ?? '<unknown>',\r\n event: ev,\r\n });\r\n }\r\n if (!sawFinal) {\r\n throw new Error(`tool \"${tool.name}\" executeStream completed without a 'final' event`);\r\n }\r\n return finalOutput;\r\n }\r\n\r\n private unknownToolResult(use: ToolUseBlock, listFns: () => string[]): ToolResultBlock {\r\n return {\r\n type: 'tool_result',\r\n tool_use_id: use.id,\r\n content: `Tool \"${use.name}\" is not registered. Available tools: ${listFns().join(', ')}`,\r\n is_error: true,\r\n };\r\n }\r\n\r\n private deniedResult(use: ToolUseBlock, reason?: string): ToolResultBlock {\r\n return {\r\n type: 'tool_result',\r\n tool_use_id: use.id,\r\n content: `Tool \"${use.name}\" denied: ${reason ?? 'policy'}`,\r\n is_error: true,\r\n };\r\n }\r\n\r\n private decrementBudget(result: ToolResultBlock, budget: number): number {\r\n const contentBytes =\r\n typeof result.content === 'string'\r\n ? Buffer.byteLength(result.content, 'utf8')\r\n : Buffer.byteLength(JSON.stringify(result.content), 'utf8');\r\n return Math.max(0, budget - contentBytes);\r\n }\r\n\r\n /**\r\n * Compute the suggestedPattern string for a tool+input pair.\r\n * Matches the logic in DefaultPermissionPolicy so the TUI shows the\r\n * same subject that the trust file would use.\r\n */\r\n private subjectFor(toolName: string, input: unknown, subjectKey?: string): string | undefined {\r\n if (!input || typeof input !== 'object') return undefined;\r\n const obj = input as Record<string, unknown>;\r\n const globChars = /[*?\\[\\]]/g;\r\n const escapeGlob = (s: string) => s.replace(globChars, (c) => `\\\\${c}`);\r\n const normalizePath = (s: string) => escapeGlob(s.replace(/\\\\/g, '/'));\r\n\r\n // Mirror DefaultPermissionPolicy.subjectFor — keep both in sync so the\r\n // TUI's \"suggested pattern\" matches what the trust file actually uses.\r\n if (subjectKey) {\r\n const v = obj[subjectKey];\r\n if (typeof v === 'string') {\r\n const isPathKey = subjectKey === 'path' || subjectKey === 'file' || subjectKey === 'files';\r\n return isPathKey ? normalizePath(v) : escapeGlob(v);\r\n }\r\n }\r\n\r\n if (toolName === 'bash' && typeof obj.command === 'string') {\r\n return escapeGlob(obj.command);\r\n }\r\n if (typeof obj.path === 'string') {\r\n return normalizePath(obj.path);\r\n }\r\n if (typeof obj.url === 'string') {\r\n return escapeGlob(obj.url);\r\n }\r\n if (typeof obj.name === 'string') {\r\n return escapeGlob(obj.name);\r\n }\r\n return undefined;\r\n }\r\n}\r\n","/**\n * Compile a user-supplied regex with conservative bounds against ReDoS.\n *\n * Duplicated from @wrongstack/tools/_regex.ts to avoid a circular\n * dependency (tools depends on core, not vice versa). Keep both copies\n * in sync if the heuristics change.\n *\n * V8's regex engine is backtracking-based and cannot interrupt a\n * synchronous match — a pattern like `(a+)+$` against a sufficiently\n * long line will pin a worker for seconds.\n */\n\nconst MAX_PATTERN_LEN = 512;\n\n// Heuristics for catastrophic-backtracking constructs.\nconst DANGEROUS_PATTERNS: ReadonlyArray<RegExp> = [\n /(\\([^)]*[+*][^)]*\\))[+*]/, // (a+)+, (.*)+, etc\n /(\\(\\?:[^)]*[+*][^)]*\\))[+*]/, // same, with non-capturing group\n];\n\nexport interface CompileResult {\n ok: true;\n regex: RegExp;\n}\n\nexport interface CompileFail {\n ok: false;\n reason: string;\n}\n\nexport function compileUserRegex(pattern: string, flags: string): CompileResult | CompileFail {\n if (typeof pattern !== 'string') {\n return { ok: false, reason: 'pattern must be a string' };\n }\n if (pattern.length === 0) {\n return { ok: false, reason: 'pattern is empty' };\n }\n if (pattern.length > MAX_PATTERN_LEN) {\n return { ok: false, reason: `pattern exceeds ${MAX_PATTERN_LEN} characters` };\n }\n for (const rx of DANGEROUS_PATTERNS) {\n if (rx.test(pattern)) {\n return {\n ok: false,\n reason:\n 'pattern looks vulnerable to catastrophic backtracking — rewrite without nested quantifiers',\n };\n }\n }\n try {\n return { ok: true, regex: new RegExp(pattern, flags) };\n } catch (err) {\n return {\n ok: false,\n reason: err instanceof Error ? err.message : 'invalid regex',\n };\n }\n}\n","import type { Agent, RunResult } from '../core/agent.js';\r\nimport type { Context } from '../core/context.js';\r\nimport { toWrongStackError } from '../types/errors.js';\r\nimport type { DoneCondition } from '../types/multi-agent.js';\r\nimport { compileUserRegex } from '../utils/regex-guard.js';\r\n\r\ntype AutonomousResult = RunResult & { toolCalls: number; reason?: string };\r\n\r\nexport interface DoneCheckResult {\r\n done: boolean;\r\n reason?: string;\r\n iterations: number;\r\n toolCalls: number;\r\n}\r\n\r\nexport class DoneConditionChecker {\r\n private readonly compiledRegex: RegExp | null;\r\n\r\n constructor(private readonly condition: DoneCondition) {\r\n if (condition.type === 'output_match' && condition.pattern) {\r\n const result = compileUserRegex(condition.pattern, '');\r\n this.compiledRegex = result.ok ? result.regex : null;\r\n if (!result.ok) {\r\n // Log warning but don't throw — the done condition simply won't match\r\n console.warn(`[DoneConditionChecker] Invalid regex pattern \"${condition.pattern}\": ${result.reason}`);\r\n }\r\n } else {\r\n this.compiledRegex = null;\r\n }\r\n }\r\n\r\n check(state: { iterations: number; toolCalls: number; lastOutput?: string }): DoneCheckResult {\r\n switch (this.condition.type) {\r\n case 'iterations':\r\n if (this.condition.maxIterations && state.iterations >= this.condition.maxIterations) {\r\n return {\r\n done: true,\r\n reason: `max iterations (${this.condition.maxIterations}) reached`,\r\n ...state,\r\n };\r\n }\r\n break;\r\n\r\n case 'tool_calls':\r\n if (this.condition.maxToolCalls && state.toolCalls >= this.condition.maxToolCalls) {\r\n return {\r\n done: true,\r\n reason: `max tool calls (${this.condition.maxToolCalls}) reached`,\r\n ...state,\r\n };\r\n }\r\n break;\r\n\r\n case 'output_match':\r\n if (this.compiledRegex && state.lastOutput && this.compiledRegex.test(state.lastOutput)) {\r\n return {\r\n done: true,\r\n reason: `output matched pattern \"${this.condition.pattern}\"`,\r\n ...state,\r\n };\r\n }\r\n break;\r\n\r\n case 'directive':\r\n // Model-driven: the agent manages its own continuation via [continue]/[done].\r\n // The done condition is never satisfied by the checker — the agent returns\r\n // `status: 'done'` when the model emits [done] or naturally finishes.\r\n // The runner's outer loop uses maxIterations/maxToolCalls as hard caps.\r\n if (this.condition.maxIterations && state.iterations >= this.condition.maxIterations) {\r\n return { done: true, reason: `max iterations (${this.condition.maxIterations}) reached`, ...state };\r\n }\r\n if (this.condition.maxToolCalls && state.toolCalls >= this.condition.maxToolCalls) {\r\n return { done: true, reason: `max tool calls (${this.condition.maxToolCalls}) reached`, ...state };\r\n }\r\n break;\r\n\r\n case 'custom':\r\n // Reserved for future extension\r\n break;\r\n }\r\n\r\n return { done: false, iterations: state.iterations, toolCalls: state.toolCalls };\r\n }\r\n}\r\n\r\nexport interface AutonomousRunnerOptions {\r\n agent: Agent;\r\n context: Context;\r\n doneCondition: DoneCondition;\r\n iterationTimeoutMs?: number;\r\n onIteration?: (state: { iteration: number; toolCalls: number }) => void;\r\n onDone?: (result: AutonomousResult) => void;\r\n /**\r\n * When true and `doneCondition.type === 'directive'`, the runner\r\n * runs the agent with `autonomousContinue: true` so the agent loop\r\n * handles its own [continue]/[done] markers internally (no outer\r\n * re-invocation needed). The runner still provides iteration/timeouts.\r\n */\r\n enableAutonomousContinue?: boolean;\r\n}\r\n\r\nexport class AutonomousRunner {\r\n private iterations = 0;\r\n private toolCalls = 0;\r\n private lastOutput?: string;\r\n private stopped = false;\r\n private readonly doneChecker: DoneConditionChecker;\r\n\r\n constructor(private readonly opts: AutonomousRunnerOptions) {\r\n this.doneChecker = new DoneConditionChecker(opts.doneCondition);\r\n }\r\n\r\n async run(): Promise<AutonomousResult> {\r\n // Subscribe to `tool.executed` so the per-tool budget (`tool_calls`\r\n // done-condition) actually counts each tool invocation rather than\r\n // each `agent.run()` call. Without this, a single iteration that\r\n // fires 5 tools only bumps the counter once, and a `maxToolCalls: 3`\r\n // budget would fire after 3 iterations (typically 3×N tools) instead\r\n // of after 3 tools. Unsubscribed in the `finally` so the listener\r\n // doesn't outlive this run instance. Mock agents in tests may pass\r\n // null/undefined for `events`; gracefully skip when missing — those\r\n // tests don't exercise the tool-count budget path.\r\n const offToolExecuted = this.opts.agent.events?.on?.('tool.executed', () => {\r\n this.toolCalls++;\r\n });\r\n // When autonomous continue is enabled, also count internal agent-loop\r\n // iterations. Each iteration.started within a single agent.run() call\r\n // counts toward the runner's maxIterations cap. We listen to the event\r\n // through the agent's EventBus.\r\n const offIterationCompleted = this.opts.agent.events?.on?.('iteration.completed', () => {\r\n // Only count if we're in autonomous continue mode (agent loop\r\n // handles multiple iterations internally before returning).\r\n if (this.opts.enableAutonomousContinue && this.opts.doneCondition.type === 'directive') {\r\n // Each internal iteration completed — bump the outer iteration counter.\r\n // This ensures maxIterations on the runner actually limits total work.\r\n this.iterations++;\r\n }\r\n });\r\n try {\r\n return await this.runLoop();\r\n } finally {\r\n offToolExecuted?.();\r\n offIterationCompleted?.();\r\n }\r\n }\r\n\r\n private async runLoop(): Promise<AutonomousResult> {\r\n while (!this.stopped) {\r\n const check = this.doneChecker.check({\r\n iterations: this.iterations,\r\n toolCalls: this.toolCalls,\r\n lastOutput: this.lastOutput,\r\n });\r\n\r\n if (check.done) {\r\n const result: AutonomousResult = {\r\n status: 'done',\r\n iterations: this.iterations,\r\n toolCalls: this.toolCalls,\r\n reason: check.reason,\r\n };\r\n this.opts.onDone?.(result);\r\n return result;\r\n }\r\n\r\n this.opts.onIteration?.({ iteration: this.iterations, toolCalls: this.toolCalls });\r\n\r\n const ctrl = new AbortController();\r\n const timeout = setTimeout(() => ctrl.abort(), this.opts.iterationTimeoutMs ?? 30_000);\r\n\r\n try {\r\n // In directive mode with autonomous continue, pass it through so the\r\n // agent loop handles its own [continue]/[done] markers internally.\r\n // The runner provides iteration caps and timeouts; the agent handles\r\n // the continuation decision within each agent.run() call.\r\n const isDirectiveMode =\r\n this.opts.doneCondition.type === 'directive' &&\r\n this.opts.enableAutonomousContinue;\r\n\r\n const result = await this.opts.agent.run('', {\r\n signal: ctrl.signal,\r\n maxIterations: isDirectiveMode ? (this.opts.doneCondition.maxIterations ?? 100) : 1,\r\n executionStrategy: 'sequential',\r\n autonomousContinue: isDirectiveMode ? true : undefined,\r\n });\r\n\r\n // Only increment iterations if we're NOT counting via iteration.completed\r\n // (i.e., not in autonomous continue directive mode). In that mode,\r\n // the offIterationCompleted listener in run() bumps this counter\r\n // per internal iteration so the runner's maxIterations cap is respected.\r\n if (!isDirectiveMode) this.iterations++;\r\n // Only access finalText when the run actually succeeded. Failed/aborted\r\n // runs may have undefined finalText — accessing it unconditionally would\r\n // produce garbage output for the done-condition matchers.\r\n if (result.status === 'done') {\r\n this.lastOutput = result.finalText;\r\n }\r\n // `toolCalls` is bumped by the `tool.executed` listener installed\r\n // in run() — no manual increment here.\r\n\r\n if (result.status === 'failed' || result.status === 'aborted') {\r\n const failedResult: AutonomousResult = {\r\n status: result.status,\r\n error: result.error,\r\n iterations: this.iterations,\r\n toolCalls: this.toolCalls,\r\n };\r\n this.opts.onDone?.(failedResult);\r\n return failedResult;\r\n }\r\n } catch (e) {\r\n // Be precise about what constitutes a timeout error — matching on\r\n // 'timeout' substring is too loose (an error message containing\r\n // \"timeout exceeded\" from the LLM is not the same as an abort).\r\n const isAbort =\r\n (e instanceof DOMException && e.name === 'AbortError') ||\r\n (e instanceof Error && e.name === 'AbortError') ||\r\n (e instanceof Error && e.message.includes('iteration timeout'));\r\n if (isAbort) {\r\n const timeoutResult: AutonomousResult = {\r\n status: 'failed',\r\n error: toWrongStackError(e),\r\n iterations: this.iterations,\r\n toolCalls: this.toolCalls,\r\n reason: 'iteration timeout',\r\n };\r\n this.opts.onDone?.(timeoutResult);\r\n return timeoutResult;\r\n }\r\n // Any other throw (TypeError, tool crash propagation, etc.) must\r\n // stop the loop — silently continuing would spin forever on the\r\n // same error and burn provider tokens with no progress.\r\n this.stopped = true;\r\n const failedResult: AutonomousResult = {\r\n status: 'failed',\r\n error: toWrongStackError(e),\r\n iterations: this.iterations,\r\n toolCalls: this.toolCalls,\r\n reason: e instanceof Error ? e.message : String(e),\r\n };\r\n this.opts.onDone?.(failedResult);\r\n return failedResult;\r\n } finally {\r\n clearTimeout(timeout);\r\n }\r\n }\r\n\r\n return {\r\n status: 'aborted',\r\n iterations: this.iterations,\r\n toolCalls: this.toolCalls,\r\n reason: 'stopped externally',\r\n };\r\n }\r\n\r\n stop(): void {\r\n this.stopped = true;\r\n }\r\n}\r\n","import { randomBytes } from 'node:crypto';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\n\nexport interface AtomicWriteOptions {\n mode?: number;\n encoding?: BufferEncoding;\n}\n\nexport async function atomicWrite(\n targetPath: string,\n content: string | Uint8Array,\n opts: AtomicWriteOptions = {},\n): Promise<void> {\n const dir = path.dirname(targetPath);\n await fs.mkdir(dir, { recursive: true });\n const tmp = path.join(dir, `.${path.basename(targetPath)}.${randomBytes(6).toString('hex')}.tmp`);\n\n // Write content to tmp first; 'wx' ensures exclusive creation (fails if\n // tmp already exists — extremely unlikely with 6-byte random suffix).\n try {\n if (typeof content === 'string') {\n await fs.writeFile(tmp, content, { flag: 'wx', encoding: opts.encoding ?? 'utf8' });\n } else {\n await fs.writeFile(tmp, content, { flag: 'wx' });\n }\n try {\n const fh = await fs.open(tmp, 'r+');\n try {\n await fh.sync();\n } finally {\n await fh.close();\n }\n } catch {\n // fsync best-effort\n }\n // Now safely read mode from target (if it exists) and apply to tmp before rename.\n // Prefer opts.mode for new files; for existing files preserve their mode.\n let mode: number | undefined;\n try {\n const stat = await fs.stat(targetPath);\n mode = stat.mode & 0o777;\n } catch {\n mode = opts.mode;\n }\n if (mode !== undefined) {\n await fs.chmod(tmp, mode);\n }\n await renameWithRetry(tmp, targetPath);\n } catch (err) {\n try {\n await fs.unlink(tmp);\n } catch {\n // ignore cleanup error\n }\n throw err;\n }\n}\n\nexport async function ensureDir(dir: string): Promise<void> {\n await fs.mkdir(dir, { recursive: true });\n}\n\n// On Windows, fs.rename over an existing file can fail with EPERM/EBUSY/EACCES\n// when antivirus, file indexers, editor file watchers, or a concurrent writer\n// briefly hold a handle on the destination. These are transient — retry with a\n// short backoff before giving up. POSIX renames are atomic and won't hit this.\nconst TRANSIENT_RENAME_CODES = new Set(['EPERM', 'EBUSY', 'EACCES', 'ENOTEMPTY']);\n\nasync function renameWithRetry(from: string, to: string): Promise<void> {\n if (process.platform !== 'win32') {\n await fs.rename(from, to);\n return;\n }\n const delays = [10, 25, 60, 120, 250];\n let lastErr: unknown;\n for (let i = 0; i <= delays.length; i++) {\n try {\n await fs.rename(from, to);\n return;\n } catch (err) {\n lastErr = err;\n const code = (err as NodeJS.ErrnoException)?.code;\n if (!code || !TRANSIENT_RENAME_CODES.has(code) || i === delays.length) {\n throw err;\n }\n await new Promise((resolve) => setTimeout(resolve, delays[i]));\n }\n }\n throw lastErr;\n}\n","import * as fsp from 'node:fs/promises';\r\nimport * as path from 'node:path';\r\nimport { atomicWrite } from '../utils/atomic-write.js';\r\nimport { FsError, ERROR_CODES } from '../types/errors.js';\r\n\r\n/**\r\n * Long-running autonomous mission. A goal survives across sessions and\r\n * drives the EternalAutonomyEngine — every iteration of the engine\r\n * consults the goal to choose what to do next.\r\n *\r\n * Storage: `<projectRoot>/.wrongstack/goal.json`. Persistent and\r\n * project-scoped on purpose: the goal belongs to the codebase, not the\r\n * REPL session.\r\n */\r\n\r\nexport interface JournalEntry {\r\n /** ISO timestamp of the iteration. */\r\n at: string;\r\n /** Sequential iteration counter (1-based, monotonically increasing). */\r\n iteration: number;\r\n /** Source that produced the action ('todo' | 'git' | 'brainstorm' | 'resume' | 'manual' | 'parallel'). */\r\n source: 'todo' | 'git' | 'brainstorm' | 'resume' | 'manual' | 'parallel';\r\n /** Short one-line description of what the iteration set out to do. */\r\n task: string;\r\n /** Outcome status. */\r\n status: 'success' | 'failure' | 'aborted' | 'skipped';\r\n /** Optional free-form note (error message, summary, etc.). */\r\n note?: string;\r\n /** Optional token usage delta for this iteration. */\r\n tokens?: { input: number; output: number };\r\n /** Optional USD cost delta for this iteration (provider-estimated). */\r\n costUsd?: number;\r\n}\r\n\r\nexport interface GoalFile {\r\n version: 1;\r\n /** The mission statement. */\r\n goal: string;\r\n /** When the goal was first set or last replaced. */\r\n setAt: string;\r\n /** Updated on every iteration completion. */\r\n lastActivityAt: string;\r\n /** Total iterations the engine has run against this goal (cumulative). */\r\n iterations: number;\r\n /** Engine lifecycle state — 'running' means another process owns this goal. */\r\n engineState: 'idle' | 'running' | 'stopped';\r\n /**\r\n * Mission-level lifecycle. `active` is the default; `completed` is set\r\n * when the engine detects `[GOAL_COMPLETE]` in a successful iteration's\r\n * final text AND a verification pass agrees; `abandoned` is set by the\r\n * user (e.g. `/goal abandon`) or when the engine exceeds a configured\r\n * failure ceiling. Once not `active`, the engine refuses to run further\r\n * iterations against this goal — protects against accidental restarts\r\n * burning through API quota after the work is done.\r\n *\r\n * Optional for backward compatibility — pre-existing `goal.json` files\r\n * without this field load as `active`.\r\n */\r\n goalState?: 'active' | 'paused' | 'completed' | 'abandoned';\r\n /**\r\n * Per-todo attempt counter. Keyed by TodoItem id. Used by the engine\r\n * to skip a todo that has failed N times rather than spinning on it\r\n * forever. Persisted so attempt counts survive restarts (`/autonomy\r\n * stop` + resume should not reset progress against a stuck task).\r\n */\r\n todoAttempts?: Record<string, number>;\r\n /** Bounded ring buffer of recent iterations (newest last). */\r\n journal: JournalEntry[];\r\n}\r\n\r\n/** Cap on persisted journal entries — older entries are evicted FIFO. */\r\nexport const MAX_JOURNAL_ENTRIES = 500;\r\n\r\n/**\r\n * Resolve the goal file path for a given project root.\r\n * Exposed so the engine and CLI use one canonical path.\r\n */\r\nexport function goalFilePath(projectRoot: string): string {\r\n return path.join(projectRoot, '.wrongstack', 'goal.json');\r\n}\r\n\r\nexport async function loadGoal(filePath: string): Promise<GoalFile | null> {\r\n let raw: string;\r\n try {\r\n raw = await fsp.readFile(filePath, 'utf8');\r\n } catch {\r\n return null;\r\n }\r\n try {\r\n const parsed = JSON.parse(raw) as GoalFile;\r\n if (parsed?.version !== 1 || typeof parsed.goal !== 'string' || !Array.isArray(parsed.journal)) {\r\n return null;\r\n }\r\n return parsed;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nexport async function saveGoal(filePath: string, goal: GoalFile): Promise<void> {\r\n try {\r\n await atomicWrite(filePath, JSON.stringify(goal, null, 2), { mode: 0o600 });\r\n } catch (err) {\r\n throw new FsError({\r\n message: err instanceof Error ? err.message : String(err),\r\n code: ERROR_CODES.FS_ATOMIC_WRITE_FAILED,\r\n path: filePath,\r\n cause: err,\r\n });\r\n }\r\n}\r\n\r\nexport function emptyGoal(goal: string): GoalFile {\r\n const now = new Date().toISOString();\r\n return {\r\n version: 1,\r\n goal,\r\n setAt: now,\r\n lastActivityAt: now,\r\n iterations: 0,\r\n engineState: 'idle',\r\n goalState: 'active',\r\n todoAttempts: {},\r\n journal: [],\r\n };\r\n}\r\n\r\n/**\r\n * Append a journal entry, bumping iteration counters and trimming the\r\n * ring buffer. Returns a new GoalFile — does not mutate the argument.\r\n */\r\nexport function appendJournal(goal: GoalFile, entry: Omit<JournalEntry, 'iteration' | 'at'>): GoalFile {\r\n const iteration = goal.iterations + 1;\r\n const at = new Date().toISOString();\r\n const full: JournalEntry = { ...entry, iteration, at };\r\n const journal = [...goal.journal, full];\r\n // Trim FIFO if over cap. Slice from the tail so the *newest* MAX entries survive.\r\n const trimmed = journal.length > MAX_JOURNAL_ENTRIES\r\n ? journal.slice(journal.length - MAX_JOURNAL_ENTRIES)\r\n : journal;\r\n return {\r\n ...goal,\r\n iterations: iteration,\r\n lastActivityAt: at,\r\n journal: trimmed,\r\n };\r\n}\r\n\r\n/**\r\n * Aggregate cumulative cost + tokens across all journal entries. Entries\r\n * without telemetry are skipped (legacy entries from before the field\r\n * was added still load cleanly).\r\n */\r\nexport function summarizeUsage(goal: GoalFile): {\r\n totalCostUsd: number;\r\n totalInputTokens: number;\r\n totalOutputTokens: number;\r\n iterationsWithUsage: number;\r\n} {\r\n let totalCostUsd = 0;\r\n let totalInputTokens = 0;\r\n let totalOutputTokens = 0;\r\n let iterationsWithUsage = 0;\r\n for (const e of goal.journal) {\r\n if (typeof e.costUsd === 'number') totalCostUsd += e.costUsd;\r\n if (e.tokens) {\r\n totalInputTokens += e.tokens.input;\r\n totalOutputTokens += e.tokens.output;\r\n }\r\n if (typeof e.costUsd === 'number' || e.tokens) iterationsWithUsage++;\r\n }\r\n return { totalCostUsd, totalInputTokens, totalOutputTokens, iterationsWithUsage };\r\n}\r\n\r\n/** Format the goal + recent journal as a human-readable status block. */\r\nexport function formatGoal(goal: GoalFile, journalLimit = 10): string {\r\n const lines: string[] = [];\r\n lines.push(`Goal: ${goal.goal}`);\r\n lines.push(`Set: ${goal.setAt}`);\r\n lines.push(`Last activity: ${goal.lastActivityAt}`);\r\n lines.push(`Iterations: ${goal.iterations}`);\r\n const stateLabel = goal.goalState ?? 'active';\r\n lines.push(`State: ${stateLabel}${goal.iterations > 0 ? ` (iteration #${goal.iterations})` : ''}`);\r\n lines.push(`Engine: ${goal.engineState}`);\r\n const usage = summarizeUsage(goal);\r\n if (usage.iterationsWithUsage > 0) {\r\n lines.push(\r\n `Spent: $${usage.totalCostUsd.toFixed(4)} (in ${usage.totalInputTokens} / out ${usage.totalOutputTokens} tokens across ${usage.iterationsWithUsage} iterations)`,\r\n );\r\n }\r\n if (goal.journal.length > 0) {\r\n lines.push('');\r\n lines.push(`Recent journal (last ${Math.min(journalLimit, goal.journal.length)}):`);\r\n const tail = goal.journal.slice(-journalLimit);\r\n for (const e of tail) {\r\n const mark = e.status === 'success' ? '✓' : e.status === 'failure' ? '✗' : e.status === 'aborted' ? '⊘' : '·';\r\n const note = e.note ? ` — ${e.note}` : '';\r\n const cost = typeof e.costUsd === 'number' ? ` ($${e.costUsd.toFixed(4)})` : '';\r\n lines.push(` #${e.iteration} ${mark} [${e.source}] ${e.task}${cost}${note}`);\r\n }\r\n }\r\n return lines.join('\\n');\r\n}\r\n","import { execFile } from 'node:child_process';\r\nimport { promisify } from 'node:util';\r\nimport type { Agent } from '../core/agent.js';\r\nimport type { TodoItem } from '../core/context.js';\r\nimport type { Compactor } from '../types/compactor.js';\r\nimport {\r\n appendJournal,\r\n loadGoal,\r\n saveGoal,\r\n goalFilePath,\r\n type GoalFile,\r\n type JournalEntry,\r\n} from '../storage/goal-store.js';\r\n\r\nconst execFileP = promisify(execFile);\r\n\r\n/**\r\n * Sense-decide-execute-reflect loop on top of a long-running Goal.\r\n *\r\n * Each iteration:\r\n * 1. Sense — read goal, pending todos, `git status --porcelain`.\r\n * 2. Decide — pick a source (todo / git / brainstorm) and a task.\r\n * 3. Execute — single agent.run with a directive prompt.\r\n * 4. Reflect — append a journal entry, persist state to disk.\r\n *\r\n * The loop runs forever until `stop()` is called externally (REPL SIGINT\r\n * handler, /autonomy stop). No internal time/cost cap by design — the\r\n * user wants \"sittin sene\". Failures are logged and the loop continues\r\n * with a different source on the next tick.\r\n */\r\n\r\nexport interface EternalAutonomyOptions {\r\n agent: Agent;\r\n projectRoot: string;\r\n /**\r\n * Per-iteration agent timeout. Defaults to 5 minutes. A single hung\r\n * provider call should not freeze the whole eternal loop.\r\n */\r\n iterationTimeoutMs?: number;\r\n /**\r\n * Maximum number of internal agent.run iterations the engine grants per\r\n * eternal-loop tick. The engine sets `autonomousContinue: true` so the\r\n * agent can run multi-step tasks end-to-end within one tick instead of\r\n * bouncing back to the engine after every single tool call. Default 500.\r\n * Previous 50 was far too low — agents hit the limit and restart constantly.\r\n */\r\n iterationMaxAgentSteps?: number;\r\n /**\r\n * Minimum sleep between iterations. Defaults to 1 s — enough for\r\n * SIGINT handlers to fire mid-loop without pegging a core when the\r\n * provider is being rate-limited.\r\n */\r\n cycleGapMs?: number;\r\n /**\r\n * Maximum consecutive failures before the source rotation forces a\r\n * brainstorm cycle. Default 3. Acts as a soft-recovery, not a stop.\r\n */\r\n failureBudget?: number;\r\n /**\r\n * Per-todo failed-attempt ceiling. When the engine picks the same todo\r\n * and the iteration fails this many times in total, the todo is taken\r\n * out of rotation (engine prefers other sources) until it changes\r\n * status. Default 3. Prevents the loop from spinning forever on one\r\n * stuck task.\r\n */\r\n todoMaxAttempts?: number;\r\n /**\r\n * Consecutive brainstorm-DONE responses required to consider the goal\r\n * complete and stop the engine. When the LLM's brainstorm step keeps\r\n * answering `DONE`, the engine treats that as \"no more work\" and, after\r\n * this many in a row, marks the goal as completed instead of sleeping\r\n * forever. Default 3.\r\n */\r\n brainstormDoneStopThreshold?: number;\r\n /** Side-channel notifications (logging, UI updates). */\r\n onIteration?: (entry: JournalEntry) => void;\r\n onError?: (err: Error, iteration: number) => void;\r\n /**\r\n * Per-iteration phase notifications for live UI updates (TUI status bar,\r\n * etc.). Fires at each major stage transition: idle → decide → execute →\r\n * reflect → (sleep | paused | stopped). Fire-and-forget — the engine\r\n * does not await the callback.\r\n */\r\n onStage?: (stage: IterationStage) => void;\r\n /**\r\n * Optional injected git status reader — production code uses git, tests\r\n * stub this out so they don't shell out.\r\n */\r\n gitStatusReader?: () => Promise<string>;\r\n /**\r\n * Optional clock — tests stub for deterministic timestamps.\r\n */\r\n now?: () => Date;\r\n /**\r\n * Optional compactor. When provided, the engine runs compaction every\r\n * `compactEveryNIterations` iterations to keep the agent's message\r\n * history under control during multi-day eternal loops. Without\r\n * compaction, an infinite loop will eventually overflow the provider's\r\n * context window and start failing.\r\n */\r\n compactor?: Compactor;\r\n /** How many iterations between compaction calls. Default 25. */\r\n compactEveryNIterations?: number;\r\n /**\r\n * Aggressive compaction threshold. When ctx token usage exceeds this\r\n * fraction of `maxContextTokens`, compaction runs in aggressive mode\r\n * regardless of the iteration cadence. 0.85 by default.\r\n */\r\n aggressiveCompactRatio?: number;\r\n /**\r\n * Model's max context window in tokens. When set, the engine watches\r\n * `currentRequestTokens()` against this and triggers aggressive compact\r\n * before the next iteration would overflow. Omit to disable threshold\r\n * checks (iteration cadence still applies).\r\n */\r\n maxContextTokens?: number;\r\n /**\r\n * Base delay (ms) for the first transient-error backoff. Subsequent\r\n * transient failures double this, capped at `transientBackoffMaxMs`.\r\n * Default 2_000.\r\n *\r\n * \"Transient\" means the underlying error is recoverable per\r\n * `WrongStackError.recoverable` (ProviderError sets this for 429/529/5xx\r\n * /network errors). Permanent errors (auth/invalid request) skip the\r\n * backoff and count toward `failureBudget` like before — backing off\r\n * on a permanent failure is wasted time.\r\n */\r\n transientBackoffBaseMs?: number;\r\n /** Ceiling for the exponential backoff. Default 60_000 (60 s). */\r\n transientBackoffMaxMs?: number;\r\n /** Called when the eternal loop stops for any reason (manual stop, goal complete, etc.). */\r\n onEternalStop?: () => void;\r\n}\r\n\r\nexport type EternalEngineState = 'idle' | 'running' | 'stopped';\r\n\r\n/**\r\n * Per-iteration phase emitted via `onStage` so UIs can render the\r\n * engine's live location in the sense-decide-execute-reflect loop.\r\n */\r\nexport type IterationStage =\r\n | { phase: 'idle' }\r\n | { phase: 'decide'; reason: string }\r\n | { phase: 'execute'; task: string }\r\n | { phase: 'reflect'; status: 'success' | 'failure' | 'aborted' | 'skipped'; note?: string }\r\n | { phase: 'sleep'; ms: number }\r\n | { phase: 'paused' }\r\n | { phase: 'stopped' }\r\n | { phase: 'error'; message: string };\r\n\r\ninterface DecidedAction {\r\n source: JournalEntry['source'];\r\n task: string;\r\n directive: string;\r\n /** Set when source === 'todo' so the engine can attribute failures. */\r\n todoId?: string;\r\n}\r\n\r\n/**\r\n * Sentinel returned by `brainstormTask` when the LLM declares the goal\r\n * fully accomplished. Distinct from `null` (which means \"brainstorm\r\n * failed / no actionable task right now\") so the engine can count\r\n * consecutive DONE answers toward a real stop.\r\n */\r\nconst BRAINSTORM_DONE = Symbol('brainstorm-done');\r\n\r\n/**\r\n * Free-text marker the model can emit (on its own line) to declare the\r\n * overall mission accomplished. Detected in the successful iteration's\r\n * `finalText`. When present, the engine flips `goalState='completed'`\r\n * and stops — the model has explicitly claimed completion AND the\r\n * iteration succeeded, which together is the most reliable stop signal\r\n * we can get without a separate verifier round-trip.\r\n */\r\nconst GOAL_COMPLETE_MARKER = /^\\s*\\[goal[_\\s-]*complete\\]\\s*$/im;\r\n\r\n/**\r\n * Free-text marker for the `/goal clear` command equivalent — when the\r\n * model emits this, the engine treats it as a manual goal clear (not just\r\n * completion) so the goal file is removed and onEternalStop fires.\r\n */\r\nconst GOAL_CLEAR_MARKER = /^\\s*\\[\\/?goal\\s*clear\\]\\s*$/im;\r\n\r\nexport class EternalAutonomyEngine {\r\n private state: EternalEngineState = 'idle';\r\n private stopRequested = false;\r\n private consecutiveFailures = 0;\r\n private consecutiveBrainstormDone = 0;\r\n /**\r\n * Count of consecutive transient (recoverable) provider failures. Drives\r\n * the exponential backoff between iterations. Reset on the first\r\n * successful iteration so a single bad afternoon doesn't permanently\r\n * slow the loop down.\r\n */\r\n private consecutiveTransientRetries = 0;\r\n private currentCtrl: AbortController | null = null;\r\n private iterationsSinceCompact = 0;\r\n private readonly goalPath: string;\r\n\r\n constructor(private readonly opts: EternalAutonomyOptions) {\r\n this.goalPath = goalFilePath(opts.projectRoot);\r\n }\r\n\r\n /** Current engine state — readable for UIs. */\r\n get currentState(): EternalEngineState {\r\n return this.state;\r\n }\r\n\r\n /** Synchronously request stop. Resolves once the running iteration aborts. */\r\n stop(): void {\r\n this.stopRequested = true;\r\n this.currentCtrl?.abort();\r\n // Best-effort: flip the persisted state so the next startup banner\r\n // doesn't report a phantom \"running\" engine. Fire-and-forget — if it\r\n // races with an in-flight iteration's write, the journal write wins\r\n // (engineState is metadata, not durable correctness).\r\n void this.persistEngineState('stopped').catch(() => {});\r\n this.state = 'stopped';\r\n }\r\n\r\n /**\r\n * Mark the engine as 'running' on disk + reset stop state so a new\r\n * batch of `runOneIteration()` calls can proceed. Called by the REPL\r\n * when the user invokes `/autonomy eternal`. Idempotent.\r\n */\r\n async prime(): Promise<void> {\r\n this.stopRequested = false;\r\n this.state = 'running';\r\n await this.persistEngineState('running').catch(() => {});\r\n }\r\n\r\n /**\r\n * Main loop. Returns when stop() is called or the goal file is removed.\r\n * Does NOT throw — every iteration is wrapped to keep the loop alive.\r\n */\r\n async run(): Promise<void> {\r\n this.state = 'running';\r\n await this.persistEngineState('running');\r\n\r\n try {\r\n while (!this.stopRequested) {\r\n let iterationOk = false;\r\n try {\r\n iterationOk = await this.runOneIteration();\r\n } catch (err) {\r\n this.consecutiveFailures++;\r\n this.opts.onError?.(err instanceof Error ? err : new Error(String(err)), this.consecutiveFailures);\r\n await this.appendFailure('engine error', err instanceof Error ? err.message : String(err));\r\n }\r\n\r\n if (iterationOk) {\r\n this.consecutiveFailures = 0;\r\n }\r\n\r\n if (this.stopRequested) break;\r\n\r\n // Brief gap so SIGINT can land between iterations even if the\r\n // agent is bouncing back results fast.\r\n await sleep(this.opts.cycleGapMs ?? 1000);\r\n }\r\n } finally {\r\n this.state = 'stopped';\r\n await this.persistEngineState('stopped').catch(() => {});\r\n }\r\n }\r\n\r\n /**\r\n * Execute a single sense-decide-execute-reflect cycle.\r\n * Returns true on success, false on handled failure / no-op.\r\n *\r\n * Exposed publicly so the REPL can pace iterations from its main loop\r\n * — running the engine and the REPL as a single sequential consumer of\r\n * `agent.run()` avoids race conditions on the shared Context.\r\n */\r\n async runOneIteration(): Promise<boolean> {\r\n // Emit stage transitions so UIs can render the engine's live location.\r\n const emit = (stage: IterationStage) => {\r\n this.opts.onStage?.(stage);\r\n };\r\n\r\n const goal = await loadGoal(this.goalPath);\r\n if (!goal) {\r\n // Goal file disappeared — treat as a graceful stop.\r\n emit({ phase: 'stopped' });\r\n this.stopRequested = true;\r\n return false;\r\n }\r\n\r\n // Mission-level lifecycle gate.\r\n const missionState = goal.goalState ?? 'active';\r\n if (missionState !== 'active') {\r\n emit({ phase: missionState === 'paused' ? 'paused' : 'stopped' });\r\n this.stopRequested = true;\r\n return false;\r\n }\r\n\r\n emit({ phase: 'decide', reason: 'picking next task' });\r\n const action = await this.decide(goal);\r\n if (!action) {\r\n if (!this.stopRequested) {\r\n emit({ phase: 'sleep', ms: 5_000 });\r\n await sleep(5_000);\r\n } else {\r\n emit({ phase: 'stopped' });\r\n }\r\n return false;\r\n }\r\n\r\n emit({ phase: 'execute', task: action.task });\r\n\r\n const ctrl = new AbortController();\r\n this.currentCtrl = ctrl;\r\n const timer = setTimeout(\r\n () => ctrl.abort(),\r\n this.opts.iterationTimeoutMs ?? 5 * 60_000,\r\n );\r\n let status: JournalEntry['status'] = 'success';\r\n let note: string | undefined;\r\n let finalText = '';\r\n // Captured from `result.error?.recoverable` when the agent.run returns\r\n // a recoverable WrongStackError (ProviderError sets this for 429/529\r\n // /5xx/network). Drives the engine's exponential backoff so a\r\n // transient rate-limit storm doesn't burn the failure budget in\r\n // seconds. Permanent errors leave this false and trip the normal\r\n // consecutiveFailures path.\r\n let isTransientFailure = false;\r\n\r\n // Snapshot usage before so the iteration delta can be journaled.\r\n // Token counter is optional in mock/test contexts — guard accordingly.\r\n const tc = this.opts.agent.ctx?.tokenCounter;\r\n const beforeUsage = tc?.total?.();\r\n const beforeCost = tc?.estimateCost?.().total;\r\n\r\n try {\r\n const result = await this.opts.agent.run(\r\n [{ type: 'text' as const, text: action.directive }],\r\n {\r\n signal: ctrl.signal,\r\n // Enable per-call autonomous continuation so the agent can chain\r\n // multiple internal tool/response cycles end-to-end on one\r\n // directive instead of returning to the engine after a single\r\n // round-trip. The model uses `[continue]` / `[done]` markers\r\n // (or the `continue_to_next_iteration` tool) to control the\r\n // inner loop. Without this flag the engine produced shallow\r\n // iterations and almost never let a real task finish.\r\n autonomousContinue: true,\r\n // Cap the inner loop so a runaway agent.run can't burn through\r\n // the iteration timeout — the engine's own outer loop is the\r\n // long-running thing, each tick should be bounded.\r\n maxIterations: this.opts.iterationMaxAgentSteps ?? 500,\r\n },\r\n );\r\n\r\n if (result.status === 'aborted') {\r\n status = 'aborted';\r\n note = 'stopped by user';\r\n } else if (result.status === 'failed') {\r\n status = 'failure';\r\n note = result.error?.describe?.() ?? 'agent run failed';\r\n isTransientFailure = result.error?.recoverable === true;\r\n } else if (result.status === 'max_iterations') {\r\n status = 'failure';\r\n note = `max iterations (${result.iterations})`;\r\n } else {\r\n status = 'success';\r\n finalText = result.finalText ?? '';\r\n const tail = finalText.slice(0, 240).replace(/\\s+/g, ' ').trim();\r\n if (tail) note = tail;\r\n }\r\n } catch (err) {\r\n const isAbort = err instanceof Error && (err.name === 'AbortError' || err.message.includes('abort'));\r\n status = isAbort ? 'aborted' : 'failure';\r\n note = err instanceof Error ? err.message : String(err);\r\n // Surface .recoverable on the thrown WrongStackError too — provider\r\n // errors that escape the agent's catch (rare; usually wrapped into\r\n // result.error) still classify correctly.\r\n if (\r\n !isAbort &&\r\n typeof (err as { recoverable?: unknown })?.recoverable === 'boolean'\r\n ) {\r\n isTransientFailure = (err as { recoverable: boolean }).recoverable;\r\n }\r\n } finally {\r\n clearTimeout(timer);\r\n this.currentCtrl = null;\r\n }\r\n\r\n // Per-todo attempt accounting. On failure of a todo-sourced action,\r\n // bump the persistent counter so `decide()` can rotate past it once\r\n // it crosses the configured ceiling. Successful runs leave the\r\n // counter untouched — the LLM is responsible for flipping the todo\r\n // status to `completed` via the todos tool (directive teaches this).\r\n if (action.source === 'todo' && action.todoId && status !== 'success') {\r\n await this.bumpTodoAttempt(action.todoId);\r\n }\r\n\r\n // Capture per-iteration usage delta. Cost is always non-negative;\r\n // if the counter wraps or resets mid-iteration we clamp to 0 so the\r\n // journal never shows negative spend.\r\n const afterUsage = tc?.total?.();\r\n const afterCost = tc?.estimateCost?.().total;\r\n const tokens =\r\n beforeUsage && afterUsage\r\n ? {\r\n input: Math.max(0, afterUsage.input - beforeUsage.input),\r\n output: Math.max(0, afterUsage.output - beforeUsage.output),\r\n }\r\n : undefined;\r\n const costUsd =\r\n typeof beforeCost === 'number' && typeof afterCost === 'number'\r\n ? Math.max(0, afterCost - beforeCost)\r\n : undefined;\r\n\r\n await this.appendIterationEntry({\r\n source: action.source,\r\n task: action.task,\r\n status,\r\n note,\r\n tokens,\r\n costUsd,\r\n });\r\n\r\n emit({ phase: 'reflect', status, note });\r\n\r\n // Re-read the goal so we can emit the real iteration counter rather\r\n // than the previous placeholder. If the goal was unlinked mid-flight\r\n // (graceful stop via /goal clear) the iteration index is still\r\n // useful — fall back to the in-memory consecutiveFailures-derived\r\n // approximation only as a last resort.\r\n let iterationIndex = 0;\r\n try {\r\n const reloaded = await loadGoal(this.goalPath);\r\n iterationIndex = reloaded?.iterations ?? 0;\r\n } catch {\r\n // best-effort\r\n }\r\n this.opts.onIteration?.({\r\n at: (this.opts.now?.() ?? new Date()).toISOString(),\r\n iteration: iterationIndex,\r\n source: action.source,\r\n task: action.task,\r\n status,\r\n note,\r\n tokens,\r\n costUsd,\r\n });\r\n\r\n // Transient failure — sleep with interruptible backoff before retry.\r\n if (status === 'failure') {\r\n if (isTransientFailure) {\r\n this.consecutiveTransientRetries++;\r\n const delay = this.computeTransientBackoffMs();\r\n if (delay > 0) {\r\n emit({ phase: 'sleep', ms: delay });\r\n await this.sleepInterruptible(delay);\r\n }\r\n return false;\r\n }\r\n this.consecutiveFailures++;\r\n return false;\r\n }\r\n\r\n if (status === 'aborted') {\r\n if (this.stopRequested) return false;\r\n this.consecutiveFailures++;\r\n return false;\r\n }\r\n\r\n // Successful iteration\r\n this.consecutiveTransientRetries = 0;\r\n const cycleGapMs = this.opts.cycleGapMs ?? 1000;\r\n emit({ phase: 'sleep', ms: cycleGapMs });\r\n await sleep(cycleGapMs);\r\n\r\n // Goal-complete detection. The model emits `[GOAL_COMPLETE]` on its\r\n // own line in `finalText` when the overall mission is verifiably done.\r\n // Combined with a successful iteration this is a strong stop signal:\r\n // the LLM explicitly claimed completion AND the run did not fail. We\r\n // mark the goal `completed`, journal it, and stop. No separate\r\n // verifier round-trip — keeps cost down; if the model lies, the user\r\n // notices and can re-arm with `/goal set`.\r\n if (GOAL_COMPLETE_MARKER.test(finalText)) {\r\n // Treat GOAL_COMPLETE as a full goal clear: remove the goal file and\r\n // fire onEternalStop so the REPL exits eternal mode. Stronger than\r\n // just marking completed — the REPL needs both to happen.\r\n await this.clearGoalManually(finalText);\r\n this.stopRequested = true;\r\n return true;\r\n }\r\n // Goal-clear detection — model emits `[goal clear]` equivalent to\r\n // `/goal clear`. Treat as a manual stop: remove the goal file and fire\r\n // onEternalStop so the REPL knows to return to normal mode.\r\n if (GOAL_CLEAR_MARKER.test(finalText)) {\r\n await this.clearGoalManually(finalText);\r\n this.stopRequested = true;\r\n return true;\r\n }\r\n // Compaction runs only on successful iterations — there's no point\r\n // compacting after a failed/aborted iteration that didn't add much to\r\n // the message history.\r\n this.iterationsSinceCompact++;\r\n await this.maybeCompact().catch((err) => {\r\n // Don't let compaction failure kill the loop; surface via onError.\r\n this.opts.onError?.(\r\n err instanceof Error ? err : new Error(String(err)),\r\n this.consecutiveFailures,\r\n );\r\n });\r\n return true;\r\n }\r\n\r\n /**\r\n * Run compaction when either trigger fires:\r\n * - We've done >= compactEveryNIterations since the last compact.\r\n * - Current request tokens exceed aggressiveCompactRatio * maxContext.\r\n *\r\n * The second check uses *aggressive* mode to free more headroom; the\r\n * cadence check uses non-aggressive (cheaper).\r\n */\r\n private async maybeCompact(): Promise<void> {\r\n const compactor = this.opts.compactor;\r\n if (!compactor) return;\r\n const ctx = this.opts.agent.ctx;\r\n if (!ctx) return;\r\n\r\n const cadence = this.opts.compactEveryNIterations ?? 25;\r\n const threshold = this.opts.aggressiveCompactRatio ?? 0.85;\r\n const maxCtx = this.opts.maxContextTokens;\r\n\r\n let aggressive = false;\r\n let shouldRun = false;\r\n\r\n if (this.iterationsSinceCompact >= cadence) {\r\n shouldRun = true;\r\n }\r\n\r\n if (maxCtx && maxCtx > 0) {\r\n const used = ctx.tokenCounter?.currentRequestTokens?.();\r\n if (used) {\r\n const total = used.input + used.cacheRead;\r\n if (total / maxCtx >= threshold) {\r\n shouldRun = true;\r\n aggressive = true;\r\n }\r\n }\r\n }\r\n\r\n if (!shouldRun) return;\r\n\r\n const report = await compactor.compact(ctx, { aggressive });\r\n this.iterationsSinceCompact = 0;\r\n // Journal the compaction event so users see it in /goal journal.\r\n const saved = report.before - report.after;\r\n await this.appendIterationEntry({\r\n source: 'manual',\r\n task: `compaction (${aggressive ? 'aggressive' : 'cadence'})`,\r\n status: 'success',\r\n note: `saved ~${saved} tokens (${report.before}→${report.after})`,\r\n });\r\n }\r\n\r\n /**\r\n * Hybrid idea source.\r\n * 1. Pending todos on the agent's context.\r\n * 2. Dirty git working tree → propose a \"review and finish this\" task.\r\n * 3. Otherwise: brainstorm via the LLM against the goal.\r\n *\r\n * After failureBudget consecutive failures, force brainstorm so the\r\n * engine doesn't loop on the same broken todo or stuck git state.\r\n */\r\n private async decide(goal: GoalFile): Promise<DecidedAction | null> {\r\n const forceBrainstorm = this.consecutiveFailures >= (this.opts.failureBudget ?? 3);\r\n\r\n if (!forceBrainstorm) {\r\n const todo = this.pickPendingTodo(goal);\r\n if (todo) {\r\n return {\r\n source: 'todo',\r\n task: todo.content,\r\n todoId: todo.id,\r\n directive: this.buildDirective(goal, 'todo', todo.content),\r\n };\r\n }\r\n\r\n const gitTask = await this.pickGitTask();\r\n if (gitTask) {\r\n return {\r\n source: 'git',\r\n task: gitTask,\r\n directive: this.buildDirective(goal, 'git', gitTask),\r\n };\r\n }\r\n }\r\n\r\n const brainstormed = await this.brainstormTask(goal);\r\n if (brainstormed === BRAINSTORM_DONE) {\r\n // Model says there's nothing to do. Count consecutive DONEs — if\r\n // we hit the threshold, treat the mission as finished and stop\r\n // instead of sleeping forever on null actions.\r\n this.consecutiveBrainstormDone++;\r\n const threshold = this.opts.brainstormDoneStopThreshold ?? 3;\r\n if (this.consecutiveBrainstormDone >= threshold) {\r\n await this.markGoalCompleted(\r\n { source: 'brainstorm', task: 'no further work', directive: '' },\r\n `brainstorm returned DONE ${this.consecutiveBrainstormDone}x in a row`,\r\n );\r\n this.stopRequested = true;\r\n }\r\n return null;\r\n }\r\n if (!brainstormed) return null;\r\n // Got a real task — reset the DONE streak.\r\n this.consecutiveBrainstormDone = 0;\r\n return {\r\n source: 'brainstorm',\r\n task: brainstormed,\r\n directive: this.buildDirective(goal, 'brainstorm', brainstormed),\r\n };\r\n }\r\n\r\n private pickPendingTodo(goal: GoalFile): TodoItem | null {\r\n const todos = this.opts.agent.ctx.todos;\r\n if (!Array.isArray(todos)) return null;\r\n const attempts = goal.todoAttempts ?? {};\r\n const ceiling = this.opts.todoMaxAttempts ?? 3;\r\n // First-pending strategy with a stuck-task escape hatch: if the\r\n // first pending todo has already failed `ceiling` times, fall\r\n // through to later pending todos. Returns null when every pending\r\n // todo is stuck — the caller will fall through to git/brainstorm.\r\n for (const t of todos) {\r\n if (t.status !== 'pending') continue;\r\n const used = attempts[t.id] ?? 0;\r\n if (used >= ceiling) continue;\r\n return t;\r\n }\r\n return null;\r\n }\r\n\r\n private async pickGitTask(): Promise<string | null> {\r\n let out: string;\r\n try {\r\n out = await (this.opts.gitStatusReader?.() ?? this.readGitStatus());\r\n } catch {\r\n return null;\r\n }\r\n const dirty = out.trim();\r\n if (!dirty) return null;\r\n // Surface a concise prompt — the agent will look at the diff itself.\r\n const lines = dirty.split('\\n').slice(0, 8);\r\n const preview = lines.join(', ');\r\n return `Inspect the dirty working tree and either finish the in-progress work or revert it. Files: ${preview}`;\r\n }\r\n\r\n private async readGitStatus(): Promise<string> {\r\n const { stdout } = await execFileP('git', ['status', '--porcelain'], {\r\n cwd: this.opts.projectRoot,\r\n timeout: 5_000,\r\n });\r\n return stdout;\r\n }\r\n\r\n private async brainstormTask(goal: GoalFile): Promise<string | null | typeof BRAINSTORM_DONE> {\r\n const lastFew = goal.journal\r\n .slice(-5)\r\n .map((e) => ` - [${e.status}] ${e.task}`)\r\n .join('\\n');\r\n const directive = [\r\n 'You are deciding the next action in an autonomous loop pursuing a long-running goal.',\r\n '',\r\n `Goal: ${goal.goal}`,\r\n '',\r\n lastFew ? `Recent iterations:\\n${lastFew}` : 'No prior iterations yet.',\r\n '',\r\n 'Output ONE concrete, immediately-actionable task that advances the goal.',\r\n 'Constraints:',\r\n '- One sentence, imperative form, under 200 chars.',\r\n '- No preamble, no explanation, no markdown — just the task line.',\r\n '- If recent iterations show repeated failures on the same target, pivot.',\r\n '- If the goal appears fully accomplished AND you can name a concrete',\r\n ' artifact / test / output that proves it, output exactly: DONE',\r\n '- Be conservative with DONE: if the recent journal contains failures',\r\n ' or aborted entries, the goal is almost certainly NOT done.',\r\n ].join('\\n');\r\n\r\n try {\r\n const ctrl = new AbortController();\r\n const timer = setTimeout(() => ctrl.abort(), 60_000);\r\n try {\r\n const result = await this.opts.agent.run(\r\n [{ type: 'text' as const, text: directive }],\r\n { signal: ctrl.signal, maxIterations: 1 },\r\n );\r\n if (result.status !== 'done') return null;\r\n const text = (result.finalText ?? '').trim();\r\n if (!text) return null;\r\n // Distinct sentinel for DONE so the caller can count consecutive\r\n // DONE answers toward a real stop. The old `return null` path\r\n // conflated \"no work\" with \"engine failure\" and looped forever.\r\n if (/^DONE\\.?$/i.test(text)) return BRAINSTORM_DONE;\r\n // Take the first non-empty line and clip to 240 chars.\r\n const firstLine = text.split('\\n').find((l) => l.trim().length > 0)?.trim();\r\n if (!firstLine) return null;\r\n if (/^DONE\\.?$/i.test(firstLine)) return BRAINSTORM_DONE;\r\n return firstLine.slice(0, 240);\r\n } finally {\r\n clearTimeout(timer);\r\n }\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n private buildDirective(goal: GoalFile, source: JournalEntry['source'], task: string): string {\r\n const recentJournal = goal.journal\r\n .slice(-5)\r\n .map((e) => ` #${e.iteration} [${e.status}] ${e.task}${e.note ? ` — ${e.note.slice(0, 80)}` : ''}`)\r\n .join('\\n');\r\n return [\r\n '═══ ETERNAL AUTONOMY — iteration directive ═══',\r\n '',\r\n `Mission: ${goal.goal}`,\r\n `Iteration: #${goal.iterations + 1}`,\r\n `Source: ${source}`,\r\n `Task: ${task}`,\r\n '',\r\n recentJournal ? `Recent journal (last 5):\\n${recentJournal}` : 'No prior iterations.',\r\n '',\r\n '── EXECUTION PROTOCOL ──',\r\n 'You are inside a long-running autonomous loop. Each iteration you',\r\n 'execute ONE concrete task that advances the Mission. No user is',\r\n 'available to clarify — make defensible decisions and move forward.',\r\n '',\r\n '1. EXECUTE END-TO-END',\r\n ' • Use multiple tool calls freely. Emit `[continue]` on its own line',\r\n ' to chain to the next internal step without returning.',\r\n ' • When this iteration\\'s Task is finished (real artifact / passing',\r\n ' test / applied diff / clean output), emit `[done]` on its own line.',\r\n ' • Do not stop on the first obstacle — try at least 3 distinct',\r\n ' approaches before giving up. YOLO is active; no confirmations.',\r\n '',\r\n '2. UPDATE TODO STATE (when Source is `todo`)',\r\n ' • Mark this todo `in_progress` via the todos tool before tool work.',\r\n ' • Mark it `completed` on success, with a one-line outcome note.',\r\n ' • If you cannot make progress after 2 distinct attempts, mark it',\r\n ' `cancelled` with the obstacle. The loop will skip it next time.',\r\n '',\r\n '3. MISSION-COMPLETE PROTOCOL',\r\n ' • If — and ONLY if — the OVERALL Mission (not just this Task) is',\r\n ' verifiably accomplished, emit on its own line:',\r\n ' [GOAL_COMPLETE]',\r\n ' followed by a one-paragraph verification recipe (artifact path,',\r\n ' test command, or 10-second reproduction). This halts the loop.',\r\n ' • NEVER emit [GOAL_COMPLETE] on optimism, partial progress, or',\r\n ' \"looks fine\". Required: a concrete artifact that proves it AND',\r\n ' no recent journal failures contradicting completion.',\r\n ' • If unsure, emit `[done]` instead and let the next iteration',\r\n ' decide. The loop is patient; false completion is not.',\r\n '',\r\n '4. NO INTERACTIVITY',\r\n ' • Do not ask questions, do not request confirmation, do not propose',\r\n ' options. Pick the best path and execute. The user is asleep.',\r\n ].join('\\n');\r\n }\r\n\r\n /**\r\n * Exponential backoff for transient provider errors. `2^N * base`\r\n * capped at `transientBackoffMaxMs`. Zero base disables backoff.\r\n * Public-private to keep `runOneIteration` readable; the value is\r\n * recomputed each call from the current retry count, so callers\r\n * don't have to track state.\r\n */\r\n private computeTransientBackoffMs(): number {\r\n const base = this.opts.transientBackoffBaseMs ?? 2_000;\r\n const cap = this.opts.transientBackoffMaxMs ?? 60_000;\r\n if (base <= 0) return 0;\r\n const exponent = Math.max(0, this.consecutiveTransientRetries - 1);\r\n return Math.min(cap, base * Math.pow(2, exponent));\r\n }\r\n\r\n /**\r\n * Sleep that wakes early if `stopRequested` flips. Polls every 250 ms\r\n * so SIGINT / `/autonomy stop` can land in the middle of a long\r\n * backoff instead of waiting up to a minute for the timer.\r\n */\r\n private async sleepInterruptible(totalMs: number): Promise<void> {\r\n const step = 250;\r\n let remaining = totalMs;\r\n while (remaining > 0 && !this.stopRequested) {\r\n const chunk = Math.min(step, remaining);\r\n await sleep(chunk);\r\n remaining -= chunk;\r\n }\r\n }\r\n\r\n private async appendIterationEntry(entry: Omit<JournalEntry, 'iteration' | 'at'>): Promise<void> {\r\n const current = await loadGoal(this.goalPath);\r\n if (!current) {\r\n // Goal was cleared mid-iteration; nothing to write to.\r\n return;\r\n }\r\n const updated = appendJournal(current, entry);\r\n await saveGoal(this.goalPath, updated);\r\n }\r\n\r\n /**\r\n * Persistent per-todo failure counter. Skipped silently when the goal\r\n * file has been removed (graceful clear). Each non-success iteration\r\n * against a todo source bumps the counter by 1; `pickPendingTodo` reads\r\n * the counter to rotate past stuck todos once they cross `todoMaxAttempts`.\r\n */\r\n private async bumpTodoAttempt(todoId: string): Promise<void> {\r\n const current = await loadGoal(this.goalPath);\r\n if (!current) return;\r\n const attempts = { ...(current.todoAttempts ?? {}) };\r\n attempts[todoId] = (attempts[todoId] ?? 0) + 1;\r\n await saveGoal(this.goalPath, { ...current, todoAttempts: attempts });\r\n }\r\n\r\n /**\r\n * Flip the mission to `completed` and journal it. Called from two\r\n * paths: (a) `[GOAL_COMPLETE]` marker in a successful iteration's\r\n * finalText, (b) `brainstorm` returning DONE consecutively past the\r\n * configured threshold. Idempotent — re-entry is a no-op once the\r\n * goal is already `completed`.\r\n */\r\n private async markGoalCompleted(\r\n action: { source: JournalEntry['source']; task: string; directive: string },\r\n note: string,\r\n ): Promise<void> {\r\n const current = await loadGoal(this.goalPath);\r\n if (!current) return;\r\n if (current.goalState === 'completed') return;\r\n const withFlag: GoalFile = { ...current, goalState: 'completed' };\r\n const withEntry = appendJournal(withFlag, {\r\n source: action.source,\r\n task: `MISSION COMPLETE — ${action.task}`.slice(0, 240),\r\n status: 'success',\r\n note: note.slice(0, 240),\r\n });\r\n await saveGoal(this.goalPath, withEntry);\r\n }\r\n\r\n /**\r\n * Manually clear the goal — equivalent to `/goal clear` typed by the user.\r\n * Sets goalState to `abandoned`, removes the goal file, and fires\r\n * `onEternalStop` so the REPL returns to normal mode.\r\n */\r\n private async clearGoalManually(note: string): Promise<void> {\r\n const current = await loadGoal(this.goalPath);\r\n if (current) {\r\n const abandoned: GoalFile = { ...current, goalState: 'abandoned' };\r\n await saveGoal(this.goalPath, abandoned);\r\n }\r\n try {\r\n const { unlink } = await import('node:fs/promises');\r\n await unlink(this.goalPath);\r\n } catch {\r\n // best-effort — file may already be gone\r\n }\r\n this.opts.onEternalStop?.();\r\n void this.appendIterationEntry({\r\n source: 'manual',\r\n task: 'goal cleared',\r\n status: 'success',\r\n note: note.slice(0, 240),\r\n });\r\n }\r\n\r\n private async appendFailure(task: string, note: string): Promise<void> {\r\n await this.appendIterationEntry({ source: 'manual', task, status: 'failure', note });\r\n }\r\n\r\n private async persistEngineState(state: GoalFile['engineState']): Promise<void> {\r\n const current = await loadGoal(this.goalPath);\r\n if (!current) return;\r\n if (current.engineState === state) return;\r\n await saveGoal(this.goalPath, { ...current, engineState: state });\r\n }\r\n}\r\n\r\nfunction sleep(ms: number): Promise<void> {\r\n return new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n","import type { Usage } from '../types/provider.js';\r\nimport type { EventBus } from '../kernel/events.js';\r\n\r\nexport type BudgetKind = 'tool_calls' | 'iterations' | 'tokens' | 'timeout' | 'cost';\r\n\r\nexport class BudgetExceededError extends Error {\r\n readonly kind: BudgetKind;\r\n readonly limit: number;\r\n readonly observed: number;\r\n\r\n constructor(kind: BudgetKind, limit: number, observed: number) {\r\n super(`Budget exceeded: ${kind} (limit=${limit}, observed=${observed})`);\r\n this.name = 'BudgetExceededError';\r\n this.kind = kind;\r\n this.limit = limit;\r\n this.observed = observed;\r\n }\r\n}\r\n\r\nexport interface BudgetLimits {\r\n maxIterations?: number;\r\n maxToolCalls?: number;\r\n maxTokens?: number;\r\n /** Estimated USD cost ceiling. */\r\n maxCostUsd?: number;\r\n /** Wall-clock timeout from start() to checkTimeout(). */\r\n timeoutMs?: number;\r\n}\r\n\r\nexport interface BudgetUsage {\r\n iterations: number;\r\n toolCalls: number;\r\n tokens: { input: number; output: number; total: number };\r\n costUsd: number;\r\n elapsedMs: number;\r\n}\r\n\r\n/**\r\n * Thrown by `SubagentBudget.record*` when a soft limit is hit and\r\n * an `onThreshold` handler is configured that wants to ask the\r\n * coordinator (via `budget.threshold_reached` event). The runner\r\n * catches this and awaits the embedded `decision` promise to get\r\n * the coordinator's extend/stop decision.\r\n *\r\n * Distinct from `BudgetExceededError` which is a hard stop.\r\n */\r\nexport class BudgetThresholdSignal extends Error {\r\n readonly kind: BudgetKind;\r\n readonly limit: number;\r\n readonly used: number;\r\n /** Resolves to 'extend' (with optional new limits) or 'stop' */\r\n readonly decision: Promise<BudgetThresholdDecision>;\r\n\r\n constructor(\r\n kind: BudgetKind,\r\n limit: number,\r\n used: number,\r\n decision: Promise<BudgetThresholdDecision>,\r\n ) {\r\n super(`Budget soft limit: ${kind} (limit=${limit}, used=${used})`);\r\n this.name = 'BudgetThresholdSignal';\r\n this.kind = kind;\r\n this.limit = limit;\r\n this.used = used;\r\n this.decision = decision;\r\n }\r\n}\r\n\r\nexport type BudgetThresholdDecision =\r\n | 'stop'\r\n | { extend: Partial<BudgetLimits> };\r\n\r\n/**\r\n * Callback invoked when a budget limit is about to be exceeded.\r\n * Return 'throw' for hard stop (default — throws BudgetExceededError).\r\n * Return 'continue' to allow one more unit and re-check next time.\r\n * Return a Promise to ask the coordinator via `budget.threshold_reached`\r\n * event (uses the same grant/deny pattern as `iteration.limit_reached`).\r\n */\r\nexport type BudgetThresholdHandler = (info: {\r\n kind: BudgetKind;\r\n used: number;\r\n limit: number;\r\n requestDecision: () => Promise<BudgetThresholdDecision>;\r\n}) => 'throw' | 'continue' | Promise<BudgetThresholdDecision>;\r\n\r\n/**\r\n * Per-subagent budget enforcement. Each subagent gets its own instance so a\r\n * runaway agent can't drain the cost ceiling of its siblings. All record/check\r\n * methods are O(1) and safe to call from hot paths.\r\n *\r\n * Behavior: `record*` methods check the limit and throw synchronously when\r\n * no `onThreshold` handler is configured. When a handler IS configured,\r\n * `checkLimit` delegates to it and any async work (coordinator decision)\r\n * is fire-and-forget via `void` — the thrown error is always synchronous\r\n * so event handlers in tests (which use `expect(...).toThrow`) work correctly.\r\n */\r\nexport class SubagentBudget {\r\n readonly limits: Readonly<BudgetLimits>;\r\n private iterations = 0;\r\n private toolCalls = 0;\r\n private tokenInput = 0;\r\n private tokenOutput = 0;\r\n private costUsd = 0;\r\n private startTime: number | null = null;\r\n private _onThreshold: BudgetThresholdHandler | undefined;\r\n /**\r\n * Tracks which budget kinds currently have an extension request\r\n * in flight. While a kind is here, further `checkLimit` calls for the\r\n * same kind are no-ops — without this dedup, every `recordIteration`\r\n * after the limit is reached spawns a fresh decision Promise (until\r\n * the first one lands and patches limits), flooding the FleetBus\r\n * with redundant threshold events. Cleared in `checkLimitAsync`'s\r\n * `finally`.\r\n */\r\n private readonly pendingExtensions: Set<BudgetKind> = new Set();\r\n /**\r\n * Hard cap on how long `checkLimitAsync` waits for the coordinator to\r\n * respond before defaulting to 'stop'. Without this fallback an absent\r\n * or hung listener (Director not built / event filter detached mid-run)\r\n * leaves the budget over-limit and never enforces anything, since\r\n * `checkLimit` returns synchronously via `void this.checkLimitAsync`.\r\n * Raised from 30s to 60s to give subagents more headroom before\r\n * the threshold negotiation times out and triggers a hard stop.\r\n */\r\n private static readonly DECISION_TIMEOUT_MS = 60_000;\r\n /**\r\n * Injected by the runner when wiring the budget to its EventBus.\r\n * Used by `checkLimitAsync` to emit `budget.threshold_reached` events.\r\n */\r\n _events?: EventBus;\r\n\r\n /**\r\n * Optional callback for soft-limit handling. When set, the budget will\r\n * call this instead of throwing when a limit is first reached. The\r\n * handler decides whether to throw, continue, or ask the coordinator.\r\n */\r\n get onThreshold(): BudgetThresholdHandler | undefined {\r\n return this._onThreshold;\r\n }\r\n set onThreshold(fn: BudgetThresholdHandler | undefined) {\r\n this._onThreshold = fn;\r\n }\r\n\r\n constructor(limits: BudgetLimits = {}) {\r\n this.limits = Object.freeze({ ...limits });\r\n }\r\n\r\n start(): void {\r\n this.startTime = Date.now();\r\n }\r\n\r\n /** Returns true if we're within 10% of any limit — useful for pre-flight checks. */\r\n isNearLimit(): boolean {\r\n const { maxIterations, maxToolCalls, maxTokens, maxCostUsd } = this.limits;\r\n if (maxIterations && this.iterations >= maxIterations * 0.9) return true;\r\n if (maxToolCalls && this.toolCalls >= maxToolCalls * 0.9) return true;\r\n if (maxTokens && this.tokenInput + this.tokenOutput >= maxTokens * 0.9) return true;\r\n if (maxCostUsd && this.costUsd >= maxCostUsd * 0.9) return true;\r\n return false;\r\n }\r\n\r\n /**\r\n * Synchronous budget check — always throws synchronously so callers\r\n * (especially test event handlers using `expect().toThrow()`) get an\r\n * unhandled rejection when the budget is exceeded without a handler.\r\n * When `onThreshold` IS configured, the actual async threshold-handling\r\n * is dispatched as a fire-and-forget promise.\r\n */\r\n private checkLimit(kind: BudgetKind, used: number, limit: number): void {\r\n // No threshold handler → hard stop, throw synchronously.\r\n if (!this._onThreshold) {\r\n throw new BudgetExceededError(kind, limit, used);\r\n }\r\n // No EventBus or no listener for the threshold event → there's no\r\n // coordinator to ask. Fall back to the hard-stop contract so callers\r\n // that only set `onThreshold` but never wire a Director (or whose\r\n // FleetBus relay is detached) still get budget enforcement. Without\r\n // this guard the BudgetThresholdSignal path would await a decision\r\n // that nobody resolves, the agent would race past it synchronously,\r\n // and the run would \"succeed\" past its budget.\r\n const bus = this._events;\r\n if (!bus || bus.listenerCount('budget.threshold_reached') === 0) {\r\n throw new BudgetExceededError(kind, limit, used);\r\n }\r\n // Already negotiating an extension for this kind — the first signal\r\n // is in flight; the runner is awaiting its decision and will either\r\n // patch limits (we continue) or abort the run (we unwind). Don't\r\n // throw a fresh signal — it would queue duplicate decisions and spam\r\n // the FleetBus.\r\n if (this.pendingExtensions.has(kind)) return;\r\n this.pendingExtensions.add(kind);\r\n // Throw `BudgetThresholdSignal` carrying the decision Promise. The\r\n // runner's catch handler awaits the promise: `stop` triggers an\r\n // abort so the run actually unwinds; `extend` leaves the (already\r\n // patched) limits in place and the agent continues. The previous\r\n // `void this.checkLimitAsync(...)` pattern silently produced an\r\n // unhandled rejection on stop and let the agent run past budget.\r\n const decision = this.negotiateExtension(kind, used, limit);\r\n throw new BudgetThresholdSignal(kind, limit, used, decision);\r\n }\r\n\r\n /**\r\n * Drive the threshold handler to a decision. Resolves with `'stop'`\r\n * (signal the runner to abort) or `{ extend: ... }` (limits already\r\n * patched in-place; the runner should not abort). Always releases the\r\n * `pendingExtensions` slot in `finally`.\r\n *\r\n * The 'continue' return from a sync handler is treated as\r\n * `{ extend: {} }` — keep going without patching, next overrun will\r\n * fire a fresh signal.\r\n */\r\n private async negotiateExtension(\r\n kind: BudgetKind,\r\n used: number,\r\n limit: number,\r\n ): Promise<BudgetThresholdDecision> {\r\n try {\r\n const result = this._onThreshold!({\r\n kind,\r\n used,\r\n limit,\r\n // Inject a requestDecision helper the handler can call to emit the\r\n // budget.threshold_reached event and wait for the coordinator's verdict.\r\n // A hard fallback timer guarantees the promise eventually resolves\r\n // even if no listener responds — without it, an absent/detached\r\n // Director would leave the budget permanently in \"asking\" state.\r\n requestDecision: (): Promise<BudgetThresholdDecision> => {\r\n // No EventBus wired OR no listener registered → there's nobody\r\n // to grant an extension. Fall straight through to 'stop' so the\r\n // runner aborts immediately. Without this short-circuit the run\r\n // would idle for the 30s fallback before failing — long enough\r\n // for a scripted agent (and our budget-enforcement tests) to\r\n // happily finish past its budget.\r\n const bus = this._events;\r\n if (!bus || bus.listenerCount('budget.threshold_reached') === 0) {\r\n return Promise.resolve('stop');\r\n }\r\n return new Promise<BudgetThresholdDecision>((resolve) => {\r\n let resolved = false;\r\n const respond = (d: BudgetThresholdDecision) => {\r\n if (resolved) return;\r\n resolved = true;\r\n resolve(d);\r\n };\r\n const fallback = setTimeout(\r\n () => respond('stop'),\r\n SubagentBudget.DECISION_TIMEOUT_MS,\r\n );\r\n bus.emit('budget.threshold_reached', {\r\n kind: kind as 'iterations' | 'tool_calls' | 'tokens' | 'cost' | 'timeout',\r\n used,\r\n limit,\r\n timeoutMs: SubagentBudget.DECISION_TIMEOUT_MS,\r\n extend: (extra: Partial<BudgetLimits>) => {\r\n clearTimeout(fallback);\r\n respond({ extend: extra });\r\n },\r\n deny: () => {\r\n clearTimeout(fallback);\r\n respond('stop');\r\n },\r\n });\r\n });\r\n },\r\n });\r\n\r\n if (result === 'throw') return 'stop';\r\n if (result === 'continue') return { extend: {} };\r\n\r\n const decision = await result;\r\n if (decision === 'stop') return 'stop';\r\n\r\n // 'extend' — patch the in-place limits BEFORE resolving so the\r\n // runner's continue path sees the new ceiling. The frozen-object\r\n // cast mirrors the original implementation.\r\n const ext = decision.extend;\r\n if (ext.maxIterations !== undefined) {\r\n (this.limits as Record<string, unknown>).maxIterations = ext.maxIterations;\r\n }\r\n if (ext.maxToolCalls !== undefined) {\r\n (this.limits as Record<string, unknown>).maxToolCalls = ext.maxToolCalls;\r\n }\r\n if (ext.maxTokens !== undefined) {\r\n (this.limits as Record<string, unknown>).maxTokens = ext.maxTokens;\r\n }\r\n if (ext.maxCostUsd !== undefined) {\r\n (this.limits as Record<string, unknown>).maxCostUsd = ext.maxCostUsd;\r\n }\r\n if (ext.timeoutMs !== undefined) {\r\n (this.limits as Record<string, unknown>).timeoutMs = ext.timeoutMs;\r\n }\r\n return decision;\r\n } finally {\r\n this.pendingExtensions.delete(kind);\r\n }\r\n }\r\n\r\n recordIteration(): void {\r\n this.iterations++;\r\n if (this.limits.maxIterations !== undefined && this.iterations > this.limits.maxIterations) {\r\n void this.checkLimit('iterations', this.iterations, this.limits.maxIterations);\r\n }\r\n }\r\n\r\n recordToolCall(): void {\r\n this.toolCalls++;\r\n if (this.limits.maxToolCalls !== undefined && this.toolCalls > this.limits.maxToolCalls) {\r\n void this.checkLimit('tool_calls', this.toolCalls, this.limits.maxToolCalls);\r\n }\r\n }\r\n\r\n recordUsage(usage: Usage, costUsd = 0): void {\r\n this.tokenInput += usage.input;\r\n this.tokenOutput += usage.output;\r\n this.costUsd += costUsd;\r\n\r\n const totalTokens = this.tokenInput + this.tokenOutput;\r\n if (this.limits.maxTokens !== undefined && totalTokens > this.limits.maxTokens) {\r\n void this.checkLimit('tokens', totalTokens, this.limits.maxTokens);\r\n }\r\n if (this.limits.maxCostUsd !== undefined && this.costUsd > this.limits.maxCostUsd) {\r\n void this.checkLimit('cost', this.costUsd, this.limits.maxCostUsd);\r\n }\r\n }\r\n\r\n /**\r\n * Wall-clock budget check. Unlike other limits, timeout is treated as a\r\n * warning-only event — it NEVER hard-stops the subagent. When the\r\n * elapsed time exceeds timeoutMs, emits `budget.threshold_reached` with\r\n * kind='timeout' so the Director can decide whether to extend or warn.\r\n * Call this from the iteration loop so a hung tool gets a chance to\r\n * negotiate more time before the coordinator's Promise.race kills it.\r\n */\r\n checkTimeout(): void {\r\n if (this.startTime === null || this.limits.timeoutMs === undefined) return;\r\n const elapsed = Date.now() - this.startTime;\r\n if (elapsed > this.limits.timeoutMs) {\r\n // Route through the same negotiation path as all other soft limits.\r\n // BudgetThresholdSignal → onBudgetError in the runner → coordinator\r\n // decision → extend or warn. Never throw a hard BudgetExceededError\r\n // for timeout.\r\n void this.checkLimit('timeout', elapsed, this.limits.timeoutMs);\r\n }\r\n }\r\n\r\n /** Returns true if a timeout has occurred without throwing. Useful for races. */\r\n isTimedOut(): boolean {\r\n if (this.startTime === null || this.limits.timeoutMs === undefined) return false;\r\n return Date.now() - this.startTime > this.limits.timeoutMs;\r\n }\r\n\r\n usage(): BudgetUsage {\r\n return {\r\n iterations: this.iterations,\r\n toolCalls: this.toolCalls,\r\n tokens: {\r\n input: this.tokenInput,\r\n output: this.tokenOutput,\r\n total: this.tokenInput + this.tokenOutput,\r\n },\r\n costUsd: this.costUsd,\r\n elapsedMs: this.startTime === null ? 0 : Date.now() - this.startTime,\r\n };\r\n }\r\n}","import type { Agent, AgentInput, RunResult } from '../core/agent.js';\r\nimport type { EventBus } from '../kernel/events.js';\r\nimport type {\r\n SubagentConfig,\r\n SubagentRunContext,\r\n SubagentRunOutcome,\r\n SubagentRunner,\r\n TaskSpec,\r\n} from '../types/multi-agent.js';\r\nimport {\r\n BudgetExceededError,\r\n BudgetThresholdSignal,\r\n} from './subagent-budget.js';\r\nimport type { FleetBus } from './fleet-bus.js';\r\n\r\n/**\r\n * Caller-supplied factory that builds an isolated `Agent` for a subagent.\r\n * The factory MUST construct a fresh `Context` per call — sharing context\r\n * between subagents defeats isolation. Each Agent should also use either\r\n * its own `EventBus` or a forwarded view, so per-subagent metrics can be\r\n * attributed correctly.\r\n */\r\nexport type AgentFactory = (config: SubagentConfig) => Promise<AgentFactoryResult>;\r\n\r\nexport interface AgentFactoryResult {\r\n agent: Agent;\r\n /** Event bus the factory wired to this agent — required for budget hookup. */\r\n events: EventBus;\r\n /**\r\n * Optional cleanup hook invoked in the runner's `finally` block once\r\n * the task ends (success, failure, abort — same exit path). Factories\r\n * that own resources scoped to a single task (per-subagent JSONL\r\n * writers, transient providers, throwaway containers) implement this\r\n * to close them deterministically instead of relying on GC. Errors\r\n * thrown here are swallowed so a flaky cleanup can't mask the task's\r\n * real result.\r\n */\r\n dispose?: () => Promise<void> | void;\r\n}\r\n\r\nexport interface AgentRunnerOptions {\r\n factory: AgentFactory;\r\n /**\r\n * Format a TaskSpec into the user input the agent will receive. Defaults\r\n * to `task.description ?? ''`. Override when subagents expect structured\r\n * input (e.g. JSON contracts, role-prefixed prompts).\r\n */\r\n formatTaskInput?: (task: TaskSpec, config: SubagentConfig) => AgentInput;\r\n /**\r\n * When set, the runner attaches the subagent's EventBus to this FleetBus\r\n * on task start and detaches it when the task finishes. This is the\r\n * injection seam that lets the TUI fleet panel observe subagent activity\r\n * live — without it, FleetBus stays empty.\r\n */\r\n fleetBus?: FleetBus;\r\n}\r\n\r\n/**\r\n * Builds a `SubagentRunner` that drives a real `Agent` per task while honoring\r\n * the coordinator's budget and abort signal. This is the production adapter —\r\n * the coordinator's `runner` option in CLI/TUI assemblies points here.\r\n *\r\n * Lifecycle per task:\r\n * 1. factory(config) → fresh Agent + EventBus.\r\n * 2. Subscribe to events to feed the budget (tool calls, token usage).\r\n * 3. Call agent.run(input, { signal }) — the coordinator's signal cancels.\r\n * 4. Map RunResult.status onto a `SubagentRunOutcome` or throw on failure.\r\n * 5. Unsubscribe and let the factory's resources be GC'd.\r\n *\r\n * The budget is checked synchronously from event handlers — a runaway agent\r\n * that crosses its tool-call limit triggers `BudgetExceededError`, which the\r\n * coordinator surfaces as `status: 'failed'` on the task result.\r\n */\r\nexport function makeAgentSubagentRunner(opts: AgentRunnerOptions): SubagentRunner {\r\n const format = opts.formatTaskInput ?? defaultFormatTaskInput;\r\n\r\n return async (task: TaskSpec, ctx: SubagentRunContext): Promise<SubagentRunOutcome> => {\r\n const factoryResult = await opts.factory(ctx.config);\r\n const { agent, events } = factoryResult;\r\n\r\n // Attach subagent EventBus to FleetBus so the TUI fleet panel (and any\r\n // other FleetBus subscriber) can observe this subagent live. Detach on\r\n // task finish — each task is a fresh Agent + EventBus, so we never\r\n // want a stale bus lingering after the run.\r\n const detachFleet = opts.fleetBus?.attach(ctx.subagentId, events, task.id);\r\n\r\n // Hook budget into the agent's event stream. We capture errors thrown by\r\n // recordToolCall/recordUsage so the budget can short-circuit the run by\r\n // aborting the controller — the agent then unwinds cooperatively.\r\n const aborter = new AbortController();\r\n // Inject the EventBus into the budget so it can emit budget.threshold_reached\r\n // events when a soft limit is hit and the handler wants to ask the coordinator.\r\n ctx.budget._events = events;\r\n // Wire the threshold-negotiation handler. Without this the soft-limit\r\n // path is dead code: every budget overrun becomes a hard\r\n // BudgetExceededError and the subagent dies on its first 120-iteration\r\n // tick instead of asking the Director for headroom. The Director's\r\n // FleetBus listener (director.ts) auto-grants +50% up to a per-kind\r\n // ceiling and per-subagent extension count — wiring this is the\r\n // missing link that activates that flow.\r\n ctx.budget.onThreshold = ({ requestDecision }) => requestDecision();\r\n let budgetError: Error | null = null;\r\n\r\n /**\r\n * Common error handler for all budget-triggered events. Distinguishes:\r\n * - BudgetExceededError → hard stop, set budgetError + abort\r\n * - BudgetThresholdSignal → soft stop: await the coordinator's\r\n * decision. If 'stop', abort. If 'extend', the signal handler\r\n * has already patched the budget so we can continue without\r\n * actually aborting the agent.\r\n */\r\n const onBudgetError = (err: unknown): void => {\r\n if (err instanceof BudgetThresholdSignal) {\r\n // Await the coordinator's verdict before deciding whether to abort.\r\n err.decision\r\n .then((decision) => {\r\n if (decision === 'stop') {\r\n budgetError = new BudgetExceededError(err.kind, err.limit, err.used);\r\n aborter.abort();\r\n }\r\n // If 'extend': the budget limits were already patched by the\r\n // BudgetThresholdSignal handler (checkLimit → onThreshold →\r\n // coordinator extend → budget patched). Do NOT abort.\r\n // The tool call that triggered the signal will be retried.\r\n })\r\n .catch(() => {\r\n // If the decision promise rejects, treat as hard stop.\r\n budgetError = new BudgetExceededError(err.kind, err.limit, err.used);\r\n aborter.abort();\r\n });\r\n return;\r\n }\r\n // Hard stop (BudgetExceededError or other)\r\n aborter.abort();\r\n budgetError =\r\n err instanceof BudgetExceededError\r\n ? err\r\n : new BudgetExceededError(\r\n 'tool_calls',\r\n 0,\r\n 0,\r\n );\r\n // Attach the real error detail so the task result surfaces\r\n // something actionable instead of a generic budget message.\r\n if (budgetError !== err && err instanceof Error) {\r\n budgetError.message += ` (caused by: ${err.message})`;\r\n }\r\n };\r\n\r\n // Track the name of the most recent tool that returned ok:false so\r\n // we can lift it into the SubagentError when the agent ends without\r\n // recovering. Cleared on every successful tool execution so a tool\r\n // that later succeeded doesn't taint the final report.\r\n let lastToolFailed: string | null = null;\r\n\r\n const unsub: Array<() => void> = [];\r\n unsub.push(\r\n events.on('tool.executed', (e) => {\r\n // Count tool calls on the PAIRED 'tool.executed' event rather\r\n // than 'tool.started'. A tool can fire start then crash before\r\n // emitting executed (process killed, signal aborted mid-exec);\r\n // counting only the paired event keeps the budget tally honest\r\n // and matches what the model actually saw in its turn.\r\n try {\r\n ctx.budget.recordToolCall();\r\n } catch (eb) {\r\n onBudgetError(eb);\r\n }\r\n // Track ok:false so we can fail the subagent if it ends without\r\n // recovering. Successful runs clear it — the model may try a\r\n // tool, get an error, and self-heal on the next iteration; that\r\n // path should still report success.\r\n if (e.ok === false) {\r\n lastToolFailed = e.name;\r\n } else if (e.ok === true) {\r\n lastToolFailed = null;\r\n }\r\n }),\r\n events.on('provider.response', (e) => {\r\n try {\r\n ctx.budget.recordUsage(e.usage);\r\n } catch (e2) {\r\n void onBudgetError(e2);\r\n }\r\n }),\r\n events.on('iteration.started', () => {\r\n try {\r\n ctx.budget.recordIteration();\r\n } catch (e) {\r\n void onBudgetError(e);\r\n }\r\n // Emit a periodic progress snapshot every SUMMARY_INTERVAL\r\n // iterations so the leader can surface \"AGENT#2 ● L25 · 47 tools\"\r\n // in the main chat history without needing the FleetPanel open.\r\n const u = ctx.budget.usage();\r\n const since = u.iterations - lastSummaryAtIteration;\r\n if (since >= SUMMARY_INTERVAL) {\r\n lastSummaryAtIteration = u.iterations;\r\n events.emit('subagent.iteration_summary', {\r\n subagentId: ctx.subagentId,\r\n iteration: u.iterations,\r\n toolCalls: u.toolCalls,\r\n costUsd: u.costUsd,\r\n currentTool: currentToolName,\r\n partialText: streamingTextAcc.trim() || undefined,\r\n });\r\n }\r\n }),\r\n // D3: cooperative timeout enforcement DURING a long tool call.\r\n // The iteration-loop checkTimeout() only fires between agent\r\n // iterations — a single `bash sleep 3600` call would otherwise\r\n // park inside one tool execution while the timeout silently\r\n // passes, relying solely on the coordinator's hard Promise.race\r\n // to interrupt. Tools that emit `tool.progress` (bash chunks,\r\n // fetch byte progress, spawn-stream stdout) give us a heartbeat\r\n // we can hang the check on. When the budget trips here:\r\n // 1. onBudgetError sets budgetError + aborter.abort()\r\n // 2. aborter signal propagates to agent.run → tool executor\r\n // 3. tool's own signal listener kills the child process\r\n // Cheap: O(1) per progress event, and the budget short-circuits\r\n // when timeoutMs is unset (most subagents have one set anyway).\r\n events.on('tool.progress', () => {\r\n try {\r\n ctx.budget.checkTimeout();\r\n } catch (e) {\r\n void onBudgetError(e);\r\n }\r\n }),\r\n );\r\n\r\n // Track current tool name + streaming text for the periodic summary.\r\n let currentToolName: string | undefined;\r\n let streamingTextAcc = '';\r\n let lastSummaryAtIteration = 0;\r\n const SUMMARY_INTERVAL = 25;\r\n\r\n unsub.push(\r\n events.on('tool.started', (e) => {\r\n currentToolName = e.name;\r\n }),\r\n events.on('provider.text_delta', (e) => {\r\n // Accumulate last ~200 chars for the partial text snapshot.\r\n streamingTextAcc = (streamingTextAcc + e.text).slice(-200);\r\n }),\r\n );\r\n\r\n // Forward the coordinator signal so stop() from outside also aborts.\r\n const onParentAbort = () => aborter.abort();\r\n ctx.signal.addEventListener('abort', onParentAbort);\r\n\r\n let result: RunResult;\r\n try {\r\n result = await agent.run(format(task, ctx.config), { signal: aborter.signal });\r\n } finally {\r\n detachFleet?.();\r\n ctx.signal.removeEventListener('abort', onParentAbort);\r\n for (const u of unsub) u();\r\n // Per-task resource cleanup. Closes JSONL writers, throwaway\r\n // providers, etc. that the factory wired up. Swallowed errors —\r\n // a flaky cleanup must not mask the real task result. The\r\n // caller can re-emit via observability if needed.\r\n if (factoryResult.dispose) {\r\n try {\r\n await factoryResult.dispose();\r\n } catch {\r\n // intentional swallow — see comment above\r\n }\r\n }\r\n }\r\n\r\n // A budget violation is the signal — surface it so the coordinator can\r\n // tag the task with the right failure kind ('failed' for budget; the\r\n // coordinator separately recognises 'timeout' from BudgetExceededError).\r\n if (budgetError) {\r\n // BudgetThresholdSignal: the soft limit was hit but the coordinator\r\n // hasn't resolved the extension decision yet. If the decision was\r\n // 'extend', the coordinator patched limits and the agent finished\r\n // normally — no error to surface. If 'stop', budgetError becomes\r\n // a BudgetExceededError thrown below.\r\n // instanceof check on Error subtypes requires 'any' intersection\r\n // on the union — use a property guard instead.\r\n if ('decision' in budgetError) {\r\n const decision = await (budgetError as BudgetThresholdSignal).decision;\r\n if (decision === 'stop') {\r\n budgetError = new BudgetExceededError(\r\n (budgetError as BudgetThresholdSignal).kind,\r\n (budgetError as BudgetThresholdSignal).limit,\r\n (budgetError as BudgetThresholdSignal).used,\r\n );\r\n } else {\r\n budgetError = null;\r\n }\r\n }\r\n if (budgetError) throw budgetError;\r\n }\r\n\r\n if (result.status === 'failed') {\r\n throw result.error instanceof Error\r\n ? result.error\r\n : new Error(String(result.error ?? 'agent failed'));\r\n }\r\n // 'aborted' and 'max_iterations' aren't successes — let the coordinator\r\n // classify them. When the parent signal was aborted, coordinator marks\r\n // the task 'stopped' (matched against subagent.abortController.aborted).\r\n if (result.status === 'aborted') {\r\n throw new Error('agent aborted');\r\n }\r\n if (result.status === 'max_iterations') {\r\n throw new Error('agent exhausted iteration limit');\r\n }\r\n\r\n const usage = ctx.budget.usage();\r\n // Empty-response guard. A \"successful\" run with no text AND no tool\r\n // calls is almost always a prompt / config issue, not a real\r\n // success — the agent burned an iteration to say nothing. Surface\r\n // it as a classified failure so callers can show \"✗ empty_response\"\r\n // instead of a confusing green ✓ with no output. We only trip on\r\n // the (no-text AND no-tools) intersection because text-less runs\r\n // with tool calls are legit (e.g. \"run npm test then end_turn\").\r\n const finalText = (result.finalText ?? '').trim();\r\n if (finalText.length === 0 && usage.toolCalls === 0) {\r\n throw new Error('empty response');\r\n }\r\n // Unrecovered-tool-failure guard. If the last executed tool came\r\n // back ok:false AND the agent ended its turn with no closing text,\r\n // the agent never acknowledged or recovered from the failure — the\r\n // task is effectively broken. A model that handles a tool error\r\n // emits SOME text on the next iteration (\"the read failed, trying\r\n // an alternate path…\") which clears `lastToolFailed`; the only way\r\n // both signals can be live at end-of-run is if the model gave up\r\n // silently. Surface as `tool_failed` so callers see the actual\r\n // failure mode instead of a clean ✓ with no output.\r\n if (finalText.length === 0 && lastToolFailed !== null) {\r\n throw new Error(`tool failed: ${lastToolFailed}`);\r\n }\r\n return {\r\n result: result.finalText,\r\n iterations: result.iterations,\r\n toolCalls: usage.toolCalls,\r\n };\r\n };\r\n}\r\n\r\nfunction defaultFormatTaskInput(task: TaskSpec): AgentInput {\r\n return task.description ?? '';\r\n}\r\n","import type { ContentBlock, TextBlock } from './blocks.js';\nimport type { ErrorCode } from './errors.js';\nimport { WrongStackError, ERROR_CODES } from './errors.js';\nimport type { Message } from './messages.js';\nimport type { Tool } from './tool.js';\n\n/**\n * Token usage for a single provider call, normalized across providers.\n *\n * Disjoint semantics: the four fields never overlap. `input` is the count\n * of FRESH input tokens (billed at the full input rate); `cacheRead` and\n * `cacheWrite` are separate cached subsets each priced at their own rate.\n * The total context the model loaded for this turn is\n * `input + (cacheRead ?? 0) + (cacheWrite ?? 0)`.\n *\n * Provider quirks normalized at the adapter layer:\n * - Anthropic: returns `input_tokens` already disjoint from cache fields.\n * - OpenAI / OpenAI-compatible: `prompt_tokens` is the TOTAL including\n * cached portion; the adapter subtracts `cached_tokens` to stay disjoint.\n * - Google: `promptTokenCount` likewise includes cache; adapter subtracts\n * `cachedContentTokenCount`.\n *\n * Cost math and the context-fullness chip both depend on the disjoint\n * invariant — a TOTAL `input` plus a separate `cacheRead` count would bill\n * cached tokens twice and skew cache-hit-ratio reporting.\n */\nexport interface Usage {\n input: number;\n output: number;\n cacheRead?: number;\n cacheWrite?: number;\n}\n\nexport interface Capabilities {\n tools: boolean;\n parallelTools: boolean;\n vision: boolean;\n streaming: boolean;\n promptCache: boolean;\n systemPrompt: boolean;\n jsonMode: boolean;\n maxContext: number;\n cacheControl: 'native' | 'auto' | 'none';\n}\n\nexport interface Request {\n model: string;\n system?: TextBlock[];\n messages: Message[];\n tools?: Tool[];\n maxTokens: number;\n temperature?: number;\n topP?: number;\n stopSequences?: string[];\n toolChoice?: 'auto' | 'required' | 'none' | { type: 'tool'; name: string };\n}\n\nexport type StopReason = 'end_turn' | 'tool_use' | 'max_tokens' | 'stop_sequence' | 'refusal';\n\nexport interface Response {\n content: ContentBlock[];\n stopReason: StopReason;\n usage: Usage;\n model: string;\n}\n\nexport type StreamEvent =\n | { type: 'message_start'; model: string }\n | {\n type: 'content_block_start';\n kind: 'text' | 'tool_use' | 'thinking';\n id?: string;\n name?: string;\n }\n | { type: 'content_block_stop'; index: number }\n | { type: 'text_delta'; text: string }\n | { type: 'tool_use_start'; id: string; name: string }\n | { type: 'tool_use_input_delta'; id: string; partial: string }\n | { type: 'tool_use_stop'; id: string; input: unknown; providerMeta?: Record<string, unknown> }\n | { type: 'thinking_start'; providerMeta?: Record<string, unknown> }\n | { type: 'thinking_delta'; text: string }\n | { type: 'thinking_signature'; signature: string }\n | { type: 'thinking_stop' }\n | { type: 'message_stop'; stopReason: StopReason; usage: Usage };\n\nexport interface Provider {\n readonly id: string;\n readonly capabilities: Capabilities;\n /** Canonical streaming entry point. `complete()` defaults to a wrapper that\n * aggregates this stream — providers may override for non-streaming wires. */\n stream(req: Request, opts: { signal: AbortSignal }): AsyncIterable<StreamEvent>;\n complete(req: Request, opts: { signal: AbortSignal }): Promise<Response>;\n}\n\n/**\n * Structured body parsed from a provider's HTTP error response. Populated\n * best-effort: providers return JSON shaped differently (Anthropic uses\n * `{error: {type, message}}`, OpenAI uses `{error: {message, code}}`,\n * Google uses `{error: {status, message}}`), so the fields here are the\n * intersection that's usable for rendering and routing.\n */\nexport interface ProviderErrorBody {\n /** Provider-specific kind, e.g. \"overloaded_error\", \"rate_limit_error\", \"invalid_request_error\". */\n type?: string;\n /** Human-readable explanation from the provider. */\n message?: string;\n /** Provider request id, when present in the body or headers. */\n requestId?: string;\n /** Parsed Retry-After header (or equivalent body hint) in milliseconds. */\n retryAfterMs?: number;\n /** The raw response body (truncated to ~2 KB), kept for debugging. */\n raw?: string;\n /** True when `raw` was truncated; check `rawLength` for the original size. */\n truncated?: boolean;\n /** Original length of the response body in bytes, when `truncated` is true. */\n rawLength?: number;\n}\n\nexport class ProviderError extends WrongStackError {\n public readonly status: number;\n public readonly retryable: boolean;\n public readonly providerId: string;\n public readonly body?: ProviderErrorBody;\n\n constructor(\n message: string,\n status: number,\n retryable: boolean,\n providerId: string,\n opts: { body?: ProviderErrorBody; cause?: unknown } = {},\n ) {\n super({\n message,\n code: providerStatusToCode(status, opts.body?.type),\n subsystem: 'provider',\n severity: status >= 500 ? 'error' : 'warning',\n recoverable: retryable,\n context: { providerId, status },\n cause: opts.cause,\n });\n this.name = 'ProviderError';\n this.status = status;\n this.retryable = retryable;\n this.providerId = providerId;\n this.body = opts.body;\n }\n\n /**\n * Render a one-line, user-facing description. Designed for the CLI/TUI\n * status line and the agent's retry warning. Avoids dumping raw JSON\n * (which is what users see today when a 529 lands and the log message\n * includes the full `{\"type\":\"error\",...}` body).\n *\n * Examples:\n * \"minimax-coding-plan overloaded (529): High traffic detected. Upgrade for highspeed model. [req 06534785201de9c0…]\"\n * \"openai rate limited (429): Retry after 12s\"\n * \"anthropic invalid request (400): messages.0.role must be one of 'user'|'assistant'\"\n * \"groq HTTP 500 (server error)\"\n */\n override describe(): string {\n const kind = describeStatus(this.status, this.body?.type);\n const head = `${this.providerId} ${kind}`;\n const detail = this.body?.message?.trim();\n const reqId = this.body?.requestId\n ? ` [req ${this.body.requestId.slice(0, 16)}${this.body.requestId.length > 16 ? '…' : ''}]`\n : '';\n if (detail && detail.length > 0) {\n return `${head}: ${truncate(detail, 240)}${reqId}`;\n }\n return `${head}${reqId}`;\n }\n}\n\nfunction describeStatus(status: number, type?: string): string {\n if (status === 0) return 'network error';\n if (type === 'overloaded_error' || status === 529) return `overloaded (${status})`;\n if (type === 'rate_limit_error' || status === 429) return `rate limited (${status})`;\n if (type === 'authentication_error' || status === 401) return `auth failed (${status})`;\n if (type === 'permission_error' || status === 403) return `forbidden (${status})`;\n if (type === 'not_found_error' || status === 404) return `not found (${status})`;\n if (type === 'invalid_request_error' || status === 400) return `invalid request (${status})`;\n if (status === 408) return `timeout (${status})`;\n if (status >= 500 && status < 600) return `HTTP ${status} (server error)`;\n if (type) return `${type} (${status})`;\n return `HTTP ${status}`;\n}\n\nfunction truncate(s: string, n: number): string {\n return s.length <= n ? s : `${s.slice(0, n - 1)}…`;\n}\n\nfunction providerStatusToCode(status: number, type?: string): ErrorCode {\n if (status === 0) return ERROR_CODES.PROVIDER_NETWORK_ERROR;\n if (type === 'rate_limit_error' || status === 429) return ERROR_CODES.PROVIDER_RATE_LIMITED;\n if (type === 'authentication_error' || status === 401) return ERROR_CODES.PROVIDER_AUTH_FAILED;\n if (type === 'overloaded_error' || status === 529) return ERROR_CODES.PROVIDER_OVERLOADED;\n if (type === 'invalid_request_error' || status === 400) return ERROR_CODES.PROVIDER_INVALID_REQUEST;\n if (status === 408) return ERROR_CODES.PROVIDER_NETWORK_ERROR;\n if (status >= 500) return ERROR_CODES.PROVIDER_SERVER_ERROR;\n return ERROR_CODES.PROVIDER_INVALID_REQUEST;\n}\n","/**\r\n * Pre-built subagent role configurations for the WrongStack fleet.\r\n * These can be passed to `MultiAgentHost.spawn()` or used as templates\r\n * for the director's roster.\r\n */\r\nimport type { SubagentConfig } from '../types/multi-agent.js';\r\n\r\n/**\r\n * Audit Log Agent — analyzes session logs, event streams, and traces.\r\n * Use for: post-mortems, trend analysis, operational insights.\r\n */\r\nexport const AUDIT_LOG_AGENT: SubagentConfig = {\r\n id: 'audit-log',\r\n name: 'Audit Log',\r\n role: 'audit-log',\r\n prompt: `You are the Audit Log agent. Your job is to analyze structured JSONL\r\nsession logs and produce actionable markdown reports.\r\n\r\nScope:\r\n- Parse session logs (iteration counts, tool calls, errors, usage)\r\n- Detect repeated failure patterns across multiple runs\r\n- Identify tool usage anomalies (over-use, failures, unexpected chains)\r\n- Track token consumption trends\r\n- Generate structured audit reports with severity ratings\r\n\r\nInput format you accept:\r\n{ \"task\": \"analyze | report | trends\", \"sessionPath\": \"<path>\", \"focus\": \"errors | tools | usage | all\" }\r\n\r\nOutput: Markdown audit report with sections:\r\n- ## Summary (totals, error rate)\r\n- ## Top Errors (count + context)\r\n- ## Tool Usage (table with calls, failures, avg duration)\r\n- ## Anomalies (pattern → severity)\r\n\r\nWorking rules:\r\n- Never fabricate numbers — read the actual logs first\r\n- Always include file:line references for errors\r\n- If sessionPath is missing, ask the director to provide it\r\n- Report confidence level: high (>90% accuracy), medium, low`,\r\n\r\n // No hardcoded budgets — the orchestrator (delegate tool or\r\n // spawn_subagent) decides per-task how much room a subagent gets.\r\n // A monorepo audit needs hours; a single-file lint check needs\r\n // seconds. Pinning a number here forces the orchestrator to fight\r\n // the role's default instead of just asking for what it needs.\r\n};\r\n\r\n/**\r\n * Bug Hunter Agent — systematic bug and code smell detection.\r\n * Use for: pre-refactoring health checks, code review, regression prevention.\r\n */\r\nexport const BUG_HUNTER_AGENT: SubagentConfig = {\r\n id: 'bug-hunter',\r\n name: 'Bug Hunter',\r\n role: 'bug-hunter',\r\n prompt: `You are the Bug Hunter agent. Your job is to systematically scan\r\nsource code for bugs, anti-patterns, and code smells using pattern matching\r\nand heuristics. Output a prioritized hit list with file:line references.\r\n\r\nScope:\r\n- Detect common bug patterns (uncaught errors, resource leaks, race conditions)\r\n- Identify anti-patterns (callback hell, God objects, circular deps)\r\n- Find TypeScript-specific issues (unsafe any, missing null checks, branded types)\r\n- Flag security-sensitive constructs (eval, innerHTML, hardcoded secrets)\r\n- Rank findings: critical > high > medium > low\r\n\r\nInput format you accept:\r\n{ \"task\": \"scan | hunt | check\", \"paths\": [\"src/**/*.ts\"], \"focus\": \"bugs | patterns | security | all\", \"severityThreshold\": \"medium\" }\r\n\r\nOutput: Markdown bug hunt report:\r\n- ## Critical (must fix first)\r\n- ## High (should fix)\r\n- ## Medium\r\n- ## Low (consider)\r\nEach entry: **[TYPE]** \\`file:line\\` — description + suggested fix\r\n\r\nBug pattern reference you know:\r\n| Pattern | Regex hint | Severity |\r\n|---------|------------|----------|\r\n| Uncaught promise | /\\.then\\\\(.*\\\\)/ without catch | high |\r\n| Event leak | on\\\\( without off/removeListener | high |\r\n| Hardcoded secret | [a-zA-Z0-9/_-]{20,} in config files | critical |\r\n| unsafe any | : any\\\\b or <any> | medium |\r\n| innerHTML | innerHTML\\\\s*= | high |\r\n\r\nWorking rules:\r\n- Never scan node_modules — it's noise\r\n- Always include file:line for every finding\r\n- If >30% of findings are false positives, note the confidence level\r\n- Ask director for clarification if paths are ambiguous`,\r\n\r\n // Budgets are set by the orchestrator per task — see fleet.ts header.\r\n};\r\n\r\n/**\r\n * Refactor Planner Agent — structured refactoring planning.\r\n * Use for: large rewrites, technical debt reduction, architecture improvements.\r\n */\r\nexport const REFACTOR_PLANNER_AGENT: SubagentConfig = {\r\n id: 'refactor-planner',\r\n name: 'Refactor Planner',\r\n role: 'refactor-planner',\r\n prompt: `You are the Refactor Planner agent. Your job is to analyze code\r\nstructure and produce a concrete, phased refactoring plan with risk\r\nassessment, dependency ordering, and rollback strategy.\r\n\r\nScope:\r\n- Map module-level dependencies (import graph)\r\n- Identify coupling hotspots (high fan-in/out modules)\r\n- Assess refactoring risk by complexity and test coverage\r\n- Generate phased plans with checkpoint milestones\r\n- Produce diff-friendly task lists (one task = one concern)\r\n\r\nInput format you accept:\r\n{ \"task\": \"plan | assess | roadmap\", \"target\": \"src/core\", \"constraint\": \"no-breaking-changes | minimal-downtime | full-rewrite\", \"focus\": \"architecture | performance | maintainability\" }\r\n\r\nOutput: Markdown refactor plan:\r\n- ## Phase 1: Low Risk / High Payoff (do first)\r\n Table: | # | Task | Module | Risk | Est. Time |\r\n- ## Phase 2: Medium Risk\r\n- ## Phase 3: High Risk (requires full regression)\r\n- ## Dependency Graph (abbreviated ASCII)\r\n- ## Rollback Strategy\r\n- ## Exit Criteria (checkbox list)\r\n\r\nRisk scoring criteria:\r\n| Factor | Low | Medium | High |\r\n|--------|-----|--------|------|\r\n| Cyclomatic complexity | <10 | 10-20 | >20 |\r\n| Test coverage | >80% | 50-80% | <50% |\r\n| Fan-out (imports) | <5 | 5-15 | >15 |\r\n\r\nWorking rules:\r\n- Always include rollback strategy — every refactor can fail\r\n- Merge tasks that take <1h into a single phase\r\n- Respect team constraints (reviewer availability, parallelization)\r\n- Never plan without analyzing the actual code first`,\r\n\r\n // Budgets are set by the orchestrator per task — see fleet.ts header.\r\n};\r\n\r\n/**\r\n * Security Scanner Agent — vulnerability and secret detection.\r\n * Use for: CI checks, pre-release audits, dependency vulnerability scanning.\r\n */\r\nexport const SECURITY_SCANNER_AGENT: SubagentConfig = {\r\n id: 'security-scanner',\r\n name: 'Security Scanner',\r\n role: 'security-scanner',\r\n prompt: `You are the Security Scanner agent. Your job is to scan code,\r\nconfigs, and dependencies for security issues from hardcoded secrets to\r\nsupply chain risks.\r\n\r\nScope:\r\n- Detect hardcoded secrets: API keys, tokens, passwords, private keys\r\n- Find injection vectors: eval, innerHTML, SQL concat, shell injection\r\n- Identify insecure patterns: weak crypto, hardcoded IVs, disabled TLS\r\n- Scan dependencies for known CVEs (via npm/pnpm audit)\r\n- Flag supply chain risks: postinstall hooks, unverified scripts, .npmrc\r\n\r\nInput format you accept:\r\n{ \"task\": \"scan | audit | secrets | dependencies\", \"paths\": [\"src\", \"config\"], \"depth\": \"quick | normal | deep\" }\r\n\r\nOutput: Markdown security report:\r\n- ## CRITICAL: Secrets Found (with code snippets)\r\n- ## HIGH: Injection Vectors\r\n- ## MEDIUM: Insecure Patterns\r\n- ## Dependency Issues (CVE list)\r\n- ## Summary table (severity → count)\r\n- ## Remediation Checklist (with checkboxes)\r\n\r\nSecret patterns you detect:\r\n| Pattern | Example | Severity |\r\n|---------|---------|----------|\r\n| AWS Access Key | AKIAIOSFODNN7EXAMPLE | critical |\r\n| AWS Secret Key | [a-zA-Z0-9/+=]{40} base64 | critical |\r\n| GitHub Token | ghp_[a-zA-Z0-9]{36} | critical |\r\n| Private Key PEM | -----BEGIN.*PRIVATE KEY----- | critical |\r\n| JWT | eyJ[a-zA-Z0-9_-]+ | high |\r\n\r\nInjection patterns:\r\n| Construct | Safe alternative |\r\n|-----------|-----------------|\r\n| eval(str) | new Function() or parse |\r\n| innerHTML = x | textContent or sanitize |\r\n| exec(\\`cmd \\${x}\\`) | execFile with args array |\r\n\r\nWorking rules:\r\n- Never scan node_modules — use npm audit instead\r\n- Always provide remediation steps, not just findings\r\n- Verify regex-based secrets before flagging (false positive risk)\r\n- When in doubt, flag as medium rather than ignoring potential issues`,\r\n\r\n // Budgets are set by the orchestrator per task — see fleet.ts header.\r\n};\r\n\r\n/** All pre-built agents in a map for easy lookup by role. */\r\nexport const FLEET_ROSTER: Record<string, SubagentConfig> = {\r\n 'audit-log': AUDIT_LOG_AGENT,\r\n 'bug-hunter': BUG_HUNTER_AGENT,\r\n 'refactor-planner': REFACTOR_PLANNER_AGENT,\r\n 'security-scanner': SECURITY_SCANNER_AGENT,\r\n};\r\n\r\n// ---------------------------------------------------------------------------\r\n// Default per-role budgets.\r\n//\r\n// MASSIVELY RAISED from earlier values. User requested x5–x10 multiplier\r\n// to prevent any timeout or budget exhaustion on long-running tasks\r\n// like monorepo audits, deep refactors, and security scans.\r\n//\r\n// x10 values (realistic upper bound for a single subagent task):\r\n// audit-log: 7.5 hours, 5000 iterations, 15000 tool calls\r\n// bug-hunter: 10 hours, 8000 iterations, 20000 tool calls\r\n// refactor-planner: 7.5 hours, 6000 iterations, 18000 tool calls\r\n// security-scanner: 10 hours, 8000 iterations, 20000 tool calls\r\n//\r\n// These can be overridden per-call via delegate tool parameters.\r\n// ---------------------------------------------------------------------------\r\nexport interface FleetRosterBudget {\r\n timeoutMs?: number;\r\n maxIterations?: number;\r\n maxToolCalls?: number;\r\n maxTokens?: number;\r\n maxCostUsd?: number;\r\n}\r\n\r\nexport const FLEET_ROSTER_BUDGETS: Record<string, FleetRosterBudget> = {\r\n 'audit-log': { timeoutMs: 7.5 * 60 * 60 * 1000, maxIterations: 5000, maxToolCalls: 15000 },\r\n 'bug-hunter': { timeoutMs: 10 * 60 * 60 * 1000, maxIterations: 8000, maxToolCalls: 20000 },\r\n 'refactor-planner': { timeoutMs: 7.5 * 60 * 60 * 1000, maxIterations: 6000, maxToolCalls: 18000 },\r\n 'security-scanner': { timeoutMs: 10 * 60 * 60 * 1000, maxIterations: 8000, maxToolCalls: 20000 },\r\n};\r\n\r\n/**\r\n * Apply roster budget to a config (only when the config has no explicit\r\n * budget fields set). This is called by the coordinator before dispatch.\r\n */\r\n// Generic default budget applied when no role matches and no explicit\r\n// budget fields are set. Used for `name` / free-form delegates that don't\r\n// go through the roster path. Allows very long runs — the LLM sees a\r\n// conservative schema default (30 min) but the subagent gets 3 hours.\r\nconst GENERIC_SUBAGENT_BUDGET: FleetRosterBudget = {\r\n timeoutMs: 3 * 60 * 60 * 1000,\r\n maxIterations: 5000,\r\n maxToolCalls: 15000,\r\n};\r\n\r\nexport function applyRosterBudget(cfg: SubagentConfig): SubagentConfig {\r\n // First try role-specific budget; fall back to generic for name-only delegates.\r\n const roleBudget = cfg.role ? FLEET_ROSTER_BUDGETS[cfg.role] : undefined;\r\n const defaultBudget = roleBudget ?? (cfg.name ? GENERIC_SUBAGENT_BUDGET : undefined);\r\n if (!defaultBudget) return cfg;\r\n return {\r\n ...cfg,\r\n timeoutMs: cfg.timeoutMs ?? defaultBudget.timeoutMs,\r\n maxIterations: cfg.maxIterations ?? defaultBudget.maxIterations,\r\n maxToolCalls: cfg.maxToolCalls ?? defaultBudget.maxToolCalls,\r\n maxTokens: cfg.maxTokens ?? defaultBudget.maxTokens,\r\n maxCostUsd: cfg.maxCostUsd ?? defaultBudget.maxCostUsd,\r\n };\r\n}\r\n\r\n/** Quick-access list for spawning all at once. */\r\nexport const ALL_FLEET_AGENTS = Object.values(FLEET_ROSTER);\r\n","import { randomUUID } from 'node:crypto';\r\nimport { EventEmitter } from 'node:events';\r\nimport type { AgentBridge, BridgeMessage } from '../types/agent-bridge.js';\r\nimport type {\r\n CoordinatorStatus,\r\n MultiAgentConfig,\r\n MultiAgentCoordinator,\r\n SpawnResult,\r\n SubagentConfig,\r\n SubagentContext,\r\n SubagentError,\r\n SubagentErrorKind,\r\n SubagentRunContext,\r\n SubagentRunner,\r\n TaskResult,\r\n TaskSpec,\r\n} from '../types/multi-agent.js';\r\nimport { ProviderError } from '../types/provider.js';\r\nimport { BudgetExceededError, SubagentBudget } from './subagent-budget.js';\r\nimport { applyRosterBudget } from './fleet.js';\r\n\r\ntype SubagentStatus = 'running' | 'idle' | 'stopped' | 'error';\r\n\r\ninterface SubagentEntry {\r\n config: SubagentConfig;\r\n context: SubagentContext;\r\n status: SubagentStatus;\r\n currentTask?: string;\r\n abortController: AbortController;\r\n /** Lazily created on first dispatch — budget is per-task, not per-subagent. */\r\n activeBudget?: SubagentBudget;\r\n}\r\n\r\nexport interface MultiAgentCoordinatorOptions {\r\n /**\r\n * Callback that executes a task on behalf of a subagent. Required for\r\n * `assign()` to actually run anything — without it, tasks queue forever.\r\n * The coordinator provides per-subagent isolation (own budget, own signal,\r\n * own bridge) and enforces timeout + concurrency.\r\n */\r\n runner?: SubagentRunner;\r\n}\r\n\r\nexport class DefaultMultiAgentCoordinator extends EventEmitter implements MultiAgentCoordinator {\r\n readonly coordinatorId: string;\r\n readonly config: MultiAgentConfig;\r\n private runner?: SubagentRunner;\r\n\r\n private readonly subagents = new Map<string, SubagentEntry>();\r\n\r\n private pendingTasks: TaskSpec[] = [];\r\n private completedResults: TaskResult[] = [];\r\n private totalIterations = 0;\r\n private inFlight = 0;\r\n /**\r\n * Subagents currently being stopped. Set on entry to `stop()`, cleared\r\n * once `recordCompletion` lands the terminal TaskResult. Used by\r\n * `runDispatched` and `findIdleSubagent` to refuse mid-flight dispatch\r\n * to a subagent the caller has already asked to terminate — closes the\r\n * assign+terminate race where a fresh task could land on a worker that\r\n * was about to be killed.\r\n */\r\n private readonly terminating = new Set<string>();\r\n\r\n constructor(config: MultiAgentConfig, options: MultiAgentCoordinatorOptions = {}) {\r\n super();\r\n this.coordinatorId = config.coordinatorId;\r\n this.config = config;\r\n this.runner = options.runner;\r\n }\r\n\r\n /**\r\n * Replace the runner after construction. Used when the runner depends\r\n * on infrastructure (e.g. FleetBus) that isn't available until after\r\n * the coordinator's owning Director is built.\r\n */\r\n setRunner(runner: SubagentRunner): void {\r\n this.runner = runner;\r\n }\r\n\r\n /**\r\n * Change the in-flight dispatch ceiling at runtime. Lowering does NOT\r\n * preempt running tasks — already-dispatched subagents finish their\r\n * current task; only future dispatches respect the new cap. Raising\r\n * immediately tries to fill the freed slots from the pending queue.\r\n */\r\n setMaxConcurrent(n: number): void {\r\n if (!Number.isFinite(n) || n < 1) {\r\n throw new Error(`maxConcurrent must be a finite integer >= 1, got ${n}`);\r\n }\r\n this.config.maxConcurrent = Math.floor(n);\r\n this.tryDispatchNext();\r\n }\r\n\r\n async spawn(subagent: SubagentConfig): Promise<SpawnResult> {\r\n const id = subagent.id || randomUUID();\r\n // Duplicate-id guard. Previously a second spawn({id}) with the\r\n // same id silently overwrote the existing entry — orphaning the\r\n // first subagent's AbortController, Context, and any in-flight\r\n // task referencing it. Two spawns with the same id are almost\r\n // always a bug at the caller; refuse and let them surface it.\r\n if (this.subagents.has(id)) {\r\n throw new Error(`Subagent id \"${id}\" already exists — refusing to overwrite`);\r\n }\r\n const context: SubagentContext = {\r\n subagentId: id,\r\n tasks: [],\r\n // Wired later by the caller via setSubagentBridge() once the\r\n // bidirectional bridge is created. Readers must null-check / use\r\n // hasParentBridge() — the type now reflects this.\r\n parentBridge: null,\r\n doneCondition: this.config.doneCondition,\r\n maxConcurrent: this.config.maxConcurrent ?? 16,\r\n };\r\n\r\n this.subagents.set(id, {\r\n config: { ...subagent, id },\r\n context,\r\n status: 'idle',\r\n abortController: new AbortController(),\r\n });\r\n\r\n this.emit('subagent.started', { subagent: { ...subagent, id } });\r\n\r\n return { subagentId: id, agentId: id };\r\n }\r\n\r\n async assign(task: TaskSpec): Promise<void> {\r\n this.pendingTasks.push(task);\r\n this.tryDispatchNext();\r\n }\r\n\r\n async delegate(to: string, msg: BridgeMessage): Promise<void> {\r\n const subagent = this.subagents.get(to);\r\n if (!subagent) throw new Error(`Subagent \"${to}\" not found`);\r\n if (!subagent.context.parentBridge) {\r\n throw new Error(`Subagent \"${to}\" has no parentBridge — call setSubagentBridge() first`);\r\n }\r\n await subagent.context.parentBridge.send(msg);\r\n }\r\n\r\n /**\r\n * Wire up the communication bridge for a subagent. Call after spawn() once\r\n * the caller has created the bidirectional connection.\r\n */\r\n setSubagentBridge(subagentId: string, bridge: AgentBridge): void {\r\n const subagent = this.subagents.get(subagentId);\r\n if (!subagent) throw new Error(`Subagent \"${subagentId}\" not found`);\r\n subagent.context.parentBridge = bridge;\r\n }\r\n\r\n async stop(subagentId: string): Promise<void> {\r\n const subagent = this.subagents.get(subagentId);\r\n if (!subagent) return;\r\n\r\n // Mark terminating BEFORE the abort so a synchronous tryDispatchNext\r\n // observation in another callback path sees the intent and skips\r\n // this subagent. Cleared by recordCompletion once the runner's\r\n // catch block lands the terminal TaskResult.\r\n this.terminating.add(subagentId);\r\n\r\n // Abort any in-flight run, then sever the bridge so further messages fail\r\n // fast instead of silently queueing on a dead subagent.\r\n subagent.abortController.abort();\r\n subagent.status = 'stopped';\r\n subagent.currentTask = undefined;\r\n subagent.context.parentBridge = null;\r\n\r\n this.emit('subagent.stopped', { subagentId, reason: 'stopped by coordinator' });\r\n }\r\n\r\n async stopAll(): Promise<void> {\r\n // Clear the queue FIRST so no new tasks land on subagents while\r\n // we're tearing them down. Each dropped task gets a synthetic\r\n // `aborted_by_parent` completion so any caller awaiting it (e.g.\r\n // delegate tool's awaitTasks) resolves instead of hanging.\r\n //\r\n // Pending tasks never reached `inFlight`, so we cannot route them\r\n // through `recordCompletion` — its underflow guard would short-\r\n // circuit on the second pending task and emit a warning instead\r\n // of the completion event. The shared helper inline-emits.\r\n this.drainPendingAsAborted('Coordinator stopAll() drained the pending queue');\r\n // allSettled so one failure doesn't leave other subagents un-stopped.\r\n await Promise.allSettled([...this.subagents.keys()].map((id) => this.stop(id)));\r\n }\r\n\r\n async remove(subagentId: string): Promise<void> {\r\n await this.stop(subagentId);\r\n this.subagents.delete(subagentId);\r\n }\r\n\r\n /**\r\n * Get current coordinator stats for monitoring/debugging.\r\n */\r\n getStats(): {\r\n total: number;\r\n running: number;\r\n idle: number;\r\n stopped: number;\r\n inFlight: number;\r\n pending: number;\r\n completed: number;\r\n } {\r\n let running = 0, idle = 0, stopped = 0;\r\n for (const [, entry] of this.subagents) {\r\n if (entry.status === 'running') running++;\r\n else if (entry.status === 'idle') idle++;\r\n else stopped++;\r\n }\r\n return {\r\n total: this.subagents.size,\r\n running,\r\n idle,\r\n stopped,\r\n inFlight: this.inFlight,\r\n pending: this.pendingTasks.length,\r\n completed: this.completedResults.length,\r\n };\r\n }\r\n\r\n getStatus(): CoordinatorStatus {\r\n return {\r\n coordinatorId: this.coordinatorId,\r\n subagents: Array.from(this.subagents.entries()).map(([id, s]) => ({\r\n id,\r\n name: s.config.name,\r\n status: s.status,\r\n currentTask: s.currentTask,\r\n })),\r\n pendingTasks: this.pendingTasks.length,\r\n completedTasks: this.completedResults.length,\r\n totalIterations: this.totalIterations,\r\n done: this.isDone(),\r\n };\r\n }\r\n\r\n /** Expose snapshot of completed results — useful for callers awaiting all done. */\r\n results(): readonly TaskResult[] {\r\n return this.completedResults;\r\n }\r\n\r\n /**\r\n * Wait for one or more tasks to complete and return their results.\r\n * If a task is already done when called, returns immediately.\r\n * Resolves to an array in the same order as `taskIds`.\r\n */\r\n async awaitTasks(taskIds: string[]): Promise<TaskResult[]> {\r\n return Promise.all(\r\n taskIds.map((id) => {\r\n const cached = this.completedResults.find((r) => r.taskId === id);\r\n if (cached) return cached;\r\n // Fallback: poll until the task completes (up to timeoutMs).\r\n // The coordinator fires 'task.completed' on every result, so\r\n // we use a promise-based waiter tied to that event.\r\n return new Promise<TaskResult>((resolve, reject) => {\r\n const timeout = setTimeout(() => {\r\n this.off('task.completed', handler);\r\n reject(new Error(`awaitTasks timed out waiting for task \"${id}\"`));\r\n }, this.config.timeoutMs ?? 300_000);\r\n const handler = ({ result }: { task: TaskSpec; result: TaskResult }) => {\r\n if (result.taskId === id) {\r\n clearTimeout(timeout);\r\n this.off('task.completed', handler);\r\n resolve(result);\r\n }\r\n };\r\n this.on('task.completed', handler);\r\n });\r\n }),\r\n );\r\n }\r\n\r\n /**\r\n * Manual completion — for callers that drive subagents without a runner\r\n * (e.g. external orchestrators). When a runner is configured the coordinator\r\n * calls this itself.\r\n */\r\n completeTask(result: TaskResult): void {\r\n this.recordCompletion(result);\r\n }\r\n\r\n // --- internal dispatching ---------------------------------------------\r\n\r\n private tryDispatchNext(): void {\r\n while (this.canDispatch()) {\r\n const dispatchable = this.takeNextDispatchableTask();\r\n if (!dispatchable) {\r\n // No idle worker right now. If every spawned subagent is\r\n // stopped or mid-termination, the pending queue is dead —\r\n // a pending task can never start, so synthetic-complete it\r\n // as `aborted_by_parent`. Without this, an `assign()` after\r\n // `stop()` would hang forever waiting for `task.completed`.\r\n // We DO NOT drain when subagents are busy (status='running'):\r\n // those will free up and accept the work normally.\r\n if (this.pendingTasks.length > 0 && !this.hasLiveSubagent()) {\r\n this.drainPendingAsAborted(\r\n 'No live subagent available — all stopped or mid-termination',\r\n );\r\n }\r\n return;\r\n }\r\n const { subagentId, task } = dispatchable;\r\n // Attach a catch so a synchronous throw inside runDispatched (rare —\r\n // e.g. provider misconfiguration before the first await) becomes a\r\n // visible failed task instead of an unhandled rejection that leaves\r\n // `inFlight` permanently elevated.\r\n this.runDispatched(subagentId, task).catch((err) => {\r\n this.recordCompletion({\r\n subagentId,\r\n taskId: task.id,\r\n status: 'failed',\r\n error: classifySubagentError(err),\r\n iterations: 0,\r\n toolCalls: 0,\r\n durationMs: 0,\r\n });\r\n });\r\n }\r\n }\r\n\r\n private canDispatch(): boolean {\r\n const max = this.config.maxConcurrent ?? 16;\r\n return this.inFlight < max && this.pendingTasks.length > 0;\r\n }\r\n\r\n private takeNextDispatchableTask(): { subagentId: string; task: TaskSpec } | null {\r\n for (let i = 0; i < this.pendingTasks.length; i++) {\r\n const task = this.pendingTasks[i]!;\r\n const subagentId = task.subagentId\r\n ? this.isIdleSubagent(task.subagentId)\r\n ? task.subagentId\r\n : null\r\n : this.findIdleSubagent();\r\n if (!subagentId) continue;\r\n this.pendingTasks.splice(i, 1);\r\n return { subagentId, task };\r\n }\r\n return null;\r\n }\r\n\r\n private findIdleSubagent(): string | null {\r\n for (const [id, s] of this.subagents) {\r\n // Skip subagents that are mid-termination — `stop()` set the\r\n // `terminating` flag and aborted the controller, but the\r\n // status mutation happens synchronously after; checking both\r\n // is belt-and-suspenders against any race where status is\r\n // transiently still 'idle' while termination is in flight.\r\n if (s.status === 'idle' && !this.terminating.has(id)) return id;\r\n }\r\n return null;\r\n }\r\n\r\n private isIdleSubagent(id: string): boolean {\r\n const subagent = this.subagents.get(id);\r\n return !!subagent && subagent.status === 'idle' && !this.terminating.has(id);\r\n }\r\n\r\n /**\r\n * Returns true iff at least one spawned subagent could still\r\n * process a task. A \"live\" subagent is one that is not stopped\r\n * AND not mid-termination — `running` workers count because they\r\n * will eventually finish and become idle.\r\n *\r\n * When no subagent has ever been spawned, returns `true` so a\r\n * pre-spawn `assign()` simply queues (legacy behaviour). The\r\n * dead-end detection only fires after `stop()` has retired every\r\n * spawned worker.\r\n *\r\n * Used by `tryDispatchNext` to detect a dead-end pending queue.\r\n */\r\n private hasLiveSubagent(): boolean {\r\n if (this.subagents.size === 0) return true;\r\n for (const [id, s] of this.subagents) {\r\n if (s.status !== 'stopped' && !this.terminating.has(id)) return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Drain every pending task with a synthetic `aborted_by_parent`\r\n * completion event. Same shape as the `stopAll()` drain — we go\r\n * around `recordCompletion` because pending tasks were never\r\n * counted in `inFlight` and routing them through would trip the\r\n * underflow guard on every task after the first.\r\n */\r\n private drainPendingAsAborted(message: string): void {\r\n const dropped = this.pendingTasks.splice(0, this.pendingTasks.length);\r\n for (const t of dropped) {\r\n const synthetic: TaskResult = {\r\n subagentId: t.subagentId ?? 'unassigned',\r\n taskId: t.id,\r\n status: 'stopped',\r\n error: {\r\n kind: 'aborted_by_parent',\r\n message,\r\n retryable: false,\r\n },\r\n iterations: 0,\r\n toolCalls: 0,\r\n durationMs: 0,\r\n };\r\n this.completedResults.push(synthetic);\r\n this.emit('task.completed', { task: t, result: synthetic });\r\n }\r\n }\r\n\r\n private async runDispatched(subagentId: string, task: TaskSpec): Promise<void> {\r\n const subagent = this.subagents.get(subagentId);\r\n if (!subagent) return;\r\n // Final race guard: if `stop(subagentId)` ran between dispatch\r\n // and us arriving here, refuse to start the task and surface it\r\n // as `aborted_by_parent` so any caller awaiting the task id\r\n // unblocks. Without this, the task would be marked 'running',\r\n // collide with the just-completed 'stopped' state, and leak\r\n // inFlight by 1 because no recordCompletion path covers it.\r\n if (this.terminating.has(subagentId) || subagent.status === 'stopped') {\r\n this.recordCompletion({\r\n subagentId,\r\n taskId: task.id,\r\n status: 'stopped',\r\n error: {\r\n kind: 'aborted_by_parent',\r\n message: 'Subagent was terminated before task could start',\r\n retryable: false,\r\n },\r\n iterations: 0,\r\n toolCalls: 0,\r\n durationMs: 0,\r\n });\r\n return;\r\n }\r\n\r\n subagent.status = 'running';\r\n subagent.currentTask = task.id;\r\n task.subagentId = subagentId;\r\n subagent.context.tasks.push(task);\r\n\r\n this.emit('task.assigned', { task, subagentId });\r\n\r\n // Budget combines coordinator defaults with per-subagent and per-task overrides.\r\n // Precedence: task > subagent (raw, no roster fills) > coordinator default > roster default.\r\n // We intentionally call applyRosterBudget LATE — only as a final fallback after\r\n // the coordinator's defaultBudget has had a chance to apply. This prevents\r\n // GENERIC_SUBAGENT_BUDGET (5000 iter) from shadowing the coordinator's explicit default.\r\n const rawMaxIterations = subagent.config.maxIterations;\r\n const rawMaxToolCalls = subagent.config.maxToolCalls;\r\n const rawMaxTokens = subagent.config.maxTokens;\r\n const rawMaxCostUsd = subagent.config.maxCostUsd;\r\n const rawTimeoutMs = subagent.config.timeoutMs;\r\n const configWithRosterDefaults = applyRosterBudget(subagent.config);\r\n const budget = new SubagentBudget({\r\n maxIterations:\r\n rawMaxIterations ?? this.config.defaultBudget?.maxIterations ?? configWithRosterDefaults.maxIterations,\r\n maxToolCalls:\r\n rawMaxToolCalls ??\r\n this.config.defaultBudget?.maxToolCalls ??\r\n configWithRosterDefaults.maxToolCalls,\r\n maxTokens:\r\n rawMaxTokens ?? this.config.defaultBudget?.maxTokens ?? configWithRosterDefaults.maxTokens,\r\n maxCostUsd:\r\n rawMaxCostUsd ?? this.config.defaultBudget?.maxCostUsd ?? configWithRosterDefaults.maxCostUsd,\r\n timeoutMs:\r\n rawTimeoutMs ?? this.config.defaultBudget?.timeoutMs ?? configWithRosterDefaults.timeoutMs,\r\n });\r\n subagent.activeBudget = budget;\r\n\r\n if (!this.runner) {\r\n // No runner wired — caller drives execution via completeTask(). Status\r\n // reverts when the caller reports. We intentionally don't bump\r\n // `inFlight` here: `completeTask` → `recordCompletion` would then\r\n // decrement an inFlight that runDispatched never incremented, masking\r\n // the \"no runner\" state. With this guard, `isDone()`'s all_tasks_done\r\n // check still settles correctly once the caller reports.\r\n return;\r\n }\r\n\r\n // Only count inFlight when we actually own the execution lifecycle.\r\n this.inFlight++;\r\n\r\n const startTime = Date.now();\r\n const runCtx: SubagentRunContext = {\r\n subagentId,\r\n config: subagent.config,\r\n budget,\r\n signal: subagent.abortController.signal,\r\n bridge: subagent.context.parentBridge || null,\r\n };\r\n\r\n let result: TaskResult;\r\n\r\n budget.start();\r\n try {\r\n const outcome = await this.executeWithTimeout(this.runner, task, runCtx, budget);\r\n result = {\r\n subagentId,\r\n taskId: task.id,\r\n status: 'success',\r\n result: outcome.result,\r\n iterations: outcome.iterations,\r\n toolCalls: outcome.toolCalls,\r\n durationMs: Date.now() - startTime,\r\n };\r\n } catch (err) {\r\n // Order matters: a timeout calls abort() to signal cooperative runners,\r\n // which also flips `signal.aborted=true`. Inspect the error first so we\r\n // surface 'timeout' rather than masking it as 'stopped'.\r\n const status: TaskResult['status'] =\r\n err instanceof BudgetExceededError && err.kind === 'timeout'\r\n ? 'timeout'\r\n : subagent.abortController.signal.aborted\r\n ? 'stopped'\r\n : 'failed';\r\n const usage = budget.usage();\r\n result = {\r\n subagentId,\r\n taskId: task.id,\r\n status,\r\n error: classifySubagentError(err, {\r\n parentAborted: subagent.abortController.signal.aborted,\r\n }),\r\n iterations: usage.iterations,\r\n toolCalls: usage.toolCalls,\r\n durationMs: Date.now() - startTime,\r\n };\r\n }\r\n\r\n this.recordCompletion(result);\r\n }\r\n\r\n private async executeWithTimeout(\r\n runner: SubagentRunner,\r\n task: TaskSpec,\r\n ctx: SubagentRunContext,\r\n budget: SubagentBudget,\r\n ) {\r\n const initialTimeoutMs = budget.limits.timeoutMs;\r\n if (initialTimeoutMs === undefined) return runner(task, ctx);\r\n\r\n // Re-armable watchdog. When the wall-clock fires, give the budget a\r\n // chance to negotiate an extension (via the same onThreshold path the\r\n // other limit kinds use). The Director's auto-extend listener handles\r\n // `kind: 'timeout'` and patches `budget.limits.timeoutMs`; we observe\r\n // that patch on the next tick and re-arm the timer for the remaining\r\n // window. If onThreshold is unset or negotiation returns 'stop',\r\n // reject as before with `elapsed` (not `Date.now()`) so the error\r\n // message reads sensibly.\r\n const start = Date.now();\r\n let timer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n const timeoutPromise = new Promise<never>((_, reject) => {\r\n const armFor = (ms: number) => {\r\n if (timer) clearTimeout(timer);\r\n timer = setTimeout(async () => {\r\n const elapsed = Date.now() - start;\r\n const limit = budget.limits.timeoutMs ?? initialTimeoutMs;\r\n // Without an onThreshold handler the original behaviour stands:\r\n // abort the signal and hard-reject. This preserves the contract\r\n // for direct SubagentBudget consumers that don't wire negotiation.\r\n if (!budget.onThreshold) {\r\n this.subagents.get(ctx.subagentId)?.abortController.abort();\r\n reject(new BudgetExceededError('timeout', limit, elapsed));\r\n return;\r\n }\r\n // With a handler, ask for an extension. The budget's\r\n // requestDecision returns 'stop' on no response (decision\r\n // fallback timer inside SubagentBudget), so this never hangs.\r\n try {\r\n const result = budget.onThreshold({\r\n kind: 'timeout',\r\n used: elapsed,\r\n limit,\r\n requestDecision: () =>\r\n new Promise((resolveDecision) => {\r\n budget._events?.emit('budget.threshold_reached', {\r\n kind: 'timeout',\r\n used: elapsed,\r\n limit,\r\n timeoutMs: 60_000,\r\n extend: (extra) => resolveDecision({ extend: extra }),\r\n deny: () => resolveDecision('stop'),\r\n });\r\n }),\r\n });\r\n const decision =\r\n typeof result === 'string' ? result : await result;\r\n if (decision === 'continue') {\r\n armFor(Math.max(1_000, limit));\r\n return;\r\n }\r\n if (decision === 'throw' || decision === 'stop') {\r\n // Timeout denied — re-arm for the same limit so we ask again\r\n // on the next tick. This makes timeout a pure warning event:\r\n // the subagent keeps running, the user sees \"⚡ timeout —\r\n // extending\" in chat history, and work continues until the\r\n // subagent naturally finishes or the user stops it. No task\r\n // is hard-killed solely because its wall-clock ran out.\r\n armFor(Math.max(1_000, limit));\r\n return;\r\n }\r\n // 'extend' — patch budget and re-arm for the new remainder.\r\n if (decision.extend.timeoutMs !== undefined) {\r\n (budget.limits as Record<string, unknown>).timeoutMs =\r\n decision.extend.timeoutMs;\r\n const newLimit = decision.extend.timeoutMs;\r\n const remaining = Math.max(1_000, newLimit - elapsed);\r\n armFor(remaining);\r\n return;\r\n }\r\n // No timeoutMs in extend — fall through to reject.\r\n this.subagents.get(ctx.subagentId)?.abortController.abort();\r\n reject(new BudgetExceededError('timeout', limit, elapsed));\r\n } catch (err) {\r\n this.subagents.get(ctx.subagentId)?.abortController.abort();\r\n reject(\r\n err instanceof BudgetExceededError\r\n ? err\r\n : new BudgetExceededError('timeout', limit, elapsed),\r\n );\r\n }\r\n }, ms);\r\n };\r\n armFor(initialTimeoutMs);\r\n });\r\n\r\n try {\r\n return await Promise.race([runner(task, ctx), timeoutPromise]);\r\n } finally {\r\n if (timer) clearTimeout(timer);\r\n }\r\n }\r\n\r\n private recordCompletion(result: TaskResult): void {\r\n this.completedResults.push(result);\r\n this.totalIterations += result.iterations;\r\n if (this.inFlight > 0) {\r\n this.inFlight--;\r\n } else if (this.runner) {\r\n // Runner-driven path completed without an outstanding inFlight slot —\r\n // shouldn't happen unless completeTask was called externally.\r\n this.emit('warning', {\r\n type: 'inFlight_underflow',\r\n taskId: result.taskId,\r\n subagentId: result.subagentId,\r\n });\r\n return;\r\n }\r\n\r\n const subagent = this.subagents.get(result.subagentId);\r\n if (subagent && subagent.status !== 'stopped') {\r\n const failed = result.status === 'failed' || result.status === 'timeout';\r\n // Synchronously reset the worker to idle after either a clean\r\n // finish or a transient failure. The previous code parked the\r\n // subagent in 'error' and used a `queueMicrotask` to flip it\r\n // back to 'idle' — that opened a window where `assign()` +\r\n // `tryDispatchNext` could race the microtask, leaving the\r\n // worker stuck in 'running' state while actually idle. By\r\n // resetting now, no async gap can leak the state machine.\r\n subagent.status = 'idle';\r\n void failed; // kept for future telemetry hooks\r\n subagent.currentTask = undefined;\r\n // If the run aborted (timeout or explicit stop), the subagent's\r\n // signal is now permanently aborted — recycling the controller lets\r\n // the next dispatched task start with a fresh cancellation scope.\r\n if (subagent.abortController.signal.aborted) {\r\n subagent.abortController = new AbortController();\r\n }\r\n }\r\n // Clear the terminating flag now that the worker has a terminal\r\n // TaskResult on record. Subsequent stop() calls re-add it; new\r\n // assign() calls can flow normally.\r\n this.terminating.delete(result.subagentId);\r\n\r\n this.emit('task.completed', {\r\n task: subagent?.context.tasks.find((t) => t.id === result.taskId) ?? { id: result.taskId },\r\n result,\r\n });\r\n\r\n this.tryDispatchNext();\r\n\r\n if (this.isDone()) {\r\n this.emit('done', {\r\n results: this.completedResults,\r\n totalIterations: this.totalIterations,\r\n });\r\n }\r\n }\r\n\r\n private isDone(): boolean {\r\n if (this.config.doneCondition.type === 'all_tasks_done') {\r\n return this.pendingTasks.length === 0 && this.inFlight === 0;\r\n }\r\n if (\r\n this.config.doneCondition.maxIterations !== undefined &&\r\n this.totalIterations >= this.config.doneCondition.maxIterations\r\n ) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n}\r\n\r\n/**\r\n * Map any raw exception thrown out of a subagent's runner into a\r\n * structured `SubagentError`. This is the single point where the\r\n * coordinator decides \"what kind of failure was that\" — so callers\r\n * (delegate tool output, /agents UI, retry policies) branch on\r\n * `kind` instead of substring-matching `error.message`.\r\n *\r\n * The classification order matters:\r\n * 1. Provider errors first (their `status` + `retryable` are\r\n * already structured, just translate to our enum).\r\n * 2. Budget errors next (BudgetExceededError carries a discrete\r\n * `kind` we can lift directly).\r\n * 3. Parent-abort if the subagent's signal was aborted and we\r\n * didn't recognize the error otherwise — distinguishes user\r\n * Ctrl+C from a tool throwing.\r\n * 4. Substring sniffing for stable error markers (\"agent\r\n * aborted\" from agent-subagent-runner, \"Bridge transport\"\r\n * from agent-bridge).\r\n * 5. Fallback to `unknown` so callers know we couldn't classify.\r\n *\r\n * The `cause` field is always populated when `err` is an Error so\r\n * diagnostics survive even when `kind === 'unknown'` — no info is\r\n * dropped, the classifier just refused to commit.\r\n *\r\n * Exported because tests and CLI surfaces want to assert on the\r\n * classification without instantiating a coordinator.\r\n */\r\nexport function classifySubagentError(\r\n err: unknown,\r\n hints: { parentAborted?: boolean } = {},\r\n): SubagentError {\r\n const cause = err instanceof Error\r\n ? { name: err.name, message: err.message, stack: err.stack }\r\n : undefined;\r\n\r\n if (err instanceof ProviderError) {\r\n const baseMessage = err.describe();\r\n return providerErrorToSubagentError(err, baseMessage, cause);\r\n }\r\n\r\n const baseMessage = err instanceof Error ? err.message : String(err);\r\n\r\n if (err instanceof BudgetExceededError) {\r\n const map: Record<BudgetExceededError['kind'], SubagentErrorKind> = {\r\n iterations: 'budget_iterations',\r\n tool_calls: 'budget_tool_calls',\r\n tokens: 'budget_tokens',\r\n cost: 'budget_cost',\r\n timeout: 'budget_timeout',\r\n };\r\n return {\r\n kind: map[err.kind],\r\n message: baseMessage,\r\n // Budgets are user-configured ceilings, not transient failures —\r\n // retrying with the same budget will hit the same ceiling. The\r\n // orchestrator must raise the budget or narrow the task first.\r\n retryable: false,\r\n cause,\r\n };\r\n }\r\n\r\n // Distinguish parent-aborted from real failures BEFORE substring\r\n // sniffing — if the parent signal is aborted, the most common\r\n // exception is \"agent aborted\" thrown by agent-subagent-runner.\r\n if (hints.parentAborted) {\r\n return {\r\n kind: 'aborted_by_parent',\r\n message: baseMessage,\r\n retryable: false,\r\n cause,\r\n };\r\n }\r\n\r\n // Stable markers — these strings live in our own code and are\r\n // checked here intentionally so callers can react without\r\n // exception-type imports.\r\n const lower = baseMessage.toLowerCase();\r\n if (/agent aborted$/i.test(baseMessage)) {\r\n return {\r\n kind: 'aborted_by_parent',\r\n message: baseMessage,\r\n retryable: false,\r\n cause,\r\n };\r\n }\r\n if (/agent exhausted iteration limit$/i.test(baseMessage)) {\r\n return { kind: 'budget_iterations', message: baseMessage, retryable: false, cause };\r\n }\r\n if (/empty response$/i.test(baseMessage)) {\r\n return { kind: 'empty_response', message: baseMessage, retryable: false, cause };\r\n }\r\n // The runner throws `Error('tool failed: <name>')` when an executed tool\r\n // returned `ok:false` and the agent ultimately ended without recovering\r\n // (or aborted). Surface as `tool_failed` so callers don't conflate a\r\n // failed tool with a thrown tool — both are useful but mean different\r\n // things at the LLM layer.\r\n if (/^tool failed: /i.test(baseMessage)) {\r\n return { kind: 'tool_failed', message: baseMessage, retryable: false, cause };\r\n }\r\n if (lower.includes('bridge transport') || /bridge.*(closed|disconnect)/i.test(baseMessage)) {\r\n return { kind: 'bridge_failed', message: baseMessage, retryable: false, cause };\r\n }\r\n if (/context length|max.*tokens?.*exceeded|prompt is too long/i.test(baseMessage)) {\r\n return { kind: 'context_overflow', message: baseMessage, retryable: false, cause };\r\n }\r\n\r\n // Final fallback — preserve cause so diagnostics aren't lost.\r\n return {\r\n kind: 'unknown',\r\n message: baseMessage,\r\n retryable: false,\r\n cause,\r\n };\r\n}\r\n\r\nfunction providerErrorToSubagentError(\r\n err: ProviderError,\r\n message: string,\r\n cause: SubagentError['cause'],\r\n): SubagentError {\r\n const status = err.status;\r\n // Read suggested retry-after from the provider body when present so\r\n // the orchestrator doesn't have to invent a backoff. Most providers\r\n // include retry-after as a header / body field which our provider\r\n // layer normalises into `body.message` — we cannot trust a numeric\r\n // field exists, so we leave backoffMs unset when unknown.\r\n if (status === 429 || err.body?.type === 'rate_limit_error') {\r\n return {\r\n kind: 'provider_rate_limit',\r\n message,\r\n retryable: true,\r\n // Conservative default: 5s. Provider-specific code can override\r\n // by emitting an error whose body carries an explicit hint.\r\n backoffMs: 5_000,\r\n cause,\r\n };\r\n }\r\n if (status === 401 || status === 403 || err.body?.type === 'authentication_error') {\r\n return { kind: 'provider_auth', message, retryable: false, cause };\r\n }\r\n if (status === 408 || status === 0) {\r\n return { kind: 'provider_timeout', message, retryable: true, cause };\r\n }\r\n if (status >= 500 && status < 600) {\r\n return {\r\n kind: 'provider_5xx',\r\n message,\r\n retryable: true,\r\n backoffMs: 3_000,\r\n cause,\r\n };\r\n }\r\n // Other provider errors (400 invalid request, 404 not found, etc.)\r\n // are not retryable as-is and don't have a dedicated kind — surface\r\n // as 'unknown' so the orchestrator treats them as terminal.\r\n return { kind: 'unknown', message, retryable: err.retryable, cause };\r\n}\r\n","import { randomUUID } from 'node:crypto';\nimport type { Agent } from '../core/agent.js';\nimport type { Context } from '../core/context.js';\nimport type { AgentFactory } from '../coordination/agent-subagent-runner.js';\nimport { makeAgentSubagentRunner } from '../coordination/agent-subagent-runner.js';\nimport type { SubagentConfig, TaskResult } from '../types/multi-agent.js';\nimport type { JournalEntry, GoalFile } from '../storage/goal-store.js';\nimport { loadGoal, saveGoal, appendJournal, goalFilePath } from '../storage/goal-store.js';\nimport type { Compactor } from '../types/compactor.js';\nimport { DefaultMultiAgentCoordinator } from '../coordination/multi-agent-coordinator.js';\nimport type { MultiAgentConfig } from '../types/multi-agent.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type ParallelEngineState = 'idle' | 'running' | 'stopped';\n\nexport interface ParallelEternalOptions {\n /** The coordinating agent — NOT a subagent. Owns container/tools/providers. */\n agent: Agent;\n /** Project root (used for goal.json path). */\n projectRoot: string;\n /**\n * Number of parallel subagent slots per tick.\n * Default: 4. Range 1–16; values >8 are for high-throughput machines.\n */\n parallelSlots?: number;\n /** Per-subagent default timeout in ms. Default: 300_000 (5 min). */\n iterationTimeoutMs?: number;\n onIteration?: (entry: JournalEntry) => void;\n onError?: (err: Error, iteration: number) => void;\n gitStatusReader?: () => Promise<string>;\n now?: () => Date;\n compactor?: Compactor;\n compactEveryNIterations?: number;\n aggressiveCompactRatio?: number;\n maxContextTokens?: number;\n /** Override the default agent factory (uses main agent if not provided). */\n subagentFactory?: AgentFactory;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nconst GOAL_COMPLETE_MARKER = /^\\s*\\[goal[_\\s-]?complete\\]\\s*$/im;\n\n// ---------------------------------------------------------------------------\n// ParallelEternalEngine\n// ---------------------------------------------------------------------------\n\n/**\n * Sense → Decide → Fan-out (4–8 parallel agents) → Aggregate → Loop.\n *\n * Each tick:\n * 1. Sense — load goal, todos, git status\n * 2. Decide — decompose goal into N parallel sub-tasks\n * 3. Fan-out — spawn N subagents simultaneously, await all\n * 4. Aggregate — write journal, update todos, check [GOAL_COMPLETE]\n * 5. Loop — continue until stop() or mission complete\n *\n * Uses DefaultMultiAgentCoordinator + AgentSubagentRunner for subagent lifecycle.\n */\nexport class ParallelEternalEngine {\n private state: ParallelEngineState = 'idle';\n private stopRequested = false;\n private iterationsSinceCompact = 0;\n private iterations = 0;\n private consecutiveFailures = 0;\n private readonly goalPath: string;\n private readonly slots: number;\n private readonly timeoutMs: number;\n private coordinator: DefaultMultiAgentCoordinator | null = null;\n private agentFactory: AgentFactory;\n\n constructor(private readonly opts: ParallelEternalOptions) {\n this.goalPath = goalFilePath(opts.projectRoot);\n this.slots = Math.min(16, Math.max(1, opts.parallelSlots ?? 4));\n this.timeoutMs = opts.iterationTimeoutMs ?? 300_000;\n this.agentFactory = opts.subagentFactory ?? (async (config: SubagentConfig) => ({\n agent: this.opts.agent,\n events: this.opts.agent.events,\n }));\n }\n\n get currentState(): ParallelEngineState {\n return this.state;\n }\n\n /**\n * Get the underlying coordinator for stats/monitoring.\n */\n getCoordinator(): DefaultMultiAgentCoordinator | null {\n return this.coordinator;\n }\n\n stop(): void {\n this.stopRequested = true;\n void this.persistState('stopped').catch(() => {});\n this.state = 'stopped';\n }\n\n async prime(): Promise<void> {\n this.stopRequested = false;\n this.state = 'running';\n await this.persistState('running');\n }\n\n async run(): Promise<void> {\n this.state = 'running';\n await this.persistState('running');\n\n const config: MultiAgentConfig = {\n coordinatorId: `parallel-${randomUUID().slice(0, 8)}`,\n maxConcurrent: this.slots,\n doneCondition: { type: 'all_tasks_done' },\n };\n this.coordinator = new DefaultMultiAgentCoordinator(config);\n const runner = makeAgentSubagentRunner({ factory: this.agentFactory });\n this.coordinator.setRunner?.(runner);\n\n try {\n while (!this.stopRequested) {\n try {\n await this.runOneIteration();\n } catch (err) {\n this.consecutiveFailures++;\n this.opts.onError?.(err instanceof Error ? err : new Error(String(err)), this.consecutiveFailures);\n await this.appendFailure('engine error', err instanceof Error ? err.message : String(err));\n }\n if (this.stopRequested) break;\n await sleep(2000);\n }\n } finally {\n this.state = 'stopped';\n await this.persistState('stopped').catch(() => {});\n }\n }\n\n /**\n * Execute one tick: decompose → fan-out → aggregate → compact.\n * Called by the REPL in its main loop (REPL drives, engine is stateless per tick).\n */\n async runOneIteration(): Promise<boolean> {\n this.iterations++;\n\n const goal = await loadGoal(this.goalPath);\n if (!goal) { this.stopRequested = true; return false; }\n if (goal.goalState !== 'active') { this.stopRequested = true; return false; }\n\n // Build coordinator on first tick.\n if (!this.coordinator) {\n const config: MultiAgentConfig = {\n coordinatorId: `parallel-${randomUUID().slice(0, 8)}`,\n maxConcurrent: this.slots,\n doneCondition: { type: 'all_tasks_done' },\n };\n this.coordinator = new DefaultMultiAgentCoordinator(config);\n const runner = makeAgentSubagentRunner({ factory: this.agentFactory });\n this.coordinator.setRunner?.(runner);\n }\n\n const tasks = await this.decomposeGoal(goal);\n if (!tasks || tasks.length === 0) {\n await sleep(5000);\n return false;\n }\n\n const fanOut = await this.fanOut(goal, tasks);\n this.iterationsSinceCompact++;\n\n const successCount = fanOut.results.filter(r => r.status === 'success').length;\n const status: JournalEntry['status'] = fanOut.goalComplete ? 'success' : fanOut.allSuccessful ? 'success' : 'failure';\n const note = [\n `${successCount}/${fanOut.results.length} subagents succeeded`,\n fanOut.goalComplete ? '[GOAL_COMPLETE]' : '',\n fanOut.partialOutput ? `Output: ${fanOut.partialOutput.slice(0, 120)}` : '',\n ].filter(Boolean).join(' | ');\n\n await this.appendIterationEntry({\n source: 'parallel',\n task: `parallel:${tasks.length} slots — ${tasks.slice(0, 3).join(', ')}${tasks.length > 3 ? '...' : ''}`,\n status,\n note,\n });\n\n if (fanOut.goalComplete) {\n this.stopRequested = true;\n return true;\n }\n\n await this.maybeCompact();\n return fanOut.allSuccessful;\n }\n\n // -------------------------------------------------------------------------\n // Fan-out\n // -------------------------------------------------------------------------\n\n private async fanOut(goal: GoalFile, tasks: string[]): Promise<{\n results: TaskResult[];\n allSuccessful: boolean;\n goalComplete: boolean;\n partialOutput: string;\n }> {\n const coordinator = this.coordinator!;\n const slotCount = Math.min(this.slots, tasks.length);\n\n const recentJournal = goal.journal.slice(-5)\n .map(e => ` #${e.iteration} [${e.status}] ${e.task}${e.note ? ` — ${e.note.slice(0, 80)}` : ''}`)\n .join('\\n');\n\n const directivePreamble = [\n '═══ ETERNAL AUTONOMY — parallel task slot ═══',\n '',\n `Mission: ${goal.goal}`,\n `Total parallel slots: ${slotCount}`,\n '',\n recentJournal ? `Recent journal (last 5):\\n${recentJournal}` : 'No prior iterations.',\n '',\n '── EXECUTION PROTOCOL ──',\n '• Execute the assigned task end-to-end using multiple tool calls.',\n '• Emit `[done]` on its own line when the task is complete.',\n '• Do not ask for confirmation — YOLO is active.',\n '• If the overall Mission is accomplished, emit `[GOAL_COMPLETE]` followed by a verification recipe.',\n '• Keep output concise — summarize findings, do not transcribe files.',\n ].join('\\n');\n\n const taskIds: string[] = [];\n const subagentIds: string[] = [];\n\n const spawnPromises: Array<Promise<void>> = [];\n for (let i = 0; i < slotCount; i++) {\n const task = tasks[i]!;\n const subagentId = `parallel-${this.iterations}-${i}`;\n const taskId = randomUUID();\n const spec = {\n id: taskId,\n description: `${directivePreamble}\\n\\n── SLOT ${i + 1}/${slotCount} ──\\nTask: ${task}\\n`,\n subagentId,\n };\n\n spawnPromises.push((async () => {\n try {\n await coordinator.spawn({\n id: subagentId,\n name: `slot-${subagentId.slice(-6)}`,\n // Let the coordinator apply its default budget (from roster or generic).\n // Hardcoding low limits here defeats the x10 budget improvement.\n timeoutMs: this.timeoutMs,\n });\n subagentIds.push(subagentId);\n taskIds.push(taskId);\n await coordinator.assign(spec);\n } catch {\n // non-fatal: individual spawn failure doesn't block other slots\n }\n })());\n }\n await Promise.all(spawnPromises);\n\n if (taskIds.length === 0) {\n return { results: [], allSuccessful: false, goalComplete: false, partialOutput: '' };\n }\n\n let results: TaskResult[] = [];\n try {\n // Wait up to 2 hours for subagents to complete. This should cover\n // most subagent tasks since the roster budgets go up to 10 hours.\n // The outer eternal loop manages actual iteration limits.\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), Math.max(this.timeoutMs * 2, 7200_000));\n try {\n results = await coordinator.awaitTasks(taskIds);\n } finally {\n clearTimeout(timer);\n }\n } catch {\n results = coordinator.results().slice(-taskIds.length);\n }\n\n const allSuccessful = results.length > 0 && results.every(r => r.status === 'success');\n const goalComplete = results.some(r =>\n r.status === 'success' && typeof r.result === 'string' && GOAL_COMPLETE_MARKER.test(r.result)\n );\n const partialOutput = results\n .map(r => (typeof r.result === 'string' ? r.result : ''))\n .filter(Boolean)\n .join('\\n\\n');\n\n return { results, allSuccessful, goalComplete, partialOutput };\n }\n\n // -------------------------------------------------------------------------\n // Goal decomposition\n // -------------------------------------------------------------------------\n\n private async decomposeGoal(goal: GoalFile): Promise<string[] | null> {\n // Strategy 1: pending todos as sub-tasks\n const todos = this.opts.agent.ctx?.todos;\n const tasks: string[] = [];\n if (Array.isArray(todos)) {\n const pending = todos.filter((t) => t.status === 'pending').slice(0, this.slots);\n for (const t of pending) {\n tasks.push(`[todo] ${t.content}`);\n }\n }\n\n // Strategy 2: git dirty files\n if (tasks.length < this.slots) {\n try {\n const gitStatus = await (this.opts.gitStatusReader?.() ?? this.readGitStatus());\n const dirty = gitStatus.trim();\n if (dirty) {\n const lines = dirty.split('\\n').slice(0, this.slots - tasks.length);\n for (const line of lines) {\n const file = line.replace(/^[ MADRUC?]{2}\\s*/, '').trim();\n if (file) tasks.push(`[git] inspect and fix: ${file}`);\n }\n }\n } catch {\n // ignore\n }\n }\n\n // Strategy 3: leader-brainstormed sub-tasks for remaining slots\n if (tasks.length < this.slots) {\n const remaining = this.slots - tasks.length;\n const brainstormed = await this.brainstormSubtasks(goal, remaining);\n tasks.push(...brainstormed);\n }\n\n return tasks.length > 0 ? tasks.slice(0, this.slots) : null;\n }\n\n private async readGitStatus(): Promise<string> {\n const { execFile } = await import('node:child_process');\n const { promisify } = await import('node:util');\n const execFileP = promisify(execFile);\n const { stdout } = await execFileP('git', ['status', '--porcelain'], {\n cwd: this.opts.projectRoot,\n timeout: 5_000,\n });\n return stdout;\n }\n\n private async brainstormSubtasks(goal: GoalFile, count: number): Promise<string[]> {\n const lastFew = goal.journal.slice(-5).map((e) => ` - [${e.status}] ${e.task}`).join('\\n');\n const directive = [\n `Decompose this goal into exactly ${count} independent sub-tasks for parallel execution.`,\n '',\n `Goal: ${goal.goal}`,\n '',\n lastFew ? `Recent:\\n${lastFew}` : 'No prior iterations.',\n '',\n `Output exactly ${count} tasks, one per line, under 120 chars each.`,\n 'Format: TASK-1 | TASK-2 | ... (pipe-separated, no numbering, no preamble).',\n 'Each task must be independently actionable with no shared dependencies.',\n ].join('\\n');\n\n try {\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), 60_000);\n try {\n const result = await this.opts.agent.run([{ type: 'text' as const, text: directive }], {\n signal: ctrl.signal,\n maxIterations: 1,\n });\n if (result.status !== 'done') return [];\n const text = (result.finalText ?? '').trim();\n if (!text) return [];\n const tasks = text.split('|').map(t => t.trim()).filter(t => t.length > 10 && t.length < 240);\n return tasks.slice(0, count);\n } finally {\n clearTimeout(timer);\n }\n } catch {\n return [];\n }\n }\n\n // -------------------------------------------------------------------------\n // Compaction\n // -------------------------------------------------------------------------\n\n private async maybeCompact(): Promise<void> {\n const compactor = this.opts.compactor;\n if (!compactor) return;\n const ctx = this.opts.agent.ctx;\n if (!ctx) return;\n\n const shouldRun = this.iterationsSinceCompact >= (this.opts.compactEveryNIterations ?? 25);\n if (!shouldRun) return;\n\n const report = await compactor.compact(ctx, { aggressive: false });\n this.iterationsSinceCompact = 0;\n await this.appendIterationEntry({\n source: 'manual',\n task: 'compaction (cadence)',\n status: 'success',\n note: `saved ~${report.before - report.after} tokens`,\n });\n }\n\n // -------------------------------------------------------------------------\n // Helpers\n // -------------------------------------------------------------------------\n\n private async appendIterationEntry(entry: Omit<JournalEntry, 'iteration' | 'at'>): Promise<void> {\n const current = await loadGoal(this.goalPath);\n if (!current) return;\n const updated = appendJournal(current, entry);\n await saveGoal(this.goalPath, updated);\n const entryWithMeta: JournalEntry = {\n at: (this.opts.now?.() ?? new Date()).toISOString(),\n iteration: updated.iterations,\n ...entry,\n };\n this.opts.onIteration?.(entryWithMeta);\n }\n\n private async appendFailure(task: string, note: string): Promise<void> {\n await this.appendIterationEntry({ source: 'manual', task, status: 'failure', note });\n }\n\n private async persistState(state: GoalFile['engineState']): Promise<void> {\n const current = await loadGoal(this.goalPath);\n if (!current) return;\n if (current.engineState === state) return;\n await saveGoal(this.goalPath, { ...current, engineState: state });\n }\n}","/**\n * System-prompt contributor that surfaces eternal-autonomy state to the\n * model on every turn.\n *\n * Why this exists: when the engine drives a long-running loop, the\n * per-iteration directive carries the rules. But the directive is a USER\n * message — it scrolls out of working memory after a few compactions and\n * the model forgets it's in autonomy mode (forgets `[GOAL_COMPLETE]`,\n * forgets the todo-state protocol, forgets the no-confirmation rule).\n * Injecting the same anchor as a CACHED system-prompt block solves that\n * — the rules sit next to the identity layer and survive compactions.\n *\n * Block is tagged `ephemeral` so its content (journal tail, iteration\n * counter) changes each turn without invalidating the upstream prefix\n * cache.\n */\n\nimport type { TextBlock } from '../types/blocks.js';\nimport type { SystemPromptContributor } from '../types/system-prompt-contributor.js';\nimport { loadGoal } from '../storage/goal-store.js';\n\nexport interface AutonomyPromptContributorOptions {\n /** Absolute path to the project's `goal.json`. */\n goalPath: string;\n /**\n * Gating function. The contributor consults this on every build and\n * returns an empty array when `false` — without this, the block would\n * leak into interactive runs that happen to have a goal on disk and\n * teach the model loop-control markers it shouldn't emit.\n *\n * Typical wiring: `() => autonomyMode === 'eternal'`.\n */\n enabled: () => boolean;\n /** Number of journal entries to include in the recent-tail block. Default 5. */\n journalTailSize?: number;\n}\n\n/**\n * Build a contributor that renders the autonomy-state system block.\n * Returns `[]` when disabled, no goal exists, or the goal has been\n * completed/abandoned — all silent fast-paths.\n */\nexport function makeAutonomyPromptContributor(\n opts: AutonomyPromptContributorOptions,\n): SystemPromptContributor {\n return async (ctx): Promise<TextBlock[]> => {\n // Subagents run a single scoped task and don't drive the engine's\n // outer loop — they have no business emitting `[GOAL_COMPLETE]` or\n // marking todos. Skip the block entirely for subagent prompt builds,\n // mirroring how the active-plan layer is suppressed.\n if (ctx.subagent) return [];\n if (!opts.enabled()) return [];\n\n let goal: Awaited<ReturnType<typeof loadGoal>>;\n try {\n goal = await loadGoal(opts.goalPath);\n } catch {\n return [];\n }\n if (!goal) return [];\n\n // `active` is the default for legacy goal files without the field.\n const missionState = goal.goalState ?? 'active';\n if (missionState !== 'active') return [];\n\n const tailSize = opts.journalTailSize ?? 5;\n const journalTail = goal.journal\n .slice(-tailSize)\n .map((e) => {\n const note = e.note ? ` — ${e.note.slice(0, 80)}` : '';\n return ` #${e.iteration} [${e.status}] ${e.task}${note}`;\n });\n\n const text = [\n '## ETERNAL AUTONOMY — active mission',\n '',\n 'You are inside a long-running autonomous loop. The user is asleep',\n \"and is not available to confirm decisions. Each turn you receive a\",\n 'directive describing one concrete sub-task that advances the mission.',\n '',\n `Mission: ${goal.goal}`,\n `Iteration: #${goal.iterations}`,\n journalTail.length > 0\n ? `Recent journal (last ${journalTail.length}):\\n${journalTail.join('\\n')}`\n : 'Recent journal: (none — this is the first iteration)',\n '',\n '### Loop control markers',\n 'Emit these on their own line in your final text — case-insensitive,',\n 'whitespace-tolerant, but they must occupy the entire line:',\n '- `[continue]` — chain to the next internal step without returning.',\n '- `[done]` — the current sub-task is finished; return to the engine.',\n '- `[GOAL_COMPLETE]` — emit ONLY when the OVERALL mission is',\n ' verifiably done. Must be followed by a one-paragraph verification',\n ' recipe (artifact path, test command, or 10-second reproduction).',\n ' The engine halts on this marker — false positives waste real',\n ' human time. If unsure, emit `[done]` and let the next iteration',\n ' decide.',\n '',\n '### Operating principles',\n '- YOLO is active. Do NOT ask for confirmation, do NOT propose',\n ' options. Pick the best path and execute it.',\n '- Use tools freely; multiple calls per turn are normal and expected.',\n '- When working on a todo, mark it `in_progress` via the todos tool',\n ' before tool work and `completed` (or `cancelled` with a reason)',\n ' when done. The loop reads todo state between iterations.',\n \"- If an approach fails twice in a row, pivot. Don't grind on the\",\n ' same wall — try a different angle, file a cancel on the todo, or',\n ' surface the obstacle via `[done]` and let the next iteration',\n ' re-plan.',\n ].join('\\n');\n\n return [\n {\n type: 'text',\n text,\n cache_control: { type: 'ephemeral' },\n },\n ];\n };\n}\n","/**\n * `/goal <description>` preamble — the \"no force can stop this\" mode.\n *\n * Unlike STEERING (which redirects mid-flight), GOAL is a contract:\n * the user hands over a problem, the agent commits to verifiably\n * finishing it, and every iteration re-reads this preamble from the\n * conversation history. The hardening is entirely prompt-level —\n * the system has already removed implicit budget caps, so this\n * preamble's job is to remove the MODEL's tendency to hedge, ask\n * permission, or declare premature success.\n *\n * The four sections are intentional:\n * 1. AUTHORITY — explicit grant of unbounded fan-out + model\n * switching. Without this the model self-throttles (\"I shouldn't\n * spawn too many…\") even when budgets are unlimited.\n * 2. DONE — concrete bar for completion. Forces a verifiable\n * artifact (test passing, file written, bug re-run clean).\n * Without this the model returns \"I believe it's fixed\" and\n * counts that as done.\n * 3. NOT DONE — explicit anti-patterns. Each item is something we\n * saw real agents do as a \"completion\" that wasn't.\n * 4. PERSISTENCE — three-angle rule for blockers. Stops the model\n * from giving up on the first tool failure.\n *\n * Located in @wrongstack/core (rather than @wrongstack/tui) so headless\n * callers and the WebUI can issue `/goal set` without dragging the TUI\n * package in. The tui re-exports this for backward compatibility.\n */\nexport function buildGoalPreamble(goal: string): string {\n return [\n '[GOAL — LOCKED IN. You will work on this until it is verifiably done.',\n 'The user granted you full autonomy. Read these constraints once, then act.',\n '',\n 'YOUR GOAL:',\n '---',\n goal,\n '---',\n '',\n 'AUTHORITY YOU HAVE:',\n '- Spawn as many subagents as the work needs (delegate / spawn_subagent).',\n ' Parallel + recursive fan-out are both fine. There is no spawn budget.',\n '- Use any provider/model per subagent — pick the right tool for each',\n ' piece of work. Heavy reasoning model for planning, fast model for',\n ' batch work, specialist model for domain code.',\n '- Run unlimited tool calls and iterations. There is NO hidden budget.',\n ' The Agent loop auto-extends every 100 iterations forever.',\n '- Retry failed tools with different inputs, alternative paths, fresh',\n ' subagents. Switch providers mid-run if one is rate-limited.',\n '- Re-plan freely when an approach hits a dead end. You are not obliged',\n ' to stick with the first plan you proposed.',\n '',\n 'WHAT \"DONE\" MEANS — non-negotiable:',\n '- You can name a concrete artifact (a passing test, a written file at',\n ' a specific path, a fixed bug verified by re-running the failing case,',\n ' a clean grep that previously had matches).',\n '- You can tell the user HOW to verify it themselves in 10 seconds.',\n '- You have NOT hedged. None of: \"looks like it should work\", \"I',\n ' believe this fixes it\", \"the changes appear correct\".',\n '',\n 'WHAT IS NOT DONE — never report any of these as completion:',\n \"- An error message you didn't recover from.\",\n '- An empty result, a 0-line file, a \"no matches found\" you accepted',\n ' without questioning the search.',\n '- \"Should I continue?\" / \"Want me to also...?\" / \"Let me know if you',\n ' want X.\" Those are hedges. The user already told you to finish the',\n ' goal — just do it.',\n '- Partial progress dressed up as success. Fixed 3 of 5 bugs = 60%',\n ' done, not done.',\n \"- A subagent's failed/timeout/stopped TaskResult that you didn't\",\n ' respond to with a fresh attempt (different role, different model,',\n ' tighter prompt).',\n '',\n 'PERSISTENCE PROTOCOL:',\n '- If blocked, try at least 3 different angles before reporting the',\n ' problem to the user. Different tool inputs, different subagent',\n ' roles, different providers, different decomposition of the task.',\n '- If a tool fails, read its error, alter the input, try again. Do',\n ' not just report the failure back.',\n '- If a subagent returns useless output, respawn with a tighter prompt',\n ' or a different role. Do not accept \"I could not determine…\" as the',\n ' final answer.',\n \"- Use `ask_subagent` for one-shot questions when you don't need a\",\n ' full delegated task.',\n '',\n 'REPORTING:',\n '- Stream short progress notes between major actions so the user can',\n ' monitor. Do not go silent for 50 tool calls then dump a wall of',\n ' text — but also do not narrate every tool call.',\n '- Use the shared scratchpad (if available) to leave breadcrumbs',\n ' subagents can read.',\n '- Final response must include: (a) what was accomplished, (b) how',\n ' to verify, (c) any caveats (residual TODOs, things the user',\n ' should know about).',\n '',\n 'BEGIN.]',\n ].join('\\n');\n}\n","/**\n * Shared regex patterns used across execution and security-scanner.\n * Centralized here to avoid duplication and keep patterns in sync.\n */\n\n/** Matches Node.js ECONN* errors and fetch failure messages. */\nexport const NETWORK_ERR_RE = /ECONN|ETIMEDOUT|ETIME|ENOTFOUND|EAI_AGAIN|fetch failed/i;","import { ProviderError } from '../types/provider.js';\nimport { NETWORK_ERR_RE } from './regex-patterns.js';\nimport type { RetryPolicy } from '../types/retry-policy.js';\n\nexport class DefaultRetryPolicy implements RetryPolicy {\n shouldRetry(err: Error | ProviderError, attempt: number): boolean {\n if (err instanceof ProviderError) {\n if (!err.retryable) return false;\n return attempt < this.maxAttempts(err);\n }\n const msg = err.message ?? '';\n const isNetwork = NETWORK_ERR_RE.test(msg);\n if (isNetwork) return attempt < 2;\n return false;\n }\n\n maxAttempts(err: Error | ProviderError): number {\n if (err instanceof ProviderError) {\n if (err.status === 429) return 5;\n if (err.status === 529) return 3;\n if (err.status >= 500) return 3;\n return 0;\n }\n return 2;\n }\n\n delayMs(attempt: number): number {\n const base = 1000;\n const exp = base * 2 ** attempt;\n const jitter = Math.random() * base;\n return Math.min(30_000, exp + jitter);\n }\n}\n","import type { Context } from '../core/context.js';\nimport type { ErrorHandler, RecoveryDecision } from '../types/error-handler.js';\nimport { ProviderError } from '../types/provider.js';\nimport { NETWORK_ERR_RE } from './regex-patterns.js';\nimport type { Compactor } from '../types/compactor.js';\nimport type { ModelsRegistry } from '../types/models-registry.js';\n\n/**\n * Tiered error recovery strategies.\n * Each strategy is attempted in order until one returns a decision.\n */\nexport interface RecoveryStrategy {\n /** Human-readable label for logs. */\n label: string;\n /** Optional compactor for context_overflow recovery. */\n compactor?: Compactor;\n /** Returns an explicit recovery decision, or null to fall through. */\n attempt: (err: unknown, ctx: Context) => Promise<RecoveryDecision | null>;\n}\n\n// Package-level compiled regex for hot paths — avoids repeated compilation.\nconst CONTEXT_OVERFLOW_RE = /context|too long|tokens/i;\n\n/**\n * Builds the ordered list of recovery strategies used by DefaultErrorHandler.\n * Exported so callers can customise or extend the strategy chain.\n */\nexport function buildRecoveryStrategies(opts?: {\n compactor?: Compactor;\n modelsRegistry?: ModelsRegistry;\n}): RecoveryStrategy[] {\n return [\n {\n label: 'context_overflow_reduce',\n compactor: opts?.compactor,\n async attempt(err, ctx) {\n if (!(err instanceof ProviderError)) return null;\n if (err.status !== 413 && !CONTEXT_OVERFLOW_RE.test(err.message)) return null;\n\n if (this.compactor) {\n try {\n const report = await this.compactor.compact(ctx, { aggressive: true });\n if (report.after < report.before) {\n return { action: 'retry', reason: 'context_compacted' };\n }\n } catch {\n // compact failed; fall through\n }\n }\n return null;\n },\n },\n {\n label: 'rate_limit_backoff',\n async attempt(err) {\n if (!(err instanceof ProviderError) || err.status !== 429) return null;\n\n // Prefer the parsed Retry-After hint the provider extracted into\n // body.retryAfterMs; fall back to 5s when absent.\n const delayMs = err.body?.retryAfterMs ?? 5_000;\n // Clamp between 1s and 60s.\n const delay = Math.min(60_000, Math.max(1_000, delayMs));\n await new Promise((r) => setTimeout(r, delay));\n return { action: 'retry', reason: 'rate_limit_backoff' };\n },\n },\n {\n label: 'downgrade_model',\n async attempt(err, ctx) {\n if (!(err instanceof ProviderError)) return null;\n if (err.status !== 429 && err.status !== 529 && err.status < 500) return null;\n\n const registry = opts?.modelsRegistry;\n if (!registry) return null;\n\n try {\n const providerId = ctx.provider?.id;\n if (!providerId) return null;\n const provider = await registry.getProvider(providerId);\n if (!provider) return null;\n\n const currentModel = await registry.getModel(providerId, ctx.model);\n if (!currentModel) return null;\n\n // Find a cheaper fallback model with the same capabilities.\n // Prefer models with lower input cost, preferring the same family.\n const candidates = provider.models.filter((m) => {\n const modelCost = m.cost?.input ?? Number.POSITIVE_INFINITY;\n const currentCost = currentModel.cost?.input ?? Number.POSITIVE_INFINITY;\n if (modelCost >= currentCost) return false;\n if (currentModel.capabilities.tools && !m.tool_call) return false;\n if (currentModel.capabilities.vision && !m.modalities?.input?.includes('image'))\n return false;\n return true;\n });\n\n if (candidates.length === 0) return null;\n\n const fallback = candidates.reduce((prev, curr) =>\n (curr.cost?.input ?? 0) < (prev.cost?.input ?? 0) ? curr : prev,\n );\n\n return {\n action: 'retry',\n reason: 'model_downgrade',\n model: fallback.id,\n };\n } catch {\n return null;\n }\n },\n },\n ];\n}\n\nexport const DEFAULT_RECOVERY_STRATEGIES = buildRecoveryStrategies();\n\nexport class DefaultErrorHandler implements ErrorHandler {\n private readonly strategies: RecoveryStrategy[];\n\n constructor(strategies: RecoveryStrategy[] = DEFAULT_RECOVERY_STRATEGIES) {\n this.strategies = strategies;\n }\n\n classify(err: unknown): {\n kind:\n | 'rate_limit'\n | 'overloaded'\n | 'server'\n | 'client'\n | 'network'\n | 'abort'\n | 'context_overflow'\n | 'unknown';\n retryable: boolean;\n } {\n // AbortError can be thrown in both browser (DOMException) and Node (Error).\n // Guard with typeof check so Node builds don't reference the browser-only DOMException.\n if (\n typeof DOMException !== 'undefined' &&\n err instanceof DOMException &&\n err.name === 'AbortError'\n ) {\n return { kind: 'abort', retryable: false };\n }\n if (err instanceof Error && err.name === 'AbortError') {\n return { kind: 'abort', retryable: false };\n }\n if (err instanceof ProviderError) {\n if (err.status === 429) return { kind: 'rate_limit', retryable: true };\n if (err.status === 529) return { kind: 'overloaded', retryable: true };\n if (err.status >= 500) return { kind: 'server', retryable: true };\n if (err.status === 413 || CONTEXT_OVERFLOW_RE.test(err.message)) {\n return { kind: 'context_overflow', retryable: false };\n }\n if (err.status >= 400) return { kind: 'client', retryable: false };\n }\n if (err instanceof Error && NETWORK_ERR_RE.test(err.message)) {\n return { kind: 'network', retryable: true };\n }\n return { kind: 'unknown', retryable: false };\n }\n\n async recover(err: unknown, ctx: Context): Promise<RecoveryDecision | null> {\n for (const strategy of this.strategies) {\n const result = await strategy.attempt(err, ctx);\n if (result !== null) return result;\n }\n return null;\n }\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport type { SkillEntry, SkillLoader, SkillManifest } from '../types/skill.js';\nimport type { WstackPaths } from '../utils/wstack-paths.js';\n\nexport interface SkillLoaderOptions {\n paths: WstackPaths;\n bundledDir?: string;\n}\n\n/**\n * Discovery order (later layers shadow earlier ones at boot, but we walk\n * highest priority first and skip names already seen):\n * 1. Project-committed: <project>/.wrongstack/skills/\n * 2. User-global: ~/.wrongstack/skills/\n * 3. Bundled with build: packages/core/skills/\n */\nexport class DefaultSkillLoader implements SkillLoader {\n private readonly dirs: { dir: string; source: SkillManifest['source'] }[];\n private cache?: SkillManifest[];\n\n constructor(opts: SkillLoaderOptions) {\n this.dirs = [\n { dir: opts.paths.inProjectSkills, source: 'project' },\n { dir: opts.paths.globalSkills, source: 'user' },\n ];\n if (opts.bundledDir) {\n this.dirs.push({ dir: opts.bundledDir, source: 'bundled' });\n }\n }\n\n async list(): Promise<SkillManifest[]> {\n if (this.cache) return this.cache;\n const found: SkillManifest[] = [];\n const seen = new Set<string>();\n for (const { dir, source } of this.dirs) {\n try {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n for (const e of entries) {\n if (!e.isDirectory()) continue;\n const skillFile = path.join(dir, e.name, 'SKILL.md');\n try {\n const raw = await fs.readFile(skillFile, 'utf8');\n const meta = parseFrontmatter(raw);\n if (!meta.name || !meta.description) continue;\n if (seen.has(meta.name)) continue;\n seen.add(meta.name);\n found.push({\n name: meta.name,\n description: meta.description,\n version: meta.version,\n path: skillFile,\n source,\n });\n } catch {\n // skip malformed skill\n }\n }\n } catch {\n // directory may not exist\n }\n }\n this.cache = found;\n return found;\n }\n\n async find(name: string): Promise<SkillManifest | undefined> {\n const all = await this.list();\n return all.find((s) => s.name === name);\n }\n\n async manifestText(): Promise<string> {\n const skills = await this.list();\n if (skills.length === 0) return '';\n const entries = await this.listEntries();\n const lines = ['## Available skills'];\n for (const e of entries) {\n const scopeTag = e.scope.length > 0 ? ` — ${e.scope.slice(0, 3).join(', ')}` : '';\n lines.push(`- **${e.name}**${scopeTag}`);\n lines.push(` Use when: ${e.trigger}`);\n }\n return lines.join('\\n');\n }\n\n async listEntries(): Promise<SkillEntry[]> {\n const skills = await this.list();\n const entries: SkillEntry[] = [];\n for (const s of skills) {\n try {\n const raw = await fs.readFile(s.path, 'utf8');\n const { trigger, scope } = parseDescription(raw);\n entries.push({ name: s.name, trigger, scope, source: s.source, path: s.path });\n } catch {\n // skip\n }\n }\n return entries;\n }\n\n invalidateCache(): void {\n this.cache = undefined;\n }\n\n async readBody(name: string): Promise<string> {\n const m = await this.find(name);\n if (!m) throw new Error(`Skill \"${name}\" not found`);\n return fs.readFile(m.path, 'utf8');\n }\n}\n\ninterface Frontmatter {\n name?: string;\n description?: string;\n version?: string;\n}\n\nfunction parseFrontmatter(raw: string): Frontmatter {\n if (!raw.startsWith('---')) return {};\n const end = raw.indexOf('\\n---', 4);\n if (end === -1) return {};\n const block = raw.slice(4, end);\n const out: Frontmatter = {};\n let key: keyof Frontmatter | null = null;\n let value: string[] = [];\n const flush = () => {\n if (key) {\n out[key] = value.join('\\n').trim();\n }\n key = null;\n value = [];\n };\n for (const line of block.split('\\n')) {\n const m = /^([a-zA-Z_]+):\\s*(\\|?)\\s*(.*)$/.exec(line);\n if (m) {\n flush();\n key = (m[1] ?? '') as keyof Frontmatter;\n const pipe = m[2];\n const rest = m[3] ?? '';\n if (pipe === '|') {\n value = [];\n } else if (rest) {\n value = [rest];\n } else {\n value = [];\n }\n } else if (key) {\n value.push(line.replace(/^\\s+/, ''));\n }\n }\n flush();\n return out;\n}\n\n/**\n * Parse skill description into:\n * - trigger: extracted \"Use when...\" sentence (first sentence of description)\n * - scope: comma-separated items from first line's parenthetical or file-ext list\n */\nfunction parseDescription(raw: string): { trigger: string; scope: string[] } {\n const fm = parseFrontmatter(raw);\n const desc = fm.description ?? '';\n\n // Extract first sentence as trigger\n const firstSentenceEnd = desc.indexOf('. ');\n const trigger =\n firstSentenceEnd !== -1\n ? desc.slice(0, firstSentenceEnd + 1).trim()\n : (desc.trim().split('\\n')[0] ?? '');\n\n // Extract scope from parenthetical: \"Covers X, Y, and Z\" or \"for A, B, C\"\n const scope: string[] = [];\n const coversMatch = /(?:covers|for|including)\\s+([^.]+)/i.exec(desc);\n if (coversMatch) {\n const items = coversMatch[1]!\n .replace(/[·•]/g, ',')\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n scope.push(...items);\n }\n\n return { trigger, scope };\n}\n"]}