@codeany/open-agent-sdk 0.2.0 → 0.2.1

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 (231) hide show
  1. package/dist/agent.d.ts +113 -0
  2. package/dist/agent.d.ts.map +1 -0
  3. package/dist/agent.js +446 -0
  4. package/dist/agent.js.map +1 -0
  5. package/dist/engine.d.ts +62 -0
  6. package/dist/engine.d.ts.map +1 -0
  7. package/dist/engine.js +494 -0
  8. package/dist/engine.js.map +1 -0
  9. package/dist/hooks.d.ts +111 -0
  10. package/dist/hooks.d.ts.map +1 -0
  11. package/dist/hooks.js +179 -0
  12. package/dist/hooks.js.map +1 -0
  13. package/dist/index.d.ts +66 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +133 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/mcp/client.d.ts +19 -0
  18. package/dist/mcp/client.d.ts.map +1 -0
  19. package/dist/mcp/client.js +126 -0
  20. package/dist/mcp/client.js.map +1 -0
  21. package/dist/providers/anthropic.d.ts +17 -0
  22. package/dist/providers/anthropic.d.ts.map +1 -0
  23. package/dist/providers/anthropic.js +47 -0
  24. package/dist/providers/anthropic.js.map +1 -0
  25. package/dist/providers/index.d.ts +20 -0
  26. package/dist/providers/index.d.ts.map +1 -0
  27. package/dist/providers/index.js +26 -0
  28. package/dist/providers/index.js.map +1 -0
  29. package/dist/providers/openai.d.ts +26 -0
  30. package/dist/providers/openai.d.ts.map +1 -0
  31. package/dist/providers/openai.js +212 -0
  32. package/dist/providers/openai.js.map +1 -0
  33. package/dist/providers/types.d.ts +84 -0
  34. package/dist/providers/types.d.ts.map +1 -0
  35. package/dist/providers/types.js +11 -0
  36. package/dist/providers/types.js.map +1 -0
  37. package/dist/sdk-mcp-server.d.ts +52 -0
  38. package/dist/sdk-mcp-server.d.ts.map +1 -0
  39. package/dist/sdk-mcp-server.js +57 -0
  40. package/dist/sdk-mcp-server.js.map +1 -0
  41. package/dist/session.d.ts +73 -0
  42. package/dist/session.d.ts.map +1 -0
  43. package/dist/session.js +159 -0
  44. package/dist/session.js.map +1 -0
  45. package/dist/skills/bundled/commit.d.ts +7 -0
  46. package/dist/skills/bundled/commit.d.ts.map +1 -0
  47. package/dist/skills/bundled/commit.js +35 -0
  48. package/dist/skills/bundled/commit.js.map +1 -0
  49. package/dist/skills/bundled/debug.d.ts +7 -0
  50. package/dist/skills/bundled/debug.d.ts.map +1 -0
  51. package/dist/skills/bundled/debug.js +46 -0
  52. package/dist/skills/bundled/debug.js.map +1 -0
  53. package/dist/skills/bundled/index.d.ts +11 -0
  54. package/dist/skills/bundled/index.d.ts.map +1 -0
  55. package/dist/skills/bundled/index.js +26 -0
  56. package/dist/skills/bundled/index.js.map +1 -0
  57. package/dist/skills/bundled/review.d.ts +7 -0
  58. package/dist/skills/bundled/review.d.ts.map +1 -0
  59. package/dist/skills/bundled/review.js +38 -0
  60. package/dist/skills/bundled/review.js.map +1 -0
  61. package/dist/skills/bundled/simplify.d.ts +8 -0
  62. package/dist/skills/bundled/simplify.d.ts.map +1 -0
  63. package/dist/skills/bundled/simplify.js +48 -0
  64. package/dist/skills/bundled/simplify.js.map +1 -0
  65. package/dist/skills/bundled/test.d.ts +7 -0
  66. package/dist/skills/bundled/test.d.ts.map +1 -0
  67. package/dist/skills/bundled/test.js +40 -0
  68. package/dist/skills/bundled/test.js.map +1 -0
  69. package/dist/skills/index.d.ts +7 -0
  70. package/dist/skills/index.d.ts.map +1 -0
  71. package/dist/skills/index.js +8 -0
  72. package/dist/skills/index.js.map +1 -0
  73. package/dist/skills/registry.d.ts +43 -0
  74. package/dist/skills/registry.d.ts.map +1 -0
  75. package/dist/skills/registry.js +111 -0
  76. package/dist/skills/registry.js.map +1 -0
  77. package/dist/skills/types.d.ts +83 -0
  78. package/dist/skills/types.d.ts.map +1 -0
  79. package/dist/skills/types.js +8 -0
  80. package/dist/skills/types.js.map +1 -0
  81. package/dist/tool-helper.d.ts +73 -0
  82. package/dist/tool-helper.d.ts.map +1 -0
  83. package/dist/tool-helper.js +86 -0
  84. package/dist/tool-helper.js.map +1 -0
  85. package/dist/tools/agent-tool.d.ts +17 -0
  86. package/dist/tools/agent-tool.d.ts.map +1 -0
  87. package/dist/tools/agent-tool.js +146 -0
  88. package/dist/tools/agent-tool.js.map +1 -0
  89. package/dist/tools/ask-user.d.ts +18 -0
  90. package/dist/tools/ask-user.d.ts.map +1 -0
  91. package/dist/tools/ask-user.js +72 -0
  92. package/dist/tools/ask-user.js.map +1 -0
  93. package/dist/tools/bash.d.ts +5 -0
  94. package/dist/tools/bash.d.ts.map +1 -0
  95. package/dist/tools/bash.js +67 -0
  96. package/dist/tools/bash.js.map +1 -0
  97. package/dist/tools/config-tool.d.ts +20 -0
  98. package/dist/tools/config-tool.d.ts.map +1 -0
  99. package/dist/tools/config-tool.js +83 -0
  100. package/dist/tools/config-tool.js.map +1 -0
  101. package/dist/tools/cron-tools.d.ts +33 -0
  102. package/dist/tools/cron-tools.d.ts.map +1 -0
  103. package/dist/tools/cron-tools.js +128 -0
  104. package/dist/tools/cron-tools.js.map +1 -0
  105. package/dist/tools/edit.d.ts +5 -0
  106. package/dist/tools/edit.d.ts.map +1 -0
  107. package/dist/tools/edit.js +70 -0
  108. package/dist/tools/edit.js.map +1 -0
  109. package/dist/tools/glob.d.ts +5 -0
  110. package/dist/tools/glob.d.ts.map +1 -0
  111. package/dist/tools/glob.js +75 -0
  112. package/dist/tools/glob.js.map +1 -0
  113. package/dist/tools/grep.d.ts +5 -0
  114. package/dist/tools/grep.d.ts.map +1 -0
  115. package/dist/tools/grep.js +168 -0
  116. package/dist/tools/grep.js.map +1 -0
  117. package/dist/tools/index.d.ts +45 -0
  118. package/dist/tools/index.d.ts.map +1 -0
  119. package/dist/tools/index.js +162 -0
  120. package/dist/tools/index.js.map +1 -0
  121. package/dist/tools/lsp-tool.d.ts +9 -0
  122. package/dist/tools/lsp-tool.d.ts.map +1 -0
  123. package/dist/tools/lsp-tool.js +137 -0
  124. package/dist/tools/lsp-tool.js.map +1 -0
  125. package/dist/tools/mcp-resource-tools.d.ts +14 -0
  126. package/dist/tools/mcp-resource-tools.d.ts.map +1 -0
  127. package/dist/tools/mcp-resource-tools.js +117 -0
  128. package/dist/tools/mcp-resource-tools.js.map +1 -0
  129. package/dist/tools/notebook-edit.d.ts +5 -0
  130. package/dist/tools/notebook-edit.d.ts.map +1 -0
  131. package/dist/tools/notebook-edit.js +85 -0
  132. package/dist/tools/notebook-edit.js.map +1 -0
  133. package/dist/tools/plan-tools.d.ts +12 -0
  134. package/dist/tools/plan-tools.d.ts.map +1 -0
  135. package/dist/tools/plan-tools.js +77 -0
  136. package/dist/tools/plan-tools.js.map +1 -0
  137. package/dist/tools/read.d.ts +5 -0
  138. package/dist/tools/read.d.ts.map +1 -0
  139. package/dist/tools/read.js +66 -0
  140. package/dist/tools/read.js.map +1 -0
  141. package/dist/tools/send-message.d.ts +31 -0
  142. package/dist/tools/send-message.d.ts.map +1 -0
  143. package/dist/tools/send-message.js +77 -0
  144. package/dist/tools/send-message.js.map +1 -0
  145. package/dist/tools/skill-tool.d.ts +9 -0
  146. package/dist/tools/skill-tool.d.ts.map +1 -0
  147. package/dist/tools/skill-tool.js +115 -0
  148. package/dist/tools/skill-tool.js.map +1 -0
  149. package/dist/tools/task-tools.d.ts +48 -0
  150. package/dist/tools/task-tools.d.ts.map +1 -0
  151. package/dist/tools/task-tools.js +242 -0
  152. package/dist/tools/task-tools.js.map +1 -0
  153. package/dist/tools/team-tools.d.ts +34 -0
  154. package/dist/tools/team-tools.d.ts.map +1 -0
  155. package/dist/tools/team-tools.js +103 -0
  156. package/dist/tools/team-tools.js.map +1 -0
  157. package/dist/tools/todo-tool.d.ts +22 -0
  158. package/dist/tools/todo-tool.d.ts.map +1 -0
  159. package/dist/tools/todo-tool.js +93 -0
  160. package/dist/tools/todo-tool.js.map +1 -0
  161. package/dist/tools/tool-search.d.ts +13 -0
  162. package/dist/tools/tool-search.d.ts.map +1 -0
  163. package/dist/tools/tool-search.js +76 -0
  164. package/dist/tools/tool-search.js.map +1 -0
  165. package/dist/tools/types.d.ts +29 -0
  166. package/dist/tools/types.d.ts.map +1 -0
  167. package/dist/tools/types.js +52 -0
  168. package/dist/tools/types.js.map +1 -0
  169. package/dist/tools/web-fetch.d.ts +5 -0
  170. package/dist/tools/web-fetch.d.ts.map +1 -0
  171. package/dist/tools/web-fetch.js +60 -0
  172. package/dist/tools/web-fetch.js.map +1 -0
  173. package/dist/tools/web-search.d.ts +5 -0
  174. package/dist/tools/web-search.d.ts.map +1 -0
  175. package/dist/tools/web-search.js +77 -0
  176. package/dist/tools/web-search.js.map +1 -0
  177. package/dist/tools/worktree-tools.d.ts +10 -0
  178. package/dist/tools/worktree-tools.d.ts.map +1 -0
  179. package/dist/tools/worktree-tools.js +130 -0
  180. package/dist/tools/worktree-tools.js.map +1 -0
  181. package/dist/tools/write.d.ts +5 -0
  182. package/dist/tools/write.d.ts.map +1 -0
  183. package/dist/tools/write.js +40 -0
  184. package/dist/tools/write.js.map +1 -0
  185. package/dist/types.d.ts +423 -0
  186. package/dist/types.d.ts.map +1 -0
  187. package/dist/types.js +5 -0
  188. package/dist/types.js.map +1 -0
  189. package/dist/utils/compact.d.ts +44 -0
  190. package/dist/utils/compact.d.ts.map +1 -0
  191. package/dist/utils/compact.js +162 -0
  192. package/dist/utils/compact.js.map +1 -0
  193. package/dist/utils/context.d.ts +35 -0
  194. package/dist/utils/context.d.ts.map +1 -0
  195. package/dist/utils/context.js +174 -0
  196. package/dist/utils/context.js.map +1 -0
  197. package/dist/utils/fileCache.d.ts +64 -0
  198. package/dist/utils/fileCache.d.ts.map +1 -0
  199. package/dist/utils/fileCache.js +117 -0
  200. package/dist/utils/fileCache.js.map +1 -0
  201. package/dist/utils/messages.d.ts +57 -0
  202. package/dist/utils/messages.d.ts.map +1 -0
  203. package/dist/utils/messages.js +152 -0
  204. package/dist/utils/messages.js.map +1 -0
  205. package/dist/utils/retry.d.ts +48 -0
  206. package/dist/utils/retry.d.ts.map +1 -0
  207. package/dist/utils/retry.js +111 -0
  208. package/dist/utils/retry.js.map +1 -0
  209. package/dist/utils/tokens.d.ts +57 -0
  210. package/dist/utils/tokens.d.ts.map +1 -0
  211. package/dist/utils/tokens.js +134 -0
  212. package/dist/utils/tokens.js.map +1 -0
  213. package/package.json +7 -1
  214. package/.env.example +0 -8
  215. package/examples/01-simple-query.ts +0 -43
  216. package/examples/02-multi-tool.ts +0 -44
  217. package/examples/03-multi-turn.ts +0 -39
  218. package/examples/04-prompt-api.ts +0 -29
  219. package/examples/05-custom-system-prompt.ts +0 -26
  220. package/examples/06-mcp-server.ts +0 -49
  221. package/examples/07-custom-tools.ts +0 -87
  222. package/examples/08-official-api-compat.ts +0 -38
  223. package/examples/09-subagents.ts +0 -48
  224. package/examples/10-permissions.ts +0 -40
  225. package/examples/11-custom-mcp-tools.ts +0 -101
  226. package/examples/12-skills.ts +0 -88
  227. package/examples/13-hooks.ts +0 -88
  228. package/examples/14-openai-compat.ts +0 -71
  229. package/examples/web/index.html +0 -365
  230. package/examples/web/server.ts +0 -157
  231. package/tsconfig.json +0 -19
package/dist/engine.js ADDED
@@ -0,0 +1,494 @@
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
+ // ============================================================================
20
+ // Tool format conversion
21
+ // ============================================================================
22
+ /** Convert a ToolDefinition to the normalized provider tool format. */
23
+ function toProviderTool(tool) {
24
+ return {
25
+ name: tool.name,
26
+ description: tool.description,
27
+ input_schema: tool.inputSchema,
28
+ };
29
+ }
30
+ // ============================================================================
31
+ // System Prompt Builder
32
+ // ============================================================================
33
+ async function buildSystemPrompt(config) {
34
+ if (config.systemPrompt) {
35
+ const base = config.systemPrompt;
36
+ return config.appendSystemPrompt
37
+ ? base + '\n\n' + config.appendSystemPrompt
38
+ : base;
39
+ }
40
+ const parts = [];
41
+ 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.');
42
+ // List available tools with descriptions
43
+ parts.push('\n# Available Tools\n');
44
+ for (const tool of config.tools) {
45
+ parts.push(`- **${tool.name}**: ${tool.description}`);
46
+ }
47
+ // Add agent definitions
48
+ if (config.agents && Object.keys(config.agents).length > 0) {
49
+ parts.push('\n# Available Subagents\n');
50
+ for (const [name, def] of Object.entries(config.agents)) {
51
+ parts.push(`- **${name}**: ${def.description}`);
52
+ }
53
+ }
54
+ // System context (git status, etc.)
55
+ try {
56
+ const sysCtx = await getSystemContext(config.cwd);
57
+ if (sysCtx) {
58
+ parts.push('\n# Environment\n');
59
+ parts.push(sysCtx);
60
+ }
61
+ }
62
+ catch {
63
+ // Context is best-effort
64
+ }
65
+ // User context (AGENT.md, date)
66
+ try {
67
+ const userCtx = await getUserContext(config.cwd);
68
+ if (userCtx) {
69
+ parts.push('\n# Project Context\n');
70
+ parts.push(userCtx);
71
+ }
72
+ }
73
+ catch {
74
+ // Context is best-effort
75
+ }
76
+ // Working directory
77
+ parts.push(`\n# Working Directory\n${config.cwd}`);
78
+ if (config.appendSystemPrompt) {
79
+ parts.push('\n' + config.appendSystemPrompt);
80
+ }
81
+ return parts.join('\n');
82
+ }
83
+ // ============================================================================
84
+ // QueryEngine
85
+ // ============================================================================
86
+ export class QueryEngine {
87
+ config;
88
+ provider;
89
+ messages = [];
90
+ totalUsage = { input_tokens: 0, output_tokens: 0 };
91
+ totalCost = 0;
92
+ turnCount = 0;
93
+ compactState;
94
+ sessionId;
95
+ apiTimeMs = 0;
96
+ hookRegistry;
97
+ constructor(config) {
98
+ this.config = config;
99
+ this.provider = config.provider;
100
+ this.compactState = createAutoCompactState();
101
+ this.sessionId = config.sessionId || crypto.randomUUID();
102
+ this.hookRegistry = config.hookRegistry;
103
+ }
104
+ /**
105
+ * Execute hooks for a lifecycle event.
106
+ * Returns hook outputs; never throws.
107
+ */
108
+ async executeHooks(event, extra) {
109
+ if (!this.hookRegistry?.hasHooks(event))
110
+ return [];
111
+ try {
112
+ return await this.hookRegistry.execute(event, {
113
+ event,
114
+ sessionId: this.sessionId,
115
+ cwd: this.config.cwd,
116
+ ...extra,
117
+ });
118
+ }
119
+ catch {
120
+ return [];
121
+ }
122
+ }
123
+ /**
124
+ * Submit a user message and run the agentic loop.
125
+ * Yields SDKMessage events as the agent works.
126
+ */
127
+ async *submitMessage(prompt) {
128
+ // Hook: SessionStart
129
+ await this.executeHooks('SessionStart');
130
+ // Hook: UserPromptSubmit
131
+ const userHookResults = await this.executeHooks('UserPromptSubmit', {
132
+ toolInput: prompt,
133
+ });
134
+ // Check if any hook blocks the submission
135
+ if (userHookResults.some((r) => r.block)) {
136
+ yield {
137
+ type: 'result',
138
+ subtype: 'error_during_execution',
139
+ is_error: true,
140
+ usage: this.totalUsage,
141
+ num_turns: 0,
142
+ cost: 0,
143
+ errors: ['Blocked by UserPromptSubmit hook'],
144
+ };
145
+ return;
146
+ }
147
+ // Add user message
148
+ this.messages.push({ role: 'user', content: prompt });
149
+ // Build tool definitions for provider
150
+ const tools = this.config.tools.map(toProviderTool);
151
+ // Build system prompt
152
+ const systemPrompt = await buildSystemPrompt(this.config);
153
+ // Emit init system message
154
+ yield {
155
+ type: 'system',
156
+ subtype: 'init',
157
+ session_id: this.sessionId,
158
+ tools: this.config.tools.map(t => t.name),
159
+ model: this.config.model,
160
+ cwd: this.config.cwd,
161
+ mcp_servers: [],
162
+ permission_mode: 'bypassPermissions',
163
+ };
164
+ // Agentic loop
165
+ let turnsRemaining = this.config.maxTurns;
166
+ let budgetExceeded = false;
167
+ let maxOutputRecoveryAttempts = 0;
168
+ const MAX_OUTPUT_RECOVERY = 3;
169
+ while (turnsRemaining > 0) {
170
+ if (this.config.abortSignal?.aborted)
171
+ break;
172
+ // Check budget
173
+ if (this.config.maxBudgetUsd && this.totalCost >= this.config.maxBudgetUsd) {
174
+ budgetExceeded = true;
175
+ break;
176
+ }
177
+ // Auto-compact if context is too large
178
+ if (shouldAutoCompact(this.messages, this.config.model, this.compactState)) {
179
+ await this.executeHooks('PreCompact');
180
+ try {
181
+ const result = await compactConversation(this.provider, this.config.model, this.messages, this.compactState);
182
+ this.messages = result.compactedMessages;
183
+ this.compactState = result.state;
184
+ await this.executeHooks('PostCompact');
185
+ }
186
+ catch {
187
+ // Continue with uncompacted messages
188
+ }
189
+ }
190
+ // Micro-compact: truncate large tool results
191
+ const apiMessages = microCompactMessages(normalizeMessagesForAPI(this.messages));
192
+ this.turnCount++;
193
+ turnsRemaining--;
194
+ // Make API call with retry via provider
195
+ let response;
196
+ const apiStart = performance.now();
197
+ try {
198
+ response = await withRetry(async () => {
199
+ return this.provider.createMessage({
200
+ model: this.config.model,
201
+ maxTokens: this.config.maxTokens,
202
+ system: systemPrompt,
203
+ messages: apiMessages,
204
+ tools: tools.length > 0 ? tools : undefined,
205
+ thinking: this.config.thinking?.type === 'enabled' &&
206
+ this.config.thinking.budgetTokens
207
+ ? {
208
+ type: 'enabled',
209
+ budget_tokens: this.config.thinking.budgetTokens,
210
+ }
211
+ : undefined,
212
+ });
213
+ }, undefined, this.config.abortSignal);
214
+ }
215
+ catch (err) {
216
+ // Handle prompt-too-long by compacting
217
+ if (isPromptTooLongError(err) && !this.compactState.compacted) {
218
+ try {
219
+ const result = await compactConversation(this.provider, this.config.model, this.messages, this.compactState);
220
+ this.messages = result.compactedMessages;
221
+ this.compactState = result.state;
222
+ turnsRemaining++; // Retry this turn
223
+ this.turnCount--;
224
+ continue;
225
+ }
226
+ catch {
227
+ // Can't compact, give up
228
+ }
229
+ }
230
+ yield {
231
+ type: 'result',
232
+ subtype: 'error',
233
+ usage: this.totalUsage,
234
+ num_turns: this.turnCount,
235
+ cost: this.totalCost,
236
+ };
237
+ return;
238
+ }
239
+ // Track API timing
240
+ this.apiTimeMs += performance.now() - apiStart;
241
+ // Track usage (normalized by provider)
242
+ if (response.usage) {
243
+ this.totalUsage.input_tokens += response.usage.input_tokens;
244
+ this.totalUsage.output_tokens += response.usage.output_tokens;
245
+ if (response.usage.cache_creation_input_tokens) {
246
+ this.totalUsage.cache_creation_input_tokens =
247
+ (this.totalUsage.cache_creation_input_tokens || 0) +
248
+ response.usage.cache_creation_input_tokens;
249
+ }
250
+ if (response.usage.cache_read_input_tokens) {
251
+ this.totalUsage.cache_read_input_tokens =
252
+ (this.totalUsage.cache_read_input_tokens || 0) +
253
+ response.usage.cache_read_input_tokens;
254
+ }
255
+ this.totalCost += estimateCost(this.config.model, response.usage);
256
+ }
257
+ // Add assistant message to conversation
258
+ this.messages.push({ role: 'assistant', content: response.content });
259
+ // Yield assistant message
260
+ yield {
261
+ type: 'assistant',
262
+ message: {
263
+ role: 'assistant',
264
+ content: response.content,
265
+ },
266
+ };
267
+ // Handle max_output_tokens recovery
268
+ if (response.stopReason === 'max_tokens' &&
269
+ maxOutputRecoveryAttempts < MAX_OUTPUT_RECOVERY) {
270
+ maxOutputRecoveryAttempts++;
271
+ // Add continuation prompt
272
+ this.messages.push({
273
+ role: 'user',
274
+ content: 'Please continue from where you left off.',
275
+ });
276
+ continue;
277
+ }
278
+ // Check for tool use
279
+ const toolUseBlocks = response.content.filter((block) => block.type === 'tool_use');
280
+ if (toolUseBlocks.length === 0) {
281
+ break; // No tool calls - agent is done
282
+ }
283
+ // Reset max_output recovery counter on successful tool use
284
+ maxOutputRecoveryAttempts = 0;
285
+ // Execute tools (concurrent read-only, serial mutations)
286
+ const toolResults = await this.executeTools(toolUseBlocks);
287
+ // Yield tool results
288
+ for (const result of toolResults) {
289
+ yield {
290
+ type: 'tool_result',
291
+ result: {
292
+ tool_use_id: result.tool_use_id,
293
+ tool_name: result.tool_name || '',
294
+ output: typeof result.content === 'string'
295
+ ? result.content
296
+ : JSON.stringify(result.content),
297
+ },
298
+ };
299
+ }
300
+ // Add tool results to conversation
301
+ this.messages.push({
302
+ role: 'user',
303
+ content: toolResults.map((r) => ({
304
+ type: 'tool_result',
305
+ tool_use_id: r.tool_use_id,
306
+ content: typeof r.content === 'string'
307
+ ? r.content
308
+ : JSON.stringify(r.content),
309
+ is_error: r.is_error,
310
+ })),
311
+ });
312
+ if (response.stopReason === 'end_turn')
313
+ break;
314
+ }
315
+ // Hook: Stop (end of agentic loop)
316
+ await this.executeHooks('Stop');
317
+ // Hook: SessionEnd
318
+ await this.executeHooks('SessionEnd');
319
+ // Yield enriched final result
320
+ const endSubtype = budgetExceeded
321
+ ? 'error_max_budget_usd'
322
+ : turnsRemaining <= 0
323
+ ? 'error_max_turns'
324
+ : 'success';
325
+ yield {
326
+ type: 'result',
327
+ subtype: endSubtype,
328
+ session_id: this.sessionId,
329
+ is_error: endSubtype !== 'success',
330
+ num_turns: this.turnCount,
331
+ total_cost_usd: this.totalCost,
332
+ duration_api_ms: Math.round(this.apiTimeMs),
333
+ usage: this.totalUsage,
334
+ model_usage: { [this.config.model]: { input_tokens: this.totalUsage.input_tokens, output_tokens: this.totalUsage.output_tokens } },
335
+ cost: this.totalCost,
336
+ };
337
+ }
338
+ /**
339
+ * Execute tool calls with concurrency control.
340
+ *
341
+ * Read-only tools run concurrently (up to 10 at a time).
342
+ * Mutation tools run sequentially.
343
+ */
344
+ async executeTools(toolUseBlocks) {
345
+ const context = {
346
+ cwd: this.config.cwd,
347
+ abortSignal: this.config.abortSignal,
348
+ provider: this.provider,
349
+ model: this.config.model,
350
+ apiType: this.provider.apiType,
351
+ };
352
+ const MAX_CONCURRENCY = parseInt(process.env.AGENT_SDK_MAX_TOOL_CONCURRENCY || '10');
353
+ // Partition into read-only (concurrent) and mutation (serial)
354
+ const readOnly = [];
355
+ const mutations = [];
356
+ for (const block of toolUseBlocks) {
357
+ const tool = this.config.tools.find((t) => t.name === block.name);
358
+ if (tool?.isReadOnly?.()) {
359
+ readOnly.push({ block, tool });
360
+ }
361
+ else {
362
+ mutations.push({ block, tool });
363
+ }
364
+ }
365
+ const results = [];
366
+ // Execute read-only tools concurrently (batched by MAX_CONCURRENCY)
367
+ for (let i = 0; i < readOnly.length; i += MAX_CONCURRENCY) {
368
+ const batch = readOnly.slice(i, i + MAX_CONCURRENCY);
369
+ const batchResults = await Promise.all(batch.map((item) => this.executeSingleTool(item.block, item.tool, context)));
370
+ results.push(...batchResults);
371
+ }
372
+ // Execute mutation tools sequentially
373
+ for (const item of mutations) {
374
+ const result = await this.executeSingleTool(item.block, item.tool, context);
375
+ results.push(result);
376
+ }
377
+ return results;
378
+ }
379
+ /**
380
+ * Execute a single tool with permission checking.
381
+ */
382
+ async executeSingleTool(block, tool, context) {
383
+ if (!tool) {
384
+ return {
385
+ type: 'tool_result',
386
+ tool_use_id: block.id,
387
+ content: `Error: Unknown tool "${block.name}"`,
388
+ is_error: true,
389
+ tool_name: block.name,
390
+ };
391
+ }
392
+ // Check enabled
393
+ if (tool.isEnabled && !tool.isEnabled()) {
394
+ return {
395
+ type: 'tool_result',
396
+ tool_use_id: block.id,
397
+ content: `Error: Tool "${block.name}" is not enabled`,
398
+ is_error: true,
399
+ tool_name: block.name,
400
+ };
401
+ }
402
+ // Check permissions
403
+ if (this.config.canUseTool) {
404
+ try {
405
+ const permission = await this.config.canUseTool(tool, block.input);
406
+ if (permission.behavior === 'deny') {
407
+ return {
408
+ type: 'tool_result',
409
+ tool_use_id: block.id,
410
+ content: permission.message || `Permission denied for tool "${block.name}"`,
411
+ is_error: true,
412
+ tool_name: block.name,
413
+ };
414
+ }
415
+ if (permission.updatedInput !== undefined) {
416
+ block = { ...block, input: permission.updatedInput };
417
+ }
418
+ }
419
+ catch (err) {
420
+ return {
421
+ type: 'tool_result',
422
+ tool_use_id: block.id,
423
+ content: `Permission check error: ${err.message}`,
424
+ is_error: true,
425
+ tool_name: block.name,
426
+ };
427
+ }
428
+ }
429
+ // Hook: PreToolUse
430
+ const preHookResults = await this.executeHooks('PreToolUse', {
431
+ toolName: block.name,
432
+ toolInput: block.input,
433
+ toolUseId: block.id,
434
+ });
435
+ // Check if any hook blocks this tool
436
+ if (preHookResults.some((r) => r.block)) {
437
+ const msg = preHookResults.find((r) => r.message)?.message || 'Blocked by PreToolUse hook';
438
+ return {
439
+ type: 'tool_result',
440
+ tool_use_id: block.id,
441
+ content: msg,
442
+ is_error: true,
443
+ tool_name: block.name,
444
+ };
445
+ }
446
+ // Execute the tool
447
+ try {
448
+ const result = await tool.call(block.input, context);
449
+ // Hook: PostToolUse
450
+ await this.executeHooks('PostToolUse', {
451
+ toolName: block.name,
452
+ toolInput: block.input,
453
+ toolOutput: typeof result.content === 'string' ? result.content : JSON.stringify(result.content),
454
+ toolUseId: block.id,
455
+ });
456
+ return { ...result, tool_use_id: block.id, tool_name: block.name };
457
+ }
458
+ catch (err) {
459
+ // Hook: PostToolUseFailure
460
+ await this.executeHooks('PostToolUseFailure', {
461
+ toolName: block.name,
462
+ toolInput: block.input,
463
+ toolUseId: block.id,
464
+ error: err.message,
465
+ });
466
+ return {
467
+ type: 'tool_result',
468
+ tool_use_id: block.id,
469
+ content: `Tool execution error: ${err.message}`,
470
+ is_error: true,
471
+ tool_name: block.name,
472
+ };
473
+ }
474
+ }
475
+ /**
476
+ * Get current messages for session persistence.
477
+ */
478
+ getMessages() {
479
+ return [...this.messages];
480
+ }
481
+ /**
482
+ * Get total usage across all turns.
483
+ */
484
+ getUsage() {
485
+ return { ...this.totalUsage };
486
+ }
487
+ /**
488
+ * Get total cost.
489
+ */
490
+ getCost() {
491
+ return this.totalCost;
492
+ }
493
+ }
494
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Hook System
3
+ *
4
+ * Lifecycle hooks for intercepting agent behavior.
5
+ * Supports pre/post tool use, session lifecycle, and custom events.
6
+ *
7
+ * Hook events:
8
+ * - PreToolUse: before tool execution
9
+ * - PostToolUse: after tool execution
10
+ * - PostToolUseFailure: after tool failure
11
+ * - SessionStart: session initialization
12
+ * - SessionEnd: session cleanup
13
+ * - Stop: when turn completes
14
+ * - SubagentStart: subagent spawned
15
+ * - SubagentStop: subagent completed
16
+ * - UserPromptSubmit: user sends message
17
+ * - PermissionRequest: permission check triggered
18
+ * - TaskCreated: task created
19
+ * - TaskCompleted: task finished
20
+ * - ConfigChange: settings changed
21
+ * - CwdChanged: working directory changed
22
+ * - FileChanged: file modified
23
+ * - Notification: system notification
24
+ */
25
+ /**
26
+ * All supported hook events.
27
+ */
28
+ export declare const HOOK_EVENTS: readonly ["PreToolUse", "PostToolUse", "PostToolUseFailure", "SessionStart", "SessionEnd", "Stop", "SubagentStart", "SubagentStop", "UserPromptSubmit", "PermissionRequest", "PermissionDenied", "TaskCreated", "TaskCompleted", "ConfigChange", "CwdChanged", "FileChanged", "Notification", "PreCompact", "PostCompact", "TeammateIdle"];
29
+ export type HookEvent = typeof HOOK_EVENTS[number];
30
+ /**
31
+ * Hook definition.
32
+ */
33
+ export interface HookDefinition {
34
+ /** Shell command or function to execute */
35
+ command?: string;
36
+ /** Function handler */
37
+ handler?: (input: HookInput) => Promise<HookOutput | void>;
38
+ /** Tool name matcher (regex pattern) */
39
+ matcher?: string;
40
+ /** Timeout in milliseconds */
41
+ timeout?: number;
42
+ }
43
+ /**
44
+ * Hook input passed to handlers.
45
+ */
46
+ export interface HookInput {
47
+ event: HookEvent;
48
+ toolName?: string;
49
+ toolInput?: unknown;
50
+ toolOutput?: unknown;
51
+ toolUseId?: string;
52
+ sessionId?: string;
53
+ cwd?: string;
54
+ error?: string;
55
+ [key: string]: unknown;
56
+ }
57
+ /**
58
+ * Hook output returned by handlers.
59
+ */
60
+ export interface HookOutput {
61
+ /** Message to append to conversation */
62
+ message?: string;
63
+ /** Permission update */
64
+ permissionUpdate?: {
65
+ tool: string;
66
+ behavior: 'allow' | 'deny';
67
+ };
68
+ /** Whether to block the action */
69
+ block?: boolean;
70
+ /** Notification */
71
+ notification?: {
72
+ title: string;
73
+ body: string;
74
+ level?: 'info' | 'warning' | 'error';
75
+ };
76
+ }
77
+ /**
78
+ * Hook configuration (from settings).
79
+ */
80
+ export type HookConfig = Record<string, HookDefinition[]>;
81
+ /**
82
+ * Hook registry for managing and executing hooks.
83
+ */
84
+ export declare class HookRegistry {
85
+ private hooks;
86
+ /**
87
+ * Register hooks from configuration.
88
+ */
89
+ registerFromConfig(config: HookConfig): void;
90
+ /**
91
+ * Register a single hook.
92
+ */
93
+ register(event: HookEvent, definition: HookDefinition): void;
94
+ /**
95
+ * Execute hooks for an event.
96
+ */
97
+ execute(event: HookEvent, input: HookInput): Promise<HookOutput[]>;
98
+ /**
99
+ * Check if any hooks are registered for an event.
100
+ */
101
+ hasHooks(event: HookEvent): boolean;
102
+ /**
103
+ * Clear all hooks.
104
+ */
105
+ clear(): void;
106
+ }
107
+ /**
108
+ * Create a default hook registry.
109
+ */
110
+ export declare function createHookRegistry(config?: HookConfig): HookRegistry;
111
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAIH;;GAEG;AACH,eAAO,MAAM,WAAW,4UAqBd,CAAA;AAEV,MAAM,MAAM,SAAS,GAAG,OAAO,WAAW,CAAC,MAAM,CAAC,CAAA;AAElD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,uBAAuB;IACvB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAA;IAC1D,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,SAAS,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,wCAAwC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,wBAAwB;IACxB,gBAAgB,CAAC,EAAE;QACjB,IAAI,EAAE,MAAM,CAAA;QACZ,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAA;KAC3B,CAAA;IACD,kCAAkC;IAClC,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,mBAAmB;IACnB,YAAY,CAAC,EAAE;QACb,KAAK,EAAE,MAAM,CAAA;QACb,IAAI,EAAE,MAAM,CAAA;QACZ,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAA;KACrC,CAAA;CACF;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,CAAA;AAEzD;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAA8C;IAE3D;;OAEG;IACH,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAU5C;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,GAAG,IAAI;IAM5D;;OAEG;IACG,OAAO,CACX,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,SAAS,GACf,OAAO,CAAC,UAAU,EAAE,CAAC;IAuCxB;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO;IAInC;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd;AAuDD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,YAAY,CAMpE"}