beth-copilot 1.0.17 → 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 (265) hide show
  1. package/CHANGELOG.md +41 -28
  2. package/README.md +87 -247
  3. package/bin/cli.js +115 -7
  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/init-logic.e2e.test.d.ts +37 -0
  39. package/dist/cli/commands/init-logic.e2e.test.d.ts.map +1 -0
  40. package/dist/cli/commands/init-logic.e2e.test.js +305 -0
  41. package/dist/cli/commands/init-logic.e2e.test.js.map +1 -0
  42. package/dist/cli/commands/land.d.ts +142 -0
  43. package/dist/cli/commands/land.d.ts.map +1 -0
  44. package/dist/cli/commands/land.js +647 -0
  45. package/dist/cli/commands/land.js.map +1 -0
  46. package/dist/cli/commands/land.test.d.ts +20 -0
  47. package/dist/cli/commands/land.test.d.ts.map +1 -0
  48. package/dist/cli/commands/land.test.js +622 -0
  49. package/dist/cli/commands/land.test.js.map +1 -0
  50. package/dist/cli/commands/pipeline.e2e.test.js +1 -1
  51. package/dist/cli/commands/pipeline.e2e.test.js.map +1 -1
  52. package/dist/cli/commands/pre-push-guard.d.ts +84 -0
  53. package/dist/cli/commands/pre-push-guard.d.ts.map +1 -0
  54. package/dist/cli/commands/pre-push-guard.e2e.test.d.ts +24 -0
  55. package/dist/cli/commands/pre-push-guard.e2e.test.d.ts.map +1 -0
  56. package/dist/cli/commands/pre-push-guard.e2e.test.js +171 -0
  57. package/dist/cli/commands/pre-push-guard.e2e.test.js.map +1 -0
  58. package/dist/cli/commands/pre-push-guard.js +257 -0
  59. package/dist/cli/commands/pre-push-guard.js.map +1 -0
  60. package/dist/cli/commands/pre-push-guard.test.d.ts +15 -0
  61. package/dist/cli/commands/pre-push-guard.test.d.ts.map +1 -0
  62. package/dist/cli/commands/pre-push-guard.test.js +397 -0
  63. package/dist/cli/commands/pre-push-guard.test.js.map +1 -0
  64. package/dist/cli/commands/quickstart-expanded.e2e.test.d.ts +23 -0
  65. package/dist/cli/commands/quickstart-expanded.e2e.test.d.ts.map +1 -0
  66. package/dist/cli/commands/quickstart-expanded.e2e.test.js +179 -0
  67. package/dist/cli/commands/quickstart-expanded.e2e.test.js.map +1 -0
  68. package/dist/cli/commands/quickstart.test.js +40 -2
  69. package/dist/cli/commands/quickstart.test.js.map +1 -1
  70. package/dist/core/agents/suite.test.js +4 -2
  71. package/dist/core/agents/suite.test.js.map +1 -1
  72. package/dist/core/agents/tools.test.js +5 -1
  73. package/dist/core/agents/tools.test.js.map +1 -1
  74. package/dist/index.d.ts +3 -10
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +5 -10
  77. package/dist/index.js.map +1 -1
  78. package/package.json +15 -9
  79. package/sbom.json +2011 -819
  80. package/templates/.github/agents/beth.agent.md +222 -45
  81. package/templates/.github/agents/developer.agent.md +37 -67
  82. package/templates/.github/agents/product-manager.agent.md +15 -57
  83. package/templates/.github/agents/researcher.agent.md +20 -60
  84. package/templates/.github/agents/security-reviewer.agent.md +29 -70
  85. package/templates/.github/agents/tester.agent.md +40 -58
  86. package/templates/.github/agents/ux-designer.agent.md +20 -63
  87. package/templates/.github/copilot-instructions.md +217 -204
  88. package/templates/AGENTS.md +108 -20
  89. package/dist/core/context.d.ts +0 -171
  90. package/dist/core/context.d.ts.map +0 -1
  91. package/dist/core/context.js +0 -353
  92. package/dist/core/context.js.map +0 -1
  93. package/dist/core/context.test.d.ts +0 -8
  94. package/dist/core/context.test.d.ts.map +0 -1
  95. package/dist/core/context.test.js +0 -253
  96. package/dist/core/context.test.js.map +0 -1
  97. package/dist/core/handoffs.d.ts +0 -151
  98. package/dist/core/handoffs.d.ts.map +0 -1
  99. package/dist/core/handoffs.js +0 -220
  100. package/dist/core/handoffs.js.map +0 -1
  101. package/dist/core/handoffs.test.d.ts +0 -8
  102. package/dist/core/handoffs.test.d.ts.map +0 -1
  103. package/dist/core/handoffs.test.js +0 -231
  104. package/dist/core/handoffs.test.js.map +0 -1
  105. package/dist/core/orchestrator.d.ts +0 -246
  106. package/dist/core/orchestrator.d.ts.map +0 -1
  107. package/dist/core/orchestrator.js +0 -514
  108. package/dist/core/orchestrator.js.map +0 -1
  109. package/dist/core/orchestrator.test.d.ts +0 -8
  110. package/dist/core/orchestrator.test.d.ts.map +0 -1
  111. package/dist/core/orchestrator.test.js +0 -517
  112. package/dist/core/orchestrator.test.js.map +0 -1
  113. package/dist/core/router.d.ts +0 -102
  114. package/dist/core/router.d.ts.map +0 -1
  115. package/dist/core/router.js +0 -178
  116. package/dist/core/router.js.map +0 -1
  117. package/dist/core/router.test.d.ts +0 -8
  118. package/dist/core/router.test.d.ts.map +0 -1
  119. package/dist/core/router.test.js +0 -215
  120. package/dist/core/router.test.js.map +0 -1
  121. package/dist/init.test.js +0 -288
  122. package/dist/providers/azure.d.ts +0 -147
  123. package/dist/providers/azure.d.ts.map +0 -1
  124. package/dist/providers/azure.js +0 -491
  125. package/dist/providers/azure.js.map +0 -1
  126. package/dist/providers/azure.test.d.ts +0 -11
  127. package/dist/providers/azure.test.d.ts.map +0 -1
  128. package/dist/providers/azure.test.js +0 -330
  129. package/dist/providers/azure.test.js.map +0 -1
  130. package/dist/providers/config.d.ts +0 -87
  131. package/dist/providers/config.d.ts.map +0 -1
  132. package/dist/providers/config.js +0 -193
  133. package/dist/providers/config.js.map +0 -1
  134. package/dist/providers/config.test.d.ts +0 -7
  135. package/dist/providers/config.test.d.ts.map +0 -1
  136. package/dist/providers/config.test.js +0 -370
  137. package/dist/providers/config.test.js.map +0 -1
  138. package/dist/providers/index.d.ts +0 -18
  139. package/dist/providers/index.d.ts.map +0 -1
  140. package/dist/providers/index.js +0 -14
  141. package/dist/providers/index.js.map +0 -1
  142. package/dist/providers/interface.d.ts +0 -191
  143. package/dist/providers/interface.d.ts.map +0 -1
  144. package/dist/providers/interface.js +0 -94
  145. package/dist/providers/interface.js.map +0 -1
  146. package/dist/providers/retry.d.ts +0 -128
  147. package/dist/providers/retry.d.ts.map +0 -1
  148. package/dist/providers/retry.js +0 -205
  149. package/dist/providers/retry.js.map +0 -1
  150. package/dist/providers/retry.test.d.ts +0 -7
  151. package/dist/providers/retry.test.d.ts.map +0 -1
  152. package/dist/providers/retry.test.js +0 -439
  153. package/dist/providers/retry.test.js.map +0 -1
  154. package/dist/providers/streaming.d.ts +0 -157
  155. package/dist/providers/streaming.d.ts.map +0 -1
  156. package/dist/providers/streaming.js +0 -233
  157. package/dist/providers/streaming.js.map +0 -1
  158. package/dist/providers/streaming.test.d.ts +0 -7
  159. package/dist/providers/streaming.test.d.ts.map +0 -1
  160. package/dist/providers/streaming.test.js +0 -372
  161. package/dist/providers/streaming.test.js.map +0 -1
  162. package/dist/providers/types.d.ts +0 -209
  163. package/dist/providers/types.d.ts.map +0 -1
  164. package/dist/providers/types.js +0 -53
  165. package/dist/providers/types.js.map +0 -1
  166. package/dist/providers/types.test.d.ts +0 -7
  167. package/dist/providers/types.test.d.ts.map +0 -1
  168. package/dist/providers/types.test.js +0 -141
  169. package/dist/providers/types.test.js.map +0 -1
  170. package/dist/tools/cli/beads.d.ts +0 -27
  171. package/dist/tools/cli/beads.d.ts.map +0 -1
  172. package/dist/tools/cli/beads.js +0 -172
  173. package/dist/tools/cli/beads.js.map +0 -1
  174. package/dist/tools/cli/beads.test.d.ts +0 -8
  175. package/dist/tools/cli/beads.test.d.ts.map +0 -1
  176. package/dist/tools/cli/beads.test.js +0 -264
  177. package/dist/tools/cli/beads.test.js.map +0 -1
  178. package/dist/tools/cli/editFile.d.ts +0 -17
  179. package/dist/tools/cli/editFile.d.ts.map +0 -1
  180. package/dist/tools/cli/editFile.js +0 -125
  181. package/dist/tools/cli/editFile.js.map +0 -1
  182. package/dist/tools/cli/editFile.test.d.ts +0 -8
  183. package/dist/tools/cli/editFile.test.d.ts.map +0 -1
  184. package/dist/tools/cli/editFile.test.js +0 -177
  185. package/dist/tools/cli/editFile.test.js.map +0 -1
  186. package/dist/tools/cli/readFile.d.ts +0 -25
  187. package/dist/tools/cli/readFile.d.ts.map +0 -1
  188. package/dist/tools/cli/readFile.js +0 -118
  189. package/dist/tools/cli/readFile.js.map +0 -1
  190. package/dist/tools/cli/readFile.test.d.ts +0 -8
  191. package/dist/tools/cli/readFile.test.d.ts.map +0 -1
  192. package/dist/tools/cli/readFile.test.js +0 -194
  193. package/dist/tools/cli/readFile.test.js.map +0 -1
  194. package/dist/tools/cli/search.d.ts +0 -16
  195. package/dist/tools/cli/search.d.ts.map +0 -1
  196. package/dist/tools/cli/search.js +0 -261
  197. package/dist/tools/cli/search.js.map +0 -1
  198. package/dist/tools/cli/search.test.d.ts +0 -8
  199. package/dist/tools/cli/search.test.d.ts.map +0 -1
  200. package/dist/tools/cli/search.test.js +0 -172
  201. package/dist/tools/cli/search.test.js.map +0 -1
  202. package/dist/tools/cli/subagent.d.ts +0 -43
  203. package/dist/tools/cli/subagent.d.ts.map +0 -1
  204. package/dist/tools/cli/subagent.js +0 -99
  205. package/dist/tools/cli/subagent.js.map +0 -1
  206. package/dist/tools/cli/subagent.test.d.ts +0 -8
  207. package/dist/tools/cli/subagent.test.d.ts.map +0 -1
  208. package/dist/tools/cli/subagent.test.js +0 -190
  209. package/dist/tools/cli/subagent.test.js.map +0 -1
  210. package/dist/tools/cli/terminal.d.ts +0 -19
  211. package/dist/tools/cli/terminal.d.ts.map +0 -1
  212. package/dist/tools/cli/terminal.js +0 -164
  213. package/dist/tools/cli/terminal.js.map +0 -1
  214. package/dist/tools/cli/terminal.test.d.ts +0 -8
  215. package/dist/tools/cli/terminal.test.d.ts.map +0 -1
  216. package/dist/tools/cli/terminal.test.js +0 -161
  217. package/dist/tools/cli/terminal.test.js.map +0 -1
  218. package/dist/tools/index.d.ts +0 -25
  219. package/dist/tools/index.d.ts.map +0 -1
  220. package/dist/tools/index.js +0 -41
  221. package/dist/tools/index.js.map +0 -1
  222. package/dist/tools/interface.d.ts +0 -64
  223. package/dist/tools/interface.d.ts.map +0 -1
  224. package/dist/tools/interface.js +0 -37
  225. package/dist/tools/interface.js.map +0 -1
  226. package/dist/tools/interface.test.d.ts +0 -7
  227. package/dist/tools/interface.test.d.ts.map +0 -1
  228. package/dist/tools/interface.test.js +0 -179
  229. package/dist/tools/interface.test.js.map +0 -1
  230. package/dist/tools/mcp/bridge.d.ts +0 -48
  231. package/dist/tools/mcp/bridge.d.ts.map +0 -1
  232. package/dist/tools/mcp/bridge.js +0 -128
  233. package/dist/tools/mcp/bridge.js.map +0 -1
  234. package/dist/tools/mcp/bridge.test.d.ts +0 -8
  235. package/dist/tools/mcp/bridge.test.d.ts.map +0 -1
  236. package/dist/tools/mcp/bridge.test.js +0 -300
  237. package/dist/tools/mcp/bridge.test.js.map +0 -1
  238. package/dist/tools/mcp/client.d.ts +0 -135
  239. package/dist/tools/mcp/client.d.ts.map +0 -1
  240. package/dist/tools/mcp/client.js +0 -263
  241. package/dist/tools/mcp/client.js.map +0 -1
  242. package/dist/tools/mcp/client.test.d.ts +0 -8
  243. package/dist/tools/mcp/client.test.d.ts.map +0 -1
  244. package/dist/tools/mcp/client.test.js +0 -390
  245. package/dist/tools/mcp/client.test.js.map +0 -1
  246. package/dist/tools/registry.d.ts +0 -82
  247. package/dist/tools/registry.d.ts.map +0 -1
  248. package/dist/tools/registry.js +0 -99
  249. package/dist/tools/registry.js.map +0 -1
  250. package/dist/tools/registry.test.d.ts +0 -7
  251. package/dist/tools/registry.test.d.ts.map +0 -1
  252. package/dist/tools/registry.test.js +0 -199
  253. package/dist/tools/registry.test.js.map +0 -1
  254. package/dist/tools/suite.test.d.ts +0 -11
  255. package/dist/tools/suite.test.d.ts.map +0 -1
  256. package/dist/tools/suite.test.js +0 -119
  257. package/dist/tools/suite.test.js.map +0 -1
  258. package/dist/tools/types.d.ts +0 -75
  259. package/dist/tools/types.d.ts.map +0 -1
  260. package/dist/tools/types.js +0 -30
  261. package/dist/tools/types.js.map +0 -1
  262. package/dist/tools/types.test.d.ts +0 -7
  263. package/dist/tools/types.test.d.ts.map +0 -1
  264. package/dist/tools/types.test.js +0 -178
  265. package/dist/tools/types.test.js.map +0 -1
@@ -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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"}