@avasis-ai/synthcode 1.0.7 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-F34HO4RA.js → chunk-KPJDLUMB.js} +338 -1
- package/dist/chunk-KPJDLUMB.js.map +1 -0
- package/dist/index.cjs +339 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/llm/index.cjs +339 -0
- package/dist/llm/index.cjs.map +1 -1
- package/dist/llm/index.d.cts +36 -1
- package/dist/llm/index.d.ts +36 -1
- package/dist/llm/index.js +5 -1
- package/package.json +1 -1
- package/dist/chunk-F34HO4RA.js.map +0 -1
package/dist/index.d.cts
CHANGED
|
@@ -4,7 +4,7 @@ import { MemoryStore } from './memory/index.cjs';
|
|
|
4
4
|
export { InMemoryStore, SQLiteStore } from './memory/index.cjs';
|
|
5
5
|
import { d as ToolRegistry } from './web-fetch-B42QzYD2.cjs';
|
|
6
6
|
export { B as BashTool, F as FileEditTool, a as FileReadTool, b as FileWriteTool, G as GlobTool, c as GrepTool, T as ToolExecutionResult, W as WebFetchTool, o as orchestrateTools } from './web-fetch-B42QzYD2.cjs';
|
|
7
|
-
export { AnthropicProvider, OllamaProvider, OpenAIProvider, anthropic, createProvider, ollama, openai } from './llm/index.cjs';
|
|
7
|
+
export { AnthropicProvider, ClusterConfig, ClusterProvider, ClusterSlot, OllamaProvider, OpenAIProvider, anthropic, cluster, createProvider, ollama, openai } from './llm/index.cjs';
|
|
8
8
|
export { MCPClient, MCPServerConfig, MCPToolDefinition, loadMCPTools } from './mcp/index.cjs';
|
|
9
9
|
export { I as InitOptions, i as init } from './index-D-K6sx8s.cjs';
|
|
10
10
|
import 'zod';
|
package/dist/index.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { MemoryStore } from './memory/index.js';
|
|
|
4
4
|
export { InMemoryStore, SQLiteStore } from './memory/index.js';
|
|
5
5
|
import { d as ToolRegistry } from './web-fetch-EDdhxmEf.js';
|
|
6
6
|
export { B as BashTool, F as FileEditTool, a as FileReadTool, b as FileWriteTool, G as GlobTool, c as GrepTool, T as ToolExecutionResult, W as WebFetchTool, o as orchestrateTools } from './web-fetch-EDdhxmEf.js';
|
|
7
|
-
export { AnthropicProvider, OllamaProvider, OpenAIProvider, anthropic, createProvider, ollama, openai } from './llm/index.js';
|
|
7
|
+
export { AnthropicProvider, ClusterConfig, ClusterProvider, ClusterSlot, OllamaProvider, OpenAIProvider, anthropic, cluster, createProvider, ollama, openai } from './llm/index.js';
|
|
8
8
|
export { MCPClient, MCPServerConfig, MCPToolDefinition, loadMCPTools } from './mcp/index.js';
|
|
9
9
|
export { I as InitOptions, i as init } from './index-D-K6sx8s.js';
|
|
10
10
|
import 'zod';
|
package/dist/index.js
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
2
|
AnthropicProvider,
|
|
3
3
|
BaseProvider,
|
|
4
|
+
ClusterProvider,
|
|
4
5
|
OllamaProvider,
|
|
5
6
|
OpenAIProvider,
|
|
6
7
|
RetryableError,
|
|
7
8
|
anthropic,
|
|
9
|
+
cluster,
|
|
8
10
|
createProvider,
|
|
9
11
|
ollama,
|
|
10
12
|
openai
|
|
11
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-KPJDLUMB.js";
|
|
12
14
|
import {
|
|
13
15
|
BashTool,
|
|
14
16
|
FileEditTool,
|
|
@@ -1007,6 +1009,7 @@ export {
|
|
|
1007
1009
|
AnthropicProvider,
|
|
1008
1010
|
BaseProvider,
|
|
1009
1011
|
BashTool,
|
|
1012
|
+
ClusterProvider,
|
|
1010
1013
|
ContextManager,
|
|
1011
1014
|
CostTracker,
|
|
1012
1015
|
DEFAULT_COMPACT_THRESHOLD,
|
|
@@ -1032,6 +1035,7 @@ export {
|
|
|
1032
1035
|
WebFetchTool,
|
|
1033
1036
|
agentLoop,
|
|
1034
1037
|
anthropic,
|
|
1038
|
+
cluster,
|
|
1035
1039
|
createProvider,
|
|
1036
1040
|
createStreamAggregator,
|
|
1037
1041
|
defineTool,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/hooks.ts","../src/loop.ts","../src/context/tokenizer.ts","../src/context/manager.ts","../src/permissions/engine.ts","../src/cost/tracker.ts","../src/agent.ts","../src/stream.ts"],"sourcesContent":["export type Message = UserMessage | AssistantMessage | ToolResultMessage;\n\nexport interface UserMessage {\n role: \"user\";\n content: string;\n}\n\nexport interface AssistantMessage {\n role: \"assistant\";\n content: ContentBlock[];\n}\n\nexport interface ToolResultMessage {\n role: \"tool\";\n tool_use_id: string;\n content: string;\n is_error?: boolean;\n}\n\nexport type ContentBlock = TextBlock | ToolUseBlock | ThinkingBlock;\n\nexport interface TextBlock {\n type: \"text\";\n text: string;\n}\n\nexport interface ToolUseBlock {\n type: \"tool_use\";\n id: string;\n name: string;\n input: Record<string, unknown>;\n}\n\nexport interface ThinkingBlock {\n type: \"thinking\";\n thinking: string;\n}\n\nexport type LoopEvent =\n | { type: \"text\"; text: string }\n | { type: \"thinking\"; thinking: string }\n | { type: \"tool_use\"; id: string; name: string; input: Record<string, unknown> }\n | { type: \"tool_result\"; id: string; name: string; output: string; isError: boolean }\n | { type: \"error\"; error: Error }\n | { type: \"done\"; usage: TokenUsage; messages: Message[] };\n\nexport interface TokenUsage {\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n}\n\nexport interface ModelResponse {\n content: ContentBlock[];\n usage: TokenUsage;\n stopReason: \"end_turn\" | \"tool_use\" | \"max_tokens\" | \"stop_sequence\";\n}\n\nexport interface ToolContext {\n cwd: string;\n env: Record<string, string>;\n abortSignal?: AbortSignal;\n}\n\nexport interface ProviderConfig {\n model: string;\n maxOutputTokens?: number;\n temperature?: number;\n}\n\nexport interface AgentConfig {\n model: import(\"./llm/provider.js\").Provider;\n tools?: import(\"./tools/tool.js\").Tool[];\n systemPrompt?: string;\n maxTurns?: number;\n context?: ContextConfig;\n permissions?: PermissionConfig;\n cwd?: string;\n maxRetries?: number;\n}\n\nexport interface ContextConfig {\n maxTokens?: number;\n compactThreshold?: number;\n maxOutputTokens?: number;\n}\n\nexport interface PermissionConfig {\n allowedTools?: string[];\n deniedTools?: string[];\n askTools?: string[];\n defaultAction?: \"allow\" | \"deny\" | \"ask\";\n}\n\nexport interface CompactionResult {\n messages: Message[];\n tokensSaved: number;\n method: \"snip\" | \"compact\" | \"none\";\n}\n\nexport const DEFAULT_CONTEXT_WINDOW = 200_000;\nexport const DEFAULT_MAX_OUTPUT_TOKENS = 16_384;\nexport const DEFAULT_COMPACT_THRESHOLD = 0.85;\nexport const DEFAULT_MAX_TURNS = 100;\nexport const MAX_CONCURRENT_TOOLS = 10;\n","import type { Message, CompactionResult } from \"./types.js\";\n\nexport interface AgentHooks {\n onTurnStart?: (turn: number, messages: Message[]) => Promise<Message[] | void>;\n onTurnEnd?: (turn: number, messages: Message[]) => Promise<void>;\n onToolUse?: (\n name: string,\n input: Record<string, unknown>,\n ) => Promise<{ allow?: boolean; input?: Record<string, unknown> } | void>;\n onToolResult?: (result: {\n id: string;\n name: string;\n output: string;\n isError: boolean;\n durationMs: number;\n }) => Promise<string | void>;\n onError?: (error: Error, turn: number) => Promise<{ retry?: boolean; message?: string } | void>;\n onCompact?: (result: CompactionResult) => Promise<void>;\n}\n\nexport class HookRunner {\n private hooks: AgentHooks;\n\n constructor(hooks?: AgentHooks) {\n this.hooks = hooks ?? {};\n }\n\n async runOnTurnStart(turn: number, messages: Message[]): Promise<Message[]> {\n if (!this.hooks.onTurnStart) return messages;\n const result = await this.hooks.onTurnStart(turn, messages);\n return Array.isArray(result) ? result : messages;\n }\n\n async runOnTurnEnd(turn: number, messages: Message[]): Promise<void> {\n await this.hooks.onTurnEnd?.(turn, messages);\n }\n\n async runOnToolUse(\n name: string,\n input: Record<string, unknown>,\n ): Promise<{ allow: boolean; input: Record<string, unknown> }> {\n if (!this.hooks.onToolUse) return { allow: true, input };\n const result = await this.hooks.onToolUse(name, input);\n return {\n allow: result?.allow ?? true,\n input: result?.input ?? input,\n };\n }\n\n async runOnToolResult(result: {\n id: string;\n name: string;\n output: string;\n isError: boolean;\n durationMs: number;\n }): Promise<string> {\n if (!this.hooks.onToolResult) return result.output;\n const modified = await this.hooks.onToolResult(result);\n return modified ?? result.output;\n }\n\n async runOnError(error: Error, turn: number): Promise<{ retry: boolean; message?: string }> {\n if (!this.hooks.onError) return { retry: false };\n const result = await this.hooks.onError(error, turn);\n return { retry: result?.retry ?? false, message: result?.message };\n }\n\n async runOnCompact(result: CompactionResult): Promise<void> {\n await this.hooks.onCompact?.(result);\n }\n}\n","import type { Message, ContentBlock, ToolUseBlock, LoopEvent, ToolContext, TokenUsage } from \"./types.js\";\nimport { DEFAULT_MAX_TURNS } from \"./types.js\";\nimport { ToolRegistry } from \"./tools/registry.js\";\nimport { orchestrateTools } from \"./tools/orchestrator.js\";\nimport { ContextManager } from \"./context/manager.js\";\nimport { PermissionEngine } from \"./permissions/engine.js\";\nimport type { Provider } from \"./llm/provider.js\";\nimport type { AgentHooks } from \"./hooks.js\";\nimport { HookRunner } from \"./hooks.js\";\nimport type { CostTracker } from \"./cost/tracker.js\";\n\nconst DEFAULT_MAX_RETRIES = 5;\nconst INITIAL_RETRY_DELAY_MS = 1000;\nconst MAX_RETRY_DELAY_MS = 30000;\nconst DOOM_LOOP_THRESHOLD = 3;\nconst PRE_OVERFLOW_BUFFER = 20_000;\nconst OUTPUT_MAX_LINES = 2000;\nconst OUTPUT_MAX_BYTES = 50_000;\n\nexport interface AgentLoopConfig {\n model: Provider;\n tools: ToolRegistry;\n messages: Message[];\n systemPrompt?: string;\n maxTurns?: number;\n contextManager: ContextManager;\n permissionEngine: PermissionEngine;\n cwd?: string;\n abortSignal?: AbortSignal;\n maxRetries?: number;\n hooks?: AgentHooks;\n costTracker?: CostTracker;\n}\n\nfunction parseRetryAfterMs(error: Error): number | null {\n const msg = error.message ?? \"\";\n const retryAfterMsMatch = msg.match(/retry-after-ms:\\s*(\\d+)/i);\n if (retryAfterMsMatch) return parseInt(retryAfterMsMatch[1], 10);\n const retryAfterMatch = msg.match(/retry-after:\\s*(\\d+)/i);\n if (retryAfterMatch) return parseInt(retryAfterMatch[1], 10) * 1000;\n return null;\n}\n\nfunction truncateOutput(output: string, toolName: string, hasSubAgent: boolean): string {\n const lines = output.split(\"\\n\");\n if (lines.length <= OUTPUT_MAX_LINES && output.length <= OUTPUT_MAX_BYTES) return output;\n\n let truncated = \"\";\n let byteCount = 0;\n for (const line of lines) {\n if (byteCount + line.length > OUTPUT_MAX_BYTES) break;\n truncated += line + \"\\n\";\n byteCount += line.length;\n if (byteCount > OUTPUT_MAX_BYTES) break;\n }\n\n const lineCount = truncated.split(\"\\n\").filter(l => l.length > 0).length;\n const suffix = hasSubAgent\n ? `\\n\\n[Output truncated: ${lineCount}/${lines.length} lines shown. Use the Task tool to have a sub-agent process the full output.]`\n : `\\n\\n[Output truncated: ${lineCount}/${lines.length} lines shown. Use Grep to search or Read with offset/limit for the full content.]`;\n\n return truncated.trimEnd() + suffix;\n}\n\nfunction detectDoomLoop(messages: Message[]): ToolUseBlock | null {\n const recentToolCalls: ToolUseBlock[] = [];\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i];\n if (msg.role !== \"assistant\") continue;\n if (typeof msg.content === \"string\") continue;\n for (const block of msg.content) {\n if (block.type === \"tool_use\") recentToolCalls.push(block);\n }\n if (recentToolCalls.length >= DOOM_LOOP_THRESHOLD) break;\n }\n\n if (recentToolCalls.length < DOOM_LOOP_THRESHOLD) return null;\n\n const last = recentToolCalls[0];\n return recentToolCalls.every(\n tc => tc.name === last.name && JSON.stringify(tc.input) === JSON.stringify(last.input),\n )\n ? last\n : null;\n}\n\nexport async function* agentLoop(config: AgentLoopConfig): AsyncGenerator<LoopEvent> {\n const {\n model,\n tools,\n messages,\n systemPrompt,\n maxTurns = DEFAULT_MAX_TURNS,\n contextManager,\n permissionEngine,\n cwd = process.cwd(),\n abortSignal,\n hooks,\n costTracker,\n } = config;\n\n const hookRunner = new HookRunner(hooks);\n const context: ToolContext = { cwd, env: { ...process.env } as Record<string, string> };\n let turns = 0;\n let consecutiveRetries = 0;\n const maxRetries = config.maxRetries ?? DEFAULT_MAX_RETRIES;\n let totalUsage = { inputTokens: 0, outputTokens: 0, cacheReadTokens: 0, cacheWriteTokens: 0 };\n let inFlightText = \"\";\n let inFlightReasoning = \"\";\n let inFlightToolCalls: ToolUseBlock[] = [];\n\n while (turns < maxTurns) {\n if (abortSignal?.aborted) {\n yield finalizeLoop(\"Aborted\");\n return;\n }\n\n const messagesAfterHook = await hookRunner.runOnTurnStart(turns + 1, messages);\n if (messagesAfterHook !== messages) {\n messages.length = 0;\n messages.push(...messagesAfterHook);\n }\n\n const contextCheck = contextManager.check(messages);\n if (contextCheck.needsCompact) {\n const result = await contextManager.compact(messages);\n messages.length = 0;\n messages.push(...result.messages);\n if (result.tokensSaved > 0) {\n const thinking = `Context ${result.method}: saved ~${result.tokensSaved} tokens (${contextCheck.totalTokens} → ${contextCheck.totalTokens - result.tokensSaved})`;\n yield { type: \"thinking\", thinking };\n await hookRunner.runOnCompact(result);\n }\n const pruned = contextManager.pruneToolOutputs(messages);\n if (pruned.length !== messages.length) {\n messages.length = 0;\n messages.push(...pruned);\n yield { type: \"thinking\", thinking: \"Pruned large tool outputs to free additional context\" };\n }\n }\n\n const estimatedTotal = totalUsage.inputTokens + totalUsage.outputTokens\n + (totalUsage.cacheReadTokens ?? 0) + (totalUsage.cacheWriteTokens ?? 0);\n const maxContext = contextManager.maxTokens;\n const maxOutput = contextManager.maxOutputTokens;\n if (maxContext > 0 && estimatedTotal + maxOutput + PRE_OVERFLOW_BUFFER >= maxContext) {\n yield { type: \"thinking\", thinking: \"Approaching context limit, compacting preemptively...\" };\n const result = await contextManager.compact(messages);\n messages.length = 0;\n messages.push(...result.messages);\n if (result.tokensSaved > 0) {\n yield { type: \"thinking\", thinking: `Pre-overflow compact: freed ~${result.tokensSaved} tokens` };\n }\n }\n\n const available = contextManager.getAvailableTokens(messages);\n const maxTokens = Math.min(available, contextManager.maxOutputTokens);\n if (maxTokens < 1024) {\n yield finalizeLoop(\"Insufficient context window for next turn\");\n return;\n }\n\n inFlightText = \"\";\n inFlightReasoning = \"\";\n inFlightToolCalls = [];\n\n let response;\n try {\n const mappedMessages = messages.map((m) => {\n if (m.role === \"tool\") {\n const toolCall = inFlightToolCalls.find(tc => tc.id === (m as { tool_use_id?: string }).tool_use_id);\n if (toolCall) {\n return {\n role: \"tool\" as const,\n tool_use_id: m.role === \"tool\" ? (m as { tool_use_id: string }).tool_use_id : undefined,\n is_error: m.role === \"tool\" ? (m as { is_error?: boolean }).is_error : undefined,\n content: truncateOutput(\n (m as { content: string }).content,\n toolCall.name,\n tools.has(\"delegate_agent\"),\n ),\n };\n }\n }\n return {\n role: m.role,\n content: m.role === \"tool\"\n ? (m as { content: string }).content\n : m.role === \"user\"\n ? (m as { content: string }).content\n : (m as { content: ContentBlock[] }).content,\n tool_use_id: m.role === \"tool\" ? (m as { tool_use_id: string }).tool_use_id : undefined,\n is_error: m.role === \"tool\" ? (m as { is_error?: boolean }).is_error : undefined,\n };\n });\n\n response = await model.chat({\n messages: mappedMessages,\n tools: tools.getAPI(),\n systemPrompt,\n maxOutputTokens: maxTokens,\n abortSignal,\n });\n } catch (err) {\n yield* flushInFlight();\n const error = err instanceof Error ? err : new Error(String(err));\n\n const hookResult = await hookRunner.runOnError(error, turns + 1);\n if (hookResult.retry && hookResult.message) {\n messages.push({ role: \"user\", content: hookResult.message });\n turns++;\n continue;\n }\n\n if (error.message.includes(\"429\") || error.message.includes(\"529\") || error.message.includes(\"overloaded\")) {\n consecutiveRetries++;\n if (consecutiveRetries > maxRetries) {\n yield { type: \"error\", error: new Error(`Max retries (${maxRetries}) exceeded`) };\n return;\n }\n const headerDelay = parseRetryAfterMs(error);\n const backoffDelay = headerDelay\n ?? Math.min(INITIAL_RETRY_DELAY_MS * 2 ** (consecutiveRetries - 1) + Math.random() * 500, MAX_RETRY_DELAY_MS);\n yield { type: \"thinking\", thinking: `Rate limited, retry ${consecutiveRetries}/${maxRetries} in ${Math.round(backoffDelay)}ms...` };\n await new Promise((r) => setTimeout(r, backoffDelay));\n continue;\n }\n\n yield { type: \"error\", error };\n return;\n }\n\n totalUsage.inputTokens += response.usage.inputTokens;\n totalUsage.outputTokens += response.usage.outputTokens;\n totalUsage.cacheReadTokens = (totalUsage.cacheReadTokens ?? 0) + (response.usage.cacheReadTokens ?? 0);\n totalUsage.cacheWriteTokens = (totalUsage.cacheWriteTokens ?? 0) + (response.usage.cacheWriteTokens ?? 0);\n\n if (costTracker) {\n costTracker.record(model.model, response.usage, turns + 1);\n }\n\n const toolCalls: ToolUseBlock[] = [];\n for (const block of response.content) {\n if (block.type === \"text\") {\n inFlightText += block.text;\n yield { type: \"text\", text: block.text };\n } else if (block.type === \"thinking\") {\n inFlightReasoning += block.thinking;\n yield { type: \"thinking\", thinking: block.thinking };\n } else if (block.type === \"tool_use\") {\n const resolvedName = tools.has(block.name) ? block.name : tools.findCaseInsensitive(block.name);\n if (!resolvedName) {\n yield { type: \"tool_result\", id: block.id, name: block.name, output: `Unknown tool: ${block.name}. Available: ${tools.listNames().join(\", \")}`, isError: true };\n messages.push({ role: \"assistant\", content: response.content });\n messages.push({ role: \"tool\", tool_use_id: block.id, content: `Unknown tool: ${block.name}`, is_error: true });\n continue;\n }\n const modifiedBlock: ToolUseBlock = resolvedName !== block.name ? { ...block, name: resolvedName } : block;\n\n const hookToolResult = await hookRunner.runOnToolUse(modifiedBlock.name, modifiedBlock.input);\n if (!hookToolResult.allow) {\n yield { type: \"tool_result\", id: modifiedBlock.id, name: modifiedBlock.name, output: \"Tool denied by hook\", isError: true };\n messages.push({ role: \"assistant\", content: response.content });\n messages.push({ role: \"tool\", tool_use_id: modifiedBlock.id, content: \"Tool denied by hook\", is_error: true });\n continue;\n }\n const finalBlock: ToolUseBlock = { ...modifiedBlock, input: hookToolResult.input };\n toolCalls.push(finalBlock);\n inFlightToolCalls.push(finalBlock);\n yield { type: \"tool_use\", id: finalBlock.id, name: finalBlock.name, input: finalBlock.input };\n }\n }\n\n const hasNonToolContent = inFlightText.length > 0 || inFlightReasoning.length > 0;\n if (!hasNonToolContent && toolCalls.length === 0) {\n yield finalizeLoop(\"Assistant produced no content\");\n return;\n }\n\n const assistantContent = response.content.filter(b => {\n if (b.type !== \"tool_use\") return true;\n return toolCalls.some(tc => tc.id === b.id);\n });\n\n messages.push({ role: \"assistant\", content: assistantContent });\n turns++;\n consecutiveRetries = 0;\n inFlightText = \"\";\n inFlightReasoning = \"\";\n inFlightToolCalls = [];\n\n await hookRunner.runOnTurnEnd(turns, messages);\n\n if (response.stopReason !== \"tool_use\" || toolCalls.length === 0) {\n yield {\n type: \"done\",\n usage: {\n inputTokens: totalUsage.inputTokens,\n outputTokens: totalUsage.outputTokens,\n cacheReadTokens: totalUsage.cacheReadTokens,\n cacheWriteTokens: totalUsage.cacheWriteTokens,\n },\n messages: [...messages],\n };\n return;\n }\n\n const doomLoopCall = detectDoomLoop(messages);\n if (doomLoopCall) {\n yield { type: \"thinking\", thinking: `Detected repetitive tool calls: ${doomLoopCall.name} called ${DOOM_LOOP_THRESHOLD} times with identical input. Breaking the loop.` };\n messages.push({ role: \"user\", content: `STOP. You have called ${doomLoopCall.name} ${DOOM_LOOP_THRESHOLD} times in a row with the same input. This indicates a loop. Try a different approach or tool.` });\n turns++;\n continue;\n }\n\n const results = await orchestrateTools(\n tools,\n toolCalls,\n context,\n async (name, _input) => {\n const perm = permissionEngine.check(name);\n return perm.allowed;\n },\n abortSignal,\n );\n\n for (const result of results) {\n let output = truncateOutput(result.output, result.name, tools.has(\"delegate_agent\"));\n const toolResult = await hookRunner.runOnToolResult({\n id: result.id,\n name: result.name,\n output: result.output,\n isError: result.isError,\n durationMs: result.durationMs,\n });\n output = toolResult;\n\n messages.push({\n role: \"tool\",\n tool_use_id: result.id,\n content: output,\n is_error: result.isError,\n });\n yield {\n type: \"tool_result\",\n id: result.id,\n name: result.name,\n output,\n isError: result.isError,\n };\n }\n }\n\n yield { type: \"error\", error: new Error(`Max turns (${maxTurns}) reached`) };\n\n function* flushInFlight(): Generator<LoopEvent, void, unknown> {\n if (inFlightText.length > 0) {\n yield { type: \"text\", text: inFlightText };\n }\n if (inFlightReasoning.length > 0) {\n yield { type: \"thinking\", thinking: inFlightReasoning };\n }\n for (const tc of inFlightToolCalls) {\n yield { type: \"tool_result\", id: tc.id, name: tc.name, output: \"[Tool execution was interrupted]\", isError: true };\n messages.push({ role: \"assistant\", content: [{ type: \"tool_use\" as const, id: tc.id, name: tc.name, input: tc.input }] });\n messages.push({ role: \"tool\", tool_use_id: tc.id, content: \"[Tool execution was interrupted]\", is_error: true });\n }\n }\n\n function finalizeLoop(reason: string): LoopEvent {\n if (totalUsage.inputTokens > 0 || totalUsage.outputTokens > 0) {\n return {\n type: \"done\",\n usage: {\n inputTokens: totalUsage.inputTokens,\n outputTokens: totalUsage.outputTokens,\n cacheReadTokens: totalUsage.cacheReadTokens,\n cacheWriteTokens: totalUsage.cacheWriteTokens,\n },\n messages: [...messages],\n };\n }\n return { type: \"error\", error: new Error(reason) };\n }\n}\n","import type { Message } from \"../types.js\";\n\nexport interface TokenCount {\n total: number;\n byRole: Record<string, number>;\n}\n\nexport function estimateTokens(text: string): number {\n const chars = text.length;\n const words = text.split(/\\s+/).filter(Boolean).length;\n return Math.max(Math.ceil(chars / 4), Math.ceil(words * 1.3));\n}\n\nexport function estimateMessageTokens(message: Message): number {\n if (message.role === \"user\") {\n return estimateTokens(message.content) + 4;\n }\n\n if (message.role === \"tool\") {\n return estimateTokens(message.content) + 4;\n }\n\n let tokens = 0;\n for (const block of message.content) {\n if (block.type === \"text\") {\n tokens += estimateTokens(block.text) + 4;\n } else if (block.type === \"tool_use\") {\n tokens += estimateTokens(block.name) + estimateTokens(JSON.stringify(block.input)) + 4;\n } else if (block.type === \"thinking\") {\n tokens += estimateTokens(block.thinking) + 4;\n }\n }\n return tokens;\n}\n\nexport function estimateConversationTokens(messages: Message[]): TokenCount {\n const byRole: Record<string, number> = {};\n\n let total = 0;\n for (const message of messages) {\n const msgTokens = estimateMessageTokens(message) + 10;\n total += msgTokens;\n byRole[message.role] = (byRole[message.role] ?? 0) + msgTokens;\n }\n\n return { total, byRole };\n}\n","import type { Message, ContentBlock, ContextConfig, CompactionResult } from \"../types.js\";\nimport { DEFAULT_CONTEXT_WINDOW, DEFAULT_MAX_OUTPUT_TOKENS, DEFAULT_COMPACT_THRESHOLD } from \"../types.js\";\nimport { estimateConversationTokens, estimateMessageTokens } from \"./tokenizer.js\";\n\nconst PRUNE_MINIMUM = 20_000;\nconst PRUNE_PROTECT_TOKENS = 40_000;\nconst PROTECTED_TOOL_TYPES = new Set([\"skill\", \"delegate_agent\"]);\nconst RECENT_TURNS_TO_PROTECT = 2;\n\nexport interface ContextCheck {\n totalTokens: number;\n availableTokens: number;\n usagePercent: number;\n needsCompact: boolean;\n recommendedMethod: \"snip\" | \"compact\";\n}\n\nexport class ContextManager {\n readonly maxTokens: number;\n readonly maxOutputTokens: number;\n readonly compactThreshold: number;\n\n constructor(config?: ContextConfig) {\n this.maxTokens = config?.maxTokens ?? DEFAULT_CONTEXT_WINDOW;\n this.maxOutputTokens = config?.maxOutputTokens ?? DEFAULT_MAX_OUTPUT_TOKENS;\n this.compactThreshold = config?.compactThreshold ?? DEFAULT_COMPACT_THRESHOLD;\n }\n\n check(messages: Message[]): ContextCheck {\n const { total: totalTokens } = estimateConversationTokens(messages);\n const availableTokens = this.maxTokens - totalTokens - this.maxOutputTokens;\n const usagePercent = totalTokens / this.maxTokens;\n const needsCompact = usagePercent >= this.compactThreshold;\n let recommendedMethod: \"snip\" | \"compact\";\n\n if (usagePercent > 0.95) {\n recommendedMethod = \"compact\";\n } else {\n recommendedMethod = \"snip\";\n }\n\n return { totalTokens, availableTokens, usagePercent, needsCompact, recommendedMethod };\n }\n\n async compact(messages: Message[], summaryFn?: (messages: Message[]) => Promise<string>): Promise<CompactionResult> {\n const contextCheck = this.check(messages);\n\n if (!contextCheck.needsCompact) {\n return { messages: [...messages], tokensSaved: 0, method: \"none\" };\n }\n\n const originalTokens = contextCheck.totalTokens;\n\n if (summaryFn && contextCheck.recommendedMethod === \"compact\") {\n const recentCount = Math.max(Math.ceil(messages.length * 0.2), 1);\n const cutoffIndex = messages.length - recentCount;\n const oldMessages = messages.slice(0, cutoffIndex);\n const recentMessages = messages.slice(cutoffIndex);\n\n const summary = await summaryFn(oldMessages);\n const summaryMessage: Message = {\n role: \"user\",\n content: `Here is a summary of our previous conversation:\\n${summary}`,\n };\n\n const compacted = [summaryMessage, ...recentMessages];\n const newTokens = estimateConversationTokens(compacted).total;\n\n return {\n messages: compacted,\n tokensSaved: originalTokens - newTokens,\n method: \"compact\",\n };\n }\n\n const keepFirst = 1;\n const keepLast = 20;\n const keepMin = keepFirst + keepLast;\n\n if (messages.length <= keepMin) {\n return { messages: [...messages], tokensSaved: 0, method: \"none\" };\n }\n\n let result = [...messages];\n const targetUsage = 0.6;\n\n while (result.length > keepMin) {\n const { total } = estimateConversationTokens(result);\n if (total / this.maxTokens < targetUsage) break;\n\n const removeCount = Math.max(1, Math.floor((result.length - keepMin) * 0.3));\n const removeEnd = Math.min(keepFirst + removeCount, result.length - keepLast);\n result = [result[0], ...result.slice(removeEnd)];\n }\n\n const newTokens = estimateConversationTokens(result).total;\n\n return {\n messages: result,\n tokensSaved: originalTokens - newTokens,\n method: \"snip\",\n };\n }\n\n pruneToolOutputs(messages: Message[]): Message[] {\n let totalPruned = 0;\n let turnCount = 0;\n const result = [...messages];\n\n for (let i = result.length - 1; i >= 0; i--) {\n const msg = result[i];\n if (msg.role === \"user\") {\n turnCount++;\n if (turnCount <= RECENT_TURNS_TO_PROTECT) continue;\n }\n if (msg.role !== \"assistant\" || !Array.isArray(msg.content)) continue;\n\n for (const block of msg.content) {\n if (block.type !== \"tool_use\") continue;\n if (PROTECTED_TOOL_TYPES.has(block.name)) continue;\n\n const toolResultIdx = result.findIndex(\n (m, j) => j > i && m.role === \"tool\" && (m as { tool_use_id?: string }).tool_use_id === block.id,\n );\n if (toolResultIdx === -1) continue;\n\n const toolResult = result[toolResultIdx];\n const output = (toolResult as { content: string }).content;\n const estTokens = Math.ceil(output.length / 4);\n\n if (totalPruned + estTokens >= PRUNE_MINIMUM && totalPruned >= PRUNE_PROTECT_TOKENS) {\n return result;\n }\n\n totalPruned += estTokens;\n result[toolResultIdx] = {\n ...(toolResult as unknown as Record<string, unknown>),\n content: `[Output pruned: ${estTokens} tokens saved]`,\n is_error: false,\n } as typeof toolResult;\n }\n }\n\n return result;\n }\n\n getAvailableTokens(messages: Message[]): number {\n return this.maxTokens - estimateConversationTokens(messages).total - this.maxOutputTokens;\n }\n\n getUsagePercent(messages: Message[]): number {\n return estimateConversationTokens(messages).total / this.maxTokens;\n }\n}\n","import type { PermissionConfig } from \"../types.js\";\n\nexport interface PermissionResult {\n allowed: boolean;\n reason?: string;\n}\n\nfunction matchPattern(pattern: string, toolName: string): boolean {\n if (!pattern.includes(\"*\")) {\n return pattern === toolName;\n }\n const escaped = pattern.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\*/g, \".*\");\n const regex = new RegExp(`^${escaped}$`);\n return regex.test(toolName);\n}\n\nexport class PermissionEngine {\n private allowedPatterns: string[];\n private deniedPatterns: string[];\n private askPatterns: string[];\n private defaultAction: \"allow\" | \"deny\" | \"ask\";\n\n constructor(config?: PermissionConfig) {\n this.allowedPatterns = config?.allowedTools ?? [];\n this.deniedPatterns = config?.deniedTools ?? [];\n this.askPatterns = config?.askTools ?? [];\n this.defaultAction = config?.defaultAction ?? \"allow\";\n }\n\n check(toolName: string, _input?: Record<string, unknown>): PermissionResult {\n for (const pattern of this.deniedPatterns) {\n if (matchPattern(pattern, toolName)) {\n return { allowed: false, reason: `Tool '${toolName}' matches denied pattern '${pattern}'` };\n }\n }\n\n for (const pattern of this.allowedPatterns) {\n if (matchPattern(pattern, toolName)) {\n return { allowed: true };\n }\n }\n\n for (const pattern of this.askPatterns) {\n if (matchPattern(pattern, toolName)) {\n return { allowed: false, reason: \"ask\" };\n }\n }\n\n if (this.defaultAction === \"deny\") {\n return { allowed: false, reason: `Tool '${toolName}' not explicitly allowed` };\n }\n\n if (this.defaultAction === \"ask\") {\n return { allowed: false, reason: \"ask\" };\n }\n\n return { allowed: true };\n }\n\n addAllowed(pattern: string): void {\n this.allowedPatterns.push(pattern);\n }\n\n addDenied(pattern: string): void {\n this.deniedPatterns.push(pattern);\n }\n\n addAsk(pattern: string): void {\n this.askPatterns.push(pattern);\n }\n}\n","export interface CostRecord {\n model: string;\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n cacheWriteTokens: number;\n inputCost: number;\n outputCost: number;\n timestamp: number;\n turn: number;\n toolName?: string;\n}\n\nexport interface ModelPricing {\n inputCostPer1k: number;\n outputCostPer1k: number;\n}\n\nexport const DEFAULT_PRICING: Record<string, ModelPricing> = {\n \"claude-sonnet-4-20250514\": { inputCostPer1k: 0.003, outputCostPer1k: 0.015 },\n \"claude-3-5-sonnet-20241022\": { inputCostPer1k: 0.003, outputCostPer1k: 0.015 },\n \"claude-3-5-haiku-20241022\": { inputCostPer1k: 0.0008, outputCostPer1k: 0.004 },\n \"claude-opus-4-20250514\": { inputCostPer1k: 0.015, outputCostPer1k: 0.075 },\n \"gpt-4o\": { inputCostPer1k: 0.0025, outputCostPer1k: 0.01 },\n \"gpt-4o-mini\": { inputCostPer1k: 0.00015, outputCostPer1k: 0.0006 },\n \"gpt-4-turbo\": { inputCostPer1k: 0.01, outputCostPer1k: 0.03 },\n};\n\nexport class CostTracker {\n private records: CostRecord[] = [];\n private pricing: Record<string, ModelPricing>;\n\n constructor(customPricing?: Record<string, ModelPricing>) {\n this.pricing = { ...DEFAULT_PRICING, ...customPricing };\n }\n\n record(\n model: string,\n usage: { inputTokens: number; outputTokens: number; cacheReadTokens?: number; cacheWriteTokens?: number },\n turn: number,\n toolName?: string,\n ): void {\n const pricing = this.pricing[model] ?? { inputCostPer1k: 0.001, outputCostPer1k: 0.003 };\n this.records.push({\n model,\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n cacheReadTokens: usage.cacheReadTokens ?? 0,\n cacheWriteTokens: usage.cacheWriteTokens ?? 0,\n inputCost: (usage.inputTokens / 1000) * pricing.inputCostPer1k,\n outputCost: (usage.outputTokens / 1000) * pricing.outputCostPer1k,\n timestamp: Date.now(),\n turn,\n toolName,\n });\n }\n\n getTotal(): {\n cost: number;\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n cacheWriteTokens: number;\n } {\n let cost = 0;\n let input = 0;\n let output = 0;\n let cacheRead = 0;\n let cacheWrite = 0;\n for (const r of this.records) {\n cost += r.inputCost + r.outputCost;\n input += r.inputTokens;\n output += r.outputTokens;\n cacheRead += r.cacheReadTokens;\n cacheWrite += r.cacheWriteTokens;\n }\n return { cost, inputTokens: input, outputTokens: output, cacheReadTokens: cacheRead, cacheWriteTokens: cacheWrite };\n }\n\n getByModel(): Record<string, { cost: number; calls: number }> {\n const byModel: Record<string, { cost: number; calls: number }> = {};\n for (const r of this.records) {\n if (!byModel[r.model]) byModel[r.model] = { cost: 0, calls: 0 };\n byModel[r.model].cost += r.inputCost + r.outputCost;\n byModel[r.model].calls++;\n }\n return byModel;\n }\n\n getByTool(): Record<string, { cost: number; calls: number }> {\n const byTool: Record<string, { cost: number; calls: number }> = {};\n for (const r of this.records) {\n const key = r.toolName ?? \"llm\";\n if (!byTool[key]) byTool[key] = { cost: 0, calls: 0 };\n byTool[key].cost += r.inputCost + r.outputCost;\n byTool[key].calls++;\n }\n return byTool;\n }\n\n getRecords(): CostRecord[] {\n return [...this.records];\n }\n\n reset(): void {\n this.records = [];\n }\n\n setPricing(model: string, pricing: ModelPricing): void {\n this.pricing[model] = pricing;\n }\n}\n","import type { Message, LoopEvent, AgentConfig, PermissionConfig } from \"./types.js\";\nimport { DEFAULT_MAX_TURNS, DEFAULT_CONTEXT_WINDOW, DEFAULT_MAX_OUTPUT_TOKENS, DEFAULT_COMPACT_THRESHOLD } from \"./types.js\";\nimport { agentLoop } from \"./loop.js\";\nimport { ToolRegistry } from \"./tools/registry.js\";\nimport { defineTool } from \"./tools/tool.js\";\nimport type { Tool } from \"./tools/tool.js\";\nimport { ContextManager } from \"./context/manager.js\";\nimport { PermissionEngine } from \"./permissions/engine.js\";\nimport type { Provider } from \"./llm/provider.js\";\nimport type { AgentHooks } from \"./hooks.js\";\nimport { HookRunner } from \"./hooks.js\";\nimport type { MemoryStore } from \"./memory/store.js\";\nimport type { CostTracker } from \"./cost/tracker.js\";\nimport { CostTracker as CostTrackerImpl } from \"./cost/tracker.js\";\n\nexport interface AgentConfigV2 extends AgentConfig {\n hooks?: AgentHooks;\n memory?: MemoryStore;\n threadId?: string;\n costTracker?: CostTracker;\n title?: string;\n disableTitle?: boolean;\n}\n\nexport class Agent {\n private model: Provider;\n private tools: ToolRegistry;\n private systemPrompt: string;\n private maxTurns: number;\n private contextManager: ContextManager;\n private permissionEngine: PermissionEngine;\n private permissionConfig?: PermissionConfig;\n private cwd: string;\n private maxRetries: number;\n private messages: Message[] = [];\n private hooks?: AgentHooks;\n private memory?: MemoryStore;\n private threadId?: string;\n private costTracker: CostTracker;\n private _loaded = false;\n private _title?: string;\n private _titleFetched = false;\n private _disableTitle = false;\n\n constructor(config: AgentConfig | AgentConfigV2) {\n this.model = config.model;\n this.tools = new ToolRegistry(config.tools ?? []);\n this.systemPrompt = config.systemPrompt ?? \"\";\n this.maxTurns = config.maxTurns ?? DEFAULT_MAX_TURNS;\n this.contextManager = new ContextManager({\n maxTokens: config.context?.maxTokens ?? DEFAULT_CONTEXT_WINDOW,\n maxOutputTokens: config.context?.maxOutputTokens ?? DEFAULT_MAX_OUTPUT_TOKENS,\n compactThreshold: config.context?.compactThreshold ?? DEFAULT_COMPACT_THRESHOLD,\n });\n this.permissionEngine = new PermissionEngine(config.permissions);\n this.permissionConfig = config.permissions;\n this.cwd = config.cwd ?? process.cwd();\n this.maxRetries = config.maxRetries ?? 5;\n\n const v2 = config as AgentConfigV2;\n this.hooks = v2.hooks;\n this.memory = v2.memory;\n this.threadId = v2.threadId;\n this.costTracker = v2.costTracker ?? new CostTrackerImpl();\n this._title = v2.title;\n this._disableTitle = v2.disableTitle ?? false;\n }\n\n addTool(tool: Tool): void {\n this.tools.add(tool);\n }\n\n addMessage(message: Message): void {\n this.messages.push(message);\n }\n\n reset(): void {\n this.messages = [];\n this._titleFetched = false;\n }\n\n getMessages(): Message[] {\n return [...this.messages];\n }\n\n getCostTracker(): CostTracker {\n return this.costTracker;\n }\n\n get title(): string | undefined {\n return this._title;\n }\n\n private async loadMemory(): Promise<void> {\n if (this._loaded || !this.memory || !this.threadId) return;\n const stored = await this.memory.getThread(this.threadId);\n if (stored.length > 0) {\n this.messages = stored;\n }\n this._loaded = true;\n }\n\n private async saveMemory(): Promise<void> {\n if (!this.memory || !this.threadId) return;\n await this.memory.saveThread(this.threadId, this.messages);\n }\n\n fork(newThreadId?: string): Agent {\n const forked = new Agent({\n model: this.model,\n tools: this.tools.getAll(),\n systemPrompt: this.systemPrompt,\n maxTurns: this.maxTurns,\n cwd: this.cwd,\n maxRetries: this.maxRetries,\n permissions: this.permissionConfig,\n hooks: this.hooks,\n memory: this.memory,\n threadId: newThreadId,\n costTracker: this.costTracker,\n title: this._title,\n context: {\n maxTokens: this.contextManager.maxTokens,\n maxOutputTokens: this.contextManager.maxOutputTokens,\n compactThreshold: this.contextManager.compactThreshold,\n },\n });\n forked.messages = [...this.messages];\n return forked;\n }\n\n async *run(prompt: string, options?: { abortSignal?: AbortSignal }): AsyncGenerator<LoopEvent> {\n await this.loadMemory();\n const loopMessages = [...this.messages, { role: \"user\" as const, content: prompt }];\n\n if (!this._titleFetched && this.messages.length === 0 && !this._disableTitle) {\n this._titleFetched = true;\n this.generateTitle(prompt).catch(() => {});\n }\n\n const loop = agentLoop({\n model: this.model,\n tools: this.tools,\n messages: loopMessages,\n systemPrompt: this.systemPrompt || undefined,\n maxTurns: this.maxTurns,\n contextManager: this.contextManager,\n permissionEngine: this.permissionEngine,\n cwd: this.cwd,\n abortSignal: options?.abortSignal,\n maxRetries: this.maxRetries,\n hooks: this.hooks,\n costTracker: this.costTracker,\n });\n\n const finalMessages: Message[] = [];\n for await (const event of loop) {\n yield event;\n if (event.type === \"done\") {\n finalMessages.length = 0;\n finalMessages.push(...event.messages);\n }\n }\n\n if (finalMessages.length > 0) {\n this.messages = finalMessages;\n await this.saveMemory();\n }\n }\n\n async chat(prompt: string, options?: { abortSignal?: AbortSignal }): Promise<{\n text: string;\n usage: { inputTokens: number; outputTokens: number };\n messages: Message[];\n cost: number;\n }> {\n let text = \"\";\n let usage = { inputTokens: 0, outputTokens: 0 };\n\n for await (const event of this.run(prompt, options)) {\n if (event.type === \"text\") {\n text += event.text;\n }\n if (event.type === \"done\") {\n usage = {\n inputTokens: event.usage.inputTokens,\n outputTokens: event.usage.outputTokens,\n };\n }\n }\n\n const total = this.costTracker.getTotal();\n return { text, usage, messages: this.getMessages(), cost: total.cost };\n }\n\n async structured<T>(\n prompt: string,\n schema: { safeParse: (data: unknown) => { success: boolean; data?: T; error?: { issues: Array<{ path: (string | number)[]; message: string }> } } },\n options?: { abortSignal?: AbortSignal; maxRetries?: number },\n ): Promise<T> {\n const maxRetries = options?.maxRetries ?? 3;\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n const currentPrompt = attempt === 0\n ? prompt\n : `${prompt}\\n\\nPrevious attempt returned invalid JSON. Please fix and respond with valid JSON only.`;\n\n const agent = new Agent({\n model: this.model,\n tools: [],\n systemPrompt: \"You must respond with valid JSON matching the requested schema.\",\n maxTurns: 1,\n cwd: this.cwd,\n permissions: this.permissionConfig,\n context: {\n maxTokens: this.contextManager.maxTokens,\n maxOutputTokens: this.contextManager.maxOutputTokens,\n compactThreshold: this.contextManager.compactThreshold,\n },\n costTracker: this.costTracker,\n disableTitle: true,\n } as AgentConfigV2);\n\n const result = await agent.chat(currentPrompt, options);\n const jsonMatch = result.text.match(/```(?:json)?\\s*([\\s\\S]*?)```/) ?? [null, result.text];\n const jsonStr = jsonMatch[1] ?? result.text;\n\n try {\n const parsed = JSON.parse(jsonStr);\n const validated = schema.safeParse(parsed);\n if (validated.success && validated.data !== undefined) {\n return validated.data as T;\n }\n } catch {\n continue;\n }\n }\n\n throw new Error(`Failed to get valid structured output after ${maxRetries} attempts`);\n }\n\n async structuredViaTool<T>(\n prompt: string,\n schema: { safeParse: (data: unknown) => { success: boolean; data?: T; error?: { issues: Array<{ path: (string | number)[]; message: string }> } } },\n options?: { abortSignal?: AbortSignal; maxRetries?: number },\n ): Promise<T> {\n const { z } = await import(\"zod\");\n const maxRetries = options?.maxRetries ?? 3;\n\n let captured: T | undefined;\n\n const structTool = defineTool({\n name: \"structured_output\",\n description: \"Return your final response in the required structured format.\",\n inputSchema: z.object({\n response: z.unknown().describe(\"The structured JSON response\"),\n }),\n isReadOnly: true,\n isConcurrencySafe: true,\n execute: async (input: Record<string, unknown>) => {\n captured = input.response as T;\n return \"Structured output captured.\";\n },\n });\n\n const agent = new Agent({\n model: this.model,\n tools: [structTool],\n systemPrompt: [\n this.systemPrompt,\n \"You MUST call the structured_output tool with your response. Do not return plain text.\",\n ].filter(Boolean).join(\"\\n\\n\"),\n maxTurns: 1,\n cwd: this.cwd,\n permissions: this.permissionConfig,\n context: {\n maxTokens: this.contextManager.maxTokens,\n maxOutputTokens: this.contextManager.maxOutputTokens,\n compactThreshold: this.contextManager.compactThreshold,\n },\n costTracker: this.costTracker,\n disableTitle: true,\n } as AgentConfigV2);\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n captured = undefined;\n const currentPrompt = attempt === 0\n ? prompt\n : `${prompt}\\n\\nPrevious attempt failed validation. Fix your structured output and call the structured_output tool again.`;\n\n await agent.chat(currentPrompt, options);\n\n if (captured !== undefined) {\n const validated = schema.safeParse(captured);\n if (validated.success && validated.data !== undefined) {\n return validated.data as T;\n }\n }\n }\n\n throw new Error(`Failed to get valid structured output via tool after ${maxRetries} attempts`);\n }\n\n async asTool(options?: { allowSubAgents?: boolean; name?: string; description?: string }): Promise<Tool> {\n const { z } = await import(\"zod\");\n const allowSubAgents = options?.allowSubAgents ?? false;\n return defineTool({\n name: options?.name ?? \"delegate_agent\",\n description: options?.description ?? `Delegate a task to a sub-agent with system prompt: ${this.systemPrompt?.slice(0, 100) ?? \"none\"}`,\n inputSchema: z.object({\n prompt: z.string().describe(\"The task to delegate\"),\n }),\n isReadOnly: true,\n isConcurrencySafe: true,\n execute: async (input: Record<string, unknown>) => {\n const subAgent = this.fork();\n if (!allowSubAgents) {\n const forbiddenTools = [\"delegate_agent\", \"task\", \"todowrite\"];\n const allowed = this.tools.getAll().filter((t) => !forbiddenTools.includes(t.name));\n for (const tool of allowed) {\n subAgent.addTool(tool);\n }\n }\n const result = await subAgent.chat(input.prompt as string);\n return result.text;\n },\n });\n }\n\n private async generateTitle(prompt: string): Promise<void> {\n try {\n const firstLine = prompt.split(\"\\n\")[0].slice(0, 200);\n const titleAgent = new Agent({\n model: this.model,\n tools: [],\n systemPrompt: \"Generate a short, descriptive title (max 10 words) for a conversation that starts with this message. Return ONLY the title, nothing else.\",\n maxTurns: 1,\n cwd: this.cwd,\n costTracker: this.costTracker,\n disableTitle: true,\n } as AgentConfigV2);\n const result = await titleAgent.chat(firstLine);\n const title = result.text.trim().replace(/^[\"']|[\"']$/g, \"\").slice(0, 80);\n if (title.length > 0) {\n this._title = title;\n }\n } catch {\n this._title = prompt.slice(0, 50);\n }\n }\n}\n","import type { TokenUsage } from \"./types.js\";\n\nexport interface StreamEvent {\n type: \"text_delta\" | \"tool_use_start\" | \"tool_use_delta\" | \"tool_result\" | \"done\" | \"error\";\n text?: string;\n id?: string;\n name?: string;\n input?: string;\n output?: string;\n usage?: TokenUsage;\n error?: Error;\n}\n\nexport function createStreamAggregator() {\n let text = \"\";\n const toolCalls: Map<string, { id: string; name: string; input: string }> = new Map();\n let usage: TokenUsage | undefined;\n let stopReason: \"end_turn\" | \"tool_use\" | \"max_tokens\" = \"end_turn\";\n\n function push(event: StreamEvent): void {\n switch (event.type) {\n case \"text_delta\":\n text += event.text ?? \"\";\n break;\n case \"tool_use_start\":\n if (event.id) {\n toolCalls.set(event.id, { id: event.id, name: event.name ?? \"\", input: event.input ?? \"\" });\n }\n stopReason = \"tool_use\";\n break;\n case \"tool_use_delta\":\n if (event.id && toolCalls.has(event.id)) {\n toolCalls.get(event.id)!.input += event.input ?? \"\";\n }\n break;\n case \"done\":\n usage = event.usage;\n break;\n case \"tool_result\":\n break;\n case \"error\":\n break;\n }\n }\n\n function getResponse(): {\n text: string;\n toolCalls: { id: string; name: string; input: string }[];\n usage?: TokenUsage;\n stopReason: string;\n } {\n return { text, toolCalls: Array.from(toolCalls.values()), usage, stopReason };\n }\n\n return { push, getResponse };\n}\n"],"mappings":"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","names":["newTokens"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/hooks.ts","../src/loop.ts","../src/context/tokenizer.ts","../src/context/manager.ts","../src/permissions/engine.ts","../src/cost/tracker.ts","../src/agent.ts","../src/stream.ts"],"sourcesContent":["export type Message = UserMessage | AssistantMessage | ToolResultMessage;\n\nexport interface UserMessage {\n role: \"user\";\n content: string;\n}\n\nexport interface AssistantMessage {\n role: \"assistant\";\n content: ContentBlock[];\n}\n\nexport interface ToolResultMessage {\n role: \"tool\";\n tool_use_id: string;\n content: string;\n is_error?: boolean;\n}\n\nexport type ContentBlock = TextBlock | ToolUseBlock | ThinkingBlock;\n\nexport interface TextBlock {\n type: \"text\";\n text: string;\n}\n\nexport interface ToolUseBlock {\n type: \"tool_use\";\n id: string;\n name: string;\n input: Record<string, unknown>;\n}\n\nexport interface ThinkingBlock {\n type: \"thinking\";\n thinking: string;\n}\n\nexport type LoopEvent =\n | { type: \"text\"; text: string }\n | { type: \"thinking\"; thinking: string }\n | { type: \"tool_use\"; id: string; name: string; input: Record<string, unknown> }\n | { type: \"tool_result\"; id: string; name: string; output: string; isError: boolean }\n | { type: \"error\"; error: Error }\n | { type: \"done\"; usage: TokenUsage; messages: Message[] };\n\nexport interface TokenUsage {\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n}\n\nexport interface ModelResponse {\n content: ContentBlock[];\n usage: TokenUsage;\n stopReason: \"end_turn\" | \"tool_use\" | \"max_tokens\" | \"stop_sequence\";\n}\n\nexport interface ToolContext {\n cwd: string;\n env: Record<string, string>;\n abortSignal?: AbortSignal;\n}\n\nexport interface ProviderConfig {\n model: string;\n maxOutputTokens?: number;\n temperature?: number;\n}\n\nexport interface AgentConfig {\n model: import(\"./llm/provider.js\").Provider;\n tools?: import(\"./tools/tool.js\").Tool[];\n systemPrompt?: string;\n maxTurns?: number;\n context?: ContextConfig;\n permissions?: PermissionConfig;\n cwd?: string;\n maxRetries?: number;\n}\n\nexport interface ContextConfig {\n maxTokens?: number;\n compactThreshold?: number;\n maxOutputTokens?: number;\n}\n\nexport interface PermissionConfig {\n allowedTools?: string[];\n deniedTools?: string[];\n askTools?: string[];\n defaultAction?: \"allow\" | \"deny\" | \"ask\";\n}\n\nexport interface CompactionResult {\n messages: Message[];\n tokensSaved: number;\n method: \"snip\" | \"compact\" | \"none\";\n}\n\nexport const DEFAULT_CONTEXT_WINDOW = 200_000;\nexport const DEFAULT_MAX_OUTPUT_TOKENS = 16_384;\nexport const DEFAULT_COMPACT_THRESHOLD = 0.85;\nexport const DEFAULT_MAX_TURNS = 100;\nexport const MAX_CONCURRENT_TOOLS = 10;\n","import type { Message, CompactionResult } from \"./types.js\";\n\nexport interface AgentHooks {\n onTurnStart?: (turn: number, messages: Message[]) => Promise<Message[] | void>;\n onTurnEnd?: (turn: number, messages: Message[]) => Promise<void>;\n onToolUse?: (\n name: string,\n input: Record<string, unknown>,\n ) => Promise<{ allow?: boolean; input?: Record<string, unknown> } | void>;\n onToolResult?: (result: {\n id: string;\n name: string;\n output: string;\n isError: boolean;\n durationMs: number;\n }) => Promise<string | void>;\n onError?: (error: Error, turn: number) => Promise<{ retry?: boolean; message?: string } | void>;\n onCompact?: (result: CompactionResult) => Promise<void>;\n}\n\nexport class HookRunner {\n private hooks: AgentHooks;\n\n constructor(hooks?: AgentHooks) {\n this.hooks = hooks ?? {};\n }\n\n async runOnTurnStart(turn: number, messages: Message[]): Promise<Message[]> {\n if (!this.hooks.onTurnStart) return messages;\n const result = await this.hooks.onTurnStart(turn, messages);\n return Array.isArray(result) ? result : messages;\n }\n\n async runOnTurnEnd(turn: number, messages: Message[]): Promise<void> {\n await this.hooks.onTurnEnd?.(turn, messages);\n }\n\n async runOnToolUse(\n name: string,\n input: Record<string, unknown>,\n ): Promise<{ allow: boolean; input: Record<string, unknown> }> {\n if (!this.hooks.onToolUse) return { allow: true, input };\n const result = await this.hooks.onToolUse(name, input);\n return {\n allow: result?.allow ?? true,\n input: result?.input ?? input,\n };\n }\n\n async runOnToolResult(result: {\n id: string;\n name: string;\n output: string;\n isError: boolean;\n durationMs: number;\n }): Promise<string> {\n if (!this.hooks.onToolResult) return result.output;\n const modified = await this.hooks.onToolResult(result);\n return modified ?? result.output;\n }\n\n async runOnError(error: Error, turn: number): Promise<{ retry: boolean; message?: string }> {\n if (!this.hooks.onError) return { retry: false };\n const result = await this.hooks.onError(error, turn);\n return { retry: result?.retry ?? false, message: result?.message };\n }\n\n async runOnCompact(result: CompactionResult): Promise<void> {\n await this.hooks.onCompact?.(result);\n }\n}\n","import type { Message, ContentBlock, ToolUseBlock, LoopEvent, ToolContext, TokenUsage } from \"./types.js\";\nimport { DEFAULT_MAX_TURNS } from \"./types.js\";\nimport { ToolRegistry } from \"./tools/registry.js\";\nimport { orchestrateTools } from \"./tools/orchestrator.js\";\nimport { ContextManager } from \"./context/manager.js\";\nimport { PermissionEngine } from \"./permissions/engine.js\";\nimport type { Provider } from \"./llm/provider.js\";\nimport type { AgentHooks } from \"./hooks.js\";\nimport { HookRunner } from \"./hooks.js\";\nimport type { CostTracker } from \"./cost/tracker.js\";\n\nconst DEFAULT_MAX_RETRIES = 5;\nconst INITIAL_RETRY_DELAY_MS = 1000;\nconst MAX_RETRY_DELAY_MS = 30000;\nconst DOOM_LOOP_THRESHOLD = 3;\nconst PRE_OVERFLOW_BUFFER = 20_000;\nconst OUTPUT_MAX_LINES = 2000;\nconst OUTPUT_MAX_BYTES = 50_000;\n\nexport interface AgentLoopConfig {\n model: Provider;\n tools: ToolRegistry;\n messages: Message[];\n systemPrompt?: string;\n maxTurns?: number;\n contextManager: ContextManager;\n permissionEngine: PermissionEngine;\n cwd?: string;\n abortSignal?: AbortSignal;\n maxRetries?: number;\n hooks?: AgentHooks;\n costTracker?: CostTracker;\n}\n\nfunction parseRetryAfterMs(error: Error): number | null {\n const msg = error.message ?? \"\";\n const retryAfterMsMatch = msg.match(/retry-after-ms:\\s*(\\d+)/i);\n if (retryAfterMsMatch) return parseInt(retryAfterMsMatch[1], 10);\n const retryAfterMatch = msg.match(/retry-after:\\s*(\\d+)/i);\n if (retryAfterMatch) return parseInt(retryAfterMatch[1], 10) * 1000;\n return null;\n}\n\nfunction truncateOutput(output: string, toolName: string, hasSubAgent: boolean): string {\n const lines = output.split(\"\\n\");\n if (lines.length <= OUTPUT_MAX_LINES && output.length <= OUTPUT_MAX_BYTES) return output;\n\n let truncated = \"\";\n let byteCount = 0;\n for (const line of lines) {\n if (byteCount + line.length > OUTPUT_MAX_BYTES) break;\n truncated += line + \"\\n\";\n byteCount += line.length;\n if (byteCount > OUTPUT_MAX_BYTES) break;\n }\n\n const lineCount = truncated.split(\"\\n\").filter(l => l.length > 0).length;\n const suffix = hasSubAgent\n ? `\\n\\n[Output truncated: ${lineCount}/${lines.length} lines shown. Use the Task tool to have a sub-agent process the full output.]`\n : `\\n\\n[Output truncated: ${lineCount}/${lines.length} lines shown. Use Grep to search or Read with offset/limit for the full content.]`;\n\n return truncated.trimEnd() + suffix;\n}\n\nfunction detectDoomLoop(messages: Message[]): ToolUseBlock | null {\n const recentToolCalls: ToolUseBlock[] = [];\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i];\n if (msg.role !== \"assistant\") continue;\n if (typeof msg.content === \"string\") continue;\n for (const block of msg.content) {\n if (block.type === \"tool_use\") recentToolCalls.push(block);\n }\n if (recentToolCalls.length >= DOOM_LOOP_THRESHOLD) break;\n }\n\n if (recentToolCalls.length < DOOM_LOOP_THRESHOLD) return null;\n\n const last = recentToolCalls[0];\n return recentToolCalls.every(\n tc => tc.name === last.name && JSON.stringify(tc.input) === JSON.stringify(last.input),\n )\n ? last\n : null;\n}\n\nexport async function* agentLoop(config: AgentLoopConfig): AsyncGenerator<LoopEvent> {\n const {\n model,\n tools,\n messages,\n systemPrompt,\n maxTurns = DEFAULT_MAX_TURNS,\n contextManager,\n permissionEngine,\n cwd = process.cwd(),\n abortSignal,\n hooks,\n costTracker,\n } = config;\n\n const hookRunner = new HookRunner(hooks);\n const context: ToolContext = { cwd, env: { ...process.env } as Record<string, string> };\n let turns = 0;\n let consecutiveRetries = 0;\n const maxRetries = config.maxRetries ?? DEFAULT_MAX_RETRIES;\n let totalUsage = { inputTokens: 0, outputTokens: 0, cacheReadTokens: 0, cacheWriteTokens: 0 };\n let inFlightText = \"\";\n let inFlightReasoning = \"\";\n let inFlightToolCalls: ToolUseBlock[] = [];\n\n while (turns < maxTurns) {\n if (abortSignal?.aborted) {\n yield finalizeLoop(\"Aborted\");\n return;\n }\n\n const messagesAfterHook = await hookRunner.runOnTurnStart(turns + 1, messages);\n if (messagesAfterHook !== messages) {\n messages.length = 0;\n messages.push(...messagesAfterHook);\n }\n\n const contextCheck = contextManager.check(messages);\n if (contextCheck.needsCompact) {\n const result = await contextManager.compact(messages);\n messages.length = 0;\n messages.push(...result.messages);\n if (result.tokensSaved > 0) {\n const thinking = `Context ${result.method}: saved ~${result.tokensSaved} tokens (${contextCheck.totalTokens} → ${contextCheck.totalTokens - result.tokensSaved})`;\n yield { type: \"thinking\", thinking };\n await hookRunner.runOnCompact(result);\n }\n const pruned = contextManager.pruneToolOutputs(messages);\n if (pruned.length !== messages.length) {\n messages.length = 0;\n messages.push(...pruned);\n yield { type: \"thinking\", thinking: \"Pruned large tool outputs to free additional context\" };\n }\n }\n\n const estimatedTotal = totalUsage.inputTokens + totalUsage.outputTokens\n + (totalUsage.cacheReadTokens ?? 0) + (totalUsage.cacheWriteTokens ?? 0);\n const maxContext = contextManager.maxTokens;\n const maxOutput = contextManager.maxOutputTokens;\n if (maxContext > 0 && estimatedTotal + maxOutput + PRE_OVERFLOW_BUFFER >= maxContext) {\n yield { type: \"thinking\", thinking: \"Approaching context limit, compacting preemptively...\" };\n const result = await contextManager.compact(messages);\n messages.length = 0;\n messages.push(...result.messages);\n if (result.tokensSaved > 0) {\n yield { type: \"thinking\", thinking: `Pre-overflow compact: freed ~${result.tokensSaved} tokens` };\n }\n }\n\n const available = contextManager.getAvailableTokens(messages);\n const maxTokens = Math.min(available, contextManager.maxOutputTokens);\n if (maxTokens < 1024) {\n yield finalizeLoop(\"Insufficient context window for next turn\");\n return;\n }\n\n inFlightText = \"\";\n inFlightReasoning = \"\";\n inFlightToolCalls = [];\n\n let response;\n try {\n const mappedMessages = messages.map((m) => {\n if (m.role === \"tool\") {\n const toolCall = inFlightToolCalls.find(tc => tc.id === (m as { tool_use_id?: string }).tool_use_id);\n if (toolCall) {\n return {\n role: \"tool\" as const,\n tool_use_id: m.role === \"tool\" ? (m as { tool_use_id: string }).tool_use_id : undefined,\n is_error: m.role === \"tool\" ? (m as { is_error?: boolean }).is_error : undefined,\n content: truncateOutput(\n (m as { content: string }).content,\n toolCall.name,\n tools.has(\"delegate_agent\"),\n ),\n };\n }\n }\n return {\n role: m.role,\n content: m.role === \"tool\"\n ? (m as { content: string }).content\n : m.role === \"user\"\n ? (m as { content: string }).content\n : (m as { content: ContentBlock[] }).content,\n tool_use_id: m.role === \"tool\" ? (m as { tool_use_id: string }).tool_use_id : undefined,\n is_error: m.role === \"tool\" ? (m as { is_error?: boolean }).is_error : undefined,\n };\n });\n\n response = await model.chat({\n messages: mappedMessages,\n tools: tools.getAPI(),\n systemPrompt,\n maxOutputTokens: maxTokens,\n abortSignal,\n });\n } catch (err) {\n yield* flushInFlight();\n const error = err instanceof Error ? err : new Error(String(err));\n\n const hookResult = await hookRunner.runOnError(error, turns + 1);\n if (hookResult.retry && hookResult.message) {\n messages.push({ role: \"user\", content: hookResult.message });\n turns++;\n continue;\n }\n\n if (error.message.includes(\"429\") || error.message.includes(\"529\") || error.message.includes(\"overloaded\")) {\n consecutiveRetries++;\n if (consecutiveRetries > maxRetries) {\n yield { type: \"error\", error: new Error(`Max retries (${maxRetries}) exceeded`) };\n return;\n }\n const headerDelay = parseRetryAfterMs(error);\n const backoffDelay = headerDelay\n ?? Math.min(INITIAL_RETRY_DELAY_MS * 2 ** (consecutiveRetries - 1) + Math.random() * 500, MAX_RETRY_DELAY_MS);\n yield { type: \"thinking\", thinking: `Rate limited, retry ${consecutiveRetries}/${maxRetries} in ${Math.round(backoffDelay)}ms...` };\n await new Promise((r) => setTimeout(r, backoffDelay));\n continue;\n }\n\n yield { type: \"error\", error };\n return;\n }\n\n totalUsage.inputTokens += response.usage.inputTokens;\n totalUsage.outputTokens += response.usage.outputTokens;\n totalUsage.cacheReadTokens = (totalUsage.cacheReadTokens ?? 0) + (response.usage.cacheReadTokens ?? 0);\n totalUsage.cacheWriteTokens = (totalUsage.cacheWriteTokens ?? 0) + (response.usage.cacheWriteTokens ?? 0);\n\n if (costTracker) {\n costTracker.record(model.model, response.usage, turns + 1);\n }\n\n const toolCalls: ToolUseBlock[] = [];\n for (const block of response.content) {\n if (block.type === \"text\") {\n inFlightText += block.text;\n yield { type: \"text\", text: block.text };\n } else if (block.type === \"thinking\") {\n inFlightReasoning += block.thinking;\n yield { type: \"thinking\", thinking: block.thinking };\n } else if (block.type === \"tool_use\") {\n const resolvedName = tools.has(block.name) ? block.name : tools.findCaseInsensitive(block.name);\n if (!resolvedName) {\n yield { type: \"tool_result\", id: block.id, name: block.name, output: `Unknown tool: ${block.name}. Available: ${tools.listNames().join(\", \")}`, isError: true };\n messages.push({ role: \"assistant\", content: response.content });\n messages.push({ role: \"tool\", tool_use_id: block.id, content: `Unknown tool: ${block.name}`, is_error: true });\n continue;\n }\n const modifiedBlock: ToolUseBlock = resolvedName !== block.name ? { ...block, name: resolvedName } : block;\n\n const hookToolResult = await hookRunner.runOnToolUse(modifiedBlock.name, modifiedBlock.input);\n if (!hookToolResult.allow) {\n yield { type: \"tool_result\", id: modifiedBlock.id, name: modifiedBlock.name, output: \"Tool denied by hook\", isError: true };\n messages.push({ role: \"assistant\", content: response.content });\n messages.push({ role: \"tool\", tool_use_id: modifiedBlock.id, content: \"Tool denied by hook\", is_error: true });\n continue;\n }\n const finalBlock: ToolUseBlock = { ...modifiedBlock, input: hookToolResult.input };\n toolCalls.push(finalBlock);\n inFlightToolCalls.push(finalBlock);\n yield { type: \"tool_use\", id: finalBlock.id, name: finalBlock.name, input: finalBlock.input };\n }\n }\n\n const hasNonToolContent = inFlightText.length > 0 || inFlightReasoning.length > 0;\n if (!hasNonToolContent && toolCalls.length === 0) {\n yield finalizeLoop(\"Assistant produced no content\");\n return;\n }\n\n const assistantContent = response.content.filter(b => {\n if (b.type !== \"tool_use\") return true;\n return toolCalls.some(tc => tc.id === b.id);\n });\n\n messages.push({ role: \"assistant\", content: assistantContent });\n turns++;\n consecutiveRetries = 0;\n inFlightText = \"\";\n inFlightReasoning = \"\";\n inFlightToolCalls = [];\n\n await hookRunner.runOnTurnEnd(turns, messages);\n\n if (response.stopReason !== \"tool_use\" || toolCalls.length === 0) {\n yield {\n type: \"done\",\n usage: {\n inputTokens: totalUsage.inputTokens,\n outputTokens: totalUsage.outputTokens,\n cacheReadTokens: totalUsage.cacheReadTokens,\n cacheWriteTokens: totalUsage.cacheWriteTokens,\n },\n messages: [...messages],\n };\n return;\n }\n\n const doomLoopCall = detectDoomLoop(messages);\n if (doomLoopCall) {\n yield { type: \"thinking\", thinking: `Detected repetitive tool calls: ${doomLoopCall.name} called ${DOOM_LOOP_THRESHOLD} times with identical input. Breaking the loop.` };\n messages.push({ role: \"user\", content: `STOP. You have called ${doomLoopCall.name} ${DOOM_LOOP_THRESHOLD} times in a row with the same input. This indicates a loop. Try a different approach or tool.` });\n turns++;\n continue;\n }\n\n const results = await orchestrateTools(\n tools,\n toolCalls,\n context,\n async (name, _input) => {\n const perm = permissionEngine.check(name);\n return perm.allowed;\n },\n abortSignal,\n );\n\n for (const result of results) {\n let output = truncateOutput(result.output, result.name, tools.has(\"delegate_agent\"));\n const toolResult = await hookRunner.runOnToolResult({\n id: result.id,\n name: result.name,\n output: result.output,\n isError: result.isError,\n durationMs: result.durationMs,\n });\n output = toolResult;\n\n messages.push({\n role: \"tool\",\n tool_use_id: result.id,\n content: output,\n is_error: result.isError,\n });\n yield {\n type: \"tool_result\",\n id: result.id,\n name: result.name,\n output,\n isError: result.isError,\n };\n }\n }\n\n yield { type: \"error\", error: new Error(`Max turns (${maxTurns}) reached`) };\n\n function* flushInFlight(): Generator<LoopEvent, void, unknown> {\n if (inFlightText.length > 0) {\n yield { type: \"text\", text: inFlightText };\n }\n if (inFlightReasoning.length > 0) {\n yield { type: \"thinking\", thinking: inFlightReasoning };\n }\n for (const tc of inFlightToolCalls) {\n yield { type: \"tool_result\", id: tc.id, name: tc.name, output: \"[Tool execution was interrupted]\", isError: true };\n messages.push({ role: \"assistant\", content: [{ type: \"tool_use\" as const, id: tc.id, name: tc.name, input: tc.input }] });\n messages.push({ role: \"tool\", tool_use_id: tc.id, content: \"[Tool execution was interrupted]\", is_error: true });\n }\n }\n\n function finalizeLoop(reason: string): LoopEvent {\n if (totalUsage.inputTokens > 0 || totalUsage.outputTokens > 0) {\n return {\n type: \"done\",\n usage: {\n inputTokens: totalUsage.inputTokens,\n outputTokens: totalUsage.outputTokens,\n cacheReadTokens: totalUsage.cacheReadTokens,\n cacheWriteTokens: totalUsage.cacheWriteTokens,\n },\n messages: [...messages],\n };\n }\n return { type: \"error\", error: new Error(reason) };\n }\n}\n","import type { Message } from \"../types.js\";\n\nexport interface TokenCount {\n total: number;\n byRole: Record<string, number>;\n}\n\nexport function estimateTokens(text: string): number {\n const chars = text.length;\n const words = text.split(/\\s+/).filter(Boolean).length;\n return Math.max(Math.ceil(chars / 4), Math.ceil(words * 1.3));\n}\n\nexport function estimateMessageTokens(message: Message): number {\n if (message.role === \"user\") {\n return estimateTokens(message.content) + 4;\n }\n\n if (message.role === \"tool\") {\n return estimateTokens(message.content) + 4;\n }\n\n let tokens = 0;\n for (const block of message.content) {\n if (block.type === \"text\") {\n tokens += estimateTokens(block.text) + 4;\n } else if (block.type === \"tool_use\") {\n tokens += estimateTokens(block.name) + estimateTokens(JSON.stringify(block.input)) + 4;\n } else if (block.type === \"thinking\") {\n tokens += estimateTokens(block.thinking) + 4;\n }\n }\n return tokens;\n}\n\nexport function estimateConversationTokens(messages: Message[]): TokenCount {\n const byRole: Record<string, number> = {};\n\n let total = 0;\n for (const message of messages) {\n const msgTokens = estimateMessageTokens(message) + 10;\n total += msgTokens;\n byRole[message.role] = (byRole[message.role] ?? 0) + msgTokens;\n }\n\n return { total, byRole };\n}\n","import type { Message, ContentBlock, ContextConfig, CompactionResult } from \"../types.js\";\nimport { DEFAULT_CONTEXT_WINDOW, DEFAULT_MAX_OUTPUT_TOKENS, DEFAULT_COMPACT_THRESHOLD } from \"../types.js\";\nimport { estimateConversationTokens, estimateMessageTokens } from \"./tokenizer.js\";\n\nconst PRUNE_MINIMUM = 20_000;\nconst PRUNE_PROTECT_TOKENS = 40_000;\nconst PROTECTED_TOOL_TYPES = new Set([\"skill\", \"delegate_agent\"]);\nconst RECENT_TURNS_TO_PROTECT = 2;\n\nexport interface ContextCheck {\n totalTokens: number;\n availableTokens: number;\n usagePercent: number;\n needsCompact: boolean;\n recommendedMethod: \"snip\" | \"compact\";\n}\n\nexport class ContextManager {\n readonly maxTokens: number;\n readonly maxOutputTokens: number;\n readonly compactThreshold: number;\n\n constructor(config?: ContextConfig) {\n this.maxTokens = config?.maxTokens ?? DEFAULT_CONTEXT_WINDOW;\n this.maxOutputTokens = config?.maxOutputTokens ?? DEFAULT_MAX_OUTPUT_TOKENS;\n this.compactThreshold = config?.compactThreshold ?? DEFAULT_COMPACT_THRESHOLD;\n }\n\n check(messages: Message[]): ContextCheck {\n const { total: totalTokens } = estimateConversationTokens(messages);\n const availableTokens = this.maxTokens - totalTokens - this.maxOutputTokens;\n const usagePercent = totalTokens / this.maxTokens;\n const needsCompact = usagePercent >= this.compactThreshold;\n let recommendedMethod: \"snip\" | \"compact\";\n\n if (usagePercent > 0.95) {\n recommendedMethod = \"compact\";\n } else {\n recommendedMethod = \"snip\";\n }\n\n return { totalTokens, availableTokens, usagePercent, needsCompact, recommendedMethod };\n }\n\n async compact(messages: Message[], summaryFn?: (messages: Message[]) => Promise<string>): Promise<CompactionResult> {\n const contextCheck = this.check(messages);\n\n if (!contextCheck.needsCompact) {\n return { messages: [...messages], tokensSaved: 0, method: \"none\" };\n }\n\n const originalTokens = contextCheck.totalTokens;\n\n if (summaryFn && contextCheck.recommendedMethod === \"compact\") {\n const recentCount = Math.max(Math.ceil(messages.length * 0.2), 1);\n const cutoffIndex = messages.length - recentCount;\n const oldMessages = messages.slice(0, cutoffIndex);\n const recentMessages = messages.slice(cutoffIndex);\n\n const summary = await summaryFn(oldMessages);\n const summaryMessage: Message = {\n role: \"user\",\n content: `Here is a summary of our previous conversation:\\n${summary}`,\n };\n\n const compacted = [summaryMessage, ...recentMessages];\n const newTokens = estimateConversationTokens(compacted).total;\n\n return {\n messages: compacted,\n tokensSaved: originalTokens - newTokens,\n method: \"compact\",\n };\n }\n\n const keepFirst = 1;\n const keepLast = 20;\n const keepMin = keepFirst + keepLast;\n\n if (messages.length <= keepMin) {\n return { messages: [...messages], tokensSaved: 0, method: \"none\" };\n }\n\n let result = [...messages];\n const targetUsage = 0.6;\n\n while (result.length > keepMin) {\n const { total } = estimateConversationTokens(result);\n if (total / this.maxTokens < targetUsage) break;\n\n const removeCount = Math.max(1, Math.floor((result.length - keepMin) * 0.3));\n const removeEnd = Math.min(keepFirst + removeCount, result.length - keepLast);\n result = [result[0], ...result.slice(removeEnd)];\n }\n\n const newTokens = estimateConversationTokens(result).total;\n\n return {\n messages: result,\n tokensSaved: originalTokens - newTokens,\n method: \"snip\",\n };\n }\n\n pruneToolOutputs(messages: Message[]): Message[] {\n let totalPruned = 0;\n let turnCount = 0;\n const result = [...messages];\n\n for (let i = result.length - 1; i >= 0; i--) {\n const msg = result[i];\n if (msg.role === \"user\") {\n turnCount++;\n if (turnCount <= RECENT_TURNS_TO_PROTECT) continue;\n }\n if (msg.role !== \"assistant\" || !Array.isArray(msg.content)) continue;\n\n for (const block of msg.content) {\n if (block.type !== \"tool_use\") continue;\n if (PROTECTED_TOOL_TYPES.has(block.name)) continue;\n\n const toolResultIdx = result.findIndex(\n (m, j) => j > i && m.role === \"tool\" && (m as { tool_use_id?: string }).tool_use_id === block.id,\n );\n if (toolResultIdx === -1) continue;\n\n const toolResult = result[toolResultIdx];\n const output = (toolResult as { content: string }).content;\n const estTokens = Math.ceil(output.length / 4);\n\n if (totalPruned + estTokens >= PRUNE_MINIMUM && totalPruned >= PRUNE_PROTECT_TOKENS) {\n return result;\n }\n\n totalPruned += estTokens;\n result[toolResultIdx] = {\n ...(toolResult as unknown as Record<string, unknown>),\n content: `[Output pruned: ${estTokens} tokens saved]`,\n is_error: false,\n } as typeof toolResult;\n }\n }\n\n return result;\n }\n\n getAvailableTokens(messages: Message[]): number {\n return this.maxTokens - estimateConversationTokens(messages).total - this.maxOutputTokens;\n }\n\n getUsagePercent(messages: Message[]): number {\n return estimateConversationTokens(messages).total / this.maxTokens;\n }\n}\n","import type { PermissionConfig } from \"../types.js\";\n\nexport interface PermissionResult {\n allowed: boolean;\n reason?: string;\n}\n\nfunction matchPattern(pattern: string, toolName: string): boolean {\n if (!pattern.includes(\"*\")) {\n return pattern === toolName;\n }\n const escaped = pattern.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\*/g, \".*\");\n const regex = new RegExp(`^${escaped}$`);\n return regex.test(toolName);\n}\n\nexport class PermissionEngine {\n private allowedPatterns: string[];\n private deniedPatterns: string[];\n private askPatterns: string[];\n private defaultAction: \"allow\" | \"deny\" | \"ask\";\n\n constructor(config?: PermissionConfig) {\n this.allowedPatterns = config?.allowedTools ?? [];\n this.deniedPatterns = config?.deniedTools ?? [];\n this.askPatterns = config?.askTools ?? [];\n this.defaultAction = config?.defaultAction ?? \"allow\";\n }\n\n check(toolName: string, _input?: Record<string, unknown>): PermissionResult {\n for (const pattern of this.deniedPatterns) {\n if (matchPattern(pattern, toolName)) {\n return { allowed: false, reason: `Tool '${toolName}' matches denied pattern '${pattern}'` };\n }\n }\n\n for (const pattern of this.allowedPatterns) {\n if (matchPattern(pattern, toolName)) {\n return { allowed: true };\n }\n }\n\n for (const pattern of this.askPatterns) {\n if (matchPattern(pattern, toolName)) {\n return { allowed: false, reason: \"ask\" };\n }\n }\n\n if (this.defaultAction === \"deny\") {\n return { allowed: false, reason: `Tool '${toolName}' not explicitly allowed` };\n }\n\n if (this.defaultAction === \"ask\") {\n return { allowed: false, reason: \"ask\" };\n }\n\n return { allowed: true };\n }\n\n addAllowed(pattern: string): void {\n this.allowedPatterns.push(pattern);\n }\n\n addDenied(pattern: string): void {\n this.deniedPatterns.push(pattern);\n }\n\n addAsk(pattern: string): void {\n this.askPatterns.push(pattern);\n }\n}\n","export interface CostRecord {\n model: string;\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n cacheWriteTokens: number;\n inputCost: number;\n outputCost: number;\n timestamp: number;\n turn: number;\n toolName?: string;\n}\n\nexport interface ModelPricing {\n inputCostPer1k: number;\n outputCostPer1k: number;\n}\n\nexport const DEFAULT_PRICING: Record<string, ModelPricing> = {\n \"claude-sonnet-4-20250514\": { inputCostPer1k: 0.003, outputCostPer1k: 0.015 },\n \"claude-3-5-sonnet-20241022\": { inputCostPer1k: 0.003, outputCostPer1k: 0.015 },\n \"claude-3-5-haiku-20241022\": { inputCostPer1k: 0.0008, outputCostPer1k: 0.004 },\n \"claude-opus-4-20250514\": { inputCostPer1k: 0.015, outputCostPer1k: 0.075 },\n \"gpt-4o\": { inputCostPer1k: 0.0025, outputCostPer1k: 0.01 },\n \"gpt-4o-mini\": { inputCostPer1k: 0.00015, outputCostPer1k: 0.0006 },\n \"gpt-4-turbo\": { inputCostPer1k: 0.01, outputCostPer1k: 0.03 },\n};\n\nexport class CostTracker {\n private records: CostRecord[] = [];\n private pricing: Record<string, ModelPricing>;\n\n constructor(customPricing?: Record<string, ModelPricing>) {\n this.pricing = { ...DEFAULT_PRICING, ...customPricing };\n }\n\n record(\n model: string,\n usage: { inputTokens: number; outputTokens: number; cacheReadTokens?: number; cacheWriteTokens?: number },\n turn: number,\n toolName?: string,\n ): void {\n const pricing = this.pricing[model] ?? { inputCostPer1k: 0.001, outputCostPer1k: 0.003 };\n this.records.push({\n model,\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n cacheReadTokens: usage.cacheReadTokens ?? 0,\n cacheWriteTokens: usage.cacheWriteTokens ?? 0,\n inputCost: (usage.inputTokens / 1000) * pricing.inputCostPer1k,\n outputCost: (usage.outputTokens / 1000) * pricing.outputCostPer1k,\n timestamp: Date.now(),\n turn,\n toolName,\n });\n }\n\n getTotal(): {\n cost: number;\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n cacheWriteTokens: number;\n } {\n let cost = 0;\n let input = 0;\n let output = 0;\n let cacheRead = 0;\n let cacheWrite = 0;\n for (const r of this.records) {\n cost += r.inputCost + r.outputCost;\n input += r.inputTokens;\n output += r.outputTokens;\n cacheRead += r.cacheReadTokens;\n cacheWrite += r.cacheWriteTokens;\n }\n return { cost, inputTokens: input, outputTokens: output, cacheReadTokens: cacheRead, cacheWriteTokens: cacheWrite };\n }\n\n getByModel(): Record<string, { cost: number; calls: number }> {\n const byModel: Record<string, { cost: number; calls: number }> = {};\n for (const r of this.records) {\n if (!byModel[r.model]) byModel[r.model] = { cost: 0, calls: 0 };\n byModel[r.model].cost += r.inputCost + r.outputCost;\n byModel[r.model].calls++;\n }\n return byModel;\n }\n\n getByTool(): Record<string, { cost: number; calls: number }> {\n const byTool: Record<string, { cost: number; calls: number }> = {};\n for (const r of this.records) {\n const key = r.toolName ?? \"llm\";\n if (!byTool[key]) byTool[key] = { cost: 0, calls: 0 };\n byTool[key].cost += r.inputCost + r.outputCost;\n byTool[key].calls++;\n }\n return byTool;\n }\n\n getRecords(): CostRecord[] {\n return [...this.records];\n }\n\n reset(): void {\n this.records = [];\n }\n\n setPricing(model: string, pricing: ModelPricing): void {\n this.pricing[model] = pricing;\n }\n}\n","import type { Message, LoopEvent, AgentConfig, PermissionConfig } from \"./types.js\";\nimport { DEFAULT_MAX_TURNS, DEFAULT_CONTEXT_WINDOW, DEFAULT_MAX_OUTPUT_TOKENS, DEFAULT_COMPACT_THRESHOLD } from \"./types.js\";\nimport { agentLoop } from \"./loop.js\";\nimport { ToolRegistry } from \"./tools/registry.js\";\nimport { defineTool } from \"./tools/tool.js\";\nimport type { Tool } from \"./tools/tool.js\";\nimport { ContextManager } from \"./context/manager.js\";\nimport { PermissionEngine } from \"./permissions/engine.js\";\nimport type { Provider } from \"./llm/provider.js\";\nimport type { AgentHooks } from \"./hooks.js\";\nimport { HookRunner } from \"./hooks.js\";\nimport type { MemoryStore } from \"./memory/store.js\";\nimport type { CostTracker } from \"./cost/tracker.js\";\nimport { CostTracker as CostTrackerImpl } from \"./cost/tracker.js\";\n\nexport interface AgentConfigV2 extends AgentConfig {\n hooks?: AgentHooks;\n memory?: MemoryStore;\n threadId?: string;\n costTracker?: CostTracker;\n title?: string;\n disableTitle?: boolean;\n}\n\nexport class Agent {\n private model: Provider;\n private tools: ToolRegistry;\n private systemPrompt: string;\n private maxTurns: number;\n private contextManager: ContextManager;\n private permissionEngine: PermissionEngine;\n private permissionConfig?: PermissionConfig;\n private cwd: string;\n private maxRetries: number;\n private messages: Message[] = [];\n private hooks?: AgentHooks;\n private memory?: MemoryStore;\n private threadId?: string;\n private costTracker: CostTracker;\n private _loaded = false;\n private _title?: string;\n private _titleFetched = false;\n private _disableTitle = false;\n\n constructor(config: AgentConfig | AgentConfigV2) {\n this.model = config.model;\n this.tools = new ToolRegistry(config.tools ?? []);\n this.systemPrompt = config.systemPrompt ?? \"\";\n this.maxTurns = config.maxTurns ?? DEFAULT_MAX_TURNS;\n this.contextManager = new ContextManager({\n maxTokens: config.context?.maxTokens ?? DEFAULT_CONTEXT_WINDOW,\n maxOutputTokens: config.context?.maxOutputTokens ?? DEFAULT_MAX_OUTPUT_TOKENS,\n compactThreshold: config.context?.compactThreshold ?? DEFAULT_COMPACT_THRESHOLD,\n });\n this.permissionEngine = new PermissionEngine(config.permissions);\n this.permissionConfig = config.permissions;\n this.cwd = config.cwd ?? process.cwd();\n this.maxRetries = config.maxRetries ?? 5;\n\n const v2 = config as AgentConfigV2;\n this.hooks = v2.hooks;\n this.memory = v2.memory;\n this.threadId = v2.threadId;\n this.costTracker = v2.costTracker ?? new CostTrackerImpl();\n this._title = v2.title;\n this._disableTitle = v2.disableTitle ?? false;\n }\n\n addTool(tool: Tool): void {\n this.tools.add(tool);\n }\n\n addMessage(message: Message): void {\n this.messages.push(message);\n }\n\n reset(): void {\n this.messages = [];\n this._titleFetched = false;\n }\n\n getMessages(): Message[] {\n return [...this.messages];\n }\n\n getCostTracker(): CostTracker {\n return this.costTracker;\n }\n\n get title(): string | undefined {\n return this._title;\n }\n\n private async loadMemory(): Promise<void> {\n if (this._loaded || !this.memory || !this.threadId) return;\n const stored = await this.memory.getThread(this.threadId);\n if (stored.length > 0) {\n this.messages = stored;\n }\n this._loaded = true;\n }\n\n private async saveMemory(): Promise<void> {\n if (!this.memory || !this.threadId) return;\n await this.memory.saveThread(this.threadId, this.messages);\n }\n\n fork(newThreadId?: string): Agent {\n const forked = new Agent({\n model: this.model,\n tools: this.tools.getAll(),\n systemPrompt: this.systemPrompt,\n maxTurns: this.maxTurns,\n cwd: this.cwd,\n maxRetries: this.maxRetries,\n permissions: this.permissionConfig,\n hooks: this.hooks,\n memory: this.memory,\n threadId: newThreadId,\n costTracker: this.costTracker,\n title: this._title,\n context: {\n maxTokens: this.contextManager.maxTokens,\n maxOutputTokens: this.contextManager.maxOutputTokens,\n compactThreshold: this.contextManager.compactThreshold,\n },\n });\n forked.messages = [...this.messages];\n return forked;\n }\n\n async *run(prompt: string, options?: { abortSignal?: AbortSignal }): AsyncGenerator<LoopEvent> {\n await this.loadMemory();\n const loopMessages = [...this.messages, { role: \"user\" as const, content: prompt }];\n\n if (!this._titleFetched && this.messages.length === 0 && !this._disableTitle) {\n this._titleFetched = true;\n this.generateTitle(prompt).catch(() => {});\n }\n\n const loop = agentLoop({\n model: this.model,\n tools: this.tools,\n messages: loopMessages,\n systemPrompt: this.systemPrompt || undefined,\n maxTurns: this.maxTurns,\n contextManager: this.contextManager,\n permissionEngine: this.permissionEngine,\n cwd: this.cwd,\n abortSignal: options?.abortSignal,\n maxRetries: this.maxRetries,\n hooks: this.hooks,\n costTracker: this.costTracker,\n });\n\n const finalMessages: Message[] = [];\n for await (const event of loop) {\n yield event;\n if (event.type === \"done\") {\n finalMessages.length = 0;\n finalMessages.push(...event.messages);\n }\n }\n\n if (finalMessages.length > 0) {\n this.messages = finalMessages;\n await this.saveMemory();\n }\n }\n\n async chat(prompt: string, options?: { abortSignal?: AbortSignal }): Promise<{\n text: string;\n usage: { inputTokens: number; outputTokens: number };\n messages: Message[];\n cost: number;\n }> {\n let text = \"\";\n let usage = { inputTokens: 0, outputTokens: 0 };\n\n for await (const event of this.run(prompt, options)) {\n if (event.type === \"text\") {\n text += event.text;\n }\n if (event.type === \"done\") {\n usage = {\n inputTokens: event.usage.inputTokens,\n outputTokens: event.usage.outputTokens,\n };\n }\n }\n\n const total = this.costTracker.getTotal();\n return { text, usage, messages: this.getMessages(), cost: total.cost };\n }\n\n async structured<T>(\n prompt: string,\n schema: { safeParse: (data: unknown) => { success: boolean; data?: T; error?: { issues: Array<{ path: (string | number)[]; message: string }> } } },\n options?: { abortSignal?: AbortSignal; maxRetries?: number },\n ): Promise<T> {\n const maxRetries = options?.maxRetries ?? 3;\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n const currentPrompt = attempt === 0\n ? prompt\n : `${prompt}\\n\\nPrevious attempt returned invalid JSON. Please fix and respond with valid JSON only.`;\n\n const agent = new Agent({\n model: this.model,\n tools: [],\n systemPrompt: \"You must respond with valid JSON matching the requested schema.\",\n maxTurns: 1,\n cwd: this.cwd,\n permissions: this.permissionConfig,\n context: {\n maxTokens: this.contextManager.maxTokens,\n maxOutputTokens: this.contextManager.maxOutputTokens,\n compactThreshold: this.contextManager.compactThreshold,\n },\n costTracker: this.costTracker,\n disableTitle: true,\n } as AgentConfigV2);\n\n const result = await agent.chat(currentPrompt, options);\n const jsonMatch = result.text.match(/```(?:json)?\\s*([\\s\\S]*?)```/) ?? [null, result.text];\n const jsonStr = jsonMatch[1] ?? result.text;\n\n try {\n const parsed = JSON.parse(jsonStr);\n const validated = schema.safeParse(parsed);\n if (validated.success && validated.data !== undefined) {\n return validated.data as T;\n }\n } catch {\n continue;\n }\n }\n\n throw new Error(`Failed to get valid structured output after ${maxRetries} attempts`);\n }\n\n async structuredViaTool<T>(\n prompt: string,\n schema: { safeParse: (data: unknown) => { success: boolean; data?: T; error?: { issues: Array<{ path: (string | number)[]; message: string }> } } },\n options?: { abortSignal?: AbortSignal; maxRetries?: number },\n ): Promise<T> {\n const { z } = await import(\"zod\");\n const maxRetries = options?.maxRetries ?? 3;\n\n let captured: T | undefined;\n\n const structTool = defineTool({\n name: \"structured_output\",\n description: \"Return your final response in the required structured format.\",\n inputSchema: z.object({\n response: z.unknown().describe(\"The structured JSON response\"),\n }),\n isReadOnly: true,\n isConcurrencySafe: true,\n execute: async (input: Record<string, unknown>) => {\n captured = input.response as T;\n return \"Structured output captured.\";\n },\n });\n\n const agent = new Agent({\n model: this.model,\n tools: [structTool],\n systemPrompt: [\n this.systemPrompt,\n \"You MUST call the structured_output tool with your response. Do not return plain text.\",\n ].filter(Boolean).join(\"\\n\\n\"),\n maxTurns: 1,\n cwd: this.cwd,\n permissions: this.permissionConfig,\n context: {\n maxTokens: this.contextManager.maxTokens,\n maxOutputTokens: this.contextManager.maxOutputTokens,\n compactThreshold: this.contextManager.compactThreshold,\n },\n costTracker: this.costTracker,\n disableTitle: true,\n } as AgentConfigV2);\n\n for (let attempt = 0; attempt < maxRetries; attempt++) {\n captured = undefined;\n const currentPrompt = attempt === 0\n ? prompt\n : `${prompt}\\n\\nPrevious attempt failed validation. Fix your structured output and call the structured_output tool again.`;\n\n await agent.chat(currentPrompt, options);\n\n if (captured !== undefined) {\n const validated = schema.safeParse(captured);\n if (validated.success && validated.data !== undefined) {\n return validated.data as T;\n }\n }\n }\n\n throw new Error(`Failed to get valid structured output via tool after ${maxRetries} attempts`);\n }\n\n async asTool(options?: { allowSubAgents?: boolean; name?: string; description?: string }): Promise<Tool> {\n const { z } = await import(\"zod\");\n const allowSubAgents = options?.allowSubAgents ?? false;\n return defineTool({\n name: options?.name ?? \"delegate_agent\",\n description: options?.description ?? `Delegate a task to a sub-agent with system prompt: ${this.systemPrompt?.slice(0, 100) ?? \"none\"}`,\n inputSchema: z.object({\n prompt: z.string().describe(\"The task to delegate\"),\n }),\n isReadOnly: true,\n isConcurrencySafe: true,\n execute: async (input: Record<string, unknown>) => {\n const subAgent = this.fork();\n if (!allowSubAgents) {\n const forbiddenTools = [\"delegate_agent\", \"task\", \"todowrite\"];\n const allowed = this.tools.getAll().filter((t) => !forbiddenTools.includes(t.name));\n for (const tool of allowed) {\n subAgent.addTool(tool);\n }\n }\n const result = await subAgent.chat(input.prompt as string);\n return result.text;\n },\n });\n }\n\n private async generateTitle(prompt: string): Promise<void> {\n try {\n const firstLine = prompt.split(\"\\n\")[0].slice(0, 200);\n const titleAgent = new Agent({\n model: this.model,\n tools: [],\n systemPrompt: \"Generate a short, descriptive title (max 10 words) for a conversation that starts with this message. Return ONLY the title, nothing else.\",\n maxTurns: 1,\n cwd: this.cwd,\n costTracker: this.costTracker,\n disableTitle: true,\n } as AgentConfigV2);\n const result = await titleAgent.chat(firstLine);\n const title = result.text.trim().replace(/^[\"']|[\"']$/g, \"\").slice(0, 80);\n if (title.length > 0) {\n this._title = title;\n }\n } catch {\n this._title = prompt.slice(0, 50);\n }\n }\n}\n","import type { TokenUsage } from \"./types.js\";\n\nexport interface StreamEvent {\n type: \"text_delta\" | \"tool_use_start\" | \"tool_use_delta\" | \"tool_result\" | \"done\" | \"error\";\n text?: string;\n id?: string;\n name?: string;\n input?: string;\n output?: string;\n usage?: TokenUsage;\n error?: Error;\n}\n\nexport function createStreamAggregator() {\n let text = \"\";\n const toolCalls: Map<string, { id: string; name: string; input: string }> = new Map();\n let usage: TokenUsage | undefined;\n let stopReason: \"end_turn\" | \"tool_use\" | \"max_tokens\" = \"end_turn\";\n\n function push(event: StreamEvent): void {\n switch (event.type) {\n case \"text_delta\":\n text += event.text ?? \"\";\n break;\n case \"tool_use_start\":\n if (event.id) {\n toolCalls.set(event.id, { id: event.id, name: event.name ?? \"\", input: event.input ?? \"\" });\n }\n stopReason = \"tool_use\";\n break;\n case \"tool_use_delta\":\n if (event.id && toolCalls.has(event.id)) {\n toolCalls.get(event.id)!.input += event.input ?? \"\";\n }\n break;\n case \"done\":\n usage = event.usage;\n break;\n case \"tool_result\":\n break;\n case \"error\":\n break;\n }\n }\n\n function getResponse(): {\n text: string;\n toolCalls: { id: string; name: string; input: string }[];\n usage?: TokenUsage;\n stopReason: string;\n } {\n return { text, toolCalls: Array.from(toolCalls.values()), usage, stopReason };\n }\n\n return { push, getResponse };\n}\n"],"mappings":"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","names":["newTokens"]}
|