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 +0,0 @@
1
- {"version":3,"file":"handoffs.test.d.ts","sourceRoot":"","sources":["../../src/core/handoffs.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -1,231 +0,0 @@
1
- /**
2
- * HandoffManager Tests
3
- *
4
- * Tests for agent-to-agent transfers: preparation, execution,
5
- * context building, depth limits, and loop detection.
6
- */
7
- import { describe, it } from 'node:test';
8
- import assert from 'node:assert';
9
- import { HandoffManager } from './handoffs.js';
10
- import { AgentRouter } from './router.js';
11
- import { ConversationContext } from './context.js';
12
- // =============================================================================
13
- // Test Fixtures
14
- // =============================================================================
15
- function createAgent(id, name, handoffs) {
16
- return {
17
- id,
18
- frontmatter: {
19
- name,
20
- description: `${name} agent`,
21
- tools: ['readFile'],
22
- handoffs: handoffs ?? [],
23
- },
24
- body: `# ${name}`,
25
- sourcePath: `/agents/${id}.agent.md`,
26
- };
27
- }
28
- function createTestSetup(maxDepth) {
29
- const beth = createAgent('beth', 'Beth', [
30
- { label: 'Development', agent: 'developer', prompt: 'Implement this', send: false },
31
- { label: 'Testing', agent: 'tester', prompt: 'Test this', send: true },
32
- { label: 'Design', agent: 'ux-designer', prompt: 'Design this' },
33
- ]);
34
- const developer = createAgent('developer', 'developer', [
35
- { label: 'QA', agent: 'tester', prompt: 'Test the implementation', send: false },
36
- { label: 'Review', agent: 'beth', prompt: 'Review complete' },
37
- ]);
38
- const tester = createAgent('tester', 'tester', [
39
- { label: 'Fix Issue', agent: 'developer', prompt: 'Fix this bug', send: false },
40
- ]);
41
- const designer = createAgent('ux-designer', 'ux-designer', []);
42
- const agentResult = {
43
- agents: [beth, developer, tester, designer],
44
- errors: [],
45
- };
46
- const skillResult = { skills: [], errors: [] };
47
- const router = new AgentRouter(agentResult, skillResult, 'beth');
48
- const manager = new HandoffManager(router, { maxDepth: maxDepth ?? 10 });
49
- return { router, manager, beth, developer, tester, designer };
50
- }
51
- // =============================================================================
52
- // Tests
53
- // =============================================================================
54
- describe('HandoffManager', () => {
55
- describe('Handoff Discovery', () => {
56
- it('should list available handoffs for an agent', () => {
57
- const { manager, beth } = createTestSetup();
58
- const handoffs = manager.getAvailableHandoffs(beth);
59
- assert.strictEqual(handoffs.length, 3);
60
- assert.strictEqual(handoffs[0].label, 'Development');
61
- assert.strictEqual(handoffs[0].agent, 'developer');
62
- });
63
- it('should return empty array for agent with no handoffs', () => {
64
- const { manager, designer } = createTestSetup();
65
- const handoffs = manager.getAvailableHandoffs(designer);
66
- assert.strictEqual(handoffs.length, 0);
67
- });
68
- it('should find a specific handoff by target', () => {
69
- const { manager, beth } = createTestSetup();
70
- const handoff = manager.findHandoff(beth, 'developer');
71
- assert.ok(handoff);
72
- assert.strictEqual(handoff.label, 'Development');
73
- assert.strictEqual(handoff.prompt, 'Implement this');
74
- });
75
- it('should return undefined for unknown target', () => {
76
- const { manager, beth } = createTestSetup();
77
- const handoff = manager.findHandoff(beth, 'nonexistent');
78
- assert.strictEqual(handoff, undefined);
79
- });
80
- });
81
- describe('Handoff Preparation', () => {
82
- it('should prepare a handoff with defaults from definition', () => {
83
- const { manager, beth } = createTestSetup();
84
- const request = manager.prepareHandoff(beth, 'developer');
85
- assert.ok(request);
86
- assert.strictEqual(request.fromAgentId, 'beth');
87
- assert.strictEqual(request.toAgentId, 'developer');
88
- assert.strictEqual(request.prompt, 'Implement this');
89
- assert.strictEqual(request.label, 'Development');
90
- assert.strictEqual(request.autoSend, false);
91
- });
92
- it('should override prompt when provided', () => {
93
- const { manager, beth } = createTestSetup();
94
- const request = manager.prepareHandoff(beth, 'developer', 'Build the login page');
95
- assert.ok(request);
96
- assert.strictEqual(request.prompt, 'Build the login page');
97
- });
98
- it('should include conversation summary when context provided', () => {
99
- const { manager, beth } = createTestSetup();
100
- const ctx = new ConversationContext(beth);
101
- ctx.addUserMessage('Plan authentication');
102
- ctx.addAssistantMessage('I recommend JWT tokens.');
103
- const request = manager.prepareHandoff(beth, 'developer', 'Implement auth', ctx);
104
- assert.ok(request);
105
- assert.ok(request.conversationSummary);
106
- assert.strictEqual(request.conversationSummary.agentId, 'beth');
107
- assert.strictEqual(request.conversationSummary.turnCount, 1);
108
- });
109
- it('should return null for unknown target agent', () => {
110
- const { manager, beth } = createTestSetup();
111
- const request = manager.prepareHandoff(beth, 'nonexistent');
112
- assert.strictEqual(request, null);
113
- });
114
- it('should use autoSend from handoff definition', () => {
115
- const { manager, beth } = createTestSetup();
116
- // Tester handoff has send: true
117
- const request = manager.prepareHandoff(beth, 'tester');
118
- assert.ok(request);
119
- assert.strictEqual(request.autoSend, true);
120
- });
121
- });
122
- describe('Handoff Execution', () => {
123
- it('should execute a valid handoff', () => {
124
- const { manager, beth } = createTestSetup();
125
- const request = manager.prepareHandoff(beth, 'developer');
126
- const result = manager.executeHandoff(request);
127
- assert.strictEqual(result.executed, true);
128
- assert.ok(result.targetAgent);
129
- assert.strictEqual(result.targetAgent.id, 'developer');
130
- });
131
- it('should fail for unknown target agent', () => {
132
- const { manager } = createTestSetup();
133
- const request = {
134
- fromAgentId: 'beth',
135
- toAgentId: 'nonexistent',
136
- prompt: 'Do something',
137
- label: 'Test',
138
- autoSend: false,
139
- };
140
- const result = manager.executeHandoff(request);
141
- assert.strictEqual(result.executed, false);
142
- assert.ok(result.reason?.includes('not found'));
143
- });
144
- it('should record handoff in history', () => {
145
- const { manager, beth } = createTestSetup();
146
- const request = manager.prepareHandoff(beth, 'developer');
147
- manager.executeHandoff(request);
148
- const history = manager.getHistory();
149
- assert.strictEqual(history.length, 1);
150
- assert.strictEqual(history[0].executed, true);
151
- assert.strictEqual(history[0].request.toAgentId, 'developer');
152
- });
153
- });
154
- describe('Depth Limits', () => {
155
- it('should enforce maximum handoff depth', () => {
156
- const { manager, beth, developer, tester } = createTestSetup(3);
157
- // Execute 3 handoffs
158
- manager.executeHandoff(manager.prepareHandoff(beth, 'developer'));
159
- manager.executeHandoff(manager.prepareHandoff(developer, 'tester'));
160
- manager.executeHandoff(manager.prepareHandoff(tester, 'developer'));
161
- // 4th should fail
162
- const request = manager.prepareHandoff(developer, 'tester');
163
- const result = manager.executeHandoff(request);
164
- assert.strictEqual(result.executed, false);
165
- assert.ok(result.reason?.includes('depth limit'));
166
- });
167
- it('should detect ping-pong loops (A→B→A→B)', () => {
168
- const { manager, beth, developer } = createTestSetup(20);
169
- // Create a ping-pong pattern
170
- manager.executeHandoff(manager.prepareHandoff(beth, 'developer'));
171
- manager.executeHandoff(manager.prepareHandoff(developer, 'beth'));
172
- manager.executeHandoff(manager.prepareHandoff(beth, 'developer'));
173
- manager.executeHandoff(manager.prepareHandoff(developer, 'beth'));
174
- // 5th should be caught as a loop
175
- const request = manager.prepareHandoff(beth, 'developer');
176
- const result = manager.executeHandoff(request);
177
- assert.strictEqual(result.executed, false);
178
- });
179
- it('should track depth correctly', () => {
180
- const { manager, beth } = createTestSetup();
181
- assert.strictEqual(manager.getDepth(), 0);
182
- manager.executeHandoff(manager.prepareHandoff(beth, 'developer'));
183
- assert.strictEqual(manager.getDepth(), 1);
184
- });
185
- });
186
- describe('Context Transfer', () => {
187
- it('should build handoff context string', () => {
188
- const { manager, beth } = createTestSetup();
189
- const ctx = new ConversationContext(beth);
190
- ctx.addUserMessage('Build auth');
191
- ctx.addAssistantMessage('I recommend JWT.');
192
- const request = manager.prepareHandoff(beth, 'developer', 'Implement auth', ctx);
193
- const context = manager.buildHandoffContext(request);
194
- assert.ok(context.includes('Handoff from beth'));
195
- assert.ok(context.includes('Development'));
196
- assert.ok(context.includes('Implement auth'));
197
- assert.ok(context.includes('JWT'));
198
- });
199
- it('should include tool call summary in context', () => {
200
- const { manager, beth } = createTestSetup();
201
- const ctx = new ConversationContext(beth);
202
- ctx.addUserMessage('Read the config');
203
- ctx.addAssistantToolCalls([{ id: 'tc1', type: 'function', function: { name: 'readFile', arguments: '{"path":"config.ts"}' } }]);
204
- ctx.addToolResult('tc1', 'export const config = {};');
205
- ctx.addAssistantMessage('Config is empty.');
206
- const request = manager.prepareHandoff(beth, 'developer', 'Update config', ctx);
207
- const context = manager.buildHandoffContext(request);
208
- assert.ok(context.includes('Tools used'));
209
- assert.ok(context.includes('readFile'));
210
- });
211
- });
212
- describe('History Management', () => {
213
- it('should clear history', () => {
214
- const { manager, beth } = createTestSetup();
215
- manager.executeHandoff(manager.prepareHandoff(beth, 'developer'));
216
- assert.strictEqual(manager.getHistory().length, 1);
217
- manager.clearHistory();
218
- assert.strictEqual(manager.getHistory().length, 0);
219
- assert.strictEqual(manager.getDepth(), 0);
220
- });
221
- it('should return a copy of history', () => {
222
- const { manager, beth } = createTestSetup();
223
- manager.executeHandoff(manager.prepareHandoff(beth, 'developer'));
224
- const history1 = manager.getHistory();
225
- const history2 = manager.getHistory();
226
- assert.deepStrictEqual(history1, history2);
227
- assert.notStrictEqual(history1, history2); // Different array instances
228
- });
229
- });
230
- });
231
- //# sourceMappingURL=handoffs.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"handoffs.test.js","sourceRoot":"","sources":["../../src/core/handoffs.test.ts"],"names":[],"mappings":"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"}
@@ -1,246 +0,0 @@
1
- /**
2
- * Orchestrator — Beth's Brain
3
- *
4
- * The main agentic loop that ties everything together:
5
- *
6
- * User message
7
- * → Route to agent (AgentRouter)
8
- * → Build context (ConversationContext)
9
- * → Inject skills (if triggers match)
10
- * → Send to LLM (Provider)
11
- * → If tool calls → execute tools (ToolRegistry)
12
- * → If subagent request → spawn child conversation
13
- * → Return tool results to LLM → loop
14
- * → If handoff → transfer to new agent (HandoffManager)
15
- * → If text response → return to caller
16
- *
17
- * The orchestrator supports both streaming and non-streaming modes,
18
- * and handles the full tool-calling loop until the model produces
19
- * a final text response or a handoff.
20
- */
21
- import type { LLMProviderBase } from '../providers/interface.js';
22
- import type { ToolRegistry } from '../tools/registry.js';
23
- import type { ToolContext } from '../tools/types.js';
24
- import type { AgentLoadResult } from './agents/types.js';
25
- import type { SkillLoadResult } from './skills/types.js';
26
- import { ConversationContext } from './context.js';
27
- import type { ConversationContextOptions } from './context.js';
28
- import { AgentRouter } from './router.js';
29
- import type { RouteResult } from './router.js';
30
- import { HandoffManager } from './handoffs.js';
31
- import type { HandoffRequest, HandoffResult } from './handoffs.js';
32
- /**
33
- * Configuration for the Orchestrator.
34
- */
35
- export interface OrchestratorConfig {
36
- /** Loaded agent definitions */
37
- agents: AgentLoadResult;
38
- /** Loaded skill definitions */
39
- skills: SkillLoadResult;
40
- /** LLM provider for chat completions */
41
- provider: LLMProviderBase;
42
- /** Tool registry with all available tools */
43
- toolRegistry: ToolRegistry;
44
- /** Tool execution context (working dir, permissions) */
45
- toolContext: ToolContext;
46
- /** Default agent ID (default: 'beth') */
47
- defaultAgentId?: string;
48
- /** Maximum tool-calling iterations per turn (default: 25) */
49
- maxIterations?: number;
50
- /** Maximum subagent depth (default: 3) */
51
- maxSubagentDepth?: number;
52
- /** Maximum handoff depth (default: 10) */
53
- maxHandoffDepth?: number;
54
- /** Options for conversation contexts */
55
- contextOptions?: ConversationContextOptions;
56
- }
57
- /**
58
- * The result of processing a single user turn.
59
- */
60
- export interface TurnResult {
61
- /** The final text response from the agent */
62
- response: string;
63
- /** The agent that produced this response */
64
- agentId: string;
65
- /** How the agent was selected */
66
- routeReason: RouteResult['reason'];
67
- /** Tool calls that were executed during this turn */
68
- toolCallsExecuted: ToolCallRecord[];
69
- /** Any handoff that occurred */
70
- handoff?: HandoffResult;
71
- /** Any subagent results that were collected */
72
- subagentResults: SubagentResult[];
73
- /** Number of LLM iterations used */
74
- iterations: number;
75
- /** Skills that were injected for this turn */
76
- injectedSkills: string[];
77
- }
78
- /**
79
- * Record of a tool call execution.
80
- */
81
- export interface ToolCallRecord {
82
- /** Tool call ID */
83
- id: string;
84
- /** Tool name */
85
- name: string;
86
- /** Whether the tool executed successfully */
87
- success: boolean;
88
- /** Brief output or error */
89
- output: string;
90
- }
91
- /**
92
- * Result from a subagent invocation.
93
- */
94
- export interface SubagentResult {
95
- /** The subagent's ID */
96
- agentId: string;
97
- /** The prompt sent to the subagent */
98
- prompt: string;
99
- /** The subagent's response */
100
- response: string;
101
- /** Whether the subagent completed successfully */
102
- success: boolean;
103
- }
104
- /**
105
- * Callback for observing orchestrator events.
106
- * Useful for logging, UI updates, and debugging.
107
- */
108
- export interface OrchestratorObserver {
109
- /** Called when routing is decided */
110
- onRoute?: (result: RouteResult) => void;
111
- /** Called before each LLM call */
112
- onLLMCall?: (agentId: string, messageCount: number) => void;
113
- /** Called when the LLM responds with text */
114
- onLLMResponse?: (agentId: string, content: string) => void;
115
- /** Called when a tool call starts */
116
- onToolCallStart?: (toolName: string, args: string) => void;
117
- /** Called when a tool call completes */
118
- onToolCallEnd?: (record: ToolCallRecord) => void;
119
- /** Called when a handoff is initiated */
120
- onHandoff?: (request: HandoffRequest) => void;
121
- /** Called when a subagent starts */
122
- onSubagentStart?: (agentId: string, prompt: string) => void;
123
- /** Called when a subagent completes */
124
- onSubagentEnd?: (result: SubagentResult) => void;
125
- /** Called when an iteration completes */
126
- onIteration?: (iteration: number, agentId: string) => void;
127
- }
128
- /**
129
- * The Orchestrator — Beth's brain.
130
- *
131
- * Manages the full agent loop: routing → LLM → tool calls → response.
132
- *
133
- * @example
134
- * ```typescript
135
- * const orchestrator = new Orchestrator({
136
- * agents: loadAgents('.github/agents'),
137
- * skills: loadSkills('.github/skills'),
138
- * provider: new AzureOpenAIProvider(config),
139
- * toolRegistry: createDefaultRegistry(),
140
- * toolContext: { workingDir: process.cwd(), permissions: { ... } },
141
- * });
142
- *
143
- * const result = await orchestrator.processMessage('Implement the login page');
144
- * console.log(result.response);
145
- * ```
146
- */
147
- export declare class Orchestrator {
148
- private readonly router;
149
- private readonly handoffs;
150
- private readonly provider;
151
- private readonly toolRegistry;
152
- private readonly toolContext;
153
- private readonly maxIterations;
154
- private readonly maxSubagentDepth;
155
- private readonly contextOptions?;
156
- /** Active conversation contexts by agent ID */
157
- private readonly contexts;
158
- /** Currently active agent ID */
159
- private activeAgentId;
160
- /** Observer for event callbacks */
161
- private observer?;
162
- constructor(config: OrchestratorConfig);
163
- /**
164
- * Set an observer for orchestrator events.
165
- */
166
- setObserver(observer: OrchestratorObserver): void;
167
- /**
168
- * Process a user message through the full agent loop.
169
- *
170
- * This is the main entry point. It:
171
- * 1. Routes the message to the appropriate agent
172
- * 2. Injects any matching skills
173
- * 3. Runs the agent loop (LLM → tools → LLM → ...)
174
- * 4. Returns the final response
175
- *
176
- * @param userMessage - The user's input
177
- * @returns The complete turn result
178
- */
179
- processMessage(userMessage: string): Promise<TurnResult>;
180
- /**
181
- * Process a message at a specific subagent depth.
182
- * Used internally for subagent chains.
183
- */
184
- private processMessageAtDepth;
185
- /**
186
- * Execute a handoff to a different agent.
187
- *
188
- * @param toAgentId - Target agent ID
189
- * @param prompt - Message to the new agent
190
- * @returns The handoff result and potentially a new TurnResult
191
- */
192
- executeHandoff(toAgentId: string, prompt: string): Promise<{
193
- handoff: HandoffResult;
194
- turnResult?: TurnResult;
195
- }>;
196
- /**
197
- * Get the currently active agent ID.
198
- */
199
- getActiveAgentId(): string;
200
- /**
201
- * Get the conversation context for the active agent.
202
- */
203
- getActiveContext(): ConversationContext | undefined;
204
- /**
205
- * Get the router for external agent queries.
206
- */
207
- getRouter(): AgentRouter;
208
- /**
209
- * Get the handoff manager.
210
- */
211
- getHandoffManager(): HandoffManager;
212
- /**
213
- * Reset all conversation state.
214
- */
215
- reset(): void;
216
- /**
217
- * Call the LLM and collect the full response.
218
- * Uses streaming internally for reliability, collects into a single result.
219
- */
220
- private callLLM;
221
- /**
222
- * Execute a single tool call and return a record.
223
- */
224
- private executeToolCall;
225
- /**
226
- * Handle a subagent request from a tool call.
227
- */
228
- private handleSubagentRequest;
229
- /**
230
- * Run a mini agent loop for a subagent.
231
- * Returns the final text response.
232
- */
233
- private runSubagentLoop;
234
- /**
235
- * Get or create a ConversationContext for an agent.
236
- */
237
- private getOrCreateContext;
238
- /**
239
- * Get tool definitions for an agent based on its allowed tools.
240
- *
241
- * Filters the full tool registry to only include tools the agent
242
- * is allowed to use (from its frontmatter.tools list).
243
- */
244
- private getToolDefinitions;
245
- }
246
- //# sourceMappingURL=orchestrator.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/core/orchestrator.ts"],"names":[],"mappings":"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"}