beth-copilot 1.0.18 → 2.0.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 (429) hide show
  1. package/CHANGELOG.md +79 -28
  2. package/README.md +127 -298
  3. package/assets/beth-questioning.png +0 -0
  4. package/assets/yellowstone-beth.png +0 -0
  5. package/bin/cli.js +124 -715
  6. package/dist/__tests__/inject-skills.test.d.ts +9 -0
  7. package/dist/__tests__/inject-skills.test.d.ts.map +1 -0
  8. package/dist/__tests__/inject-skills.test.js +143 -0
  9. package/dist/__tests__/inject-skills.test.js.map +1 -0
  10. package/dist/__tests__/skills/disambiguation.test.d.ts +10 -0
  11. package/dist/__tests__/skills/disambiguation.test.d.ts.map +1 -0
  12. package/dist/__tests__/skills/disambiguation.test.js +192 -0
  13. package/dist/__tests__/skills/disambiguation.test.js.map +1 -0
  14. package/dist/__tests__/skills/hook-injection.test.d.ts +11 -0
  15. package/dist/__tests__/skills/hook-injection.test.d.ts.map +1 -0
  16. package/dist/__tests__/skills/hook-injection.test.js +173 -0
  17. package/dist/__tests__/skills/hook-injection.test.js.map +1 -0
  18. package/dist/__tests__/skills/mapping-completeness.test.d.ts +17 -0
  19. package/dist/__tests__/skills/mapping-completeness.test.d.ts.map +1 -0
  20. package/dist/__tests__/skills/mapping-completeness.test.js +281 -0
  21. package/dist/__tests__/skills/mapping-completeness.test.js.map +1 -0
  22. package/dist/__tests__/skills/pipeline-integration.test.d.ts +18 -0
  23. package/dist/__tests__/skills/pipeline-integration.test.d.ts.map +1 -0
  24. package/dist/__tests__/skills/pipeline-integration.test.js +234 -0
  25. package/dist/__tests__/skills/pipeline-integration.test.js.map +1 -0
  26. package/dist/__tests__/skills/skill-routing.test.d.ts +15 -0
  27. package/dist/__tests__/skills/skill-routing.test.d.ts.map +1 -0
  28. package/dist/__tests__/skills/skill-routing.test.js +723 -0
  29. package/dist/__tests__/skills/skill-routing.test.js.map +1 -0
  30. package/dist/__tests__/skills/trigger-coverage.test.d.ts +24 -0
  31. package/dist/__tests__/skills/trigger-coverage.test.d.ts.map +1 -0
  32. package/dist/__tests__/skills/trigger-coverage.test.js +746 -0
  33. package/dist/__tests__/skills/trigger-coverage.test.js.map +1 -0
  34. package/dist/__tests__/smoke.test.d.ts +8 -0
  35. package/dist/__tests__/smoke.test.d.ts.map +1 -0
  36. package/dist/__tests__/smoke.test.js +62 -0
  37. package/dist/__tests__/smoke.test.js.map +1 -0
  38. package/dist/__tests__/verify-skills.test.d.ts +9 -0
  39. package/dist/__tests__/verify-skills.test.d.ts.map +1 -0
  40. package/dist/__tests__/verify-skills.test.js +78 -0
  41. package/dist/__tests__/verify-skills.test.js.map +1 -0
  42. package/dist/cli/commands/beads.e2e.test.d.ts +15 -0
  43. package/dist/cli/commands/beads.e2e.test.d.ts.map +1 -0
  44. package/dist/cli/commands/beads.e2e.test.js +585 -0
  45. package/dist/cli/commands/beads.e2e.test.js.map +1 -0
  46. package/dist/cli/commands/cli-edge-cases.e2e.test.d.ts +32 -0
  47. package/dist/cli/commands/cli-edge-cases.e2e.test.d.ts.map +1 -0
  48. package/dist/cli/commands/cli-edge-cases.e2e.test.js +162 -0
  49. package/dist/cli/commands/cli-edge-cases.e2e.test.js.map +1 -0
  50. package/dist/cli/commands/close.d.ts +54 -0
  51. package/dist/cli/commands/close.d.ts.map +1 -0
  52. package/dist/cli/commands/close.e2e.test.d.ts +11 -0
  53. package/dist/cli/commands/close.e2e.test.d.ts.map +1 -0
  54. package/dist/cli/commands/close.e2e.test.js +71 -0
  55. package/dist/cli/commands/close.e2e.test.js.map +1 -0
  56. package/dist/cli/commands/close.js +95 -0
  57. package/dist/cli/commands/close.js.map +1 -0
  58. package/dist/cli/commands/close.test.d.ts +13 -0
  59. package/dist/cli/commands/close.test.d.ts.map +1 -0
  60. package/dist/cli/commands/close.test.js +254 -0
  61. package/dist/cli/commands/close.test.js.map +1 -0
  62. package/dist/cli/commands/doctor.d.ts +7 -1
  63. package/dist/cli/commands/doctor.d.ts.map +1 -1
  64. package/dist/cli/commands/doctor.e2e.test.js +3 -59
  65. package/dist/cli/commands/doctor.e2e.test.js.map +1 -1
  66. package/dist/cli/commands/doctor.js +38 -18
  67. package/dist/cli/commands/doctor.js.map +1 -1
  68. package/dist/cli/commands/doctor.test.js +32 -25
  69. package/dist/cli/commands/doctor.test.js.map +1 -1
  70. package/dist/cli/commands/framework-isolation.test.d.ts +30 -0
  71. package/dist/cli/commands/framework-isolation.test.d.ts.map +1 -0
  72. package/dist/cli/commands/framework-isolation.test.js +118 -0
  73. package/dist/cli/commands/framework-isolation.test.js.map +1 -0
  74. package/dist/cli/commands/help.e2e.test.js +5 -9
  75. package/dist/cli/commands/help.e2e.test.js.map +1 -1
  76. package/dist/cli/commands/init-logic.e2e.test.d.ts +37 -0
  77. package/dist/cli/commands/init-logic.e2e.test.d.ts.map +1 -0
  78. package/dist/cli/commands/init-logic.e2e.test.js +315 -0
  79. package/dist/cli/commands/init-logic.e2e.test.js.map +1 -0
  80. package/dist/cli/commands/init.test.js +4 -21
  81. package/dist/cli/commands/init.test.js.map +1 -1
  82. package/dist/cli/commands/land.d.ts +130 -0
  83. package/dist/cli/commands/land.d.ts.map +1 -0
  84. package/dist/cli/commands/land.js +592 -0
  85. package/dist/cli/commands/land.js.map +1 -0
  86. package/dist/cli/commands/land.test.d.ts +19 -0
  87. package/dist/cli/commands/land.test.d.ts.map +1 -0
  88. package/dist/cli/commands/land.test.js +567 -0
  89. package/dist/cli/commands/land.test.js.map +1 -0
  90. package/dist/cli/commands/mcp.e2e.test.js +24 -31
  91. package/dist/cli/commands/mcp.e2e.test.js.map +1 -1
  92. package/dist/cli/commands/pipeline.e2e.test.js +28 -31
  93. package/dist/cli/commands/pipeline.e2e.test.js.map +1 -1
  94. package/dist/cli/commands/pre-push-guard.d.ts +74 -0
  95. package/dist/cli/commands/pre-push-guard.d.ts.map +1 -0
  96. package/dist/cli/commands/pre-push-guard.e2e.test.d.ts +24 -0
  97. package/dist/cli/commands/pre-push-guard.e2e.test.d.ts.map +1 -0
  98. package/dist/cli/commands/pre-push-guard.e2e.test.js +171 -0
  99. package/dist/cli/commands/pre-push-guard.e2e.test.js.map +1 -0
  100. package/dist/cli/commands/pre-push-guard.js +212 -0
  101. package/dist/cli/commands/pre-push-guard.js.map +1 -0
  102. package/dist/cli/commands/pre-push-guard.test.d.ts +14 -0
  103. package/dist/cli/commands/pre-push-guard.test.d.ts.map +1 -0
  104. package/dist/cli/commands/pre-push-guard.test.js +314 -0
  105. package/dist/cli/commands/pre-push-guard.test.js.map +1 -0
  106. package/dist/cli/commands/quickstart-expanded.e2e.test.d.ts +23 -0
  107. package/dist/cli/commands/quickstart-expanded.e2e.test.d.ts.map +1 -0
  108. package/dist/cli/commands/quickstart-expanded.e2e.test.js +152 -0
  109. package/dist/cli/commands/quickstart-expanded.e2e.test.js.map +1 -0
  110. package/dist/cli/commands/quickstart.d.ts +0 -1
  111. package/dist/cli/commands/quickstart.d.ts.map +1 -1
  112. package/dist/cli/commands/quickstart.js +9 -83
  113. package/dist/cli/commands/quickstart.js.map +1 -1
  114. package/dist/cli/commands/quickstart.test.js +8 -129
  115. package/dist/cli/commands/quickstart.test.js.map +1 -1
  116. package/dist/cli/commands/update.d.ts +35 -0
  117. package/dist/cli/commands/update.d.ts.map +1 -0
  118. package/dist/cli/commands/update.e2e.test.d.ts +24 -0
  119. package/dist/cli/commands/update.e2e.test.d.ts.map +1 -0
  120. package/dist/cli/commands/update.e2e.test.js +240 -0
  121. package/dist/cli/commands/update.e2e.test.js.map +1 -0
  122. package/dist/cli/commands/update.js +255 -0
  123. package/dist/cli/commands/update.js.map +1 -0
  124. package/dist/core/agents/frontmatter.test.js +1 -1
  125. package/dist/core/agents/frontmatter.test.js.map +1 -1
  126. package/dist/core/agents/handoffs.test.js +1 -1
  127. package/dist/core/agents/handoffs.test.js.map +1 -1
  128. package/dist/core/agents/loader.d.ts +4 -2
  129. package/dist/core/agents/loader.d.ts.map +1 -1
  130. package/dist/core/agents/loader.js +5 -3
  131. package/dist/core/agents/loader.js.map +1 -1
  132. package/dist/core/agents/loader.test.js +42 -4
  133. package/dist/core/agents/loader.test.js.map +1 -1
  134. package/dist/core/agents/suite.test.js +12 -9
  135. package/dist/core/agents/suite.test.js.map +1 -1
  136. package/dist/core/agents/tools.test.js +15 -9
  137. package/dist/core/agents/tools.test.js.map +1 -1
  138. package/dist/core/agents/types.test.js +1 -1
  139. package/dist/core/agents/types.test.js.map +1 -1
  140. package/dist/core/skills/loader.test.js +1 -1
  141. package/dist/core/skills/loader.test.js.map +1 -1
  142. package/dist/index.d.ts +3 -11
  143. package/dist/index.d.ts.map +1 -1
  144. package/dist/index.js +5 -12
  145. package/dist/index.js.map +1 -1
  146. package/dist/lib/pathValidation.d.ts +0 -5
  147. package/dist/lib/pathValidation.d.ts.map +1 -1
  148. package/dist/lib/pathValidation.js +0 -11
  149. package/dist/lib/pathValidation.js.map +1 -1
  150. package/dist/lib/pathValidation.test.js +2 -14
  151. package/dist/lib/pathValidation.test.js.map +1 -1
  152. package/package.json +13 -10
  153. package/sbom.json +1927 -847
  154. package/templates/.github/agents/beth.agent.md +331 -105
  155. package/templates/.github/agents/developer.agent.md +73 -102
  156. package/templates/.github/agents/product-manager.agent.md +24 -68
  157. package/templates/.github/agents/researcher.agent.md +21 -69
  158. package/templates/.github/agents/security-reviewer.agent.md +39 -82
  159. package/templates/.github/agents/tester.agent.md +44 -65
  160. package/templates/.github/agents/ux-designer.agent.md +25 -76
  161. package/templates/.github/copilot-instructions.md +246 -225
  162. package/templates/.github/copilot-mcp-config.json +12 -0
  163. package/templates/.github/dependabot.yml +68 -0
  164. package/templates/.github/hooks/scripts/inject-skills.mjs +139 -0
  165. package/templates/.github/hooks/scripts/verify-skills.mjs +47 -0
  166. package/templates/.github/hooks/skill-enforcement.json +18 -0
  167. package/templates/.github/pull_request_template.md +48 -0
  168. package/templates/.github/skills/framer-components/SKILL.md +0 -0
  169. package/templates/.github/skills/prd/SKILL.md +0 -0
  170. package/templates/.github/skills/security-analysis/SKILL.md +798 -798
  171. package/templates/.github/skills/shadcn-ui/SKILL.md +561 -561
  172. package/templates/.github/skills/vercel-react-best-practices/AGENTS.md +0 -0
  173. package/templates/.github/skills/vercel-react-best-practices/SKILL.md +0 -0
  174. package/templates/.github/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +0 -0
  175. package/templates/.github/skills/vercel-react-best-practices/rules/advanced-use-latest.md +0 -0
  176. package/templates/.github/skills/vercel-react-best-practices/rules/async-api-routes.md +0 -0
  177. package/templates/.github/skills/vercel-react-best-practices/rules/async-defer-await.md +0 -0
  178. package/templates/.github/skills/vercel-react-best-practices/rules/async-dependencies.md +0 -0
  179. package/templates/.github/skills/vercel-react-best-practices/rules/async-parallel.md +0 -0
  180. package/templates/.github/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +0 -0
  181. package/templates/.github/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +0 -0
  182. package/templates/.github/skills/vercel-react-best-practices/rules/bundle-conditional.md +0 -0
  183. package/templates/.github/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +0 -0
  184. package/templates/.github/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +0 -0
  185. package/templates/.github/skills/vercel-react-best-practices/rules/bundle-preload.md +0 -0
  186. package/templates/.github/skills/vercel-react-best-practices/rules/client-event-listeners.md +0 -0
  187. package/templates/.github/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +0 -0
  188. package/templates/.github/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +0 -0
  189. package/templates/.github/skills/vercel-react-best-practices/rules/client-swr-dedup.md +0 -0
  190. package/templates/.github/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +0 -0
  191. package/templates/.github/skills/vercel-react-best-practices/rules/js-cache-function-results.md +0 -0
  192. package/templates/.github/skills/vercel-react-best-practices/rules/js-cache-property-access.md +0 -0
  193. package/templates/.github/skills/vercel-react-best-practices/rules/js-cache-storage.md +0 -0
  194. package/templates/.github/skills/vercel-react-best-practices/rules/js-combine-iterations.md +0 -0
  195. package/templates/.github/skills/vercel-react-best-practices/rules/js-early-exit.md +0 -0
  196. package/templates/.github/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +0 -0
  197. package/templates/.github/skills/vercel-react-best-practices/rules/js-index-maps.md +0 -0
  198. package/templates/.github/skills/vercel-react-best-practices/rules/js-length-check-first.md +0 -0
  199. package/templates/.github/skills/vercel-react-best-practices/rules/js-min-max-loop.md +0 -0
  200. package/templates/.github/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +0 -0
  201. package/templates/.github/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +0 -0
  202. package/templates/.github/skills/vercel-react-best-practices/rules/rendering-activity.md +0 -0
  203. package/templates/.github/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -0
  204. package/templates/.github/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +0 -0
  205. package/templates/.github/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +0 -0
  206. package/templates/.github/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +0 -0
  207. package/templates/.github/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +0 -0
  208. package/templates/.github/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +0 -0
  209. package/templates/.github/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +0 -0
  210. package/templates/.github/skills/vercel-react-best-practices/rules/rerender-dependencies.md +0 -0
  211. package/templates/.github/skills/vercel-react-best-practices/rules/rerender-derived-state.md +0 -0
  212. package/templates/.github/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +0 -0
  213. package/templates/.github/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +0 -0
  214. package/templates/.github/skills/vercel-react-best-practices/rules/rerender-memo.md +0 -0
  215. package/templates/.github/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +0 -0
  216. package/templates/.github/skills/vercel-react-best-practices/rules/rerender-transitions.md +0 -0
  217. package/templates/.github/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +0 -0
  218. package/templates/.github/skills/vercel-react-best-practices/rules/server-auth-actions.md +0 -0
  219. package/templates/.github/skills/vercel-react-best-practices/rules/server-cache-lru.md +0 -0
  220. package/templates/.github/skills/vercel-react-best-practices/rules/server-cache-react.md +0 -0
  221. package/templates/.github/skills/vercel-react-best-practices/rules/server-dedup-props.md +0 -0
  222. package/templates/.github/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +0 -0
  223. package/templates/.github/skills/vercel-react-best-practices/rules/server-serialization.md +0 -0
  224. package/templates/.github/skills/web-design-guidelines/SKILL.md +0 -0
  225. package/templates/.vscode/settings.json +16 -16
  226. package/templates/AGENTS.md +103 -54
  227. package/templates/Backlog.md +80 -80
  228. package/templates/mcp.json.example +0 -3
  229. package/assets/beth-portrait-small.txt +0 -13
  230. package/assets/beth-portrait.txt +0 -60
  231. package/bin/beth-animation.sh +0 -155
  232. package/bin/lib/animation.js +0 -189
  233. package/bin/lib/pathValidation.js +0 -233
  234. package/bin/lib/pathValidation.test.js +0 -280
  235. package/dist/cli/commands/client-config.d.ts +0 -31
  236. package/dist/cli/commands/client-config.d.ts.map +0 -1
  237. package/dist/cli/commands/client-config.e2e.test.d.ts +0 -15
  238. package/dist/cli/commands/client-config.e2e.test.d.ts.map +0 -1
  239. package/dist/cli/commands/client-config.e2e.test.js +0 -556
  240. package/dist/cli/commands/client-config.e2e.test.js.map +0 -1
  241. package/dist/cli/commands/client-config.js +0 -73
  242. package/dist/cli/commands/client-config.js.map +0 -1
  243. package/dist/cli/commands/client-config.test.d.ts +0 -6
  244. package/dist/cli/commands/client-config.test.d.ts.map +0 -1
  245. package/dist/cli/commands/client-config.test.js +0 -133
  246. package/dist/cli/commands/client-config.test.js.map +0 -1
  247. package/dist/cli/commands/init-quickstart.e2e.test.d.ts +0 -11
  248. package/dist/cli/commands/init-quickstart.e2e.test.d.ts.map +0 -1
  249. package/dist/cli/commands/init-quickstart.e2e.test.js +0 -221
  250. package/dist/cli/commands/init-quickstart.e2e.test.js.map +0 -1
  251. package/dist/core/context.d.ts +0 -171
  252. package/dist/core/context.d.ts.map +0 -1
  253. package/dist/core/context.js +0 -353
  254. package/dist/core/context.js.map +0 -1
  255. package/dist/core/context.test.d.ts +0 -8
  256. package/dist/core/context.test.d.ts.map +0 -1
  257. package/dist/core/context.test.js +0 -253
  258. package/dist/core/context.test.js.map +0 -1
  259. package/dist/core/handoffs.d.ts +0 -151
  260. package/dist/core/handoffs.d.ts.map +0 -1
  261. package/dist/core/handoffs.js +0 -220
  262. package/dist/core/handoffs.js.map +0 -1
  263. package/dist/core/handoffs.test.d.ts +0 -8
  264. package/dist/core/handoffs.test.d.ts.map +0 -1
  265. package/dist/core/handoffs.test.js +0 -231
  266. package/dist/core/handoffs.test.js.map +0 -1
  267. package/dist/core/orchestrator.d.ts +0 -246
  268. package/dist/core/orchestrator.d.ts.map +0 -1
  269. package/dist/core/orchestrator.js +0 -514
  270. package/dist/core/orchestrator.js.map +0 -1
  271. package/dist/core/orchestrator.test.d.ts +0 -8
  272. package/dist/core/orchestrator.test.d.ts.map +0 -1
  273. package/dist/core/orchestrator.test.js +0 -517
  274. package/dist/core/orchestrator.test.js.map +0 -1
  275. package/dist/core/router.d.ts +0 -102
  276. package/dist/core/router.d.ts.map +0 -1
  277. package/dist/core/router.js +0 -178
  278. package/dist/core/router.js.map +0 -1
  279. package/dist/core/router.test.d.ts +0 -8
  280. package/dist/core/router.test.d.ts.map +0 -1
  281. package/dist/core/router.test.js +0 -215
  282. package/dist/core/router.test.js.map +0 -1
  283. package/dist/init.test.js +0 -288
  284. package/dist/providers/azure.d.ts +0 -147
  285. package/dist/providers/azure.d.ts.map +0 -1
  286. package/dist/providers/azure.js +0 -491
  287. package/dist/providers/azure.js.map +0 -1
  288. package/dist/providers/azure.test.d.ts +0 -11
  289. package/dist/providers/azure.test.d.ts.map +0 -1
  290. package/dist/providers/azure.test.js +0 -330
  291. package/dist/providers/azure.test.js.map +0 -1
  292. package/dist/providers/config.d.ts +0 -87
  293. package/dist/providers/config.d.ts.map +0 -1
  294. package/dist/providers/config.js +0 -193
  295. package/dist/providers/config.js.map +0 -1
  296. package/dist/providers/config.test.d.ts +0 -7
  297. package/dist/providers/config.test.d.ts.map +0 -1
  298. package/dist/providers/config.test.js +0 -370
  299. package/dist/providers/config.test.js.map +0 -1
  300. package/dist/providers/index.d.ts +0 -18
  301. package/dist/providers/index.d.ts.map +0 -1
  302. package/dist/providers/index.js +0 -14
  303. package/dist/providers/index.js.map +0 -1
  304. package/dist/providers/interface.d.ts +0 -191
  305. package/dist/providers/interface.d.ts.map +0 -1
  306. package/dist/providers/interface.js +0 -94
  307. package/dist/providers/interface.js.map +0 -1
  308. package/dist/providers/retry.d.ts +0 -128
  309. package/dist/providers/retry.d.ts.map +0 -1
  310. package/dist/providers/retry.js +0 -205
  311. package/dist/providers/retry.js.map +0 -1
  312. package/dist/providers/retry.test.d.ts +0 -7
  313. package/dist/providers/retry.test.d.ts.map +0 -1
  314. package/dist/providers/retry.test.js +0 -439
  315. package/dist/providers/retry.test.js.map +0 -1
  316. package/dist/providers/streaming.d.ts +0 -157
  317. package/dist/providers/streaming.d.ts.map +0 -1
  318. package/dist/providers/streaming.js +0 -233
  319. package/dist/providers/streaming.js.map +0 -1
  320. package/dist/providers/streaming.test.d.ts +0 -7
  321. package/dist/providers/streaming.test.d.ts.map +0 -1
  322. package/dist/providers/streaming.test.js +0 -372
  323. package/dist/providers/streaming.test.js.map +0 -1
  324. package/dist/providers/types.d.ts +0 -209
  325. package/dist/providers/types.d.ts.map +0 -1
  326. package/dist/providers/types.js +0 -53
  327. package/dist/providers/types.js.map +0 -1
  328. package/dist/providers/types.test.d.ts +0 -7
  329. package/dist/providers/types.test.d.ts.map +0 -1
  330. package/dist/providers/types.test.js +0 -141
  331. package/dist/providers/types.test.js.map +0 -1
  332. package/dist/tools/cli/beads.d.ts +0 -27
  333. package/dist/tools/cli/beads.d.ts.map +0 -1
  334. package/dist/tools/cli/beads.js +0 -172
  335. package/dist/tools/cli/beads.js.map +0 -1
  336. package/dist/tools/cli/beads.test.d.ts +0 -8
  337. package/dist/tools/cli/beads.test.d.ts.map +0 -1
  338. package/dist/tools/cli/beads.test.js +0 -264
  339. package/dist/tools/cli/beads.test.js.map +0 -1
  340. package/dist/tools/cli/editFile.d.ts +0 -17
  341. package/dist/tools/cli/editFile.d.ts.map +0 -1
  342. package/dist/tools/cli/editFile.js +0 -125
  343. package/dist/tools/cli/editFile.js.map +0 -1
  344. package/dist/tools/cli/editFile.test.d.ts +0 -8
  345. package/dist/tools/cli/editFile.test.d.ts.map +0 -1
  346. package/dist/tools/cli/editFile.test.js +0 -177
  347. package/dist/tools/cli/editFile.test.js.map +0 -1
  348. package/dist/tools/cli/readFile.d.ts +0 -25
  349. package/dist/tools/cli/readFile.d.ts.map +0 -1
  350. package/dist/tools/cli/readFile.js +0 -118
  351. package/dist/tools/cli/readFile.js.map +0 -1
  352. package/dist/tools/cli/readFile.test.d.ts +0 -8
  353. package/dist/tools/cli/readFile.test.d.ts.map +0 -1
  354. package/dist/tools/cli/readFile.test.js +0 -194
  355. package/dist/tools/cli/readFile.test.js.map +0 -1
  356. package/dist/tools/cli/search.d.ts +0 -16
  357. package/dist/tools/cli/search.d.ts.map +0 -1
  358. package/dist/tools/cli/search.js +0 -261
  359. package/dist/tools/cli/search.js.map +0 -1
  360. package/dist/tools/cli/search.test.d.ts +0 -8
  361. package/dist/tools/cli/search.test.d.ts.map +0 -1
  362. package/dist/tools/cli/search.test.js +0 -172
  363. package/dist/tools/cli/search.test.js.map +0 -1
  364. package/dist/tools/cli/subagent.d.ts +0 -43
  365. package/dist/tools/cli/subagent.d.ts.map +0 -1
  366. package/dist/tools/cli/subagent.js +0 -99
  367. package/dist/tools/cli/subagent.js.map +0 -1
  368. package/dist/tools/cli/subagent.test.d.ts +0 -8
  369. package/dist/tools/cli/subagent.test.d.ts.map +0 -1
  370. package/dist/tools/cli/subagent.test.js +0 -190
  371. package/dist/tools/cli/subagent.test.js.map +0 -1
  372. package/dist/tools/cli/terminal.d.ts +0 -19
  373. package/dist/tools/cli/terminal.d.ts.map +0 -1
  374. package/dist/tools/cli/terminal.js +0 -164
  375. package/dist/tools/cli/terminal.js.map +0 -1
  376. package/dist/tools/cli/terminal.test.d.ts +0 -8
  377. package/dist/tools/cli/terminal.test.d.ts.map +0 -1
  378. package/dist/tools/cli/terminal.test.js +0 -161
  379. package/dist/tools/cli/terminal.test.js.map +0 -1
  380. package/dist/tools/index.d.ts +0 -25
  381. package/dist/tools/index.d.ts.map +0 -1
  382. package/dist/tools/index.js +0 -41
  383. package/dist/tools/index.js.map +0 -1
  384. package/dist/tools/interface.d.ts +0 -64
  385. package/dist/tools/interface.d.ts.map +0 -1
  386. package/dist/tools/interface.js +0 -37
  387. package/dist/tools/interface.js.map +0 -1
  388. package/dist/tools/interface.test.d.ts +0 -7
  389. package/dist/tools/interface.test.d.ts.map +0 -1
  390. package/dist/tools/interface.test.js +0 -179
  391. package/dist/tools/interface.test.js.map +0 -1
  392. package/dist/tools/mcp/bridge.d.ts +0 -48
  393. package/dist/tools/mcp/bridge.d.ts.map +0 -1
  394. package/dist/tools/mcp/bridge.js +0 -128
  395. package/dist/tools/mcp/bridge.js.map +0 -1
  396. package/dist/tools/mcp/bridge.test.d.ts +0 -8
  397. package/dist/tools/mcp/bridge.test.d.ts.map +0 -1
  398. package/dist/tools/mcp/bridge.test.js +0 -300
  399. package/dist/tools/mcp/bridge.test.js.map +0 -1
  400. package/dist/tools/mcp/client.d.ts +0 -135
  401. package/dist/tools/mcp/client.d.ts.map +0 -1
  402. package/dist/tools/mcp/client.js +0 -263
  403. package/dist/tools/mcp/client.js.map +0 -1
  404. package/dist/tools/mcp/client.test.d.ts +0 -8
  405. package/dist/tools/mcp/client.test.d.ts.map +0 -1
  406. package/dist/tools/mcp/client.test.js +0 -390
  407. package/dist/tools/mcp/client.test.js.map +0 -1
  408. package/dist/tools/registry.d.ts +0 -82
  409. package/dist/tools/registry.d.ts.map +0 -1
  410. package/dist/tools/registry.js +0 -99
  411. package/dist/tools/registry.js.map +0 -1
  412. package/dist/tools/registry.test.d.ts +0 -7
  413. package/dist/tools/registry.test.d.ts.map +0 -1
  414. package/dist/tools/registry.test.js +0 -199
  415. package/dist/tools/registry.test.js.map +0 -1
  416. package/dist/tools/suite.test.d.ts +0 -11
  417. package/dist/tools/suite.test.d.ts.map +0 -1
  418. package/dist/tools/suite.test.js +0 -119
  419. package/dist/tools/suite.test.js.map +0 -1
  420. package/dist/tools/types.d.ts +0 -75
  421. package/dist/tools/types.d.ts.map +0 -1
  422. package/dist/tools/types.js +0 -30
  423. package/dist/tools/types.js.map +0 -1
  424. package/dist/tools/types.test.d.ts +0 -7
  425. package/dist/tools/types.test.d.ts.map +0 -1
  426. package/dist/tools/types.test.js +0 -178
  427. package/dist/tools/types.test.js.map +0 -1
  428. package/templates/.vscode/mcp.json +0 -20
  429. package/templates/CLAUDE.md +0 -129
@@ -1,253 +0,0 @@
1
- /**
2
- * ConversationContext Tests
3
- *
4
- * Tests for conversation state management, message handling,
5
- * context window enforcement, skill injection, and handoff summaries.
6
- */
7
- import { describe, it } from 'node:test';
8
- import assert from 'node:assert';
9
- import { ConversationContext } from './context.js';
10
- // =============================================================================
11
- // Test Fixtures
12
- // =============================================================================
13
- function createTestAgent(overrides) {
14
- return {
15
- id: 'test-agent',
16
- frontmatter: {
17
- name: 'Test Agent',
18
- description: 'A test agent',
19
- tools: ['readFile', 'editFiles'],
20
- },
21
- body: '# Test Agent\n\nYou are a helpful test agent.',
22
- sourcePath: '/test/test-agent.agent.md',
23
- ...overrides,
24
- };
25
- }
26
- function createTestSkill(id, name, body) {
27
- return {
28
- id,
29
- frontmatter: { name },
30
- body,
31
- sourcePath: `/test/skills/${id}/SKILL.md`,
32
- triggers: [`${id} trigger`],
33
- };
34
- }
35
- // =============================================================================
36
- // Tests
37
- // =============================================================================
38
- describe('ConversationContext', () => {
39
- describe('Construction', () => {
40
- it('should create with default options', () => {
41
- const agent = createTestAgent();
42
- const ctx = new ConversationContext(agent);
43
- assert.strictEqual(ctx.getTurnCount(), 0);
44
- assert.strictEqual(ctx.getRawMessages().length, 0);
45
- assert.deepStrictEqual(ctx.getInjectedSkillIds(), []);
46
- });
47
- it('should create with initial messages', () => {
48
- const agent = createTestAgent();
49
- const initial = [
50
- { role: 'user', content: 'Hello' },
51
- { role: 'assistant', content: 'Hi there' },
52
- ];
53
- const ctx = new ConversationContext(agent, { initialMessages: initial });
54
- assert.strictEqual(ctx.getRawMessages().length, 2);
55
- assert.strictEqual(ctx.getTurnCount(), 1);
56
- });
57
- it('should store the agent definition', () => {
58
- const agent = createTestAgent({ id: 'my-agent' });
59
- const ctx = new ConversationContext(agent);
60
- assert.strictEqual(ctx.getAgent().id, 'my-agent');
61
- });
62
- });
63
- describe('Message Management', () => {
64
- it('should add user messages', () => {
65
- const ctx = new ConversationContext(createTestAgent());
66
- ctx.addUserMessage('Hello');
67
- ctx.addUserMessage('How are you?');
68
- assert.strictEqual(ctx.getTurnCount(), 2);
69
- assert.strictEqual(ctx.getRawMessages().length, 2);
70
- assert.strictEqual(ctx.getRawMessages()[0].role, 'user');
71
- assert.strictEqual(ctx.getRawMessages()[0].content, 'Hello');
72
- });
73
- it('should add assistant messages', () => {
74
- const ctx = new ConversationContext(createTestAgent());
75
- ctx.addUserMessage('Hello');
76
- ctx.addAssistantMessage('Hi there');
77
- const msgs = ctx.getRawMessages();
78
- assert.strictEqual(msgs.length, 2);
79
- assert.strictEqual(msgs[1].role, 'assistant');
80
- assert.strictEqual(msgs[1].content, 'Hi there');
81
- });
82
- it('should add assistant tool calls', () => {
83
- const ctx = new ConversationContext(createTestAgent());
84
- ctx.addUserMessage('Read my file');
85
- ctx.addAssistantToolCalls([{ id: 'tc1', type: 'function', function: { name: 'readFile', arguments: '{"path":"test.ts"}' } }], 'Let me read that file.');
86
- const msgs = ctx.getRawMessages();
87
- assert.strictEqual(msgs.length, 2);
88
- assert.strictEqual(msgs[1].role, 'assistant');
89
- assert.strictEqual(msgs[1].tool_calls?.length, 1);
90
- assert.strictEqual(msgs[1].tool_calls[0].function.name, 'readFile');
91
- assert.strictEqual(msgs[1].content, 'Let me read that file.');
92
- });
93
- it('should add tool results', () => {
94
- const ctx = new ConversationContext(createTestAgent());
95
- ctx.addUserMessage('Read my file');
96
- ctx.addAssistantToolCalls([{ id: 'tc1', type: 'function', function: { name: 'readFile', arguments: '{}' } }]);
97
- ctx.addToolResult('tc1', 'File contents here');
98
- const msgs = ctx.getRawMessages();
99
- assert.strictEqual(msgs.length, 3);
100
- assert.strictEqual(msgs[2].role, 'tool');
101
- assert.strictEqual(msgs[2].tool_call_id, 'tc1');
102
- assert.strictEqual(msgs[2].content, 'File contents here');
103
- });
104
- it('should clear history', () => {
105
- const ctx = new ConversationContext(createTestAgent());
106
- ctx.addUserMessage('Hello');
107
- ctx.addAssistantMessage('Hi');
108
- ctx.clearHistory();
109
- assert.strictEqual(ctx.getTurnCount(), 0);
110
- assert.strictEqual(ctx.getRawMessages().length, 0);
111
- });
112
- });
113
- describe('System Prompt Construction', () => {
114
- it('should include agent body in system prompt', () => {
115
- const agent = createTestAgent({ body: '# My Agent\n\nSpecial instructions.' });
116
- const ctx = new ConversationContext(agent);
117
- const prompt = ctx.buildSystemPrompt();
118
- assert.ok(prompt.includes('# My Agent'));
119
- assert.ok(prompt.includes('Special instructions.'));
120
- });
121
- it('should include additional context in system prompt', () => {
122
- const ctx = new ConversationContext(createTestAgent());
123
- ctx.addContext('Previous agent completed the design phase.');
124
- const prompt = ctx.buildSystemPrompt();
125
- assert.ok(prompt.includes('Additional Context'));
126
- assert.ok(prompt.includes('Previous agent completed the design phase.'));
127
- });
128
- it('should include injected skills in system prompt', () => {
129
- const ctx = new ConversationContext(createTestAgent());
130
- const skill = createTestSkill('prd', 'PRD Generation', 'Generate product requirements.');
131
- ctx.injectSkill(skill);
132
- const prompt = ctx.buildSystemPrompt();
133
- assert.ok(prompt.includes('Skill: PRD Generation'));
134
- assert.ok(prompt.includes('Generate product requirements.'));
135
- });
136
- it('getMessages should prepend system prompt', () => {
137
- const ctx = new ConversationContext(createTestAgent());
138
- ctx.addUserMessage('Hello');
139
- const msgs = ctx.getMessages();
140
- assert.strictEqual(msgs.length, 2);
141
- assert.strictEqual(msgs[0].role, 'system');
142
- assert.ok(msgs[0].content.includes('Test Agent'));
143
- assert.strictEqual(msgs[1].role, 'user');
144
- });
145
- });
146
- describe('Skill Injection', () => {
147
- it('should inject a skill once', () => {
148
- const ctx = new ConversationContext(createTestAgent());
149
- const skill = createTestSkill('prd', 'PRD', 'PRD content');
150
- const first = ctx.injectSkill(skill);
151
- const second = ctx.injectSkill(skill);
152
- assert.strictEqual(first, true);
153
- assert.strictEqual(second, false);
154
- });
155
- it('should track injected skill IDs', () => {
156
- const ctx = new ConversationContext(createTestAgent());
157
- ctx.injectSkill(createTestSkill('prd', 'PRD', 'content'));
158
- ctx.injectSkill(createTestSkill('shadcn', 'shadcn', 'content'));
159
- const ids = ctx.getInjectedSkillIds();
160
- assert.deepStrictEqual(ids.sort(), ['prd', 'shadcn']);
161
- });
162
- it('should check if a skill is injected', () => {
163
- const ctx = new ConversationContext(createTestAgent());
164
- ctx.injectSkill(createTestSkill('prd', 'PRD', 'content'));
165
- assert.strictEqual(ctx.hasSkill('prd'), true);
166
- assert.strictEqual(ctx.hasSkill('other'), false);
167
- });
168
- });
169
- describe('Token Estimation', () => {
170
- it('should estimate tokens for context', () => {
171
- const ctx = new ConversationContext(createTestAgent());
172
- ctx.addUserMessage('Hello world');
173
- const tokens = ctx.getEstimatedTokens();
174
- assert.ok(tokens > 0);
175
- });
176
- it('should increase count with more messages', () => {
177
- const ctx = new ConversationContext(createTestAgent());
178
- ctx.addUserMessage('Hello');
179
- const tokensSmall = ctx.getEstimatedTokens();
180
- ctx.addAssistantMessage('I am a very helpful assistant with a lot to say about this topic.');
181
- ctx.addUserMessage('Tell me more about something else.');
182
- const tokensLarge = ctx.getEstimatedTokens();
183
- assert.ok(tokensLarge > tokensSmall);
184
- });
185
- });
186
- describe('Context Window Truncation', () => {
187
- it('should truncate old messages when exceeding context window', () => {
188
- const agent = createTestAgent({ body: 'Short prompt.' });
189
- const ctx = new ConversationContext(agent, {
190
- maxTokens: 200, // Very small context window
191
- responseReserve: 50,
192
- });
193
- // Add many messages
194
- for (let i = 0; i < 20; i++) {
195
- ctx.addUserMessage(`Message number ${i} with some extra content to fill tokens.`);
196
- ctx.addAssistantMessage(`Response number ${i} with some extra content as well.`);
197
- }
198
- const msgs = ctx.getMessages();
199
- // Should be truncated — fewer messages than what we added
200
- assert.ok(msgs.length < 41); // 40 user+assistant + 1 system
201
- assert.strictEqual(msgs[0].role, 'system');
202
- });
203
- it('should return all messages when within context window', () => {
204
- const ctx = new ConversationContext(createTestAgent());
205
- ctx.addUserMessage('Hello');
206
- ctx.addAssistantMessage('Hi');
207
- const msgs = ctx.getMessages();
208
- assert.strictEqual(msgs.length, 3); // system + user + assistant
209
- });
210
- });
211
- describe('Tool Call Consistency Repair', () => {
212
- it('should handle normal tool call flow without issues', () => {
213
- const ctx = new ConversationContext(createTestAgent());
214
- ctx.addUserMessage('Read file');
215
- ctx.addAssistantToolCalls([{ id: 'tc1', type: 'function', function: { name: 'readFile', arguments: '{}' } }]);
216
- ctx.addToolResult('tc1', 'file contents');
217
- ctx.addAssistantMessage('Here are the contents.');
218
- const msgs = ctx.getMessages();
219
- // system + user + assistant(tool_calls) + tool + assistant
220
- assert.strictEqual(msgs.length, 5);
221
- });
222
- });
223
- describe('Conversation Summary', () => {
224
- it('should generate a summary', () => {
225
- const ctx = new ConversationContext(createTestAgent({ id: 'developer' }));
226
- ctx.addUserMessage('Implement login');
227
- ctx.addAssistantMessage('I will create the login component.');
228
- ctx.addUserMessage('Include remember me');
229
- ctx.addAssistantMessage('Added remember me checkbox.');
230
- const summary = ctx.getSummary();
231
- assert.strictEqual(summary.agentId, 'developer');
232
- assert.strictEqual(summary.turnCount, 2);
233
- assert.ok(summary.summary.includes('login component'));
234
- });
235
- it('should include tool call summary', () => {
236
- const ctx = new ConversationContext(createTestAgent());
237
- ctx.addUserMessage('Edit file');
238
- ctx.addAssistantToolCalls([{ id: 'tc1', type: 'function', function: { name: 'editFile', arguments: '{"path":"a.ts"}' } }]);
239
- ctx.addToolResult('tc1', 'OK');
240
- ctx.addAssistantMessage('Done.');
241
- const summary = ctx.getSummary();
242
- assert.ok(summary.toolCallSummary.length > 0);
243
- assert.ok(summary.toolCallSummary[0].includes('editFile'));
244
- });
245
- it('should handle empty conversation', () => {
246
- const ctx = new ConversationContext(createTestAgent());
247
- const summary = ctx.getSummary();
248
- assert.strictEqual(summary.turnCount, 0);
249
- assert.ok(summary.summary.includes('No assistant responses'));
250
- });
251
- });
252
- });
253
- //# sourceMappingURL=context.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"context.test.js","sourceRoot":"","sources":["../../src/core/context.test.ts"],"names":[],"mappings":"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"}
@@ -1,151 +0,0 @@
1
- /**
2
- * Handoff Manager
3
- *
4
- * Manages agent-to-agent transfers, including:
5
- * - Interactive handoffs (user reviews before transfer)
6
- * - Autonomous handoffs (subagent spawning — orchestrator decides)
7
- * - Context transfer (conversation summary passed to new agent)
8
- * - Handoff history tracking
9
- *
10
- * Handoffs are defined in agent frontmatter:
11
- * ```yaml
12
- * handoffs:
13
- * - label: "Development"
14
- * agent: developer
15
- * prompt: "Implement this feature"
16
- * send: true # auto-send vs. prepare for review
17
- * ```
18
- */
19
- import type { AgentDefinition, AgentHandoff } from './agents/types.js';
20
- import type { ConversationContext, ConversationSummary } from './context.js';
21
- import { AgentRouter } from './router.js';
22
- /**
23
- * A handoff request — the intent to transfer from one agent to another.
24
- */
25
- export interface HandoffRequest {
26
- /** Source agent initiating the handoff */
27
- fromAgentId: string;
28
- /** Target agent receiving the handoff */
29
- toAgentId: string;
30
- /** The prompt/message to send to the target agent */
31
- prompt: string;
32
- /** Label for this handoff (from agent definition) */
33
- label: string;
34
- /** Whether to auto-send or wait for user review */
35
- autoSend: boolean;
36
- /** Summary of the conversation being handed off */
37
- conversationSummary?: ConversationSummary;
38
- }
39
- /**
40
- * The result of executing a handoff.
41
- */
42
- export interface HandoffResult {
43
- /** Whether the handoff was executed */
44
- executed: boolean;
45
- /** The target agent (resolved) */
46
- targetAgent?: AgentDefinition;
47
- /** Reason if handoff was not executed */
48
- reason?: string;
49
- /** The handoff request that was processed */
50
- request: HandoffRequest;
51
- }
52
- /**
53
- * Record of a completed handoff, for history tracking.
54
- */
55
- export interface HandoffRecord {
56
- /** Handoff request */
57
- request: HandoffRequest;
58
- /** When the handoff occurred */
59
- timestamp: number;
60
- /** Whether it was executed */
61
- executed: boolean;
62
- }
63
- /**
64
- * Mode for handoff execution.
65
- */
66
- export type HandoffMode = 'interactive' | 'autonomous';
67
- /**
68
- * Manages agent handoffs and context transfer.
69
- *
70
- * @example
71
- * ```typescript
72
- * const manager = new HandoffManager(router);
73
- *
74
- * // Get available handoffs for the current agent
75
- * const available = manager.getAvailableHandoffs(bethAgent);
76
- *
77
- * // Prepare a handoff
78
- * const request = manager.prepareHandoff(bethAgent, 'developer', 'Implement login');
79
- *
80
- * // Execute the handoff
81
- * const result = manager.executeHandoff(request, currentContext);
82
- * ```
83
- */
84
- export declare class HandoffManager {
85
- /** Router for resolving agent references */
86
- private readonly router;
87
- /** History of handoffs in this session */
88
- private readonly history;
89
- /** Maximum depth of handoff chains to prevent infinite loops */
90
- private readonly maxDepth;
91
- constructor(router: AgentRouter, options?: {
92
- maxDepth?: number;
93
- });
94
- /**
95
- * Get the handoff definitions available from an agent.
96
- */
97
- getAvailableHandoffs(agent: AgentDefinition): AgentHandoff[];
98
- /**
99
- * Find a handoff definition by target agent name.
100
- */
101
- findHandoff(agent: AgentDefinition, targetAgentId: string): AgentHandoff | undefined;
102
- /**
103
- * Prepare a handoff request from the current agent to a target.
104
- *
105
- * @param fromAgent - The agent initiating the handoff
106
- * @param toAgentId - The target agent's ID or name
107
- * @param prompt - The message to send (overrides handoff default)
108
- * @param context - Optional conversation context for summary
109
- * @returns The prepared handoff request, or null if the target agent isn't found
110
- */
111
- prepareHandoff(fromAgent: AgentDefinition, toAgentId: string, prompt?: string, context?: ConversationContext): HandoffRequest | null;
112
- /**
113
- * Execute a handoff — validate and prepare the transfer.
114
- *
115
- * The actual agent switch happens in the orchestrator. This method
116
- * validates the handoff, checks depth limits, and records it.
117
- *
118
- * @param request - The handoff request to execute
119
- * @returns The handoff result
120
- */
121
- executeHandoff(request: HandoffRequest): HandoffResult;
122
- /**
123
- * Build the context injection string for the target agent.
124
- *
125
- * Creates a summary of the previous conversation that gets injected
126
- * into the new agent's system prompt.
127
- */
128
- buildHandoffContext(request: HandoffRequest): string;
129
- /**
130
- * Get the handoff history for this session.
131
- */
132
- getHistory(): HandoffRecord[];
133
- /**
134
- * Get the current handoff chain depth for a target agent.
135
- * Counts consecutive handoffs in recent history.
136
- */
137
- getDepth(): number;
138
- /**
139
- * Clear handoff history (e.g., when starting a new conversation).
140
- */
141
- clearHistory(): void;
142
- /**
143
- * Check if handing off to a specific agent would exceed the depth limit.
144
- */
145
- private isDepthExceeded;
146
- /**
147
- * Record a handoff in history.
148
- */
149
- private recordHandoff;
150
- }
151
- //# sourceMappingURL=handoffs.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"handoffs.d.ts","sourceRoot":"","sources":["../../src/core/handoffs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAM1C;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAC;IAEpB,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;IAElB,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IAEf,qDAAqD;IACrD,KAAK,EAAE,MAAM,CAAC;IAEd,mDAAmD;IACnD,QAAQ,EAAE,OAAO,CAAC;IAElB,mDAAmD;IACnD,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;CAC3C;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,uCAAuC;IACvC,QAAQ,EAAE,OAAO,CAAC;IAElB,kCAAkC;IAClC,WAAW,CAAC,EAAE,eAAe,CAAC;IAE9B,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,6CAA6C;IAC7C,OAAO,EAAE,cAAc,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,sBAAsB;IACtB,OAAO,EAAE,cAAc,CAAC;IAExB,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAElB,8BAA8B;IAC9B,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,aAAa,GAAG,YAAY,CAAC;AAMvD;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,cAAc;IACzB,4CAA4C;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IAErC,0CAA0C;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;IAE/C,gEAAgE;IAChE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEtB,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;IAShE;;OAEG;IACH,oBAAoB,CAAC,KAAK,EAAE,eAAe,GAAG,YAAY,EAAE;IAI5D;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAWpF;;;;;;;;OAQG;IACH,cAAc,CACZ,SAAS,EAAE,eAAe,EAC1B,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,mBAAmB,GAC5B,cAAc,GAAG,IAAI;IA0BxB;;;;;;;;OAQG;IACH,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa;IAsCtD;;;;;OAKG;IACH,mBAAmB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM;IA2BpD;;OAEG;IACH,UAAU,IAAI,aAAa,EAAE;IAI7B;;;OAGG;IACH,QAAQ,IAAI,MAAM;IAIlB;;OAEG;IACH,YAAY,IAAI,IAAI;IAIpB;;OAEG;IACH,OAAO,CAAC,eAAe;IA2BvB;;OAEG;IACH,OAAO,CAAC,aAAa;CAOtB"}
@@ -1,220 +0,0 @@
1
- /**
2
- * Handoff Manager
3
- *
4
- * Manages agent-to-agent transfers, including:
5
- * - Interactive handoffs (user reviews before transfer)
6
- * - Autonomous handoffs (subagent spawning — orchestrator decides)
7
- * - Context transfer (conversation summary passed to new agent)
8
- * - Handoff history tracking
9
- *
10
- * Handoffs are defined in agent frontmatter:
11
- * ```yaml
12
- * handoffs:
13
- * - label: "Development"
14
- * agent: developer
15
- * prompt: "Implement this feature"
16
- * send: true # auto-send vs. prepare for review
17
- * ```
18
- */
19
- // =============================================================================
20
- // HandoffManager
21
- // =============================================================================
22
- /**
23
- * Manages agent handoffs and context transfer.
24
- *
25
- * @example
26
- * ```typescript
27
- * const manager = new HandoffManager(router);
28
- *
29
- * // Get available handoffs for the current agent
30
- * const available = manager.getAvailableHandoffs(bethAgent);
31
- *
32
- * // Prepare a handoff
33
- * const request = manager.prepareHandoff(bethAgent, 'developer', 'Implement login');
34
- *
35
- * // Execute the handoff
36
- * const result = manager.executeHandoff(request, currentContext);
37
- * ```
38
- */
39
- export class HandoffManager {
40
- /** Router for resolving agent references */
41
- router;
42
- /** History of handoffs in this session */
43
- history = [];
44
- /** Maximum depth of handoff chains to prevent infinite loops */
45
- maxDepth;
46
- constructor(router, options) {
47
- this.router = router;
48
- this.maxDepth = options?.maxDepth ?? 10;
49
- }
50
- // ===========================================================================
51
- // Handoff Discovery
52
- // ===========================================================================
53
- /**
54
- * Get the handoff definitions available from an agent.
55
- */
56
- getAvailableHandoffs(agent) {
57
- return agent.frontmatter.handoffs ?? [];
58
- }
59
- /**
60
- * Find a handoff definition by target agent name.
61
- */
62
- findHandoff(agent, targetAgentId) {
63
- const handoffs = this.getAvailableHandoffs(agent);
64
- return handoffs.find((h) => h.agent.toLowerCase() === targetAgentId.toLowerCase());
65
- }
66
- // ===========================================================================
67
- // Handoff Preparation
68
- // ===========================================================================
69
- /**
70
- * Prepare a handoff request from the current agent to a target.
71
- *
72
- * @param fromAgent - The agent initiating the handoff
73
- * @param toAgentId - The target agent's ID or name
74
- * @param prompt - The message to send (overrides handoff default)
75
- * @param context - Optional conversation context for summary
76
- * @returns The prepared handoff request, or null if the target agent isn't found
77
- */
78
- prepareHandoff(fromAgent, toAgentId, prompt, context) {
79
- // Resolve the target agent
80
- const targetAgent = this.router.resolveAgent(toAgentId);
81
- if (!targetAgent) {
82
- return null;
83
- }
84
- // Look up the handoff definition for defaults
85
- const handoffDef = this.findHandoff(fromAgent, toAgentId);
86
- const request = {
87
- fromAgentId: fromAgent.id,
88
- toAgentId: targetAgent.id,
89
- prompt: prompt ?? handoffDef?.prompt ?? '',
90
- label: handoffDef?.label ?? `Handoff to ${targetAgent.frontmatter.name}`,
91
- autoSend: handoffDef?.send ?? false,
92
- conversationSummary: context?.getSummary(),
93
- };
94
- return request;
95
- }
96
- // ===========================================================================
97
- // Handoff Execution
98
- // ===========================================================================
99
- /**
100
- * Execute a handoff — validate and prepare the transfer.
101
- *
102
- * The actual agent switch happens in the orchestrator. This method
103
- * validates the handoff, checks depth limits, and records it.
104
- *
105
- * @param request - The handoff request to execute
106
- * @returns The handoff result
107
- */
108
- executeHandoff(request) {
109
- // Check depth limit to prevent infinite handoff chains
110
- if (this.isDepthExceeded(request.toAgentId)) {
111
- const result = {
112
- executed: false,
113
- reason: `Handoff depth limit (${this.maxDepth}) exceeded — possible loop detected`,
114
- request,
115
- };
116
- this.recordHandoff(request, false);
117
- return result;
118
- }
119
- // Resolve the target agent
120
- const targetAgent = this.router.resolveAgent(request.toAgentId);
121
- if (!targetAgent) {
122
- const result = {
123
- executed: false,
124
- reason: `Agent "${request.toAgentId}" not found`,
125
- request,
126
- };
127
- this.recordHandoff(request, false);
128
- return result;
129
- }
130
- // Record and succeed
131
- this.recordHandoff(request, true);
132
- return {
133
- executed: true,
134
- targetAgent,
135
- request,
136
- };
137
- }
138
- // ===========================================================================
139
- // Context Transfer
140
- // ===========================================================================
141
- /**
142
- * Build the context injection string for the target agent.
143
- *
144
- * Creates a summary of the previous conversation that gets injected
145
- * into the new agent's system prompt.
146
- */
147
- buildHandoffContext(request) {
148
- const parts = [];
149
- parts.push(`## Handoff from ${request.fromAgentId}`);
150
- parts.push(`**Reason:** ${request.label}`);
151
- if (request.conversationSummary) {
152
- const summary = request.conversationSummary;
153
- parts.push(`**Previous conversation** (${summary.turnCount} turns with ${summary.agentId}):`);
154
- parts.push(summary.summary);
155
- if (summary.toolCallSummary.length > 0) {
156
- parts.push(`**Tools used:** ${summary.toolCallSummary.join(', ')}`);
157
- }
158
- }
159
- if (request.prompt) {
160
- parts.push(`\n**Task:** ${request.prompt}`);
161
- }
162
- return parts.join('\n');
163
- }
164
- // ===========================================================================
165
- // History & Safety
166
- // ===========================================================================
167
- /**
168
- * Get the handoff history for this session.
169
- */
170
- getHistory() {
171
- return [...this.history];
172
- }
173
- /**
174
- * Get the current handoff chain depth for a target agent.
175
- * Counts consecutive handoffs in recent history.
176
- */
177
- getDepth() {
178
- return this.history.filter((h) => h.executed).length;
179
- }
180
- /**
181
- * Clear handoff history (e.g., when starting a new conversation).
182
- */
183
- clearHistory() {
184
- this.history.length = 0;
185
- }
186
- /**
187
- * Check if handing off to a specific agent would exceed the depth limit.
188
- */
189
- isDepthExceeded(_targetAgentId) {
190
- const executedCount = this.history.filter((h) => h.executed).length;
191
- if (executedCount >= this.maxDepth) {
192
- return true;
193
- }
194
- // Also check for direct ping-pong loops (A→B→A→B...)
195
- const recentExecuted = this.history
196
- .filter((h) => h.executed)
197
- .slice(-4);
198
- if (recentExecuted.length >= 4) {
199
- const pattern = recentExecuted.map((h) => h.request.toAgentId);
200
- // Check for A-B-A-B pattern
201
- if (pattern[0] === pattern[2] &&
202
- pattern[1] === pattern[3] &&
203
- pattern[0] !== pattern[1]) {
204
- return true;
205
- }
206
- }
207
- return false;
208
- }
209
- /**
210
- * Record a handoff in history.
211
- */
212
- recordHandoff(request, executed) {
213
- this.history.push({
214
- request,
215
- timestamp: Date.now(),
216
- executed,
217
- });
218
- }
219
- }
220
- //# sourceMappingURL=handoffs.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"handoffs.js","sourceRoot":"","sources":["../../src/core/handoffs.ts"],"names":[],"mappings":"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"}
@@ -1,8 +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
- export {};
8
- //# sourceMappingURL=handoffs.test.d.ts.map