@claudebuddy/claudebuddy-agent-sdk 0.4.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 (223) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +501 -0
  3. package/dist/agent.d.ts +137 -0
  4. package/dist/agent.d.ts.map +1 -0
  5. package/dist/agent.js +573 -0
  6. package/dist/agent.js.map +1 -0
  7. package/dist/engine.d.ts +70 -0
  8. package/dist/engine.d.ts.map +1 -0
  9. package/dist/engine.js +552 -0
  10. package/dist/engine.js.map +1 -0
  11. package/dist/hooks.d.ts +111 -0
  12. package/dist/hooks.d.ts.map +1 -0
  13. package/dist/hooks.js +179 -0
  14. package/dist/hooks.js.map +1 -0
  15. package/dist/index.d.ts +70 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +141 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/mcp/client.d.ts +19 -0
  20. package/dist/mcp/client.d.ts.map +1 -0
  21. package/dist/mcp/client.js +126 -0
  22. package/dist/mcp/client.js.map +1 -0
  23. package/dist/providers/anthropic.d.ts +17 -0
  24. package/dist/providers/anthropic.d.ts.map +1 -0
  25. package/dist/providers/anthropic.js +47 -0
  26. package/dist/providers/anthropic.js.map +1 -0
  27. package/dist/providers/index.d.ts +20 -0
  28. package/dist/providers/index.d.ts.map +1 -0
  29. package/dist/providers/index.js +26 -0
  30. package/dist/providers/index.js.map +1 -0
  31. package/dist/providers/openai.d.ts +26 -0
  32. package/dist/providers/openai.d.ts.map +1 -0
  33. package/dist/providers/openai.js +243 -0
  34. package/dist/providers/openai.js.map +1 -0
  35. package/dist/providers/types.d.ts +84 -0
  36. package/dist/providers/types.d.ts.map +1 -0
  37. package/dist/providers/types.js +11 -0
  38. package/dist/providers/types.js.map +1 -0
  39. package/dist/sdk-mcp-server.d.ts +52 -0
  40. package/dist/sdk-mcp-server.d.ts.map +1 -0
  41. package/dist/sdk-mcp-server.js +57 -0
  42. package/dist/sdk-mcp-server.js.map +1 -0
  43. package/dist/session.d.ts +73 -0
  44. package/dist/session.d.ts.map +1 -0
  45. package/dist/session.js +159 -0
  46. package/dist/session.js.map +1 -0
  47. package/dist/skills/bundled/commit.d.ts +7 -0
  48. package/dist/skills/bundled/commit.d.ts.map +1 -0
  49. package/dist/skills/bundled/commit.js +35 -0
  50. package/dist/skills/bundled/commit.js.map +1 -0
  51. package/dist/skills/bundled/debug.d.ts +7 -0
  52. package/dist/skills/bundled/debug.d.ts.map +1 -0
  53. package/dist/skills/bundled/debug.js +46 -0
  54. package/dist/skills/bundled/debug.js.map +1 -0
  55. package/dist/skills/bundled/index.d.ts +11 -0
  56. package/dist/skills/bundled/index.d.ts.map +1 -0
  57. package/dist/skills/bundled/index.js +26 -0
  58. package/dist/skills/bundled/index.js.map +1 -0
  59. package/dist/skills/bundled/review.d.ts +7 -0
  60. package/dist/skills/bundled/review.d.ts.map +1 -0
  61. package/dist/skills/bundled/review.js +38 -0
  62. package/dist/skills/bundled/review.js.map +1 -0
  63. package/dist/skills/bundled/simplify.d.ts +8 -0
  64. package/dist/skills/bundled/simplify.d.ts.map +1 -0
  65. package/dist/skills/bundled/simplify.js +48 -0
  66. package/dist/skills/bundled/simplify.js.map +1 -0
  67. package/dist/skills/bundled/test.d.ts +7 -0
  68. package/dist/skills/bundled/test.d.ts.map +1 -0
  69. package/dist/skills/bundled/test.js +40 -0
  70. package/dist/skills/bundled/test.js.map +1 -0
  71. package/dist/skills/index.d.ts +7 -0
  72. package/dist/skills/index.d.ts.map +1 -0
  73. package/dist/skills/index.js +8 -0
  74. package/dist/skills/index.js.map +1 -0
  75. package/dist/skills/registry.d.ts +43 -0
  76. package/dist/skills/registry.d.ts.map +1 -0
  77. package/dist/skills/registry.js +111 -0
  78. package/dist/skills/registry.js.map +1 -0
  79. package/dist/skills/types.d.ts +83 -0
  80. package/dist/skills/types.d.ts.map +1 -0
  81. package/dist/skills/types.js +8 -0
  82. package/dist/skills/types.js.map +1 -0
  83. package/dist/tool-helper.d.ts +73 -0
  84. package/dist/tool-helper.d.ts.map +1 -0
  85. package/dist/tool-helper.js +86 -0
  86. package/dist/tool-helper.js.map +1 -0
  87. package/dist/tools/agent-tool.d.ts +17 -0
  88. package/dist/tools/agent-tool.d.ts.map +1 -0
  89. package/dist/tools/agent-tool.js +150 -0
  90. package/dist/tools/agent-tool.js.map +1 -0
  91. package/dist/tools/ask-user.d.ts +18 -0
  92. package/dist/tools/ask-user.d.ts.map +1 -0
  93. package/dist/tools/ask-user.js +72 -0
  94. package/dist/tools/ask-user.js.map +1 -0
  95. package/dist/tools/bash.d.ts +5 -0
  96. package/dist/tools/bash.d.ts.map +1 -0
  97. package/dist/tools/bash.js +67 -0
  98. package/dist/tools/bash.js.map +1 -0
  99. package/dist/tools/config-tool.d.ts +20 -0
  100. package/dist/tools/config-tool.d.ts.map +1 -0
  101. package/dist/tools/config-tool.js +83 -0
  102. package/dist/tools/config-tool.js.map +1 -0
  103. package/dist/tools/cron-tools.d.ts +33 -0
  104. package/dist/tools/cron-tools.d.ts.map +1 -0
  105. package/dist/tools/cron-tools.js +128 -0
  106. package/dist/tools/cron-tools.js.map +1 -0
  107. package/dist/tools/edit.d.ts +5 -0
  108. package/dist/tools/edit.d.ts.map +1 -0
  109. package/dist/tools/edit.js +70 -0
  110. package/dist/tools/edit.js.map +1 -0
  111. package/dist/tools/glob.d.ts +5 -0
  112. package/dist/tools/glob.d.ts.map +1 -0
  113. package/dist/tools/glob.js +75 -0
  114. package/dist/tools/glob.js.map +1 -0
  115. package/dist/tools/grep.d.ts +5 -0
  116. package/dist/tools/grep.d.ts.map +1 -0
  117. package/dist/tools/grep.js +168 -0
  118. package/dist/tools/grep.js.map +1 -0
  119. package/dist/tools/index.d.ts +45 -0
  120. package/dist/tools/index.d.ts.map +1 -0
  121. package/dist/tools/index.js +162 -0
  122. package/dist/tools/index.js.map +1 -0
  123. package/dist/tools/lsp-tool.d.ts +9 -0
  124. package/dist/tools/lsp-tool.d.ts.map +1 -0
  125. package/dist/tools/lsp-tool.js +137 -0
  126. package/dist/tools/lsp-tool.js.map +1 -0
  127. package/dist/tools/mcp-resource-tools.d.ts +14 -0
  128. package/dist/tools/mcp-resource-tools.d.ts.map +1 -0
  129. package/dist/tools/mcp-resource-tools.js +117 -0
  130. package/dist/tools/mcp-resource-tools.js.map +1 -0
  131. package/dist/tools/notebook-edit.d.ts +5 -0
  132. package/dist/tools/notebook-edit.d.ts.map +1 -0
  133. package/dist/tools/notebook-edit.js +85 -0
  134. package/dist/tools/notebook-edit.js.map +1 -0
  135. package/dist/tools/plan-tools.d.ts +12 -0
  136. package/dist/tools/plan-tools.d.ts.map +1 -0
  137. package/dist/tools/plan-tools.js +77 -0
  138. package/dist/tools/plan-tools.js.map +1 -0
  139. package/dist/tools/read.d.ts +5 -0
  140. package/dist/tools/read.d.ts.map +1 -0
  141. package/dist/tools/read.js +66 -0
  142. package/dist/tools/read.js.map +1 -0
  143. package/dist/tools/send-message.d.ts +31 -0
  144. package/dist/tools/send-message.d.ts.map +1 -0
  145. package/dist/tools/send-message.js +77 -0
  146. package/dist/tools/send-message.js.map +1 -0
  147. package/dist/tools/skill-tool.d.ts +9 -0
  148. package/dist/tools/skill-tool.d.ts.map +1 -0
  149. package/dist/tools/skill-tool.js +115 -0
  150. package/dist/tools/skill-tool.js.map +1 -0
  151. package/dist/tools/task-tools.d.ts +48 -0
  152. package/dist/tools/task-tools.d.ts.map +1 -0
  153. package/dist/tools/task-tools.js +242 -0
  154. package/dist/tools/task-tools.js.map +1 -0
  155. package/dist/tools/team-tools.d.ts +34 -0
  156. package/dist/tools/team-tools.d.ts.map +1 -0
  157. package/dist/tools/team-tools.js +103 -0
  158. package/dist/tools/team-tools.js.map +1 -0
  159. package/dist/tools/todo-tool.d.ts +22 -0
  160. package/dist/tools/todo-tool.d.ts.map +1 -0
  161. package/dist/tools/todo-tool.js +93 -0
  162. package/dist/tools/todo-tool.js.map +1 -0
  163. package/dist/tools/tool-search.d.ts +13 -0
  164. package/dist/tools/tool-search.d.ts.map +1 -0
  165. package/dist/tools/tool-search.js +76 -0
  166. package/dist/tools/tool-search.js.map +1 -0
  167. package/dist/tools/types.d.ts +29 -0
  168. package/dist/tools/types.d.ts.map +1 -0
  169. package/dist/tools/types.js +52 -0
  170. package/dist/tools/types.js.map +1 -0
  171. package/dist/tools/update-goal.d.ts +38 -0
  172. package/dist/tools/update-goal.d.ts.map +1 -0
  173. package/dist/tools/update-goal.js +109 -0
  174. package/dist/tools/update-goal.js.map +1 -0
  175. package/dist/tools/web-fetch.d.ts +5 -0
  176. package/dist/tools/web-fetch.d.ts.map +1 -0
  177. package/dist/tools/web-fetch.js +60 -0
  178. package/dist/tools/web-fetch.js.map +1 -0
  179. package/dist/tools/web-search.d.ts +5 -0
  180. package/dist/tools/web-search.d.ts.map +1 -0
  181. package/dist/tools/web-search.js +77 -0
  182. package/dist/tools/web-search.js.map +1 -0
  183. package/dist/tools/worktree-tools.d.ts +10 -0
  184. package/dist/tools/worktree-tools.d.ts.map +1 -0
  185. package/dist/tools/worktree-tools.js +130 -0
  186. package/dist/tools/worktree-tools.js.map +1 -0
  187. package/dist/tools/write.d.ts +5 -0
  188. package/dist/tools/write.d.ts.map +1 -0
  189. package/dist/tools/write.js +40 -0
  190. package/dist/tools/write.js.map +1 -0
  191. package/dist/types.d.ts +485 -0
  192. package/dist/types.d.ts.map +1 -0
  193. package/dist/types.js +5 -0
  194. package/dist/types.js.map +1 -0
  195. package/dist/utils/compact.d.ts +44 -0
  196. package/dist/utils/compact.d.ts.map +1 -0
  197. package/dist/utils/compact.js +162 -0
  198. package/dist/utils/compact.js.map +1 -0
  199. package/dist/utils/context.d.ts +35 -0
  200. package/dist/utils/context.d.ts.map +1 -0
  201. package/dist/utils/context.js +174 -0
  202. package/dist/utils/context.js.map +1 -0
  203. package/dist/utils/fileCache.d.ts +64 -0
  204. package/dist/utils/fileCache.d.ts.map +1 -0
  205. package/dist/utils/fileCache.js +117 -0
  206. package/dist/utils/fileCache.js.map +1 -0
  207. package/dist/utils/messages.d.ts +57 -0
  208. package/dist/utils/messages.d.ts.map +1 -0
  209. package/dist/utils/messages.js +152 -0
  210. package/dist/utils/messages.js.map +1 -0
  211. package/dist/utils/retry.d.ts +48 -0
  212. package/dist/utils/retry.d.ts.map +1 -0
  213. package/dist/utils/retry.js +111 -0
  214. package/dist/utils/retry.js.map +1 -0
  215. package/dist/utils/spill.d.ts +100 -0
  216. package/dist/utils/spill.d.ts.map +1 -0
  217. package/dist/utils/spill.js +126 -0
  218. package/dist/utils/spill.js.map +1 -0
  219. package/dist/utils/tokens.d.ts +60 -0
  220. package/dist/utils/tokens.d.ts.map +1 -0
  221. package/dist/utils/tokens.js +140 -0
  222. package/dist/utils/tokens.js.map +1 -0
  223. package/package.json +71 -0
package/dist/engine.js ADDED
@@ -0,0 +1,552 @@
1
+ /**
2
+ * QueryEngine - Core agentic loop
3
+ *
4
+ * Manages the full conversation lifecycle:
5
+ * 1. Take user prompt
6
+ * 2. Build system prompt with context (git status, project context, tools)
7
+ * 3. Call LLM API with tools (via provider abstraction)
8
+ * 4. Stream response
9
+ * 5. Execute tool calls (concurrent for read-only, serial for mutations)
10
+ * 6. Send results back, repeat until done
11
+ * 7. Auto-compact when context exceeds threshold
12
+ * 8. Retry with exponential backoff on transient errors
13
+ */
14
+ import { estimateCost, } from './utils/tokens.js';
15
+ import { shouldAutoCompact, compactConversation, microCompactMessages, createAutoCompactState, } from './utils/compact.js';
16
+ import { withRetry, isPromptTooLongError, } from './utils/retry.js';
17
+ import { getSystemContext, getUserContext } from './utils/context.js';
18
+ import { normalizeMessagesForAPI } from './utils/messages.js';
19
+ import { SpillStore, applySpillPolicy, shouldNeverSpill, } from './utils/spill.js';
20
+ // ============================================================================
21
+ // Tool format conversion
22
+ // ============================================================================
23
+ /** Convert a ToolDefinition to the normalized provider tool format. */
24
+ function toProviderTool(tool) {
25
+ return {
26
+ name: tool.name,
27
+ description: tool.description,
28
+ input_schema: tool.inputSchema,
29
+ };
30
+ }
31
+ // ============================================================================
32
+ // System Prompt Builder
33
+ // ============================================================================
34
+ async function buildSystemPrompt(config) {
35
+ if (config.systemPrompt) {
36
+ const base = config.systemPrompt;
37
+ return config.appendSystemPrompt
38
+ ? base + '\n\n' + config.appendSystemPrompt
39
+ : base;
40
+ }
41
+ const parts = [];
42
+ parts.push('You are an AI assistant with access to tools. Use the tools provided to help the user accomplish their tasks.', 'You should use tools when they would help you complete the task more accurately or efficiently.');
43
+ // List available tools with descriptions
44
+ parts.push('\n# Available Tools\n');
45
+ for (const tool of config.tools) {
46
+ parts.push(`- **${tool.name}**: ${tool.description}`);
47
+ }
48
+ // Add agent definitions
49
+ if (config.agents && Object.keys(config.agents).length > 0) {
50
+ parts.push('\n# Available Subagents\n');
51
+ for (const [name, def] of Object.entries(config.agents)) {
52
+ parts.push(`- **${name}**: ${def.description}`);
53
+ }
54
+ }
55
+ // System context (git status, etc.)
56
+ try {
57
+ const sysCtx = await getSystemContext(config.cwd);
58
+ if (sysCtx) {
59
+ parts.push('\n# Environment\n');
60
+ parts.push(sysCtx);
61
+ }
62
+ }
63
+ catch {
64
+ // Context is best-effort
65
+ }
66
+ // User context (AGENT.md, date)
67
+ try {
68
+ const userCtx = await getUserContext(config.cwd);
69
+ if (userCtx) {
70
+ parts.push('\n# Project Context\n');
71
+ parts.push(userCtx);
72
+ }
73
+ }
74
+ catch {
75
+ // Context is best-effort
76
+ }
77
+ // Working directory
78
+ parts.push(`\n# Working Directory\n${config.cwd}`);
79
+ if (config.appendSystemPrompt) {
80
+ parts.push('\n' + config.appendSystemPrompt);
81
+ }
82
+ return parts.join('\n');
83
+ }
84
+ // ============================================================================
85
+ // QueryEngine
86
+ // ============================================================================
87
+ export class QueryEngine {
88
+ config;
89
+ provider;
90
+ messages = [];
91
+ totalUsage = { input_tokens: 0, output_tokens: 0 };
92
+ totalCost = 0;
93
+ turnCount = 0;
94
+ compactState;
95
+ sessionId;
96
+ apiTimeMs = 0;
97
+ hookRegistry;
98
+ spillStore;
99
+ constructor(config) {
100
+ this.config = config;
101
+ this.provider = config.provider;
102
+ this.compactState = createAutoCompactState();
103
+ this.sessionId = config.sessionId || crypto.randomUUID();
104
+ this.hookRegistry = config.hookRegistry;
105
+ if (config.spill) {
106
+ this.spillStore = new SpillStore({ spillDir: config.spill.spillDir });
107
+ }
108
+ }
109
+ /**
110
+ * Execute hooks for a lifecycle event.
111
+ * Returns hook outputs; never throws.
112
+ */
113
+ async executeHooks(event, extra) {
114
+ if (!this.hookRegistry?.hasHooks(event))
115
+ return [];
116
+ try {
117
+ return await this.hookRegistry.execute(event, {
118
+ event,
119
+ sessionId: this.sessionId,
120
+ cwd: this.config.cwd,
121
+ ...extra,
122
+ });
123
+ }
124
+ catch {
125
+ return [];
126
+ }
127
+ }
128
+ /**
129
+ * Submit a user message and run the agentic loop.
130
+ * Yields SDKMessage events as the agent works.
131
+ */
132
+ async *submitMessage(prompt) {
133
+ // Hook: SessionStart
134
+ await this.executeHooks('SessionStart');
135
+ // Hook: UserPromptSubmit
136
+ const userHookResults = await this.executeHooks('UserPromptSubmit', {
137
+ toolInput: prompt,
138
+ });
139
+ // Check if any hook blocks the submission
140
+ if (userHookResults.some((r) => r.block)) {
141
+ yield {
142
+ type: 'result',
143
+ subtype: 'error_during_execution',
144
+ is_error: true,
145
+ usage: this.totalUsage,
146
+ num_turns: 0,
147
+ cost: 0,
148
+ errors: ['Blocked by UserPromptSubmit hook'],
149
+ };
150
+ return;
151
+ }
152
+ // Add user message
153
+ this.messages.push({ role: 'user', content: prompt });
154
+ // Build tool definitions for provider
155
+ const tools = this.config.tools.map(toProviderTool);
156
+ // Build system prompt
157
+ const systemPrompt = await buildSystemPrompt(this.config);
158
+ // Emit init system message
159
+ yield {
160
+ type: 'system',
161
+ subtype: 'init',
162
+ session_id: this.sessionId,
163
+ tools: this.config.tools.map(t => t.name),
164
+ model: this.config.model,
165
+ cwd: this.config.cwd,
166
+ mcp_servers: [],
167
+ permission_mode: 'bypassPermissions',
168
+ };
169
+ // Agentic loop
170
+ let turnsRemaining = this.config.maxTurns;
171
+ let budgetExceeded = false;
172
+ let maxOutputRecoveryAttempts = 0;
173
+ const MAX_OUTPUT_RECOVERY = 3;
174
+ while (turnsRemaining > 0) {
175
+ if (this.config.abortSignal?.aborted)
176
+ break;
177
+ // Check budget
178
+ if (this.config.maxBudgetUsd && this.totalCost >= this.config.maxBudgetUsd) {
179
+ budgetExceeded = true;
180
+ break;
181
+ }
182
+ // Auto-compact if context is too large
183
+ if (shouldAutoCompact(this.messages, this.config.model, this.compactState, this.config.contextWindowSize)) {
184
+ await this.executeHooks('PreCompact');
185
+ try {
186
+ const result = await compactConversation(this.provider, this.config.model, this.messages, this.compactState);
187
+ this.messages = result.compactedMessages;
188
+ this.compactState = result.state;
189
+ await this.executeHooks('PostCompact');
190
+ }
191
+ catch {
192
+ // Continue with uncompacted messages
193
+ }
194
+ }
195
+ // Micro-compact: truncate large tool results
196
+ const apiMessages = microCompactMessages(normalizeMessagesForAPI(this.messages));
197
+ this.turnCount++;
198
+ turnsRemaining--;
199
+ // Make API call with retry via provider
200
+ let response;
201
+ const apiStart = performance.now();
202
+ try {
203
+ response = await withRetry(async () => {
204
+ return this.provider.createMessage({
205
+ model: this.config.model,
206
+ maxTokens: this.config.maxTokens,
207
+ system: systemPrompt,
208
+ messages: apiMessages,
209
+ tools: tools.length > 0 ? tools : undefined,
210
+ thinking: this.config.thinking?.type === 'enabled' &&
211
+ this.config.thinking.budgetTokens
212
+ ? {
213
+ type: 'enabled',
214
+ budget_tokens: this.config.thinking.budgetTokens,
215
+ }
216
+ : undefined,
217
+ });
218
+ }, undefined, this.config.abortSignal);
219
+ }
220
+ catch (err) {
221
+ // Handle prompt-too-long by compacting
222
+ if (isPromptTooLongError(err) && !this.compactState.compacted) {
223
+ try {
224
+ const result = await compactConversation(this.provider, this.config.model, this.messages, this.compactState);
225
+ this.messages = result.compactedMessages;
226
+ this.compactState = result.state;
227
+ turnsRemaining++; // Retry this turn
228
+ this.turnCount--;
229
+ continue;
230
+ }
231
+ catch {
232
+ // Can't compact, give up
233
+ }
234
+ }
235
+ const message = err?.message ? String(err.message) : String(err);
236
+ yield {
237
+ type: 'result',
238
+ subtype: 'error',
239
+ usage: this.totalUsage,
240
+ num_turns: this.turnCount,
241
+ cost: this.totalCost,
242
+ errors: [message],
243
+ };
244
+ return;
245
+ }
246
+ // Track API timing
247
+ this.apiTimeMs += performance.now() - apiStart;
248
+ // Track usage (normalized by provider)
249
+ if (response.usage) {
250
+ this.totalUsage.input_tokens += response.usage.input_tokens;
251
+ this.totalUsage.output_tokens += response.usage.output_tokens;
252
+ if (response.usage.cache_creation_input_tokens) {
253
+ this.totalUsage.cache_creation_input_tokens =
254
+ (this.totalUsage.cache_creation_input_tokens || 0) +
255
+ response.usage.cache_creation_input_tokens;
256
+ }
257
+ if (response.usage.cache_read_input_tokens) {
258
+ this.totalUsage.cache_read_input_tokens =
259
+ (this.totalUsage.cache_read_input_tokens || 0) +
260
+ response.usage.cache_read_input_tokens;
261
+ }
262
+ this.totalCost += estimateCost(this.config.model, response.usage, this.config.pricingPerMillion);
263
+ }
264
+ // Add assistant message to conversation
265
+ this.messages.push({ role: 'assistant', content: response.content });
266
+ // Yield assistant message
267
+ yield {
268
+ type: 'assistant',
269
+ message: {
270
+ role: 'assistant',
271
+ content: response.content,
272
+ },
273
+ };
274
+ // Handle max_output_tokens recovery
275
+ if (response.stopReason === 'max_tokens' &&
276
+ maxOutputRecoveryAttempts < MAX_OUTPUT_RECOVERY) {
277
+ maxOutputRecoveryAttempts++;
278
+ // Add continuation prompt
279
+ this.messages.push({
280
+ role: 'user',
281
+ content: 'Please continue from where you left off.',
282
+ });
283
+ continue;
284
+ }
285
+ // Check for tool use
286
+ const toolUseBlocks = response.content.filter((block) => block.type === 'tool_use');
287
+ if (toolUseBlocks.length === 0) {
288
+ break; // No tool calls - agent is done
289
+ }
290
+ // Reset max_output recovery counter on successful tool use
291
+ maxOutputRecoveryAttempts = 0;
292
+ // Execute tools (concurrent read-only, serial mutations)
293
+ const toolResults = await this.executeTools(toolUseBlocks);
294
+ // Apply spill policy to large tool results before they enter context.
295
+ const spilled = this.spillStore ? await this.applySpillToResults(toolResults) : toolResults;
296
+ // Yield tool results
297
+ for (const result of spilled) {
298
+ yield {
299
+ type: 'tool_result',
300
+ result: {
301
+ tool_use_id: result.tool_use_id,
302
+ tool_name: result.tool_name || '',
303
+ output: typeof result.content === 'string'
304
+ ? result.content
305
+ : JSON.stringify(result.content),
306
+ },
307
+ };
308
+ }
309
+ // Add tool results to conversation
310
+ this.messages.push({
311
+ role: 'user',
312
+ content: spilled.map((r) => ({
313
+ type: 'tool_result',
314
+ tool_use_id: r.tool_use_id,
315
+ content: typeof r.content === 'string'
316
+ ? r.content
317
+ : JSON.stringify(r.content),
318
+ is_error: r.is_error,
319
+ })),
320
+ });
321
+ if (response.stopReason === 'end_turn')
322
+ break;
323
+ }
324
+ // Hook: Stop (end of agentic loop)
325
+ await this.executeHooks('Stop');
326
+ // Hook: SessionEnd
327
+ await this.executeHooks('SessionEnd');
328
+ // Yield enriched final result
329
+ const endSubtype = budgetExceeded
330
+ ? 'error_max_budget_usd'
331
+ : turnsRemaining <= 0
332
+ ? 'error_max_turns'
333
+ : 'success';
334
+ yield {
335
+ type: 'result',
336
+ subtype: endSubtype,
337
+ session_id: this.sessionId,
338
+ is_error: endSubtype !== 'success',
339
+ num_turns: this.turnCount,
340
+ total_cost_usd: this.totalCost,
341
+ duration_api_ms: Math.round(this.apiTimeMs),
342
+ usage: this.totalUsage,
343
+ model_usage: { [this.config.model]: { input_tokens: this.totalUsage.input_tokens, output_tokens: this.totalUsage.output_tokens } },
344
+ cost: this.totalCost,
345
+ };
346
+ }
347
+ /**
348
+ * Execute tool calls with concurrency control.
349
+ *
350
+ * Read-only tools run concurrently (up to 10 at a time).
351
+ * Mutation tools run sequentially.
352
+ */
353
+ async executeTools(toolUseBlocks) {
354
+ const context = {
355
+ cwd: this.config.cwd,
356
+ abortSignal: this.config.abortSignal,
357
+ provider: this.provider,
358
+ model: this.config.model,
359
+ apiType: this.provider.apiType,
360
+ };
361
+ const MAX_CONCURRENCY = parseInt(process.env.AGENT_SDK_MAX_TOOL_CONCURRENCY || '10');
362
+ // Partition into read-only (concurrent) and mutation (serial)
363
+ const readOnly = [];
364
+ const mutations = [];
365
+ for (const block of toolUseBlocks) {
366
+ const tool = this.config.tools.find((t) => t.name === block.name);
367
+ if (tool?.isReadOnly?.()) {
368
+ readOnly.push({ block, tool });
369
+ }
370
+ else {
371
+ mutations.push({ block, tool });
372
+ }
373
+ }
374
+ const results = [];
375
+ // Execute read-only tools concurrently (batched by MAX_CONCURRENCY)
376
+ for (let i = 0; i < readOnly.length; i += MAX_CONCURRENCY) {
377
+ const batch = readOnly.slice(i, i + MAX_CONCURRENCY);
378
+ const batchResults = await Promise.all(batch.map((item) => this.executeSingleTool(item.block, item.tool, context)));
379
+ results.push(...batchResults);
380
+ }
381
+ // Execute mutation tools sequentially
382
+ for (const item of mutations) {
383
+ const result = await this.executeSingleTool(item.block, item.tool, context);
384
+ results.push(result);
385
+ }
386
+ return results;
387
+ }
388
+ /**
389
+ * Apply the spill policy to each tool result that exceeds the inline cap.
390
+ * Best-effort: a spill failure leaves the original content untouched and
391
+ * never turns a success into an error. Reading tools are skipped to avoid a
392
+ * read -> spill -> read loop.
393
+ */
394
+ async applySpillToResults(results) {
395
+ const policy = this.config.spill;
396
+ if (!policy || !this.spillStore)
397
+ return results;
398
+ const out = [];
399
+ for (const result of results) {
400
+ if (result.is_error) {
401
+ out.push(result);
402
+ continue;
403
+ }
404
+ const toolName = result.tool_name || '';
405
+ // Whitelist: if enabledFor is provided and non-empty, only listed tools spill.
406
+ if (policy.enabledFor && policy.enabledFor.length > 0) {
407
+ const inWhitelist = policy.enabledFor.some((n) => toolName === n || toolName.toLowerCase().includes(n.toLowerCase()));
408
+ if (!inWhitelist) {
409
+ out.push(result);
410
+ continue;
411
+ }
412
+ }
413
+ if (shouldNeverSpill(toolName, policy.neverSpillTools)) {
414
+ out.push(result);
415
+ continue;
416
+ }
417
+ if (typeof result.content !== 'string') {
418
+ out.push(result);
419
+ continue;
420
+ }
421
+ const applied = await applySpillPolicy(result.content, this.spillStore, {
422
+ maxInlineBytes: policy.maxInlineBytes,
423
+ previewBytes: policy.previewBytes,
424
+ });
425
+ if (applied.kind === 'spill') {
426
+ // Keep the original content accessible for fidelity tools but swap the
427
+ // model-visible string to the preview + locator.
428
+ out.push({ ...result, content: applied.content });
429
+ }
430
+ else {
431
+ // keep or failed: unchanged (best-effort, never lose data)
432
+ out.push({ ...result, content: applied.content });
433
+ }
434
+ }
435
+ return out;
436
+ }
437
+ /**
438
+ * Execute a single tool with permission checking.
439
+ */
440
+ async executeSingleTool(block, tool, context) {
441
+ if (!tool) {
442
+ return {
443
+ type: 'tool_result',
444
+ tool_use_id: block.id,
445
+ content: `Error: Unknown tool "${block.name}"`,
446
+ is_error: true,
447
+ tool_name: block.name,
448
+ };
449
+ }
450
+ // Check enabled
451
+ if (tool.isEnabled && !tool.isEnabled()) {
452
+ return {
453
+ type: 'tool_result',
454
+ tool_use_id: block.id,
455
+ content: `Error: Tool "${block.name}" is not enabled`,
456
+ is_error: true,
457
+ tool_name: block.name,
458
+ };
459
+ }
460
+ // Check permissions
461
+ if (this.config.canUseTool) {
462
+ try {
463
+ const permission = await this.config.canUseTool(tool, block.input);
464
+ if (permission.behavior === 'deny') {
465
+ return {
466
+ type: 'tool_result',
467
+ tool_use_id: block.id,
468
+ content: permission.message || `Permission denied for tool "${block.name}"`,
469
+ is_error: true,
470
+ tool_name: block.name,
471
+ };
472
+ }
473
+ if (permission.updatedInput !== undefined) {
474
+ block = { ...block, input: permission.updatedInput };
475
+ }
476
+ }
477
+ catch (err) {
478
+ return {
479
+ type: 'tool_result',
480
+ tool_use_id: block.id,
481
+ content: `Permission check error: ${err.message}`,
482
+ is_error: true,
483
+ tool_name: block.name,
484
+ };
485
+ }
486
+ }
487
+ // Hook: PreToolUse
488
+ const preHookResults = await this.executeHooks('PreToolUse', {
489
+ toolName: block.name,
490
+ toolInput: block.input,
491
+ toolUseId: block.id,
492
+ });
493
+ // Check if any hook blocks this tool
494
+ if (preHookResults.some((r) => r.block)) {
495
+ const msg = preHookResults.find((r) => r.message)?.message || 'Blocked by PreToolUse hook';
496
+ return {
497
+ type: 'tool_result',
498
+ tool_use_id: block.id,
499
+ content: msg,
500
+ is_error: true,
501
+ tool_name: block.name,
502
+ };
503
+ }
504
+ // Execute the tool
505
+ try {
506
+ const result = await tool.call(block.input, context);
507
+ // Hook: PostToolUse
508
+ await this.executeHooks('PostToolUse', {
509
+ toolName: block.name,
510
+ toolInput: block.input,
511
+ toolOutput: typeof result.content === 'string' ? result.content : JSON.stringify(result.content),
512
+ toolUseId: block.id,
513
+ });
514
+ return { ...result, tool_use_id: block.id, tool_name: block.name };
515
+ }
516
+ catch (err) {
517
+ // Hook: PostToolUseFailure
518
+ await this.executeHooks('PostToolUseFailure', {
519
+ toolName: block.name,
520
+ toolInput: block.input,
521
+ toolUseId: block.id,
522
+ error: err.message,
523
+ });
524
+ return {
525
+ type: 'tool_result',
526
+ tool_use_id: block.id,
527
+ content: `Tool execution error: ${err.message}`,
528
+ is_error: true,
529
+ tool_name: block.name,
530
+ };
531
+ }
532
+ }
533
+ /**
534
+ * Get current messages for session persistence.
535
+ */
536
+ getMessages() {
537
+ return [...this.messages];
538
+ }
539
+ /**
540
+ * Get total usage across all turns.
541
+ */
542
+ getUsage() {
543
+ return { ...this.totalUsage };
544
+ }
545
+ /**
546
+ * Get total cost.
547
+ */
548
+ getCost() {
549
+ return this.totalCost;
550
+ }
551
+ }
552
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}