@bradygaster/squad-sdk 0.7.0 → 0.8.2

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 (354) hide show
  1. package/README.md +296 -296
  2. package/dist/adapter/client.d.ts +243 -0
  3. package/dist/adapter/client.d.ts.map +1 -0
  4. package/dist/adapter/client.js +567 -0
  5. package/dist/adapter/client.js.map +1 -0
  6. package/dist/adapter/errors.d.ts +260 -0
  7. package/dist/adapter/errors.d.ts.map +1 -0
  8. package/dist/adapter/errors.js +362 -0
  9. package/dist/adapter/errors.js.map +1 -0
  10. package/dist/adapter/types.d.ts +779 -0
  11. package/dist/adapter/types.d.ts.map +1 -0
  12. package/dist/adapter/types.js +11 -0
  13. package/dist/adapter/types.js.map +1 -0
  14. package/dist/agents/charter-compiler.d.ts +102 -0
  15. package/dist/agents/charter-compiler.d.ts.map +1 -0
  16. package/dist/agents/charter-compiler.js +157 -0
  17. package/dist/agents/charter-compiler.js.map +1 -0
  18. package/dist/agents/history-shadow.d.ts +80 -0
  19. package/dist/agents/history-shadow.d.ts.map +1 -0
  20. package/dist/agents/history-shadow.js +239 -0
  21. package/dist/agents/history-shadow.js.map +1 -0
  22. package/dist/agents/index.d.ts +71 -0
  23. package/dist/agents/index.d.ts.map +1 -0
  24. package/dist/agents/index.js +183 -0
  25. package/dist/agents/index.js.map +1 -0
  26. package/dist/agents/lifecycle.d.ts +138 -0
  27. package/dist/agents/lifecycle.d.ts.map +1 -0
  28. package/dist/agents/lifecycle.js +284 -0
  29. package/dist/agents/lifecycle.js.map +1 -0
  30. package/dist/agents/model-selector.d.ts +80 -0
  31. package/dist/agents/model-selector.d.ts.map +1 -0
  32. package/dist/agents/model-selector.js +171 -0
  33. package/dist/agents/model-selector.js.map +1 -0
  34. package/dist/agents/onboarding.d.ts +65 -0
  35. package/dist/agents/onboarding.d.ts.map +1 -0
  36. package/dist/agents/onboarding.js +373 -0
  37. package/dist/agents/onboarding.js.map +1 -0
  38. package/dist/build/bundle.d.ts +32 -0
  39. package/dist/build/bundle.d.ts.map +1 -0
  40. package/dist/build/bundle.js +97 -0
  41. package/dist/build/bundle.js.map +1 -0
  42. package/dist/build/ci-pipeline.d.ts +51 -0
  43. package/dist/build/ci-pipeline.d.ts.map +1 -0
  44. package/dist/build/ci-pipeline.js +180 -0
  45. package/dist/build/ci-pipeline.js.map +1 -0
  46. package/dist/build/github-dist.d.ts +37 -0
  47. package/dist/build/github-dist.d.ts.map +1 -0
  48. package/dist/build/github-dist.js +117 -0
  49. package/dist/build/github-dist.js.map +1 -0
  50. package/dist/build/index.d.ts +11 -0
  51. package/dist/build/index.d.ts.map +1 -0
  52. package/dist/build/index.js +11 -0
  53. package/dist/build/index.js.map +1 -0
  54. package/dist/build/install-migration.d.ts +28 -0
  55. package/dist/build/install-migration.d.ts.map +1 -0
  56. package/dist/build/install-migration.js +103 -0
  57. package/dist/build/install-migration.js.map +1 -0
  58. package/dist/build/npm-package.d.ts +54 -0
  59. package/dist/build/npm-package.d.ts.map +1 -0
  60. package/dist/build/npm-package.js +128 -0
  61. package/dist/build/npm-package.js.map +1 -0
  62. package/dist/build/release.d.ts +108 -0
  63. package/dist/build/release.d.ts.map +1 -0
  64. package/dist/build/release.js +295 -0
  65. package/dist/build/release.js.map +1 -0
  66. package/dist/build/versioning.d.ts +38 -0
  67. package/dist/build/versioning.d.ts.map +1 -0
  68. package/dist/build/versioning.js +113 -0
  69. package/dist/build/versioning.js.map +1 -0
  70. package/dist/casting/casting-engine.d.ts +60 -0
  71. package/dist/casting/casting-engine.d.ts.map +1 -0
  72. package/dist/casting/casting-engine.js +223 -0
  73. package/dist/casting/casting-engine.js.map +1 -0
  74. package/dist/casting/casting-history.d.ts +54 -0
  75. package/dist/casting/casting-history.d.ts.map +1 -0
  76. package/dist/casting/casting-history.js +63 -0
  77. package/dist/casting/casting-history.js.map +1 -0
  78. package/dist/casting/index.d.ts +46 -0
  79. package/dist/casting/index.d.ts.map +1 -0
  80. package/dist/casting/index.js +45 -0
  81. package/dist/casting/index.js.map +1 -0
  82. package/dist/client/event-bus.d.ts +29 -0
  83. package/dist/client/event-bus.d.ts.map +1 -0
  84. package/dist/client/event-bus.js +52 -0
  85. package/dist/client/event-bus.js.map +1 -0
  86. package/dist/client/index.d.ts +100 -0
  87. package/dist/client/index.d.ts.map +1 -0
  88. package/dist/client/index.js +170 -0
  89. package/dist/client/index.js.map +1 -0
  90. package/dist/client/session-pool.d.ts +66 -0
  91. package/dist/client/session-pool.d.ts.map +1 -0
  92. package/dist/client/session-pool.js +145 -0
  93. package/dist/client/session-pool.js.map +1 -0
  94. package/dist/config/agent-doc.d.ts +43 -0
  95. package/dist/config/agent-doc.d.ts.map +1 -0
  96. package/dist/config/agent-doc.js +158 -0
  97. package/dist/config/agent-doc.js.map +1 -0
  98. package/dist/config/agent-source.d.ts +95 -0
  99. package/dist/config/agent-source.d.ts.map +1 -0
  100. package/dist/config/agent-source.js +274 -0
  101. package/dist/config/agent-source.js.map +1 -0
  102. package/dist/config/doc-sync.d.ts +66 -0
  103. package/dist/config/doc-sync.d.ts.map +1 -0
  104. package/dist/config/doc-sync.js +270 -0
  105. package/dist/config/doc-sync.js.map +1 -0
  106. package/dist/config/feature-audit.d.ts +49 -0
  107. package/dist/config/feature-audit.d.ts.map +1 -0
  108. package/dist/config/feature-audit.js +148 -0
  109. package/dist/config/feature-audit.js.map +1 -0
  110. package/dist/config/index.d.ts +15 -0
  111. package/dist/config/index.d.ts.map +1 -0
  112. package/dist/config/index.js +15 -0
  113. package/dist/config/index.js.map +1 -0
  114. package/dist/config/init.d.ts +61 -0
  115. package/dist/config/init.d.ts.map +1 -0
  116. package/dist/config/init.js +376 -0
  117. package/dist/config/init.js.map +1 -0
  118. package/dist/config/legacy-fallback.d.ts +83 -0
  119. package/dist/config/legacy-fallback.d.ts.map +1 -0
  120. package/dist/config/legacy-fallback.js +212 -0
  121. package/dist/config/legacy-fallback.js.map +1 -0
  122. package/dist/config/markdown-migration.d.ts +157 -0
  123. package/dist/config/markdown-migration.d.ts.map +1 -0
  124. package/dist/config/markdown-migration.js +434 -0
  125. package/dist/config/markdown-migration.js.map +1 -0
  126. package/dist/config/migration.d.ts +123 -0
  127. package/dist/config/migration.d.ts.map +1 -0
  128. package/dist/config/migration.js +273 -0
  129. package/dist/config/migration.js.map +1 -0
  130. package/dist/config/migrations/index.d.ts +36 -0
  131. package/dist/config/migrations/index.d.ts.map +1 -0
  132. package/dist/config/migrations/index.js +216 -0
  133. package/dist/config/migrations/index.js.map +1 -0
  134. package/dist/config/models.d.ts +134 -0
  135. package/dist/config/models.d.ts.map +1 -0
  136. package/dist/config/models.js +354 -0
  137. package/dist/config/models.js.map +1 -0
  138. package/dist/config/routing.d.ts +118 -0
  139. package/dist/config/routing.d.ts.map +1 -0
  140. package/dist/config/routing.js +247 -0
  141. package/dist/config/routing.js.map +1 -0
  142. package/dist/config/schema.d.ts +72 -0
  143. package/dist/config/schema.d.ts.map +1 -0
  144. package/dist/config/schema.js +63 -0
  145. package/dist/config/schema.js.map +1 -0
  146. package/dist/coordinator/coordinator.d.ts +82 -0
  147. package/dist/coordinator/coordinator.d.ts.map +1 -0
  148. package/dist/coordinator/coordinator.js +192 -0
  149. package/dist/coordinator/coordinator.js.map +1 -0
  150. package/dist/coordinator/direct-response.d.ts +83 -0
  151. package/dist/coordinator/direct-response.d.ts.map +1 -0
  152. package/dist/coordinator/direct-response.js +187 -0
  153. package/dist/coordinator/direct-response.js.map +1 -0
  154. package/dist/coordinator/fan-out.d.ts +83 -0
  155. package/dist/coordinator/fan-out.d.ts.map +1 -0
  156. package/dist/coordinator/fan-out.js +161 -0
  157. package/dist/coordinator/fan-out.js.map +1 -0
  158. package/dist/coordinator/index.d.ts +62 -0
  159. package/dist/coordinator/index.d.ts.map +1 -0
  160. package/dist/coordinator/index.js +171 -0
  161. package/dist/coordinator/index.js.map +1 -0
  162. package/dist/coordinator/response-tiers.d.ts +49 -0
  163. package/dist/coordinator/response-tiers.d.ts.map +1 -0
  164. package/dist/coordinator/response-tiers.js +149 -0
  165. package/dist/coordinator/response-tiers.js.map +1 -0
  166. package/dist/hooks/index.d.ts +103 -0
  167. package/dist/hooks/index.d.ts.map +1 -0
  168. package/dist/hooks/index.js +279 -0
  169. package/dist/hooks/index.js.map +1 -0
  170. package/dist/index.d.ts +33 -1
  171. package/dist/index.d.ts.map +1 -1
  172. package/dist/index.js +33 -3
  173. package/dist/index.js.map +1 -1
  174. package/dist/marketplace/backend.d.ts +35 -0
  175. package/dist/marketplace/backend.d.ts.map +1 -0
  176. package/dist/marketplace/backend.js +99 -0
  177. package/dist/marketplace/backend.js.map +1 -0
  178. package/dist/marketplace/browser.d.ts +33 -0
  179. package/dist/marketplace/browser.d.ts.map +1 -0
  180. package/dist/marketplace/browser.js +97 -0
  181. package/dist/marketplace/browser.js.map +1 -0
  182. package/dist/marketplace/extension-adapter.d.ts +51 -0
  183. package/dist/marketplace/extension-adapter.d.ts.map +1 -0
  184. package/dist/marketplace/extension-adapter.js +81 -0
  185. package/dist/marketplace/extension-adapter.js.map +1 -0
  186. package/dist/marketplace/index.d.ts +51 -0
  187. package/dist/marketplace/index.d.ts.map +1 -0
  188. package/dist/marketplace/index.js +108 -0
  189. package/dist/marketplace/index.js.map +1 -0
  190. package/dist/marketplace/packaging.d.ts +25 -0
  191. package/dist/marketplace/packaging.d.ts.map +1 -0
  192. package/dist/marketplace/packaging.js +117 -0
  193. package/dist/marketplace/packaging.js.map +1 -0
  194. package/dist/marketplace/schema.d.ts +50 -0
  195. package/dist/marketplace/schema.d.ts.map +1 -0
  196. package/dist/marketplace/schema.js +120 -0
  197. package/dist/marketplace/schema.js.map +1 -0
  198. package/dist/marketplace/security.d.ts +26 -0
  199. package/dist/marketplace/security.d.ts.map +1 -0
  200. package/dist/marketplace/security.js +199 -0
  201. package/dist/marketplace/security.js.map +1 -0
  202. package/dist/parsers.d.ts +15 -0
  203. package/dist/parsers.d.ts.map +1 -0
  204. package/dist/parsers.js +15 -0
  205. package/dist/parsers.js.map +1 -0
  206. package/dist/ralph/index.d.ts +58 -0
  207. package/dist/ralph/index.d.ts.map +1 -0
  208. package/dist/ralph/index.js +128 -0
  209. package/dist/ralph/index.js.map +1 -0
  210. package/dist/resolution.d.ts +47 -0
  211. package/dist/resolution.d.ts.map +1 -0
  212. package/dist/resolution.js +106 -0
  213. package/dist/resolution.js.map +1 -0
  214. package/dist/runtime/benchmarks.d.ts +121 -0
  215. package/dist/runtime/benchmarks.d.ts.map +1 -0
  216. package/dist/runtime/benchmarks.js +251 -0
  217. package/dist/runtime/benchmarks.js.map +1 -0
  218. package/dist/runtime/config.d.ts +314 -0
  219. package/dist/runtime/config.d.ts.map +1 -0
  220. package/dist/runtime/config.js +467 -0
  221. package/dist/runtime/config.js.map +1 -0
  222. package/dist/runtime/constants.d.ts +35 -0
  223. package/dist/runtime/constants.d.ts.map +1 -0
  224. package/dist/runtime/constants.js +58 -0
  225. package/dist/runtime/constants.js.map +1 -0
  226. package/dist/runtime/cost-tracker.d.ts +73 -0
  227. package/dist/runtime/cost-tracker.d.ts.map +1 -0
  228. package/dist/runtime/cost-tracker.js +157 -0
  229. package/dist/runtime/cost-tracker.js.map +1 -0
  230. package/dist/runtime/event-bus-otel-bridge.d.ts +19 -0
  231. package/dist/runtime/event-bus-otel-bridge.d.ts.map +1 -0
  232. package/dist/runtime/event-bus-otel-bridge.js +61 -0
  233. package/dist/runtime/event-bus-otel-bridge.js.map +1 -0
  234. package/dist/runtime/event-bus-ws-bridge.d.ts +35 -0
  235. package/dist/runtime/event-bus-ws-bridge.d.ts.map +1 -0
  236. package/dist/runtime/event-bus-ws-bridge.js +55 -0
  237. package/dist/runtime/event-bus-ws-bridge.js.map +1 -0
  238. package/dist/runtime/event-bus.d.ts +190 -0
  239. package/dist/runtime/event-bus.d.ts.map +1 -0
  240. package/dist/runtime/event-bus.js +218 -0
  241. package/dist/runtime/event-bus.js.map +1 -0
  242. package/dist/runtime/event-payloads.d.ts +108 -0
  243. package/dist/runtime/event-payloads.d.ts.map +1 -0
  244. package/dist/runtime/event-payloads.js +28 -0
  245. package/dist/runtime/event-payloads.js.map +1 -0
  246. package/dist/runtime/health.d.ts +66 -0
  247. package/dist/runtime/health.d.ts.map +1 -0
  248. package/dist/runtime/health.js +112 -0
  249. package/dist/runtime/health.js.map +1 -0
  250. package/dist/runtime/i18n.d.ts +54 -0
  251. package/dist/runtime/i18n.d.ts.map +1 -0
  252. package/dist/runtime/i18n.js +126 -0
  253. package/dist/runtime/i18n.js.map +1 -0
  254. package/dist/runtime/offline.d.ts +64 -0
  255. package/dist/runtime/offline.d.ts.map +1 -0
  256. package/dist/runtime/offline.js +108 -0
  257. package/dist/runtime/offline.js.map +1 -0
  258. package/dist/runtime/otel-bridge.d.ts +52 -0
  259. package/dist/runtime/otel-bridge.d.ts.map +1 -0
  260. package/dist/runtime/otel-bridge.js +132 -0
  261. package/dist/runtime/otel-bridge.js.map +1 -0
  262. package/dist/runtime/otel-init.d.ts +72 -0
  263. package/dist/runtime/otel-init.d.ts.map +1 -0
  264. package/dist/runtime/otel-init.js +68 -0
  265. package/dist/runtime/otel-init.js.map +1 -0
  266. package/dist/runtime/otel-metrics.d.ts +42 -0
  267. package/dist/runtime/otel-metrics.d.ts.map +1 -0
  268. package/dist/runtime/otel-metrics.js +196 -0
  269. package/dist/runtime/otel-metrics.js.map +1 -0
  270. package/dist/runtime/otel.d.ts +53 -0
  271. package/dist/runtime/otel.d.ts.map +1 -0
  272. package/dist/runtime/otel.js +127 -0
  273. package/dist/runtime/otel.js.map +1 -0
  274. package/dist/runtime/squad-observer.d.ts +75 -0
  275. package/dist/runtime/squad-observer.d.ts.map +1 -0
  276. package/dist/runtime/squad-observer.js +190 -0
  277. package/dist/runtime/squad-observer.js.map +1 -0
  278. package/dist/runtime/streaming.d.ts +106 -0
  279. package/dist/runtime/streaming.d.ts.map +1 -0
  280. package/dist/runtime/streaming.js +192 -0
  281. package/dist/runtime/streaming.js.map +1 -0
  282. package/dist/runtime/telemetry.d.ts +82 -0
  283. package/dist/runtime/telemetry.d.ts.map +1 -0
  284. package/dist/runtime/telemetry.js +120 -0
  285. package/dist/runtime/telemetry.js.map +1 -0
  286. package/dist/sharing/agent-repo.d.ts +33 -0
  287. package/dist/sharing/agent-repo.d.ts.map +1 -0
  288. package/dist/sharing/agent-repo.js +79 -0
  289. package/dist/sharing/agent-repo.js.map +1 -0
  290. package/dist/sharing/cache.d.ts +36 -0
  291. package/dist/sharing/cache.d.ts.map +1 -0
  292. package/dist/sharing/cache.js +85 -0
  293. package/dist/sharing/cache.js.map +1 -0
  294. package/dist/sharing/conflicts.d.ts +32 -0
  295. package/dist/sharing/conflicts.d.ts.map +1 -0
  296. package/dist/sharing/conflicts.js +121 -0
  297. package/dist/sharing/conflicts.js.map +1 -0
  298. package/dist/sharing/export.d.ts +50 -0
  299. package/dist/sharing/export.d.ts.map +1 -0
  300. package/dist/sharing/export.js +156 -0
  301. package/dist/sharing/export.js.map +1 -0
  302. package/dist/sharing/history-split.d.ts +34 -0
  303. package/dist/sharing/history-split.d.ts.map +1 -0
  304. package/dist/sharing/history-split.js +101 -0
  305. package/dist/sharing/history-split.js.map +1 -0
  306. package/dist/sharing/import.d.ts +37 -0
  307. package/dist/sharing/import.d.ts.map +1 -0
  308. package/dist/sharing/import.js +138 -0
  309. package/dist/sharing/import.js.map +1 -0
  310. package/dist/sharing/index.d.ts +11 -0
  311. package/dist/sharing/index.d.ts.map +1 -0
  312. package/dist/sharing/index.js +11 -0
  313. package/dist/sharing/index.js.map +1 -0
  314. package/dist/sharing/versioning.d.ts +32 -0
  315. package/dist/sharing/versioning.d.ts.map +1 -0
  316. package/dist/sharing/versioning.js +64 -0
  317. package/dist/sharing/versioning.js.map +1 -0
  318. package/dist/skills/index.d.ts +49 -0
  319. package/dist/skills/index.d.ts.map +1 -0
  320. package/dist/skills/index.js +85 -0
  321. package/dist/skills/index.js.map +1 -0
  322. package/dist/skills/skill-loader.d.ts +56 -0
  323. package/dist/skills/skill-loader.d.ts.map +1 -0
  324. package/dist/skills/skill-loader.js +106 -0
  325. package/dist/skills/skill-loader.js.map +1 -0
  326. package/dist/skills/skill-source.d.ts +63 -0
  327. package/dist/skills/skill-source.d.ts.map +1 -0
  328. package/dist/skills/skill-source.js +199 -0
  329. package/dist/skills/skill-source.js.map +1 -0
  330. package/dist/tools/index.d.ts +95 -0
  331. package/dist/tools/index.d.ts.map +1 -0
  332. package/dist/tools/index.js +475 -0
  333. package/dist/tools/index.js.map +1 -0
  334. package/dist/types.d.ts +43 -0
  335. package/dist/types.d.ts.map +1 -0
  336. package/dist/types.js +8 -0
  337. package/dist/types.js.map +1 -0
  338. package/dist/upstream/index.d.ts +8 -0
  339. package/dist/upstream/index.d.ts.map +1 -0
  340. package/dist/upstream/index.js +7 -0
  341. package/dist/upstream/index.js.map +1 -0
  342. package/dist/upstream/resolver.d.ts +37 -0
  343. package/dist/upstream/resolver.d.ts.map +1 -0
  344. package/dist/upstream/resolver.js +234 -0
  345. package/dist/upstream/resolver.js.map +1 -0
  346. package/dist/upstream/types.d.ts +55 -0
  347. package/dist/upstream/types.d.ts.map +1 -0
  348. package/dist/upstream/types.js +11 -0
  349. package/dist/upstream/types.js.map +1 -0
  350. package/dist/utils/normalize-eol.d.ts +6 -0
  351. package/dist/utils/normalize-eol.d.ts.map +1 -0
  352. package/dist/utils/normalize-eol.js +8 -0
  353. package/dist/utils/normalize-eol.js.map +1 -0
  354. package/package.json +197 -63
@@ -0,0 +1,192 @@
1
+ /**
2
+ * Squad Coordinator (M3-1, Issue #135)
3
+ *
4
+ * The brain of Squad — receives user messages, decides how to handle them,
5
+ * and orchestrates agent spawning. Wires together:
6
+ * - DirectResponseHandler (no-spawn fast path)
7
+ * - Routing rules (matchRoute / compileRoutingRules)
8
+ * - Charter compilation (compileCharter)
9
+ * - Model selection (resolveModel)
10
+ * - Fan-out spawning (spawnParallel)
11
+ * - Event bus (observability)
12
+ */
13
+ import { DirectResponseHandler, } from './direct-response.js';
14
+ import { matchRoute, compileRoutingRules, } from '../config/routing.js';
15
+ import { spawnParallel } from './fan-out.js';
16
+ import { trace, SpanStatusCode } from '@opentelemetry/api';
17
+ const tracer = trace.getTracer('squad-sdk');
18
+ // --- Coordinator Class ---
19
+ /**
20
+ * Main coordinator entry point.
21
+ *
22
+ * Pipeline:
23
+ * 1. Direct response check (no-spawn fast path)
24
+ * 2. Route analysis (message → routing rules → agent selection)
25
+ * 3. Spawn strategy (single vs multi vs fallback)
26
+ * 4. Fan-out spawn
27
+ * 5. Collect results + emit events
28
+ */
29
+ export class SquadCoordinator {
30
+ config;
31
+ eventBus;
32
+ directHandler;
33
+ compiledRouter;
34
+ fanOutDeps;
35
+ constructor(options) {
36
+ this.config = options.config;
37
+ this.eventBus = options.eventBus;
38
+ this.fanOutDeps = options.fanOutDeps;
39
+ this.directHandler = options.directHandler ?? new DirectResponseHandler();
40
+ // Compile routing rules from config or use provided router
41
+ if (options.compiledRouter) {
42
+ this.compiledRouter = options.compiledRouter;
43
+ }
44
+ else {
45
+ this.compiledRouter = this.compileRouter(this.config);
46
+ }
47
+ }
48
+ /**
49
+ * Main dispatch — handle an incoming user message.
50
+ */
51
+ async handleMessage(message, context) {
52
+ const span = tracer.startSpan('squad.coordinator.handleMessage');
53
+ span.setAttribute('message.length', message.length);
54
+ try {
55
+ const start = Date.now();
56
+ // Emit coordinator.route event
57
+ await this.emit('coordinator:routing', context.sessionId, {
58
+ phase: 'start',
59
+ messageLength: message.length,
60
+ });
61
+ // --- Step 1: Direct response check ---
62
+ if (this.directHandler.shouldHandleDirectly(message, this.config)) {
63
+ const directResult = this.directHandler.handleDirect(message, context);
64
+ await this.emit('coordinator:routing', context.sessionId, {
65
+ phase: 'complete',
66
+ strategy: 'direct',
67
+ category: directResult.category,
68
+ });
69
+ span.setAttribute('routing.strategy', 'direct');
70
+ return {
71
+ strategy: 'direct',
72
+ directResponse: directResult,
73
+ durationMs: Date.now() - start,
74
+ };
75
+ }
76
+ // --- Step 2: Route analysis ---
77
+ const routing = matchRoute(message, this.compiledRouter);
78
+ await this.emit('coordinator:routing', context.sessionId, {
79
+ phase: 'routed',
80
+ agents: routing.agents,
81
+ confidence: routing.confidence,
82
+ reason: routing.reason,
83
+ });
84
+ span.setAttribute('target.agents', routing.agents.join(','));
85
+ span.setAttribute('routing.confidence', routing.confidence);
86
+ // --- Step 3: Determine spawn strategy ---
87
+ const strategy = this.determineStrategy(routing);
88
+ span.setAttribute('routing.strategy', strategy);
89
+ // --- Step 4: Spawn agents ---
90
+ let spawnResults;
91
+ if (this.fanOutDeps && (strategy === 'single' || strategy === 'multi')) {
92
+ const spawnConfigs = this.buildSpawnConfigs(routing, message, context);
93
+ await this.emit('coordinator:routing', context.sessionId, {
94
+ phase: 'spawning',
95
+ strategy,
96
+ agentCount: spawnConfigs.length,
97
+ });
98
+ spawnResults = await spawnParallel(spawnConfigs, this.fanOutDeps);
99
+ // If all spawns failed in single mode, mark as fallback
100
+ if (strategy === 'single' && spawnResults.every(r => r.status === 'failed')) {
101
+ return {
102
+ strategy: 'fallback',
103
+ routing,
104
+ spawnResults,
105
+ durationMs: Date.now() - start,
106
+ };
107
+ }
108
+ }
109
+ // --- Step 5: Complete ---
110
+ await this.emit('coordinator:routing', context.sessionId, {
111
+ phase: 'complete',
112
+ strategy,
113
+ spawnCount: spawnResults?.length ?? 0,
114
+ successCount: spawnResults?.filter(r => r.status === 'success').length ?? 0,
115
+ });
116
+ return {
117
+ strategy,
118
+ routing,
119
+ spawnResults,
120
+ durationMs: Date.now() - start,
121
+ };
122
+ }
123
+ catch (err) {
124
+ span.setStatus({ code: SpanStatusCode.ERROR, message: err instanceof Error ? err.message : String(err) });
125
+ span.recordException(err instanceof Error ? err : new Error(String(err)));
126
+ throw err;
127
+ }
128
+ finally {
129
+ span.end();
130
+ }
131
+ }
132
+ /**
133
+ * Get the compiled router (for inspection / testing).
134
+ */
135
+ getRouter() {
136
+ return this.compiledRouter;
137
+ }
138
+ /**
139
+ * Get the direct response handler (for inspection / testing).
140
+ */
141
+ getDirectHandler() {
142
+ return this.directHandler;
143
+ }
144
+ /**
145
+ * Update configuration at runtime.
146
+ */
147
+ updateConfig(config) {
148
+ this.config = config;
149
+ this.compiledRouter = this.compileRouter(config);
150
+ }
151
+ // --- Private helpers ---
152
+ determineStrategy(routing) {
153
+ if (routing.agents.length === 0)
154
+ return 'fallback';
155
+ if (routing.agents.length === 1)
156
+ return 'single';
157
+ return 'multi';
158
+ }
159
+ buildSpawnConfigs(routing, message, context) {
160
+ return routing.agents.map((agentName) => ({
161
+ agentName: agentName.replace(/^@/, ''),
162
+ task: message,
163
+ priority: routing.confidence === 'high' ? 'normal' : 'low',
164
+ context: context.metadata ? JSON.stringify(context.metadata) : undefined,
165
+ }));
166
+ }
167
+ compileRouter(config) {
168
+ // Convert config routing rules → runtime routing rules for the compiler
169
+ const runtimeRules = (config.routing?.rules ?? []).map((rule) => ({
170
+ workType: rule.workType ?? rule.pattern ?? 'unknown',
171
+ agents: rule.agents,
172
+ examples: rule.examples,
173
+ confidence: rule.confidence,
174
+ }));
175
+ const routingConfig = {
176
+ rules: runtimeRules,
177
+ governance: config.routing?.governance,
178
+ };
179
+ return compileRoutingRules(routingConfig);
180
+ }
181
+ async emit(type, sessionId, payload) {
182
+ if (!this.eventBus)
183
+ return;
184
+ await this.eventBus.emit({
185
+ type: type,
186
+ sessionId,
187
+ payload,
188
+ timestamp: new Date(),
189
+ });
190
+ }
191
+ }
192
+ //# sourceMappingURL=coordinator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../src/coordinator/coordinator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Direct Response Handler (M3-6, Issue #147)
3
+ *
4
+ * Handles simple queries that don't require agent spawning.
5
+ * Acts as a first-pass check in the coordinator pipeline —
6
+ * status queries, help requests, config questions, and team roster
7
+ * queries are answered directly without consuming agent sessions.
8
+ */
9
+ import type { SquadConfig } from '../runtime/config.js';
10
+ import type { EventBus } from '../runtime/event-bus.js';
11
+ /**
12
+ * Context for coordinator message handling.
13
+ */
14
+ export interface CoordinatorContext {
15
+ /** Current session ID (coordinator session) */
16
+ sessionId: string;
17
+ /** Squad configuration */
18
+ config: SquadConfig;
19
+ /** Event bus for observability */
20
+ eventBus?: EventBus;
21
+ /** Team roster content (team.md) */
22
+ teamRoster?: string;
23
+ /** Active agent names */
24
+ activeAgents?: string[];
25
+ /** User-provided metadata */
26
+ metadata?: Record<string, unknown>;
27
+ }
28
+ /**
29
+ * Result of a direct response.
30
+ */
31
+ export interface DirectResponseResult {
32
+ /** The response text to return to the user */
33
+ response: string;
34
+ /** Category of the matched pattern */
35
+ category: DirectResponseCategory;
36
+ /** Confidence in the match */
37
+ confidence: 'high' | 'medium';
38
+ }
39
+ /**
40
+ * Categories of messages handled directly.
41
+ */
42
+ export type DirectResponseCategory = 'status' | 'help' | 'config' | 'roster' | 'greeting';
43
+ /**
44
+ * A configurable pattern for direct response matching.
45
+ */
46
+ export interface DirectResponsePattern {
47
+ /** Category this pattern belongs to */
48
+ category: DirectResponseCategory;
49
+ /** Regex patterns that trigger this category */
50
+ patterns: RegExp[];
51
+ /** Handler that produces the response */
52
+ handler: (message: string, context: CoordinatorContext) => string;
53
+ }
54
+ /**
55
+ * Handles simple queries without spawning agents.
56
+ *
57
+ * The handler checks incoming messages against a set of configurable
58
+ * patterns. If a match is found, it produces a direct response without
59
+ * going through the routing → charter → spawn pipeline.
60
+ */
61
+ export declare class DirectResponseHandler {
62
+ private patterns;
63
+ constructor(customPatterns?: DirectResponsePattern[]);
64
+ /**
65
+ * Check whether a message should be handled directly (no agent spawn).
66
+ */
67
+ shouldHandleDirectly(message: string, config?: SquadConfig): boolean;
68
+ /**
69
+ * Handle a message directly and return a response.
70
+ * Should only be called after shouldHandleDirectly() returns true.
71
+ */
72
+ handleDirect(message: string, context: CoordinatorContext): DirectResponseResult;
73
+ /**
74
+ * Add a custom pattern at runtime.
75
+ */
76
+ addPattern(pattern: DirectResponsePattern): void;
77
+ /**
78
+ * Get all registered patterns.
79
+ */
80
+ getPatterns(): ReadonlyArray<DirectResponsePattern>;
81
+ private matchPattern;
82
+ }
83
+ //# sourceMappingURL=direct-response.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"direct-response.d.ts","sourceRoot":"","sources":["../../src/coordinator/direct-response.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAc,MAAM,yBAAyB,CAAC;AAIpE;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,0BAA0B;IAC1B,MAAM,EAAE,WAAW,CAAC;IACpB,kCAAkC;IAClC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,oCAAoC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,6BAA6B;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,sCAAsC;IACtC,QAAQ,EAAE,sBAAsB,CAAC;IACjC,8BAA8B;IAC9B,UAAU,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAC9B,QAAQ,GACR,MAAM,GACN,QAAQ,GACR,QAAQ,GACR,UAAU,CAAC;AAEf;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,uCAAuC;IACvC,QAAQ,EAAE,sBAAsB,CAAC;IACjC,gDAAgD;IAChD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,yCAAyC;IACzC,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,KAAK,MAAM,CAAC;CACnE;AA8FD;;;;;;GAMG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAA0B;gBAE9B,cAAc,CAAC,EAAE,qBAAqB,EAAE;IAIpD;;OAEG;IACH,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO;IAkBpE;;;OAGG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,GAAG,oBAAoB;IAmChF;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,qBAAqB,GAAG,IAAI;IAIhD;;OAEG;IACH,WAAW,IAAI,aAAa,CAAC,qBAAqB,CAAC;IAMnD,OAAO,CAAC,YAAY;CAUrB"}
@@ -0,0 +1,187 @@
1
+ /**
2
+ * Direct Response Handler (M3-6, Issue #147)
3
+ *
4
+ * Handles simple queries that don't require agent spawning.
5
+ * Acts as a first-pass check in the coordinator pipeline —
6
+ * status queries, help requests, config questions, and team roster
7
+ * queries are answered directly without consuming agent sessions.
8
+ */
9
+ // --- Default Patterns ---
10
+ const DEFAULT_PATTERNS = [
11
+ {
12
+ category: 'status',
13
+ patterns: [
14
+ /^(?:what(?:'s| is) the )?status\b/i,
15
+ /^(?:show|list|get)\s+(?:active\s+)?(?:agents?|sessions?|status)\b/i,
16
+ /^who(?:'s| is) (?:active|running|working)\b/i,
17
+ /^squad\s+status\b/i,
18
+ ],
19
+ handler: (_message, context) => {
20
+ const agents = context.activeAgents ?? [];
21
+ if (agents.length === 0) {
22
+ return 'No agents are currently active. Use a task request to spawn agents.';
23
+ }
24
+ return `Active agents (${agents.length}): ${agents.join(', ')}`;
25
+ },
26
+ },
27
+ {
28
+ category: 'help',
29
+ patterns: [
30
+ /^(?:help|how do I|what can you do|what commands|usage)\b/i,
31
+ /^(?:show|list)\s+(?:help|commands|capabilities)\b/i,
32
+ /^\?$/,
33
+ ],
34
+ handler: () => {
35
+ return [
36
+ '**Squad Coordinator** — I route work to specialist agents.',
37
+ '',
38
+ 'You can ask me to:',
39
+ '- Route tasks to specific agents (e.g., "ask Fenster to fix the build")',
40
+ '- Check team status (e.g., "status" or "who is active?")',
41
+ '- View the team roster (e.g., "show team" or "who is on the team?")',
42
+ '- View configuration (e.g., "show config" or "what model am I using?")',
43
+ '',
44
+ 'Or just describe what you need and I\'ll route it to the right agent.',
45
+ ].join('\n');
46
+ },
47
+ },
48
+ {
49
+ category: 'config',
50
+ patterns: [
51
+ /^(?:show|get|what(?:'s| is))\s+(?:the\s+)?(?:config|configuration|settings|model)\b/i,
52
+ /^(?:which|what)\s+model\b/i,
53
+ /^config\b/i,
54
+ ],
55
+ handler: (_message, context) => {
56
+ const cfg = context.config;
57
+ const model = cfg.models?.defaultModel ?? 'unknown';
58
+ const tier = cfg.models?.defaultTier ?? 'unknown';
59
+ const ruleCount = cfg.routing?.rules?.length ?? 0;
60
+ return [
61
+ `**Configuration** (v${cfg.version})`,
62
+ `- Default model: ${model} (${tier} tier)`,
63
+ `- Routing rules: ${ruleCount}`,
64
+ `- Tier ceiling respected: ${cfg.models?.respectTierCeiling ?? true}`,
65
+ ].join('\n');
66
+ },
67
+ },
68
+ {
69
+ category: 'roster',
70
+ patterns: [
71
+ /^(?:show|list|get|who(?:'s| is)(?: on)?)\s+(?:the\s+)?(?:team|roster|agents?|members?)\b/i,
72
+ /^team\b/i,
73
+ /^roster\b/i,
74
+ ],
75
+ handler: (_message, context) => {
76
+ if (context.teamRoster) {
77
+ return context.teamRoster;
78
+ }
79
+ const agents = context.activeAgents ?? [];
80
+ if (agents.length === 0) {
81
+ return 'No team roster available. Configure agents in your squad.config.ts.';
82
+ }
83
+ return `**Team Roster:** ${agents.join(', ')}`;
84
+ },
85
+ },
86
+ {
87
+ category: 'greeting',
88
+ patterns: [
89
+ /^(?:hi|hello|hey|good (?:morning|afternoon|evening)|yo|sup)\b/i,
90
+ /^(?:hi|hello|hey)!?$/i,
91
+ ],
92
+ handler: () => {
93
+ return 'Hello! I\'m the Squad coordinator. Describe what you need and I\'ll route it to the right agent, or type "help" for options.';
94
+ },
95
+ },
96
+ ];
97
+ // --- Direct Response Handler ---
98
+ /**
99
+ * Handles simple queries without spawning agents.
100
+ *
101
+ * The handler checks incoming messages against a set of configurable
102
+ * patterns. If a match is found, it produces a direct response without
103
+ * going through the routing → charter → spawn pipeline.
104
+ */
105
+ export class DirectResponseHandler {
106
+ patterns;
107
+ constructor(customPatterns) {
108
+ this.patterns = customPatterns ?? DEFAULT_PATTERNS;
109
+ }
110
+ /**
111
+ * Check whether a message should be handled directly (no agent spawn).
112
+ */
113
+ shouldHandleDirectly(message, config) {
114
+ const trimmed = message.trim();
115
+ if (trimmed.length === 0)
116
+ return false;
117
+ // Check configurable patterns from squad config
118
+ if (config?.routing?.rules) {
119
+ for (const rule of config.routing.rules) {
120
+ if (rule.workType === 'direct' || rule.tier === 'direct') {
121
+ // Rules explicitly marked as 'direct' tier mean
122
+ // the coordinator should handle them, but we still
123
+ // fall through to pattern matching below.
124
+ }
125
+ }
126
+ }
127
+ return this.matchPattern(trimmed) !== undefined;
128
+ }
129
+ /**
130
+ * Handle a message directly and return a response.
131
+ * Should only be called after shouldHandleDirectly() returns true.
132
+ */
133
+ handleDirect(message, context) {
134
+ const trimmed = message.trim();
135
+ const match = this.matchPattern(trimmed);
136
+ if (!match) {
137
+ return {
138
+ response: 'I\'m not sure how to handle that directly. Let me route it to an agent.',
139
+ category: 'help',
140
+ confidence: 'medium',
141
+ };
142
+ }
143
+ const response = match.handler(trimmed, context);
144
+ // Emit event for observability
145
+ if (context.eventBus) {
146
+ context.eventBus.emit({
147
+ type: 'coordinator:routing',
148
+ sessionId: context.sessionId,
149
+ payload: {
150
+ decision: 'direct',
151
+ category: match.category,
152
+ messageLength: trimmed.length,
153
+ },
154
+ timestamp: new Date(),
155
+ });
156
+ }
157
+ return {
158
+ response,
159
+ category: match.category,
160
+ confidence: 'high',
161
+ };
162
+ }
163
+ /**
164
+ * Add a custom pattern at runtime.
165
+ */
166
+ addPattern(pattern) {
167
+ this.patterns.push(pattern);
168
+ }
169
+ /**
170
+ * Get all registered patterns.
171
+ */
172
+ getPatterns() {
173
+ return this.patterns;
174
+ }
175
+ // --- Private ---
176
+ matchPattern(message) {
177
+ for (const pattern of this.patterns) {
178
+ for (const regex of pattern.patterns) {
179
+ if (regex.test(message)) {
180
+ return pattern;
181
+ }
182
+ }
183
+ }
184
+ return undefined;
185
+ }
186
+ }
187
+ //# sourceMappingURL=direct-response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"direct-response.js","sourceRoot":"","sources":["../../src/coordinator/direct-response.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Parallel Fan-Out Session Spawning (M1-10, Issue #130)
3
+ *
4
+ * Spawns multiple agent sessions concurrently using Promise.allSettled
5
+ * for maximum throughput. Each spawn compiles charter → resolves model
6
+ * → creates session → sends initial message. Event aggregation collects
7
+ * all session events into coordinator's event bus. Error isolation ensures
8
+ * one session failure doesn't affect others.
9
+ */
10
+ import type { AgentCharter } from '../agents/index.js';
11
+ import type { EventBus } from '../client/event-bus.js';
12
+ import type { SessionPool } from '../client/session-pool.js';
13
+ export interface AgentSpawnConfig {
14
+ /** Agent name to spawn */
15
+ agentName: string;
16
+ /** Task description for the agent */
17
+ task: string;
18
+ /** Priority level */
19
+ priority?: 'low' | 'normal' | 'high' | 'critical';
20
+ /** Additional context to pass */
21
+ context?: string;
22
+ /** Model override (skips resolution) */
23
+ modelOverride?: string;
24
+ }
25
+ export interface SpawnResult {
26
+ /** Agent name that was spawned */
27
+ agentName: string;
28
+ /** Session ID if spawn succeeded */
29
+ sessionId?: string;
30
+ /** Spawn outcome */
31
+ status: 'success' | 'failed';
32
+ /** Error message if failed */
33
+ error?: string;
34
+ /** Start time */
35
+ startTime: Date;
36
+ /** End time */
37
+ endTime: Date;
38
+ }
39
+ export interface FanOutDependencies {
40
+ /** Charter compilation function */
41
+ compileCharter: (agentName: string) => Promise<AgentCharter>;
42
+ /** Model resolution function */
43
+ resolveModel: (charter: AgentCharter, override?: string) => Promise<string>;
44
+ /** Session creation function */
45
+ createSession: (config: any) => Promise<{
46
+ sessionId: string;
47
+ sendMessage: (opts: any) => Promise<void>;
48
+ }>;
49
+ /** Session pool for tracking */
50
+ sessionPool: SessionPool;
51
+ /** Event bus for aggregation */
52
+ eventBus: EventBus;
53
+ }
54
+ /**
55
+ * Spawn multiple agents in parallel using Promise.allSettled.
56
+ *
57
+ * Each spawn:
58
+ * 1. Compile charter.md → AgentCharter
59
+ * 2. Resolve model (override or charter or auto-select)
60
+ * 3. Create session via SquadClient
61
+ * 4. Send initial message with task and context
62
+ * 5. Aggregate events to coordinator's event bus
63
+ *
64
+ * Error isolation: one failure doesn't block others.
65
+ * Returns SpawnResult[] with outcomes for each agent.
66
+ *
67
+ * @param configs - Array of agent spawn configurations
68
+ * @param deps - Injected dependencies (charter compiler, model resolver, client)
69
+ * @returns Promise resolving to array of spawn results
70
+ */
71
+ export declare function spawnParallel(configs: AgentSpawnConfig[], deps: FanOutDependencies): Promise<SpawnResult[]>;
72
+ /**
73
+ * Subscribe to all events from a spawned session and forward them
74
+ * to the coordinator's event bus with agent context.
75
+ *
76
+ * @param sessionId - Session ID to subscribe to
77
+ * @param agentName - Agent name for context
78
+ * @param sessionEventEmitter - Session's event emitter (if available)
79
+ * @param coordinatorEventBus - Coordinator's event bus
80
+ */
81
+ export declare function aggregateSessionEvents(sessionId: string, agentName: string, sessionEventEmitter: any, // SquadSession
82
+ coordinatorEventBus: EventBus): void;
83
+ //# sourceMappingURL=fan-out.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fan-out.d.ts","sourceRoot":"","sources":["../../src/coordinator/fan-out.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAI7D,MAAM,WAAW,gBAAgB;IAC/B,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IAClD,iCAAiC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAID,MAAM,WAAW,WAAW;IAC1B,kCAAkC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB;IACpB,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC7B,8BAA8B;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB;IACjB,SAAS,EAAE,IAAI,CAAC;IAChB,eAAe;IACf,OAAO,EAAE,IAAI,CAAC;CACf;AAID,MAAM,WAAW,kBAAkB;IACjC,mCAAmC;IACnC,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IAC7D,gCAAgC;IAChC,YAAY,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5E,gCAAgC;IAChC,aAAa,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC,CAAC;IAC1G,gCAAgC;IAChC,WAAW,EAAE,WAAW,CAAC;IACzB,gCAAgC;IAChC,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAID;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,gBAAgB,EAAE,EAC3B,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,WAAW,EAAE,CAAC,CAmBxB;AAoGD;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,mBAAmB,EAAE,GAAG,EAAE,eAAe;AACzC,mBAAmB,EAAE,QAAQ,GAC5B,IAAI,CAuBN"}