@bradygaster/squad-sdk 0.6.2 → 0.8.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 (306) hide show
  1. package/README.md +296 -296
  2. package/dist/adapter/client.d.ts +225 -0
  3. package/dist/adapter/client.d.ts.map +1 -0
  4. package/dist/adapter/client.js +397 -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 +68 -0
  23. package/dist/agents/index.d.ts.map +1 -0
  24. package/dist/agents/index.js +74 -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 +258 -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 +198 -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 +37 -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 +53 -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 +369 -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 +174 -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 +47 -0
  159. package/dist/coordinator/index.d.ts.map +1 -0
  160. package/dist/coordinator/index.js +54 -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 +24 -1
  171. package/dist/index.d.ts.map +1 -1
  172. package/dist/index.js +23 -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 +56 -0
  207. package/dist/ralph/index.d.ts.map +1 -0
  208. package/dist/ralph/index.js +61 -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 +313 -0
  219. package/dist/runtime/config.d.ts.map +1 -0
  220. package/dist/runtime/config.js +466 -0
  221. package/dist/runtime/config.js.map +1 -0
  222. package/dist/runtime/cost-tracker.d.ts +73 -0
  223. package/dist/runtime/cost-tracker.d.ts.map +1 -0
  224. package/dist/runtime/cost-tracker.js +157 -0
  225. package/dist/runtime/cost-tracker.js.map +1 -0
  226. package/dist/runtime/event-bus.d.ts +190 -0
  227. package/dist/runtime/event-bus.d.ts.map +1 -0
  228. package/dist/runtime/event-bus.js +218 -0
  229. package/dist/runtime/event-bus.js.map +1 -0
  230. package/dist/runtime/health.d.ts +66 -0
  231. package/dist/runtime/health.d.ts.map +1 -0
  232. package/dist/runtime/health.js +111 -0
  233. package/dist/runtime/health.js.map +1 -0
  234. package/dist/runtime/i18n.d.ts +54 -0
  235. package/dist/runtime/i18n.d.ts.map +1 -0
  236. package/dist/runtime/i18n.js +126 -0
  237. package/dist/runtime/i18n.js.map +1 -0
  238. package/dist/runtime/offline.d.ts +64 -0
  239. package/dist/runtime/offline.d.ts.map +1 -0
  240. package/dist/runtime/offline.js +108 -0
  241. package/dist/runtime/offline.js.map +1 -0
  242. package/dist/runtime/streaming.d.ts +97 -0
  243. package/dist/runtime/streaming.d.ts.map +1 -0
  244. package/dist/runtime/streaming.js +156 -0
  245. package/dist/runtime/streaming.js.map +1 -0
  246. package/dist/runtime/telemetry.d.ts +82 -0
  247. package/dist/runtime/telemetry.d.ts.map +1 -0
  248. package/dist/runtime/telemetry.js +120 -0
  249. package/dist/runtime/telemetry.js.map +1 -0
  250. package/dist/sharing/agent-repo.d.ts +33 -0
  251. package/dist/sharing/agent-repo.d.ts.map +1 -0
  252. package/dist/sharing/agent-repo.js +79 -0
  253. package/dist/sharing/agent-repo.js.map +1 -0
  254. package/dist/sharing/cache.d.ts +36 -0
  255. package/dist/sharing/cache.d.ts.map +1 -0
  256. package/dist/sharing/cache.js +85 -0
  257. package/dist/sharing/cache.js.map +1 -0
  258. package/dist/sharing/conflicts.d.ts +32 -0
  259. package/dist/sharing/conflicts.d.ts.map +1 -0
  260. package/dist/sharing/conflicts.js +121 -0
  261. package/dist/sharing/conflicts.js.map +1 -0
  262. package/dist/sharing/export.d.ts +50 -0
  263. package/dist/sharing/export.d.ts.map +1 -0
  264. package/dist/sharing/export.js +156 -0
  265. package/dist/sharing/export.js.map +1 -0
  266. package/dist/sharing/history-split.d.ts +34 -0
  267. package/dist/sharing/history-split.d.ts.map +1 -0
  268. package/dist/sharing/history-split.js +101 -0
  269. package/dist/sharing/history-split.js.map +1 -0
  270. package/dist/sharing/import.d.ts +37 -0
  271. package/dist/sharing/import.d.ts.map +1 -0
  272. package/dist/sharing/import.js +138 -0
  273. package/dist/sharing/import.js.map +1 -0
  274. package/dist/sharing/index.d.ts +11 -0
  275. package/dist/sharing/index.d.ts.map +1 -0
  276. package/dist/sharing/index.js +11 -0
  277. package/dist/sharing/index.js.map +1 -0
  278. package/dist/sharing/versioning.d.ts +32 -0
  279. package/dist/sharing/versioning.d.ts.map +1 -0
  280. package/dist/sharing/versioning.js +64 -0
  281. package/dist/sharing/versioning.js.map +1 -0
  282. package/dist/skills/index.d.ts +49 -0
  283. package/dist/skills/index.d.ts.map +1 -0
  284. package/dist/skills/index.js +85 -0
  285. package/dist/skills/index.js.map +1 -0
  286. package/dist/skills/skill-loader.d.ts +56 -0
  287. package/dist/skills/skill-loader.d.ts.map +1 -0
  288. package/dist/skills/skill-loader.js +106 -0
  289. package/dist/skills/skill-loader.js.map +1 -0
  290. package/dist/skills/skill-source.d.ts +63 -0
  291. package/dist/skills/skill-source.d.ts.map +1 -0
  292. package/dist/skills/skill-source.js +199 -0
  293. package/dist/skills/skill-source.js.map +1 -0
  294. package/dist/tools/index.d.ts +87 -0
  295. package/dist/tools/index.d.ts.map +1 -0
  296. package/dist/tools/index.js +419 -0
  297. package/dist/tools/index.js.map +1 -0
  298. package/dist/types.d.ts +43 -0
  299. package/dist/types.d.ts.map +1 -0
  300. package/dist/types.js +8 -0
  301. package/dist/types.js.map +1 -0
  302. package/dist/utils/normalize-eol.d.ts +6 -0
  303. package/dist/utils/normalize-eol.d.ts.map +1 -0
  304. package/dist/utils/normalize-eol.js +8 -0
  305. package/dist/utils/normalize-eol.js.map +1 -0
  306. package/package.json +115 -39
@@ -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":"AAAA;;;;;;;GAOG;AA2DH,2BAA2B;AAE3B,MAAM,gBAAgB,GAA4B;IAChD;QACE,QAAQ,EAAE,QAAQ;QAClB,QAAQ,EAAE;YACR,oCAAoC;YACpC,oEAAoE;YACpE,8CAA8C;YAC9C,oBAAoB;SACrB;QACD,OAAO,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE;YAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC;YAC1C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,OAAO,qEAAqE,CAAC;YAC/E,CAAC;YACD,OAAO,kBAAkB,MAAM,CAAC,MAAM,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAClE,CAAC;KACF;IACD;QACE,QAAQ,EAAE,MAAM;QAChB,QAAQ,EAAE;YACR,2DAA2D;YAC3D,oDAAoD;YACpD,MAAM;SACP;QACD,OAAO,EAAE,GAAG,EAAE;YACZ,OAAO;gBACL,4DAA4D;gBAC5D,EAAE;gBACF,oBAAoB;gBACpB,yEAAyE;gBACzE,0DAA0D;gBAC1D,qEAAqE;gBACrE,wEAAwE;gBACxE,EAAE;gBACF,uEAAuE;aACxE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC;KACF;IACD;QACE,QAAQ,EAAE,QAAQ;QAClB,QAAQ,EAAE;YACR,sFAAsF;YACtF,4BAA4B;YAC5B,YAAY;SACb;QACD,OAAO,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE;YAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;YAC3B,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,EAAE,YAAY,IAAI,SAAS,CAAC;YACpD,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE,WAAW,IAAI,SAAS,CAAC;YAClD,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,CAAC;YAClD,OAAO;gBACL,uBAAuB,GAAG,CAAC,OAAO,GAAG;gBACrC,oBAAoB,KAAK,KAAK,IAAI,QAAQ;gBAC1C,oBAAoB,SAAS,EAAE;gBAC/B,6BAA6B,GAAG,CAAC,MAAM,EAAE,kBAAkB,IAAI,IAAI,EAAE;aACtE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC;KACF;IACD;QACE,QAAQ,EAAE,QAAQ;QAClB,QAAQ,EAAE;YACR,2FAA2F;YAC3F,UAAU;YACV,YAAY;SACb;QACD,OAAO,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE;YAC7B,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBACvB,OAAO,OAAO,CAAC,UAAU,CAAC;YAC5B,CAAC;YACD,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC;YAC1C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,OAAO,qEAAqE,CAAC;YAC/E,CAAC;YACD,OAAO,oBAAoB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACjD,CAAC;KACF;IACD;QACE,QAAQ,EAAE,UAAU;QACpB,QAAQ,EAAE;YACR,gEAAgE;YAChE,uBAAuB;SACxB;QACD,OAAO,EAAE,GAAG,EAAE;YACZ,OAAO,8HAA8H,CAAC;QACxI,CAAC;KACF;CACF,CAAC;AAEF,kCAAkC;AAElC;;;;;;GAMG;AACH,MAAM,OAAO,qBAAqB;IACxB,QAAQ,CAA0B;IAE1C,YAAY,cAAwC;QAClD,IAAI,CAAC,QAAQ,GAAG,cAAc,IAAI,gBAAgB,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,oBAAoB,CAAC,OAAe,EAAE,MAAoB;QACxD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAEvC,gDAAgD;QAChD,IAAI,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YAC3B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACxC,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAK,IAAY,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAClE,gDAAgD;oBAChD,mDAAmD;oBACnD,0CAA0C;gBAC5C,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC;IAClD,CAAC;IAED;;;OAGG;IACH,YAAY,CAAC,OAAe,EAAE,OAA2B;QACvD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAEzC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;gBACL,QAAQ,EAAE,yEAAyE;gBACnF,QAAQ,EAAE,MAAM;gBAChB,UAAU,EAAE,QAAQ;aACrB,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAEjD,+BAA+B;QAC/B,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACpB,IAAI,EAAE,qBAA2C;gBACjD,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,OAAO,EAAE;oBACP,QAAQ,EAAE,QAAQ;oBAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,aAAa,EAAE,OAAO,CAAC,MAAM;iBAC9B;gBACD,SAAS,EAAE,IAAI,IAAI,EAAE;aACtB,CAAC,CAAC;QACL,CAAC;QAED,OAAO;YACL,QAAQ;YACR,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,UAAU,EAAE,MAAM;SACnB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,OAA8B;QACvC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,kBAAkB;IAEV,YAAY,CAAC,OAAe;QAClC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACrC,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;oBACxB,OAAO,OAAO,CAAC;gBACjB,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
@@ -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"}
@@ -0,0 +1,161 @@
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
+ // --- Fan-Out Orchestrator ---
11
+ /**
12
+ * Spawn multiple agents in parallel using Promise.allSettled.
13
+ *
14
+ * Each spawn:
15
+ * 1. Compile charter.md → AgentCharter
16
+ * 2. Resolve model (override or charter or auto-select)
17
+ * 3. Create session via SquadClient
18
+ * 4. Send initial message with task and context
19
+ * 5. Aggregate events to coordinator's event bus
20
+ *
21
+ * Error isolation: one failure doesn't block others.
22
+ * Returns SpawnResult[] with outcomes for each agent.
23
+ *
24
+ * @param configs - Array of agent spawn configurations
25
+ * @param deps - Injected dependencies (charter compiler, model resolver, client)
26
+ * @returns Promise resolving to array of spawn results
27
+ */
28
+ export async function spawnParallel(configs, deps) {
29
+ const spawnPromises = configs.map(config => spawnSingle(config, deps));
30
+ const settledResults = await Promise.allSettled(spawnPromises);
31
+ return settledResults.map((result, index) => {
32
+ if (result.status === 'fulfilled') {
33
+ return result.value;
34
+ }
35
+ else {
36
+ // Rejection from spawnSingle shouldn't happen (it catches internally),
37
+ // but handle defensively
38
+ return {
39
+ agentName: configs[index].agentName,
40
+ status: 'failed',
41
+ error: result.reason?.message || String(result.reason),
42
+ startTime: new Date(),
43
+ endTime: new Date(),
44
+ };
45
+ }
46
+ });
47
+ }
48
+ /**
49
+ * Spawn a single agent session.
50
+ * Catches all errors and returns a SpawnResult (never rejects).
51
+ */
52
+ async function spawnSingle(config, deps) {
53
+ const startTime = new Date();
54
+ try {
55
+ // Step 1: Compile charter
56
+ const charter = await deps.compileCharter(config.agentName);
57
+ // Step 2: Resolve model
58
+ const model = config.modelOverride
59
+ ? config.modelOverride
60
+ : await deps.resolveModel(charter, config.modelOverride);
61
+ // Step 3: Create session
62
+ const session = await deps.createSession({
63
+ model,
64
+ clientName: `squad-agent-${config.agentName}`,
65
+ });
66
+ // Step 4: Register in session pool
67
+ deps.sessionPool.add({
68
+ id: session.sessionId,
69
+ agentName: config.agentName,
70
+ status: 'active',
71
+ createdAt: startTime,
72
+ });
73
+ // Step 5: Send initial task message
74
+ const initialPrompt = buildInitialPrompt(config);
75
+ await session.sendMessage({
76
+ prompt: initialPrompt,
77
+ mode: 'immediate',
78
+ });
79
+ // Step 6: Emit spawn success event
80
+ await deps.eventBus.emit({
81
+ type: 'session.created',
82
+ sessionId: session.sessionId,
83
+ payload: { agentName: config.agentName, priority: config.priority || 'normal' },
84
+ timestamp: new Date(),
85
+ });
86
+ return {
87
+ agentName: config.agentName,
88
+ sessionId: session.sessionId,
89
+ status: 'success',
90
+ startTime,
91
+ endTime: new Date(),
92
+ };
93
+ }
94
+ catch (error) {
95
+ // Error isolation: one spawn failure doesn't affect others
96
+ const errorMessage = error instanceof Error ? error.message : String(error);
97
+ await deps.eventBus.emit({
98
+ type: 'session.error',
99
+ sessionId: undefined,
100
+ payload: { agentName: config.agentName, error: errorMessage },
101
+ timestamp: new Date(),
102
+ });
103
+ return {
104
+ agentName: config.agentName,
105
+ status: 'failed',
106
+ error: errorMessage,
107
+ startTime,
108
+ endTime: new Date(),
109
+ };
110
+ }
111
+ }
112
+ /**
113
+ * Build the initial prompt message for a spawned agent.
114
+ * Includes task, priority, and optional context.
115
+ */
116
+ function buildInitialPrompt(config) {
117
+ const parts = [];
118
+ if (config.priority && config.priority !== 'normal') {
119
+ parts.push(`**Priority:** ${config.priority.toUpperCase()}`);
120
+ }
121
+ parts.push('', `**Task:**`, config.task);
122
+ if (config.context) {
123
+ parts.push('', `**Context:**`, config.context);
124
+ }
125
+ return parts.join('\n');
126
+ }
127
+ // --- Event Aggregation Helper ---
128
+ /**
129
+ * Subscribe to all events from a spawned session and forward them
130
+ * to the coordinator's event bus with agent context.
131
+ *
132
+ * @param sessionId - Session ID to subscribe to
133
+ * @param agentName - Agent name for context
134
+ * @param sessionEventEmitter - Session's event emitter (if available)
135
+ * @param coordinatorEventBus - Coordinator's event bus
136
+ */
137
+ export function aggregateSessionEvents(sessionId, agentName, sessionEventEmitter, // SquadSession
138
+ coordinatorEventBus) {
139
+ // Forward all session events to coordinator's event bus
140
+ const eventTypes = [
141
+ 'message.delta',
142
+ 'message.complete',
143
+ 'tool.start',
144
+ 'tool.complete',
145
+ 'session.error',
146
+ 'session.complete',
147
+ ];
148
+ for (const eventType of eventTypes) {
149
+ if (sessionEventEmitter.on) {
150
+ sessionEventEmitter.on(eventType, (event) => {
151
+ coordinatorEventBus.emit({
152
+ type: eventType,
153
+ sessionId,
154
+ payload: { agentName, ...event },
155
+ timestamp: new Date(),
156
+ });
157
+ });
158
+ }
159
+ }
160
+ }
161
+ //# sourceMappingURL=fan-out.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fan-out.js","sourceRoot":"","sources":["../../src/coordinator/fan-out.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Coordinator Orchestrator (PRD 5)
3
+ *
4
+ * The central orchestration engine. Replaces the 32KB squad.agent.md
5
+ * prompt-based coordinator with a TypeScript program that manages
6
+ * agent sessions, routes work, and observes progress via SDK events.
7
+ */
8
+ export { SquadCoordinator, type SquadCoordinatorOptions, type CoordinatorResult, type SpawnStrategy, type CoordinatorContext, } from './coordinator.js';
9
+ export { DirectResponseHandler, type DirectResponseResult, type DirectResponseCategory, type DirectResponsePattern, } from './direct-response.js';
10
+ export { spawnParallel, aggregateSessionEvents, type AgentSpawnConfig, type SpawnResult, type FanOutDependencies, } from './fan-out.js';
11
+ export type ResponseTier = 'direct' | 'lightweight' | 'standard' | 'full';
12
+ export interface RoutingDecision {
13
+ /** Tier of response based on complexity */
14
+ tier: ResponseTier;
15
+ /** Target agent(s) for this request */
16
+ agents: string[];
17
+ /** Whether agents should run in parallel */
18
+ parallel: boolean;
19
+ /** Routing rationale (for observability) */
20
+ rationale: string;
21
+ }
22
+ export interface CoordinatorConfig {
23
+ /** Path to the team root (.squad/ directory) */
24
+ teamRoot: string;
25
+ /** Default model for routing decisions */
26
+ model?: string;
27
+ /** Enable parallel fan-out for multi-agent tasks */
28
+ enableParallel?: boolean;
29
+ }
30
+ export declare class Coordinator {
31
+ private client;
32
+ private eventBus;
33
+ private agentManager;
34
+ private hookPipeline;
35
+ private toolRegistry;
36
+ private config;
37
+ constructor(config: CoordinatorConfig);
38
+ /** Initialize the coordinator: connect client, load team, register hooks */
39
+ initialize(): Promise<void>;
40
+ /** Route an incoming user message to the appropriate agent(s) */
41
+ route(message: string): Promise<RoutingDecision>;
42
+ /** Execute a routing decision: spawn/resume agents and deliver work */
43
+ execute(decision: RoutingDecision, message: string): Promise<void>;
44
+ /** Graceful shutdown */
45
+ shutdown(): Promise<void>;
46
+ }
47
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/coordinator/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EACL,gBAAgB,EAChB,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,kBAAkB,GACxB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,qBAAqB,EACrB,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,GAC3B,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,aAAa,EACb,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,kBAAkB,GACxB,MAAM,cAAc,CAAC;AAYtB,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,aAAa,GAAG,UAAU,GAAG,MAAM,CAAC;AAE1E,MAAM,WAAW,eAAe;IAC9B,2CAA2C;IAC3C,IAAI,EAAE,YAAY,CAAC;IACnB,uCAAuC;IACvC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,4CAA4C;IAC5C,QAAQ,EAAE,OAAO,CAAC;IAClB,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,gDAAgD;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAID,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,YAAY,CAAoC;IACxD,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,MAAM,CAAoB;gBAEtB,MAAM,EAAE,iBAAiB;IAKrC,4EAA4E;IACtE,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IASjC,iEAAiE;IAC3D,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAOtD,uEAAuE;IACjE,OAAO,CAAC,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMxE,wBAAwB;IAClB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAIhC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Coordinator Orchestrator (PRD 5)
3
+ *
4
+ * The central orchestration engine. Replaces the 32KB squad.agent.md
5
+ * prompt-based coordinator with a TypeScript program that manages
6
+ * agent sessions, routes work, and observes progress via SDK events.
7
+ */
8
+ // --- M3-1 Coordinator ---
9
+ export { SquadCoordinator, } from './coordinator.js';
10
+ // --- M3-6 Direct Response ---
11
+ export { DirectResponseHandler, } from './direct-response.js';
12
+ // --- M1-10 Fan-Out ---
13
+ export { spawnParallel, aggregateSessionEvents, } from './fan-out.js';
14
+ // --- Coordinator ---
15
+ export class Coordinator {
16
+ client = null;
17
+ eventBus = null;
18
+ agentManager = null;
19
+ hookPipeline = null;
20
+ toolRegistry = null;
21
+ config;
22
+ constructor(config) {
23
+ this.config = config;
24
+ // TODO: PRD 5 — Accept injected dependencies (client, eventBus, agentManager, hooks, tools)
25
+ }
26
+ /** Initialize the coordinator: connect client, load team, register hooks */
27
+ async initialize() {
28
+ // TODO: PRD 5 — Initialize SquadClient and connect
29
+ // TODO: PRD 5 — Load all agent charters via CharterCompiler
30
+ // TODO: PRD 5 — Register custom tools via ToolRegistry
31
+ // TODO: PRD 5 — Set up hook pipeline
32
+ // TODO: PRD 5 — Subscribe to EventBus for agent lifecycle events
33
+ // TODO: PRD 5 — Create coordinator's own session for routing logic
34
+ }
35
+ /** Route an incoming user message to the appropriate agent(s) */
36
+ async route(message) {
37
+ // TODO: PRD 5 — Determine response tier (direct/lightweight/standard/full)
38
+ // TODO: PRD 5 — Select target agent(s) based on message content and team roster
39
+ // TODO: PRD 5 — Handle parallel fan-out for multi-agent tasks
40
+ throw new Error('Not implemented');
41
+ }
42
+ /** Execute a routing decision: spawn/resume agents and deliver work */
43
+ async execute(decision, message) {
44
+ // TODO: PRD 5 — Spawn or resume agent sessions per decision
45
+ // TODO: PRD 5 — Deliver message via sendAndWait()
46
+ // TODO: PRD 5 — Monitor progress via event subscriptions
47
+ }
48
+ /** Graceful shutdown */
49
+ async shutdown() {
50
+ // TODO: PRD 5 — Destroy all agent sessions
51
+ // TODO: PRD 5 — Disconnect client
52
+ }
53
+ }
54
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/coordinator/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,2BAA2B;AAC3B,OAAO,EACL,gBAAgB,GAKjB,MAAM,kBAAkB,CAAC;AAE1B,+BAA+B;AAC/B,OAAO,EACL,qBAAqB,GAItB,MAAM,sBAAsB,CAAC;AAE9B,wBAAwB;AACxB,OAAO,EACL,aAAa,EACb,sBAAsB,GAIvB,MAAM,cAAc,CAAC;AAkCtB,sBAAsB;AAEtB,MAAM,OAAO,WAAW;IACd,MAAM,GAAuB,IAAI,CAAC;IAClC,QAAQ,GAAoB,IAAI,CAAC;IACjC,YAAY,GAA+B,IAAI,CAAC;IAChD,YAAY,GAAwB,IAAI,CAAC;IACzC,YAAY,GAAwB,IAAI,CAAC;IACzC,MAAM,CAAoB;IAElC,YAAY,MAAyB;QACnC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,4FAA4F;IAC9F,CAAC;IAED,4EAA4E;IAC5E,KAAK,CAAC,UAAU;QACd,mDAAmD;QACnD,4DAA4D;QAC5D,uDAAuD;QACvD,qCAAqC;QACrC,iEAAiE;QACjE,mEAAmE;IACrE,CAAC;IAED,iEAAiE;IACjE,KAAK,CAAC,KAAK,CAAC,OAAe;QACzB,2EAA2E;QAC3E,gFAAgF;QAChF,8DAA8D;QAC9D,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACrC,CAAC;IAED,uEAAuE;IACvE,KAAK,CAAC,OAAO,CAAC,QAAyB,EAAE,OAAe;QACtD,4DAA4D;QAC5D,kDAAkD;QAClD,yDAAyD;IAC3D,CAAC;IAED,wBAAwB;IACxB,KAAK,CAAC,QAAQ;QACZ,2CAA2C;QAC3C,kCAAkC;IACpC,CAAC;CACF"}