squads-cli 0.6.2 → 0.7.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 (112) hide show
  1. package/README.md +196 -1152
  2. package/dist/auth-YW3UPFSB.js +23 -0
  3. package/dist/autonomy-BWTVDEAT.js +102 -0
  4. package/dist/autonomy-BWTVDEAT.js.map +1 -0
  5. package/dist/chunk-3KCWNZWW.js +401 -0
  6. package/dist/chunk-3KCWNZWW.js.map +1 -0
  7. package/dist/chunk-67RO2HKR.js +174 -0
  8. package/dist/chunk-67RO2HKR.js.map +1 -0
  9. package/dist/chunk-7JVD7RD4.js +275 -0
  10. package/dist/chunk-7JVD7RD4.js.map +1 -0
  11. package/dist/chunk-BODLDQY7.js +452 -0
  12. package/dist/chunk-BODLDQY7.js.map +1 -0
  13. package/dist/chunk-FFFCFZ6A.js +121 -0
  14. package/dist/chunk-FFFCFZ6A.js.map +1 -0
  15. package/dist/chunk-FIWT2NMM.js +165 -0
  16. package/dist/chunk-FIWT2NMM.js.map +1 -0
  17. package/dist/chunk-L6GQCHDF.js +222 -0
  18. package/dist/chunk-L6GQCHDF.js.map +1 -0
  19. package/dist/{chunk-O7UV3FWI.js → chunk-LDM62TIX.js} +2 -2
  20. package/dist/chunk-LDM62TIX.js.map +1 -0
  21. package/dist/chunk-LOA3KWYJ.js +294 -0
  22. package/dist/chunk-LOA3KWYJ.js.map +1 -0
  23. package/dist/chunk-NA45DFXY.js +616 -0
  24. package/dist/chunk-NA45DFXY.js.map +1 -0
  25. package/dist/{chunk-4CMAEQQY.js → chunk-NQN6JPI7.js} +4 -3
  26. package/dist/chunk-NQN6JPI7.js.map +1 -0
  27. package/dist/chunk-OQJHPULO.js +103 -0
  28. package/dist/chunk-OQJHPULO.js.map +1 -0
  29. package/dist/chunk-QHNUMM4V.js +87 -0
  30. package/dist/chunk-QHNUMM4V.js.map +1 -0
  31. package/dist/chunk-RM6BWILN.js +74 -0
  32. package/dist/chunk-RM6BWILN.js.map +1 -0
  33. package/dist/chunk-WBR5J7EX.js +90 -0
  34. package/dist/chunk-WBR5J7EX.js.map +1 -0
  35. package/dist/chunk-Z2UKDBNL.js +162 -0
  36. package/dist/chunk-Z2UKDBNL.js.map +1 -0
  37. package/dist/cli.js +2136 -12600
  38. package/dist/cli.js.map +1 -1
  39. package/dist/context-M2A2DOFV.js +291 -0
  40. package/dist/context-M2A2DOFV.js.map +1 -0
  41. package/dist/context-feed-JMNW4GAM.js +391 -0
  42. package/dist/context-feed-JMNW4GAM.js.map +1 -0
  43. package/dist/cost-N37I4UTA.js +274 -0
  44. package/dist/cost-N37I4UTA.js.map +1 -0
  45. package/dist/create-554W5HNU.js +286 -0
  46. package/dist/create-554W5HNU.js.map +1 -0
  47. package/dist/daemon-XWPQPPPN.js +546 -0
  48. package/dist/daemon-XWPQPPPN.js.map +1 -0
  49. package/dist/dashboard-L7YKVQEB.js +945 -0
  50. package/dist/dashboard-L7YKVQEB.js.map +1 -0
  51. package/dist/dashboard-MFNRLCEE.js +794 -0
  52. package/dist/dashboard-MFNRLCEE.js.map +1 -0
  53. package/dist/doctor-RG75M5RO.js +346 -0
  54. package/dist/doctor-RG75M5RO.js.map +1 -0
  55. package/dist/env-config-KCLDBKYX.js +21 -0
  56. package/dist/exec-JQKBF7BL.js +197 -0
  57. package/dist/exec-JQKBF7BL.js.map +1 -0
  58. package/dist/feedback-KA2UYBZG.js +229 -0
  59. package/dist/feedback-KA2UYBZG.js.map +1 -0
  60. package/dist/github-UQTM5KMS.js +23 -0
  61. package/dist/goal-EOPC5ZCD.js +168 -0
  62. package/dist/goal-EOPC5ZCD.js.map +1 -0
  63. package/dist/health-3FZDOSR5.js +209 -0
  64. package/dist/health-3FZDOSR5.js.map +1 -0
  65. package/dist/history-TFVXJEDH.js +229 -0
  66. package/dist/history-TFVXJEDH.js.map +1 -0
  67. package/dist/index.js +1 -1
  68. package/dist/index.js.map +1 -1
  69. package/dist/init-UOWTNMIE.js +747 -0
  70. package/dist/init-UOWTNMIE.js.map +1 -0
  71. package/dist/kpi-2SQ2WCVT.js +413 -0
  72. package/dist/kpi-2SQ2WCVT.js.map +1 -0
  73. package/dist/learn-6ERTERAO.js +269 -0
  74. package/dist/learn-6ERTERAO.js.map +1 -0
  75. package/dist/list-KSOMUBMB.js +92 -0
  76. package/dist/list-KSOMUBMB.js.map +1 -0
  77. package/dist/login-ST6PAXYE.js +155 -0
  78. package/dist/login-ST6PAXYE.js.map +1 -0
  79. package/dist/memory-3CSNKXIL.js +562 -0
  80. package/dist/memory-3CSNKXIL.js.map +1 -0
  81. package/dist/progress-FKG4V2VH.js +202 -0
  82. package/dist/progress-FKG4V2VH.js.map +1 -0
  83. package/dist/providers-66PDCORB.js +65 -0
  84. package/dist/providers-66PDCORB.js.map +1 -0
  85. package/dist/results-2MJFLWEO.js +224 -0
  86. package/dist/results-2MJFLWEO.js.map +1 -0
  87. package/dist/run-72OQLH5A.js +2685 -0
  88. package/dist/run-72OQLH5A.js.map +1 -0
  89. package/dist/session-6H67XPAQ.js +64 -0
  90. package/dist/session-6H67XPAQ.js.map +1 -0
  91. package/dist/{chunk-NHGLXN2F.js → sessions-GVQIMN4W.js} +23 -459
  92. package/dist/sessions-GVQIMN4W.js.map +1 -0
  93. package/dist/{squad-parser-4BI3G4RS.js → squad-parser-CM3HOIWM.js} +2 -2
  94. package/dist/squad-parser-CM3HOIWM.js.map +1 -0
  95. package/dist/stats-ONZI557Q.js +335 -0
  96. package/dist/stats-ONZI557Q.js.map +1 -0
  97. package/dist/status-FYH42FTB.js +346 -0
  98. package/dist/status-FYH42FTB.js.map +1 -0
  99. package/dist/sync-HJZJNXHW.js +800 -0
  100. package/dist/sync-HJZJNXHW.js.map +1 -0
  101. package/dist/update-B4WMUOPO.js +83 -0
  102. package/dist/update-B4WMUOPO.js.map +1 -0
  103. package/dist/{update-ALJKFFM7.js → update-L7FGHN6W.js} +2 -2
  104. package/dist/update-L7FGHN6W.js.map +1 -0
  105. package/package.json +18 -10
  106. package/dist/chunk-4CMAEQQY.js.map +0 -1
  107. package/dist/chunk-NHGLXN2F.js.map +0 -1
  108. package/dist/chunk-O7UV3FWI.js.map +0 -1
  109. package/dist/sessions-6PB7ALCE.js +0 -16
  110. /package/dist/{sessions-6PB7ALCE.js.map → auth-YW3UPFSB.js.map} +0 -0
  111. /package/dist/{squad-parser-4BI3G4RS.js.map → env-config-KCLDBKYX.js.map} +0 -0
  112. /package/dist/{update-ALJKFFM7.js.map → github-UQTM5KMS.js.map} +0 -0
@@ -0,0 +1,562 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ Events,
4
+ track
5
+ } from "./chunk-L6GQCHDF.js";
6
+ import {
7
+ appendToMemory,
8
+ findMemoryDir,
9
+ getSquadState,
10
+ listMemoryEntries,
11
+ searchMemory
12
+ } from "./chunk-ZTQ7ISUR.js";
13
+ import {
14
+ RESET,
15
+ bold,
16
+ box,
17
+ colors,
18
+ gradient,
19
+ icons,
20
+ padEnd,
21
+ truncate,
22
+ writeLine
23
+ } from "./chunk-N7KDWU4W.js";
24
+ import "./chunk-7OCVIDC7.js";
25
+
26
+ // src/lib/services.ts
27
+ import { execSync } from "child_process";
28
+ var SERVICES = {
29
+ bridge: {
30
+ name: "Bridge API",
31
+ description: "Optional: captures conversations and telemetry",
32
+ required: false,
33
+ healthUrl: "http://localhost:8088/health",
34
+ envVars: ["SQUADS_BRIDGE_URL"],
35
+ setupGuide: [
36
+ "Not required for basic usage (init, run, status, eval).",
37
+ "To enable telemetry:",
38
+ " squads stack up",
39
+ " Or: docker compose up -d bridge"
40
+ ]
41
+ },
42
+ postgres: {
43
+ name: "PostgreSQL",
44
+ description: "Optional: enables scheduling, telemetry, and persistent storage",
45
+ required: false,
46
+ envVars: ["SQUADS_DATABASE_URL"],
47
+ setupGuide: [
48
+ "Not required for basic usage (init, run, status, eval).",
49
+ "To enable scheduling and telemetry:",
50
+ " squads stack up",
51
+ " Or: docker compose up -d postgres"
52
+ ]
53
+ },
54
+ mem0: {
55
+ name: "Mem0",
56
+ description: "Memory extraction and search",
57
+ required: false,
58
+ healthUrl: "http://localhost:8000/health",
59
+ envVars: ["MEM0_API_URL"],
60
+ setupGuide: [
61
+ "Run: squads stack up",
62
+ "Or manually: docker compose -f docker-compose.engram.yml up -d mem0",
63
+ "",
64
+ "Mem0 requires an LLM provider. Configure in docker/.env:",
65
+ " LLM_PROVIDER=ollama # For local (free)",
66
+ " LLM_PROVIDER=openai # Requires OPENAI_API_KEY"
67
+ ]
68
+ },
69
+ scheduler: {
70
+ name: "Scheduler API",
71
+ description: "Trigger evaluation and agent execution",
72
+ required: false,
73
+ healthUrl: "http://localhost:8090/health",
74
+ envVars: [],
75
+ setupGuide: [
76
+ "Run: docker compose -f docker-compose.engram.yml up -d scheduler-api scheduler-worker",
77
+ "",
78
+ "Scheduler runs agents on triggers defined in SQUAD.md"
79
+ ]
80
+ },
81
+ langfuse: {
82
+ name: "Langfuse",
83
+ description: "Telemetry dashboard and cost tracking",
84
+ required: false,
85
+ healthUrl: "http://localhost:3100/api/public/health",
86
+ envVars: ["LANGFUSE_HOST", "LANGFUSE_PUBLIC_KEY", "LANGFUSE_SECRET_KEY"],
87
+ setupGuide: [
88
+ "Run: squads stack up",
89
+ "Then get API keys from: http://localhost:3100",
90
+ " 1. Create account / login",
91
+ " 2. Create project",
92
+ " 3. Copy API keys to docker/.env"
93
+ ]
94
+ },
95
+ redis: {
96
+ name: "Redis",
97
+ description: "Caching and rate limiting",
98
+ required: false,
99
+ envVars: ["REDIS_URL"],
100
+ setupGuide: [
101
+ "Run: squads stack up"
102
+ ]
103
+ }
104
+ };
105
+ function getContainerStatus(name) {
106
+ try {
107
+ const runningOutput = execSync(
108
+ `docker inspect ${name} --format '{{.State.Running}}'`,
109
+ { encoding: "utf-8", stdio: ["pipe", "pipe", "ignore"] }
110
+ ).trim();
111
+ const running = runningOutput === "true";
112
+ if (!running) {
113
+ return { name, running: false, healthy: false };
114
+ }
115
+ let port;
116
+ try {
117
+ const portOutput = execSync(
118
+ `docker inspect ${name} --format '{{range .NetworkSettings.Ports}}{{range .}}{{.HostPort}}{{end}}{{end}}'`,
119
+ { encoding: "utf-8", stdio: ["pipe", "pipe", "ignore"] }
120
+ ).trim();
121
+ port = portOutput || void 0;
122
+ } catch {
123
+ }
124
+ let healthy = true;
125
+ try {
126
+ const healthOutput = execSync(
127
+ `docker inspect ${name} --format '{{if .State.Health}}{{.State.Health.Status}}{{else}}none{{end}}'`,
128
+ { encoding: "utf-8", stdio: ["pipe", "pipe", "ignore"] }
129
+ ).trim();
130
+ if (healthOutput === "healthy" || healthOutput === "none") {
131
+ healthy = true;
132
+ } else if (healthOutput === "starting") {
133
+ healthy = false;
134
+ } else {
135
+ healthy = false;
136
+ }
137
+ } catch {
138
+ healthy = true;
139
+ }
140
+ return { name, running, healthy, port };
141
+ } catch {
142
+ return { name, running: false, healthy: false };
143
+ }
144
+ }
145
+ async function checkService(url, timeout = 2e3) {
146
+ try {
147
+ const controller = new AbortController();
148
+ const timeoutId = setTimeout(() => controller.abort(), timeout);
149
+ const response = await fetch(url, { signal: controller.signal });
150
+ clearTimeout(timeoutId);
151
+ return response.ok;
152
+ } catch {
153
+ return false;
154
+ }
155
+ }
156
+ async function checkServiceAvailable(serviceName, showGuidance = true) {
157
+ const service = SERVICES[serviceName];
158
+ if (!service) return false;
159
+ const containerName = `squads-${serviceName === "mem0" ? "mem0" : serviceName}`;
160
+ const status = getContainerStatus(containerName);
161
+ if (!status.running) {
162
+ if (showGuidance) {
163
+ showServiceSetupGuide(serviceName, "not running");
164
+ }
165
+ return false;
166
+ }
167
+ if (service.healthUrl) {
168
+ const healthy = await checkService(service.healthUrl);
169
+ if (!healthy) {
170
+ if (showGuidance) {
171
+ showServiceSetupGuide(serviceName, "not responding");
172
+ }
173
+ return false;
174
+ }
175
+ }
176
+ return true;
177
+ }
178
+ function showServiceSetupGuide(serviceName, issue) {
179
+ const service = SERVICES[serviceName];
180
+ if (!service) return;
181
+ writeLine();
182
+ writeLine(` ${colors.yellow}${icons.warning}${RESET} ${bold}${service.name}${RESET} is ${issue}`);
183
+ writeLine(` ${colors.dim}${service.description}${RESET}`);
184
+ writeLine();
185
+ writeLine(` ${bold}To fix:${RESET}`);
186
+ for (const step of service.setupGuide) {
187
+ if (step === "") {
188
+ writeLine();
189
+ } else {
190
+ writeLine(` ${colors.dim}${step}${RESET}`);
191
+ }
192
+ }
193
+ if (service.envVars.length > 0) {
194
+ writeLine();
195
+ writeLine(` ${bold}Environment variables:${RESET}`);
196
+ for (const envVar of service.envVars) {
197
+ const value = process.env[envVar];
198
+ const status = value ? `${colors.green}\u2713${RESET}` : `${colors.red}\u2717${RESET}`;
199
+ writeLine(` ${status} ${colors.cyan}${envVar}${RESET}${value ? ` = ${colors.dim}${value}${RESET}` : ""}`);
200
+ }
201
+ }
202
+ writeLine();
203
+ writeLine(` ${colors.dim}Full setup: squads health${RESET}`);
204
+ writeLine();
205
+ }
206
+
207
+ // src/commands/memory.ts
208
+ var SQUADS_BRIDGE_URL = process.env.SQUADS_BRIDGE_URL || "http://localhost:8088";
209
+ var MEM0_API_URL = process.env.MEM0_API_URL || "http://localhost:8000";
210
+ async function memoryQueryCommand(query, options) {
211
+ await track(Events.CLI_MEMORY_QUERY, { squad: options.squad, agent: options.agent });
212
+ const memoryDir = findMemoryDir();
213
+ if (!memoryDir) {
214
+ writeLine(` ${colors.red}No .agents/memory directory found${RESET}`);
215
+ writeLine(` ${colors.dim}Run \`squads init\` to create one.${RESET}`);
216
+ process.exit(1);
217
+ }
218
+ writeLine();
219
+ writeLine(` ${gradient("squads")} ${colors.dim}memory query${RESET} "${colors.cyan}${query}${RESET}"`);
220
+ writeLine();
221
+ const results = searchMemory(query, memoryDir);
222
+ if (results.length === 0) {
223
+ writeLine(` ${colors.yellow}No results found.${RESET}`);
224
+ writeLine();
225
+ return;
226
+ }
227
+ let filtered = results;
228
+ if (options.squad) {
229
+ filtered = filtered.filter((r) => r.entry.squad === options.squad);
230
+ }
231
+ if (options.agent) {
232
+ filtered = filtered.filter((r) => r.entry.agent === options.agent);
233
+ }
234
+ writeLine(` ${colors.green}${filtered.length}${RESET} results found`);
235
+ writeLine();
236
+ const w = { location: 28, type: 10, score: 8 };
237
+ const tableWidth = w.location + w.type + w.score + 4;
238
+ writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);
239
+ const header = ` ${colors.purple}${box.vertical}${RESET} ${bold}${padEnd("LOCATION", w.location)}${RESET}${bold}${padEnd("TYPE", w.type)}${RESET}${bold}SCORE${RESET} ${colors.purple}${box.vertical}${RESET}`;
240
+ writeLine(header);
241
+ writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);
242
+ for (const result of filtered.slice(0, 8)) {
243
+ const { entry, score } = result;
244
+ const location = `${entry.squad}/${entry.agent}`;
245
+ const scoreColor = score > 5 ? colors.green : score > 2 ? colors.yellow : colors.dim;
246
+ const row = ` ${colors.purple}${box.vertical}${RESET} ${colors.cyan}${padEnd(location, w.location)}${RESET}${colors.dim}${padEnd(entry.type, w.type)}${RESET}${scoreColor}${padEnd(score.toFixed(1), w.score)}${RESET}${colors.purple}${box.vertical}${RESET}`;
247
+ writeLine(row);
248
+ }
249
+ writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);
250
+ writeLine();
251
+ writeLine(` ${bold}Matches${RESET}`);
252
+ writeLine();
253
+ for (const result of filtered.slice(0, 5)) {
254
+ const { entry, matches } = result;
255
+ for (const match of matches.slice(0, 2)) {
256
+ const highlighted = match.replace(
257
+ new RegExp(query, "gi"),
258
+ (m) => `${colors.yellow}${m}${RESET}`
259
+ );
260
+ writeLine(` ${icons.empty} ${truncate(highlighted, 60)}`);
261
+ writeLine(` ${colors.dim}\u2514 ${entry.squad}/${entry.agent}${RESET}`);
262
+ }
263
+ }
264
+ if (filtered.length > 5) {
265
+ writeLine(` ${colors.dim} +${filtered.length - 5} more results${RESET}`);
266
+ }
267
+ writeLine();
268
+ writeLine(` ${colors.dim}$${RESET} squads memory show ${colors.cyan}<squad>${RESET} ${colors.dim}View full memory${RESET}`);
269
+ writeLine();
270
+ }
271
+ async function memoryShowCommand(squadName, _options) {
272
+ await track(Events.CLI_MEMORY_SHOW, { squad: squadName });
273
+ const memoryDir = findMemoryDir();
274
+ if (!memoryDir) {
275
+ writeLine(` ${colors.red}No .agents/memory directory found${RESET}`);
276
+ process.exit(1);
277
+ }
278
+ const states = getSquadState(squadName);
279
+ if (states.length === 0) {
280
+ writeLine(` ${colors.yellow}No memory found for squad: ${squadName}${RESET}`);
281
+ return;
282
+ }
283
+ writeLine();
284
+ writeLine(` ${gradient("squads")} ${colors.dim}memory${RESET} ${colors.cyan}${squadName}${RESET}`);
285
+ writeLine();
286
+ writeLine(` ${colors.dim}${states.length} entries${RESET}`);
287
+ writeLine();
288
+ for (const state of states) {
289
+ writeLine(` ${icons.progress} ${colors.white}${state.agent}${RESET} ${colors.dim}(${state.type || "state"})${RESET}`);
290
+ writeLine(` ${colors.dim}${box.horizontal.repeat(40)}${RESET}`);
291
+ const lines = state.content.split("\n").slice(0, 12);
292
+ for (const line of lines) {
293
+ writeLine(` ${colors.dim}${truncate(line, 70)}${RESET}`);
294
+ }
295
+ if (state.content.split("\n").length > 12) {
296
+ writeLine(` ${colors.dim}... (more content)${RESET}`);
297
+ }
298
+ writeLine();
299
+ }
300
+ writeLine(` ${colors.dim}$${RESET} squads memory query ${colors.cyan}"<term>"${RESET} ${colors.dim}Search memory${RESET}`);
301
+ writeLine();
302
+ }
303
+ async function memoryUpdateCommand(squadName, content, options) {
304
+ await track(Events.CLI_MEMORY_UPDATE, { squad: squadName, agent: options.agent, type: options.type });
305
+ const agentName = options.agent || `${squadName}-lead`;
306
+ const type = options.type || "learnings";
307
+ writeLine();
308
+ try {
309
+ await appendToMemory(squadName, agentName, type, content);
310
+ writeLine(` ${icons.success} Updated ${colors.cyan}${type}${RESET} for ${colors.white}${squadName}/${agentName}${RESET}`);
311
+ } catch (error) {
312
+ writeLine(` ${icons.error} ${colors.red}Failed to update memory: ${error}${RESET}`);
313
+ process.exit(1);
314
+ }
315
+ writeLine();
316
+ }
317
+ async function memoryListCommand() {
318
+ await track(Events.CLI_MEMORY_LIST);
319
+ const memoryDir = findMemoryDir();
320
+ if (!memoryDir) {
321
+ writeLine(` ${colors.red}No .agents/memory directory found${RESET}`);
322
+ process.exit(1);
323
+ }
324
+ const entries = listMemoryEntries(memoryDir);
325
+ const bySquad = {};
326
+ for (const entry of entries) {
327
+ if (!bySquad[entry.squad]) {
328
+ bySquad[entry.squad] = [];
329
+ }
330
+ bySquad[entry.squad].push(entry);
331
+ }
332
+ writeLine();
333
+ writeLine(` ${gradient("squads")} ${colors.dim}memory list${RESET}`);
334
+ writeLine();
335
+ const squadNames = Object.keys(bySquad);
336
+ writeLine(` ${colors.cyan}${entries.length}${RESET} entries across ${squadNames.length} squads`);
337
+ writeLine();
338
+ const w = { squad: 16, agents: 8, types: 28 };
339
+ const tableWidth = w.squad + w.agents + w.types + 4;
340
+ writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);
341
+ const header = ` ${colors.purple}${box.vertical}${RESET} ${bold}${padEnd("SQUAD", w.squad)}${RESET}${bold}${padEnd("AGENTS", w.agents)}${RESET}${bold}TYPES${RESET} ${colors.purple}${box.vertical}${RESET}`;
342
+ writeLine(header);
343
+ writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);
344
+ for (const [squad, squadEntries] of Object.entries(bySquad)) {
345
+ const agents = new Set(squadEntries.map((e) => e.agent));
346
+ const types = [...new Set(squadEntries.map((e) => e.type))].join(", ");
347
+ const typesDisplay = truncate(types, w.types - 2);
348
+ const row = ` ${colors.purple}${box.vertical}${RESET} ${colors.cyan}${padEnd(squad, w.squad)}${RESET}${padEnd(String(agents.size), w.agents)}${colors.dim}${padEnd(typesDisplay, w.types)}${RESET}${colors.purple}${box.vertical}${RESET}`;
349
+ writeLine(row);
350
+ }
351
+ writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);
352
+ writeLine();
353
+ writeLine(` ${colors.dim}$${RESET} squads memory show ${colors.cyan}<squad>${RESET} ${colors.dim}View squad memory${RESET}`);
354
+ writeLine(` ${colors.dim}$${RESET} squads memory query ${colors.cyan}"<term>"${RESET} ${colors.dim}Search all memory${RESET}`);
355
+ writeLine();
356
+ }
357
+ async function memorySearchCommand(query, options = {}) {
358
+ writeLine();
359
+ writeLine(` ${gradient("squads")} ${colors.dim}memory search${RESET} "${colors.cyan}${query}${RESET}"`);
360
+ writeLine();
361
+ const limit = options.limit || 10;
362
+ const params = new URLSearchParams({ q: query, limit: String(limit) });
363
+ if (options.role) {
364
+ params.append("role", options.role);
365
+ }
366
+ if (options.importance) {
367
+ params.append("importance", options.importance);
368
+ }
369
+ try {
370
+ const response = await fetch(`${SQUADS_BRIDGE_URL}/api/conversations/search?${params}`);
371
+ if (!response.ok) {
372
+ if (response.status === 503) {
373
+ writeLine(` ${colors.yellow}Bridge service not available${RESET}`);
374
+ writeLine(` ${colors.dim}Conversation search requires the bridge service.${RESET}`);
375
+ writeLine(` ${colors.dim}For local memory search, use: squads memory query "${query}"${RESET}`);
376
+ writeLine();
377
+ return;
378
+ }
379
+ throw new Error(`HTTP ${response.status}`);
380
+ }
381
+ const data = await response.json();
382
+ const conversations = data.results;
383
+ const total = data.count;
384
+ if (conversations.length === 0) {
385
+ writeLine(` ${colors.yellow}No conversations found for "${query}"${RESET}`);
386
+ writeLine();
387
+ writeLine(` ${colors.dim}Conversations are captured via hooks. Make sure:${RESET}`);
388
+ writeLine(` ${colors.dim} 1. squads-bridge is running (docker compose up)${RESET}`);
389
+ writeLine(` ${colors.dim} 2. telemetry hooks are configured in Claude settings${RESET}`);
390
+ writeLine();
391
+ return;
392
+ }
393
+ writeLine(` ${colors.green}${conversations.length}${RESET} of ${total} results`);
394
+ writeLine();
395
+ const w = { time: 12, role: 10, type: 10, content: 50 };
396
+ const tableWidth = w.time + w.role + w.type + w.content + 6;
397
+ writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);
398
+ const header = ` ${colors.purple}${box.vertical}${RESET} ${bold}${padEnd("TIME", w.time)}${RESET}${bold}${padEnd("ROLE", w.role)}${RESET}${bold}${padEnd("TYPE", w.type)}${RESET}${bold}${padEnd("CONTENT", w.content)}${RESET} ${colors.purple}${box.vertical}${RESET}`;
399
+ writeLine(header);
400
+ writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);
401
+ for (const conv of conversations) {
402
+ const time = new Date(conv.created_at).toLocaleTimeString("en-US", { hour: "2-digit", minute: "2-digit" });
403
+ const roleColor = conv.role === "user" ? colors.cyan : conv.role === "thinking" ? colors.yellow : colors.green;
404
+ const importanceIcon = conv.importance === "high" ? icons.success : "";
405
+ const contentPreview = truncate((conv.content || "").replace(/\n/g, " "), w.content - 2);
406
+ const highlighted = contentPreview.replace(
407
+ new RegExp(query, "gi"),
408
+ (m) => `${colors.yellow}${m}${RESET}${colors.dim}`
409
+ );
410
+ const row = ` ${colors.purple}${box.vertical}${RESET} ${colors.dim}${padEnd(time, w.time)}${RESET}${roleColor}${padEnd(conv.role || "", w.role)}${RESET}${colors.dim}${padEnd(conv.type || "message", w.type)}${RESET}${colors.dim}${padEnd(highlighted + importanceIcon, w.content)}${RESET} ${colors.purple}${box.vertical}${RESET}`;
411
+ writeLine(row);
412
+ }
413
+ writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);
414
+ writeLine();
415
+ writeLine(` ${bold}Top Matches${RESET}`);
416
+ writeLine();
417
+ for (const conv of conversations.slice(0, 3)) {
418
+ const time = new Date(conv.created_at).toLocaleString("en-US", {
419
+ month: "short",
420
+ day: "numeric",
421
+ hour: "2-digit",
422
+ minute: "2-digit"
423
+ });
424
+ const roleIcon = conv.role === "user" ? "\u{1F464}" : conv.role === "thinking" ? "\u{1F4AD}" : "\u{1F916}";
425
+ writeLine(` ${roleIcon} ${colors.dim}${time}${RESET} ${conv.importance === "high" ? colors.yellow + "[high]" + RESET : ""}`);
426
+ const content = conv.content || "";
427
+ const preview = content.substring(0, 200).replace(/\n/g, " ");
428
+ const highlighted = preview.replace(
429
+ new RegExp(query, "gi"),
430
+ (m) => `${colors.yellow}${m}${RESET}`
431
+ );
432
+ writeLine(` ${highlighted}${content.length > 200 ? "..." : ""}`);
433
+ writeLine();
434
+ }
435
+ writeLine(` ${colors.dim}$${RESET} squads memory search ${colors.cyan}"<term>"${RESET} --role user ${colors.dim}Filter by role${RESET}`);
436
+ writeLine(` ${colors.dim}$${RESET} squads memory search ${colors.cyan}"<term>"${RESET} --importance high ${colors.dim}Filter by importance${RESET}`);
437
+ writeLine();
438
+ } catch (error) {
439
+ const errorMessage = error instanceof Error ? error.message : String(error);
440
+ if (errorMessage.includes("ECONNREFUSED") || errorMessage.includes("fetch failed")) {
441
+ showServiceSetupGuide("bridge", "not responding");
442
+ } else {
443
+ writeLine(` ${colors.red}Error searching conversations: ${errorMessage}${RESET}`);
444
+ writeLine();
445
+ }
446
+ }
447
+ }
448
+ async function memoryExtractCommand(options = {}) {
449
+ writeLine();
450
+ writeLine(` ${gradient("squads")} ${colors.dim}memory extract${RESET}`);
451
+ writeLine();
452
+ const hours = options.hours || 24;
453
+ try {
454
+ writeLine(` ${colors.dim}Fetching conversations from last ${hours}h...${RESET}`);
455
+ const bridgeResponse = await fetch(`${SQUADS_BRIDGE_URL}/api/conversations/recent`);
456
+ if (!bridgeResponse.ok) {
457
+ throw new Error(`Bridge API error: ${bridgeResponse.status}`);
458
+ }
459
+ const { conversations, count } = await bridgeResponse.json();
460
+ if (count === 0) {
461
+ writeLine(` ${colors.yellow}No recent conversations to extract${RESET}`);
462
+ writeLine();
463
+ return;
464
+ }
465
+ writeLine(` ${colors.green}${count}${RESET} conversations found`);
466
+ writeLine();
467
+ const sessions = /* @__PURE__ */ new Map();
468
+ for (const conv of conversations) {
469
+ const sessionId = conv.session_id || "unknown";
470
+ if (!sessions.has(sessionId)) {
471
+ sessions.set(sessionId, []);
472
+ }
473
+ sessions.get(sessionId).push(conv);
474
+ }
475
+ writeLine(` ${colors.cyan}${sessions.size}${RESET} sessions to process`);
476
+ writeLine();
477
+ if (options.dryRun) {
478
+ writeLine(` ${colors.yellow}Dry run - not sending to Engram${RESET}`);
479
+ writeLine();
480
+ for (const [sessionId, convs] of sessions) {
481
+ const squad = convs[0]?.squad || "unknown";
482
+ const agent = convs[0]?.agent || "unknown";
483
+ writeLine(` ${icons.progress} ${colors.dim}${sessionId.slice(0, 8)}${RESET} ${colors.cyan}${squad}/${agent}${RESET} ${colors.dim}(${convs.length} messages)${RESET}`);
484
+ }
485
+ writeLine();
486
+ return;
487
+ }
488
+ let extracted = 0;
489
+ let failed = 0;
490
+ for (const [sessionId, convs] of sessions) {
491
+ const squad = convs[0]?.squad || "hq";
492
+ const agent = convs[0]?.agent || "unknown";
493
+ const messages = convs.map((c) => ({
494
+ role: c.role === "assistant" ? "assistant" : c.role === "user" ? "user" : "system",
495
+ content: c.content
496
+ }));
497
+ try {
498
+ const mem0Response = await fetch(`${MEM0_API_URL}/memories`, {
499
+ method: "POST",
500
+ headers: { "Content-Type": "application/json" },
501
+ body: JSON.stringify({
502
+ messages,
503
+ user_id: squad,
504
+ agent_id: agent,
505
+ run_id: sessionId,
506
+ metadata: {
507
+ source: "squads-cli",
508
+ extracted_at: (/* @__PURE__ */ new Date()).toISOString()
509
+ }
510
+ })
511
+ });
512
+ if (mem0Response.ok) {
513
+ const result = await mem0Response.json();
514
+ const memCount = result.results?.length || 0;
515
+ writeLine(` ${colors.green}${icons.success}${RESET} ${colors.dim}${sessionId.slice(0, 8)}${RESET} ${colors.cyan}${squad}/${agent}${RESET} \u2192 ${colors.green}${memCount}${RESET} memories`);
516
+ extracted++;
517
+ } else {
518
+ writeLine(` ${colors.red}${icons.error}${RESET} ${colors.dim}${sessionId.slice(0, 8)}${RESET} ${colors.red}Failed: ${mem0Response.status}${RESET}`);
519
+ failed++;
520
+ }
521
+ } catch (err) {
522
+ writeLine(` ${colors.red}${icons.error}${RESET} ${colors.dim}${sessionId.slice(0, 8)}${RESET} ${colors.red}Error: ${err}${RESET}`);
523
+ failed++;
524
+ }
525
+ }
526
+ writeLine();
527
+ if (failed === 0) {
528
+ writeLine(` ${colors.green}${icons.success}${RESET} Extracted memories from ${extracted} sessions`);
529
+ } else {
530
+ writeLine(` ${colors.yellow}${icons.warning}${RESET} Extracted: ${extracted}, Failed: ${failed}`);
531
+ }
532
+ writeLine();
533
+ writeLine(` ${colors.dim}$${RESET} squads memory query ${colors.cyan}"<term>"${RESET} ${colors.dim}Search extracted memories${RESET}`);
534
+ writeLine();
535
+ } catch (error) {
536
+ const errorMessage = error instanceof Error ? error.message : String(error);
537
+ if (errorMessage.includes("ECONNREFUSED") || errorMessage.includes("fetch failed")) {
538
+ const bridgeOk = await checkServiceAvailable("bridge", false);
539
+ const mem0Ok = await checkServiceAvailable("mem0", false);
540
+ if (!bridgeOk) {
541
+ showServiceSetupGuide("bridge", "not responding");
542
+ } else if (!mem0Ok) {
543
+ showServiceSetupGuide("mem0", "not responding");
544
+ } else {
545
+ writeLine(` ${colors.red}Error: ${errorMessage}${RESET}`);
546
+ writeLine();
547
+ }
548
+ } else {
549
+ writeLine(` ${colors.red}Error: ${errorMessage}${RESET}`);
550
+ writeLine();
551
+ }
552
+ }
553
+ }
554
+ export {
555
+ memoryExtractCommand,
556
+ memoryListCommand,
557
+ memoryQueryCommand,
558
+ memorySearchCommand,
559
+ memoryShowCommand,
560
+ memoryUpdateCommand
561
+ };
562
+ //# sourceMappingURL=memory-3CSNKXIL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/services.ts","../src/commands/memory.ts"],"sourcesContent":["/**\n * Service availability checking utilities\n * Extracted from stack.ts for use across commands\n */\n\nimport { execSync } from 'child_process';\nimport {\n colors,\n bold,\n RESET,\n icons,\n writeLine,\n} from './terminal.js';\n\ninterface ContainerStatus {\n name: string;\n running: boolean;\n healthy: boolean;\n port?: string;\n}\n\ninterface ServiceInfo {\n name: string;\n description: string;\n required: boolean;\n healthUrl?: string;\n envVars: string[];\n setupGuide: string[];\n}\n\nconst SERVICES: Record<string, ServiceInfo> = {\n bridge: {\n name: 'Bridge API',\n description: 'Optional: captures conversations and telemetry',\n required: false,\n healthUrl: 'http://localhost:8088/health',\n envVars: ['SQUADS_BRIDGE_URL'],\n setupGuide: [\n 'Not required for basic usage (init, run, status, eval).',\n 'To enable telemetry:',\n ' squads stack up',\n ' Or: docker compose up -d bridge',\n ],\n },\n postgres: {\n name: 'PostgreSQL',\n description: 'Optional: enables scheduling, telemetry, and persistent storage',\n required: false,\n envVars: ['SQUADS_DATABASE_URL'],\n setupGuide: [\n 'Not required for basic usage (init, run, status, eval).',\n 'To enable scheduling and telemetry:',\n ' squads stack up',\n ' Or: docker compose up -d postgres',\n ],\n },\n mem0: {\n name: 'Mem0',\n description: 'Memory extraction and search',\n required: false,\n healthUrl: 'http://localhost:8000/health',\n envVars: ['MEM0_API_URL'],\n setupGuide: [\n 'Run: squads stack up',\n 'Or manually: docker compose -f docker-compose.engram.yml up -d mem0',\n '',\n 'Mem0 requires an LLM provider. Configure in docker/.env:',\n ' LLM_PROVIDER=ollama # For local (free)',\n ' LLM_PROVIDER=openai # Requires OPENAI_API_KEY',\n ],\n },\n scheduler: {\n name: 'Scheduler API',\n description: 'Trigger evaluation and agent execution',\n required: false,\n healthUrl: 'http://localhost:8090/health',\n envVars: [],\n setupGuide: [\n 'Run: docker compose -f docker-compose.engram.yml up -d scheduler-api scheduler-worker',\n '',\n 'Scheduler runs agents on triggers defined in SQUAD.md',\n ],\n },\n langfuse: {\n name: 'Langfuse',\n description: 'Telemetry dashboard and cost tracking',\n required: false,\n healthUrl: 'http://localhost:3100/api/public/health',\n envVars: ['LANGFUSE_HOST', 'LANGFUSE_PUBLIC_KEY', 'LANGFUSE_SECRET_KEY'],\n setupGuide: [\n 'Run: squads stack up',\n 'Then get API keys from: http://localhost:3100',\n ' 1. Create account / login',\n ' 2. Create project',\n ' 3. Copy API keys to docker/.env',\n ],\n },\n redis: {\n name: 'Redis',\n description: 'Caching and rate limiting',\n required: false,\n envVars: ['REDIS_URL'],\n setupGuide: [\n 'Run: squads stack up',\n ],\n },\n};\n\nfunction getContainerStatus(name: string): ContainerStatus {\n try {\n const runningOutput = execSync(\n `docker inspect ${name} --format '{{.State.Running}}'`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'ignore'] }\n ).trim();\n\n const running = runningOutput === 'true';\n\n if (!running) {\n return { name, running: false, healthy: false };\n }\n\n let port: string | undefined;\n try {\n const portOutput = execSync(\n `docker inspect ${name} --format '{{range .NetworkSettings.Ports}}{{range .}}{{.HostPort}}{{end}}{{end}}'`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'ignore'] }\n ).trim();\n port = portOutput || undefined;\n } catch {\n // Ignore port errors\n }\n\n let healthy = true;\n try {\n const healthOutput = execSync(\n `docker inspect ${name} --format '{{if .State.Health}}{{.State.Health.Status}}{{else}}none{{end}}'`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'ignore'] }\n ).trim();\n\n if (healthOutput === 'healthy' || healthOutput === 'none') {\n healthy = true;\n } else if (healthOutput === 'starting') {\n healthy = false;\n } else {\n healthy = false;\n }\n } catch {\n healthy = true;\n }\n\n return { name, running, healthy, port };\n } catch {\n return { name, running: false, healthy: false };\n }\n}\n\nasync function checkService(url: string, timeout = 2000): Promise<boolean> {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n const response = await fetch(url, { signal: controller.signal });\n clearTimeout(timeoutId);\n return response.ok;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if a service is available and show guidance if not\n */\nexport async function checkServiceAvailable(\n serviceName: keyof typeof SERVICES,\n showGuidance = true\n): Promise<boolean> {\n const service = SERVICES[serviceName];\n if (!service) return false;\n\n const containerName = `squads-${serviceName === 'mem0' ? 'mem0' : serviceName}`;\n const status = getContainerStatus(containerName);\n\n if (!status.running) {\n if (showGuidance) {\n showServiceSetupGuide(serviceName, 'not running');\n }\n return false;\n }\n\n if (service.healthUrl) {\n const healthy = await checkService(service.healthUrl);\n if (!healthy) {\n if (showGuidance) {\n showServiceSetupGuide(serviceName, 'not responding');\n }\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Show setup guide for a service\n */\nexport function showServiceSetupGuide(\n serviceName: keyof typeof SERVICES,\n issue: string\n): void {\n const service = SERVICES[serviceName];\n if (!service) return;\n\n writeLine();\n writeLine(` ${colors.yellow}${icons.warning}${RESET} ${bold}${service.name}${RESET} is ${issue}`);\n writeLine(` ${colors.dim}${service.description}${RESET}`);\n writeLine();\n\n writeLine(` ${bold}To fix:${RESET}`);\n for (const step of service.setupGuide) {\n if (step === '') {\n writeLine();\n } else {\n writeLine(` ${colors.dim}${step}${RESET}`);\n }\n }\n\n if (service.envVars.length > 0) {\n writeLine();\n writeLine(` ${bold}Environment variables:${RESET}`);\n for (const envVar of service.envVars) {\n const value = process.env[envVar];\n const status = value ? `${colors.green}✓${RESET}` : `${colors.red}✗${RESET}`;\n writeLine(` ${status} ${colors.cyan}${envVar}${RESET}${value ? ` = ${colors.dim}${value}${RESET}` : ''}`);\n }\n }\n\n writeLine();\n writeLine(` ${colors.dim}Full setup: squads health${RESET}`);\n writeLine();\n}\n","import {\n findMemoryDir,\n searchMemory,\n getSquadState,\n appendToMemory,\n listMemoryEntries\n} from '../lib/memory.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n padEnd,\n truncate,\n icons,\n writeLine,\n} from '../lib/terminal.js';\nimport { checkServiceAvailable, showServiceSetupGuide } from '../lib/services.js';\nimport { track, Events } from '../lib/telemetry.js';\n\nconst SQUADS_BRIDGE_URL = process.env.SQUADS_BRIDGE_URL || 'http://localhost:8088';\nconst MEM0_API_URL = process.env.MEM0_API_URL || 'http://localhost:8000';\n\ninterface MemoryOptions {\n squad?: string;\n agent?: string;\n type?: string;\n}\n\nexport async function memoryQueryCommand(\n query: string,\n options: MemoryOptions\n): Promise<void> {\n await track(Events.CLI_MEMORY_QUERY, { squad: options.squad, agent: options.agent });\n const memoryDir = findMemoryDir();\n\n if (!memoryDir) {\n writeLine(` ${colors.red}No .agents/memory directory found${RESET}`);\n writeLine(` ${colors.dim}Run \\`squads init\\` to create one.${RESET}`);\n process.exit(1);\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}memory query${RESET} \"${colors.cyan}${query}${RESET}\"`);\n writeLine();\n\n const results = searchMemory(query, memoryDir);\n\n if (results.length === 0) {\n writeLine(` ${colors.yellow}No results found.${RESET}`);\n writeLine();\n return;\n }\n\n // Filter by squad/agent if specified\n let filtered = results;\n if (options.squad) {\n filtered = filtered.filter(r => r.entry.squad === options.squad);\n }\n if (options.agent) {\n filtered = filtered.filter(r => r.entry.agent === options.agent);\n }\n\n writeLine(` ${colors.green}${filtered.length}${RESET} results found`);\n writeLine();\n\n // Table\n const w = { location: 28, type: 10, score: 8 };\n const tableWidth = w.location + w.type + w.score + 4;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n\n const header = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${bold}${padEnd('LOCATION', w.location)}${RESET}` +\n `${bold}${padEnd('TYPE', w.type)}${RESET}` +\n `${bold}SCORE${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n writeLine(header);\n\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const result of filtered.slice(0, 8)) {\n const { entry, score } = result;\n const location = `${entry.squad}/${entry.agent}`;\n const scoreColor = score > 5 ? colors.green : score > 2 ? colors.yellow : colors.dim;\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.cyan}${padEnd(location, w.location)}${RESET}` +\n `${colors.dim}${padEnd(entry.type, w.type)}${RESET}` +\n `${scoreColor}${padEnd(score.toFixed(1), w.score)}${RESET}` +\n `${colors.purple}${box.vertical}${RESET}`;\n\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n\n // Show matches\n writeLine(` ${bold}Matches${RESET}`);\n writeLine();\n\n for (const result of filtered.slice(0, 5)) {\n const { entry, matches } = result;\n\n for (const match of matches.slice(0, 2)) {\n const highlighted = match.replace(\n new RegExp(query, 'gi'),\n (m) => `${colors.yellow}${m}${RESET}`\n );\n writeLine(` ${icons.empty} ${truncate(highlighted, 60)}`);\n writeLine(` ${colors.dim}└ ${entry.squad}/${entry.agent}${RESET}`);\n }\n }\n\n if (filtered.length > 5) {\n writeLine(` ${colors.dim} +${filtered.length - 5} more results${RESET}`);\n }\n writeLine();\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads memory show ${colors.cyan}<squad>${RESET} ${colors.dim}View full memory${RESET}`);\n writeLine();\n}\n\nexport async function memoryShowCommand(\n squadName: string,\n _options: MemoryOptions\n): Promise<void> {\n await track(Events.CLI_MEMORY_SHOW, { squad: squadName });\n const memoryDir = findMemoryDir();\n\n if (!memoryDir) {\n writeLine(` ${colors.red}No .agents/memory directory found${RESET}`);\n process.exit(1);\n }\n\n const states = getSquadState(squadName);\n\n if (states.length === 0) {\n writeLine(` ${colors.yellow}No memory found for squad: ${squadName}${RESET}`);\n return;\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}memory${RESET} ${colors.cyan}${squadName}${RESET}`);\n writeLine();\n\n writeLine(` ${colors.dim}${states.length} entries${RESET}`);\n writeLine();\n\n for (const state of states) {\n writeLine(` ${icons.progress} ${colors.white}${state.agent}${RESET} ${colors.dim}(${state.type || 'state'})${RESET}`);\n writeLine(` ${colors.dim}${box.horizontal.repeat(40)}${RESET}`);\n\n // Show preview\n const lines = state.content.split('\\n').slice(0, 12);\n for (const line of lines) {\n writeLine(` ${colors.dim}${truncate(line, 70)}${RESET}`);\n }\n\n if (state.content.split('\\n').length > 12) {\n writeLine(` ${colors.dim}... (more content)${RESET}`);\n }\n writeLine();\n }\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads memory query ${colors.cyan}\"<term>\"${RESET} ${colors.dim}Search memory${RESET}`);\n writeLine();\n}\n\nexport async function memoryUpdateCommand(\n squadName: string,\n content: string,\n options: MemoryOptions\n): Promise<void> {\n await track(Events.CLI_MEMORY_UPDATE, { squad: squadName, agent: options.agent, type: options.type });\n const agentName = options.agent || `${squadName}-lead`;\n const type = (options.type || 'learnings') as 'state' | 'output' | 'learnings' | 'feedback';\n\n writeLine();\n\n try {\n await appendToMemory(squadName, agentName, type, content);\n writeLine(` ${icons.success} Updated ${colors.cyan}${type}${RESET} for ${colors.white}${squadName}/${agentName}${RESET}`);\n } catch (error) {\n writeLine(` ${icons.error} ${colors.red}Failed to update memory: ${error}${RESET}`);\n process.exit(1);\n }\n\n writeLine();\n}\n\nexport async function memoryListCommand(): Promise<void> {\n await track(Events.CLI_MEMORY_LIST);\n const memoryDir = findMemoryDir();\n\n if (!memoryDir) {\n writeLine(` ${colors.red}No .agents/memory directory found${RESET}`);\n process.exit(1);\n }\n\n const entries = listMemoryEntries(memoryDir);\n\n // Group by squad\n const bySquad: Record<string, typeof entries> = {};\n for (const entry of entries) {\n if (!bySquad[entry.squad]) {\n bySquad[entry.squad] = [];\n }\n bySquad[entry.squad].push(entry);\n }\n\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}memory list${RESET}`);\n writeLine();\n\n const squadNames = Object.keys(bySquad);\n writeLine(` ${colors.cyan}${entries.length}${RESET} entries across ${squadNames.length} squads`);\n writeLine();\n\n // Table\n const w = { squad: 16, agents: 8, types: 28 };\n const tableWidth = w.squad + w.agents + w.types + 4;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n\n const header = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${bold}${padEnd('SQUAD', w.squad)}${RESET}` +\n `${bold}${padEnd('AGENTS', w.agents)}${RESET}` +\n `${bold}TYPES${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n writeLine(header);\n\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const [squad, squadEntries] of Object.entries(bySquad)) {\n const agents = new Set(squadEntries.map(e => e.agent));\n const types = [...new Set(squadEntries.map(e => e.type))].join(', ');\n const typesDisplay = truncate(types, w.types - 2);\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.cyan}${padEnd(squad, w.squad)}${RESET}` +\n `${padEnd(String(agents.size), w.agents)}` +\n `${colors.dim}${padEnd(typesDisplay, w.types)}${RESET}` +\n `${colors.purple}${box.vertical}${RESET}`;\n\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads memory show ${colors.cyan}<squad>${RESET} ${colors.dim}View squad memory${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads memory query ${colors.cyan}\"<term>\"${RESET} ${colors.dim}Search all memory${RESET}`);\n writeLine();\n}\n\ninterface ConversationResult {\n id: number;\n session_id: string;\n role: string;\n content: string;\n type: string; // message_type in the API response\n importance: string;\n created_at: string;\n rank: number;\n}\n\nexport async function memorySearchCommand(\n query: string,\n options: { limit?: number; role?: string; importance?: string } = {}\n): Promise<void> {\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}memory search${RESET} \"${colors.cyan}${query}${RESET}\"`);\n writeLine();\n\n const limit = options.limit || 10;\n const params = new URLSearchParams({ q: query, limit: String(limit) });\n\n if (options.role) {\n params.append('role', options.role);\n }\n if (options.importance) {\n params.append('importance', options.importance);\n }\n\n try {\n const response = await fetch(`${SQUADS_BRIDGE_URL}/api/conversations/search?${params}`);\n\n if (!response.ok) {\n if (response.status === 503) {\n writeLine(` ${colors.yellow}Bridge service not available${RESET}`);\n writeLine(` ${colors.dim}Conversation search requires the bridge service.${RESET}`);\n writeLine(` ${colors.dim}For local memory search, use: squads memory query \"${query}\"${RESET}`);\n writeLine();\n return;\n }\n throw new Error(`HTTP ${response.status}`);\n }\n\n const data = await response.json() as { results: ConversationResult[]; count: number };\n const conversations = data.results;\n const total = data.count;\n\n if (conversations.length === 0) {\n writeLine(` ${colors.yellow}No conversations found for \"${query}\"${RESET}`);\n writeLine();\n writeLine(` ${colors.dim}Conversations are captured via hooks. Make sure:${RESET}`);\n writeLine(` ${colors.dim} 1. squads-bridge is running (docker compose up)${RESET}`);\n writeLine(` ${colors.dim} 2. telemetry hooks are configured in Claude settings${RESET}`);\n writeLine();\n return;\n }\n\n writeLine(` ${colors.green}${conversations.length}${RESET} of ${total} results`);\n writeLine();\n\n // Table\n const w = { time: 12, role: 10, type: 10, content: 50 };\n const tableWidth = w.time + w.role + w.type + w.content + 6;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n\n const header = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${bold}${padEnd('TIME', w.time)}${RESET}` +\n `${bold}${padEnd('ROLE', w.role)}${RESET}` +\n `${bold}${padEnd('TYPE', w.type)}${RESET}` +\n `${bold}${padEnd('CONTENT', w.content)}${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n writeLine(header);\n\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const conv of conversations) {\n const time = new Date(conv.created_at).toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit' });\n const roleColor = conv.role === 'user' ? colors.cyan : conv.role === 'thinking' ? colors.yellow : colors.green;\n const importanceIcon = conv.importance === 'high' ? icons.success : '';\n\n // Highlight search term in content\n const contentPreview = truncate((conv.content || '').replace(/\\n/g, ' '), w.content - 2);\n const highlighted = contentPreview.replace(\n new RegExp(query, 'gi'),\n (m) => `${colors.yellow}${m}${RESET}${colors.dim}`\n );\n\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.dim}${padEnd(time, w.time)}${RESET}` +\n `${roleColor}${padEnd(conv.role || '', w.role)}${RESET}` +\n `${colors.dim}${padEnd(conv.type || 'message', w.type)}${RESET}` +\n `${colors.dim}${padEnd(highlighted + importanceIcon, w.content)}${RESET}` +\n ` ${colors.purple}${box.vertical}${RESET}`;\n\n writeLine(row);\n }\n\n writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);\n writeLine();\n\n // Expanded view of top results\n writeLine(` ${bold}Top Matches${RESET}`);\n writeLine();\n\n for (const conv of conversations.slice(0, 3)) {\n const time = new Date(conv.created_at).toLocaleString('en-US', {\n month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit'\n });\n const roleIcon = conv.role === 'user' ? '👤' : conv.role === 'thinking' ? '💭' : '🤖';\n\n writeLine(` ${roleIcon} ${colors.dim}${time}${RESET} ${conv.importance === 'high' ? colors.yellow + '[high]' + RESET : ''}`);\n\n // Show first 200 chars with highlighted search term\n const content = conv.content || '';\n const preview = content.substring(0, 200).replace(/\\n/g, ' ');\n const highlighted = preview.replace(\n new RegExp(query, 'gi'),\n (m) => `${colors.yellow}${m}${RESET}`\n );\n writeLine(` ${highlighted}${content.length > 200 ? '...' : ''}`);\n writeLine();\n }\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads memory search ${colors.cyan}\"<term>\"${RESET} --role user ${colors.dim}Filter by role${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads memory search ${colors.cyan}\"<term>\"${RESET} --importance high ${colors.dim}Filter by importance${RESET}`);\n writeLine();\n\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (errorMessage.includes('ECONNREFUSED') || errorMessage.includes('fetch failed')) {\n showServiceSetupGuide('bridge', 'not responding');\n } else {\n writeLine(` ${colors.red}Error searching conversations: ${errorMessage}${RESET}`);\n writeLine();\n }\n }\n}\n\ninterface ExtractOptions {\n session?: string;\n hours?: number;\n dryRun?: boolean;\n}\n\n/**\n * Extract memories from recent conversations and store in Engram\n */\nexport async function memoryExtractCommand(\n options: ExtractOptions = {}\n): Promise<void> {\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}memory extract${RESET}`);\n writeLine();\n\n const hours = options.hours || 24;\n\n try {\n // 1. Fetch recent conversations from bridge\n writeLine(` ${colors.dim}Fetching conversations from last ${hours}h...${RESET}`);\n\n const bridgeResponse = await fetch(`${SQUADS_BRIDGE_URL}/api/conversations/recent`);\n if (!bridgeResponse.ok) {\n throw new Error(`Bridge API error: ${bridgeResponse.status}`);\n }\n\n const { conversations, count } = await bridgeResponse.json() as {\n conversations: Array<{\n id: number;\n session_id: string;\n role: string;\n content: string;\n squad?: string;\n agent?: string;\n created_at: string;\n }>;\n count: number;\n };\n\n if (count === 0) {\n writeLine(` ${colors.yellow}No recent conversations to extract${RESET}`);\n writeLine();\n return;\n }\n\n writeLine(` ${colors.green}${count}${RESET} conversations found`);\n writeLine();\n\n // 2. Group conversations by session\n const sessions = new Map<string, typeof conversations>();\n for (const conv of conversations) {\n const sessionId = conv.session_id || 'unknown';\n if (!sessions.has(sessionId)) {\n sessions.set(sessionId, []);\n }\n sessions.get(sessionId)!.push(conv);\n }\n\n writeLine(` ${colors.cyan}${sessions.size}${RESET} sessions to process`);\n writeLine();\n\n if (options.dryRun) {\n writeLine(` ${colors.yellow}Dry run - not sending to Engram${RESET}`);\n writeLine();\n for (const [sessionId, convs] of sessions) {\n const squad = convs[0]?.squad || 'unknown';\n const agent = convs[0]?.agent || 'unknown';\n writeLine(` ${icons.progress} ${colors.dim}${sessionId.slice(0, 8)}${RESET} ${colors.cyan}${squad}/${agent}${RESET} ${colors.dim}(${convs.length} messages)${RESET}`);\n }\n writeLine();\n return;\n }\n\n // 3. Send each session to mem0 for extraction\n let extracted = 0;\n let failed = 0;\n\n for (const [sessionId, convs] of sessions) {\n const squad = convs[0]?.squad || 'hq';\n const agent = convs[0]?.agent || 'unknown';\n\n // Format messages for mem0\n const messages = convs.map(c => ({\n role: c.role === 'assistant' ? 'assistant' : c.role === 'user' ? 'user' : 'system',\n content: c.content\n }));\n\n try {\n const mem0Response = await fetch(`${MEM0_API_URL}/memories`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n messages,\n user_id: squad,\n agent_id: agent,\n run_id: sessionId,\n metadata: {\n source: 'squads-cli',\n extracted_at: new Date().toISOString()\n }\n })\n });\n\n if (mem0Response.ok) {\n const result = await mem0Response.json() as { results?: Array<unknown> };\n const memCount = result.results?.length || 0;\n writeLine(` ${colors.green}${icons.success}${RESET} ${colors.dim}${sessionId.slice(0, 8)}${RESET} ${colors.cyan}${squad}/${agent}${RESET} → ${colors.green}${memCount}${RESET} memories`);\n extracted++;\n } else {\n writeLine(` ${colors.red}${icons.error}${RESET} ${colors.dim}${sessionId.slice(0, 8)}${RESET} ${colors.red}Failed: ${mem0Response.status}${RESET}`);\n failed++;\n }\n } catch (err) {\n writeLine(` ${colors.red}${icons.error}${RESET} ${colors.dim}${sessionId.slice(0, 8)}${RESET} ${colors.red}Error: ${err}${RESET}`);\n failed++;\n }\n }\n\n writeLine();\n if (failed === 0) {\n writeLine(` ${colors.green}${icons.success}${RESET} Extracted memories from ${extracted} sessions`);\n } else {\n writeLine(` ${colors.yellow}${icons.warning}${RESET} Extracted: ${extracted}, Failed: ${failed}`);\n }\n writeLine();\n\n // Show next steps\n writeLine(` ${colors.dim}$${RESET} squads memory query ${colors.cyan}\"<term>\"${RESET} ${colors.dim}Search extracted memories${RESET}`);\n writeLine();\n\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n if (errorMessage.includes('ECONNREFUSED') || errorMessage.includes('fetch failed')) {\n // Check which service is down\n const bridgeOk = await checkServiceAvailable('bridge', false);\n const mem0Ok = await checkServiceAvailable('mem0', false);\n\n if (!bridgeOk) {\n showServiceSetupGuide('bridge', 'not responding');\n } else if (!mem0Ok) {\n showServiceSetupGuide('mem0', 'not responding');\n } else {\n writeLine(` ${colors.red}Error: ${errorMessage}${RESET}`);\n writeLine();\n }\n } else {\n writeLine(` ${colors.red}Error: ${errorMessage}${RESET}`);\n writeLine();\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,SAAS,gBAAgB;AAyBzB,IAAM,WAAwC;AAAA,EAC5C,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,WAAW;AAAA,IACX,SAAS,CAAC,mBAAmB;AAAA,IAC7B,YAAY;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC,qBAAqB;AAAA,IAC/B,YAAY;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,WAAW;AAAA,IACX,SAAS,CAAC,cAAc;AAAA,IACxB,YAAY;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,WAAW;AAAA,IACT,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,WAAW;AAAA,IACX,SAAS,CAAC;AAAA,IACV,YAAY;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,WAAW;AAAA,IACX,SAAS,CAAC,iBAAiB,uBAAuB,qBAAqB;AAAA,IACvE,YAAY;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU;AAAA,IACV,SAAS,CAAC,WAAW;AAAA,IACrB,YAAY;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,MAA+B;AACzD,MAAI;AACF,UAAM,gBAAgB;AAAA,MACpB,kBAAkB,IAAI;AAAA,MACtB,EAAE,UAAU,SAAS,OAAO,CAAC,QAAQ,QAAQ,QAAQ,EAAE;AAAA,IACzD,EAAE,KAAK;AAEP,UAAM,UAAU,kBAAkB;AAElC,QAAI,CAAC,SAAS;AACZ,aAAO,EAAE,MAAM,SAAS,OAAO,SAAS,MAAM;AAAA,IAChD;AAEA,QAAI;AACJ,QAAI;AACF,YAAM,aAAa;AAAA,QACjB,kBAAkB,IAAI;AAAA,QACtB,EAAE,UAAU,SAAS,OAAO,CAAC,QAAQ,QAAQ,QAAQ,EAAE;AAAA,MACzD,EAAE,KAAK;AACP,aAAO,cAAc;AAAA,IACvB,QAAQ;AAAA,IAER;AAEA,QAAI,UAAU;AACd,QAAI;AACF,YAAM,eAAe;AAAA,QACnB,kBAAkB,IAAI;AAAA,QACtB,EAAE,UAAU,SAAS,OAAO,CAAC,QAAQ,QAAQ,QAAQ,EAAE;AAAA,MACzD,EAAE,KAAK;AAEP,UAAI,iBAAiB,aAAa,iBAAiB,QAAQ;AACzD,kBAAU;AAAA,MACZ,WAAW,iBAAiB,YAAY;AACtC,kBAAU;AAAA,MACZ,OAAO;AACL,kBAAU;AAAA,MACZ;AAAA,IACF,QAAQ;AACN,gBAAU;AAAA,IACZ;AAEA,WAAO,EAAE,MAAM,SAAS,SAAS,KAAK;AAAA,EACxC,QAAQ;AACN,WAAO,EAAE,MAAM,SAAS,OAAO,SAAS,MAAM;AAAA,EAChD;AACF;AAEA,eAAe,aAAa,KAAa,UAAU,KAAwB;AACzE,MAAI;AACF,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,YAAY,WAAW,MAAM,WAAW,MAAM,GAAG,OAAO;AAE9D,UAAM,WAAW,MAAM,MAAM,KAAK,EAAE,QAAQ,WAAW,OAAO,CAAC;AAC/D,iBAAa,SAAS;AACtB,WAAO,SAAS;AAAA,EAClB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKA,eAAsB,sBACpB,aACA,eAAe,MACG;AAClB,QAAM,UAAU,SAAS,WAAW;AACpC,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,gBAAgB,UAAU,gBAAgB,SAAS,SAAS,WAAW;AAC7E,QAAM,SAAS,mBAAmB,aAAa;AAE/C,MAAI,CAAC,OAAO,SAAS;AACnB,QAAI,cAAc;AAChB,4BAAsB,aAAa,aAAa;AAAA,IAClD;AACA,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,WAAW;AACrB,UAAM,UAAU,MAAM,aAAa,QAAQ,SAAS;AACpD,QAAI,CAAC,SAAS;AACZ,UAAI,cAAc;AAChB,8BAAsB,aAAa,gBAAgB;AAAA,MACrD;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAKO,SAAS,sBACd,aACA,OACM;AACN,QAAM,UAAU,SAAS,WAAW;AACpC,MAAI,CAAC,QAAS;AAEd,YAAU;AACV,YAAU,KAAK,OAAO,MAAM,GAAG,MAAM,OAAO,GAAG,KAAK,IAAI,IAAI,GAAG,QAAQ,IAAI,GAAG,KAAK,OAAO,KAAK,EAAE;AACjG,YAAU,KAAK,OAAO,GAAG,GAAG,QAAQ,WAAW,GAAG,KAAK,EAAE;AACzD,YAAU;AAEV,YAAU,KAAK,IAAI,UAAU,KAAK,EAAE;AACpC,aAAW,QAAQ,QAAQ,YAAY;AACrC,QAAI,SAAS,IAAI;AACf,gBAAU;AAAA,IACZ,OAAO;AACL,gBAAU,KAAK,OAAO,GAAG,GAAG,IAAI,GAAG,KAAK,EAAE;AAAA,IAC5C;AAAA,EACF;AAEA,MAAI,QAAQ,QAAQ,SAAS,GAAG;AAC9B,cAAU;AACV,cAAU,KAAK,IAAI,yBAAyB,KAAK,EAAE;AACnD,eAAW,UAAU,QAAQ,SAAS;AACpC,YAAM,QAAQ,QAAQ,IAAI,MAAM;AAChC,YAAM,SAAS,QAAQ,GAAG,OAAO,KAAK,SAAI,KAAK,KAAK,GAAG,OAAO,GAAG,SAAI,KAAK;AAC1E,gBAAU,KAAK,MAAM,IAAI,OAAO,IAAI,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,MAAM,OAAO,GAAG,GAAG,KAAK,GAAG,KAAK,KAAK,EAAE,EAAE;AAAA,IAC3G;AAAA,EACF;AAEA,YAAU;AACV,YAAU,KAAK,OAAO,GAAG,4BAA4B,KAAK,EAAE;AAC5D,YAAU;AACZ;;;AC1NA,IAAM,oBAAoB,QAAQ,IAAI,qBAAqB;AAC3D,IAAM,eAAe,QAAQ,IAAI,gBAAgB;AAQjD,eAAsB,mBACpB,OACA,SACe;AACf,QAAM,MAAM,OAAO,kBAAkB,EAAE,OAAO,QAAQ,OAAO,OAAO,QAAQ,MAAM,CAAC;AACnF,QAAM,YAAY,cAAc;AAEhC,MAAI,CAAC,WAAW;AACd,cAAU,KAAK,OAAO,GAAG,oCAAoC,KAAK,EAAE;AACpE,cAAU,KAAK,OAAO,GAAG,qCAAqC,KAAK,EAAE;AACrE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,YAAU;AACV,YAAU,KAAK,SAAS,QAAQ,CAAC,IAAI,OAAO,GAAG,eAAe,KAAK,KAAK,OAAO,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG;AACtG,YAAU;AAEV,QAAM,UAAU,aAAa,OAAO,SAAS;AAE7C,MAAI,QAAQ,WAAW,GAAG;AACxB,cAAU,KAAK,OAAO,MAAM,oBAAoB,KAAK,EAAE;AACvD,cAAU;AACV;AAAA,EACF;AAGA,MAAI,WAAW;AACf,MAAI,QAAQ,OAAO;AACjB,eAAW,SAAS,OAAO,OAAK,EAAE,MAAM,UAAU,QAAQ,KAAK;AAAA,EACjE;AACA,MAAI,QAAQ,OAAO;AACjB,eAAW,SAAS,OAAO,OAAK,EAAE,MAAM,UAAU,QAAQ,KAAK;AAAA,EACjE;AAEA,YAAU,KAAK,OAAO,KAAK,GAAG,SAAS,MAAM,GAAG,KAAK,gBAAgB;AACrE,YAAU;AAGV,QAAM,IAAI,EAAE,UAAU,IAAI,MAAM,IAAI,OAAO,EAAE;AAC7C,QAAM,aAAa,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ;AAEnD,YAAU,KAAK,OAAO,MAAM,GAAG,IAAI,OAAO,GAAG,OAAO,GAAG,GAAG,IAAI,WAAW,OAAO,UAAU,CAAC,GAAG,OAAO,MAAM,GAAG,IAAI,QAAQ,GAAG,KAAK,EAAE;AAEpI,QAAM,SAAS,KAAK,OAAO,MAAM,GAAG,IAAI,QAAQ,GAAG,KAAK,IACnD,IAAI,GAAG,OAAO,YAAY,EAAE,QAAQ,CAAC,GAAG,KAAK,GAC7C,IAAI,GAAG,OAAO,QAAQ,EAAE,IAAI,CAAC,GAAG,KAAK,GACrC,IAAI,QAAQ,KAAK,IAChB,OAAO,MAAM,GAAG,IAAI,QAAQ,GAAG,KAAK;AAC1C,YAAU,MAAM;AAEhB,YAAU,KAAK,OAAO,MAAM,GAAG,IAAI,QAAQ,GAAG,OAAO,GAAG,GAAG,IAAI,WAAW,OAAO,UAAU,CAAC,GAAG,OAAO,MAAM,GAAG,IAAI,OAAO,GAAG,KAAK,EAAE;AAEpI,aAAW,UAAU,SAAS,MAAM,GAAG,CAAC,GAAG;AACzC,UAAM,EAAE,OAAO,MAAM,IAAI;AACzB,UAAM,WAAW,GAAG,MAAM,KAAK,IAAI,MAAM,KAAK;AAC9C,UAAM,aAAa,QAAQ,IAAI,OAAO,QAAQ,QAAQ,IAAI,OAAO,SAAS,OAAO;AAEjF,UAAM,MAAM,KAAK,OAAO,MAAM,GAAG,IAAI,QAAQ,GAAG,KAAK,IAChD,OAAO,IAAI,GAAG,OAAO,UAAU,EAAE,QAAQ,CAAC,GAAG,KAAK,GAClD,OAAO,GAAG,GAAG,OAAO,MAAM,MAAM,EAAE,IAAI,CAAC,GAAG,KAAK,GAC/C,UAAU,GAAG,OAAO,MAAM,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,KAAK,GACtD,OAAO,MAAM,GAAG,IAAI,QAAQ,GAAG,KAAK;AAEzC,cAAU,GAAG;AAAA,EACf;AAEA,YAAU,KAAK,OAAO,MAAM,GAAG,IAAI,UAAU,GAAG,OAAO,GAAG,GAAG,IAAI,WAAW,OAAO,UAAU,CAAC,GAAG,OAAO,MAAM,GAAG,IAAI,WAAW,GAAG,KAAK,EAAE;AAC1I,YAAU;AAGV,YAAU,KAAK,IAAI,UAAU,KAAK,EAAE;AACpC,YAAU;AAEV,aAAW,UAAU,SAAS,MAAM,GAAG,CAAC,GAAG;AACzC,UAAM,EAAE,OAAO,QAAQ,IAAI;AAE3B,eAAW,SAAS,QAAQ,MAAM,GAAG,CAAC,GAAG;AACvC,YAAM,cAAc,MAAM;AAAA,QACxB,IAAI,OAAO,OAAO,IAAI;AAAA,QACtB,CAAC,MAAM,GAAG,OAAO,MAAM,GAAG,CAAC,GAAG,KAAK;AAAA,MACrC;AACA,gBAAU,KAAK,MAAM,KAAK,IAAI,SAAS,aAAa,EAAE,CAAC,EAAE;AACzD,gBAAU,OAAO,OAAO,GAAG,UAAK,MAAM,KAAK,IAAI,MAAM,KAAK,GAAG,KAAK,EAAE;AAAA,IACtE;AAAA,EACF;AAEA,MAAI,SAAS,SAAS,GAAG;AACvB,cAAU,KAAK,OAAO,GAAG,MAAM,SAAS,SAAS,CAAC,gBAAgB,KAAK,EAAE;AAAA,EAC3E;AACA,YAAU;AAGV,YAAU,KAAK,OAAO,GAAG,IAAI,KAAK,uBAAuB,OAAO,IAAI,UAAU,KAAK,MAAM,OAAO,GAAG,mBAAmB,KAAK,EAAE;AAC7H,YAAU;AACZ;AAEA,eAAsB,kBACpB,WACA,UACe;AACf,QAAM,MAAM,OAAO,iBAAiB,EAAE,OAAO,UAAU,CAAC;AACxD,QAAM,YAAY,cAAc;AAEhC,MAAI,CAAC,WAAW;AACd,cAAU,KAAK,OAAO,GAAG,oCAAoC,KAAK,EAAE;AACpE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,SAAS,cAAc,SAAS;AAEtC,MAAI,OAAO,WAAW,GAAG;AACvB,cAAU,KAAK,OAAO,MAAM,8BAA8B,SAAS,GAAG,KAAK,EAAE;AAC7E;AAAA,EACF;AAEA,YAAU;AACV,YAAU,KAAK,SAAS,QAAQ,CAAC,IAAI,OAAO,GAAG,SAAS,KAAK,IAAI,OAAO,IAAI,GAAG,SAAS,GAAG,KAAK,EAAE;AAClG,YAAU;AAEV,YAAU,KAAK,OAAO,GAAG,GAAG,OAAO,MAAM,WAAW,KAAK,EAAE;AAC3D,YAAU;AAEV,aAAW,SAAS,QAAQ;AAC1B,cAAU,KAAK,MAAM,QAAQ,IAAI,OAAO,KAAK,GAAG,MAAM,KAAK,GAAG,KAAK,IAAI,OAAO,GAAG,IAAI,MAAM,QAAQ,OAAO,IAAI,KAAK,EAAE;AACrH,cAAU,KAAK,OAAO,GAAG,GAAG,IAAI,WAAW,OAAO,EAAE,CAAC,GAAG,KAAK,EAAE;AAG/D,UAAM,QAAQ,MAAM,QAAQ,MAAM,IAAI,EAAE,MAAM,GAAG,EAAE;AACnD,eAAW,QAAQ,OAAO;AACxB,gBAAU,KAAK,OAAO,GAAG,GAAG,SAAS,MAAM,EAAE,CAAC,GAAG,KAAK,EAAE;AAAA,IAC1D;AAEA,QAAI,MAAM,QAAQ,MAAM,IAAI,EAAE,SAAS,IAAI;AACzC,gBAAU,KAAK,OAAO,GAAG,qBAAqB,KAAK,EAAE;AAAA,IACvD;AACA,cAAU;AAAA,EACZ;AAGA,YAAU,KAAK,OAAO,GAAG,IAAI,KAAK,wBAAwB,OAAO,IAAI,WAAW,KAAK,MAAM,OAAO,GAAG,gBAAgB,KAAK,EAAE;AAC5H,YAAU;AACZ;AAEA,eAAsB,oBACpB,WACA,SACA,SACe;AACf,QAAM,MAAM,OAAO,mBAAmB,EAAE,OAAO,WAAW,OAAO,QAAQ,OAAO,MAAM,QAAQ,KAAK,CAAC;AACpG,QAAM,YAAY,QAAQ,SAAS,GAAG,SAAS;AAC/C,QAAM,OAAQ,QAAQ,QAAQ;AAE9B,YAAU;AAEV,MAAI;AACF,UAAM,eAAe,WAAW,WAAW,MAAM,OAAO;AACxD,cAAU,KAAK,MAAM,OAAO,YAAY,OAAO,IAAI,GAAG,IAAI,GAAG,KAAK,QAAQ,OAAO,KAAK,GAAG,SAAS,IAAI,SAAS,GAAG,KAAK,EAAE;AAAA,EAC3H,SAAS,OAAO;AACd,cAAU,KAAK,MAAM,KAAK,IAAI,OAAO,GAAG,4BAA4B,KAAK,GAAG,KAAK,EAAE;AACnF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,YAAU;AACZ;AAEA,eAAsB,oBAAmC;AACvD,QAAM,MAAM,OAAO,eAAe;AAClC,QAAM,YAAY,cAAc;AAEhC,MAAI,CAAC,WAAW;AACd,cAAU,KAAK,OAAO,GAAG,oCAAoC,KAAK,EAAE;AACpE,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,UAAU,kBAAkB,SAAS;AAG3C,QAAM,UAA0C,CAAC;AACjD,aAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,QAAQ,MAAM,KAAK,GAAG;AACzB,cAAQ,MAAM,KAAK,IAAI,CAAC;AAAA,IAC1B;AACA,YAAQ,MAAM,KAAK,EAAE,KAAK,KAAK;AAAA,EACjC;AAEA,YAAU;AACV,YAAU,KAAK,SAAS,QAAQ,CAAC,IAAI,OAAO,GAAG,cAAc,KAAK,EAAE;AACpE,YAAU;AAEV,QAAM,aAAa,OAAO,KAAK,OAAO;AACtC,YAAU,KAAK,OAAO,IAAI,GAAG,QAAQ,MAAM,GAAG,KAAK,mBAAmB,WAAW,MAAM,SAAS;AAChG,YAAU;AAGV,QAAM,IAAI,EAAE,OAAO,IAAI,QAAQ,GAAG,OAAO,GAAG;AAC5C,QAAM,aAAa,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ;AAElD,YAAU,KAAK,OAAO,MAAM,GAAG,IAAI,OAAO,GAAG,OAAO,GAAG,GAAG,IAAI,WAAW,OAAO,UAAU,CAAC,GAAG,OAAO,MAAM,GAAG,IAAI,QAAQ,GAAG,KAAK,EAAE;AAEpI,QAAM,SAAS,KAAK,OAAO,MAAM,GAAG,IAAI,QAAQ,GAAG,KAAK,IACnD,IAAI,GAAG,OAAO,SAAS,EAAE,KAAK,CAAC,GAAG,KAAK,GACvC,IAAI,GAAG,OAAO,UAAU,EAAE,MAAM,CAAC,GAAG,KAAK,GACzC,IAAI,QAAQ,KAAK,IAChB,OAAO,MAAM,GAAG,IAAI,QAAQ,GAAG,KAAK;AAC1C,YAAU,MAAM;AAEhB,YAAU,KAAK,OAAO,MAAM,GAAG,IAAI,QAAQ,GAAG,OAAO,GAAG,GAAG,IAAI,WAAW,OAAO,UAAU,CAAC,GAAG,OAAO,MAAM,GAAG,IAAI,OAAO,GAAG,KAAK,EAAE;AAEpI,aAAW,CAAC,OAAO,YAAY,KAAK,OAAO,QAAQ,OAAO,GAAG;AAC3D,UAAM,SAAS,IAAI,IAAI,aAAa,IAAI,OAAK,EAAE,KAAK,CAAC;AACrD,UAAM,QAAQ,CAAC,GAAG,IAAI,IAAI,aAAa,IAAI,OAAK,EAAE,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI;AACnE,UAAM,eAAe,SAAS,OAAO,EAAE,QAAQ,CAAC;AAEhD,UAAM,MAAM,KAAK,OAAO,MAAM,GAAG,IAAI,QAAQ,GAAG,KAAK,IAChD,OAAO,IAAI,GAAG,OAAO,OAAO,EAAE,KAAK,CAAC,GAAG,KAAK,GAC5C,OAAO,OAAO,OAAO,IAAI,GAAG,EAAE,MAAM,CAAC,GACrC,OAAO,GAAG,GAAG,OAAO,cAAc,EAAE,KAAK,CAAC,GAAG,KAAK,GAClD,OAAO,MAAM,GAAG,IAAI,QAAQ,GAAG,KAAK;AAEzC,cAAU,GAAG;AAAA,EACf;AAEA,YAAU,KAAK,OAAO,MAAM,GAAG,IAAI,UAAU,GAAG,OAAO,GAAG,GAAG,IAAI,WAAW,OAAO,UAAU,CAAC,GAAG,OAAO,MAAM,GAAG,IAAI,WAAW,GAAG,KAAK,EAAE;AAC1I,YAAU;AAGV,YAAU,KAAK,OAAO,GAAG,IAAI,KAAK,uBAAuB,OAAO,IAAI,UAAU,KAAK,QAAQ,OAAO,GAAG,oBAAoB,KAAK,EAAE;AAChI,YAAU,KAAK,OAAO,GAAG,IAAI,KAAK,wBAAwB,OAAO,IAAI,WAAW,KAAK,MAAM,OAAO,GAAG,oBAAoB,KAAK,EAAE;AAChI,YAAU;AACZ;AAaA,eAAsB,oBACpB,OACA,UAAkE,CAAC,GACpD;AACf,YAAU;AACV,YAAU,KAAK,SAAS,QAAQ,CAAC,IAAI,OAAO,GAAG,gBAAgB,KAAK,KAAK,OAAO,IAAI,GAAG,KAAK,GAAG,KAAK,GAAG;AACvG,YAAU;AAEV,QAAM,QAAQ,QAAQ,SAAS;AAC/B,QAAM,SAAS,IAAI,gBAAgB,EAAE,GAAG,OAAO,OAAO,OAAO,KAAK,EAAE,CAAC;AAErE,MAAI,QAAQ,MAAM;AAChB,WAAO,OAAO,QAAQ,QAAQ,IAAI;AAAA,EACpC;AACA,MAAI,QAAQ,YAAY;AACtB,WAAO,OAAO,cAAc,QAAQ,UAAU;AAAA,EAChD;AAEA,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,GAAG,iBAAiB,6BAA6B,MAAM,EAAE;AAEtF,QAAI,CAAC,SAAS,IAAI;AAChB,UAAI,SAAS,WAAW,KAAK;AAC3B,kBAAU,KAAK,OAAO,MAAM,+BAA+B,KAAK,EAAE;AAClE,kBAAU,KAAK,OAAO,GAAG,mDAAmD,KAAK,EAAE;AACnF,kBAAU,KAAK,OAAO,GAAG,sDAAsD,KAAK,IAAI,KAAK,EAAE;AAC/F,kBAAU;AACV;AAAA,MACF;AACA,YAAM,IAAI,MAAM,QAAQ,SAAS,MAAM,EAAE;AAAA,IAC3C;AAEA,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,UAAM,gBAAgB,KAAK;AAC3B,UAAM,QAAQ,KAAK;AAEnB,QAAI,cAAc,WAAW,GAAG;AAC9B,gBAAU,KAAK,OAAO,MAAM,+BAA+B,KAAK,IAAI,KAAK,EAAE;AAC3E,gBAAU;AACV,gBAAU,KAAK,OAAO,GAAG,mDAAmD,KAAK,EAAE;AACnF,gBAAU,KAAK,OAAO,GAAG,oDAAoD,KAAK,EAAE;AACpF,gBAAU,KAAK,OAAO,GAAG,yDAAyD,KAAK,EAAE;AACzF,gBAAU;AACV;AAAA,IACF;AAEA,cAAU,KAAK,OAAO,KAAK,GAAG,cAAc,MAAM,GAAG,KAAK,OAAO,KAAK,UAAU;AAChF,cAAU;AAGV,UAAM,IAAI,EAAE,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,SAAS,GAAG;AACtD,UAAM,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU;AAE1D,cAAU,KAAK,OAAO,MAAM,GAAG,IAAI,OAAO,GAAG,OAAO,GAAG,GAAG,IAAI,WAAW,OAAO,UAAU,CAAC,GAAG,OAAO,MAAM,GAAG,IAAI,QAAQ,GAAG,KAAK,EAAE;AAEpI,UAAM,SAAS,KAAK,OAAO,MAAM,GAAG,IAAI,QAAQ,GAAG,KAAK,IACnD,IAAI,GAAG,OAAO,QAAQ,EAAE,IAAI,CAAC,GAAG,KAAK,GACrC,IAAI,GAAG,OAAO,QAAQ,EAAE,IAAI,CAAC,GAAG,KAAK,GACrC,IAAI,GAAG,OAAO,QAAQ,EAAE,IAAI,CAAC,GAAG,KAAK,GACrC,IAAI,GAAG,OAAO,WAAW,EAAE,OAAO,CAAC,GAAG,KAAK,IAC1C,OAAO,MAAM,GAAG,IAAI,QAAQ,GAAG,KAAK;AAC1C,cAAU,MAAM;AAEhB,cAAU,KAAK,OAAO,MAAM,GAAG,IAAI,QAAQ,GAAG,OAAO,GAAG,GAAG,IAAI,WAAW,OAAO,UAAU,CAAC,GAAG,OAAO,MAAM,GAAG,IAAI,OAAO,GAAG,KAAK,EAAE;AAEpI,eAAW,QAAQ,eAAe;AAChC,YAAM,OAAO,IAAI,KAAK,KAAK,UAAU,EAAE,mBAAmB,SAAS,EAAE,MAAM,WAAW,QAAQ,UAAU,CAAC;AACzG,YAAM,YAAY,KAAK,SAAS,SAAS,OAAO,OAAO,KAAK,SAAS,aAAa,OAAO,SAAS,OAAO;AACzG,YAAM,iBAAiB,KAAK,eAAe,SAAS,MAAM,UAAU;AAGpE,YAAM,iBAAiB,UAAU,KAAK,WAAW,IAAI,QAAQ,OAAO,GAAG,GAAG,EAAE,UAAU,CAAC;AACvF,YAAM,cAAc,eAAe;AAAA,QACjC,IAAI,OAAO,OAAO,IAAI;AAAA,QACtB,CAAC,MAAM,GAAG,OAAO,MAAM,GAAG,CAAC,GAAG,KAAK,GAAG,OAAO,GAAG;AAAA,MAClD;AAEA,YAAM,MAAM,KAAK,OAAO,MAAM,GAAG,IAAI,QAAQ,GAAG,KAAK,IAChD,OAAO,GAAG,GAAG,OAAO,MAAM,EAAE,IAAI,CAAC,GAAG,KAAK,GACzC,SAAS,GAAG,OAAO,KAAK,QAAQ,IAAI,EAAE,IAAI,CAAC,GAAG,KAAK,GACnD,OAAO,GAAG,GAAG,OAAO,KAAK,QAAQ,WAAW,EAAE,IAAI,CAAC,GAAG,KAAK,GAC3D,OAAO,GAAG,GAAG,OAAO,cAAc,gBAAgB,EAAE,OAAO,CAAC,GAAG,KAAK,IACnE,OAAO,MAAM,GAAG,IAAI,QAAQ,GAAG,KAAK;AAE1C,gBAAU,GAAG;AAAA,IACf;AAEA,cAAU,KAAK,OAAO,MAAM,GAAG,IAAI,UAAU,GAAG,OAAO,GAAG,GAAG,IAAI,WAAW,OAAO,UAAU,CAAC,GAAG,OAAO,MAAM,GAAG,IAAI,WAAW,GAAG,KAAK,EAAE;AAC1I,cAAU;AAGV,cAAU,KAAK,IAAI,cAAc,KAAK,EAAE;AACxC,cAAU;AAEV,eAAW,QAAQ,cAAc,MAAM,GAAG,CAAC,GAAG;AAC5C,YAAM,OAAO,IAAI,KAAK,KAAK,UAAU,EAAE,eAAe,SAAS;AAAA,QAC7D,OAAO;AAAA,QAAS,KAAK;AAAA,QAAW,MAAM;AAAA,QAAW,QAAQ;AAAA,MAC3D,CAAC;AACD,YAAM,WAAW,KAAK,SAAS,SAAS,cAAO,KAAK,SAAS,aAAa,cAAO;AAEjF,gBAAU,KAAK,QAAQ,IAAI,OAAO,GAAG,GAAG,IAAI,GAAG,KAAK,IAAI,KAAK,eAAe,SAAS,OAAO,SAAS,WAAW,QAAQ,EAAE,EAAE;AAG5H,YAAM,UAAU,KAAK,WAAW;AAChC,YAAM,UAAU,QAAQ,UAAU,GAAG,GAAG,EAAE,QAAQ,OAAO,GAAG;AAC5D,YAAM,cAAc,QAAQ;AAAA,QAC1B,IAAI,OAAO,OAAO,IAAI;AAAA,QACtB,CAAC,MAAM,GAAG,OAAO,MAAM,GAAG,CAAC,GAAG,KAAK;AAAA,MACrC;AACA,gBAAU,OAAO,WAAW,GAAG,QAAQ,SAAS,MAAM,QAAQ,EAAE,EAAE;AAClE,gBAAU;AAAA,IACZ;AAGA,cAAU,KAAK,OAAO,GAAG,IAAI,KAAK,yBAAyB,OAAO,IAAI,WAAW,KAAK,oBAAoB,OAAO,GAAG,iBAAiB,KAAK,EAAE;AAC5I,cAAU,KAAK,OAAO,GAAG,IAAI,KAAK,yBAAyB,OAAO,IAAI,WAAW,KAAK,wBAAwB,OAAO,GAAG,uBAAuB,KAAK,EAAE;AACtJ,cAAU;AAAA,EAEZ,SAAS,OAAO;AACd,UAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC1E,QAAI,aAAa,SAAS,cAAc,KAAK,aAAa,SAAS,cAAc,GAAG;AAClF,4BAAsB,UAAU,gBAAgB;AAAA,IAClD,OAAO;AACL,gBAAU,KAAK,OAAO,GAAG,kCAAkC,YAAY,GAAG,KAAK,EAAE;AACjF,gBAAU;AAAA,IACZ;AAAA,EACF;AACF;AAWA,eAAsB,qBACpB,UAA0B,CAAC,GACZ;AACf,YAAU;AACV,YAAU,KAAK,SAAS,QAAQ,CAAC,IAAI,OAAO,GAAG,iBAAiB,KAAK,EAAE;AACvE,YAAU;AAEV,QAAM,QAAQ,QAAQ,SAAS;AAE/B,MAAI;AAEF,cAAU,KAAK,OAAO,GAAG,oCAAoC,KAAK,OAAO,KAAK,EAAE;AAEhF,UAAM,iBAAiB,MAAM,MAAM,GAAG,iBAAiB,2BAA2B;AAClF,QAAI,CAAC,eAAe,IAAI;AACtB,YAAM,IAAI,MAAM,qBAAqB,eAAe,MAAM,EAAE;AAAA,IAC9D;AAEA,UAAM,EAAE,eAAe,MAAM,IAAI,MAAM,eAAe,KAAK;AAa3D,QAAI,UAAU,GAAG;AACf,gBAAU,KAAK,OAAO,MAAM,qCAAqC,KAAK,EAAE;AACxE,gBAAU;AACV;AAAA,IACF;AAEA,cAAU,KAAK,OAAO,KAAK,GAAG,KAAK,GAAG,KAAK,sBAAsB;AACjE,cAAU;AAGV,UAAM,WAAW,oBAAI,IAAkC;AACvD,eAAW,QAAQ,eAAe;AAChC,YAAM,YAAY,KAAK,cAAc;AACrC,UAAI,CAAC,SAAS,IAAI,SAAS,GAAG;AAC5B,iBAAS,IAAI,WAAW,CAAC,CAAC;AAAA,MAC5B;AACA,eAAS,IAAI,SAAS,EAAG,KAAK,IAAI;AAAA,IACpC;AAEA,cAAU,KAAK,OAAO,IAAI,GAAG,SAAS,IAAI,GAAG,KAAK,sBAAsB;AACxE,cAAU;AAEV,QAAI,QAAQ,QAAQ;AAClB,gBAAU,KAAK,OAAO,MAAM,kCAAkC,KAAK,EAAE;AACrE,gBAAU;AACV,iBAAW,CAAC,WAAW,KAAK,KAAK,UAAU;AACzC,cAAM,QAAQ,MAAM,CAAC,GAAG,SAAS;AACjC,cAAM,QAAQ,MAAM,CAAC,GAAG,SAAS;AACjC,kBAAU,KAAK,MAAM,QAAQ,IAAI,OAAO,GAAG,GAAG,UAAU,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,IAAI,OAAO,IAAI,GAAG,KAAK,IAAI,KAAK,GAAG,KAAK,IAAI,OAAO,GAAG,IAAI,MAAM,MAAM,aAAa,KAAK,EAAE;AAAA,MACvK;AACA,gBAAU;AACV;AAAA,IACF;AAGA,QAAI,YAAY;AAChB,QAAI,SAAS;AAEb,eAAW,CAAC,WAAW,KAAK,KAAK,UAAU;AACzC,YAAM,QAAQ,MAAM,CAAC,GAAG,SAAS;AACjC,YAAM,QAAQ,MAAM,CAAC,GAAG,SAAS;AAGjC,YAAM,WAAW,MAAM,IAAI,QAAM;AAAA,QAC/B,MAAM,EAAE,SAAS,cAAc,cAAc,EAAE,SAAS,SAAS,SAAS;AAAA,QAC1E,SAAS,EAAE;AAAA,MACb,EAAE;AAEF,UAAI;AACF,cAAM,eAAe,MAAM,MAAM,GAAG,YAAY,aAAa;AAAA,UAC3D,QAAQ;AAAA,UACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,UAC9C,MAAM,KAAK,UAAU;AAAA,YACnB;AAAA,YACA,SAAS;AAAA,YACT,UAAU;AAAA,YACV,QAAQ;AAAA,YACR,UAAU;AAAA,cACR,QAAQ;AAAA,cACR,eAAc,oBAAI,KAAK,GAAE,YAAY;AAAA,YACvC;AAAA,UACF,CAAC;AAAA,QACH,CAAC;AAED,YAAI,aAAa,IAAI;AACnB,gBAAM,SAAS,MAAM,aAAa,KAAK;AACvC,gBAAM,WAAW,OAAO,SAAS,UAAU;AAC3C,oBAAU,KAAK,OAAO,KAAK,GAAG,MAAM,OAAO,GAAG,KAAK,IAAI,OAAO,GAAG,GAAG,UAAU,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,IAAI,OAAO,IAAI,GAAG,KAAK,IAAI,KAAK,GAAG,KAAK,WAAM,OAAO,KAAK,GAAG,QAAQ,GAAG,KAAK,WAAW;AACzL;AAAA,QACF,OAAO;AACL,oBAAU,KAAK,OAAO,GAAG,GAAG,MAAM,KAAK,GAAG,KAAK,IAAI,OAAO,GAAG,GAAG,UAAU,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,IAAI,OAAO,GAAG,WAAW,aAAa,MAAM,GAAG,KAAK,EAAE;AACnJ;AAAA,QACF;AAAA,MACF,SAAS,KAAK;AACZ,kBAAU,KAAK,OAAO,GAAG,GAAG,MAAM,KAAK,GAAG,KAAK,IAAI,OAAO,GAAG,GAAG,UAAU,MAAM,GAAG,CAAC,CAAC,GAAG,KAAK,IAAI,OAAO,GAAG,UAAU,GAAG,GAAG,KAAK,EAAE;AAClI;AAAA,MACF;AAAA,IACF;AAEA,cAAU;AACV,QAAI,WAAW,GAAG;AAChB,gBAAU,KAAK,OAAO,KAAK,GAAG,MAAM,OAAO,GAAG,KAAK,4BAA4B,SAAS,WAAW;AAAA,IACrG,OAAO;AACL,gBAAU,KAAK,OAAO,MAAM,GAAG,MAAM,OAAO,GAAG,KAAK,eAAe,SAAS,aAAa,MAAM,EAAE;AAAA,IACnG;AACA,cAAU;AAGV,cAAU,KAAK,OAAO,GAAG,IAAI,KAAK,wBAAwB,OAAO,IAAI,WAAW,KAAK,OAAO,OAAO,GAAG,4BAA4B,KAAK,EAAE;AACzI,cAAU;AAAA,EAEZ,SAAS,OAAO;AACd,UAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAC1E,QAAI,aAAa,SAAS,cAAc,KAAK,aAAa,SAAS,cAAc,GAAG;AAElF,YAAM,WAAW,MAAM,sBAAsB,UAAU,KAAK;AAC5D,YAAM,SAAS,MAAM,sBAAsB,QAAQ,KAAK;AAExD,UAAI,CAAC,UAAU;AACb,8BAAsB,UAAU,gBAAgB;AAAA,MAClD,WAAW,CAAC,QAAQ;AAClB,8BAAsB,QAAQ,gBAAgB;AAAA,MAChD,OAAO;AACL,kBAAU,KAAK,OAAO,GAAG,UAAU,YAAY,GAAG,KAAK,EAAE;AACzD,kBAAU;AAAA,MACZ;AAAA,IACF,OAAO;AACL,gBAAU,KAAK,OAAO,GAAG,UAAU,YAAY,GAAG,KAAK,EAAE;AACzD,gBAAU;AAAA,IACZ;AAAA,EACF;AACF;","names":[]}