@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,170 @@
1
+ /**
2
+ * Squad Client — High-Level API with Session Pool Management (PRD 1)
3
+ *
4
+ * This module provides the main Squad client API that combines:
5
+ * - SquadClient adapter (from adapter/client.ts) for connection management
6
+ * - SessionPool for multi-session lifecycle management
7
+ * - EventBus for cross-session event handling
8
+ *
9
+ * Applications should import from this module, not from adapter/ directly.
10
+ */
11
+ // Re-export core types and classes from adapter layer
12
+ export { SquadClient, } from '../adapter/client.js';
13
+ // Re-export pool and event bus
14
+ export { SessionPool, DEFAULT_POOL_CONFIG } from './session-pool.js';
15
+ export { EventBus } from './event-bus.js';
16
+ // --- High-Level Client with Pool Management ---
17
+ import { SquadClient as BaseSquadClient } from '../adapter/client.js';
18
+ import { SessionPool } from './session-pool.js';
19
+ import { EventBus } from './event-bus.js';
20
+ /**
21
+ * Squad Client with integrated session pool management.
22
+ *
23
+ * This is the recommended client for applications that need to manage
24
+ * multiple concurrent agent sessions. It provides:
25
+ * - Connection lifecycle management (from SquadClient)
26
+ * - Session pool with capacity limits and health checks
27
+ * - Event bus for cross-session event handling
28
+ *
29
+ * @example
30
+ * ```typescript
31
+ * const client = new SquadClientWithPool({
32
+ * pool: { maxConcurrent: 5 }
33
+ * });
34
+ *
35
+ * await client.connect();
36
+ *
37
+ * const session1 = await client.createSession({ model: 'claude-sonnet-4.5' });
38
+ * const session2 = await client.createSession({ model: 'claude-haiku-4.5' });
39
+ *
40
+ * client.eventBus.on('session.created', (event) => {
41
+ * console.log('New session:', event.sessionId);
42
+ * });
43
+ *
44
+ * await client.shutdown();
45
+ * ```
46
+ */
47
+ export class SquadClientWithPool {
48
+ baseClient;
49
+ pool;
50
+ eventBus;
51
+ constructor(config = {}) {
52
+ this.baseClient = new BaseSquadClient(config);
53
+ this.pool = new SessionPool(config.pool);
54
+ this.eventBus = new EventBus();
55
+ // Wire pool events to event bus
56
+ this.pool.on((event) => {
57
+ this.eventBus.emit({
58
+ type: event.type,
59
+ sessionId: event.sessionId,
60
+ payload: event,
61
+ timestamp: event.timestamp,
62
+ });
63
+ });
64
+ }
65
+ /** Connect to the Copilot CLI server */
66
+ async connect() {
67
+ return this.baseClient.connect();
68
+ }
69
+ /** Disconnect from the Copilot CLI server */
70
+ async disconnect() {
71
+ await this.pool.shutdown();
72
+ return this.baseClient.disconnect();
73
+ }
74
+ /** Force disconnect without graceful cleanup */
75
+ async forceDisconnect() {
76
+ await this.pool.shutdown();
77
+ return this.baseClient.forceDisconnect();
78
+ }
79
+ /** Get current connection state */
80
+ getState() {
81
+ return this.baseClient.getState();
82
+ }
83
+ /** Check if connected */
84
+ isConnected() {
85
+ return this.baseClient.isConnected();
86
+ }
87
+ /**
88
+ * Create a new session and add it to the pool.
89
+ * Throws if the pool is at capacity.
90
+ */
91
+ async createSession(config = {}) {
92
+ const session = await this.baseClient.createSession(config);
93
+ // Convert to pool-compatible session format
94
+ const poolSession = {
95
+ id: session.sessionId,
96
+ agentName: config.model ?? 'default',
97
+ status: 'active',
98
+ createdAt: new Date(),
99
+ };
100
+ this.pool.add(poolSession);
101
+ await this.eventBus.emit({
102
+ type: 'session.created',
103
+ sessionId: session.sessionId,
104
+ payload: { session },
105
+ timestamp: new Date(),
106
+ });
107
+ return session;
108
+ }
109
+ /**
110
+ * Resume an existing session and add it to the pool if not present.
111
+ */
112
+ async resumeSession(sessionId, config = {}) {
113
+ const session = await this.baseClient.resumeSession(sessionId, config);
114
+ if (!this.pool.get(sessionId)) {
115
+ const poolSession = {
116
+ id: session.sessionId,
117
+ agentName: config.model ?? 'resumed',
118
+ status: 'active',
119
+ createdAt: new Date(),
120
+ };
121
+ this.pool.add(poolSession);
122
+ }
123
+ return session;
124
+ }
125
+ /**
126
+ * Delete a session and remove it from the pool.
127
+ */
128
+ async deleteSession(sessionId) {
129
+ await this.baseClient.deleteSession(sessionId);
130
+ this.pool.remove(sessionId);
131
+ await this.eventBus.emit({
132
+ type: 'session.destroyed',
133
+ sessionId,
134
+ payload: null,
135
+ timestamp: new Date(),
136
+ });
137
+ }
138
+ /** List all sessions from the base client */
139
+ async listSessions() {
140
+ return this.baseClient.listSessions();
141
+ }
142
+ /** Send a ping to verify connectivity */
143
+ async ping(message) {
144
+ return this.baseClient.ping(message);
145
+ }
146
+ /** Get CLI status information */
147
+ async getStatus() {
148
+ return this.baseClient.getStatus();
149
+ }
150
+ /** Get authentication status */
151
+ async getAuthStatus() {
152
+ return this.baseClient.getAuthStatus();
153
+ }
154
+ /** List available models */
155
+ async listModels() {
156
+ return this.baseClient.listModels();
157
+ }
158
+ /** Subscribe to session lifecycle events */
159
+ on(eventType, handler) {
160
+ return this.baseClient.on(eventType, handler);
161
+ }
162
+ /**
163
+ * Graceful shutdown — destroy all sessions and disconnect.
164
+ */
165
+ async shutdown() {
166
+ await this.pool.shutdown();
167
+ await this.baseClient.disconnect();
168
+ }
169
+ }
170
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Session Pool Manager (PRD 1)
3
+ *
4
+ * Manages the lifecycle of multiple concurrent agent sessions.
5
+ * Tracks session state, enforces concurrency limits, and handles
6
+ * cleanup of idle/errored sessions.
7
+ */
8
+ export type SessionStatus = 'creating' | 'active' | 'idle' | 'error' | 'destroyed';
9
+ export interface SquadSession {
10
+ id: string;
11
+ agentName: string;
12
+ status: SessionStatus;
13
+ createdAt: Date;
14
+ }
15
+ export interface SessionPoolConfig {
16
+ /** Maximum concurrent sessions */
17
+ maxConcurrent: number;
18
+ /** Idle timeout before auto-cleanup (ms) */
19
+ idleTimeout: number;
20
+ /** Health check interval (ms) */
21
+ healthCheckInterval: number;
22
+ }
23
+ export declare const DEFAULT_POOL_CONFIG: SessionPoolConfig;
24
+ export type PoolEventType = 'session.added' | 'session.removed' | 'session.status_changed' | 'pool.at_capacity' | 'pool.health_check';
25
+ export interface PoolEvent {
26
+ type: PoolEventType;
27
+ sessionId?: string;
28
+ oldStatus?: SessionStatus;
29
+ newStatus?: SessionStatus;
30
+ timestamp: Date;
31
+ }
32
+ export declare class SessionPool {
33
+ private config;
34
+ private sessions;
35
+ private healthCheckTimer;
36
+ private cleanupTimer;
37
+ private listeners;
38
+ constructor(config?: Partial<SessionPoolConfig>);
39
+ /** Add a session to the pool */
40
+ add(session: SquadSession): void;
41
+ /** Remove a session from the pool */
42
+ remove(sessionId: string): boolean;
43
+ /** Get a session by ID */
44
+ get(sessionId: string): SquadSession | undefined;
45
+ /** Find a session by agent name */
46
+ findByAgent(agentName: string): SquadSession | undefined;
47
+ /** Get all active sessions */
48
+ active(): SquadSession[];
49
+ /** Update session status and emit event */
50
+ updateStatus(sessionId: string, newStatus: SessionStatus): void;
51
+ /** Current pool size */
52
+ get size(): number;
53
+ /** Whether the pool is at capacity */
54
+ get atCapacity(): boolean;
55
+ /** Destroy all sessions and stop timers */
56
+ shutdown(): Promise<void>;
57
+ /** Subscribe to pool events */
58
+ on(handler: (event: PoolEvent) => void): () => void;
59
+ /** Emit a pool event to all listeners */
60
+ private emitEvent;
61
+ /** Start the health check timer */
62
+ private startHealthCheckTimer;
63
+ /** Start the idle session cleanup timer */
64
+ private startCleanupTimer;
65
+ }
66
+ //# sourceMappingURL=session-pool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-pool.d.ts","sourceRoot":"","sources":["../../src/client/session-pool.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,WAAW,CAAC;AAEnF,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,EAAE,IAAI,CAAC;CACjB;AAID,MAAM,WAAW,iBAAiB;IAChC,kCAAkC;IAClC,aAAa,EAAE,MAAM,CAAC;IAEtB,4CAA4C;IAC5C,WAAW,EAAE,MAAM,CAAC;IAEpB,iCAAiC;IACjC,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,eAAO,MAAM,mBAAmB,EAAE,iBAIjC,CAAC;AAIF,MAAM,MAAM,aAAa,GACrB,eAAe,GACf,iBAAiB,GACjB,wBAAwB,GACxB,kBAAkB,GAClB,mBAAmB,CAAC;AAExB,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,SAAS,EAAE,IAAI,CAAC;CACjB;AAID,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,QAAQ,CAAwC;IACxD,OAAO,CAAC,gBAAgB,CAA+B;IACvD,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,SAAS,CAAyC;gBAE9C,MAAM,GAAE,OAAO,CAAC,iBAAiB,CAAM;IAMnD,gCAAgC;IAChC,GAAG,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAgBhC,qCAAqC;IACrC,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAYlC,0BAA0B;IAC1B,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIhD,mCAAmC;IACnC,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAOxD,8BAA8B;IAC9B,MAAM,IAAI,YAAY,EAAE;IAIxB,2CAA2C;IAC3C,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,GAAG,IAAI;IAiB/D,wBAAwB;IACxB,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,sCAAsC;IACtC,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,2CAA2C;IACrC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAY/B,+BAA+B;IAC/B,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,GAAG,MAAM,IAAI;IAQnD,yCAAyC;IACzC,OAAO,CAAC,SAAS;IAMjB,mCAAmC;IACnC,OAAO,CAAC,qBAAqB;IAS7B,2CAA2C;IAC3C,OAAO,CAAC,iBAAiB;CAa1B"}
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Session Pool Manager (PRD 1)
3
+ *
4
+ * Manages the lifecycle of multiple concurrent agent sessions.
5
+ * Tracks session state, enforces concurrency limits, and handles
6
+ * cleanup of idle/errored sessions.
7
+ */
8
+ export const DEFAULT_POOL_CONFIG = {
9
+ maxConcurrent: 10,
10
+ idleTimeout: 300_000, // 5 minutes
11
+ healthCheckInterval: 30_000, // 30 seconds
12
+ };
13
+ // --- Session Pool ---
14
+ export class SessionPool {
15
+ config;
16
+ sessions = new Map();
17
+ healthCheckTimer = null;
18
+ cleanupTimer = null;
19
+ listeners = [];
20
+ constructor(config = {}) {
21
+ this.config = { ...DEFAULT_POOL_CONFIG, ...config };
22
+ this.startHealthCheckTimer();
23
+ this.startCleanupTimer();
24
+ }
25
+ /** Add a session to the pool */
26
+ add(session) {
27
+ if (this.atCapacity) {
28
+ this.emitEvent({
29
+ type: 'pool.at_capacity',
30
+ timestamp: new Date(),
31
+ });
32
+ throw new Error(`SessionPool at capacity (${this.config.maxConcurrent})`);
33
+ }
34
+ this.sessions.set(session.id, session);
35
+ this.emitEvent({
36
+ type: 'session.added',
37
+ sessionId: session.id,
38
+ timestamp: new Date(),
39
+ });
40
+ }
41
+ /** Remove a session from the pool */
42
+ remove(sessionId) {
43
+ const existed = this.sessions.delete(sessionId);
44
+ if (existed) {
45
+ this.emitEvent({
46
+ type: 'session.removed',
47
+ sessionId,
48
+ timestamp: new Date(),
49
+ });
50
+ }
51
+ return existed;
52
+ }
53
+ /** Get a session by ID */
54
+ get(sessionId) {
55
+ return this.sessions.get(sessionId);
56
+ }
57
+ /** Find a session by agent name */
58
+ findByAgent(agentName) {
59
+ for (const session of this.sessions.values()) {
60
+ if (session.agentName === agentName)
61
+ return session;
62
+ }
63
+ return undefined;
64
+ }
65
+ /** Get all active sessions */
66
+ active() {
67
+ return Array.from(this.sessions.values()).filter(s => s.status === 'active');
68
+ }
69
+ /** Update session status and emit event */
70
+ updateStatus(sessionId, newStatus) {
71
+ const session = this.sessions.get(sessionId);
72
+ if (!session)
73
+ return;
74
+ const oldStatus = session.status;
75
+ if (oldStatus !== newStatus) {
76
+ session.status = newStatus;
77
+ this.emitEvent({
78
+ type: 'session.status_changed',
79
+ sessionId,
80
+ oldStatus,
81
+ newStatus,
82
+ timestamp: new Date(),
83
+ });
84
+ }
85
+ }
86
+ /** Current pool size */
87
+ get size() {
88
+ return this.sessions.size;
89
+ }
90
+ /** Whether the pool is at capacity */
91
+ get atCapacity() {
92
+ return this.sessions.size >= this.config.maxConcurrent;
93
+ }
94
+ /** Destroy all sessions and stop timers */
95
+ async shutdown() {
96
+ if (this.healthCheckTimer) {
97
+ clearInterval(this.healthCheckTimer);
98
+ this.healthCheckTimer = null;
99
+ }
100
+ if (this.cleanupTimer) {
101
+ clearInterval(this.cleanupTimer);
102
+ this.cleanupTimer = null;
103
+ }
104
+ this.sessions.clear();
105
+ }
106
+ /** Subscribe to pool events */
107
+ on(handler) {
108
+ this.listeners.push(handler);
109
+ return () => {
110
+ const index = this.listeners.indexOf(handler);
111
+ if (index !== -1)
112
+ this.listeners.splice(index, 1);
113
+ };
114
+ }
115
+ /** Emit a pool event to all listeners */
116
+ emitEvent(event) {
117
+ for (const listener of this.listeners) {
118
+ listener(event);
119
+ }
120
+ }
121
+ /** Start the health check timer */
122
+ startHealthCheckTimer() {
123
+ this.healthCheckTimer = setInterval(() => {
124
+ this.emitEvent({
125
+ type: 'pool.health_check',
126
+ timestamp: new Date(),
127
+ });
128
+ }, this.config.healthCheckInterval);
129
+ }
130
+ /** Start the idle session cleanup timer */
131
+ startCleanupTimer() {
132
+ this.cleanupTimer = setInterval(() => {
133
+ const now = Date.now();
134
+ for (const session of this.sessions.values()) {
135
+ if (session.status === 'idle') {
136
+ const idleTime = now - session.createdAt.getTime();
137
+ if (idleTime > this.config.idleTimeout) {
138
+ this.remove(session.id);
139
+ }
140
+ }
141
+ }
142
+ }, this.config.idleTimeout);
143
+ }
144
+ }
145
+ //# sourceMappingURL=session-pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-pool.js","sourceRoot":"","sources":["../../src/client/session-pool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Agent Documentation Parser (M2-12)
3
+ *
4
+ * Extracts structured metadata from .agent.md files so the markdown
5
+ * becomes a reference document while typed config remains the runtime
6
+ * source of truth.
7
+ *
8
+ * @module config/agent-doc
9
+ */
10
+ /**
11
+ * Structured metadata extracted from an agent .md file.
12
+ */
13
+ export interface AgentDocMetadata {
14
+ /** Agent name from the IDENTITY section or top-level heading */
15
+ name?: string;
16
+ /** One-line description / role */
17
+ description?: string;
18
+ /** Capability strings listed under CAPABILITIES */
19
+ capabilities: string[];
20
+ /** Routing hints (work-type patterns this agent handles) */
21
+ routingHints: string[];
22
+ /** Model preferences (e.g. "claude-sonnet-4.5") */
23
+ modelPreferences: string[];
24
+ /** Constraints / boundaries the agent must follow */
25
+ constraints: string[];
26
+ /** Tool names the agent is allowed to use */
27
+ tools: string[];
28
+ /** Extra sections not in the standard set, keyed by heading */
29
+ extraSections: Record<string, string>;
30
+ }
31
+ /**
32
+ * Parse an agent .agent.md file into structured metadata.
33
+ *
34
+ * Recognised top-level (##) sections:
35
+ * IDENTITY, CAPABILITIES, ROUTING, CONSTRAINTS, TOOLS
36
+ *
37
+ * Any other ## sections are captured in `extraSections`.
38
+ *
39
+ * @param markdown - Raw markdown content of the agent doc
40
+ * @returns Parsed metadata
41
+ */
42
+ export declare function parseAgentDoc(markdown: string): AgentDocMetadata;
43
+ //# sourceMappingURL=agent-doc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-doc.d.ts","sourceRoot":"","sources":["../../src/config/agent-doc.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,gEAAgE;IAChE,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,kCAAkC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,mDAAmD;IACnD,YAAY,EAAE,MAAM,EAAE,CAAC;IAEvB,4DAA4D;IAC5D,YAAY,EAAE,MAAM,EAAE,CAAC;IAEvB,mDAAmD;IACnD,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAE3B,qDAAqD;IACrD,WAAW,EAAE,MAAM,EAAE,CAAC;IAEtB,6CAA6C;IAC7C,KAAK,EAAE,MAAM,EAAE,CAAC;IAEhB,+DAA+D;IAC/D,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;AAWD;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,CAmDhE"}
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Agent Documentation Parser (M2-12)
3
+ *
4
+ * Extracts structured metadata from .agent.md files so the markdown
5
+ * becomes a reference document while typed config remains the runtime
6
+ * source of truth.
7
+ *
8
+ * @module config/agent-doc
9
+ */
10
+ import { normalizeEol } from '../utils/normalize-eol.js';
11
+ /** Standard section names we recognise (case-insensitive). */
12
+ const STANDARD_SECTIONS = new Set([
13
+ 'identity',
14
+ 'capabilities',
15
+ 'routing',
16
+ 'constraints',
17
+ 'tools',
18
+ ]);
19
+ /**
20
+ * Parse an agent .agent.md file into structured metadata.
21
+ *
22
+ * Recognised top-level (##) sections:
23
+ * IDENTITY, CAPABILITIES, ROUTING, CONSTRAINTS, TOOLS
24
+ *
25
+ * Any other ## sections are captured in `extraSections`.
26
+ *
27
+ * @param markdown - Raw markdown content of the agent doc
28
+ * @returns Parsed metadata
29
+ */
30
+ export function parseAgentDoc(markdown) {
31
+ markdown = normalizeEol(markdown);
32
+ const result = {
33
+ capabilities: [],
34
+ routingHints: [],
35
+ modelPreferences: [],
36
+ constraints: [],
37
+ tools: [],
38
+ extraSections: {},
39
+ };
40
+ if (!markdown || markdown.trim().length === 0) {
41
+ return result;
42
+ }
43
+ // Try to extract the agent name from the first H1 heading
44
+ const h1Match = markdown.match(/^#\s+(.+)/m);
45
+ if (h1Match) {
46
+ result.name = h1Match[1].trim();
47
+ }
48
+ // Split into sections by ## headings
49
+ const sections = splitSections(markdown);
50
+ for (const [heading, body] of sections) {
51
+ const key = heading.toLowerCase().trim();
52
+ if (key === 'identity') {
53
+ parseIdentitySection(body, result);
54
+ }
55
+ else if (key === 'capabilities') {
56
+ result.capabilities = parseBulletList(body);
57
+ }
58
+ else if (key === 'routing') {
59
+ result.routingHints = parseBulletList(body);
60
+ // Also check for model preferences inside routing
61
+ parseModelHints(body, result);
62
+ }
63
+ else if (key === 'constraints') {
64
+ result.constraints = parseBulletList(body);
65
+ }
66
+ else if (key === 'tools') {
67
+ result.tools = parseBulletList(body);
68
+ }
69
+ else {
70
+ // Non-standard section – capture verbatim
71
+ result.extraSections[heading.trim()] = body.trim();
72
+ }
73
+ }
74
+ // Also scan the full document for model preferences if none found yet
75
+ if (result.modelPreferences.length === 0) {
76
+ parseModelHints(markdown, result);
77
+ }
78
+ return result;
79
+ }
80
+ // ---------------------------------------------------------------------------
81
+ // Internal helpers
82
+ // ---------------------------------------------------------------------------
83
+ /**
84
+ * Splits markdown into (heading, body) pairs for each ## section.
85
+ */
86
+ function splitSections(markdown) {
87
+ const results = [];
88
+ const regex = /^##\s+(.+)$/gm;
89
+ let match;
90
+ const indices = [];
91
+ while ((match = regex.exec(markdown)) !== null) {
92
+ indices.push({
93
+ heading: match[1],
94
+ start: match.index + match[0].length,
95
+ end: markdown.length, // will be narrowed below
96
+ });
97
+ }
98
+ for (let i = 0; i < indices.length; i++) {
99
+ if (i + 1 < indices.length) {
100
+ // Body runs until the next ## heading line starts
101
+ const nextHeadingPos = markdown.lastIndexOf('\n', markdown.indexOf(`## ${indices[i + 1].heading}`, indices[i].start));
102
+ indices[i].end = nextHeadingPos >= 0 ? nextHeadingPos : indices[i + 1].start;
103
+ }
104
+ results.push([indices[i].heading, markdown.slice(indices[i].start, indices[i].end)]);
105
+ }
106
+ return results;
107
+ }
108
+ /**
109
+ * Extracts bullet-list items (lines starting with - or *) from a block.
110
+ */
111
+ function parseBulletList(text) {
112
+ const items = [];
113
+ for (const line of text.split('\n')) {
114
+ const m = line.match(/^\s*[-*]\s+(.+)/);
115
+ if (m) {
116
+ items.push(m[1].trim());
117
+ }
118
+ }
119
+ return items;
120
+ }
121
+ /**
122
+ * Parses the IDENTITY section for name, description, and model prefs.
123
+ */
124
+ function parseIdentitySection(body, result) {
125
+ // **Name:** value or Name: value
126
+ // Identity Name always takes precedence over H1 heading
127
+ const nameMatch = body.match(/\*?\*?Name:?\*?\*?\s*(.+)/i);
128
+ if (nameMatch) {
129
+ result.name = nameMatch[1].trim();
130
+ }
131
+ // **Description:** or **Role:**
132
+ const descMatch = body.match(/\*?\*?Description:?\*?\*?\s*(.+)/i) ??
133
+ body.match(/\*?\*?Role:?\*?\*?\s*(.+)/i);
134
+ if (descMatch) {
135
+ result.description = descMatch[1].trim();
136
+ }
137
+ // Model preference inside identity
138
+ parseModelHints(body, result);
139
+ }
140
+ /**
141
+ * Scans text for model-preference patterns and appends unique values.
142
+ */
143
+ function parseModelHints(text, result) {
144
+ // Explicit **Model:** or **Preferred Model:** lines
145
+ const modelLine = text.match(/\*?\*?(?:Preferred\s+)?Model:?\*?\*?\s*(.+)/i);
146
+ if (modelLine) {
147
+ const models = modelLine[1]
148
+ .split(/[,;]/)
149
+ .map((m) => m.trim())
150
+ .filter((m) => m.length > 0);
151
+ for (const m of models) {
152
+ if (!result.modelPreferences.includes(m)) {
153
+ result.modelPreferences.push(m);
154
+ }
155
+ }
156
+ }
157
+ }
158
+ //# sourceMappingURL=agent-doc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-doc.js","sourceRoot":"","sources":["../../src/config/agent-doc.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AA+BzD,8DAA8D;AAC9D,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IAChC,UAAU;IACV,cAAc;IACd,SAAS;IACT,aAAa;IACb,OAAO;CACR,CAAC,CAAC;AAEH;;;;;;;;;;GAUG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IAClC,MAAM,MAAM,GAAqB;QAC/B,YAAY,EAAE,EAAE;QAChB,YAAY,EAAE,EAAE;QAChB,gBAAgB,EAAE,EAAE;QACpB,WAAW,EAAE,EAAE;QACf,KAAK,EAAE,EAAE;QACT,aAAa,EAAE,EAAE;KAClB,CAAC;IAEF,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,0DAA0D;IAC1D,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC7C,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAClC,CAAC;IAED,qCAAqC;IACrC,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IAEzC,KAAK,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QAEzC,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;YACvB,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACrC,CAAC;aAAM,IAAI,GAAG,KAAK,cAAc,EAAE,CAAC;YAClC,MAAM,CAAC,YAAY,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,CAAC,YAAY,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;YAC5C,kDAAkD;YAClD,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAChC,CAAC;aAAM,IAAI,GAAG,KAAK,aAAa,EAAE,CAAC;YACjC,MAAM,CAAC,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC;aAAM,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YAC3B,MAAM,CAAC,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,0CAA0C;YAC1C,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACrD,CAAC;IACH,CAAC;IAED,sEAAsE;IACtE,IAAI,MAAM,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzC,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E;;GAEG;AACH,SAAS,aAAa,CAAC,QAAgB;IACrC,MAAM,OAAO,GAAuB,EAAE,CAAC;IACvC,MAAM,KAAK,GAAG,eAAe,CAAC;IAC9B,IAAI,KAA6B,CAAC;IAClC,MAAM,OAAO,GAAsD,EAAE,CAAC;IAEtE,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC;YACX,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;YACjB,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM;YACpC,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,yBAAyB;SAChD,CAAC,CAAC;IACL,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YAC3B,kDAAkD;YAClD,MAAM,cAAc,GAAG,QAAQ,CAAC,WAAW,CACzC,IAAI,EACJ,QAAQ,CAAC,OAAO,CAAC,MAAM,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CACnE,CAAC;YACF,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,cAAc,IAAI,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;QAC/E,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACvF,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,IAAY;IACnC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACxC,IAAI,CAAC,EAAE,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAAC,IAAY,EAAE,MAAwB;IAClE,mCAAmC;IACnC,wDAAwD;IACxD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAC3D,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,CAAC;IAED,gCAAgC;IAChC,MAAM,SAAS,GACb,IAAI,CAAC,KAAK,CAAC,mCAAmC,CAAC;QAC/C,IAAI,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAC3C,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,CAAC;IAED,mCAAmC;IACnC,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,IAAY,EAAE,MAAwB;IAC7D,oDAAoD;IACpD,MAAM,SAAS,GACb,IAAI,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAC7D,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;aACxB,KAAK,CAAC,MAAM,CAAC;aACb,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC/B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}