beth-copilot 1.0.18 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (291) hide show
  1. package/CHANGELOG.md +41 -28
  2. package/README.md +87 -247
  3. package/bin/cli.js +158 -358
  4. package/dist/__tests__/smoke.test.d.ts +8 -0
  5. package/dist/__tests__/smoke.test.d.ts.map +1 -0
  6. package/dist/__tests__/smoke.test.js +49 -0
  7. package/dist/__tests__/smoke.test.js.map +1 -0
  8. package/dist/cli/commands/beads.e2e.test.d.ts +13 -0
  9. package/dist/cli/commands/beads.e2e.test.d.ts.map +1 -0
  10. package/dist/cli/commands/beads.e2e.test.js +526 -0
  11. package/dist/cli/commands/beads.e2e.test.js.map +1 -0
  12. package/dist/cli/commands/cli-edge-cases.e2e.test.d.ts +32 -0
  13. package/dist/cli/commands/cli-edge-cases.e2e.test.d.ts.map +1 -0
  14. package/dist/cli/commands/cli-edge-cases.e2e.test.js +162 -0
  15. package/dist/cli/commands/cli-edge-cases.e2e.test.js.map +1 -0
  16. package/dist/cli/commands/close.d.ts +89 -0
  17. package/dist/cli/commands/close.d.ts.map +1 -0
  18. package/dist/cli/commands/close.e2e.test.d.ts +27 -0
  19. package/dist/cli/commands/close.e2e.test.d.ts.map +1 -0
  20. package/dist/cli/commands/close.e2e.test.js +252 -0
  21. package/dist/cli/commands/close.e2e.test.js.map +1 -0
  22. package/dist/cli/commands/close.js +309 -0
  23. package/dist/cli/commands/close.js.map +1 -0
  24. package/dist/cli/commands/close.test.d.ts +15 -0
  25. package/dist/cli/commands/close.test.d.ts.map +1 -0
  26. package/dist/cli/commands/close.test.js +634 -0
  27. package/dist/cli/commands/close.test.js.map +1 -0
  28. package/dist/cli/commands/doctor.d.ts +23 -0
  29. package/dist/cli/commands/doctor.d.ts.map +1 -1
  30. package/dist/cli/commands/doctor.js +93 -0
  31. package/dist/cli/commands/doctor.js.map +1 -1
  32. package/dist/cli/commands/doctor.test.js +209 -0
  33. package/dist/cli/commands/doctor.test.js.map +1 -1
  34. package/dist/cli/commands/framework-isolation.test.d.ts +30 -0
  35. package/dist/cli/commands/framework-isolation.test.d.ts.map +1 -0
  36. package/dist/cli/commands/framework-isolation.test.js +119 -0
  37. package/dist/cli/commands/framework-isolation.test.js.map +1 -0
  38. package/dist/cli/commands/help.e2e.test.js +4 -4
  39. package/dist/cli/commands/help.e2e.test.js.map +1 -1
  40. package/dist/cli/commands/init-logic.e2e.test.d.ts +37 -0
  41. package/dist/cli/commands/init-logic.e2e.test.d.ts.map +1 -0
  42. package/dist/cli/commands/init-logic.e2e.test.js +305 -0
  43. package/dist/cli/commands/init-logic.e2e.test.js.map +1 -0
  44. package/dist/cli/commands/land.d.ts +142 -0
  45. package/dist/cli/commands/land.d.ts.map +1 -0
  46. package/dist/cli/commands/land.js +647 -0
  47. package/dist/cli/commands/land.js.map +1 -0
  48. package/dist/cli/commands/land.test.d.ts +20 -0
  49. package/dist/cli/commands/land.test.d.ts.map +1 -0
  50. package/dist/cli/commands/land.test.js +622 -0
  51. package/dist/cli/commands/land.test.js.map +1 -0
  52. package/dist/cli/commands/mcp.e2e.test.js +22 -29
  53. package/dist/cli/commands/mcp.e2e.test.js.map +1 -1
  54. package/dist/cli/commands/pipeline.e2e.test.js +20 -20
  55. package/dist/cli/commands/pipeline.e2e.test.js.map +1 -1
  56. package/dist/cli/commands/pre-push-guard.d.ts +84 -0
  57. package/dist/cli/commands/pre-push-guard.d.ts.map +1 -0
  58. package/dist/cli/commands/pre-push-guard.e2e.test.d.ts +24 -0
  59. package/dist/cli/commands/pre-push-guard.e2e.test.d.ts.map +1 -0
  60. package/dist/cli/commands/pre-push-guard.e2e.test.js +171 -0
  61. package/dist/cli/commands/pre-push-guard.e2e.test.js.map +1 -0
  62. package/dist/cli/commands/pre-push-guard.js +257 -0
  63. package/dist/cli/commands/pre-push-guard.js.map +1 -0
  64. package/dist/cli/commands/pre-push-guard.test.d.ts +15 -0
  65. package/dist/cli/commands/pre-push-guard.test.d.ts.map +1 -0
  66. package/dist/cli/commands/pre-push-guard.test.js +397 -0
  67. package/dist/cli/commands/pre-push-guard.test.js.map +1 -0
  68. package/dist/cli/commands/quickstart-expanded.e2e.test.d.ts +23 -0
  69. package/dist/cli/commands/quickstart-expanded.e2e.test.d.ts.map +1 -0
  70. package/dist/cli/commands/quickstart-expanded.e2e.test.js +179 -0
  71. package/dist/cli/commands/quickstart-expanded.e2e.test.js.map +1 -0
  72. package/dist/cli/commands/quickstart.d.ts.map +1 -1
  73. package/dist/cli/commands/quickstart.js +7 -23
  74. package/dist/cli/commands/quickstart.js.map +1 -1
  75. package/dist/cli/commands/quickstart.test.js +40 -67
  76. package/dist/cli/commands/quickstart.test.js.map +1 -1
  77. package/dist/core/agents/suite.test.js +4 -2
  78. package/dist/core/agents/suite.test.js.map +1 -1
  79. package/dist/core/agents/tools.test.js +5 -1
  80. package/dist/core/agents/tools.test.js.map +1 -1
  81. package/dist/index.d.ts +3 -10
  82. package/dist/index.d.ts.map +1 -1
  83. package/dist/index.js +5 -10
  84. package/dist/index.js.map +1 -1
  85. package/package.json +15 -9
  86. package/sbom.json +2011 -819
  87. package/templates/.github/agents/beth.agent.md +220 -66
  88. package/templates/.github/agents/developer.agent.md +53 -90
  89. package/templates/.github/agents/product-manager.agent.md +15 -68
  90. package/templates/.github/agents/researcher.agent.md +20 -71
  91. package/templates/.github/agents/security-reviewer.agent.md +29 -81
  92. package/templates/.github/agents/tester.agent.md +40 -69
  93. package/templates/.github/agents/ux-designer.agent.md +20 -74
  94. package/templates/.github/copilot-instructions.md +217 -225
  95. package/templates/AGENTS.md +108 -20
  96. package/templates/mcp.json.example +0 -3
  97. package/dist/cli/commands/client-config.d.ts +0 -31
  98. package/dist/cli/commands/client-config.d.ts.map +0 -1
  99. package/dist/cli/commands/client-config.e2e.test.d.ts +0 -15
  100. package/dist/cli/commands/client-config.e2e.test.d.ts.map +0 -1
  101. package/dist/cli/commands/client-config.e2e.test.js +0 -556
  102. package/dist/cli/commands/client-config.e2e.test.js.map +0 -1
  103. package/dist/cli/commands/client-config.js +0 -73
  104. package/dist/cli/commands/client-config.js.map +0 -1
  105. package/dist/cli/commands/client-config.test.d.ts +0 -6
  106. package/dist/cli/commands/client-config.test.d.ts.map +0 -1
  107. package/dist/cli/commands/client-config.test.js +0 -133
  108. package/dist/cli/commands/client-config.test.js.map +0 -1
  109. package/dist/cli/commands/init-quickstart.e2e.test.d.ts +0 -11
  110. package/dist/cli/commands/init-quickstart.e2e.test.d.ts.map +0 -1
  111. package/dist/cli/commands/init-quickstart.e2e.test.js +0 -221
  112. package/dist/cli/commands/init-quickstart.e2e.test.js.map +0 -1
  113. package/dist/core/context.d.ts +0 -171
  114. package/dist/core/context.d.ts.map +0 -1
  115. package/dist/core/context.js +0 -353
  116. package/dist/core/context.js.map +0 -1
  117. package/dist/core/context.test.d.ts +0 -8
  118. package/dist/core/context.test.d.ts.map +0 -1
  119. package/dist/core/context.test.js +0 -253
  120. package/dist/core/context.test.js.map +0 -1
  121. package/dist/core/handoffs.d.ts +0 -151
  122. package/dist/core/handoffs.d.ts.map +0 -1
  123. package/dist/core/handoffs.js +0 -220
  124. package/dist/core/handoffs.js.map +0 -1
  125. package/dist/core/handoffs.test.d.ts +0 -8
  126. package/dist/core/handoffs.test.d.ts.map +0 -1
  127. package/dist/core/handoffs.test.js +0 -231
  128. package/dist/core/handoffs.test.js.map +0 -1
  129. package/dist/core/orchestrator.d.ts +0 -246
  130. package/dist/core/orchestrator.d.ts.map +0 -1
  131. package/dist/core/orchestrator.js +0 -514
  132. package/dist/core/orchestrator.js.map +0 -1
  133. package/dist/core/orchestrator.test.d.ts +0 -8
  134. package/dist/core/orchestrator.test.d.ts.map +0 -1
  135. package/dist/core/orchestrator.test.js +0 -517
  136. package/dist/core/orchestrator.test.js.map +0 -1
  137. package/dist/core/router.d.ts +0 -102
  138. package/dist/core/router.d.ts.map +0 -1
  139. package/dist/core/router.js +0 -178
  140. package/dist/core/router.js.map +0 -1
  141. package/dist/core/router.test.d.ts +0 -8
  142. package/dist/core/router.test.d.ts.map +0 -1
  143. package/dist/core/router.test.js +0 -215
  144. package/dist/core/router.test.js.map +0 -1
  145. package/dist/init.test.js +0 -288
  146. package/dist/providers/azure.d.ts +0 -147
  147. package/dist/providers/azure.d.ts.map +0 -1
  148. package/dist/providers/azure.js +0 -491
  149. package/dist/providers/azure.js.map +0 -1
  150. package/dist/providers/azure.test.d.ts +0 -11
  151. package/dist/providers/azure.test.d.ts.map +0 -1
  152. package/dist/providers/azure.test.js +0 -330
  153. package/dist/providers/azure.test.js.map +0 -1
  154. package/dist/providers/config.d.ts +0 -87
  155. package/dist/providers/config.d.ts.map +0 -1
  156. package/dist/providers/config.js +0 -193
  157. package/dist/providers/config.js.map +0 -1
  158. package/dist/providers/config.test.d.ts +0 -7
  159. package/dist/providers/config.test.d.ts.map +0 -1
  160. package/dist/providers/config.test.js +0 -370
  161. package/dist/providers/config.test.js.map +0 -1
  162. package/dist/providers/index.d.ts +0 -18
  163. package/dist/providers/index.d.ts.map +0 -1
  164. package/dist/providers/index.js +0 -14
  165. package/dist/providers/index.js.map +0 -1
  166. package/dist/providers/interface.d.ts +0 -191
  167. package/dist/providers/interface.d.ts.map +0 -1
  168. package/dist/providers/interface.js +0 -94
  169. package/dist/providers/interface.js.map +0 -1
  170. package/dist/providers/retry.d.ts +0 -128
  171. package/dist/providers/retry.d.ts.map +0 -1
  172. package/dist/providers/retry.js +0 -205
  173. package/dist/providers/retry.js.map +0 -1
  174. package/dist/providers/retry.test.d.ts +0 -7
  175. package/dist/providers/retry.test.d.ts.map +0 -1
  176. package/dist/providers/retry.test.js +0 -439
  177. package/dist/providers/retry.test.js.map +0 -1
  178. package/dist/providers/streaming.d.ts +0 -157
  179. package/dist/providers/streaming.d.ts.map +0 -1
  180. package/dist/providers/streaming.js +0 -233
  181. package/dist/providers/streaming.js.map +0 -1
  182. package/dist/providers/streaming.test.d.ts +0 -7
  183. package/dist/providers/streaming.test.d.ts.map +0 -1
  184. package/dist/providers/streaming.test.js +0 -372
  185. package/dist/providers/streaming.test.js.map +0 -1
  186. package/dist/providers/types.d.ts +0 -209
  187. package/dist/providers/types.d.ts.map +0 -1
  188. package/dist/providers/types.js +0 -53
  189. package/dist/providers/types.js.map +0 -1
  190. package/dist/providers/types.test.d.ts +0 -7
  191. package/dist/providers/types.test.d.ts.map +0 -1
  192. package/dist/providers/types.test.js +0 -141
  193. package/dist/providers/types.test.js.map +0 -1
  194. package/dist/tools/cli/beads.d.ts +0 -27
  195. package/dist/tools/cli/beads.d.ts.map +0 -1
  196. package/dist/tools/cli/beads.js +0 -172
  197. package/dist/tools/cli/beads.js.map +0 -1
  198. package/dist/tools/cli/beads.test.d.ts +0 -8
  199. package/dist/tools/cli/beads.test.d.ts.map +0 -1
  200. package/dist/tools/cli/beads.test.js +0 -264
  201. package/dist/tools/cli/beads.test.js.map +0 -1
  202. package/dist/tools/cli/editFile.d.ts +0 -17
  203. package/dist/tools/cli/editFile.d.ts.map +0 -1
  204. package/dist/tools/cli/editFile.js +0 -125
  205. package/dist/tools/cli/editFile.js.map +0 -1
  206. package/dist/tools/cli/editFile.test.d.ts +0 -8
  207. package/dist/tools/cli/editFile.test.d.ts.map +0 -1
  208. package/dist/tools/cli/editFile.test.js +0 -177
  209. package/dist/tools/cli/editFile.test.js.map +0 -1
  210. package/dist/tools/cli/readFile.d.ts +0 -25
  211. package/dist/tools/cli/readFile.d.ts.map +0 -1
  212. package/dist/tools/cli/readFile.js +0 -118
  213. package/dist/tools/cli/readFile.js.map +0 -1
  214. package/dist/tools/cli/readFile.test.d.ts +0 -8
  215. package/dist/tools/cli/readFile.test.d.ts.map +0 -1
  216. package/dist/tools/cli/readFile.test.js +0 -194
  217. package/dist/tools/cli/readFile.test.js.map +0 -1
  218. package/dist/tools/cli/search.d.ts +0 -16
  219. package/dist/tools/cli/search.d.ts.map +0 -1
  220. package/dist/tools/cli/search.js +0 -261
  221. package/dist/tools/cli/search.js.map +0 -1
  222. package/dist/tools/cli/search.test.d.ts +0 -8
  223. package/dist/tools/cli/search.test.d.ts.map +0 -1
  224. package/dist/tools/cli/search.test.js +0 -172
  225. package/dist/tools/cli/search.test.js.map +0 -1
  226. package/dist/tools/cli/subagent.d.ts +0 -43
  227. package/dist/tools/cli/subagent.d.ts.map +0 -1
  228. package/dist/tools/cli/subagent.js +0 -99
  229. package/dist/tools/cli/subagent.js.map +0 -1
  230. package/dist/tools/cli/subagent.test.d.ts +0 -8
  231. package/dist/tools/cli/subagent.test.d.ts.map +0 -1
  232. package/dist/tools/cli/subagent.test.js +0 -190
  233. package/dist/tools/cli/subagent.test.js.map +0 -1
  234. package/dist/tools/cli/terminal.d.ts +0 -19
  235. package/dist/tools/cli/terminal.d.ts.map +0 -1
  236. package/dist/tools/cli/terminal.js +0 -164
  237. package/dist/tools/cli/terminal.js.map +0 -1
  238. package/dist/tools/cli/terminal.test.d.ts +0 -8
  239. package/dist/tools/cli/terminal.test.d.ts.map +0 -1
  240. package/dist/tools/cli/terminal.test.js +0 -161
  241. package/dist/tools/cli/terminal.test.js.map +0 -1
  242. package/dist/tools/index.d.ts +0 -25
  243. package/dist/tools/index.d.ts.map +0 -1
  244. package/dist/tools/index.js +0 -41
  245. package/dist/tools/index.js.map +0 -1
  246. package/dist/tools/interface.d.ts +0 -64
  247. package/dist/tools/interface.d.ts.map +0 -1
  248. package/dist/tools/interface.js +0 -37
  249. package/dist/tools/interface.js.map +0 -1
  250. package/dist/tools/interface.test.d.ts +0 -7
  251. package/dist/tools/interface.test.d.ts.map +0 -1
  252. package/dist/tools/interface.test.js +0 -179
  253. package/dist/tools/interface.test.js.map +0 -1
  254. package/dist/tools/mcp/bridge.d.ts +0 -48
  255. package/dist/tools/mcp/bridge.d.ts.map +0 -1
  256. package/dist/tools/mcp/bridge.js +0 -128
  257. package/dist/tools/mcp/bridge.js.map +0 -1
  258. package/dist/tools/mcp/bridge.test.d.ts +0 -8
  259. package/dist/tools/mcp/bridge.test.d.ts.map +0 -1
  260. package/dist/tools/mcp/bridge.test.js +0 -300
  261. package/dist/tools/mcp/bridge.test.js.map +0 -1
  262. package/dist/tools/mcp/client.d.ts +0 -135
  263. package/dist/tools/mcp/client.d.ts.map +0 -1
  264. package/dist/tools/mcp/client.js +0 -263
  265. package/dist/tools/mcp/client.js.map +0 -1
  266. package/dist/tools/mcp/client.test.d.ts +0 -8
  267. package/dist/tools/mcp/client.test.d.ts.map +0 -1
  268. package/dist/tools/mcp/client.test.js +0 -390
  269. package/dist/tools/mcp/client.test.js.map +0 -1
  270. package/dist/tools/registry.d.ts +0 -82
  271. package/dist/tools/registry.d.ts.map +0 -1
  272. package/dist/tools/registry.js +0 -99
  273. package/dist/tools/registry.js.map +0 -1
  274. package/dist/tools/registry.test.d.ts +0 -7
  275. package/dist/tools/registry.test.d.ts.map +0 -1
  276. package/dist/tools/registry.test.js +0 -199
  277. package/dist/tools/registry.test.js.map +0 -1
  278. package/dist/tools/suite.test.d.ts +0 -11
  279. package/dist/tools/suite.test.d.ts.map +0 -1
  280. package/dist/tools/suite.test.js +0 -119
  281. package/dist/tools/suite.test.js.map +0 -1
  282. package/dist/tools/types.d.ts +0 -75
  283. package/dist/tools/types.d.ts.map +0 -1
  284. package/dist/tools/types.js +0 -30
  285. package/dist/tools/types.js.map +0 -1
  286. package/dist/tools/types.test.d.ts +0 -7
  287. package/dist/tools/types.test.d.ts.map +0 -1
  288. package/dist/tools/types.test.js +0 -178
  289. package/dist/tools/types.test.js.map +0 -1
  290. package/templates/.vscode/mcp.json +0 -20
  291. package/templates/CLAUDE.md +0 -129
@@ -1,517 +0,0 @@
1
- /**
2
- * Orchestrator Tests
3
- *
4
- * Integration tests for the full agent loop: routing → LLM → tool calls → response.
5
- * Uses mock LLM provider and tools to verify the orchestration flow.
6
- */
7
- import { describe, it } from 'node:test';
8
- import assert from 'node:assert';
9
- import { Orchestrator } from './orchestrator.js';
10
- import { LLMProviderBase } from '../providers/interface.js';
11
- import { ToolRegistry } from '../tools/registry.js';
12
- // =============================================================================
13
- // Mock LLM Provider
14
- // =============================================================================
15
- /** Minimal TokenCredential stub for tests */
16
- const mockCredential = { getToken: async () => ({ token: 'test', expiresOnTimestamp: Date.now() + 3600000 }) };
17
- /**
18
- * A mock LLM provider that returns predetermined responses.
19
- * Extends LLMProviderBase so it satisfies the type hierarchy.
20
- */
21
- class MockProvider extends LLMProviderBase {
22
- responses = [];
23
- callCount = 0;
24
- chatCallCount = 0;
25
- constructor() {
26
- super({
27
- provider: 'azure-openai',
28
- model: 'test-model',
29
- endpoint: 'https://test.openai.azure.com',
30
- credential: mockCredential,
31
- });
32
- }
33
- get name() { return 'mock'; }
34
- get isConfigured() { return true; }
35
- /** Queue a text response */
36
- addTextResponse(content) {
37
- this.responses.push({ content });
38
- }
39
- /** Queue a tool call response */
40
- addToolCallResponse(toolCalls, content) {
41
- this.responses.push({ content: content ?? '', toolCalls });
42
- }
43
- async chat(_messages, _options) {
44
- this.chatCallCount++;
45
- const response = this.responses[this.callCount++];
46
- if (!response) {
47
- return {
48
- id: `resp-${this.callCount}`,
49
- choices: [{ index: 0, message: { role: 'assistant', content: 'No more responses queued.' }, finish_reason: 'stop' }],
50
- usage: { prompt_tokens: 10, completion_tokens: 5, total_tokens: 15 },
51
- };
52
- }
53
- const message = {
54
- role: 'assistant',
55
- content: response.content,
56
- tool_calls: response.toolCalls,
57
- };
58
- return {
59
- id: `resp-${this.callCount}`,
60
- choices: [{ index: 0, message, finish_reason: response.toolCalls ? 'tool_calls' : 'stop' }],
61
- usage: { prompt_tokens: 10, completion_tokens: 5, total_tokens: 15 },
62
- };
63
- }
64
- async *chatStream(messages, options) {
65
- const response = await this.chat(messages, options);
66
- const choice = response.choices[0];
67
- yield {
68
- id: response.id,
69
- content: choice.message.content,
70
- role: 'assistant',
71
- finish_reason: choice.finish_reason,
72
- };
73
- }
74
- async countTokens(_messages) {
75
- return 100;
76
- }
77
- }
78
- // =============================================================================
79
- // Test Fixtures
80
- // =============================================================================
81
- function createAgent(id, name, tools, infer) {
82
- return {
83
- id,
84
- frontmatter: {
85
- name,
86
- description: `${name} agent`,
87
- tools: tools ?? ['readFile', 'editFiles'],
88
- infer: infer ?? true,
89
- handoffs: [],
90
- },
91
- body: `# ${name}\n\nYou are ${name}.`,
92
- sourcePath: `/agents/${id}.agent.md`,
93
- };
94
- }
95
- function createSkill(id, triggers) {
96
- return {
97
- id,
98
- frontmatter: { name: id, description: `Triggers on: ${triggers.join(', ')}` },
99
- body: `Skill content for ${id}`,
100
- sourcePath: `/skills/${id}/SKILL.md`,
101
- triggers,
102
- };
103
- }
104
- /** Create a simple echo tool for testing */
105
- function createEchoTool() {
106
- return {
107
- name: 'echo',
108
- description: 'Echoes input back',
109
- inputSchema: {
110
- type: 'object',
111
- properties: { message: { type: 'string', description: 'Message to echo' } },
112
- required: ['message'],
113
- },
114
- async execute(input) {
115
- return { success: true, output: `Echo: ${input.message}` };
116
- },
117
- };
118
- }
119
- /** Create a readFile tool stub for testing */
120
- function createReadFileTool() {
121
- return {
122
- name: 'readFile',
123
- description: 'Read a file',
124
- inputSchema: {
125
- type: 'object',
126
- properties: { path: { type: 'string', description: 'File path' } },
127
- required: ['path'],
128
- },
129
- async execute(input) {
130
- return { success: true, output: `Contents of ${input.path}` };
131
- },
132
- };
133
- }
134
- /** Create a subagent tool stub that returns pending metadata */
135
- function createSubagentTool() {
136
- return {
137
- name: 'subagent',
138
- description: 'Spawn a subagent',
139
- inputSchema: {
140
- type: 'object',
141
- properties: {
142
- agentName: { type: 'string' },
143
- prompt: { type: 'string' },
144
- description: { type: 'string' },
145
- },
146
- required: ['agentName', 'prompt'],
147
- },
148
- async execute(input) {
149
- return {
150
- success: true,
151
- output: `Subagent request: ${input.agentName}`,
152
- metadata: {
153
- agentName: input.agentName,
154
- prompt: input.prompt,
155
- description: input.description,
156
- status: 'pending',
157
- },
158
- };
159
- },
160
- };
161
- }
162
- function createToolContext() {
163
- return {
164
- workingDir: '/test',
165
- permissions: {
166
- allowFileRead: true,
167
- allowFileWrite: true,
168
- allowTerminal: true,
169
- allowNetwork: true,
170
- },
171
- };
172
- }
173
- function createOrchestratorConfig(provider, registry, agents, skills) {
174
- const agentList = agents ?? [
175
- createAgent('beth', 'Beth'),
176
- createAgent('developer', 'developer'),
177
- createAgent('tester', 'tester'),
178
- ];
179
- return {
180
- agents: { agents: agentList, errors: [] },
181
- skills: { skills: skills ?? [], errors: [] },
182
- provider,
183
- toolRegistry: registry ?? new ToolRegistry(),
184
- toolContext: createToolContext(),
185
- defaultAgentId: 'beth',
186
- maxIterations: 10,
187
- maxSubagentDepth: 2,
188
- };
189
- }
190
- // =============================================================================
191
- // Tests
192
- // =============================================================================
193
- describe('Orchestrator', () => {
194
- describe('Basic message processing', () => {
195
- it('should process a simple text response', async () => {
196
- const provider = new MockProvider();
197
- provider.addTextResponse('Hello! How can I help?');
198
- const orchestrator = new Orchestrator(createOrchestratorConfig(provider));
199
- const result = await orchestrator.processMessage('Hello');
200
- assert.strictEqual(result.response, 'Hello! How can I help?');
201
- assert.strictEqual(result.agentId, 'beth');
202
- assert.strictEqual(result.iterations, 1);
203
- assert.strictEqual(result.toolCallsExecuted.length, 0);
204
- });
205
- it('should default to beth agent', async () => {
206
- const provider = new MockProvider();
207
- provider.addTextResponse('I am Beth.');
208
- const orchestrator = new Orchestrator(createOrchestratorConfig(provider));
209
- const result = await orchestrator.processMessage('Who are you?');
210
- assert.strictEqual(result.agentId, 'beth');
211
- assert.strictEqual(result.routeReason, 'default');
212
- });
213
- it('should route @developer mention to developer', async () => {
214
- const provider = new MockProvider();
215
- provider.addTextResponse('I will implement that.');
216
- const orchestrator = new Orchestrator(createOrchestratorConfig(provider));
217
- const result = await orchestrator.processMessage('@developer implement login');
218
- assert.strictEqual(result.agentId, 'developer');
219
- assert.strictEqual(result.routeReason, 'mention');
220
- });
221
- });
222
- describe('Tool calling loop', () => {
223
- it('should execute tool calls and return final response', async () => {
224
- const provider = new MockProvider();
225
- // First response: tool call
226
- provider.addToolCallResponse([
227
- { id: 'tc1', type: 'function', function: { name: 'readFile', arguments: '{"path":"test.ts"}' } },
228
- ]);
229
- // Second response: text (after seeing tool result)
230
- provider.addTextResponse('The file contains test code.');
231
- const registry = new ToolRegistry();
232
- registry.register(createReadFileTool());
233
- const orchestrator = new Orchestrator(createOrchestratorConfig(provider, registry));
234
- const result = await orchestrator.processMessage('Read test.ts');
235
- assert.strictEqual(result.response, 'The file contains test code.');
236
- assert.strictEqual(result.iterations, 2);
237
- assert.strictEqual(result.toolCallsExecuted.length, 1);
238
- assert.strictEqual(result.toolCallsExecuted[0].name, 'readFile');
239
- assert.strictEqual(result.toolCallsExecuted[0].success, true);
240
- });
241
- it('should handle multiple tool calls in one response', async () => {
242
- const provider = new MockProvider();
243
- // Two tool calls in one response
244
- provider.addToolCallResponse([
245
- { id: 'tc1', type: 'function', function: { name: 'echo', arguments: '{"message":"hello"}' } },
246
- { id: 'tc2', type: 'function', function: { name: 'readFile', arguments: '{"path":"a.ts"}' } },
247
- ]);
248
- provider.addTextResponse('Done with both.');
249
- const registry = new ToolRegistry();
250
- registry.register(createEchoTool());
251
- registry.register(createReadFileTool());
252
- const orchestrator = new Orchestrator(createOrchestratorConfig(provider, registry));
253
- const result = await orchestrator.processMessage('Do two things');
254
- assert.strictEqual(result.response, 'Done with both.');
255
- assert.strictEqual(result.toolCallsExecuted.length, 2);
256
- });
257
- it('should handle unknown tool gracefully', async () => {
258
- const provider = new MockProvider();
259
- provider.addToolCallResponse([
260
- { id: 'tc1', type: 'function', function: { name: 'unknownTool', arguments: '{}' } },
261
- ]);
262
- provider.addTextResponse('Could not find that tool.');
263
- const orchestrator = new Orchestrator(createOrchestratorConfig(provider));
264
- const result = await orchestrator.processMessage('Use unknown tool');
265
- assert.strictEqual(result.toolCallsExecuted.length, 1);
266
- assert.strictEqual(result.toolCallsExecuted[0].success, false);
267
- assert.ok(result.toolCallsExecuted[0].output.includes('not found'));
268
- });
269
- it('should handle invalid JSON arguments gracefully', async () => {
270
- const provider = new MockProvider();
271
- provider.addToolCallResponse([
272
- { id: 'tc1', type: 'function', function: { name: 'echo', arguments: 'not json' } },
273
- ]);
274
- provider.addTextResponse('That did not work.');
275
- const registry = new ToolRegistry();
276
- registry.register(createEchoTool());
277
- const orchestrator = new Orchestrator(createOrchestratorConfig(provider, registry));
278
- const result = await orchestrator.processMessage('Bad args');
279
- assert.strictEqual(result.toolCallsExecuted[0].success, false);
280
- assert.ok(result.toolCallsExecuted[0].output.includes('Invalid JSON'));
281
- });
282
- it('should respect max iterations', async () => {
283
- const provider = new MockProvider();
284
- // Keep returning tool calls forever
285
- for (let i = 0; i < 15; i++) {
286
- provider.addToolCallResponse([
287
- { id: `tc${i}`, type: 'function', function: { name: 'echo', arguments: `{"message":"loop ${i}"}` } },
288
- ]);
289
- }
290
- const registry = new ToolRegistry();
291
- registry.register(createEchoTool());
292
- const config = createOrchestratorConfig(provider, registry);
293
- config.maxIterations = 5;
294
- const orchestrator = new Orchestrator(config);
295
- const result = await orchestrator.processMessage('Loop forever');
296
- assert.strictEqual(result.iterations, 5);
297
- assert.ok(result.response.includes('maximum iterations'));
298
- });
299
- });
300
- describe('Skill injection', () => {
301
- it('should inject matching skills into context', async () => {
302
- const provider = new MockProvider();
303
- provider.addTextResponse('I will create the PRD.');
304
- const skills = [createSkill('prd', ['create a prd', 'product requirements'])];
305
- const orchestrator = new Orchestrator(createOrchestratorConfig(provider, undefined, undefined, skills));
306
- const result = await orchestrator.processMessage('create a prd for auth');
307
- assert.strictEqual(result.injectedSkills.length, 1);
308
- assert.strictEqual(result.injectedSkills[0], 'prd');
309
- });
310
- it('should not inject the same skill twice', async () => {
311
- const provider = new MockProvider();
312
- provider.addTextResponse('First response.');
313
- provider.addTextResponse('Second response.');
314
- const skills = [createSkill('prd', ['create a prd'])];
315
- const orchestrator = new Orchestrator(createOrchestratorConfig(provider, undefined, undefined, skills));
316
- const result1 = await orchestrator.processMessage('create a prd for auth');
317
- assert.strictEqual(result1.injectedSkills.length, 1);
318
- const result2 = await orchestrator.processMessage('create a prd for billing');
319
- assert.strictEqual(result2.injectedSkills.length, 0);
320
- });
321
- });
322
- describe('Subagent handling', () => {
323
- it('should handle subagent tool calls', async () => {
324
- const provider = new MockProvider();
325
- // Main agent calls subagent
326
- provider.addToolCallResponse([
327
- {
328
- id: 'tc1',
329
- type: 'function',
330
- function: {
331
- name: 'subagent',
332
- arguments: JSON.stringify({ agentName: 'developer', prompt: 'Build login' }),
333
- },
334
- },
335
- ]);
336
- // Subagent's LLM response
337
- provider.addTextResponse('Login component built successfully.');
338
- // Main agent's final response
339
- provider.addTextResponse('The developer has built the login component.');
340
- const registry = new ToolRegistry();
341
- registry.register(createSubagentTool());
342
- const orchestrator = new Orchestrator(createOrchestratorConfig(provider, registry));
343
- const result = await orchestrator.processMessage('Build a login page');
344
- assert.strictEqual(result.subagentResults.length, 1);
345
- assert.strictEqual(result.subagentResults[0].agentId, 'developer');
346
- assert.strictEqual(result.subagentResults[0].success, true);
347
- });
348
- it('should fail gracefully for unknown subagent', async () => {
349
- const provider = new MockProvider();
350
- provider.addToolCallResponse([
351
- {
352
- id: 'tc1',
353
- type: 'function',
354
- function: {
355
- name: 'subagent',
356
- arguments: JSON.stringify({ agentName: 'nonexistent', prompt: 'Do stuff' }),
357
- },
358
- },
359
- ]);
360
- provider.addTextResponse('That agent does not exist.');
361
- const registry = new ToolRegistry();
362
- registry.register(createSubagentTool());
363
- const orchestrator = new Orchestrator(createOrchestratorConfig(provider, registry));
364
- const result = await orchestrator.processMessage('Call nonexistent agent');
365
- assert.strictEqual(result.subagentResults.length, 1);
366
- assert.strictEqual(result.subagentResults[0].success, false);
367
- assert.ok(result.subagentResults[0].response.includes('not found'));
368
- });
369
- it('should respect subagent depth limit', async () => {
370
- const provider = new MockProvider();
371
- // Keep requesting subagents
372
- for (let i = 0; i < 5; i++) {
373
- provider.addToolCallResponse([
374
- {
375
- id: `tc${i}`,
376
- type: 'function',
377
- function: {
378
- name: 'subagent',
379
- arguments: JSON.stringify({ agentName: 'developer', prompt: `Depth ${i}` }),
380
- },
381
- },
382
- ]);
383
- }
384
- // Subagent responses
385
- for (let i = 0; i < 5; i++) {
386
- provider.addTextResponse(`Done at depth ${i}`);
387
- }
388
- provider.addTextResponse('All done.');
389
- const registry = new ToolRegistry();
390
- registry.register(createSubagentTool());
391
- const config = createOrchestratorConfig(provider, registry);
392
- config.maxSubagentDepth = 1;
393
- const orchestrator = new Orchestrator(config);
394
- const result = await orchestrator.processMessage('Go deep');
395
- // At least one subagent should have been depth-limited
396
- const hasFailures = result.subagentResults.some((r) => !r.success);
397
- // Depends on exact execution: first call succeeds (depth 0→1), nested would fail
398
- assert.ok(result.subagentResults.length > 0 || hasFailures);
399
- });
400
- });
401
- describe('Handoffs', () => {
402
- it('should execute a handoff to another agent', async () => {
403
- const provider = new MockProvider();
404
- provider.addTextResponse('I am Beth.');
405
- provider.addTextResponse('I am developer now.');
406
- const agents = [
407
- createAgent('beth', 'Beth'),
408
- createAgent('developer', 'developer'),
409
- ];
410
- agents[0].frontmatter.handoffs = [
411
- { label: 'Dev', agent: 'developer', prompt: 'code this', send: false },
412
- ];
413
- const orchestrator = new Orchestrator(createOrchestratorConfig(provider, undefined, agents));
414
- // First message goes to Beth
415
- await orchestrator.processMessage('Hello Beth');
416
- assert.strictEqual(orchestrator.getActiveAgentId(), 'beth');
417
- // Execute a handoff
418
- const { handoff } = await orchestrator.executeHandoff('developer', 'Build login');
419
- assert.strictEqual(handoff.executed, true);
420
- assert.strictEqual(orchestrator.getActiveAgentId(), 'developer');
421
- });
422
- it('should fail handoff to unknown agent', async () => {
423
- const provider = new MockProvider();
424
- provider.addTextResponse('I am Beth.');
425
- const orchestrator = new Orchestrator(createOrchestratorConfig(provider));
426
- await orchestrator.processMessage('Hello');
427
- const { handoff } = await orchestrator.executeHandoff('nonexistent', 'Do stuff');
428
- assert.strictEqual(handoff.executed, false);
429
- });
430
- });
431
- describe('Observer callbacks', () => {
432
- it('should call observer on route', async () => {
433
- const provider = new MockProvider();
434
- provider.addTextResponse('Done.');
435
- const orchestrator = new Orchestrator(createOrchestratorConfig(provider));
436
- let routeCalled = false;
437
- orchestrator.setObserver({
438
- onRoute: () => { routeCalled = true; },
439
- });
440
- await orchestrator.processMessage('Hello');
441
- assert.strictEqual(routeCalled, true);
442
- });
443
- it('should call observer on LLM calls', async () => {
444
- const provider = new MockProvider();
445
- provider.addTextResponse('Response.');
446
- const orchestrator = new Orchestrator(createOrchestratorConfig(provider));
447
- let llmCallAgent = '';
448
- orchestrator.setObserver({
449
- onLLMCall: (agentId) => { llmCallAgent = agentId; },
450
- });
451
- await orchestrator.processMessage('Hello');
452
- assert.strictEqual(llmCallAgent, 'beth');
453
- });
454
- it('should call observer on tool calls', async () => {
455
- const provider = new MockProvider();
456
- provider.addToolCallResponse([
457
- { id: 'tc1', type: 'function', function: { name: 'echo', arguments: '{"message":"hi"}' } },
458
- ]);
459
- provider.addTextResponse('Done.');
460
- const registry = new ToolRegistry();
461
- registry.register(createEchoTool());
462
- const orchestrator = new Orchestrator(createOrchestratorConfig(provider, registry));
463
- const records = [];
464
- orchestrator.setObserver({
465
- onToolCallEnd: (record) => { records.push(record); },
466
- });
467
- await orchestrator.processMessage('Echo something');
468
- assert.strictEqual(records.length, 1);
469
- assert.strictEqual(records[0].name, 'echo');
470
- });
471
- });
472
- describe('State management', () => {
473
- it('should maintain conversation context across turns', async () => {
474
- const provider = new MockProvider();
475
- provider.addTextResponse('First response.');
476
- provider.addTextResponse('Second response.');
477
- const orchestrator = new Orchestrator(createOrchestratorConfig(provider));
478
- await orchestrator.processMessage('First message');
479
- await orchestrator.processMessage('Second message');
480
- const context = orchestrator.getActiveContext();
481
- assert.ok(context);
482
- assert.strictEqual(context.getTurnCount(), 2);
483
- });
484
- it('should reset state', async () => {
485
- const provider = new MockProvider();
486
- provider.addTextResponse('Hello.');
487
- provider.addTextResponse('After reset.');
488
- const orchestrator = new Orchestrator(createOrchestratorConfig(provider));
489
- await orchestrator.processMessage('Hello');
490
- orchestrator.reset();
491
- assert.strictEqual(orchestrator.getActiveAgentId(), 'beth');
492
- const context = orchestrator.getActiveContext();
493
- assert.strictEqual(context, undefined);
494
- });
495
- it('should expose router and handoff manager', () => {
496
- const provider = new MockProvider();
497
- const orchestrator = new Orchestrator(createOrchestratorConfig(provider));
498
- assert.ok(orchestrator.getRouter());
499
- assert.ok(orchestrator.getHandoffManager());
500
- });
501
- });
502
- describe('Agent tool filtering', () => {
503
- it('should send tool definitions to the LLM', async () => {
504
- const provider = new MockProvider();
505
- provider.addTextResponse('Done.');
506
- const registry = new ToolRegistry();
507
- registry.register(createEchoTool());
508
- registry.register(createReadFileTool());
509
- const orchestrator = new Orchestrator(createOrchestratorConfig(provider, registry));
510
- const result = await orchestrator.processMessage('Hello');
511
- // Just verify it completes without error — the LLM receives tool defs
512
- assert.strictEqual(result.response, 'Done.');
513
- assert.strictEqual(provider.chatCallCount, 1);
514
- });
515
- });
516
- });
517
- //# sourceMappingURL=orchestrator.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"orchestrator.test.js","sourceRoot":"","sources":["../../src/core/orchestrator.test.ts"],"names":[],"mappings":"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"}
@@ -1,102 +0,0 @@
1
- /**
2
- * Agent Router
3
- *
4
- * Routes user requests to the appropriate agent based on:
5
- * 1. Explicit @agent mentions in user input
6
- * 2. Active handoff targets from the current agent
7
- * 3. Skill trigger matching
8
- * 4. Default to the orchestrator (Beth)
9
- *
10
- * Also provides agent lookup utilities for the orchestrator.
11
- */
12
- import type { AgentDefinition, AgentLoadResult } from './agents/types.js';
13
- import type { SkillDefinition, SkillLoadResult } from './skills/types.js';
14
- /**
15
- * Result of routing a user request.
16
- */
17
- export interface RouteResult {
18
- /** The agent that should handle this request */
19
- agent: AgentDefinition;
20
- /** How the agent was selected */
21
- reason: RouteReason;
22
- /** Skills that should be injected for this request */
23
- matchedSkills: SkillDefinition[];
24
- /** If routed via @mention, the cleaned prompt without the @mention */
25
- cleanedPrompt?: string;
26
- }
27
- /**
28
- * Why a particular agent was selected.
29
- */
30
- export type RouteReason = 'mention' | 'handoff' | 'skill-match' | 'default';
31
- /**
32
- * Routes requests to the appropriate agent.
33
- *
34
- * @example
35
- * ```typescript
36
- * const router = new AgentRouter(agentLoadResult, skillLoadResult, 'beth');
37
- *
38
- * const result = router.route('@developer implement login page');
39
- * // result.agent.id === 'developer'
40
- * // result.reason === 'mention'
41
- * // result.cleanedPrompt === 'implement login page'
42
- *
43
- * const result2 = router.route('create a prd for auth');
44
- * // result2.matchedSkills contains the PRD skill
45
- * ```
46
- */
47
- export declare class AgentRouter {
48
- /** Map of agent ID → agent definition */
49
- private readonly agents;
50
- /** Map of agent name (lowercase) → agent ID for lookup */
51
- private readonly nameToId;
52
- /** Skill trigger map for matching */
53
- private readonly triggerMap;
54
- /** Default agent ID (typically 'beth') */
55
- private readonly defaultAgentId;
56
- constructor(agentResult: AgentLoadResult, skillResult: SkillLoadResult, defaultAgentId?: string);
57
- /**
58
- * Route a user message to the appropriate agent.
59
- *
60
- * @param userMessage - The user's input text
61
- * @param currentAgentId - The currently active agent (for handoff context)
62
- * @returns Routing result with selected agent and matched skills
63
- */
64
- route(userMessage: string, currentAgentId?: string): RouteResult;
65
- /**
66
- * Route directly to a specific agent by ID or name.
67
- *
68
- * @param agentIdOrName - Agent ID or display name
69
- * @returns The agent definition, or undefined if not found
70
- */
71
- resolveAgent(agentIdOrName: string): AgentDefinition | undefined;
72
- /**
73
- * Get all registered agents.
74
- */
75
- getAgents(): AgentDefinition[];
76
- /**
77
- * Get agents that can be invoked as subagents (infer: true).
78
- */
79
- getInferableAgents(): AgentDefinition[];
80
- /**
81
- * Get the default orchestrator agent.
82
- */
83
- getDefaultAgent(): AgentDefinition;
84
- /**
85
- * Check if a specific agent is registered.
86
- */
87
- hasAgent(agentIdOrName: string): boolean;
88
- /**
89
- * Check for @agent mention in user input.
90
- *
91
- * Matches patterns like:
92
- * - "@developer implement the login page"
93
- * - "@product-manager create a PRD"
94
- * - "@Beth plan a feature"
95
- */
96
- private checkMention;
97
- /**
98
- * Find skills whose triggers match the user message.
99
- */
100
- private findSkills;
101
- }
102
- //# sourceMappingURL=router.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/core/router.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,KAAK,EAAE,eAAe,EAAc,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAOtF;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,gDAAgD;IAChD,KAAK,EAAE,eAAe,CAAC;IAEvB,iCAAiC;IACjC,MAAM,EAAE,WAAW,CAAC;IAEpB,sDAAsD;IACtD,aAAa,EAAE,eAAe,EAAE,CAAC;IAEjC,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,GACnB,SAAS,GACT,SAAS,GACT,aAAa,GACb,SAAS,CAAC;AAMd;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,WAAW;IACtB,yCAAyC;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+B;IAEtD,0DAA0D;IAC1D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;IAE/C,qCAAqC;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IAExC,0CAA0C;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;gBAGtC,WAAW,EAAE,eAAe,EAC5B,WAAW,EAAE,eAAe,EAC5B,cAAc,GAAE,MAAe;IAsBjC;;;;;;OAMG;IACH,KAAK,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,WAAW;IAkChE;;;;;OAKG;IACH,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAYhE;;OAEG;IACH,SAAS,IAAI,eAAe,EAAE;IAI9B;;OAEG;IACH,kBAAkB,IAAI,eAAe,EAAE;IAIvC;;OAEG;IACH,eAAe,IAAI,eAAe;IAalC;;OAEG;IACH,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO;IAQxC;;;;;;;OAOG;IACH,OAAO,CAAC,YAAY;IAmBpB;;OAEG;IACH,OAAO,CAAC,UAAU;CAGnB"}