@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/README.md ADDED
@@ -0,0 +1,125 @@
1
+ # @studio-foundation/runner
2
+
3
+ Multi-provider LLM agent runner with tool plugin execution, streaming support, and PII anonymization.
4
+
5
+ ## Role
6
+
7
+ runner handles everything that touches external services: LLM API calls and tool execution. It's the only package that knows about Anthropic, OpenAI, or what `repo_manager-write_file` does.
8
+
9
+ ```
10
+ engine → runner.runAgent(config) → AgentRunResult
11
+
12
+ [builds prompt] → [calls LLM] → [executes tool calls] → [returns result]
13
+ ```
14
+
15
+ ## Key exports
16
+
17
+ ```typescript
18
+ import { runAgent, createDefaultRegistry, ToolRegistry, AnonymizationMiddleware } from '@studio-foundation/runner';
19
+
20
+ const registry = createDefaultRegistry({
21
+ anthropic: { apiKey: process.env.ANTHROPIC_API_KEY },
22
+ openai: { apiKey: process.env.OPENAI_API_KEY },
23
+ });
24
+
25
+ const result = await runAgent({
26
+ agent: agentConfig,
27
+ task: taskInput,
28
+ context: agentContext,
29
+ toolRegistry,
30
+ providerRegistry: registry,
31
+ outputContract: contract,
32
+ anonymizationMiddleware: new AnonymizationMiddleware(),
33
+ callbacks: {
34
+ onToolCallStart: (e) => { /* e.tool, e.params */ },
35
+ onToolCallComplete: (e) => { /* e.tool, e.result, e.error */ },
36
+ onAgentToken: (e) => { /* streaming token */ },
37
+ onPreToolUse: async (e) => ({ blocked: false }), // hook callback
38
+ onPostToolUse: async (e) => ({}), // hook callback
39
+ },
40
+ });
41
+ ```
42
+
43
+ ## Providers
44
+
45
+ | Provider | Class | Notes |
46
+ |----------|-------|-------|
47
+ | Anthropic | `AnthropicProvider` | Claude models, prompt caching (90% cost reduction on retries) |
48
+ | OpenAI | `OpenAIProvider` | Chat completions API |
49
+ | OpenAI Responses | `OpenAIResponsesProvider` | Responses API |
50
+ | Mock | `MockProvider` | For tests — reads from `mock.yaml`, no API calls |
51
+
52
+ Use `createDefaultRegistry()` to get all providers wired up. Use `--provider mock` in the CLI for testing without API keys.
53
+
54
+ ## Builtin tools
55
+
56
+ | Tool | Factory | What it does |
57
+ |------|---------|-------------|
58
+ | `repo_manager-read_file` | `createRepoManagerTools()` | Read files in the workspace |
59
+ | `repo_manager-write_file` | `createRepoManagerTools()` | Write/create files |
60
+ | `repo_manager-list_files` | `createRepoManagerTools()` | List files and directories |
61
+ | `shell-run_command` | `createShellTools()` | Execute shell commands |
62
+ | `search-search_codebase` | `createSearchTools()` | Search code with ripgrep |
63
+ | `patch-apply_patch` | `createPatchTools()` | Apply unified diffs |
64
+ | `git-checkout` | `createGitTools()` | Checkout or create branches |
65
+ | `git-commit` | `createGitTools()` | Create commits |
66
+ | `git-push` | `createGitTools()` | Push to remote |
67
+ | `git-pull` | `createGitTools()` | Pull from remote |
68
+ | `git-status` | `createGitTools()` | Show working tree status |
69
+ | `git-diff` | `createGitTools()` | Show diffs |
70
+ | `studio_run` | `createStudioRunTool()` | Spawn and await a sub-pipeline run |
71
+
72
+ `studio_run` is only registered when a `RunSpawner` is injected into the engine (via `EngineConfig.spawner`). Agents use it to trigger nested pipelines and receive their output.
73
+
74
+ Tools are registered into a `ToolRegistry` and passed to `runAgent`. The runner injects tool descriptions into the system prompt automatically.
75
+
76
+ ## PII Anonymization
77
+
78
+ ```typescript
79
+ const middleware = new AnonymizationMiddleware();
80
+ // Passed to runAgent() → transparently replaces PII in prompts before LLM calls
81
+ // Keymap stored in .studio/runs/anonymization/<run-id>.keymap.json
82
+ const keymap = middleware.getKeymap(); // Reconstruct original values
83
+ ```
84
+
85
+ ## Plugin system
86
+
87
+ runner supports loading Claude Code plugins and YAML tool plugins:
88
+
89
+ ```typescript
90
+ import { loadPlugin } from '@studio-foundation/runner';
91
+
92
+ // Load a Claude Code plugin (.mcp.json + skills/ + agents/)
93
+ const plugin = await loadPlugin('/path/to/plugin');
94
+ // plugin.skills → array of skill markdown content
95
+ // plugin.mcpServers → MCP server configs
96
+ ```
97
+
98
+ YAML tool plugins (`.tool.yaml`) are loaded via `ToolRegistry.loadYamlPlugin()`.
99
+
100
+ ## Lifecycle hook callbacks
101
+
102
+ `onPreToolUse` and `onPostToolUse` in the callbacks wire to stage hook configuration:
103
+
104
+ ```typescript
105
+ callbacks: {
106
+ onPreToolUse: async (event) => {
107
+ // event: { tool, params, timestamp }
108
+ // Return { blocked: true, error: '...' } to block the tool call
109
+ return { blocked: false };
110
+ },
111
+ onPostToolUse: async (event) => {
112
+ // event: { tool, params, result, error, timestamp }
113
+ // Return { append_message: '...' } to inject feedback into context
114
+ return {};
115
+ },
116
+ }
117
+ ```
118
+
119
+ These callbacks are wired by the engine from the stage's `hooks` YAML configuration.
120
+
121
+ ## Rules
122
+
123
+ - **runner doesn't validate, doesn't retry.** It executes one agent turn and returns `AgentRunResult`. ralph handles the loop.
124
+ - **runner doesn't know engine.** No pipeline state, no events, no stage concepts.
125
+ - Prompt assembly lives in `prompt-builder.ts`. Provider abstractions in `providers/`.
@@ -0,0 +1,31 @@
1
+ name: analyst
2
+ version: 1.0.0
3
+ description: Agent specialized in code analysis and understanding
4
+
5
+ systemMessage: |
6
+ You are an expert code analyst that helps understand complex codebases.
7
+
8
+ When analyzing code:
9
+ - Identify key patterns and architectural decisions
10
+ - Highlight potential issues or improvements
11
+ - Explain complex logic clearly
12
+ - Trace data flow and dependencies
13
+ - Provide actionable insights
14
+
15
+ Use search and file reading tools to explore the codebase thoroughly.
16
+
17
+ capabilities:
18
+ - code_analysis
19
+ - architecture_review
20
+ - dependency_tracing
21
+ - pattern_recognition
22
+ - documentation
23
+
24
+ tools:
25
+ - repo_manager
26
+ - search
27
+ - shell
28
+
29
+ parameters:
30
+ temperature: 0.5
31
+ maxTokens: 4096
@@ -0,0 +1,31 @@
1
+ name: code-generator
2
+ version: 1.0.0
3
+ description: Agent specialized in generating and modifying code
4
+
5
+ systemMessage: |
6
+ You are an expert software engineer that writes clean, efficient, and well-documented code.
7
+
8
+ When generating code:
9
+ - Follow best practices and conventions for the target language
10
+ - Include appropriate error handling
11
+ - Add clear comments and documentation
12
+ - Use modern language features appropriately
13
+ - Ensure code is production-ready
14
+
15
+ Use the available tools to read existing code, write new files, and search the codebase.
16
+
17
+ capabilities:
18
+ - code_generation
19
+ - code_modification
20
+ - refactoring
21
+ - file_operations
22
+ - code_analysis
23
+
24
+ tools:
25
+ - repo_manager
26
+ - search
27
+ - shell
28
+
29
+ parameters:
30
+ temperature: 0.3
31
+ maxTokens: 4096
@@ -0,0 +1,23 @@
1
+ name: generic
2
+ version: 1.0.0
3
+ description: General-purpose assistant agent
4
+
5
+ systemMessage: |
6
+ You are a helpful assistant that can perform tasks using available tools.
7
+ Be concise and accurate in your responses.
8
+ Use tools when necessary to accomplish the user's goals.
9
+
10
+ capabilities:
11
+ - general_qa
12
+ - file_operations
13
+ - command_execution
14
+ - code_search
15
+
16
+ tools:
17
+ - repo_manager
18
+ - shell
19
+ - search
20
+
21
+ parameters:
22
+ temperature: 0.7
23
+ maxTokens: 2048
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=script-executor.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"script-executor.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/script-executor.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,173 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const vitest_1 = require("vitest");
37
+ const cp = __importStar(require("node:child_process"));
38
+ const fs = __importStar(require("node:fs"));
39
+ const node_events_1 = require("node:events");
40
+ // Mock child_process and fs before importing the module under test
41
+ vitest_1.vi.mock('node:child_process');
42
+ vitest_1.vi.mock('node:fs');
43
+ const script_executor_js_1 = require("../script-executor.js");
44
+ function makeContext(overrides) {
45
+ return {
46
+ input: 'test input',
47
+ ...overrides,
48
+ };
49
+ }
50
+ function makeSpawnMock(opts) {
51
+ const proc = new node_events_1.EventEmitter();
52
+ proc.stdout = new node_events_1.EventEmitter();
53
+ proc.stderr = new node_events_1.EventEmitter();
54
+ proc.stdin = { write: vitest_1.vi.fn(), end: vitest_1.vi.fn() };
55
+ proc.kill = vitest_1.vi.fn();
56
+ vitest_1.vi.mocked(cp.spawn).mockReturnValue(proc);
57
+ // Simulate async process lifecycle
58
+ setTimeout(() => {
59
+ if (opts.errorEvent) {
60
+ proc.emit('error', opts.errorEvent);
61
+ return;
62
+ }
63
+ if (opts.stdout)
64
+ proc.stdout.emit('data', Buffer.from(opts.stdout));
65
+ if (opts.stderr)
66
+ proc.stderr.emit('data', Buffer.from(opts.stderr));
67
+ proc.emit('close', opts.exitCode ?? 0);
68
+ }, 10);
69
+ return proc;
70
+ }
71
+ (0, vitest_1.beforeEach)(() => {
72
+ vitest_1.vi.mocked(fs.existsSync).mockReturnValue(false);
73
+ vitest_1.vi.clearAllMocks();
74
+ });
75
+ (0, vitest_1.describe)('runScript', () => {
76
+ (0, vitest_1.it)('parses stdout JSON and returns output on exit 0', async () => {
77
+ const output = { result: 'ok', count: 42 };
78
+ makeSpawnMock({ stdout: JSON.stringify(output), exitCode: 0 });
79
+ const result = await (0, script_executor_js_1.runScript)({
80
+ scriptPath: 'scripts/parse.py',
81
+ runtime: 'python',
82
+ context: makeContext(),
83
+ });
84
+ (0, vitest_1.expect)(result.output).toEqual(output);
85
+ (0, vitest_1.expect)(result.tool_calls).toEqual([]);
86
+ (0, vitest_1.expect)(result.tool_calls_count).toBe(0);
87
+ (0, vitest_1.expect)(result.error).toBeUndefined();
88
+ (0, vitest_1.expect)(result.duration_ms).toBeGreaterThanOrEqual(0);
89
+ });
90
+ (0, vitest_1.it)('sets error when script exits with non-zero code', async () => {
91
+ makeSpawnMock({ stdout: '', stderr: 'FileNotFoundError', exitCode: 1 });
92
+ const result = await (0, script_executor_js_1.runScript)({
93
+ scriptPath: 'scripts/parse.py',
94
+ runtime: 'python',
95
+ context: makeContext(),
96
+ });
97
+ (0, vitest_1.expect)(result.output).toBeNull();
98
+ (0, vitest_1.expect)(result.error).toMatch(/exited with code 1/);
99
+ (0, vitest_1.expect)(result.error).toMatch(/FileNotFoundError/);
100
+ });
101
+ (0, vitest_1.it)('sets error when stdout is not valid JSON', async () => {
102
+ makeSpawnMock({ stdout: 'not json at all', exitCode: 0 });
103
+ const result = await (0, script_executor_js_1.runScript)({
104
+ scriptPath: 'scripts/parse.py',
105
+ runtime: 'python',
106
+ context: makeContext(),
107
+ });
108
+ (0, vitest_1.expect)(result.output).toBeNull();
109
+ (0, vitest_1.expect)(result.error).toMatch(/not valid JSON/);
110
+ (0, vitest_1.expect)(result.error).toMatch(/not json at all/);
111
+ });
112
+ (0, vitest_1.it)('sets error on process spawn error', async () => {
113
+ const proc = new node_events_1.EventEmitter();
114
+ proc.stdout = new node_events_1.EventEmitter();
115
+ proc.stderr = new node_events_1.EventEmitter();
116
+ proc.stdin = { write: vitest_1.vi.fn(), end: vitest_1.vi.fn() };
117
+ vitest_1.vi.mocked(cp.spawn).mockReturnValue(proc);
118
+ setTimeout(() => proc.emit('error', new Error('ENOENT: python3 not found')), 10);
119
+ const result = await (0, script_executor_js_1.runScript)({
120
+ scriptPath: 'scripts/parse.py',
121
+ runtime: 'python',
122
+ context: makeContext(),
123
+ });
124
+ (0, vitest_1.expect)(result.error).toMatch(/process error/);
125
+ (0, vitest_1.expect)(result.error).toMatch(/ENOENT/);
126
+ });
127
+ (0, vitest_1.it)('uses python3 command for python runtime', async () => {
128
+ makeSpawnMock({ stdout: '{}', exitCode: 0 });
129
+ await (0, script_executor_js_1.runScript)({ scriptPath: 'scripts/parse.py', runtime: 'python', context: makeContext() });
130
+ (0, vitest_1.expect)(vitest_1.vi.mocked(cp.spawn)).toHaveBeenCalledWith('python3', ['scripts/parse.py'], vitest_1.expect.objectContaining({ stdio: ['pipe', 'pipe', 'pipe'] }));
131
+ });
132
+ (0, vitest_1.it)('uses node command for node runtime', async () => {
133
+ makeSpawnMock({ stdout: '{}', exitCode: 0 });
134
+ await (0, script_executor_js_1.runScript)({ scriptPath: 'scripts/parse.js', runtime: 'node', context: makeContext() });
135
+ (0, vitest_1.expect)(vitest_1.vi.mocked(cp.spawn)).toHaveBeenCalledWith('node', ['scripts/parse.js'], vitest_1.expect.anything());
136
+ });
137
+ (0, vitest_1.it)('uses sh command for shell runtime', async () => {
138
+ makeSpawnMock({ stdout: '{}', exitCode: 0 });
139
+ await (0, script_executor_js_1.runScript)({ scriptPath: 'scripts/run.sh', runtime: 'shell', context: makeContext() });
140
+ (0, vitest_1.expect)(vitest_1.vi.mocked(cp.spawn)).toHaveBeenCalledWith('sh', ['scripts/run.sh'], vitest_1.expect.anything());
141
+ });
142
+ (0, vitest_1.it)('activates venv when venv/ directory exists', async () => {
143
+ vitest_1.vi.mocked(fs.existsSync).mockImplementation((p) => String(p).endsWith('venv'));
144
+ makeSpawnMock({ stdout: '{}', exitCode: 0 });
145
+ await (0, script_executor_js_1.runScript)({
146
+ scriptPath: 'scripts/parse.py',
147
+ runtime: 'python',
148
+ context: makeContext(),
149
+ cwd: '/project',
150
+ });
151
+ const spawnCall = vitest_1.vi.mocked(cp.spawn).mock.calls[0];
152
+ const spawnEnv = spawnCall[2].env;
153
+ (0, vitest_1.expect)(spawnEnv.VIRTUAL_ENV).toBe('/project/venv');
154
+ (0, vitest_1.expect)(spawnEnv.PATH).toContain('/project/venv/bin');
155
+ });
156
+ (0, vitest_1.it)('writes context JSON to stdin', async () => {
157
+ const stdinMock = { write: vitest_1.vi.fn(), end: vitest_1.vi.fn() };
158
+ const proc = new node_events_1.EventEmitter();
159
+ proc.stdout = new node_events_1.EventEmitter();
160
+ proc.stderr = new node_events_1.EventEmitter();
161
+ proc.stdin = stdinMock;
162
+ vitest_1.vi.mocked(cp.spawn).mockReturnValue(proc);
163
+ setTimeout(() => {
164
+ proc.stdout.emit('data', Buffer.from('{"ok":true}'));
165
+ proc.emit('close', 0);
166
+ }, 10);
167
+ const ctx = makeContext({ additional_context: 'hello world' });
168
+ await (0, script_executor_js_1.runScript)({ scriptPath: 'scripts/parse.py', runtime: 'python', context: ctx });
169
+ (0, vitest_1.expect)(stdinMock.write).toHaveBeenCalledWith(JSON.stringify(ctx));
170
+ (0, vitest_1.expect)(stdinMock.end).toHaveBeenCalled();
171
+ });
172
+ });
173
+ //# sourceMappingURL=script-executor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"script-executor.test.js","sourceRoot":"","sources":["../../src/__tests__/script-executor.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mCAA8D;AAC9D,uDAAyC;AACzC,4CAA8B;AAC9B,6CAA2C;AAE3C,mEAAmE;AACnE,WAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;AAC9B,WAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAEnB,8DAAkD;AAGlD,SAAS,WAAW,CAAC,SAAiC;IACpD,OAAO;QACL,KAAK,EAAE,YAAY;QACnB,GAAG,SAAS;KACG,CAAC;AACpB,CAAC;AAED,SAAS,aAAa,CAAC,IAKtB;IACC,MAAM,IAAI,GAAG,IAAI,0BAAY,EAAiC,CAAC;IAC9D,IAAY,CAAC,MAAM,GAAG,IAAI,0BAAY,EAAE,CAAC;IACzC,IAAY,CAAC,MAAM,GAAG,IAAI,0BAAY,EAAE,CAAC;IACzC,IAAY,CAAC,KAAK,GAAG,EAAE,KAAK,EAAE,WAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,WAAE,CAAC,EAAE,EAAE,EAAE,CAAC;IACtD,IAAY,CAAC,IAAI,GAAG,WAAE,CAAC,EAAE,EAAE,CAAC;IAE7B,WAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,IAAW,CAAC,CAAC;IAEjD,mCAAmC;IACnC,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YACpC,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,MAAM;YAAG,IAAY,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7E,IAAI,IAAI,CAAC,MAAM;YAAG,IAAY,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7E,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC;IACzC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,IAAI,CAAC;AACd,CAAC;AAED,IAAA,mBAAU,EAAC,GAAG,EAAE;IACd,WAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAChD,WAAE,CAAC,aAAa,EAAE,CAAC;AACrB,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,WAAW,EAAE,GAAG,EAAE;IACzB,IAAA,WAAE,EAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,MAAM,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QAC3C,aAAa,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;QAE/D,MAAM,MAAM,GAAG,MAAM,IAAA,8BAAS,EAAC;YAC7B,UAAU,EAAE,kBAAkB;YAC9B,OAAO,EAAE,QAAQ;YACjB,OAAO,EAAE,WAAW,EAAE;SACvB,CAAC,CAAC;QAEH,IAAA,eAAM,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACtC,IAAA,eAAM,EAAC,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACtC,IAAA,eAAM,EAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxC,IAAA,eAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,CAAC;QACrC,IAAA,eAAM,EAAC,MAAM,CAAC,WAAW,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,aAAa,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,mBAAmB,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;QAExE,MAAM,MAAM,GAAG,MAAM,IAAA,8BAAS,EAAC;YAC7B,UAAU,EAAE,kBAAkB;YAC9B,OAAO,EAAE,QAAQ;YACjB,OAAO,EAAE,WAAW,EAAE;SACvB,CAAC,CAAC;QAEH,IAAA,eAAM,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;QACjC,IAAA,eAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QACnD,IAAA,eAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,aAAa,CAAC,EAAE,MAAM,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;QAE1D,MAAM,MAAM,GAAG,MAAM,IAAA,8BAAS,EAAC;YAC7B,UAAU,EAAE,kBAAkB;YAC9B,OAAO,EAAE,QAAQ;YACjB,OAAO,EAAE,WAAW,EAAE;SACvB,CAAC,CAAC;QAEH,IAAA,eAAM,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;QACjC,IAAA,eAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAC/C,IAAA,eAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,IAAI,GAAG,IAAI,0BAAY,EAAiC,CAAC;QAC9D,IAAY,CAAC,MAAM,GAAG,IAAI,0BAAY,EAAE,CAAC;QACzC,IAAY,CAAC,MAAM,GAAG,IAAI,0BAAY,EAAE,CAAC;QACzC,IAAY,CAAC,KAAK,GAAG,EAAE,KAAK,EAAE,WAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,WAAE,CAAC,EAAE,EAAE,EAAE,CAAC;QACvD,WAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,IAAW,CAAC,CAAC;QACjD,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAEjF,MAAM,MAAM,GAAG,MAAM,IAAA,8BAAS,EAAC;YAC7B,UAAU,EAAE,kBAAkB;YAC9B,OAAO,EAAE,QAAQ;YACjB,OAAO,EAAE,WAAW,EAAE;SACvB,CAAC,CAAC;QAEH,IAAA,eAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAC9C,IAAA,eAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,aAAa,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;QAE7C,MAAM,IAAA,8BAAS,EAAC,EAAE,UAAU,EAAE,kBAAkB,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;QAE/F,IAAA,eAAM,EAAC,WAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAC9C,SAAS,EACT,CAAC,kBAAkB,CAAC,EACpB,eAAM,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAC7D,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,aAAa,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;QAE7C,MAAM,IAAA,8BAAS,EAAC,EAAE,UAAU,EAAE,kBAAkB,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;QAE7F,IAAA,eAAM,EAAC,WAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC,MAAM,EAAE,CAAC,kBAAkB,CAAC,EAAE,eAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IACpG,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,aAAa,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;QAE7C,MAAM,IAAA,8BAAS,EAAC,EAAE,UAAU,EAAE,gBAAgB,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;QAE5F,IAAA,eAAM,EAAC,WAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC,gBAAgB,CAAC,EAAE,eAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAChG,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,WAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/E,aAAa,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;QAE7C,MAAM,IAAA,8BAAS,EAAC;YACd,UAAU,EAAE,kBAAkB;YAC9B,OAAO,EAAE,QAAQ;YACjB,OAAO,EAAE,WAAW,EAAE;YACtB,GAAG,EAAE,UAAU;SAChB,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,WAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,QAAQ,GAAI,SAAS,CAAC,CAAC,CAAS,CAAC,GAAG,CAAC;QAC3C,IAAA,eAAM,EAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACnD,IAAA,eAAM,EAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,SAAS,GAAG,EAAE,KAAK,EAAE,WAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,WAAE,CAAC,EAAE,EAAE,EAAE,CAAC;QACnD,MAAM,IAAI,GAAG,IAAI,0BAAY,EAAiC,CAAC;QAC9D,IAAY,CAAC,MAAM,GAAG,IAAI,0BAAY,EAAE,CAAC;QACzC,IAAY,CAAC,MAAM,GAAG,IAAI,0BAAY,EAAE,CAAC;QACzC,IAAY,CAAC,KAAK,GAAG,SAAS,CAAC;QAChC,WAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,IAAW,CAAC,CAAC;QACjD,UAAU,CAAC,GAAG,EAAE;YACb,IAAY,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;YAC9D,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACxB,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,MAAM,GAAG,GAAG,WAAW,CAAC,EAAE,kBAAkB,EAAE,aAAa,EAAE,CAAC,CAAC;QAC/D,MAAM,IAAA,8BAAS,EAAC,EAAE,UAAU,EAAE,kBAAkB,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;QAErF,IAAA,eAAM,EAAC,SAAS,CAAC,KAAK,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAClE,IAAA,eAAM,EAAC,SAAS,CAAC,GAAG,CAAC,CAAC,gBAAgB,EAAE,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * @studio/runner - Multi-provider LLM agent runner with tool execution
3
+ */
4
+ export { runAgent } from './runner.js';
5
+ export type { RunAgentConfig, AgentRunResult } from './runner.js';
6
+ export { runScript } from './script-executor.js';
7
+ export type { ScriptExecutorConfig } from './script-executor.js';
8
+ export { buildPrompt } from './prompt-builder.js';
9
+ export type { TaskInput, AgentContext, GroupFeedbackContext, ExecutionContext, PromptBuildConfig } from './prompt-builder.js';
10
+ export type { Provider, AgentLoopProvider, AgentLoopResult } from './providers/provider.js';
11
+ export { isAgentLoopProvider } from './providers/provider.js';
12
+ export { OpenAIProvider } from './providers/openai.js';
13
+ export { OpenAIResponsesProvider } from './providers/openai-responses.js';
14
+ export { AnthropicProvider } from './providers/anthropic.js';
15
+ export { OllamaProvider } from './providers/ollama.js';
16
+ export { ProviderRegistry, createDefaultRegistry } from './providers/registry.js';
17
+ export { MockProvider } from './providers/mock.js';
18
+ export type { MockStageConfig } from './providers/mock.js';
19
+ export { ToolRegistry } from './tools/tool-registry.js';
20
+ export { ToolExecutor } from './tools/tool-executor.js';
21
+ export type { Tool, ToolResult } from './tools/tool-registry.js';
22
+ export { createRepoManagerTools } from './tools/builtin/repo-manager.js';
23
+ export { createShellTools } from './tools/builtin/shell.js';
24
+ export { createSearchTools } from './tools/builtin/search.js';
25
+ export { createPatchTools } from './tools/builtin/patch.js';
26
+ export { createGitTools } from './tools/builtin/git.js';
27
+ export { createStudioRunTool, STUDIO_RUN_PROMPT_SNIPPET } from './tools/builtin/studio-run.js';
28
+ export { createWebSearchTools, WEB_SEARCH_PROMPT_SNIPPET } from './tools/builtin/web-search.js';
29
+ export { loadProjectTools, listAvailableToolTemplates, getBundledToolTemplate, BUILTIN_TOOL_NAMES } from './tools/plugin-loader.js';
30
+ export type { LoadedPlugin } from './tools/plugin-loader.js';
31
+ export { AnonymizationMiddleware } from './middleware/anonymization.js';
32
+ export type { AnonymizerOptions } from '@studio-foundation/anonymizer';
33
+ export { loadPlugins, MCPClient, StudioOAuthProvider } from './plugins/index.js';
34
+ export type { PluginManifest, MCPServerDef, SkillContent } from './plugins/index.js';
35
+ export { loadSkills, loadSkill, validateSkillManifest } from './tools/skills/skill-loader.js';
36
+ export type { SkillManifest } from './tools/skills/skill-loader.js';
37
+ export { getBundledIntegrationTemplate, listAvailableIntegrationTemplates, loadProjectIntegrations, } from './integrations/integration-loader.js';
38
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAGjE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,YAAY,EACV,SAAS,EACT,YAAY,EACZ,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,qBAAqB,CAAC;AAG7B,YAAY,EAAE,QAAQ,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC5F,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAGjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC/F,OAAO,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAEhG,OAAO,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACpI,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAG7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACxE,YAAY,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAGvE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACjF,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGrF,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAC9F,YAAY,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAGpE,OAAO,EACL,6BAA6B,EAC7B,iCAAiC,EACjC,uBAAuB,GACxB,MAAM,sCAAsC,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ /**
3
+ * @studio/runner - Multi-provider LLM agent runner with tool execution
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.loadProjectIntegrations = exports.listAvailableIntegrationTemplates = exports.getBundledIntegrationTemplate = exports.validateSkillManifest = exports.loadSkill = exports.loadSkills = exports.StudioOAuthProvider = exports.MCPClient = exports.loadPlugins = exports.AnonymizationMiddleware = exports.BUILTIN_TOOL_NAMES = exports.getBundledToolTemplate = exports.listAvailableToolTemplates = exports.loadProjectTools = exports.WEB_SEARCH_PROMPT_SNIPPET = exports.createWebSearchTools = exports.STUDIO_RUN_PROMPT_SNIPPET = exports.createStudioRunTool = exports.createGitTools = exports.createPatchTools = exports.createSearchTools = exports.createShellTools = exports.createRepoManagerTools = exports.ToolExecutor = exports.ToolRegistry = exports.MockProvider = exports.createDefaultRegistry = exports.ProviderRegistry = exports.OllamaProvider = exports.AnthropicProvider = exports.OpenAIResponsesProvider = exports.OpenAIProvider = exports.isAgentLoopProvider = exports.buildPrompt = exports.runScript = exports.runAgent = void 0;
7
+ // Main runner function
8
+ var runner_js_1 = require("./runner.js");
9
+ Object.defineProperty(exports, "runAgent", { enumerable: true, get: function () { return runner_js_1.runAgent; } });
10
+ // Script executor
11
+ var script_executor_js_1 = require("./script-executor.js");
12
+ Object.defineProperty(exports, "runScript", { enumerable: true, get: function () { return script_executor_js_1.runScript; } });
13
+ // Prompt builder
14
+ var prompt_builder_js_1 = require("./prompt-builder.js");
15
+ Object.defineProperty(exports, "buildPrompt", { enumerable: true, get: function () { return prompt_builder_js_1.buildPrompt; } });
16
+ var provider_js_1 = require("./providers/provider.js");
17
+ Object.defineProperty(exports, "isAgentLoopProvider", { enumerable: true, get: function () { return provider_js_1.isAgentLoopProvider; } });
18
+ var openai_js_1 = require("./providers/openai.js");
19
+ Object.defineProperty(exports, "OpenAIProvider", { enumerable: true, get: function () { return openai_js_1.OpenAIProvider; } });
20
+ var openai_responses_js_1 = require("./providers/openai-responses.js");
21
+ Object.defineProperty(exports, "OpenAIResponsesProvider", { enumerable: true, get: function () { return openai_responses_js_1.OpenAIResponsesProvider; } });
22
+ var anthropic_js_1 = require("./providers/anthropic.js");
23
+ Object.defineProperty(exports, "AnthropicProvider", { enumerable: true, get: function () { return anthropic_js_1.AnthropicProvider; } });
24
+ var ollama_js_1 = require("./providers/ollama.js");
25
+ Object.defineProperty(exports, "OllamaProvider", { enumerable: true, get: function () { return ollama_js_1.OllamaProvider; } });
26
+ var registry_js_1 = require("./providers/registry.js");
27
+ Object.defineProperty(exports, "ProviderRegistry", { enumerable: true, get: function () { return registry_js_1.ProviderRegistry; } });
28
+ Object.defineProperty(exports, "createDefaultRegistry", { enumerable: true, get: function () { return registry_js_1.createDefaultRegistry; } });
29
+ var mock_js_1 = require("./providers/mock.js");
30
+ Object.defineProperty(exports, "MockProvider", { enumerable: true, get: function () { return mock_js_1.MockProvider; } });
31
+ // Tools
32
+ var tool_registry_js_1 = require("./tools/tool-registry.js");
33
+ Object.defineProperty(exports, "ToolRegistry", { enumerable: true, get: function () { return tool_registry_js_1.ToolRegistry; } });
34
+ var tool_executor_js_1 = require("./tools/tool-executor.js");
35
+ Object.defineProperty(exports, "ToolExecutor", { enumerable: true, get: function () { return tool_executor_js_1.ToolExecutor; } });
36
+ // Builtin tools
37
+ var repo_manager_js_1 = require("./tools/builtin/repo-manager.js");
38
+ Object.defineProperty(exports, "createRepoManagerTools", { enumerable: true, get: function () { return repo_manager_js_1.createRepoManagerTools; } });
39
+ var shell_js_1 = require("./tools/builtin/shell.js");
40
+ Object.defineProperty(exports, "createShellTools", { enumerable: true, get: function () { return shell_js_1.createShellTools; } });
41
+ var search_js_1 = require("./tools/builtin/search.js");
42
+ Object.defineProperty(exports, "createSearchTools", { enumerable: true, get: function () { return search_js_1.createSearchTools; } });
43
+ var patch_js_1 = require("./tools/builtin/patch.js");
44
+ Object.defineProperty(exports, "createPatchTools", { enumerable: true, get: function () { return patch_js_1.createPatchTools; } });
45
+ var git_js_1 = require("./tools/builtin/git.js");
46
+ Object.defineProperty(exports, "createGitTools", { enumerable: true, get: function () { return git_js_1.createGitTools; } });
47
+ var studio_run_js_1 = require("./tools/builtin/studio-run.js");
48
+ Object.defineProperty(exports, "createStudioRunTool", { enumerable: true, get: function () { return studio_run_js_1.createStudioRunTool; } });
49
+ Object.defineProperty(exports, "STUDIO_RUN_PROMPT_SNIPPET", { enumerable: true, get: function () { return studio_run_js_1.STUDIO_RUN_PROMPT_SNIPPET; } });
50
+ var web_search_js_1 = require("./tools/builtin/web-search.js");
51
+ Object.defineProperty(exports, "createWebSearchTools", { enumerable: true, get: function () { return web_search_js_1.createWebSearchTools; } });
52
+ Object.defineProperty(exports, "WEB_SEARCH_PROMPT_SNIPPET", { enumerable: true, get: function () { return web_search_js_1.WEB_SEARCH_PROMPT_SNIPPET; } });
53
+ var plugin_loader_js_1 = require("./tools/plugin-loader.js");
54
+ Object.defineProperty(exports, "loadProjectTools", { enumerable: true, get: function () { return plugin_loader_js_1.loadProjectTools; } });
55
+ Object.defineProperty(exports, "listAvailableToolTemplates", { enumerable: true, get: function () { return plugin_loader_js_1.listAvailableToolTemplates; } });
56
+ Object.defineProperty(exports, "getBundledToolTemplate", { enumerable: true, get: function () { return plugin_loader_js_1.getBundledToolTemplate; } });
57
+ Object.defineProperty(exports, "BUILTIN_TOOL_NAMES", { enumerable: true, get: function () { return plugin_loader_js_1.BUILTIN_TOOL_NAMES; } });
58
+ // Anonymization middleware
59
+ var anonymization_js_1 = require("./middleware/anonymization.js");
60
+ Object.defineProperty(exports, "AnonymizationMiddleware", { enumerable: true, get: function () { return anonymization_js_1.AnonymizationMiddleware; } });
61
+ // Plugin system (Claude Code plugin compatibility)
62
+ var index_js_1 = require("./plugins/index.js");
63
+ Object.defineProperty(exports, "loadPlugins", { enumerable: true, get: function () { return index_js_1.loadPlugins; } });
64
+ Object.defineProperty(exports, "MCPClient", { enumerable: true, get: function () { return index_js_1.MCPClient; } });
65
+ Object.defineProperty(exports, "StudioOAuthProvider", { enumerable: true, get: function () { return index_js_1.StudioOAuthProvider; } });
66
+ // Skill loader
67
+ var skill_loader_js_1 = require("./tools/skills/skill-loader.js");
68
+ Object.defineProperty(exports, "loadSkills", { enumerable: true, get: function () { return skill_loader_js_1.loadSkills; } });
69
+ Object.defineProperty(exports, "loadSkill", { enumerable: true, get: function () { return skill_loader_js_1.loadSkill; } });
70
+ Object.defineProperty(exports, "validateSkillManifest", { enumerable: true, get: function () { return skill_loader_js_1.validateSkillManifest; } });
71
+ // Integration plugin system
72
+ var integration_loader_js_1 = require("./integrations/integration-loader.js");
73
+ Object.defineProperty(exports, "getBundledIntegrationTemplate", { enumerable: true, get: function () { return integration_loader_js_1.getBundledIntegrationTemplate; } });
74
+ Object.defineProperty(exports, "listAvailableIntegrationTemplates", { enumerable: true, get: function () { return integration_loader_js_1.listAvailableIntegrationTemplates; } });
75
+ Object.defineProperty(exports, "loadProjectIntegrations", { enumerable: true, get: function () { return integration_loader_js_1.loadProjectIntegrations; } });
76
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,uBAAuB;AACvB,yCAAuC;AAA9B,qGAAA,QAAQ,OAAA;AAGjB,kBAAkB;AAClB,2DAAiD;AAAxC,+GAAA,SAAS,OAAA;AAGlB,iBAAiB;AACjB,yDAAkD;AAAzC,gHAAA,WAAW,OAAA;AAWpB,uDAA8D;AAArD,kHAAA,mBAAmB,OAAA;AAC5B,mDAAuD;AAA9C,2GAAA,cAAc,OAAA;AACvB,uEAA0E;AAAjE,8HAAA,uBAAuB,OAAA;AAChC,yDAA6D;AAApD,iHAAA,iBAAiB,OAAA;AAC1B,mDAAuD;AAA9C,2GAAA,cAAc,OAAA;AACvB,uDAAkF;AAAzE,+GAAA,gBAAgB,OAAA;AAAE,oHAAA,qBAAqB,OAAA;AAChD,+CAAmD;AAA1C,uGAAA,YAAY,OAAA;AAGrB,QAAQ;AACR,6DAAwD;AAA/C,gHAAA,YAAY,OAAA;AACrB,6DAAwD;AAA/C,gHAAA,YAAY,OAAA;AAGrB,gBAAgB;AAChB,mEAAyE;AAAhE,yHAAA,sBAAsB,OAAA;AAC/B,qDAA4D;AAAnD,4GAAA,gBAAgB,OAAA;AACzB,uDAA8D;AAArD,8GAAA,iBAAiB,OAAA;AAC1B,qDAA4D;AAAnD,4GAAA,gBAAgB,OAAA;AACzB,iDAAwD;AAA/C,wGAAA,cAAc,OAAA;AACvB,+DAA+F;AAAtF,oHAAA,mBAAmB,OAAA;AAAE,0HAAA,yBAAyB,OAAA;AACvD,+DAAgG;AAAvF,qHAAA,oBAAoB,OAAA;AAAE,0HAAA,yBAAyB,OAAA;AAExD,6DAAoI;AAA3H,oHAAA,gBAAgB,OAAA;AAAE,8HAAA,0BAA0B,OAAA;AAAE,0HAAA,sBAAsB,OAAA;AAAE,sHAAA,kBAAkB,OAAA;AAGjG,2BAA2B;AAC3B,kEAAwE;AAA/D,2HAAA,uBAAuB,OAAA;AAGhC,mDAAmD;AACnD,+CAAiF;AAAxE,uGAAA,WAAW,OAAA;AAAE,qGAAA,SAAS,OAAA;AAAE,+GAAA,mBAAmB,OAAA;AAGpD,eAAe;AACf,kEAA8F;AAArF,6GAAA,UAAU,OAAA;AAAE,4GAAA,SAAS,OAAA;AAAE,wHAAA,qBAAqB,OAAA;AAGrD,4BAA4B;AAC5B,8EAI8C;AAH5C,sIAAA,6BAA6B,OAAA;AAC7B,0IAAA,iCAAiC,OAAA;AACjC,gIAAA,uBAAuB,OAAA"}
@@ -0,0 +1,20 @@
1
+ import type { IntegrationPluginDef } from '@studio-foundation/contracts';
2
+ /**
3
+ * Return the raw YAML content of a bundled integration template by name.
4
+ * Returns null if the integration does not exist in the bundled registry.
5
+ */
6
+ export declare function getBundledIntegrationTemplate(name: string): Promise<string | null>;
7
+ /**
8
+ * List all integration plugins available for installation from the bundled registry.
9
+ * Returns an array of { name, description } objects.
10
+ */
11
+ export declare function listAvailableIntegrationTemplates(): Promise<{
12
+ name: string;
13
+ description: string;
14
+ }[]>;
15
+ /**
16
+ * Load all `.integration.yaml` files from a project's integrations directory.
17
+ * Returns an empty array if the directory does not exist.
18
+ */
19
+ export declare function loadProjectIntegrations(integrationsDir: string): Promise<IntegrationPluginDef[]>;
20
+ //# sourceMappingURL=integration-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration-loader.d.ts","sourceRoot":"","sources":["../../src/integrations/integration-loader.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAOzE;;;GAGG;AACH,wBAAsB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOxF;AAED;;;GAGG;AACH,wBAAsB,iCAAiC,IAAI,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAgB1G;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAgBtG"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getBundledIntegrationTemplate = getBundledIntegrationTemplate;
7
+ exports.listAvailableIntegrationTemplates = listAvailableIntegrationTemplates;
8
+ exports.loadProjectIntegrations = loadProjectIntegrations;
9
+ // runner/src/integrations/integration-loader.ts
10
+ const promises_1 = require("node:fs/promises");
11
+ const node_fs_1 = require("node:fs");
12
+ const node_path_1 = require("node:path");
13
+ const js_yaml_1 = __importDefault(require("js-yaml"));
14
+ const BUNDLED_INTEGRATION_TEMPLATES_DIR = (0, node_path_1.resolve)(__dirname, '../../templates/integrations');
15
+ /**
16
+ * Return the raw YAML content of a bundled integration template by name.
17
+ * Returns null if the integration does not exist in the bundled registry.
18
+ */
19
+ async function getBundledIntegrationTemplate(name) {
20
+ const filePath = (0, node_path_1.resolve)(BUNDLED_INTEGRATION_TEMPLATES_DIR, `${name}.integration.yaml`);
21
+ try {
22
+ return await (0, promises_1.readFile)(filePath, 'utf-8');
23
+ }
24
+ catch {
25
+ return null;
26
+ }
27
+ }
28
+ /**
29
+ * List all integration plugins available for installation from the bundled registry.
30
+ * Returns an array of { name, description } objects.
31
+ */
32
+ async function listAvailableIntegrationTemplates() {
33
+ let files;
34
+ try {
35
+ files = (await (0, promises_1.readdir)(BUNDLED_INTEGRATION_TEMPLATES_DIR))
36
+ .filter(f => f.endsWith('.integration.yaml'))
37
+ .sort();
38
+ }
39
+ catch {
40
+ return [];
41
+ }
42
+ const result = [];
43
+ for (const file of files) {
44
+ const content = await (0, promises_1.readFile)((0, node_path_1.resolve)(BUNDLED_INTEGRATION_TEMPLATES_DIR, file), 'utf-8');
45
+ const def = js_yaml_1.default.load(content);
46
+ result.push({ name: file.replace('.integration.yaml', ''), description: def.description ?? '' });
47
+ }
48
+ return result;
49
+ }
50
+ /**
51
+ * Load all `.integration.yaml` files from a project's integrations directory.
52
+ * Returns an empty array if the directory does not exist.
53
+ */
54
+ async function loadProjectIntegrations(integrationsDir) {
55
+ if (!(0, node_fs_1.existsSync)(integrationsDir))
56
+ return [];
57
+ let files;
58
+ try {
59
+ files = (await (0, promises_1.readdir)(integrationsDir)).filter(f => f.endsWith('.integration.yaml'));
60
+ }
61
+ catch {
62
+ return [];
63
+ }
64
+ const result = [];
65
+ for (const file of files.sort()) {
66
+ const content = await (0, promises_1.readFile)((0, node_path_1.resolve)(integrationsDir, file), 'utf-8');
67
+ result.push(js_yaml_1.default.load(content));
68
+ }
69
+ return result;
70
+ }
71
+ //# sourceMappingURL=integration-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integration-loader.js","sourceRoot":"","sources":["../../src/integrations/integration-loader.ts"],"names":[],"mappings":";;;;;AAgBA,sEAOC;AAMD,8EAgBC;AAMD,0DAgBC;AAnED,gDAAgD;AAChD,+CAAqD;AACrD,qCAAqC;AACrC,yCAAoC;AACpC,sDAA2B;AAG3B,MAAM,iCAAiC,GAAG,IAAA,mBAAO,EAC/C,SAAS,EACT,8BAA8B,CAC/B,CAAC;AAEF;;;GAGG;AACI,KAAK,UAAU,6BAA6B,CAAC,IAAY;IAC9D,MAAM,QAAQ,GAAG,IAAA,mBAAO,EAAC,iCAAiC,EAAE,GAAG,IAAI,mBAAmB,CAAC,CAAC;IACxF,IAAI,CAAC;QACH,OAAO,MAAM,IAAA,mBAAQ,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,iCAAiC;IACrD,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,CAAC,MAAM,IAAA,kBAAO,EAAC,iCAAiC,CAAC,CAAC;aACvD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;aAC5C,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,MAAM,GAA4C,EAAE,CAAC;IAC3D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,MAAM,IAAA,mBAAQ,EAAC,IAAA,mBAAO,EAAC,iCAAiC,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QAC1F,MAAM,GAAG,GAAG,iBAAI,CAAC,IAAI,CAAC,OAAO,CAAyB,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC,CAAC;IACnG,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,uBAAuB,CAAC,eAAuB;IACnE,IAAI,CAAC,IAAA,oBAAU,EAAC,eAAe,CAAC;QAAE,OAAO,EAAE,CAAC;IAE5C,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,KAAK,GAAG,CAAC,MAAM,IAAA,kBAAO,EAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC;IACxF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,MAAM,IAAA,mBAAQ,EAAC,IAAA,mBAAO,EAAC,eAAe,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;QACxE,MAAM,CAAC,IAAI,CAAC,iBAAI,CAAC,IAAI,CAAC,OAAO,CAAyB,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=integration-loader.test.d.ts.map