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,178 +0,0 @@
1
- /**
2
- * Agent Router
3
- *
4
- * Routes user requests to the appropriate agent based on:
5
- * 1. Explicit @agent mentions in user input
6
- * 2. Active handoff targets from the current agent
7
- * 3. Skill trigger matching
8
- * 4. Default to the orchestrator (Beth)
9
- *
10
- * Also provides agent lookup utilities for the orchestrator.
11
- */
12
- import { findMatchingSkills, buildTriggerMap } from './skills/loader.js';
13
- // =============================================================================
14
- // AgentRouter
15
- // =============================================================================
16
- /**
17
- * Routes requests to the appropriate agent.
18
- *
19
- * @example
20
- * ```typescript
21
- * const router = new AgentRouter(agentLoadResult, skillLoadResult, 'beth');
22
- *
23
- * const result = router.route('@developer implement login page');
24
- * // result.agent.id === 'developer'
25
- * // result.reason === 'mention'
26
- * // result.cleanedPrompt === 'implement login page'
27
- *
28
- * const result2 = router.route('create a prd for auth');
29
- * // result2.matchedSkills contains the PRD skill
30
- * ```
31
- */
32
- export class AgentRouter {
33
- /** Map of agent ID → agent definition */
34
- agents;
35
- /** Map of agent name (lowercase) → agent ID for lookup */
36
- nameToId;
37
- /** Skill trigger map for matching */
38
- triggerMap;
39
- /** Default agent ID (typically 'beth') */
40
- defaultAgentId;
41
- constructor(agentResult, skillResult, defaultAgentId = 'beth') {
42
- this.agents = new Map();
43
- this.nameToId = new Map();
44
- this.defaultAgentId = defaultAgentId;
45
- for (const agent of agentResult.agents) {
46
- this.agents.set(agent.id, agent);
47
- // Map both ID and name for flexible lookup
48
- this.nameToId.set(agent.id.toLowerCase(), agent.id);
49
- if (agent.frontmatter.name) {
50
- this.nameToId.set(agent.frontmatter.name.toLowerCase(), agent.id);
51
- }
52
- }
53
- this.triggerMap = buildTriggerMap(skillResult);
54
- }
55
- // ===========================================================================
56
- // Routing
57
- // ===========================================================================
58
- /**
59
- * Route a user message to the appropriate agent.
60
- *
61
- * @param userMessage - The user's input text
62
- * @param currentAgentId - The currently active agent (for handoff context)
63
- * @returns Routing result with selected agent and matched skills
64
- */
65
- route(userMessage, currentAgentId) {
66
- // 1. Check for explicit @mention
67
- const mentionResult = this.checkMention(userMessage);
68
- if (mentionResult) {
69
- return {
70
- ...mentionResult,
71
- matchedSkills: this.findSkills(mentionResult.cleanedPrompt ?? userMessage),
72
- };
73
- }
74
- // 2. Find matching skills
75
- const matchedSkills = this.findSkills(userMessage);
76
- // 3. Use current agent if one is active (stay in context)
77
- if (currentAgentId) {
78
- const currentAgent = this.agents.get(currentAgentId);
79
- if (currentAgent) {
80
- return {
81
- agent: currentAgent,
82
- reason: 'default',
83
- matchedSkills,
84
- };
85
- }
86
- }
87
- // 4. Default to orchestrator
88
- const defaultAgent = this.getDefaultAgent();
89
- return {
90
- agent: defaultAgent,
91
- reason: 'default',
92
- matchedSkills,
93
- };
94
- }
95
- /**
96
- * Route directly to a specific agent by ID or name.
97
- *
98
- * @param agentIdOrName - Agent ID or display name
99
- * @returns The agent definition, or undefined if not found
100
- */
101
- resolveAgent(agentIdOrName) {
102
- // Try direct ID lookup first
103
- const direct = this.agents.get(agentIdOrName);
104
- if (direct)
105
- return direct;
106
- // Try name-based lookup (case-insensitive)
107
- const id = this.nameToId.get(agentIdOrName.toLowerCase());
108
- if (id)
109
- return this.agents.get(id);
110
- return undefined;
111
- }
112
- /**
113
- * Get all registered agents.
114
- */
115
- getAgents() {
116
- return [...this.agents.values()];
117
- }
118
- /**
119
- * Get agents that can be invoked as subagents (infer: true).
120
- */
121
- getInferableAgents() {
122
- return [...this.agents.values()].filter((a) => a.frontmatter.infer === true);
123
- }
124
- /**
125
- * Get the default orchestrator agent.
126
- */
127
- getDefaultAgent() {
128
- const agent = this.agents.get(this.defaultAgentId);
129
- if (!agent) {
130
- // Fallback: return the first agent
131
- const first = this.agents.values().next().value;
132
- if (!first) {
133
- throw new Error('No agents loaded — cannot route requests');
134
- }
135
- return first;
136
- }
137
- return agent;
138
- }
139
- /**
140
- * Check if a specific agent is registered.
141
- */
142
- hasAgent(agentIdOrName) {
143
- return this.resolveAgent(agentIdOrName) !== undefined;
144
- }
145
- // ===========================================================================
146
- // Internal Routing Logic
147
- // ===========================================================================
148
- /**
149
- * Check for @agent mention in user input.
150
- *
151
- * Matches patterns like:
152
- * - "@developer implement the login page"
153
- * - "@product-manager create a PRD"
154
- * - "@Beth plan a feature"
155
- */
156
- checkMention(userMessage) {
157
- const mentionMatch = userMessage.match(/^@(\S+)\s*(.*)/s);
158
- if (!mentionMatch)
159
- return null;
160
- const mentionName = mentionMatch[1];
161
- const restOfMessage = mentionMatch[2].trim();
162
- const agent = this.resolveAgent(mentionName);
163
- if (!agent)
164
- return null;
165
- return {
166
- agent,
167
- reason: 'mention',
168
- cleanedPrompt: restOfMessage || userMessage,
169
- };
170
- }
171
- /**
172
- * Find skills whose triggers match the user message.
173
- */
174
- findSkills(userMessage) {
175
- return findMatchingSkills(userMessage, this.triggerMap);
176
- }
177
- }
178
- //# sourceMappingURL=router.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/core/router.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- /**
2
- * AgentRouter Tests
3
- *
4
- * Tests for agent routing: @mention parsing, skill trigger matching,
5
- * agent resolution, and default routing behavior.
6
- */
7
- export {};
8
- //# sourceMappingURL=router.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"router.test.d.ts","sourceRoot":"","sources":["../../src/core/router.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -1,215 +0,0 @@
1
- /**
2
- * AgentRouter Tests
3
- *
4
- * Tests for agent routing: @mention parsing, skill trigger matching,
5
- * agent resolution, and default routing behavior.
6
- */
7
- import { describe, it } from 'node:test';
8
- import assert from 'node:assert';
9
- import { AgentRouter } from './router.js';
10
- // =============================================================================
11
- // Test Fixtures
12
- // =============================================================================
13
- function createAgent(id, name, infer) {
14
- return {
15
- id,
16
- frontmatter: {
17
- name,
18
- description: `${name} agent`,
19
- tools: ['readFile'],
20
- infer,
21
- handoffs: [
22
- { label: 'Test Handoff', agent: 'tester', prompt: 'Test this' },
23
- ],
24
- },
25
- body: `# ${name}`,
26
- sourcePath: `/agents/${id}.agent.md`,
27
- };
28
- }
29
- function createSkill(id, name, triggers) {
30
- return {
31
- id,
32
- frontmatter: { name, description: `Triggers on: ${triggers.join(', ')}` },
33
- body: `Skill content for ${name}`,
34
- sourcePath: `/skills/${id}/SKILL.md`,
35
- triggers,
36
- };
37
- }
38
- function createTestRouter(agents, skills, defaultId) {
39
- const agentResult = {
40
- agents: agents ?? [
41
- createAgent('beth', 'Beth', true),
42
- createAgent('developer', 'developer', true),
43
- createAgent('tester', 'tester', true),
44
- createAgent('product-manager', 'product-manager', true),
45
- createAgent('ux-designer', 'ux-designer', true),
46
- ],
47
- errors: [],
48
- };
49
- const skillResult = {
50
- skills: skills ?? [
51
- createSkill('prd', 'PRD Generation', ['create a prd', 'product requirements']),
52
- createSkill('shadcn-ui', 'shadcn/ui', ['shadcn', 'ui component']),
53
- ],
54
- errors: [],
55
- };
56
- return new AgentRouter(agentResult, skillResult, defaultId ?? 'beth');
57
- }
58
- // =============================================================================
59
- // Tests
60
- // =============================================================================
61
- describe('AgentRouter', () => {
62
- describe('Construction', () => {
63
- it('should create with agents and skills', () => {
64
- const router = createTestRouter();
65
- assert.ok(router.hasAgent('beth'));
66
- assert.ok(router.hasAgent('developer'));
67
- assert.strictEqual(router.getAgents().length, 5);
68
- });
69
- it('should handle empty agents', () => {
70
- assert.throws(() => {
71
- const router = createTestRouter([]);
72
- router.route('hello');
73
- }, /No agents loaded/);
74
- });
75
- });
76
- describe('Route by @mention', () => {
77
- it('should route @developer to developer agent', () => {
78
- const router = createTestRouter();
79
- const result = router.route('@developer implement login');
80
- assert.strictEqual(result.agent.id, 'developer');
81
- assert.strictEqual(result.reason, 'mention');
82
- assert.strictEqual(result.cleanedPrompt, 'implement login');
83
- });
84
- it('should route @Beth to Beth agent (case-insensitive name)', () => {
85
- const router = createTestRouter();
86
- const result = router.route('@Beth plan a feature');
87
- assert.strictEqual(result.agent.id, 'beth');
88
- assert.strictEqual(result.reason, 'mention');
89
- assert.strictEqual(result.cleanedPrompt, 'plan a feature');
90
- });
91
- it('should route @product-manager correctly', () => {
92
- const router = createTestRouter();
93
- const result = router.route('@product-manager create a PRD');
94
- assert.strictEqual(result.agent.id, 'product-manager');
95
- assert.strictEqual(result.reason, 'mention');
96
- });
97
- it('should fall through to default for unknown @mention', () => {
98
- const router = createTestRouter();
99
- const result = router.route('@unknown-agent do something');
100
- // Unknown mention falls through to default behavior
101
- assert.strictEqual(result.reason, 'default');
102
- });
103
- it('should handle @mention with no trailing text', () => {
104
- const router = createTestRouter();
105
- const result = router.route('@developer');
106
- // '@developer' without trailing text — the match won't capture the second group
107
- // This should fall through since the regex requires whitespace after the mention
108
- assert.ok(result.agent !== undefined);
109
- });
110
- });
111
- describe('Route with skill matching', () => {
112
- it('should find matching skills in user message', () => {
113
- const router = createTestRouter();
114
- const result = router.route('create a prd for authentication');
115
- assert.ok(result.matchedSkills.length > 0);
116
- assert.strictEqual(result.matchedSkills[0].id, 'prd');
117
- });
118
- it('should find shadcn skills', () => {
119
- const router = createTestRouter();
120
- const result = router.route('add a shadcn button component');
121
- assert.ok(result.matchedSkills.length > 0);
122
- assert.strictEqual(result.matchedSkills[0].id, 'shadcn-ui');
123
- });
124
- it('should return empty skills when no triggers match', () => {
125
- const router = createTestRouter();
126
- const result = router.route('hello world');
127
- assert.strictEqual(result.matchedSkills.length, 0);
128
- });
129
- it('should combine @mention routing with skill matching', () => {
130
- const router = createTestRouter();
131
- const result = router.route('@developer create a shadcn button');
132
- assert.strictEqual(result.agent.id, 'developer');
133
- assert.strictEqual(result.reason, 'mention');
134
- assert.ok(result.matchedSkills.length > 0);
135
- });
136
- });
137
- describe('Default routing', () => {
138
- it('should default to Beth when no mention or current agent', () => {
139
- const router = createTestRouter();
140
- const result = router.route('do something');
141
- assert.strictEqual(result.agent.id, 'beth');
142
- assert.strictEqual(result.reason, 'default');
143
- });
144
- it('should stay with current agent when one is active', () => {
145
- const router = createTestRouter();
146
- const result = router.route('do something else', 'developer');
147
- assert.strictEqual(result.agent.id, 'developer');
148
- assert.strictEqual(result.reason, 'default');
149
- });
150
- it('@mention should override current agent', () => {
151
- const router = createTestRouter();
152
- const result = router.route('@tester test this', 'developer');
153
- assert.strictEqual(result.agent.id, 'tester');
154
- assert.strictEqual(result.reason, 'mention');
155
- });
156
- });
157
- describe('Agent resolution', () => {
158
- it('should resolve by ID', () => {
159
- const router = createTestRouter();
160
- const agent = router.resolveAgent('developer');
161
- assert.strictEqual(agent?.id, 'developer');
162
- });
163
- it('should resolve by name (case-insensitive)', () => {
164
- const router = createTestRouter();
165
- const agent = router.resolveAgent('Beth');
166
- assert.strictEqual(agent?.id, 'beth');
167
- });
168
- it('should return undefined for unknown agent', () => {
169
- const router = createTestRouter();
170
- const agent = router.resolveAgent('nonexistent');
171
- assert.strictEqual(agent, undefined);
172
- });
173
- it('should check agent existence', () => {
174
- const router = createTestRouter();
175
- assert.strictEqual(router.hasAgent('developer'), true);
176
- assert.strictEqual(router.hasAgent('nonexistent'), false);
177
- });
178
- });
179
- describe('Inferable agents', () => {
180
- it('should return agents with infer: true', () => {
181
- const router = createTestRouter();
182
- const inferable = router.getInferableAgents();
183
- assert.ok(inferable.length > 0);
184
- for (const agent of inferable) {
185
- assert.strictEqual(agent.frontmatter.infer, true);
186
- }
187
- });
188
- it('should not include non-inferable agents', () => {
189
- const agents = [
190
- createAgent('beth', 'Beth', true),
191
- createAgent('helper', 'Helper', false),
192
- createAgent('developer', 'developer', true),
193
- ];
194
- const router = createTestRouter(agents);
195
- const inferable = router.getInferableAgents();
196
- assert.strictEqual(inferable.length, 2);
197
- const ids = inferable.map((a) => a.id);
198
- assert.ok(!ids.includes('helper'));
199
- });
200
- });
201
- describe('Default agent', () => {
202
- it('should return the configured default agent', () => {
203
- const router = createTestRouter(undefined, undefined, 'beth');
204
- const agent = router.getDefaultAgent();
205
- assert.strictEqual(agent.id, 'beth');
206
- });
207
- it('should fallback to first agent if default not found', () => {
208
- const agents = [createAgent('dev', 'Developer')];
209
- const router = createTestRouter(agents, [], 'nonexistent');
210
- const agent = router.getDefaultAgent();
211
- assert.strictEqual(agent.id, 'dev');
212
- });
213
- });
214
- });
215
- //# sourceMappingURL=router.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"router.test.js","sourceRoot":"","sources":["../../src/core/router.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI1C,gFAAgF;AAChF,gBAAgB;AAChB,gFAAgF;AAEhF,SAAS,WAAW,CAAC,EAAU,EAAE,IAAY,EAAE,KAAe;IAC5D,OAAO;QACL,EAAE;QACF,WAAW,EAAE;YACX,IAAI;YACJ,WAAW,EAAE,GAAG,IAAI,QAAQ;YAC5B,KAAK,EAAE,CAAC,UAAU,CAAC;YACnB,KAAK;YACL,QAAQ,EAAE;gBACR,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE;aAChE;SACF;QACD,IAAI,EAAE,KAAK,IAAI,EAAE;QACjB,UAAU,EAAE,WAAW,EAAE,WAAW;KACrC,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,EAAU,EAAE,IAAY,EAAE,QAAkB;IAC/D,OAAO;QACL,EAAE;QACF,WAAW,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,gBAAgB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE;QACzE,IAAI,EAAE,qBAAqB,IAAI,EAAE;QACjC,UAAU,EAAE,WAAW,EAAE,WAAW;QACpC,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CACvB,MAA0B,EAC1B,MAA0B,EAC1B,SAAkB;IAElB,MAAM,WAAW,GAAoB;QACnC,MAAM,EAAE,MAAM,IAAI;YAChB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC;YACjC,WAAW,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,CAAC;YAC3C,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC;YACrC,WAAW,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,IAAI,CAAC;YACvD,WAAW,CAAC,aAAa,EAAE,aAAa,EAAE,IAAI,CAAC;SAChD;QACD,MAAM,EAAE,EAAE;KACX,CAAC;IAEF,MAAM,WAAW,GAAoB;QACnC,MAAM,EAAE,MAAM,IAAI;YAChB,WAAW,CAAC,KAAK,EAAE,gBAAgB,EAAE,CAAC,cAAc,EAAE,sBAAsB,CAAC,CAAC;YAC9E,WAAW,CAAC,WAAW,EAAE,WAAW,EAAE,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;SAClE;QACD,MAAM,EAAE,EAAE;KACX,CAAC;IAEF,OAAO,IAAI,WAAW,CAAC,WAAW,EAAE,WAAW,EAAE,SAAS,IAAI,MAAM,CAAC,CAAC;AACxE,CAAC;AAED,gFAAgF;AAChF,QAAQ;AACR,gFAAgF;AAEhF,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;YAElC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;YACnC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC;YACxC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE;gBACjB,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;gBACpC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACxB,CAAC,EAAE,kBAAkB,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAE1D,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;YACjD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAC7C,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;YAClE,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;YAEpD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YAC5C,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAC7C,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;YAE7D,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,iBAAiB,CAAC,CAAC;YACvD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;YAC7D,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;YAE3D,oDAAoD;YACpD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;YAE1C,gFAAgF;YAChF,iFAAiF;YACjF,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACzC,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;YAE/D,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC3C,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;YACnC,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;YAE7D,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC3C,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAE3C,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;YAC7D,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;YAEjE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;YACjD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAC7C,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;YACjE,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAE5C,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YAC5C,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAC;YAE9D,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;YACjD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAC;YAE9D,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YAC9C,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;YAC9B,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;YAC/C,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAC1C,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;YACjD,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;YAClC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,CAAC;YACvD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,KAAK,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC/C,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;YAClC,MAAM,SAAS,GAAG,MAAM,CAAC,kBAAkB,EAAE,CAAC;YAE9C,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAChC,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;gBAC9B,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACpD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,MAAM,GAAG;gBACb,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC;gBACjC,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC;gBACtC,WAAW,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,CAAC;aAC5C,CAAC;YACF,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;YACxC,MAAM,SAAS,GAAG,MAAM,CAAC,kBAAkB,EAAE,CAAC;YAE9C,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACxC,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACvC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;YAC9D,MAAM,KAAK,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;YACvC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;YAC7D,MAAM,MAAM,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;YACjD,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,EAAE,EAAE,EAAE,aAAa,CAAC,CAAC;YAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;YACvC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}