@studio-foundation/runner 0.3.0-beta.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 (268) hide show
  1. package/ARCHITECTURE.md +53 -0
  2. package/LICENSE +663 -0
  3. package/README.md +125 -0
  4. package/configs/agents/analyst.agent.yaml +31 -0
  5. package/configs/agents/code-generator.agent.yaml +31 -0
  6. package/configs/agents/generic.agent.yaml +23 -0
  7. package/dist/__tests__/script-executor.test.d.ts +2 -0
  8. package/dist/__tests__/script-executor.test.d.ts.map +1 -0
  9. package/dist/__tests__/script-executor.test.js +173 -0
  10. package/dist/__tests__/script-executor.test.js.map +1 -0
  11. package/dist/index.d.ts +38 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +76 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/integrations/integration-loader.d.ts +20 -0
  16. package/dist/integrations/integration-loader.d.ts.map +1 -0
  17. package/dist/integrations/integration-loader.js +71 -0
  18. package/dist/integrations/integration-loader.js.map +1 -0
  19. package/dist/integrations/integration-loader.test.d.ts +2 -0
  20. package/dist/integrations/integration-loader.test.d.ts.map +1 -0
  21. package/dist/integrations/integration-loader.test.js +77 -0
  22. package/dist/integrations/integration-loader.test.js.map +1 -0
  23. package/dist/middleware/anonymization.d.ts +22 -0
  24. package/dist/middleware/anonymization.d.ts.map +1 -0
  25. package/dist/middleware/anonymization.js +37 -0
  26. package/dist/middleware/anonymization.js.map +1 -0
  27. package/dist/plugins/index.d.ts +5 -0
  28. package/dist/plugins/index.d.ts.map +1 -0
  29. package/dist/plugins/index.js +10 -0
  30. package/dist/plugins/index.js.map +1 -0
  31. package/dist/plugins/mcp-client.d.ts +19 -0
  32. package/dist/plugins/mcp-client.d.ts.map +1 -0
  33. package/dist/plugins/mcp-client.js +126 -0
  34. package/dist/plugins/mcp-client.js.map +1 -0
  35. package/dist/plugins/mcp-client.test.d.ts +2 -0
  36. package/dist/plugins/mcp-client.test.d.ts.map +1 -0
  37. package/dist/plugins/mcp-client.test.js +160 -0
  38. package/dist/plugins/mcp-client.test.js.map +1 -0
  39. package/dist/plugins/oauth-provider.d.ts +27 -0
  40. package/dist/plugins/oauth-provider.d.ts.map +1 -0
  41. package/dist/plugins/oauth-provider.js +140 -0
  42. package/dist/plugins/oauth-provider.js.map +1 -0
  43. package/dist/plugins/oauth-provider.test.d.ts +2 -0
  44. package/dist/plugins/oauth-provider.test.d.ts.map +1 -0
  45. package/dist/plugins/oauth-provider.test.js +144 -0
  46. package/dist/plugins/oauth-provider.test.js.map +1 -0
  47. package/dist/plugins/plugin-loader.d.ts +29 -0
  48. package/dist/plugins/plugin-loader.d.ts.map +1 -0
  49. package/dist/plugins/plugin-loader.js +71 -0
  50. package/dist/plugins/plugin-loader.js.map +1 -0
  51. package/dist/plugins/plugin-loader.test.d.ts +2 -0
  52. package/dist/plugins/plugin-loader.test.d.ts.map +1 -0
  53. package/dist/plugins/plugin-loader.test.js +87 -0
  54. package/dist/plugins/plugin-loader.test.js.map +1 -0
  55. package/dist/prompt-builder.d.ts +47 -0
  56. package/dist/prompt-builder.d.ts.map +1 -0
  57. package/dist/prompt-builder.js +263 -0
  58. package/dist/prompt-builder.js.map +1 -0
  59. package/dist/prompt-builder.test.d.ts +2 -0
  60. package/dist/prompt-builder.test.d.ts.map +1 -0
  61. package/dist/prompt-builder.test.js +154 -0
  62. package/dist/prompt-builder.test.js.map +1 -0
  63. package/dist/providers/anthropic.d.ts +14 -0
  64. package/dist/providers/anthropic.d.ts.map +1 -0
  65. package/dist/providers/anthropic.js +118 -0
  66. package/dist/providers/anthropic.js.map +1 -0
  67. package/dist/providers/anthropic.test.d.ts +2 -0
  68. package/dist/providers/anthropic.test.d.ts.map +1 -0
  69. package/dist/providers/anthropic.test.js +76 -0
  70. package/dist/providers/anthropic.test.js.map +1 -0
  71. package/dist/providers/mock.d.ts +17 -0
  72. package/dist/providers/mock.d.ts.map +1 -0
  73. package/dist/providers/mock.js +39 -0
  74. package/dist/providers/mock.js.map +1 -0
  75. package/dist/providers/ollama.d.ts +18 -0
  76. package/dist/providers/ollama.d.ts.map +1 -0
  77. package/dist/providers/ollama.js +155 -0
  78. package/dist/providers/ollama.js.map +1 -0
  79. package/dist/providers/ollama.test.d.ts +2 -0
  80. package/dist/providers/ollama.test.d.ts.map +1 -0
  81. package/dist/providers/ollama.test.js +123 -0
  82. package/dist/providers/ollama.test.js.map +1 -0
  83. package/dist/providers/openai-responses.d.ts +18 -0
  84. package/dist/providers/openai-responses.d.ts.map +1 -0
  85. package/dist/providers/openai-responses.js +175 -0
  86. package/dist/providers/openai-responses.js.map +1 -0
  87. package/dist/providers/openai.d.ts +16 -0
  88. package/dist/providers/openai.d.ts.map +1 -0
  89. package/dist/providers/openai.js +132 -0
  90. package/dist/providers/openai.js.map +1 -0
  91. package/dist/providers/openai.test.d.ts +2 -0
  92. package/dist/providers/openai.test.d.ts.map +1 -0
  93. package/dist/providers/openai.test.js +51 -0
  94. package/dist/providers/openai.test.js.map +1 -0
  95. package/dist/providers/provider.d.ts +42 -0
  96. package/dist/providers/provider.d.ts.map +1 -0
  97. package/dist/providers/provider.js +10 -0
  98. package/dist/providers/provider.js.map +1 -0
  99. package/dist/providers/registry.d.ts +42 -0
  100. package/dist/providers/registry.d.ts.map +1 -0
  101. package/dist/providers/registry.js +65 -0
  102. package/dist/providers/registry.js.map +1 -0
  103. package/dist/runner.d.ts +46 -0
  104. package/dist/runner.d.ts.map +1 -0
  105. package/dist/runner.js +324 -0
  106. package/dist/runner.js.map +1 -0
  107. package/dist/runner.test.d.ts +2 -0
  108. package/dist/runner.test.d.ts.map +1 -0
  109. package/dist/runner.test.js +280 -0
  110. package/dist/runner.test.js.map +1 -0
  111. package/dist/script-executor.d.ts +11 -0
  112. package/dist/script-executor.d.ts.map +1 -0
  113. package/dist/script-executor.js +85 -0
  114. package/dist/script-executor.js.map +1 -0
  115. package/dist/tools/builtin/git.d.ts +6 -0
  116. package/dist/tools/builtin/git.d.ts.map +1 -0
  117. package/dist/tools/builtin/git.js +294 -0
  118. package/dist/tools/builtin/git.js.map +1 -0
  119. package/dist/tools/builtin/patch.d.ts +6 -0
  120. package/dist/tools/builtin/patch.d.ts.map +1 -0
  121. package/dist/tools/builtin/patch.js +238 -0
  122. package/dist/tools/builtin/patch.js.map +1 -0
  123. package/dist/tools/builtin/repo-manager.d.ts +6 -0
  124. package/dist/tools/builtin/repo-manager.d.ts.map +1 -0
  125. package/dist/tools/builtin/repo-manager.js +171 -0
  126. package/dist/tools/builtin/repo-manager.js.map +1 -0
  127. package/dist/tools/builtin/search.d.ts +6 -0
  128. package/dist/tools/builtin/search.d.ts.map +1 -0
  129. package/dist/tools/builtin/search.js +104 -0
  130. package/dist/tools/builtin/search.js.map +1 -0
  131. package/dist/tools/builtin/shell.d.ts +6 -0
  132. package/dist/tools/builtin/shell.d.ts.map +1 -0
  133. package/dist/tools/builtin/shell.js +78 -0
  134. package/dist/tools/builtin/shell.js.map +1 -0
  135. package/dist/tools/builtin/studio-run.d.ts +12 -0
  136. package/dist/tools/builtin/studio-run.d.ts.map +1 -0
  137. package/dist/tools/builtin/studio-run.js +61 -0
  138. package/dist/tools/builtin/studio-run.js.map +1 -0
  139. package/dist/tools/builtin/web-search.d.ts +7 -0
  140. package/dist/tools/builtin/web-search.d.ts.map +1 -0
  141. package/dist/tools/builtin/web-search.js +94 -0
  142. package/dist/tools/builtin/web-search.js.map +1 -0
  143. package/dist/tools/builtin/web-search.test.d.ts +5 -0
  144. package/dist/tools/builtin/web-search.test.d.ts.map +1 -0
  145. package/dist/tools/builtin/web-search.test.js +90 -0
  146. package/dist/tools/builtin/web-search.test.js.map +1 -0
  147. package/dist/tools/errors.d.ts +4 -0
  148. package/dist/tools/errors.d.ts.map +1 -0
  149. package/dist/tools/errors.js +11 -0
  150. package/dist/tools/errors.js.map +1 -0
  151. package/dist/tools/errors.test.d.ts +2 -0
  152. package/dist/tools/errors.test.d.ts.map +1 -0
  153. package/dist/tools/errors.test.js +14 -0
  154. package/dist/tools/errors.test.js.map +1 -0
  155. package/dist/tools/plugin-loader.d.ts +31 -0
  156. package/dist/tools/plugin-loader.d.ts.map +1 -0
  157. package/dist/tools/plugin-loader.js +183 -0
  158. package/dist/tools/plugin-loader.js.map +1 -0
  159. package/dist/tools/plugin-loader.test.d.ts +2 -0
  160. package/dist/tools/plugin-loader.test.d.ts.map +1 -0
  161. package/dist/tools/plugin-loader.test.js +116 -0
  162. package/dist/tools/plugin-loader.test.js.map +1 -0
  163. package/dist/tools/skills/skill-loader.d.ts +23 -0
  164. package/dist/tools/skills/skill-loader.d.ts.map +1 -0
  165. package/dist/tools/skills/skill-loader.js +58 -0
  166. package/dist/tools/skills/skill-loader.js.map +1 -0
  167. package/dist/tools/skills/skill-loader.test.d.ts +2 -0
  168. package/dist/tools/skills/skill-loader.test.d.ts.map +1 -0
  169. package/dist/tools/skills/skill-loader.test.js +92 -0
  170. package/dist/tools/skills/skill-loader.test.js.map +1 -0
  171. package/dist/tools/tool-executor.d.ts +12 -0
  172. package/dist/tools/tool-executor.d.ts.map +1 -0
  173. package/dist/tools/tool-executor.js +76 -0
  174. package/dist/tools/tool-executor.js.map +1 -0
  175. package/dist/tools/tool-executor.test.d.ts +2 -0
  176. package/dist/tools/tool-executor.test.d.ts.map +1 -0
  177. package/dist/tools/tool-executor.test.js +83 -0
  178. package/dist/tools/tool-executor.test.js.map +1 -0
  179. package/dist/tools/tool-registry.d.ts +65 -0
  180. package/dist/tools/tool-registry.d.ts.map +1 -0
  181. package/dist/tools/tool-registry.js +112 -0
  182. package/dist/tools/tool-registry.js.map +1 -0
  183. package/dist/tools/yaml-executor.d.ts +22 -0
  184. package/dist/tools/yaml-executor.d.ts.map +1 -0
  185. package/dist/tools/yaml-executor.js +80 -0
  186. package/dist/tools/yaml-executor.js.map +1 -0
  187. package/dist/utils/race-signal.d.ts +6 -0
  188. package/dist/utils/race-signal.d.ts.map +1 -0
  189. package/dist/utils/race-signal.js +21 -0
  190. package/dist/utils/race-signal.js.map +1 -0
  191. package/dist/utils/race-signal.test.d.ts +2 -0
  192. package/dist/utils/race-signal.test.d.ts.map +1 -0
  193. package/dist/utils/race-signal.test.js +48 -0
  194. package/dist/utils/race-signal.test.js.map +1 -0
  195. package/package.json +36 -0
  196. package/src/__tests__/script-executor.test.ts +180 -0
  197. package/src/index.ts +68 -0
  198. package/src/integrations/integration-loader.test.ts +88 -0
  199. package/src/integrations/integration-loader.ts +68 -0
  200. package/src/middleware/anonymization.ts +38 -0
  201. package/src/plugins/index.ts +4 -0
  202. package/src/plugins/mcp-client.test.ts +148 -0
  203. package/src/plugins/mcp-client.ts +128 -0
  204. package/src/plugins/oauth-provider.test.ts +167 -0
  205. package/src/plugins/oauth-provider.ts +175 -0
  206. package/src/plugins/plugin-loader.test.ts +114 -0
  207. package/src/plugins/plugin-loader.ts +90 -0
  208. package/src/prompt-builder.test.ts +167 -0
  209. package/src/prompt-builder.ts +332 -0
  210. package/src/providers/anthropic.test.ts +101 -0
  211. package/src/providers/anthropic.ts +135 -0
  212. package/src/providers/mock.ts +57 -0
  213. package/src/providers/ollama.test.ts +166 -0
  214. package/src/providers/ollama.ts +152 -0
  215. package/src/providers/openai-responses.ts +212 -0
  216. package/src/providers/openai.test.ts +67 -0
  217. package/src/providers/openai.ts +139 -0
  218. package/src/providers/provider.ts +54 -0
  219. package/src/providers/registry.ts +77 -0
  220. package/src/runner.test.ts +343 -0
  221. package/src/runner.ts +396 -0
  222. package/src/script-executor.ts +107 -0
  223. package/src/tools/builtin/git.ts +311 -0
  224. package/src/tools/builtin/patch.ts +257 -0
  225. package/src/tools/builtin/repo-manager.ts +142 -0
  226. package/src/tools/builtin/search.ts +108 -0
  227. package/src/tools/builtin/shell.ts +82 -0
  228. package/src/tools/builtin/studio-run.ts +73 -0
  229. package/src/tools/builtin/web-search.test.ts +122 -0
  230. package/src/tools/builtin/web-search.ts +101 -0
  231. package/src/tools/errors.test.ts +12 -0
  232. package/src/tools/errors.ts +6 -0
  233. package/src/tools/plugin-loader.test.ts +130 -0
  234. package/src/tools/plugin-loader.ts +203 -0
  235. package/src/tools/skills/README.md +49 -0
  236. package/src/tools/skills/skill-loader.test.ts +106 -0
  237. package/src/tools/skills/skill-loader.ts +62 -0
  238. package/src/tools/tool-executor.test.ts +88 -0
  239. package/src/tools/tool-executor.ts +84 -0
  240. package/src/tools/tool-registry.ts +130 -0
  241. package/src/tools/yaml-executor.ts +120 -0
  242. package/src/utils/race-signal.test.ts +50 -0
  243. package/src/utils/race-signal.ts +17 -0
  244. package/templates/integrations/linear.integration.yaml +35 -0
  245. package/templates/integrations/slack.integration.yaml +22 -0
  246. package/templates/integrations/webhook.integration.yaml +17 -0
  247. package/templates/tools/git.tool.yaml +80 -0
  248. package/templates/tools/repo-manager.tool.yaml +64 -0
  249. package/templates/tools/search.tool.yaml +22 -0
  250. package/templates/tools/shell.tool.yaml +19 -0
  251. package/templates/tools/web-search.tool.yaml +24 -0
  252. package/tests/anonymization-middleware.test.ts +61 -0
  253. package/tests/anthropic.test.ts +87 -0
  254. package/tests/apply-patch.test.ts +355 -0
  255. package/tests/fixtures/tools/test-builtin.tool.yaml +14 -0
  256. package/tests/fixtures/tools/test-shell.tool.yaml +19 -0
  257. package/tests/mock-provider.test.ts +104 -0
  258. package/tests/openai.test.ts +72 -0
  259. package/tests/plugin-loader.test.ts +54 -0
  260. package/tests/prompt-builder.test.ts +468 -0
  261. package/tests/runner-anonymization.test.ts +89 -0
  262. package/tests/runner.test.ts +885 -0
  263. package/tests/studio-run.test.ts +94 -0
  264. package/tests/tool-executor.test.ts +115 -0
  265. package/tests/tool-registry.test.ts +84 -0
  266. package/tests/yaml-executor.test.ts +76 -0
  267. package/tsconfig.json +20 -0
  268. package/vitest.config.ts +7 -0
package/dist/runner.js ADDED
@@ -0,0 +1,324 @@
1
+ "use strict";
2
+ /**
3
+ * Main agent runner function - executes agent with LLM + tools
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runAgent = runAgent;
7
+ const prompt_builder_js_1 = require("./prompt-builder.js");
8
+ const tool_executor_js_1 = require("./tools/tool-executor.js");
9
+ const provider_js_1 = require("./providers/provider.js");
10
+ const DEFAULT_MAX_TOOL_CALLS = 20; // Safety limit for tool calling loop
11
+ /**
12
+ * Run an agent task with LLM + tool execution
13
+ *
14
+ * Flow:
15
+ * 1. Build prompt with context + retry info
16
+ * 2. Call LLM provider
17
+ * 3. Execute tool calls (multi-turn loop)
18
+ * 4. Return complete result with tracked tool calls
19
+ */
20
+ async function runAgent(config) {
21
+ const startTime = Date.now();
22
+ const { agent, task, context, executionContext, toolRegistry, providerRegistry, signal } = config;
23
+ const maxToolCalls = config.maxToolCalls ?? DEFAULT_MAX_TOOL_CALLS;
24
+ const mw = config.anonymizationMiddleware;
25
+ // Get provider
26
+ const provider = providerRegistry.get(agent.provider);
27
+ // Get allowed tools for this agent (filter if specified)
28
+ const allowedTools = agent.tools && agent.tools.length > 0
29
+ ? toolRegistry.filter(agent.tools)
30
+ : toolRegistry;
31
+ const promptSnippets = allowedTools.getActiveSnippets();
32
+ // Injection point 1: Anonymize task input before building prompt
33
+ const taskForPrompt = mw
34
+ ? { ...task, description: mw.anonymize(task.description) }
35
+ : task;
36
+ // Build initial prompt
37
+ const messages = (0, prompt_builder_js_1.buildPrompt)({
38
+ agent,
39
+ task: taskForPrompt,
40
+ context,
41
+ executionContext,
42
+ outputContract: config.outputContract,
43
+ promptSnippets,
44
+ });
45
+ const toolDefinitions = allowedTools.toToolDefinitions();
46
+ // Tool executor
47
+ const toolExecutor = new tool_executor_js_1.ToolExecutor(allowedTools);
48
+ // Track all tool calls made during execution
49
+ const allToolCalls = [];
50
+ // Accumulate token usage across turns
51
+ const tokenAccumulator = { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 };
52
+ // Build onToken wrapper that bridges provider token callbacks → RunnerCallbacks.onAgentToken
53
+ const onToken = config.callbacks?.onAgentToken
54
+ ? (token) => config.callbacks.onAgentToken({ token, timestamp: Date.now() })
55
+ : undefined;
56
+ // --- Delegate to provider if it owns the full agent loop (e.g. Responses API) ---
57
+ if ((0, provider_js_1.isAgentLoopProvider)(provider)) {
58
+ const loopResult = await provider.runAgentLoop({
59
+ model: agent.model,
60
+ messages,
61
+ tools: toolDefinitions.length > 0 ? toolDefinitions : undefined,
62
+ temperature: agent.temperature,
63
+ max_tokens: agent.max_tokens,
64
+ stage_name: task.contract_name,
65
+ }, async (name, args, callId) => {
66
+ const tcStart = Date.now();
67
+ config.callbacks?.onToolCallStart?.({
68
+ tool: name,
69
+ params: args,
70
+ timestamp: tcStart,
71
+ });
72
+ // pre_tool_use: check if hook wants to block this tool call
73
+ if (config.callbacks?.onPreToolUse) {
74
+ const preResult = await config.callbacks.onPreToolUse({ tool: name, params: args, timestamp: tcStart });
75
+ if (preResult.blocked) {
76
+ const blockedCall = {
77
+ id: callId,
78
+ name,
79
+ arguments: args,
80
+ error: preResult.error ?? 'Pre-tool hook blocked execution',
81
+ };
82
+ allToolCalls.push(blockedCall);
83
+ return { result: undefined, error: blockedCall.error };
84
+ }
85
+ }
86
+ const executed = await toolExecutor.execute({ id: callId, name, arguments: args });
87
+ allToolCalls.push(executed);
88
+ config.callbacks?.onToolCallComplete?.({
89
+ tool: name,
90
+ result: executed.result,
91
+ error: executed.error,
92
+ duration_ms: Date.now() - tcStart,
93
+ timestamp: Date.now(),
94
+ });
95
+ // post_tool_use: notify (append_message not injected in agent loop path — provider controls conversation)
96
+ if (config.callbacks?.onPostToolUse) {
97
+ await config.callbacks.onPostToolUse({
98
+ tool: name,
99
+ params: args,
100
+ result: executed.result,
101
+ error: executed.error,
102
+ timestamp: Date.now(),
103
+ });
104
+ }
105
+ // Injection point 2: Anonymize tool results before returning to LLM
106
+ let result = executed.result;
107
+ if (mw && result !== undefined) {
108
+ const resultStr = mw.anonymize(JSON.stringify(result));
109
+ try {
110
+ result = JSON.parse(resultStr);
111
+ }
112
+ catch {
113
+ result = resultStr;
114
+ }
115
+ }
116
+ return { result, error: executed.error };
117
+ }, onToken, signal);
118
+ if (loopResult.usage) {
119
+ tokenAccumulator.prompt_tokens += loopResult.usage.prompt_tokens;
120
+ tokenAccumulator.completion_tokens += loopResult.usage.completion_tokens;
121
+ tokenAccumulator.total_tokens += loopResult.usage.total_tokens;
122
+ }
123
+ const finalContent = mw ? mw.deanonymize(loopResult.content) : loopResult.content;
124
+ const output = parseAgentOutput(finalContent);
125
+ const duration = Date.now() - startTime;
126
+ return {
127
+ output,
128
+ tool_calls: allToolCalls,
129
+ tool_calls_count: allToolCalls.filter(tc => !tc.error).length,
130
+ raw_response: {
131
+ content: loopResult.content,
132
+ tool_calls: loopResult.tool_calls.map(tc => ({ id: tc.id, name: tc.name, arguments: tc.arguments })),
133
+ finish_reason: loopResult.finish_reason,
134
+ usage: loopResult.usage,
135
+ },
136
+ duration_ms: duration,
137
+ token_usage: tokenAccumulator.total_tokens > 0 ? tokenAccumulator : undefined,
138
+ };
139
+ }
140
+ // --- Standard multi-turn loop (Chat Completions style) ---
141
+ let currentMessages = messages;
142
+ let iterations = 0;
143
+ let lastResponse = null;
144
+ while (iterations < maxToolCalls) {
145
+ // Check for cancellation before calling LLM
146
+ if (signal?.aborted) {
147
+ throw new DOMException('The operation was aborted', 'AbortError');
148
+ }
149
+ // Call LLM
150
+ const response = await provider.call({
151
+ model: agent.model,
152
+ messages: currentMessages,
153
+ tools: toolDefinitions.length > 0 ? toolDefinitions : undefined,
154
+ temperature: agent.temperature,
155
+ max_tokens: agent.max_tokens,
156
+ stage_name: task.contract_name,
157
+ json_mode: !!task.contract_name,
158
+ }, onToken, signal);
159
+ lastResponse = response;
160
+ if (response.usage) {
161
+ tokenAccumulator.prompt_tokens += response.usage.prompt_tokens;
162
+ tokenAccumulator.completion_tokens += response.usage.completion_tokens;
163
+ tokenAccumulator.total_tokens += response.usage.total_tokens;
164
+ }
165
+ // Check if there are tool calls to execute
166
+ if (!response.tool_calls || response.tool_calls.length === 0) {
167
+ // No tool calls - this is the final response
168
+ break;
169
+ }
170
+ // Emit thinking/progress if the LLM produced text alongside tool calls
171
+ const thinkingText = response.content?.trim();
172
+ if (thinkingText) {
173
+ const now = Date.now();
174
+ if (iterations === 0) {
175
+ config.callbacks?.onAgentThinking?.({ thought: thinkingText, timestamp: now });
176
+ }
177
+ else {
178
+ config.callbacks?.onAgentProgress?.({ message: thinkingText, timestamp: now });
179
+ }
180
+ }
181
+ // Execute each tool call
182
+ const executedToolCalls = [];
183
+ const appendMessages = new Map(); // tc.id → post-hook message
184
+ for (const tc of response.tool_calls) {
185
+ const tcStart = Date.now();
186
+ config.callbacks?.onToolCallStart?.({
187
+ tool: tc.name,
188
+ params: tc.arguments,
189
+ timestamp: tcStart,
190
+ });
191
+ // pre_tool_use: check if hook wants to block this tool call
192
+ let executed;
193
+ let wasBlocked = false;
194
+ if (config.callbacks?.onPreToolUse) {
195
+ const preResult = await config.callbacks.onPreToolUse({
196
+ tool: tc.name,
197
+ params: tc.arguments,
198
+ timestamp: tcStart,
199
+ });
200
+ if (preResult.blocked) {
201
+ wasBlocked = true;
202
+ executed = {
203
+ id: tc.id,
204
+ name: tc.name,
205
+ arguments: tc.arguments,
206
+ error: preResult.error ?? 'Pre-tool hook blocked execution',
207
+ };
208
+ }
209
+ }
210
+ if (!wasBlocked) {
211
+ executed = await toolExecutor.execute({
212
+ id: tc.id,
213
+ name: tc.name,
214
+ arguments: tc.arguments,
215
+ });
216
+ }
217
+ executedToolCalls.push(executed);
218
+ allToolCalls.push(executed);
219
+ if (!wasBlocked) {
220
+ config.callbacks?.onToolCallComplete?.({
221
+ tool: tc.name,
222
+ result: executed.result,
223
+ error: executed.error,
224
+ duration_ms: Date.now() - tcStart,
225
+ timestamp: Date.now(),
226
+ });
227
+ }
228
+ // post_tool_use: only called if tool was not blocked
229
+ if (!wasBlocked && config.callbacks?.onPostToolUse) {
230
+ const postResult = await config.callbacks.onPostToolUse({
231
+ tool: tc.name,
232
+ params: tc.arguments,
233
+ result: executed.result,
234
+ error: executed.error,
235
+ timestamp: Date.now(),
236
+ });
237
+ if (postResult.append_message) {
238
+ appendMessages.set(tc.id, postResult.append_message);
239
+ }
240
+ }
241
+ }
242
+ // Add assistant message with tool calls to conversation
243
+ currentMessages.push({
244
+ role: 'assistant',
245
+ content: response.content || ''
246
+ });
247
+ // Add tool results as user messages
248
+ // Format them clearly so the LLM can understand the results
249
+ const toolResultsMessage = executedToolCalls.map(tc => {
250
+ let msg;
251
+ if (tc.error) {
252
+ msg = `Tool ${tc.name} (id: ${tc.id}) failed: ${tc.error}`;
253
+ }
254
+ else {
255
+ msg = `Tool ${tc.name} (id: ${tc.id}) result: ${JSON.stringify(tc.result)}`;
256
+ }
257
+ const appendMsg = appendMessages.get(tc.id);
258
+ if (appendMsg) {
259
+ msg += `\n\nPost-hook note: ${appendMsg}`;
260
+ }
261
+ return msg;
262
+ }).join('\n\n');
263
+ const toolResultContent = `Tool execution results:\n\n${toolResultsMessage}`;
264
+ currentMessages.push({
265
+ role: 'user',
266
+ // Injection point 4: Anonymize tool results before adding to conversation
267
+ content: mw ? mw.anonymize(toolResultContent) : toolResultContent,
268
+ });
269
+ iterations++;
270
+ }
271
+ if (iterations >= maxToolCalls) {
272
+ const duration = Date.now() - startTime;
273
+ return {
274
+ output: null,
275
+ tool_calls: allToolCalls,
276
+ tool_calls_count: allToolCalls.filter(tc => !tc.error).length,
277
+ raw_response: lastResponse,
278
+ duration_ms: duration,
279
+ token_usage: tokenAccumulator.total_tokens > 0 ? tokenAccumulator : undefined,
280
+ error: `Maximum tool calling iterations (${maxToolCalls}) reached. Possible infinite loop.`,
281
+ };
282
+ }
283
+ if (!lastResponse) {
284
+ throw new Error('No response received from LLM');
285
+ }
286
+ // Parse final output from the last response content
287
+ const finalContent = mw ? mw.deanonymize(lastResponse.content) : lastResponse.content;
288
+ const output = parseAgentOutput(finalContent);
289
+ const duration = Date.now() - startTime;
290
+ return {
291
+ output,
292
+ tool_calls: allToolCalls,
293
+ tool_calls_count: allToolCalls.filter(tc => !tc.error).length,
294
+ raw_response: lastResponse,
295
+ duration_ms: duration,
296
+ token_usage: tokenAccumulator.total_tokens > 0 ? tokenAccumulator : undefined,
297
+ };
298
+ }
299
+ function parseAgentOutput(rawContent) {
300
+ // Try 1: Direct JSON parse
301
+ try {
302
+ return JSON.parse(rawContent);
303
+ }
304
+ catch { }
305
+ // Try 2: Extract from markdown code block
306
+ const codeBlockMatch = rawContent.match(/```(?:json)?\s*\n?([\s\S]*?)\n?```/);
307
+ if (codeBlockMatch) {
308
+ try {
309
+ return JSON.parse(codeBlockMatch[1].trim());
310
+ }
311
+ catch { }
312
+ }
313
+ // Try 3: Find first { ... } in the response
314
+ const jsonMatch = rawContent.match(/\{[\s\S]*\}/);
315
+ if (jsonMatch) {
316
+ try {
317
+ return JSON.parse(jsonMatch[0]);
318
+ }
319
+ catch { }
320
+ }
321
+ // Failed to parse — return raw string, ralph validation will reject it
322
+ return rawContent;
323
+ }
324
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=runner.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.test.d.ts","sourceRoot":"","sources":["../src/runner.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,280 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const runner_js_1 = require("./runner.js");
5
+ const tool_registry_js_1 = require("./tools/tool-registry.js");
6
+ const registry_js_1 = require("./providers/registry.js");
7
+ const mock_js_1 = require("./providers/mock.js");
8
+ /**
9
+ * A minimal Chat Completions-style provider (NOT AgentLoopProvider).
10
+ * First call returns one tool call; second call returns the final content.
11
+ * Tracks the messages received on each call so tests can assert on them.
12
+ */
13
+ class StandardProvider {
14
+ name = 'standard-mock';
15
+ callCount = 0;
16
+ receivedMessages = [];
17
+ async call(request) {
18
+ this.receivedMessages = request.messages;
19
+ this.callCount++;
20
+ if (this.callCount === 1) {
21
+ return {
22
+ content: '',
23
+ tool_calls: [{ id: 'call-1', name: 'repo_manager-write_file', arguments: { path: '/tmp/foo.ts', content: 'hello' } }],
24
+ finish_reason: 'tool_calls',
25
+ };
26
+ }
27
+ // Second call: final response
28
+ return {
29
+ content: JSON.stringify({ summary: 'done' }),
30
+ tool_calls: [],
31
+ finish_reason: 'stop',
32
+ };
33
+ }
34
+ }
35
+ function makeConfig(toolCallName, toolCallArgs) {
36
+ const toolRegistry = new tool_registry_js_1.ToolRegistry();
37
+ const mockExecute = vitest_1.vi.fn().mockResolvedValue({ success: true, output: 'wrote file' });
38
+ toolRegistry.register({
39
+ name: toolCallName,
40
+ description: 'A test tool',
41
+ parameters: {
42
+ type: 'object',
43
+ properties: Object.fromEntries(Object.keys(toolCallArgs).map(k => [k, { type: 'string' }])),
44
+ },
45
+ execute: mockExecute,
46
+ });
47
+ const mockProvider = new mock_js_1.MockProvider(new Map([
48
+ ['test-stage', {
49
+ output: { summary: 'done' },
50
+ tool_calls: [{ name: toolCallName, arguments: toolCallArgs }],
51
+ }],
52
+ ]));
53
+ const providerRegistry = new registry_js_1.ProviderRegistry();
54
+ providerRegistry.register(mockProvider);
55
+ const agent = {
56
+ name: 'test-agent',
57
+ provider: 'mock',
58
+ model: 'mock',
59
+ };
60
+ return { agent, toolRegistry, providerRegistry, mockExecute };
61
+ }
62
+ /**
63
+ * A Chat Completions-style provider that always returns a tool call — simulates an infinite loop.
64
+ */
65
+ class LoopingProvider {
66
+ name = 'looping-mock';
67
+ callCount = 0;
68
+ async call(_request) {
69
+ this.callCount++;
70
+ return {
71
+ content: '',
72
+ tool_calls: [{ id: `call-${this.callCount}`, name: 'repo_manager-write_file', arguments: { path: '/tmp/foo.ts', content: 'hello' } }],
73
+ finish_reason: 'tool_calls',
74
+ };
75
+ }
76
+ }
77
+ (0, vitest_1.describe)('runner — max tool iterations', () => {
78
+ (0, vitest_1.it)('returns an error result instead of throwing when max iterations is reached', async () => {
79
+ const toolRegistry = new tool_registry_js_1.ToolRegistry();
80
+ toolRegistry.register({
81
+ name: 'repo_manager-write_file',
82
+ description: 'Write a file',
83
+ parameters: { type: 'object', properties: { path: { type: 'string' }, content: { type: 'string' } } },
84
+ execute: vitest_1.vi.fn().mockResolvedValue({ success: true }),
85
+ });
86
+ const loopingProvider = new LoopingProvider();
87
+ const providerRegistry = new registry_js_1.ProviderRegistry();
88
+ providerRegistry.register(loopingProvider);
89
+ const agent = { name: 'test-agent', provider: 'looping-mock', model: 'mock' };
90
+ const result = await (0, runner_js_1.runAgent)({
91
+ agent,
92
+ task: { description: 'write a file' },
93
+ context: {},
94
+ toolRegistry,
95
+ providerRegistry,
96
+ maxToolCalls: 3,
97
+ });
98
+ (0, vitest_1.expect)(result.error).toBeDefined();
99
+ (0, vitest_1.expect)(result.error).toContain('Maximum tool calling iterations');
100
+ (0, vitest_1.expect)(result.error).toContain('3');
101
+ (0, vitest_1.expect)(loopingProvider.callCount).toBe(3);
102
+ });
103
+ (0, vitest_1.it)('includes tool calls made before hitting the limit in the error result', async () => {
104
+ const toolRegistry = new tool_registry_js_1.ToolRegistry();
105
+ const mockExecute = vitest_1.vi.fn().mockResolvedValue({ success: true });
106
+ toolRegistry.register({
107
+ name: 'repo_manager-write_file',
108
+ description: 'Write a file',
109
+ parameters: { type: 'object', properties: { path: { type: 'string' }, content: { type: 'string' } } },
110
+ execute: mockExecute,
111
+ });
112
+ const providerRegistry = new registry_js_1.ProviderRegistry();
113
+ providerRegistry.register(new LoopingProvider());
114
+ const agent = { name: 'test-agent', provider: 'looping-mock', model: 'mock' };
115
+ const result = await (0, runner_js_1.runAgent)({
116
+ agent,
117
+ task: { description: 'write a file' },
118
+ context: {},
119
+ toolRegistry,
120
+ providerRegistry,
121
+ maxToolCalls: 2,
122
+ });
123
+ (0, vitest_1.expect)(result.error).toBeDefined();
124
+ (0, vitest_1.expect)(result.tool_calls).toHaveLength(2);
125
+ (0, vitest_1.expect)(mockExecute).toHaveBeenCalledTimes(2);
126
+ });
127
+ });
128
+ (0, vitest_1.describe)('runner — onPreToolUse callback', () => {
129
+ (0, vitest_1.it)('blocks tool execution when callback returns blocked: true', async () => {
130
+ const { agent, toolRegistry, providerRegistry, mockExecute } = makeConfig('repo_manager-write_file', { path: '/tmp/foo.ts', content: 'hello' });
131
+ const onPreToolUse = vitest_1.vi.fn().mockResolvedValue({ blocked: true, error: 'pre-hook blocked' });
132
+ const result = await (0, runner_js_1.runAgent)({
133
+ agent,
134
+ task: { description: 'write a file', contract_name: 'test-stage' },
135
+ context: {},
136
+ toolRegistry,
137
+ providerRegistry,
138
+ callbacks: { onPreToolUse },
139
+ });
140
+ // Tool should appear in tool_calls with error (not actually executed)
141
+ (0, vitest_1.expect)(result.tool_calls).toHaveLength(1);
142
+ (0, vitest_1.expect)(result.tool_calls[0].error).toContain('pre-hook blocked');
143
+ (0, vitest_1.expect)(result.tool_calls[0].result).toBeUndefined();
144
+ (0, vitest_1.expect)(mockExecute).not.toHaveBeenCalled();
145
+ });
146
+ (0, vitest_1.it)('allows tool execution when callback returns blocked: false', async () => {
147
+ const { agent, toolRegistry, providerRegistry, mockExecute } = makeConfig('repo_manager-write_file', { path: '/tmp/foo.ts', content: 'hello' });
148
+ const onPreToolUse = vitest_1.vi.fn().mockResolvedValue({ blocked: false });
149
+ const result = await (0, runner_js_1.runAgent)({
150
+ agent,
151
+ task: { description: 'write a file', contract_name: 'test-stage' },
152
+ context: {},
153
+ toolRegistry,
154
+ providerRegistry,
155
+ callbacks: { onPreToolUse },
156
+ });
157
+ (0, vitest_1.expect)(result.tool_calls).toHaveLength(1);
158
+ (0, vitest_1.expect)(result.tool_calls[0].result).toBe('wrote file');
159
+ (0, vitest_1.expect)(mockExecute).toHaveBeenCalledOnce();
160
+ });
161
+ (0, vitest_1.it)('blocks tool execution in standard (Chat Completions) path', async () => {
162
+ const toolRegistry = new tool_registry_js_1.ToolRegistry();
163
+ const mockExecute = vitest_1.vi.fn().mockResolvedValue({ success: true, output: 'wrote file' });
164
+ toolRegistry.register({
165
+ name: 'repo_manager-write_file',
166
+ description: 'A test tool',
167
+ parameters: {
168
+ type: 'object',
169
+ properties: {
170
+ path: { type: 'string' },
171
+ content: { type: 'string' },
172
+ },
173
+ },
174
+ execute: mockExecute,
175
+ });
176
+ const standardProvider = new StandardProvider();
177
+ const providerRegistry = new registry_js_1.ProviderRegistry();
178
+ providerRegistry.register(standardProvider);
179
+ const agent = {
180
+ name: 'test-agent',
181
+ provider: 'standard-mock',
182
+ model: 'mock',
183
+ };
184
+ const onPreToolUse = vitest_1.vi.fn().mockResolvedValue({ blocked: true, error: 'standard-path blocked' });
185
+ const result = await (0, runner_js_1.runAgent)({
186
+ agent,
187
+ task: { description: 'write a file', contract_name: 'test-stage' },
188
+ context: {},
189
+ toolRegistry,
190
+ providerRegistry,
191
+ callbacks: { onPreToolUse },
192
+ });
193
+ (0, vitest_1.expect)(result.tool_calls).toHaveLength(1);
194
+ (0, vitest_1.expect)(result.tool_calls[0].error).toContain('standard-path blocked');
195
+ (0, vitest_1.expect)(result.tool_calls[0].result).toBeUndefined();
196
+ (0, vitest_1.expect)(mockExecute).not.toHaveBeenCalled();
197
+ });
198
+ });
199
+ (0, vitest_1.describe)('runner — onPostToolUse callback', () => {
200
+ (0, vitest_1.it)('is called after successful tool execution', async () => {
201
+ const { agent, toolRegistry, providerRegistry } = makeConfig('repo_manager-write_file', { path: '/tmp/foo.ts', content: 'hello' });
202
+ const onPostToolUse = vitest_1.vi.fn().mockResolvedValue({});
203
+ await (0, runner_js_1.runAgent)({
204
+ agent,
205
+ task: { description: 'write a file', contract_name: 'test-stage' },
206
+ context: {},
207
+ toolRegistry,
208
+ providerRegistry,
209
+ callbacks: { onPostToolUse },
210
+ });
211
+ (0, vitest_1.expect)(onPostToolUse).toHaveBeenCalledOnce();
212
+ (0, vitest_1.expect)(onPostToolUse.mock.calls[0][0]).toMatchObject({
213
+ tool: 'repo_manager-write_file',
214
+ params: { path: '/tmp/foo.ts', content: 'hello' },
215
+ result: 'wrote file',
216
+ });
217
+ });
218
+ (0, vitest_1.it)('appends hook message to conversation when returned (standard path — no-op in agent loop)', async () => {
219
+ // The MockProvider uses the agent loop path, so append_message is a no-op here.
220
+ // This test verifies onPostToolUse IS called and no error is thrown.
221
+ const { agent, toolRegistry, providerRegistry } = makeConfig('repo_manager-write_file', { path: '/tmp/foo.ts', content: 'hello' });
222
+ const onPostToolUse = vitest_1.vi.fn().mockResolvedValue({
223
+ append_message: 'prettier ran successfully',
224
+ });
225
+ const result = await (0, runner_js_1.runAgent)({
226
+ agent,
227
+ task: { description: 'write a file', contract_name: 'test-stage' },
228
+ context: {},
229
+ toolRegistry,
230
+ providerRegistry,
231
+ callbacks: { onPostToolUse },
232
+ });
233
+ (0, vitest_1.expect)(onPostToolUse).toHaveBeenCalled();
234
+ // Result still succeeds
235
+ (0, vitest_1.expect)(result.tool_calls_count).toBe(1);
236
+ });
237
+ (0, vitest_1.it)('injects append_message into conversation in standard (Chat Completions) path', async () => {
238
+ const toolRegistry = new tool_registry_js_1.ToolRegistry();
239
+ const mockExecute = vitest_1.vi.fn().mockResolvedValue({ success: true, output: 'wrote file' });
240
+ toolRegistry.register({
241
+ name: 'repo_manager-write_file',
242
+ description: 'A test tool',
243
+ parameters: {
244
+ type: 'object',
245
+ properties: {
246
+ path: { type: 'string' },
247
+ content: { type: 'string' },
248
+ },
249
+ },
250
+ execute: mockExecute,
251
+ });
252
+ const standardProvider = new StandardProvider();
253
+ const providerRegistry = new registry_js_1.ProviderRegistry();
254
+ providerRegistry.register(standardProvider);
255
+ const agent = {
256
+ name: 'test-agent',
257
+ provider: 'standard-mock',
258
+ model: 'mock',
259
+ };
260
+ const onPostToolUse = vitest_1.vi.fn().mockResolvedValue({
261
+ append_message: 'prettier ran and formatted the file',
262
+ });
263
+ const result = await (0, runner_js_1.runAgent)({
264
+ agent,
265
+ task: { description: 'write a file', contract_name: 'test-stage' },
266
+ context: {},
267
+ toolRegistry,
268
+ providerRegistry,
269
+ callbacks: { onPostToolUse },
270
+ });
271
+ (0, vitest_1.expect)(onPostToolUse).toHaveBeenCalledOnce();
272
+ (0, vitest_1.expect)(result.tool_calls_count).toBe(1);
273
+ // Verify the post-hook message was injected into the conversation.
274
+ // The second call to provider.call() should include the tool result message with the append.
275
+ const secondCallMessages = standardProvider.receivedMessages;
276
+ const toolResultMessage = secondCallMessages.find(m => m.role === 'user' && m.content.includes('Tool execution results'));
277
+ (0, vitest_1.expect)(toolResultMessage?.content).toContain('Post-hook note: prettier ran and formatted the file');
278
+ });
279
+ });
280
+ //# sourceMappingURL=runner.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.test.js","sourceRoot":"","sources":["../src/runner.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { AgentRunResult } from './runner.js';
2
+ import type { AgentContext } from './prompt-builder.js';
3
+ export interface ScriptExecutorConfig {
4
+ scriptPath: string;
5
+ runtime: 'python' | 'node' | 'shell';
6
+ context: AgentContext;
7
+ cwd?: string;
8
+ timeoutMs?: number;
9
+ }
10
+ export declare function runScript(config: ScriptExecutorConfig): Promise<AgentRunResult>;
11
+ //# sourceMappingURL=script-executor.d.ts.map