pilotswarm 0.0.1 → 0.4.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 (149) hide show
  1. package/README.md +37 -1
  2. package/mcp/README.md +484 -0
  3. package/mcp/dist/bin/pilotswarm-mcp.d.ts +3 -0
  4. package/mcp/dist/bin/pilotswarm-mcp.d.ts.map +1 -0
  5. package/mcp/dist/bin/pilotswarm-mcp.js +367 -0
  6. package/mcp/dist/bin/pilotswarm-mcp.js.map +1 -0
  7. package/mcp/dist/src/auth.d.ts +7 -0
  8. package/mcp/dist/src/auth.d.ts.map +1 -0
  9. package/mcp/dist/src/auth.js +99 -0
  10. package/mcp/dist/src/auth.js.map +1 -0
  11. package/mcp/dist/src/context.d.ts +48 -0
  12. package/mcp/dist/src/context.d.ts.map +1 -0
  13. package/mcp/dist/src/context.js +83 -0
  14. package/mcp/dist/src/context.js.map +1 -0
  15. package/mcp/dist/src/index.d.ts +4 -0
  16. package/mcp/dist/src/index.d.ts.map +1 -0
  17. package/mcp/dist/src/index.js +3 -0
  18. package/mcp/dist/src/index.js.map +1 -0
  19. package/mcp/dist/src/prompts/skills.d.ts +4 -0
  20. package/mcp/dist/src/prompts/skills.d.ts.map +1 -0
  21. package/mcp/dist/src/prompts/skills.js +11 -0
  22. package/mcp/dist/src/prompts/skills.js.map +1 -0
  23. package/mcp/dist/src/resources/agents.d.ts +4 -0
  24. package/mcp/dist/src/resources/agents.d.ts.map +1 -0
  25. package/mcp/dist/src/resources/agents.js +64 -0
  26. package/mcp/dist/src/resources/agents.js.map +1 -0
  27. package/mcp/dist/src/resources/facts.d.ts +4 -0
  28. package/mcp/dist/src/resources/facts.d.ts.map +1 -0
  29. package/mcp/dist/src/resources/facts.js +125 -0
  30. package/mcp/dist/src/resources/facts.js.map +1 -0
  31. package/mcp/dist/src/resources/models.d.ts +4 -0
  32. package/mcp/dist/src/resources/models.d.ts.map +1 -0
  33. package/mcp/dist/src/resources/models.js +43 -0
  34. package/mcp/dist/src/resources/models.js.map +1 -0
  35. package/mcp/dist/src/resources/sessions.d.ts +4 -0
  36. package/mcp/dist/src/resources/sessions.d.ts.map +1 -0
  37. package/mcp/dist/src/resources/sessions.js +190 -0
  38. package/mcp/dist/src/resources/sessions.js.map +1 -0
  39. package/mcp/dist/src/resources/subscriptions.d.ts +9 -0
  40. package/mcp/dist/src/resources/subscriptions.d.ts.map +1 -0
  41. package/mcp/dist/src/resources/subscriptions.js +157 -0
  42. package/mcp/dist/src/resources/subscriptions.js.map +1 -0
  43. package/mcp/dist/src/server.d.ts +4 -0
  44. package/mcp/dist/src/server.d.ts.map +1 -0
  45. package/mcp/dist/src/server.js +59 -0
  46. package/mcp/dist/src/server.js.map +1 -0
  47. package/mcp/dist/src/tools/agents.d.ts +4 -0
  48. package/mcp/dist/src/tools/agents.d.ts.map +1 -0
  49. package/mcp/dist/src/tools/agents.js +317 -0
  50. package/mcp/dist/src/tools/agents.js.map +1 -0
  51. package/mcp/dist/src/tools/facts.d.ts +4 -0
  52. package/mcp/dist/src/tools/facts.d.ts.map +1 -0
  53. package/mcp/dist/src/tools/facts.js +151 -0
  54. package/mcp/dist/src/tools/facts.js.map +1 -0
  55. package/mcp/dist/src/tools/models.d.ts +4 -0
  56. package/mcp/dist/src/tools/models.d.ts.map +1 -0
  57. package/mcp/dist/src/tools/models.js +256 -0
  58. package/mcp/dist/src/tools/models.js.map +1 -0
  59. package/mcp/dist/src/tools/sessions.d.ts +4 -0
  60. package/mcp/dist/src/tools/sessions.d.ts.map +1 -0
  61. package/mcp/dist/src/tools/sessions.js +606 -0
  62. package/mcp/dist/src/tools/sessions.js.map +1 -0
  63. package/mcp/dist/src/util/command.d.ts +52 -0
  64. package/mcp/dist/src/util/command.d.ts.map +1 -0
  65. package/mcp/dist/src/util/command.js +78 -0
  66. package/mcp/dist/src/util/command.js.map +1 -0
  67. package/package.json +81 -6
  68. package/tui/README.md +35 -0
  69. package/tui/bin/tui.js +30 -0
  70. package/tui/plugins/.mcp.json +7 -0
  71. package/tui/plugins/plugin.json +13 -0
  72. package/tui/plugins/session-policy.json +8 -0
  73. package/tui/src/app.js +850 -0
  74. package/tui/src/auth/cli.js +111 -0
  75. package/tui/src/auth/entra-auth.js +218 -0
  76. package/tui/src/bootstrap-env.js +176 -0
  77. package/tui/src/embedded-workers.js +79 -0
  78. package/tui/src/http-transport-host.js +106 -0
  79. package/tui/src/index.js +340 -0
  80. package/tui/src/node-sdk-transport.js +1793 -0
  81. package/tui/src/platform.js +984 -0
  82. package/tui/src/plugin-config.js +239 -0
  83. package/tui/src/portal.js +7 -0
  84. package/tui/src/version.js +7 -0
  85. package/tui/tui-splash.txt +11 -0
  86. package/ui/core/README.md +6 -0
  87. package/ui/core/src/commands.js +93 -0
  88. package/ui/core/src/context-usage.js +212 -0
  89. package/ui/core/src/controller.js +6104 -0
  90. package/ui/core/src/formatting.js +1036 -0
  91. package/ui/core/src/history.js +932 -0
  92. package/ui/core/src/index.js +13 -0
  93. package/ui/core/src/layout.js +332 -0
  94. package/ui/core/src/reducer.js +1935 -0
  95. package/ui/core/src/selectors.js +5409 -0
  96. package/ui/core/src/session-errors.js +14 -0
  97. package/ui/core/src/session-tree.js +151 -0
  98. package/ui/core/src/state.js +248 -0
  99. package/ui/core/src/store.js +23 -0
  100. package/ui/core/src/system-titles.js +24 -0
  101. package/ui/core/src/themes/catppuccin-mocha.js +56 -0
  102. package/ui/core/src/themes/cobalt2.js +56 -0
  103. package/ui/core/src/themes/dark-high-contrast.js +56 -0
  104. package/ui/core/src/themes/daylight.js +62 -0
  105. package/ui/core/src/themes/dracula.js +56 -0
  106. package/ui/core/src/themes/github-dark.js +56 -0
  107. package/ui/core/src/themes/github-light.js +59 -0
  108. package/ui/core/src/themes/gruvbox-dark.js +56 -0
  109. package/ui/core/src/themes/hacker-x-matrix.js +56 -0
  110. package/ui/core/src/themes/hacker-x-orion-prime.js +56 -0
  111. package/ui/core/src/themes/helpers.js +79 -0
  112. package/ui/core/src/themes/high-contrast-mono.js +59 -0
  113. package/ui/core/src/themes/index.js +52 -0
  114. package/ui/core/src/themes/light-high-contrast.js +62 -0
  115. package/ui/core/src/themes/noctis-obscuro.js +56 -0
  116. package/ui/core/src/themes/noctis.js +56 -0
  117. package/ui/core/src/themes/paper-ink.js +62 -0
  118. package/ui/core/src/themes/solarized-ops.js +59 -0
  119. package/ui/core/src/themes/terminal-green.js +59 -0
  120. package/ui/core/src/themes/tokyo-night.js +56 -0
  121. package/ui/react/README.md +5 -0
  122. package/ui/react/src/chat-status.js +39 -0
  123. package/ui/react/src/components.js +1989 -0
  124. package/ui/react/src/index.js +4 -0
  125. package/ui/react/src/platform.js +15 -0
  126. package/ui/react/src/use-controller-state.js +38 -0
  127. package/ui/react/src/web-app.js +4390 -0
  128. package/web/README.md +198 -0
  129. package/web/api/router.js +196 -0
  130. package/web/api/ws.js +152 -0
  131. package/web/auth/authz/engine.js +204 -0
  132. package/web/auth/config.js +115 -0
  133. package/web/auth/index.js +175 -0
  134. package/web/auth/normalize/entra.js +22 -0
  135. package/web/auth/providers/entra.js +76 -0
  136. package/web/auth/providers/none.js +24 -0
  137. package/web/auth.js +10 -0
  138. package/web/bin/serve.js +53 -0
  139. package/web/config.js +20 -0
  140. package/web/dist/app.js +469 -0
  141. package/web/dist/assets/index-CBgQQk-j.css +1 -0
  142. package/web/dist/assets/index-DMefB7Wb.js +24 -0
  143. package/web/dist/assets/msal-CytV9RFv.js +7 -0
  144. package/web/dist/assets/pilotswarm-DyBlqVTY.js +87 -0
  145. package/web/dist/assets/react-BZwsW8pe.js +1 -0
  146. package/web/dist/index.html +16 -0
  147. package/web/runtime.js +454 -0
  148. package/web/server.js +276 -0
  149. package/index.js +0 -1
@@ -0,0 +1,606 @@
1
+ import { z } from "zod";
2
+ // Cache session objects so send_and_wait can reuse them instead of
3
+ // calling resumeSession() which incorrectly assumes the orchestration
4
+ // is already running. Mirrors the TUI pattern of holding onto sess.
5
+ const sessionCache = new Map();
6
+ export function registerSessionTools(server, ctx) {
7
+ // 1. create_session — Create a new PilotSwarm session
8
+ server.registerTool("create_session", {
9
+ title: "Create Session",
10
+ description: "Create a new PilotSwarm session, optionally bound to a named agent",
11
+ inputSchema: {
12
+ model: z.string().optional().describe("Model to use for the session"),
13
+ agent: z.string().optional().describe("Agent name to bind the session to"),
14
+ system_message: z.string().optional().describe("Custom system message for the session"),
15
+ title: z.string().min(1).max(512).optional().describe("Optional title — if omitted, PilotSwarm auto-generates one from the conversation after the first turn"),
16
+ prompt: z.string().optional().describe("Initial message to send immediately after session creation (fire-and-forget)"),
17
+ },
18
+ }, async ({ model, agent, system_message, title, prompt }) => {
19
+ try {
20
+ const config = {};
21
+ if (model !== undefined)
22
+ config.model = model;
23
+ if (system_message !== undefined)
24
+ config.systemMessage = system_message;
25
+ if (title !== undefined)
26
+ config.title = title;
27
+ let session;
28
+ if (agent) {
29
+ if (system_message !== undefined) {
30
+ // createSessionForAgent does not forward systemMessage,
31
+ // so route through createSession directly when the
32
+ // caller supplied a custom system message. The
33
+ // allowedAgentNames guard inside createSession still
34
+ // enforces the agent allowlist.
35
+ session = await ctx.client.createSession({
36
+ agentId: agent,
37
+ boundAgentName: agent,
38
+ model,
39
+ systemMessage: system_message,
40
+ });
41
+ }
42
+ else {
43
+ session = await ctx.client.createSessionForAgent(agent, {
44
+ model,
45
+ title,
46
+ });
47
+ }
48
+ }
49
+ else {
50
+ session = await ctx.client.createSession({
51
+ model,
52
+ systemMessage: system_message,
53
+ });
54
+ }
55
+ // Cache the session object for later use by send_and_wait
56
+ sessionCache.set(session.sessionId, session);
57
+ // Persist title via management client (createSession doesn't accept title)
58
+ if (title) {
59
+ try {
60
+ await ctx.mgmt.renameSession(session.sessionId, title);
61
+ }
62
+ catch {
63
+ // Best-effort — session still created
64
+ }
65
+ }
66
+ // Fire initial prompt if provided (non-blocking)
67
+ let promptSent = false;
68
+ if (prompt) {
69
+ try {
70
+ await session.send(prompt);
71
+ promptSent = true;
72
+ }
73
+ catch {
74
+ // Best-effort — session still created
75
+ }
76
+ }
77
+ // Worker-claim guard: when a prompt was dispatched, a worker
78
+ // must register the orchestration within the configured
79
+ // timeout. Otherwise the row becomes a dead "running" record
80
+ // (orchestrationStatus stays NotFound) that no later
81
+ // sendCommand can clean up. Roll back the row and surface a
82
+ // clear "session could not be created" error so callers know
83
+ // to start a worker process.
84
+ const claimTimeoutMs = (() => {
85
+ const raw = process.env.PILOTSWARM_MCP_WORKER_CLAIM_TIMEOUT_MS;
86
+ const parsed = raw ? parseInt(raw, 10) : NaN;
87
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : 10_000;
88
+ })();
89
+ if (promptSent && claimTimeoutMs > 0) {
90
+ const deadline = Date.now() + claimTimeoutMs;
91
+ const pollMs = 250;
92
+ // A session is "claimed" only once duroxide reports an
93
+ // active orchestration. mgmt.getSession reflects CMS row
94
+ // state (e.g. "Unknown") even before any worker runs, so
95
+ // probe the orchestration directly via getSessionStatus.
96
+ // Any non-NotFound duroxide status (Running, Completed,
97
+ // Failed, Terminated, Suspended) means a worker registered
98
+ // the orchestration at least once.
99
+ let claimed = false;
100
+ while (Date.now() < deadline) {
101
+ try {
102
+ const orch = await ctx.mgmt.getSessionStatus(session.sessionId);
103
+ const orchStatus = orch?.orchestrationStatus;
104
+ if (orchStatus && orchStatus !== "NotFound") {
105
+ claimed = true;
106
+ break;
107
+ }
108
+ }
109
+ catch {
110
+ // ignore transient mgmt errors and retry
111
+ }
112
+ await new Promise((resolve) => setTimeout(resolve, pollMs));
113
+ }
114
+ if (!claimed) {
115
+ sessionCache.delete(session.sessionId);
116
+ // Use client.deleteSession (unconditional CMS soft-delete +
117
+ // best-effort orchestration cancel). mgmt.deleteSession routes
118
+ // through sendCommand and rejects when orchestrationStatus is
119
+ // NotFound, which is exactly the case we are cleaning up.
120
+ try {
121
+ await ctx.client.deleteSession(session.sessionId);
122
+ }
123
+ catch {
124
+ // best-effort; row may linger if soft-delete also fails
125
+ }
126
+ return {
127
+ content: [
128
+ {
129
+ type: "text",
130
+ text: JSON.stringify({
131
+ error: "no_worker_claimed",
132
+ created: false,
133
+ purged_session_id: session.sessionId,
134
+ message: "Session could not be created: no PilotSwarm worker claimed the orchestration "
135
+ + `within ${claimTimeoutMs}ms. The CMS row was rolled back. `
136
+ + "Start a worker process (e.g. CLI in local mode or Web Portal) "
137
+ + "against the same DATABASE_URL, then retry.",
138
+ }),
139
+ },
140
+ ],
141
+ isError: true,
142
+ };
143
+ }
144
+ }
145
+ return {
146
+ content: [
147
+ {
148
+ type: "text",
149
+ text: JSON.stringify({
150
+ session_id: session.sessionId,
151
+ status: "created",
152
+ model: model ?? "default",
153
+ title: title ?? null,
154
+ ...(prompt !== undefined && { prompt_sent: promptSent }),
155
+ }),
156
+ },
157
+ ],
158
+ };
159
+ }
160
+ catch (err) {
161
+ const message = err instanceof Error ? err.message : String(err);
162
+ return {
163
+ content: [{ type: "text", text: `Error: ${message}` }],
164
+ isError: true,
165
+ };
166
+ }
167
+ });
168
+ // 2. send_message — Fire-and-forget message to a session
169
+ server.registerTool("send_message", {
170
+ title: "Send Message",
171
+ description: "Send a fire-and-forget message to a PilotSwarm session",
172
+ inputSchema: {
173
+ session_id: z.string().uuid({ message: "session_id must be a valid UUID" }).describe("The session to send the message to"),
174
+ message: z.string().describe("The message to send"),
175
+ },
176
+ }, async ({ session_id, message }) => {
177
+ try {
178
+ const existing = await ctx.mgmt.getSession(session_id);
179
+ if (!existing) {
180
+ return {
181
+ content: [{ type: "text", text: JSON.stringify({ error: "session not found", session_id }) }],
182
+ isError: true,
183
+ };
184
+ }
185
+ // Use cached PilotSwarmSession when available; fall back to
186
+ // resumeSession() so a fresh session created via this MCP
187
+ // server's create_session (which doesn't auto-boot the
188
+ // orchestration unless a prompt was supplied) still works.
189
+ // The bare ctx.mgmt.sendMessage(...) path requires an
190
+ // already-live orchestration and throws otherwise — that
191
+ // breaks the canonical "create then send" workflow.
192
+ const session = sessionCache.get(session_id)
193
+ ?? await ctx.client.resumeSession(session_id);
194
+ if (!sessionCache.has(session_id))
195
+ sessionCache.set(session_id, session);
196
+ await session.send(message);
197
+ return {
198
+ content: [
199
+ { type: "text", text: JSON.stringify({ sent: true }) },
200
+ ],
201
+ };
202
+ }
203
+ catch (err) {
204
+ const msg = err instanceof Error ? err.message : String(err);
205
+ return {
206
+ content: [{ type: "text", text: `Error: ${msg}` }],
207
+ isError: true,
208
+ };
209
+ }
210
+ });
211
+ // 3. send_and_wait — Send message and wait for response
212
+ server.registerTool("send_and_wait", {
213
+ title: "Send and Wait",
214
+ description: "Send a message to a PilotSwarm session and wait for the response",
215
+ inputSchema: {
216
+ session_id: z.string().uuid({ message: "session_id must be a valid UUID" }).describe("The session to send the message to"),
217
+ message: z.string().describe("The message to send"),
218
+ timeout_ms: z.number().optional().describe("Timeout in milliseconds (default 120000)"),
219
+ },
220
+ }, async ({ session_id, message, timeout_ms }) => {
221
+ try {
222
+ const existing = await ctx.mgmt.getSession(session_id);
223
+ if (!existing) {
224
+ return {
225
+ content: [{ type: "text", text: JSON.stringify({ error: "session not found", session_id }) }],
226
+ isError: true,
227
+ };
228
+ }
229
+ const timeout = timeout_ms ?? 120_000;
230
+ // Use cached session object if available (preserves correct
231
+ // orchestration creation path). Fall back to resumeSession()
232
+ // for sessions created outside the MCP server.
233
+ const session = sessionCache.get(session_id)
234
+ ?? await ctx.client.resumeSession(session_id);
235
+ const response = await session.sendAndWait(message, timeout);
236
+ return {
237
+ content: [
238
+ {
239
+ type: "text",
240
+ text: JSON.stringify({
241
+ response: response ?? null,
242
+ status: response !== undefined ? "completed" : "timeout",
243
+ }),
244
+ },
245
+ ],
246
+ };
247
+ }
248
+ catch (err) {
249
+ const msg = err instanceof Error ? err.message : String(err);
250
+ if (msg.toLowerCase().includes("timeout")) {
251
+ return {
252
+ content: [
253
+ { type: "text", text: JSON.stringify({ error: "timeout" }) },
254
+ ],
255
+ };
256
+ }
257
+ return {
258
+ content: [{ type: "text", text: `Error: ${msg}` }],
259
+ isError: true,
260
+ };
261
+ }
262
+ });
263
+ // 4. send_answer — Answer a pending input_required question
264
+ server.registerTool("send_answer", {
265
+ title: "Send Answer",
266
+ description: "Answer a pending input_required question in a PilotSwarm session",
267
+ inputSchema: {
268
+ session_id: z.string().uuid({ message: "session_id must be a valid UUID" }).describe("The session awaiting an answer"),
269
+ answer: z.string().describe("The answer to provide"),
270
+ },
271
+ }, async ({ session_id, answer }) => {
272
+ try {
273
+ const existing = await ctx.mgmt.getSession(session_id);
274
+ if (!existing) {
275
+ return {
276
+ content: [{ type: "text", text: JSON.stringify({ error: "session not found", session_id }) }],
277
+ isError: true,
278
+ };
279
+ }
280
+ await ctx.mgmt.sendAnswer(session_id, answer);
281
+ return {
282
+ content: [
283
+ { type: "text", text: JSON.stringify({ sent: true }) },
284
+ ],
285
+ };
286
+ }
287
+ catch (err) {
288
+ const msg = err instanceof Error ? err.message : String(err);
289
+ return {
290
+ content: [{ type: "text", text: `Error: ${msg}` }],
291
+ isError: true,
292
+ };
293
+ }
294
+ });
295
+ // 5. abort_session — Cancel a running session
296
+ server.registerTool("abort_session", {
297
+ title: "Abort Session",
298
+ description: "Cancel a running PilotSwarm session",
299
+ inputSchema: {
300
+ session_id: z.string().uuid({ message: "session_id must be a valid UUID" }).describe("The session to abort"),
301
+ reason: z.string().optional().describe("Optional reason for cancellation"),
302
+ },
303
+ }, async ({ session_id, reason }) => {
304
+ try {
305
+ const existing = await ctx.mgmt.getSession(session_id);
306
+ if (!existing) {
307
+ return {
308
+ content: [{ type: "text", text: JSON.stringify({ error: "session not found", session_id }) }],
309
+ isError: true,
310
+ };
311
+ }
312
+ await ctx.mgmt.cancelSession(session_id, reason);
313
+ sessionCache.delete(session_id);
314
+ return {
315
+ content: [
316
+ { type: "text", text: JSON.stringify({ aborted: true }) },
317
+ ],
318
+ };
319
+ }
320
+ catch (err) {
321
+ const msg = err instanceof Error ? err.message : String(err);
322
+ return {
323
+ content: [{ type: "text", text: `Error: ${msg}` }],
324
+ isError: true,
325
+ };
326
+ }
327
+ });
328
+ // 6. rename_session — Rename a session
329
+ server.registerTool("rename_session", {
330
+ title: "Rename Session",
331
+ description: "Rename a PilotSwarm session",
332
+ inputSchema: {
333
+ session_id: z.string().uuid({ message: "session_id must be a valid UUID" }).describe("The session to rename"),
334
+ title: z.string().min(1).max(512).describe("The new title for the session"),
335
+ },
336
+ }, async ({ session_id, title }) => {
337
+ try {
338
+ const existing = await ctx.mgmt.getSession(session_id);
339
+ if (!existing) {
340
+ return {
341
+ content: [{ type: "text", text: JSON.stringify({ error: "session not found", session_id }) }],
342
+ isError: true,
343
+ };
344
+ }
345
+ await ctx.mgmt.renameSession(session_id, title);
346
+ return {
347
+ content: [
348
+ { type: "text", text: JSON.stringify({ renamed: true }) },
349
+ ],
350
+ };
351
+ }
352
+ catch (err) {
353
+ const msg = err instanceof Error ? err.message : String(err);
354
+ return {
355
+ content: [{ type: "text", text: `Error: ${msg}` }],
356
+ isError: true,
357
+ };
358
+ }
359
+ });
360
+ // 7. list_sessions — List all sessions with status
361
+ server.registerTool("list_sessions", {
362
+ title: "List Sessions",
363
+ description: "List all PilotSwarm sessions with their current status, model, agent info, and parent/child relationships. " +
364
+ "Use status_filter to narrow results (e.g. 'running', 'idle', 'waiting', 'completed', 'failed').",
365
+ inputSchema: {
366
+ status_filter: z
367
+ .string()
368
+ .optional()
369
+ .describe("Filter by status (running, idle, waiting, completed, failed, input_required)"),
370
+ include_system: z
371
+ .boolean()
372
+ .optional()
373
+ .describe("Include system sessions like Sweeper Agent (default false)"),
374
+ agent_id: z
375
+ .string()
376
+ .optional()
377
+ .describe("Filter by agent ID (e.g. 'sweeper', 'resourcemgr', or a custom agent name)"),
378
+ },
379
+ }, async ({ status_filter, include_system, agent_id }) => {
380
+ try {
381
+ let sessions = await ctx.mgmt.listSessions();
382
+ if (!include_system) {
383
+ sessions = sessions.filter((s) => !s.isSystem);
384
+ }
385
+ if (status_filter) {
386
+ const f = status_filter.toLowerCase();
387
+ sessions = sessions.filter((s) => s.status?.toLowerCase() === f);
388
+ }
389
+ if (agent_id) {
390
+ sessions = sessions.filter((s) => s.agentId === agent_id);
391
+ }
392
+ const data = sessions.map((s) => ({
393
+ session_id: s.sessionId,
394
+ title: s.title ?? null,
395
+ status: s.status,
396
+ orchestration_status: s.orchestrationStatus ?? null,
397
+ model: s.model ?? "default",
398
+ agent_id: s.agentId ?? null,
399
+ is_system: s.isSystem ?? false,
400
+ parent_session_id: s.parentSessionId ?? null,
401
+ iterations: s.iterations ?? 0,
402
+ wait_reason: s.waitReason ?? null,
403
+ error: s.error ?? null,
404
+ pending_question: s.pendingQuestion ?? null,
405
+ created_at: s.createdAt,
406
+ updated_at: s.updatedAt ?? null,
407
+ }));
408
+ return {
409
+ content: [
410
+ {
411
+ type: "text",
412
+ text: JSON.stringify({ count: data.length, sessions: data }, null, 2),
413
+ },
414
+ ],
415
+ };
416
+ }
417
+ catch (err) {
418
+ const msg = err instanceof Error ? err.message : String(err);
419
+ return {
420
+ content: [{ type: "text", text: `Error: ${msg}` }],
421
+ isError: true,
422
+ };
423
+ }
424
+ });
425
+ // 8. get_session_detail — Get detailed info for a single session
426
+ server.registerTool("get_session_detail", {
427
+ title: "Get Session Detail",
428
+ description: "Get detailed information for a specific PilotSwarm session including status, context usage, cron state, and pending questions. " +
429
+ "Use 'include' to fetch additional data: 'status' for live orchestration status, 'response' for latest LLM response, 'dump' for full Markdown dump.",
430
+ inputSchema: {
431
+ session_id: z.string().uuid({ message: "session_id must be a valid UUID" }).describe("The session ID to inspect"),
432
+ include: z
433
+ .array(z.enum(["status", "response", "dump"]))
434
+ .optional()
435
+ .describe("Additional data to include: 'status' (orchestration status), 'response' (latest LLM response), 'dump' (full Markdown dump)"),
436
+ },
437
+ }, async ({ session_id, include }) => {
438
+ try {
439
+ const session = await ctx.mgmt.getSession(session_id);
440
+ if (!session) {
441
+ return {
442
+ content: [{ type: "text", text: JSON.stringify({ error: "session not found", session_id }) }],
443
+ isError: true,
444
+ };
445
+ }
446
+ const result = { session };
447
+ const includes = new Set(include ?? []);
448
+ if (includes.has("status")) {
449
+ try {
450
+ result.orchestration_status = await ctx.mgmt.getSessionStatus(session_id);
451
+ }
452
+ catch {
453
+ result.orchestration_status = null;
454
+ }
455
+ }
456
+ if (includes.has("response")) {
457
+ try {
458
+ result.latest_response = await ctx.mgmt.getLatestResponse(session_id);
459
+ }
460
+ catch {
461
+ result.latest_response = null;
462
+ }
463
+ }
464
+ if (includes.has("dump")) {
465
+ try {
466
+ result.dump = await ctx.mgmt.dumpSession(session_id);
467
+ }
468
+ catch {
469
+ result.dump = null;
470
+ }
471
+ }
472
+ return {
473
+ content: [
474
+ {
475
+ type: "text",
476
+ text: JSON.stringify(result, null, 2),
477
+ },
478
+ ],
479
+ };
480
+ }
481
+ catch (err) {
482
+ const msg = err instanceof Error ? err.message : String(err);
483
+ return {
484
+ content: [{ type: "text", text: `Error: ${msg}` }],
485
+ isError: true,
486
+ };
487
+ }
488
+ });
489
+ // 9. delete_session — Delete a session
490
+ server.registerTool("delete_session", {
491
+ title: "Delete Session",
492
+ description: "Delete a PilotSwarm session",
493
+ inputSchema: {
494
+ session_id: z.string().uuid({ message: "session_id must be a valid UUID" }).describe("The session to delete"),
495
+ },
496
+ }, async ({ session_id }) => {
497
+ try {
498
+ const existing = await ctx.mgmt.getSession(session_id);
499
+ if (!existing) {
500
+ return {
501
+ content: [{ type: "text", text: JSON.stringify({ error: "session not found", session_id }) }],
502
+ isError: true,
503
+ };
504
+ }
505
+ // mgmt.deleteSession routes through sendCommand and rejects
506
+ // with "orchestration ... is not started (status=NotFound)"
507
+ // for sessions whose orchestration was never registered (e.g.
508
+ // create_session ran while no worker was active). Fall back
509
+ // to client.deleteSession in that case — it soft-deletes the
510
+ // CMS row directly and best-effort cancels the orchestration.
511
+ if (existing.orchestrationStatus === "NotFound") {
512
+ await ctx.client.deleteSession(session_id);
513
+ }
514
+ else {
515
+ await ctx.mgmt.deleteSession(session_id);
516
+ }
517
+ sessionCache.delete(session_id);
518
+ return {
519
+ content: [
520
+ { type: "text", text: JSON.stringify({ deleted: true }) },
521
+ ],
522
+ };
523
+ }
524
+ catch (err) {
525
+ const msg = err instanceof Error ? err.message : String(err);
526
+ return {
527
+ content: [{ type: "text", text: `Error: ${msg}` }],
528
+ isError: true,
529
+ };
530
+ }
531
+ });
532
+ // 10. get_session_events — Paginated CMS event stream with optional long-poll
533
+ server.registerTool("get_session_events", {
534
+ title: "Get Session Events",
535
+ description: "Read the CMS event stream for a session. Supports pagination with after_seq and long-polling " +
536
+ "with wait=true to block until new events or a status change arrives.",
537
+ inputSchema: {
538
+ session_id: z.string().uuid({ message: "session_id must be a valid UUID" }).describe("The session to read events for"),
539
+ after_seq: z.number().optional().describe("Return events after this CMS sequence number (for paging)"),
540
+ limit: z.number().optional().describe("Max events to return (default 50)"),
541
+ wait: z.boolean().optional().describe("If true, long-poll until new events or status change arrives"),
542
+ wait_timeout_ms: z.number().optional().describe("Long-poll timeout in ms (default 30000)"),
543
+ after_version: z.number().optional().describe("For wait mode: block until customStatusVersion exceeds this value"),
544
+ },
545
+ }, async ({ session_id, after_seq, limit, wait, wait_timeout_ms, after_version }) => {
546
+ try {
547
+ const existing = await ctx.mgmt.getSession(session_id);
548
+ if (!existing) {
549
+ return {
550
+ content: [{ type: "text", text: JSON.stringify({ error: "session not found", session_id }) }],
551
+ isError: true,
552
+ };
553
+ }
554
+ const eventLimit = limit ?? 50;
555
+ let statusChange = undefined;
556
+ if (wait) {
557
+ const timeoutMs = wait_timeout_ms ?? 30_000;
558
+ // If after_version not provided, fetch current version first
559
+ let version = after_version;
560
+ if (version === undefined) {
561
+ try {
562
+ const status = await ctx.mgmt.getSessionStatus(session_id);
563
+ version = status?.customStatusVersion ?? 0;
564
+ }
565
+ catch {
566
+ version = 0;
567
+ }
568
+ }
569
+ try {
570
+ statusChange = await ctx.mgmt.waitForStatusChange(session_id, version, 1_000, timeoutMs);
571
+ }
572
+ catch {
573
+ // Timeout or error — still return whatever events exist
574
+ }
575
+ }
576
+ const events = await ctx.mgmt.getSessionEvents(session_id, after_seq, eventLimit);
577
+ const latestSeq = events.length > 0
578
+ ? Math.max(...events.map((e) => e.seq ?? 0))
579
+ : (after_seq ?? 0);
580
+ const result = {
581
+ events,
582
+ latest_seq: latestSeq,
583
+ count: events.length,
584
+ };
585
+ if (statusChange !== undefined) {
586
+ result.status_change = statusChange;
587
+ }
588
+ return {
589
+ content: [
590
+ {
591
+ type: "text",
592
+ text: JSON.stringify(result, null, 2),
593
+ },
594
+ ],
595
+ };
596
+ }
597
+ catch (err) {
598
+ const msg = err instanceof Error ? err.message : String(err);
599
+ return {
600
+ content: [{ type: "text", text: `Error: ${msg}` }],
601
+ isError: true,
602
+ };
603
+ }
604
+ });
605
+ }
606
+ //# sourceMappingURL=sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../../src/tools/sessions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,mEAAmE;AACnE,sEAAsE;AACtE,oEAAoE;AACpE,MAAM,YAAY,GAAG,IAAI,GAAG,EAA6B,CAAC;AAE1D,MAAM,UAAU,oBAAoB,CAAC,MAAiB,EAAE,GAAkB;IACtE,sDAAsD;IACtD,MAAM,CAAC,YAAY,CACf,gBAAgB,EAChB;QACI,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,oEAAoE;QACjF,WAAW,EAAE;YACT,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;YACrE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;YAC1E,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;YACvF,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uGAAuG,CAAC;YAC9J,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8EAA8E,CAAC;SACzH;KACJ,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE;QACtD,IAAI,CAAC;YACD,MAAM,MAAM,GAA4B,EAAE,CAAC;YAC3C,IAAI,KAAK,KAAK,SAAS;gBAAE,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;YAC9C,IAAI,cAAc,KAAK,SAAS;gBAAE,MAAM,CAAC,aAAa,GAAG,cAAc,CAAC;YACxE,IAAI,KAAK,KAAK,SAAS;gBAAE,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;YAE9C,IAAI,OAAO,CAAC;YACZ,IAAI,KAAK,EAAE,CAAC;gBACR,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;oBAC/B,wDAAwD;oBACxD,mDAAmD;oBACnD,+CAA+C;oBAC/C,qDAAqD;oBACrD,gCAAgC;oBAChC,OAAO,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC;wBACrC,OAAO,EAAE,KAAK;wBACd,cAAc,EAAE,KAAK;wBACrB,KAAK;wBACL,aAAa,EAAE,cAAc;qBAChC,CAAC,CAAC;gBACP,CAAC;qBAAM,CAAC;oBACJ,OAAO,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,qBAAqB,CAAC,KAAK,EAAE;wBACpD,KAAK;wBACL,KAAK;qBACR,CAAC,CAAC;gBACP,CAAC;YACL,CAAC;iBAAM,CAAC;gBACJ,OAAO,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC;oBACrC,KAAK;oBACL,aAAa,EAAE,cAAc;iBAChC,CAAC,CAAC;YACP,CAAC;YAED,0DAA0D;YAC1D,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAE7C,2EAA2E;YAC3E,IAAI,KAAK,EAAE,CAAC;gBACR,IAAI,CAAC;oBACD,MAAM,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;gBAC3D,CAAC;gBAAC,MAAM,CAAC;oBACL,sCAAsC;gBAC1C,CAAC;YACL,CAAC;YAED,iDAAiD;YACjD,IAAI,UAAU,GAAG,KAAK,CAAC;YACvB,IAAI,MAAM,EAAE,CAAC;gBACT,IAAI,CAAC;oBACD,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBAC3B,UAAU,GAAG,IAAI,CAAC;gBACtB,CAAC;gBAAC,MAAM,CAAC;oBACL,sCAAsC;gBAC1C,CAAC;YACL,CAAC;YAED,6DAA6D;YAC7D,wDAAwD;YACxD,6DAA6D;YAC7D,qDAAqD;YACrD,4DAA4D;YAC5D,6DAA6D;YAC7D,6BAA6B;YAC7B,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE;gBACzB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC;gBAC/D,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;gBAC7C,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;YACnE,CAAC,CAAC,EAAE,CAAC;YAEL,IAAI,UAAU,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;gBACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC;gBAC7C,MAAM,MAAM,GAAG,GAAG,CAAC;gBACnB,uDAAuD;gBACvD,yDAAyD;gBACzD,yDAAyD;gBACzD,yDAAyD;gBACzD,wDAAwD;gBACxD,2DAA2D;gBAC3D,mCAAmC;gBACnC,IAAI,OAAO,GAAG,KAAK,CAAC;gBACpB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;oBAC3B,IAAI,CAAC;wBACD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;wBAChE,MAAM,UAAU,GAAG,IAAI,EAAE,mBAAmB,CAAC;wBAC7C,IAAI,UAAU,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;4BAC1C,OAAO,GAAG,IAAI,CAAC;4BACf,MAAM;wBACV,CAAC;oBACL,CAAC;oBAAC,MAAM,CAAC;wBACL,yCAAyC;oBAC7C,CAAC;oBACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;gBAChE,CAAC;gBACD,IAAI,CAAC,OAAO,EAAE,CAAC;oBACX,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;oBACvC,4DAA4D;oBAC5D,+DAA+D;oBAC/D,8DAA8D;oBAC9D,0DAA0D;oBAC1D,IAAI,CAAC;wBACD,MAAM,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;oBACtD,CAAC;oBAAC,MAAM,CAAC;wBACL,wDAAwD;oBAC5D,CAAC;oBACD,OAAO;wBACH,OAAO,EAAE;4BACL;gCACI,IAAI,EAAE,MAAe;gCACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oCACjB,KAAK,EAAE,mBAAmB;oCAC1B,OAAO,EAAE,KAAK;oCACd,iBAAiB,EAAE,OAAO,CAAC,SAAS;oCACpC,OAAO,EACH,+EAA+E;0CAC7E,UAAU,cAAc,mCAAmC;0CAC3D,gEAAgE;0CAChE,4CAA4C;iCACrD,CAAC;6BACL;yBACJ;wBACD,OAAO,EAAE,IAAI;qBAChB,CAAC;gBACN,CAAC;YACL,CAAC;YAED,OAAO;gBACH,OAAO,EAAE;oBACL;wBACI,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACjB,UAAU,EAAE,OAAO,CAAC,SAAS;4BAC7B,MAAM,EAAE,SAAS;4BACjB,KAAK,EAAE,KAAK,IAAI,SAAS;4BACzB,KAAK,EAAE,KAAK,IAAI,IAAI;4BACpB,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;yBAC3D,CAAC;qBACL;iBACJ;aACJ,CAAC;QACN,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,OAAO;gBACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC;gBAC/D,OAAO,EAAE,IAAI;aAChB,CAAC;QACN,CAAC;IACL,CAAC,CACJ,CAAC;IAEF,yDAAyD;IACzD,MAAM,CAAC,YAAY,CACf,cAAc,EACd;QACI,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,wDAAwD;QACrE,WAAW,EAAE;YACT,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,iCAAiC,EAAE,CAAC,CAAC,QAAQ,CAAC,oCAAoC,CAAC;YAC1H,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;SACtD;KACJ,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE;QAC9B,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YACvD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACZ,OAAO;oBACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;oBACtG,OAAO,EAAE,IAAI;iBAChB,CAAC;YACN,CAAC;YACD,4DAA4D;YAC5D,0DAA0D;YAC1D,uDAAuD;YACvD,2DAA2D;YAC3D,sDAAsD;YACtD,yDAAyD;YACzD,oDAAoD;YACpD,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC;mBACrC,MAAM,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YAClD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC;gBAAE,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACzE,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5B,OAAO;gBACH,OAAO,EAAE;oBACL,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE;iBAClE;aACJ,CAAC;QACN,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACpB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO;gBACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,GAAG,EAAE,EAAE,CAAC;gBAC3D,OAAO,EAAE,IAAI;aAChB,CAAC;QACN,CAAC;IACL,CAAC,CACJ,CAAC;IAEF,wDAAwD;IACxD,MAAM,CAAC,YAAY,CACf,eAAe,EACf;QACI,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,kEAAkE;QAC/E,WAAW,EAAE;YACT,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,iCAAiC,EAAE,CAAC,CAAC,QAAQ,CAAC,oCAAoC,CAAC;YAC1H,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;YACnD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;SACzF;KACJ,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE;QAC1C,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YACvD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACZ,OAAO;oBACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;oBACtG,OAAO,EAAE,IAAI;iBAChB,CAAC;YACN,CAAC;YACD,MAAM,OAAO,GAAG,UAAU,IAAI,OAAO,CAAC;YACtC,4DAA4D;YAC5D,6DAA6D;YAC7D,+CAA+C;YAC/C,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC;mBACrC,MAAM,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YAClD,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7D,OAAO;gBACH,OAAO,EAAE;oBACL;wBACI,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;4BACjB,QAAQ,EAAE,QAAQ,IAAI,IAAI;4BAC1B,MAAM,EAAE,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;yBAC3D,CAAC;qBACL;iBACJ;aACJ,CAAC;QACN,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACpB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBACxC,OAAO;oBACH,OAAO,EAAE;wBACL,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE;qBACxE;iBACJ,CAAC;YACN,CAAC;YACD,OAAO;gBACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,GAAG,EAAE,EAAE,CAAC;gBAC3D,OAAO,EAAE,IAAI;aAChB,CAAC;QACN,CAAC;IACL,CAAC,CACJ,CAAC;IAEF,4DAA4D;IAC5D,MAAM,CAAC,YAAY,CACf,aAAa,EACb;QACI,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,kEAAkE;QAC/E,WAAW,EAAE;YACT,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,iCAAiC,EAAE,CAAC,CAAC,QAAQ,CAAC,gCAAgC,CAAC;YACtH,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;SACvD;KACJ,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE;QAC7B,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YACvD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACZ,OAAO;oBACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;oBACtG,OAAO,EAAE,IAAI;iBAChB,CAAC;YACN,CAAC;YACD,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YAC9C,OAAO;gBACH,OAAO,EAAE;oBACL,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE;iBAClE;aACJ,CAAC;QACN,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACpB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO;gBACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,GAAG,EAAE,EAAE,CAAC;gBAC3D,OAAO,EAAE,IAAI;aAChB,CAAC;QACN,CAAC;IACL,CAAC,CACJ,CAAC;IAEF,8CAA8C;IAC9C,MAAM,CAAC,YAAY,CACf,eAAe,EACf;QACI,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,qCAAqC;QAClD,WAAW,EAAE;YACT,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,iCAAiC,EAAE,CAAC,CAAC,QAAQ,CAAC,sBAAsB,CAAC;YAC5G,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;SAC7E;KACJ,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE;QAC7B,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YACvD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACZ,OAAO;oBACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;oBACtG,OAAO,EAAE,IAAI;iBAChB,CAAC;YACN,CAAC;YACD,MAAM,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YACjD,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAChC,OAAO;gBACH,OAAO,EAAE;oBACL,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE;iBACrE;aACJ,CAAC;QACN,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACpB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO;gBACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,GAAG,EAAE,EAAE,CAAC;gBAC3D,OAAO,EAAE,IAAI;aAChB,CAAC;QACN,CAAC;IACL,CAAC,CACJ,CAAC;IAEF,uCAAuC;IACvC,MAAM,CAAC,YAAY,CACf,gBAAgB,EAChB;QACI,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,6BAA6B;QAC1C,WAAW,EAAE;YACT,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,iCAAiC,EAAE,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YAC7G,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,+BAA+B,CAAC;SAC9E;KACJ,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE;QAC5B,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YACvD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACZ,OAAO;oBACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;oBACtG,OAAO,EAAE,IAAI;iBAChB,CAAC;YACN,CAAC;YACD,MAAM,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YAChD,OAAO;gBACH,OAAO,EAAE;oBACL,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE;iBACrE;aACJ,CAAC;QACN,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACpB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO;gBACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,GAAG,EAAE,EAAE,CAAC;gBAC3D,OAAO,EAAE,IAAI;aAChB,CAAC;QACN,CAAC;IACL,CAAC,CACJ,CAAC;IAEF,mDAAmD;IACnD,MAAM,CAAC,YAAY,CACf,eAAe,EACf;QACI,KAAK,EAAE,eAAe;QACtB,WAAW,EACP,6GAA6G;YAC7G,iGAAiG;QACrG,WAAW,EAAE;YACT,aAAa,EAAE,CAAC;iBACX,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,8EAA8E,CAAC;YAC7F,cAAc,EAAE,CAAC;iBACZ,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CAAC,4DAA4D,CAAC;YAC3E,QAAQ,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,4EAA4E,CAAC;SAC9F;KACJ,EACD,KAAK,EAAE,EAAE,aAAa,EAAE,cAAc,EAAE,QAAQ,EAAE,EAAE,EAAE;QAClD,IAAI,CAAC;YACD,IAAI,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YAE7C,IAAI,CAAC,cAAc,EAAE,CAAC;gBAClB,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YACxD,CAAC;YACD,IAAI,aAAa,EAAE,CAAC;gBAChB,MAAM,CAAC,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC;gBACtC,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;YAC1E,CAAC;YACD,IAAI,QAAQ,EAAE,CAAC;gBACX,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC;YACnE,CAAC;YAED,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;gBACnC,UAAU,EAAE,CAAC,CAAC,SAAS;gBACvB,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI;gBACtB,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,oBAAoB,EAAE,CAAC,CAAC,mBAAmB,IAAI,IAAI;gBACnD,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,SAAS;gBAC3B,QAAQ,EAAE,CAAC,CAAC,OAAO,IAAI,IAAI;gBAC3B,SAAS,EAAE,CAAC,CAAC,QAAQ,IAAI,KAAK;gBAC9B,iBAAiB,EAAE,CAAC,CAAC,eAAe,IAAI,IAAI;gBAC5C,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,CAAC;gBAC7B,WAAW,EAAE,CAAC,CAAC,UAAU,IAAI,IAAI;gBACjC,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI;gBACtB,gBAAgB,EAAE,CAAC,CAAC,eAAe,IAAI,IAAI;gBAC3C,UAAU,EAAE,CAAC,CAAC,SAAS;gBACvB,UAAU,EAAE,CAAC,CAAC,SAAS,IAAI,IAAI;aAClC,CAAC,CAAC,CAAC;YAEJ,OAAO;gBACH,OAAO,EAAE;oBACL;wBACI,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAChB,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,EACtC,IAAI,EACJ,CAAC,CACJ;qBACJ;iBACJ;aACJ,CAAC;QACN,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACpB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO;gBACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,GAAG,EAAE,EAAE,CAAC;gBAC3D,OAAO,EAAE,IAAI;aAChB,CAAC;QACN,CAAC;IACL,CAAC,CACJ,CAAC;IAEF,iEAAiE;IACjE,MAAM,CAAC,YAAY,CACf,oBAAoB,EACpB;QACI,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EACP,iIAAiI;YACjI,oJAAoJ;QACxJ,WAAW,EAAE;YACT,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,iCAAiC,EAAE,CAAC,CAAC,QAAQ,CAAC,2BAA2B,CAAC;YACjH,OAAO,EAAE,CAAC;iBACL,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;iBAC7C,QAAQ,EAAE;iBACV,QAAQ,CAAC,4HAA4H,CAAC;SAC9I;KACJ,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE;QAC9B,IAAI,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YACtD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACX,OAAO;oBACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;oBACtG,OAAO,EAAE,IAAI;iBAChB,CAAC;YACN,CAAC;YAED,MAAM,MAAM,GAA4B,EAAE,OAAO,EAAE,CAAC;YACpD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YAExC,IAAI,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzB,IAAI,CAAC;oBACD,MAAM,CAAC,oBAAoB,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;gBAC9E,CAAC;gBAAC,MAAM,CAAC;oBACL,MAAM,CAAC,oBAAoB,GAAG,IAAI,CAAC;gBACvC,CAAC;YACL,CAAC;YAED,IAAI,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC3B,IAAI,CAAC;oBACD,MAAM,CAAC,eAAe,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;gBAC1E,CAAC;gBAAC,MAAM,CAAC;oBACL,MAAM,CAAC,eAAe,GAAG,IAAI,CAAC;gBAClC,CAAC;YACL,CAAC;YAED,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvB,IAAI,CAAC;oBACD,MAAM,CAAC,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;gBACzD,CAAC;gBAAC,MAAM,CAAC;oBACL,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;gBACvB,CAAC;YACL,CAAC;YAED,OAAO;gBACH,OAAO,EAAE;oBACL;wBACI,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;qBACxC;iBACJ;aACJ,CAAC;QACN,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACpB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO;gBACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,GAAG,EAAE,EAAE,CAAC;gBAC3D,OAAO,EAAE,IAAI;aAChB,CAAC;QACN,CAAC;IACL,CAAC,CACJ,CAAC;IAEF,uCAAuC;IACvC,MAAM,CAAC,YAAY,CACf,gBAAgB,EAChB;QACI,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,6BAA6B;QAC1C,WAAW,EAAE;YACT,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,iCAAiC,EAAE,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;SAChH;KACJ,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;QACrB,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YACvD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACZ,OAAO;oBACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;oBACtG,OAAO,EAAE,IAAI;iBAChB,CAAC;YACN,CAAC;YACD,4DAA4D;YAC5D,4DAA4D;YAC5D,8DAA8D;YAC9D,4DAA4D;YAC5D,6DAA6D;YAC7D,8DAA8D;YAC9D,IAAI,QAAQ,CAAC,mBAAmB,KAAK,UAAU,EAAE,CAAC;gBAC9C,MAAM,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YAC/C,CAAC;iBAAM,CAAC;gBACJ,MAAM,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;YAC7C,CAAC;YACD,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAChC,OAAO;gBACH,OAAO,EAAE;oBACL,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE;iBACrE;aACJ,CAAC;QACN,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACpB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO;gBACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,GAAG,EAAE,EAAE,CAAC;gBAC3D,OAAO,EAAE,IAAI;aAChB,CAAC;QACN,CAAC;IACL,CAAC,CACJ,CAAC;IAEF,8EAA8E;IAC9E,MAAM,CAAC,YAAY,CACf,oBAAoB,EACpB;QACI,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EACP,+FAA+F;YAC/F,sEAAsE;QAC1E,WAAW,EAAE;YACT,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,iCAAiC,EAAE,CAAC,CAAC,QAAQ,CAAC,gCAAgC,CAAC;YACtH,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2DAA2D,CAAC;YACtG,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;YAC1E,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8DAA8D,CAAC;YACrG,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;YAC1F,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mEAAmE,CAAC;SACrH;KACJ,EACD,KAAK,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,aAAa,EAAE,EAAE,EAAE;QAC7E,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YACvD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACZ,OAAO;oBACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;oBACtG,OAAO,EAAE,IAAI;iBAChB,CAAC;YACN,CAAC;YACD,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE,CAAC;YAC/B,IAAI,YAAY,GAAY,SAAS,CAAC;YAEtC,IAAI,IAAI,EAAE,CAAC;gBACP,MAAM,SAAS,GAAG,eAAe,IAAI,MAAM,CAAC;gBAC5C,6DAA6D;gBAC7D,IAAI,OAAO,GAAG,aAAa,CAAC;gBAC5B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;oBACxB,IAAI,CAAC;wBACD,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;wBAC3D,OAAO,GAAI,MAAc,EAAE,mBAAmB,IAAI,CAAC,CAAC;oBACxD,CAAC;oBAAC,MAAM,CAAC;wBACL,OAAO,GAAG,CAAC,CAAC;oBAChB,CAAC;gBACL,CAAC;gBACD,IAAI,CAAC;oBACD,YAAY,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAC7C,UAAU,EACV,OAAQ,EACR,KAAK,EACL,SAAS,CACZ,CAAC;gBACN,CAAC;gBAAC,MAAM,CAAC;oBACL,wDAAwD;gBAC5D,CAAC;YACL,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;YAClF,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC;gBAC/B,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;gBACjD,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC;YAEvB,MAAM,MAAM,GAA4B;gBACpC,MAAM;gBACN,UAAU,EAAE,SAAS;gBACrB,KAAK,EAAE,MAAM,CAAC,MAAM;aACvB,CAAC;YACF,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;gBAC7B,MAAM,CAAC,aAAa,GAAG,YAAY,CAAC;YACxC,CAAC;YAED,OAAO;gBACH,OAAO,EAAE;oBACL;wBACI,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;qBACxC;iBACJ;aACJ,CAAC;QACN,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACpB,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO;gBACH,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,GAAG,EAAE,EAAE,CAAC;gBAC3D,OAAO,EAAE,IAAI;aAChB,CAAC;QACN,CAAC;IACL,CAAC,CACJ,CAAC;AACN,CAAC"}