@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/agent.js ADDED
@@ -0,0 +1,573 @@
1
+ /**
2
+ * Agent - High-level API
3
+ *
4
+ * Provides createAgent() and query() interfaces compatible with
5
+ * open-agent-sdk.
6
+ *
7
+ * Usage:
8
+ * import { createAgent } from 'open-agent-sdk'
9
+ * const agent = createAgent({ model: 'claude-sonnet-4-6' })
10
+ * for await (const event of agent.query('Hello')) { ... }
11
+ *
12
+ * // OpenAI-compatible models
13
+ * const agent = createAgent({
14
+ * apiType: 'openai-completions',
15
+ * model: 'gpt-4o',
16
+ * apiKey: 'sk-...',
17
+ * baseURL: 'https://api.openai.com/v1',
18
+ * })
19
+ */
20
+ import { QueryEngine } from './engine.js';
21
+ import { getAllBaseTools, filterTools } from './tools/index.js';
22
+ import { connectMCPServer } from './mcp/client.js';
23
+ import { isSdkServerConfig } from './sdk-mcp-server.js';
24
+ import { registerAgents } from './tools/agent-tool.js';
25
+ import { saveSession, loadSession, } from './session.js';
26
+ import { createHookRegistry } from './hooks.js';
27
+ import { initBundledSkills } from './skills/index.js';
28
+ import { createProvider } from './providers/index.js';
29
+ import { createUpdateGoalTool, buildGoalSystemPrompt, getGoalState, resetGoalState, } from './tools/update-goal.js';
30
+ // --------------------------------------------------------------------------
31
+ // Agent class
32
+ // --------------------------------------------------------------------------
33
+ export class Agent {
34
+ cfg;
35
+ toolPool;
36
+ modelId;
37
+ apiType;
38
+ apiCredentials;
39
+ provider;
40
+ mcpLinks = [];
41
+ history = [];
42
+ messageLog = [];
43
+ setupDone;
44
+ sid;
45
+ abortCtrl = null;
46
+ currentEngine = null;
47
+ hookRegistry;
48
+ constructor(options = {}) {
49
+ // Shallow copy to avoid mutating caller's object
50
+ this.cfg = { ...options };
51
+ // Merge credentials from options.env map, direct options, and process.env
52
+ this.apiCredentials = this.pickCredentials();
53
+ this.modelId = this.cfg.model ?? this.readEnv('MODEL') ?? 'claude-sonnet-4-6';
54
+ this.sid = this.cfg.sessionId ?? crypto.randomUUID();
55
+ // Resolve API type
56
+ this.apiType = this.resolveApiType();
57
+ // Create LLM provider
58
+ this.provider = createProvider(this.apiType, {
59
+ apiKey: this.apiCredentials.key,
60
+ baseURL: this.apiCredentials.baseUrl,
61
+ });
62
+ // Initialize bundled skills
63
+ initBundledSkills();
64
+ // Build hook registry from options
65
+ this.hookRegistry = createHookRegistry();
66
+ if (this.cfg.hooks) {
67
+ // Convert AgentOptions hooks format to HookConfig
68
+ for (const [event, defs] of Object.entries(this.cfg.hooks)) {
69
+ for (const def of defs) {
70
+ for (const handler of def.hooks) {
71
+ this.hookRegistry.register(event, {
72
+ matcher: def.matcher,
73
+ timeout: def.timeout,
74
+ handler: async (input) => {
75
+ const result = await handler(input, input.toolUseId || '', {
76
+ signal: this.abortCtrl?.signal || new AbortController().signal,
77
+ });
78
+ return result || undefined;
79
+ },
80
+ });
81
+ }
82
+ }
83
+ }
84
+ }
85
+ // Build tool pool from options (supports ToolDefinition[], string[], or preset)
86
+ this.toolPool = this.buildToolPool();
87
+ // Kick off async setup (MCP connections, agent registration, session resume)
88
+ this.setupDone = this.setup();
89
+ }
90
+ /**
91
+ * Resolve API type from options, env, or model name heuristic.
92
+ */
93
+ resolveApiType() {
94
+ // Explicit option
95
+ if (this.cfg.apiType)
96
+ return this.cfg.apiType;
97
+ // Env var
98
+ const envType = this.envMapValue('API_TYPE') ??
99
+ this.readEnv('API_TYPE');
100
+ if (envType === 'openai-completions' || envType === 'anthropic-messages') {
101
+ return envType;
102
+ }
103
+ // Heuristic from model name
104
+ const model = this.modelId.toLowerCase();
105
+ if (model.includes('gpt-') ||
106
+ model.includes('o1') ||
107
+ model.includes('o3') ||
108
+ model.includes('o4') ||
109
+ model.includes('deepseek') ||
110
+ model.includes('qwen') ||
111
+ model.includes('yi-') ||
112
+ model.includes('glm') ||
113
+ model.includes('mistral') ||
114
+ model.includes('gemma')) {
115
+ return 'openai-completions';
116
+ }
117
+ return 'anthropic-messages';
118
+ }
119
+ /** Pick API key and base URL from options or CLAUDEBUDDY_* env vars. */
120
+ pickCredentials() {
121
+ return {
122
+ key: this.cfg.apiKey ??
123
+ this.envMapValue('API_KEY') ??
124
+ this.envMapValue('AUTH_TOKEN') ??
125
+ this.readEnv('API_KEY') ??
126
+ this.readEnv('AUTH_TOKEN'),
127
+ baseUrl: this.cfg.baseURL ??
128
+ this.envMapValue('BASE_URL') ??
129
+ this.readEnv('BASE_URL'),
130
+ };
131
+ }
132
+ /**
133
+ * Read an env var by its short key using the CLAUDEBUDDY_ prefix.
134
+ * e.g. readEnv('MODEL') checks CLAUDEBUDDY_MODEL.
135
+ */
136
+ readEnv(shortKey) {
137
+ return process.env[`CLAUDEBUDDY_${shortKey}`] || undefined;
138
+ }
139
+ /** Read a value from the options `env` map using the CLAUDEBUDDY_ prefix. */
140
+ envMapValue(shortKey) {
141
+ return this.cfg.env?.[`CLAUDEBUDDY_${shortKey}`];
142
+ }
143
+ /** Assemble the available tool set based on options. */
144
+ buildToolPool() {
145
+ const raw = this.cfg.tools;
146
+ let pool;
147
+ if (!raw || (typeof raw === 'object' && !Array.isArray(raw) && 'type' in raw)) {
148
+ pool = getAllBaseTools();
149
+ }
150
+ else if (Array.isArray(raw) && raw.length > 0 && typeof raw[0] === 'string') {
151
+ pool = filterTools(getAllBaseTools(), raw);
152
+ }
153
+ else {
154
+ pool = raw;
155
+ }
156
+ return filterTools(pool, this.cfg.allowedTools, this.cfg.disallowedTools);
157
+ }
158
+ /**
159
+ * Async initialization: connect MCP servers, register agents, resume sessions.
160
+ */
161
+ async setup() {
162
+ // Register custom agent definitions
163
+ if (this.cfg.agents) {
164
+ registerAgents(this.cfg.agents);
165
+ }
166
+ // Connect MCP servers (supports stdio, SSE, HTTP, and in-process SDK servers)
167
+ if (this.cfg.mcpServers) {
168
+ for (const [name, config] of Object.entries(this.cfg.mcpServers)) {
169
+ try {
170
+ if (isSdkServerConfig(config)) {
171
+ // In-process SDK MCP server - directly add tools
172
+ this.toolPool = [...this.toolPool, ...config.tools];
173
+ }
174
+ else {
175
+ // External MCP server
176
+ const connection = await connectMCPServer(name, config);
177
+ this.mcpLinks.push(connection);
178
+ if (connection.status === 'connected' && connection.tools.length > 0) {
179
+ this.toolPool = [...this.toolPool, ...connection.tools];
180
+ }
181
+ }
182
+ }
183
+ catch (err) {
184
+ console.error(`[MCP] Failed to connect to "${name}": ${err.message}`);
185
+ }
186
+ }
187
+ }
188
+ // Resume or continue session. An explicitly supplied history wins: hosts
189
+ // that keep sessions in their own store (a database) pass it here and the
190
+ // session files are never read.
191
+ if (this.cfg.history?.length) {
192
+ this.history = [...this.cfg.history];
193
+ if (this.cfg.resume)
194
+ this.sid = this.cfg.resume;
195
+ }
196
+ else if (this.cfg.resume) {
197
+ const sessionData = await loadSession(this.cfg.resume);
198
+ if (sessionData) {
199
+ this.history = sessionData.messages;
200
+ this.sid = this.cfg.resume;
201
+ }
202
+ }
203
+ }
204
+ /**
205
+ * Run a query with streaming events.
206
+ */
207
+ async *query(prompt, overrides) {
208
+ await this.setupDone;
209
+ // Goal auto-takeover: when configured with goal.enabledOnQuery and the
210
+ // prompt is a plain string goal, route this query through the goal-driven
211
+ // loop instead of a single turn. Non-string prompts (message arrays) are
212
+ // always handled as a normal single-turn query.
213
+ const goalOpts = typeof this.cfg.goal === 'object' ? this.cfg.goal : undefined;
214
+ const overrideGoal = typeof overrides?.goal === 'object' ? overrides.goal : undefined;
215
+ // Explicit override (e.g. runGoal disabling re-entry) wins over the config.
216
+ const autoGoalFlag = overrideGoal?.enabledOnQuery !== undefined
217
+ ? overrideGoal.enabledOnQuery
218
+ : (goalOpts?.enabledOnQuery ?? false);
219
+ if (autoGoalFlag && typeof prompt === 'string') {
220
+ yield* this.runGoal(prompt, {});
221
+ return;
222
+ }
223
+ const opts = { ...this.cfg, ...overrides };
224
+ const cwd = opts.cwd || process.cwd();
225
+ // Create abort controller for this query
226
+ this.abortCtrl = opts.abortController || new AbortController();
227
+ if (opts.abortSignal) {
228
+ opts.abortSignal.addEventListener('abort', () => this.abortCtrl?.abort(), { once: true });
229
+ }
230
+ // Resolve systemPrompt (handle preset object)
231
+ let systemPrompt;
232
+ let appendSystemPrompt = opts.appendSystemPrompt;
233
+ if (typeof opts.systemPrompt === 'object' && opts.systemPrompt?.type === 'preset') {
234
+ systemPrompt = undefined; // Use engine default (default style)
235
+ if (opts.systemPrompt.append) {
236
+ appendSystemPrompt = (appendSystemPrompt || '') + '\n' + opts.systemPrompt.append;
237
+ }
238
+ }
239
+ else {
240
+ systemPrompt = opts.systemPrompt;
241
+ }
242
+ // Build canUseTool based on permission mode
243
+ const permMode = opts.permissionMode ?? 'bypassPermissions';
244
+ const canUseTool = opts.canUseTool ?? (async (_tool, _input) => {
245
+ if (permMode === 'bypassPermissions' || permMode === 'dontAsk' || permMode === 'auto') {
246
+ return { behavior: 'allow' };
247
+ }
248
+ if (permMode === 'acceptEdits') {
249
+ return { behavior: 'allow' };
250
+ }
251
+ return { behavior: 'allow' };
252
+ });
253
+ // Resolve tools with overrides
254
+ let tools = this.toolPool;
255
+ if (overrides?.allowedTools || overrides?.disallowedTools) {
256
+ tools = filterTools(tools, overrides.allowedTools, overrides.disallowedTools);
257
+ }
258
+ if (overrides?.tools) {
259
+ const ot = overrides.tools;
260
+ if (Array.isArray(ot) && ot.length > 0 && typeof ot[0] === 'string') {
261
+ tools = filterTools(this.toolPool, ot);
262
+ }
263
+ else if (Array.isArray(ot)) {
264
+ tools = ot;
265
+ }
266
+ }
267
+ // Recreate provider if overrides change credentials or apiType
268
+ let provider = this.provider;
269
+ if (overrides?.apiType || overrides?.apiKey || overrides?.baseURL) {
270
+ const resolvedApiType = overrides.apiType ?? this.apiType;
271
+ provider = createProvider(resolvedApiType, {
272
+ apiKey: overrides.apiKey ?? this.apiCredentials.key,
273
+ baseURL: overrides.baseURL ?? this.apiCredentials.baseUrl,
274
+ });
275
+ }
276
+ // Create query engine with current conversation state
277
+ const engine = new QueryEngine({
278
+ cwd,
279
+ model: opts.model || this.modelId,
280
+ provider,
281
+ tools,
282
+ systemPrompt,
283
+ appendSystemPrompt,
284
+ maxTurns: opts.maxTurns ?? 10,
285
+ maxBudgetUsd: opts.maxBudgetUsd,
286
+ maxTokens: opts.maxTokens ?? 16384,
287
+ thinking: opts.thinking,
288
+ jsonSchema: opts.jsonSchema,
289
+ canUseTool,
290
+ includePartialMessages: opts.includePartialMessages ?? false,
291
+ abortSignal: this.abortCtrl.signal,
292
+ agents: opts.agents,
293
+ hookRegistry: this.hookRegistry,
294
+ sessionId: this.sid,
295
+ contextWindowSize: opts.contextWindowSize,
296
+ pricingPerMillion: opts.pricingPerMillion,
297
+ spill: opts.spill,
298
+ });
299
+ this.currentEngine = engine;
300
+ // Inject existing conversation history
301
+ for (const msg of this.history) {
302
+ engine.messages.push(msg);
303
+ }
304
+ // Run the engine
305
+ for await (const event of engine.submitMessage(prompt)) {
306
+ yield event;
307
+ // Track assistant messages for multi-turn persistence
308
+ if (event.type === 'assistant') {
309
+ const uuid = crypto.randomUUID();
310
+ const timestamp = new Date().toISOString();
311
+ this.messageLog.push({
312
+ type: 'assistant',
313
+ message: event.message,
314
+ uuid,
315
+ timestamp,
316
+ });
317
+ }
318
+ }
319
+ // Persist conversation state for multi-turn
320
+ this.history = engine.getMessages();
321
+ // Add user message to tracked messages
322
+ const userUuid = crypto.randomUUID();
323
+ this.messageLog.push({
324
+ type: 'user',
325
+ message: { role: 'user', content: prompt },
326
+ uuid: userUuid,
327
+ timestamp: new Date().toISOString(),
328
+ });
329
+ }
330
+ /**
331
+ * Convenience method: send a prompt and collect the final answer as a single object.
332
+ * Internally iterates through the streaming query and aggregates the outcome.
333
+ */
334
+ async prompt(text, overrides) {
335
+ const t0 = performance.now();
336
+ const collected = { text: '', turns: 0, tokens: { in: 0, out: 0 } };
337
+ for await (const ev of this.query(text, overrides)) {
338
+ switch (ev.type) {
339
+ case 'assistant': {
340
+ // Extract the last assistant text (multi-turn: only final answer matters)
341
+ const fragments = ev.message.content
342
+ .filter((c) => c.type === 'text')
343
+ .map((c) => c.text);
344
+ if (fragments.length)
345
+ collected.text = fragments.join('');
346
+ break;
347
+ }
348
+ case 'result':
349
+ collected.turns = ev.num_turns ?? 0;
350
+ collected.tokens.in = ev.usage?.input_tokens ?? 0;
351
+ collected.tokens.out = ev.usage?.output_tokens ?? 0;
352
+ break;
353
+ }
354
+ }
355
+ return {
356
+ text: collected.text,
357
+ usage: { input_tokens: collected.tokens.in, output_tokens: collected.tokens.out },
358
+ num_turns: collected.turns,
359
+ duration_ms: Math.round(performance.now() - t0),
360
+ messages: [...this.messageLog],
361
+ };
362
+ }
363
+ /**
364
+ * Goal-driven autonomous loop.
365
+ *
366
+ * Runs the agent toward `goal` over up to `maxRounds` rounds. Unlike a single
367
+ * `query`, the agent keeps working ("give it a task and let it run until done")
368
+ * and only stops when:
369
+ * - it calls the injected `update_goal` tool with goal_status="complete", or
370
+ * - it reports goal_status="blocked", or
371
+ * - `maxRounds` is exhausted (returns with a helpful error event), or
372
+ * - it is aborted.
373
+ *
374
+ * The `update_goal` internal tool is injected into the tool pool and a
375
+ * goal-mode system prompt is appended, so the agent knows it should keep
376
+ * working autonomously and how to signal completion.
377
+ */
378
+ async *runGoal(goal, overrides) {
379
+ const goalOpts = this.cfg.goal;
380
+ const maxRounds = overrides?.maxGoalRounds ??
381
+ (typeof goalOpts === 'object' ? goalOpts.maxGoalRounds : undefined) ??
382
+ 10;
383
+ const turnsPerRound = overrides?.turnsPerRound ??
384
+ (typeof goalOpts === 'object' ? goalOpts.turnsPerRound : undefined);
385
+ const maxConsecutiveStalls = typeof goalOpts === 'object'
386
+ ? goalOpts.maxConsecutiveStalls
387
+ : undefined;
388
+ // Reset the shared goal-state record for this run.
389
+ resetGoalState();
390
+ // Inject the internal update_goal tool and the goal-mode system prompt.
391
+ const goalTool = createUpdateGoalTool();
392
+ // Build a base tool pool: if the caller restricts tools, respect it; else
393
+ // use the agent's resolved pool. Always append the internal tool.
394
+ const baseTools = this.toolPool;
395
+ const toolOverrides = {
396
+ tools: [...baseTools, goalTool],
397
+ };
398
+ // Track consecutive rounds without a status update (stall detection).
399
+ let lastRevision = getGoalState().revision;
400
+ let consecutiveStalls = 0;
401
+ let roundsDone = 0;
402
+ for (; roundsDone < maxRounds; roundsDone++) {
403
+ const roundTarget = roundsDone === 0
404
+ ? goal
405
+ : `Continue working toward the goal. Stay on task and do not stop until the goal is complete or you are truly blocked. Call update_goal with goal_status="complete" when done.`;
406
+ const roundOverrides = {
407
+ ...toolOverrides,
408
+ appendSystemPrompt: [
409
+ this.cfg.appendSystemPrompt,
410
+ buildGoalSystemPrompt(goal, maxRounds),
411
+ ].filter(Boolean).join('\n\n'),
412
+ maxTurns: turnsPerRound,
413
+ // Never re-enter the goal guard from inside a goal round.
414
+ goal: {
415
+ ...(typeof this.cfg.goal === 'object' ? this.cfg.goal : {}),
416
+ enabledOnQuery: false,
417
+ },
418
+ };
419
+ for await (const ev of this.query(roundTarget, roundOverrides)) {
420
+ yield ev;
421
+ }
422
+ const state = getGoalState();
423
+ // If the model reported complete/blocked, stop.
424
+ if (state.revision > lastRevision) {
425
+ consecutiveStalls = 0;
426
+ if (state.status === 'complete' || state.status === 'blocked') {
427
+ yield {
428
+ type: 'result',
429
+ subtype: state.status === 'complete' ? 'success' : 'goal_blocked',
430
+ num_turns: roundsDone + 1,
431
+ errors: state.status === 'blocked' ? [state.summary || 'Goal blocked'] : undefined,
432
+ };
433
+ return;
434
+ }
435
+ lastRevision = state.revision;
436
+ }
437
+ else {
438
+ // No status update this round.
439
+ consecutiveStalls++;
440
+ if (maxConsecutiveStalls && consecutiveStalls >= maxConsecutiveStalls) {
441
+ yield {
442
+ type: 'result',
443
+ subtype: 'goal_blocked',
444
+ num_turns: roundsDone + 1,
445
+ errors: [`No progress reported for ${consecutiveStalls} consecutive rounds.`],
446
+ };
447
+ return;
448
+ }
449
+ }
450
+ }
451
+ // Rounds exhausted without completion.
452
+ yield {
453
+ type: 'result',
454
+ subtype: 'error_max_rounds',
455
+ num_turns: roundsDone,
456
+ errors: [`Goal not completed after ${maxRounds} rounds.`],
457
+ };
458
+ }
459
+ /**
460
+ * Get conversation messages.
461
+ */
462
+ getMessages() {
463
+ return [...this.messageLog];
464
+ }
465
+ /**
466
+ * Reset conversation history.
467
+ */
468
+ clear() {
469
+ this.history = [];
470
+ this.messageLog = [];
471
+ }
472
+ /**
473
+ * Interrupt the current query.
474
+ */
475
+ async interrupt() {
476
+ this.abortCtrl?.abort();
477
+ }
478
+ /**
479
+ * Change the model during a session.
480
+ */
481
+ async setModel(model) {
482
+ if (model) {
483
+ this.modelId = model;
484
+ this.cfg.model = model;
485
+ }
486
+ }
487
+ /**
488
+ * Change the permission mode during a session.
489
+ */
490
+ async setPermissionMode(mode) {
491
+ this.cfg.permissionMode = mode;
492
+ }
493
+ /**
494
+ * Set maximum thinking tokens.
495
+ */
496
+ async setMaxThinkingTokens(maxThinkingTokens) {
497
+ if (maxThinkingTokens === null) {
498
+ this.cfg.thinking = { type: 'disabled' };
499
+ }
500
+ else {
501
+ this.cfg.thinking = { type: 'enabled', budgetTokens: maxThinkingTokens };
502
+ }
503
+ }
504
+ /**
505
+ * Get the session ID.
506
+ */
507
+ getSessionId() {
508
+ return this.sid;
509
+ }
510
+ /**
511
+ * Get the current API type.
512
+ */
513
+ getApiType() {
514
+ return this.apiType;
515
+ }
516
+ /**
517
+ * Stop a background task.
518
+ */
519
+ async stopTask(taskId) {
520
+ const { getTask } = await import('./tools/task-tools.js');
521
+ const task = getTask(taskId);
522
+ if (task) {
523
+ task.status = 'cancelled';
524
+ }
525
+ }
526
+ /**
527
+ * Close MCP connections and clean up.
528
+ * Optionally persist session to disk.
529
+ */
530
+ async close() {
531
+ // Persist session if enabled
532
+ if (this.cfg.persistSession !== false && this.history.length > 0) {
533
+ try {
534
+ await saveSession(this.sid, this.history, {
535
+ cwd: this.cfg.cwd || process.cwd(),
536
+ model: this.modelId,
537
+ summary: undefined,
538
+ });
539
+ }
540
+ catch {
541
+ // Session persistence is best-effort
542
+ }
543
+ }
544
+ for (const conn of this.mcpLinks) {
545
+ await conn.close();
546
+ }
547
+ this.mcpLinks = [];
548
+ }
549
+ }
550
+ // --------------------------------------------------------------------------
551
+ // Factory function
552
+ // --------------------------------------------------------------------------
553
+ /** Factory: shorthand for `new Agent(options)`. */
554
+ export function createAgent(options = {}) {
555
+ return new Agent(options);
556
+ }
557
+ // --------------------------------------------------------------------------
558
+ // Standalone query — one-shot convenience wrapper
559
+ // --------------------------------------------------------------------------
560
+ /**
561
+ * Execute a single agentic query without managing an Agent instance.
562
+ * The agent is created, used, and cleaned up automatically.
563
+ */
564
+ export async function* query(params) {
565
+ const ephemeral = createAgent(params.options);
566
+ try {
567
+ yield* ephemeral.query(params.prompt);
568
+ }
569
+ finally {
570
+ await ephemeral.close();
571
+ }
572
+ }
573
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
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 type { SDKMessage, QueryEngineConfig, TokenUsage } from './types.js';
15
+ import type { NormalizedMessageParam } from './providers/types.js';
16
+ export declare class QueryEngine {
17
+ private config;
18
+ private provider;
19
+ messages: NormalizedMessageParam[];
20
+ private totalUsage;
21
+ private totalCost;
22
+ private turnCount;
23
+ private compactState;
24
+ private sessionId;
25
+ private apiTimeMs;
26
+ private hookRegistry?;
27
+ private spillStore?;
28
+ constructor(config: QueryEngineConfig);
29
+ /**
30
+ * Execute hooks for a lifecycle event.
31
+ * Returns hook outputs; never throws.
32
+ */
33
+ private executeHooks;
34
+ /**
35
+ * Submit a user message and run the agentic loop.
36
+ * Yields SDKMessage events as the agent works.
37
+ */
38
+ submitMessage(prompt: string | any[]): AsyncGenerator<SDKMessage>;
39
+ /**
40
+ * Execute tool calls with concurrency control.
41
+ *
42
+ * Read-only tools run concurrently (up to 10 at a time).
43
+ * Mutation tools run sequentially.
44
+ */
45
+ private executeTools;
46
+ /**
47
+ * Apply the spill policy to each tool result that exceeds the inline cap.
48
+ * Best-effort: a spill failure leaves the original content untouched and
49
+ * never turns a success into an error. Reading tools are skipped to avoid a
50
+ * read -> spill -> read loop.
51
+ */
52
+ private applySpillToResults;
53
+ /**
54
+ * Execute a single tool with permission checking.
55
+ */
56
+ private executeSingleTool;
57
+ /**
58
+ * Get current messages for session persistence.
59
+ */
60
+ getMessages(): NormalizedMessageParam[];
61
+ /**
62
+ * Get total usage across all turns.
63
+ */
64
+ getUsage(): TokenUsage;
65
+ /**
66
+ * Get total cost.
67
+ */
68
+ getCost(): number;
69
+ }
70
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACV,UAAU,EACV,iBAAiB,EAIjB,UAAU,EACX,MAAM,YAAY,CAAA;AACnB,OAAO,KAAK,EAGV,sBAAsB,EAEvB,MAAM,sBAAsB,CAAA;AAwH7B,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,QAAQ,CAAa;IACtB,QAAQ,EAAE,sBAAsB,EAAE,CAAK;IAC9C,OAAO,CAAC,UAAU,CAAoD;IACtE,OAAO,CAAC,SAAS,CAAI;IACrB,OAAO,CAAC,SAAS,CAAI;IACrB,OAAO,CAAC,YAAY,CAAkB;IACtC,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,SAAS,CAAI;IACrB,OAAO,CAAC,YAAY,CAAC,CAAc;IACnC,OAAO,CAAC,UAAU,CAAC,CAAY;gBAEnB,MAAM,EAAE,iBAAiB;IAWrC;;;OAGG;YACW,YAAY;IAiB1B;;;OAGG;IACI,aAAa,CAClB,MAAM,EAAE,MAAM,GAAG,GAAG,EAAE,GACrB,cAAc,CAAC,UAAU,CAAC;IAkR7B;;;;;OAKG;YACW,YAAY;IAkD1B;;;;;OAKG;YACW,mBAAmB;IAiDjC;;OAEG;YACW,iBAAiB;IAuG/B;;OAEG;IACH,WAAW,IAAI,sBAAsB,EAAE;IAIvC;;OAEG;IACH,QAAQ,IAAI,UAAU;IAItB;;OAEG;IACH,OAAO,IAAI,MAAM;CAGlB"}