squads-cli 0.6.1 → 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 +2151 -12594
  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,391 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ fetchBridgeStats,
4
+ fetchRateLimits
5
+ } from "./chunk-NA45DFXY.js";
6
+ import "./chunk-LOA3KWYJ.js";
7
+ import {
8
+ getLiveSessionSummaryAsync
9
+ } from "./chunk-BODLDQY7.js";
10
+ import {
11
+ getMultiRepoGitStats
12
+ } from "./chunk-3KCWNZWW.js";
13
+ import {
14
+ findSquadsDir,
15
+ listAgents,
16
+ listSquads,
17
+ loadSquad
18
+ } from "./chunk-LDM62TIX.js";
19
+ import {
20
+ findMemoryDir,
21
+ getSquadState,
22
+ searchMemory
23
+ } from "./chunk-ZTQ7ISUR.js";
24
+ import {
25
+ RESET,
26
+ bold,
27
+ box,
28
+ colors,
29
+ gradient,
30
+ icons,
31
+ padEnd,
32
+ writeLine
33
+ } from "./chunk-N7KDWU4W.js";
34
+ import "./chunk-7OCVIDC7.js";
35
+
36
+ // src/commands/context-feed.ts
37
+ import { existsSync, statSync, readdirSync, readFileSync } from "fs";
38
+ import { join } from "path";
39
+ var BRIDGE_URL = process.env.SQUADS_BRIDGE_URL || "http://localhost:8088";
40
+ async function syncBriefToBridge(brief, sourcePath) {
41
+ try {
42
+ const response = await fetch(`${BRIDGE_URL}/api/brief`, {
43
+ method: "POST",
44
+ headers: { "Content-Type": "application/json" },
45
+ body: JSON.stringify({
46
+ priority: brief.priority,
47
+ runway: brief.runway,
48
+ focus: brief.focus || [],
49
+ blockers: brief.blockers || [],
50
+ decision_framework: brief.decisionFramework || [],
51
+ raw_content: brief.raw || "",
52
+ source_path: sourcePath,
53
+ synced_by: "cli"
54
+ })
55
+ });
56
+ if (!response.ok) {
57
+ return false;
58
+ }
59
+ const result = await response.json();
60
+ return result.status === "synced" || result.status === "unchanged";
61
+ } catch {
62
+ return false;
63
+ }
64
+ }
65
+ function readBusinessBrief(squadsDir) {
66
+ if (!squadsDir) return void 0;
67
+ const briefPath = join(squadsDir, "..", "BUSINESS_BRIEF.md");
68
+ if (!existsSync(briefPath)) return void 0;
69
+ try {
70
+ const content = readFileSync(briefPath, "utf-8");
71
+ const brief = { raw: content };
72
+ const priorityMatch = content.match(/##\s*#1 Priority\s*\n+\*\*([^*]+)\*\*/);
73
+ if (priorityMatch) {
74
+ brief.priority = priorityMatch[1].trim();
75
+ }
76
+ const runwayMatch = content.match(/##\s*Runway\s*\n+([\s\S]*?)(?=\n##|$)/);
77
+ if (runwayMatch) {
78
+ const pressureMatch = runwayMatch[1].match(/\*\*Pressure\*\*:\s*(\w+)/i);
79
+ if (pressureMatch) {
80
+ brief.runway = pressureMatch[1];
81
+ }
82
+ }
83
+ const focusMatch = content.match(/##\s*Current Focus\s*\n+([\s\S]*?)(?=\n##|$)/);
84
+ if (focusMatch) {
85
+ const items = focusMatch[1].match(/^\d+\.\s*\*\*([^*]+)\*\*/gm);
86
+ if (items) {
87
+ brief.focus = items.map((item) => {
88
+ const match = item.match(/\*\*([^*]+)\*\*/);
89
+ return match ? match[1].trim() : item;
90
+ });
91
+ }
92
+ }
93
+ const blockersMatch = content.match(/##\s*Blockers\s*\n+([\s\S]*?)(?=\n##|$)/);
94
+ if (blockersMatch) {
95
+ const text = blockersMatch[1].trim();
96
+ if (text.toLowerCase().includes("none")) {
97
+ brief.blockers = [];
98
+ } else {
99
+ const items = text.match(/^-\s*(.+)$/gm);
100
+ if (items) {
101
+ brief.blockers = items.map((item) => item.replace(/^-\s*/, "").trim());
102
+ }
103
+ }
104
+ }
105
+ const decisionMatch = content.match(/##\s*Decision Framework\s*\n+([\s\S]*?)(?=\n##|$)/);
106
+ if (decisionMatch) {
107
+ const items = decisionMatch[1].match(/^\d+\.\s*(.+)$/gm);
108
+ if (items) {
109
+ brief.decisionFramework = items.map((item) => item.replace(/^\d+\.\s*/, "").trim());
110
+ }
111
+ }
112
+ return brief;
113
+ } catch {
114
+ return void 0;
115
+ }
116
+ }
117
+ async function collectBriefingData(options) {
118
+ const squadsDir = findSquadsDir();
119
+ const memoryDir = findMemoryDir();
120
+ const baseDir = squadsDir ? join(squadsDir, "..", "..", "..") : null;
121
+ const allSquads = squadsDir ? listSquads(squadsDir) : [];
122
+ if (options.squad && !allSquads.includes(options.squad)) {
123
+ return {
124
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
125
+ error: `Squad "${options.squad}" not found. Available: ${allSquads.join(", ")}`,
126
+ squads: [],
127
+ goals: { active: 0, completed: 0, bySquad: [] },
128
+ sessions: { active: 0, bySquad: 0 }
129
+ };
130
+ }
131
+ const squadNames = options.squad ? [options.squad] : allSquads;
132
+ const [bridgeStats, rateLimits, sessions, gitStats] = await Promise.all([
133
+ fetchBridgeStats(),
134
+ fetchRateLimits(),
135
+ getLiveSessionSummaryAsync(),
136
+ baseDir ? getMultiRepoGitStats(baseDir, 7) : Promise.resolve(null)
137
+ ]);
138
+ const squadBriefings = [];
139
+ const goalsBySquad = [];
140
+ let totalActive = 0;
141
+ let totalCompleted = 0;
142
+ for (const squadName of squadNames) {
143
+ const squad = loadSquad(squadName);
144
+ if (!squad) continue;
145
+ const agents = squadsDir ? listAgents(squadsDir, squadName) : [];
146
+ const activeGoals = squad.goals.filter((g) => !g.completed);
147
+ const completedGoals = squad.goals.filter((g) => g.completed);
148
+ totalActive += activeGoals.length;
149
+ totalCompleted += completedGoals.length;
150
+ const states = getSquadState(squadName);
151
+ const recentMemory = [];
152
+ for (const state of states.slice(0, 3)) {
153
+ const lines = state.content.split("\n").filter((l) => l.trim() && !l.startsWith("#"));
154
+ if (lines.length > 0) {
155
+ recentMemory.push(lines[0].substring(0, 100));
156
+ }
157
+ }
158
+ let lastActivity;
159
+ if (memoryDir) {
160
+ const squadMemoryPath = join(memoryDir, squadName);
161
+ if (existsSync(squadMemoryPath)) {
162
+ let mostRecent = 0;
163
+ try {
164
+ const walkDir = (dir) => {
165
+ const entries = readdirSync(dir, { withFileTypes: true });
166
+ for (const entry of entries) {
167
+ const fullPath = join(dir, entry.name);
168
+ if (entry.isDirectory()) {
169
+ walkDir(fullPath);
170
+ } else if (entry.name.endsWith(".md")) {
171
+ const stat = statSync(fullPath);
172
+ if (stat.mtimeMs > mostRecent) {
173
+ mostRecent = stat.mtimeMs;
174
+ }
175
+ }
176
+ }
177
+ };
178
+ walkDir(squadMemoryPath);
179
+ } catch {
180
+ }
181
+ if (mostRecent > 0) {
182
+ const daysAgo = Math.floor((Date.now() - mostRecent) / (1e3 * 60 * 60 * 24));
183
+ if (daysAgo === 0) lastActivity = "today";
184
+ else if (daysAgo === 1) lastActivity = "yesterday";
185
+ else lastActivity = `${daysAgo}d ago`;
186
+ }
187
+ }
188
+ }
189
+ squadBriefings.push({
190
+ name: squadName,
191
+ mission: squad.mission,
192
+ agentCount: agents.length,
193
+ activeGoals: activeGoals.map((g) => ({
194
+ description: g.description,
195
+ progress: g.progress
196
+ })),
197
+ memoryEntries: states.length,
198
+ recentMemory,
199
+ lastActivity
200
+ });
201
+ if (activeGoals.length > 0) {
202
+ goalsBySquad.push({
203
+ squad: squadName,
204
+ goals: activeGoals.map((g) => g.description)
205
+ });
206
+ }
207
+ }
208
+ const costs = bridgeStats ? {
209
+ today: {
210
+ generations: bridgeStats.today.generations,
211
+ cost: bridgeStats.today.costUsd
212
+ },
213
+ budget: bridgeStats.budget,
214
+ bySquad: bridgeStats.bySquad.map((s) => ({
215
+ squad: s.squad,
216
+ cost: s.costUsd,
217
+ generations: s.generations
218
+ }))
219
+ } : void 0;
220
+ const rateLimitsData = rateLimits.source !== "none" ? {
221
+ models: Object.values(rateLimits.limits).map((l) => ({
222
+ model: l.model,
223
+ requestsRemaining: l.requestsRemaining,
224
+ tokensRemaining: l.tokensRemaining
225
+ }))
226
+ } : void 0;
227
+ const git = gitStats ? {
228
+ commits: gitStats.totalCommits,
229
+ activeDays: gitStats.activeDays,
230
+ avgPerDay: gitStats.avgCommitsPerDay,
231
+ byRepo: Array.from(gitStats.commitsByRepo.entries()).map(([repo, commits]) => ({
232
+ repo,
233
+ commits
234
+ }))
235
+ } : void 0;
236
+ let relevantMemory;
237
+ if (options.topic) {
238
+ const results = searchMemory(options.topic);
239
+ relevantMemory = results.slice(0, 5).map((r) => ({
240
+ squad: r.entry.squad,
241
+ agent: r.entry.agent,
242
+ snippet: r.matches[0]?.substring(0, 150) || ""
243
+ }));
244
+ }
245
+ const brief = readBusinessBrief(squadsDir);
246
+ if (brief && squadsDir) {
247
+ const briefPath = join(squadsDir, "..", "BUSINESS_BRIEF.md");
248
+ syncBriefToBridge(brief, briefPath).catch(() => {
249
+ });
250
+ }
251
+ return {
252
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
253
+ brief,
254
+ squads: squadBriefings,
255
+ goals: {
256
+ active: totalActive,
257
+ completed: totalCompleted,
258
+ bySquad: goalsBySquad
259
+ },
260
+ costs,
261
+ rateLimits: rateLimitsData,
262
+ git,
263
+ sessions: {
264
+ active: sessions.totalSessions,
265
+ bySquad: sessions.squadCount
266
+ },
267
+ relevantMemory
268
+ };
269
+ }
270
+ function renderHumanBriefing(data, options) {
271
+ writeLine();
272
+ writeLine(` ${gradient("squads")} ${colors.dim}context-feed${RESET}`);
273
+ writeLine();
274
+ if (data.error) {
275
+ writeLine(` ${colors.yellow}${icons.warning || "\u26A0"}${RESET} ${data.error}`);
276
+ writeLine();
277
+ return;
278
+ }
279
+ if (data.brief) {
280
+ if (data.brief.priority) {
281
+ const runwayColor = data.brief.runway === "HIGH" ? colors.red : data.brief.runway === "MEDIUM" ? colors.yellow : colors.green;
282
+ writeLine(` ${bold}#1 Priority${RESET} ${runwayColor}[${data.brief.runway || "\u2014"}]${RESET}`);
283
+ writeLine(` ${colors.white}${data.brief.priority}${RESET}`);
284
+ writeLine();
285
+ }
286
+ if (data.brief.focus && data.brief.focus.length > 0) {
287
+ writeLine(` ${bold}Focus${RESET}`);
288
+ for (const item of data.brief.focus.slice(0, 3)) {
289
+ writeLine(` ${colors.cyan}\u2192${RESET} ${item}`);
290
+ }
291
+ writeLine();
292
+ }
293
+ if (data.brief.blockers && data.brief.blockers.length > 0) {
294
+ writeLine(` ${colors.red}${bold}Blockers${RESET}`);
295
+ for (const blocker of data.brief.blockers) {
296
+ writeLine(` ${colors.red}\u2717${RESET} ${blocker}`);
297
+ }
298
+ writeLine();
299
+ }
300
+ }
301
+ if (data.sessions.active > 0) {
302
+ writeLine(` ${colors.green}${icons.active}${RESET} ${data.sessions.active} active sessions across ${data.sessions.bySquad} squads`);
303
+ writeLine();
304
+ }
305
+ if (data.goals.active > 0) {
306
+ writeLine(` ${bold}Active Goals${RESET} ${colors.dim}(${data.goals.active})${RESET}`);
307
+ writeLine();
308
+ for (const sq of data.goals.bySquad) {
309
+ writeLine(` ${colors.cyan}${sq.squad}${RESET}`);
310
+ for (const goal of sq.goals.slice(0, 2)) {
311
+ writeLine(` ${icons.active} ${goal}`);
312
+ }
313
+ if (sq.goals.length > 2) {
314
+ writeLine(` ${colors.dim}+${sq.goals.length - 2} more${RESET}`);
315
+ }
316
+ }
317
+ writeLine();
318
+ }
319
+ if (data.costs) {
320
+ const { budget } = data.costs;
321
+ const usedBar = "\u2588".repeat(Math.min(Math.round(budget.usedPct / 5), 20));
322
+ const emptyBar = "\u2591".repeat(20 - usedBar.length);
323
+ writeLine(` ${bold}Budget${RESET}`);
324
+ writeLine(` ${colors.dim}$${budget.used.toFixed(2)}/${budget.daily} today${RESET} ${usedBar}${emptyBar} ${budget.usedPct.toFixed(0)}%`);
325
+ writeLine();
326
+ }
327
+ if (data.rateLimits && options.verbose) {
328
+ writeLine(` ${bold}Rate Limits${RESET}`);
329
+ for (const model of data.rateLimits.models.slice(0, 3)) {
330
+ const shortName = model.model.replace("claude-", "").replace(/-\d+$/, "");
331
+ writeLine(` ${colors.dim}${shortName}:${RESET} ${model.requestsRemaining} req, ${Math.round(model.tokensRemaining / 1e3)}k tok`);
332
+ }
333
+ writeLine();
334
+ }
335
+ if (data.git && data.git.commits > 0) {
336
+ writeLine(` ${bold}Git Activity${RESET} ${colors.dim}(7d)${RESET}`);
337
+ writeLine(` ${data.git.commits} commits, ${data.git.avgPerDay}/day avg`);
338
+ writeLine();
339
+ }
340
+ const activeSquads = data.squads.filter((s) => s.activeGoals.length > 0 || s.memoryEntries > 0);
341
+ if (activeSquads.length > 0 && options.verbose) {
342
+ const w = { name: 14, agents: 8, memory: 10, activity: 10 };
343
+ const tableWidth = w.name + w.agents + w.memory + w.activity + 4;
344
+ writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);
345
+ writeLine(` ${colors.purple}${box.vertical}${RESET} ${bold}${padEnd("SQUAD", w.name)}${RESET}${bold}${padEnd("AGENTS", w.agents)}${RESET}${bold}${padEnd("MEMORY", w.memory)}${RESET}${bold}ACTIVITY${RESET} ${colors.purple}${box.vertical}${RESET}`);
346
+ writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);
347
+ for (const sq of activeSquads.slice(0, 8)) {
348
+ const row = ` ${colors.purple}${box.vertical}${RESET} ${colors.cyan}${padEnd(sq.name, w.name)}${RESET}${padEnd(String(sq.agentCount), w.agents)}${padEnd(String(sq.memoryEntries), w.memory)}${padEnd(sq.lastActivity || "\u2014", w.activity - 2)}${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
+ }
354
+ if (data.relevantMemory && data.relevantMemory.length > 0) {
355
+ writeLine(` ${bold}Relevant Memory${RESET} ${colors.dim}("${options.topic}")${RESET}`);
356
+ for (const mem of data.relevantMemory) {
357
+ writeLine(` ${colors.cyan}${mem.squad}/${mem.agent}${RESET}`);
358
+ writeLine(` ${colors.dim}${mem.snippet}${RESET}`);
359
+ }
360
+ writeLine();
361
+ }
362
+ writeLine(` ${colors.dim}$${RESET} squads feed ${colors.cyan}--topic "pricing"${RESET} ${colors.dim}Topic-focused${RESET}`);
363
+ writeLine(` ${colors.dim}$${RESET} squads feed ${colors.cyan}--squad website${RESET} ${colors.dim}Single squad${RESET}`);
364
+ writeLine(` ${colors.dim}$${RESET} squads feed ${colors.cyan}--agent${RESET} ${colors.dim}JSON for agents${RESET}`);
365
+ writeLine();
366
+ }
367
+ function renderAgentBriefing(data) {
368
+ console.log(JSON.stringify(data, null, 2));
369
+ }
370
+ async function contextFeedCommand(options = {}) {
371
+ const squadsDir = findSquadsDir();
372
+ if (!squadsDir) {
373
+ if (options.json || options.agent) {
374
+ console.log(JSON.stringify({ error: "No .agents/squads directory found" }));
375
+ } else {
376
+ writeLine(`${colors.red}No .agents/squads directory found${RESET}`);
377
+ writeLine(`${colors.dim}Run \`squads init\` to create one.${RESET}`);
378
+ }
379
+ process.exit(1);
380
+ }
381
+ const data = await collectBriefingData(options);
382
+ if (options.json || options.agent) {
383
+ renderAgentBriefing(data);
384
+ } else {
385
+ renderHumanBriefing(data, options);
386
+ }
387
+ }
388
+ export {
389
+ contextFeedCommand
390
+ };
391
+ //# sourceMappingURL=context-feed-JMNW4GAM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/context-feed.ts"],"sourcesContent":["/**\n * Briefing command - Context injection for agents\n *\n * Aggregates squad state, goals, memory, costs, and git activity\n * into a single consumable output for human review or agent context.\n */\n\nimport { existsSync, statSync, readdirSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport {\n findSquadsDir,\n loadSquad,\n listSquads,\n listAgents,\n} from '../lib/squad-parser.js';\nimport { findMemoryDir, searchMemory, getSquadState } from '../lib/memory.js';\nimport {\n fetchBridgeStats,\n fetchRateLimits,\n} from '../lib/costs.js';\nimport { getMultiRepoGitStats } from '../lib/git.js';\nimport { getLiveSessionSummaryAsync } from '../lib/sessions.js';\nimport {\n colors,\n bold,\n RESET,\n gradient,\n box,\n padEnd,\n icons,\n writeLine,\n} from '../lib/terminal.js';\n\n// ============================================================================\n// Types\n// ============================================================================\n\ninterface SquadBriefing {\n name: string;\n mission?: string;\n agentCount: number;\n activeGoals: { description: string; progress?: string }[];\n memoryEntries: number;\n recentMemory: string[];\n lastActivity?: string;\n}\n\ninterface BusinessBrief {\n priority?: string;\n runway?: string;\n focus?: string[];\n blockers?: string[];\n decisionFramework?: string[];\n raw?: string;\n}\n\ninterface BriefingData {\n timestamp: string;\n error?: string;\n brief?: BusinessBrief;\n squads: SquadBriefing[];\n goals: {\n active: number;\n completed: number;\n bySquad: { squad: string; goals: string[] }[];\n };\n costs?: {\n today: { generations: number; cost: number };\n budget: { daily: number; used: number; remaining: number; usedPct: number };\n bySquad: { squad: string; cost: number; generations: number }[];\n };\n rateLimits?: {\n models: { model: string; requestsRemaining: number; tokensRemaining: number }[];\n };\n git?: {\n commits: number;\n activeDays: number;\n avgPerDay: number;\n byRepo: { repo: string; commits: number }[];\n };\n sessions: {\n active: number;\n bySquad: number;\n };\n relevantMemory?: { squad: string; agent: string; snippet: string }[];\n}\n\ninterface BriefingOptions {\n squad?: string;\n topic?: string;\n json?: boolean;\n agent?: boolean;\n verbose?: boolean;\n}\n\n// ============================================================================\n// Business Brief Parser\n// ============================================================================\n\nconst BRIDGE_URL = process.env.SQUADS_BRIDGE_URL || 'http://localhost:8088';\n\nasync function syncBriefToBridge(brief: BusinessBrief, sourcePath: string): Promise<boolean> {\n try {\n const response = await fetch(`${BRIDGE_URL}/api/brief`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n priority: brief.priority,\n runway: brief.runway,\n focus: brief.focus || [],\n blockers: brief.blockers || [],\n decision_framework: brief.decisionFramework || [],\n raw_content: brief.raw || '',\n source_path: sourcePath,\n synced_by: 'cli',\n }),\n });\n\n if (!response.ok) {\n return false;\n }\n\n const result = await response.json() as { status?: string };\n return result.status === 'synced' || result.status === 'unchanged';\n } catch {\n // Bridge not available, silently fail\n return false;\n }\n}\n\nfunction readBusinessBrief(squadsDir: string | null): BusinessBrief | undefined {\n if (!squadsDir) return undefined;\n\n // Go up from .agents/squads to .agents, then look for BUSINESS_BRIEF.md\n const briefPath = join(squadsDir, '..', 'BUSINESS_BRIEF.md');\n if (!existsSync(briefPath)) return undefined;\n\n try {\n const content = readFileSync(briefPath, 'utf-8');\n const brief: BusinessBrief = { raw: content };\n\n // Parse #1 Priority section\n const priorityMatch = content.match(/##\\s*#1 Priority\\s*\\n+\\*\\*([^*]+)\\*\\*/);\n if (priorityMatch) {\n brief.priority = priorityMatch[1].trim();\n }\n\n // Parse Runway section\n const runwayMatch = content.match(/##\\s*Runway\\s*\\n+([\\s\\S]*?)(?=\\n##|$)/);\n if (runwayMatch) {\n const pressureMatch = runwayMatch[1].match(/\\*\\*Pressure\\*\\*:\\s*(\\w+)/i);\n if (pressureMatch) {\n brief.runway = pressureMatch[1];\n }\n }\n\n // Parse Current Focus section\n const focusMatch = content.match(/##\\s*Current Focus\\s*\\n+([\\s\\S]*?)(?=\\n##|$)/);\n if (focusMatch) {\n const items = focusMatch[1].match(/^\\d+\\.\\s*\\*\\*([^*]+)\\*\\*/gm);\n if (items) {\n brief.focus = items.map(item => {\n const match = item.match(/\\*\\*([^*]+)\\*\\*/);\n return match ? match[1].trim() : item;\n });\n }\n }\n\n // Parse Blockers section\n const blockersMatch = content.match(/##\\s*Blockers\\s*\\n+([\\s\\S]*?)(?=\\n##|$)/);\n if (blockersMatch) {\n const text = blockersMatch[1].trim();\n if (text.toLowerCase().includes('none')) {\n brief.blockers = [];\n } else {\n const items = text.match(/^-\\s*(.+)$/gm);\n if (items) {\n brief.blockers = items.map(item => item.replace(/^-\\s*/, '').trim());\n }\n }\n }\n\n // Parse Decision Framework\n const decisionMatch = content.match(/##\\s*Decision Framework\\s*\\n+([\\s\\S]*?)(?=\\n##|$)/);\n if (decisionMatch) {\n const items = decisionMatch[1].match(/^\\d+\\.\\s*(.+)$/gm);\n if (items) {\n brief.decisionFramework = items.map(item => item.replace(/^\\d+\\.\\s*/, '').trim());\n }\n }\n\n return brief;\n } catch {\n return undefined;\n }\n}\n\n// ============================================================================\n// Data Collection\n// ============================================================================\n\nasync function collectBriefingData(options: BriefingOptions): Promise<BriefingData> {\n const squadsDir = findSquadsDir();\n const memoryDir = findMemoryDir();\n const baseDir = squadsDir ? join(squadsDir, '..', '..', '..') : null;\n\n // Determine which squads to include\n const allSquads = squadsDir ? listSquads(squadsDir) : [];\n\n // Validate --squad option if provided\n if (options.squad && !allSquads.includes(options.squad)) {\n return {\n timestamp: new Date().toISOString(),\n error: `Squad \"${options.squad}\" not found. Available: ${allSquads.join(', ')}`,\n squads: [],\n goals: { active: 0, completed: 0, bySquad: [] },\n sessions: { active: 0, bySquad: 0 },\n } as BriefingData & { error?: string };\n }\n\n const squadNames = options.squad ? [options.squad] : allSquads;\n\n // Collect data in parallel for performance\n const [bridgeStats, rateLimits, sessions, gitStats] = await Promise.all([\n fetchBridgeStats(),\n fetchRateLimits(),\n getLiveSessionSummaryAsync(),\n baseDir ? getMultiRepoGitStats(baseDir, 7) : Promise.resolve(null),\n ]);\n\n // Build squad briefings\n const squadBriefings: SquadBriefing[] = [];\n const goalsBySquad: { squad: string; goals: string[] }[] = [];\n let totalActive = 0;\n let totalCompleted = 0;\n\n for (const squadName of squadNames) {\n const squad = loadSquad(squadName);\n if (!squad) continue;\n\n const agents = squadsDir ? listAgents(squadsDir, squadName) : [];\n const activeGoals = squad.goals.filter(g => !g.completed);\n const completedGoals = squad.goals.filter(g => g.completed);\n\n totalActive += activeGoals.length;\n totalCompleted += completedGoals.length;\n\n // Get memory state\n const states = getSquadState(squadName);\n const recentMemory: string[] = [];\n\n // Extract recent insights from memory\n for (const state of states.slice(0, 3)) {\n const lines = state.content.split('\\n').filter(l => l.trim() && !l.startsWith('#'));\n if (lines.length > 0) {\n recentMemory.push(lines[0].substring(0, 100));\n }\n }\n\n // Determine last activity\n let lastActivity: string | undefined;\n if (memoryDir) {\n const squadMemoryPath = join(memoryDir, squadName);\n if (existsSync(squadMemoryPath)) {\n let mostRecent = 0;\n try {\n const walkDir = (dir: string) => {\n const entries = readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n walkDir(fullPath);\n } else if (entry.name.endsWith('.md')) {\n const stat = statSync(fullPath);\n if (stat.mtimeMs > mostRecent) {\n mostRecent = stat.mtimeMs;\n }\n }\n }\n };\n walkDir(squadMemoryPath);\n } catch {\n // Ignore errors\n }\n\n if (mostRecent > 0) {\n const daysAgo = Math.floor((Date.now() - mostRecent) / (1000 * 60 * 60 * 24));\n if (daysAgo === 0) lastActivity = 'today';\n else if (daysAgo === 1) lastActivity = 'yesterday';\n else lastActivity = `${daysAgo}d ago`;\n }\n }\n }\n\n squadBriefings.push({\n name: squadName,\n mission: squad.mission,\n agentCount: agents.length,\n activeGoals: activeGoals.map(g => ({\n description: g.description,\n progress: g.progress,\n })),\n memoryEntries: states.length,\n recentMemory,\n lastActivity,\n });\n\n if (activeGoals.length > 0) {\n goalsBySquad.push({\n squad: squadName,\n goals: activeGoals.map(g => g.description),\n });\n }\n }\n\n // Build costs data\n const costs = bridgeStats ? {\n today: {\n generations: bridgeStats.today.generations,\n cost: bridgeStats.today.costUsd,\n },\n budget: bridgeStats.budget,\n bySquad: bridgeStats.bySquad.map(s => ({\n squad: s.squad,\n cost: s.costUsd,\n generations: s.generations,\n })),\n } : undefined;\n\n // Build rate limits data\n const rateLimitsData = rateLimits.source !== 'none' ? {\n models: Object.values(rateLimits.limits).map(l => ({\n model: l.model,\n requestsRemaining: l.requestsRemaining,\n tokensRemaining: l.tokensRemaining,\n })),\n } : undefined;\n\n // Build git data\n const git = gitStats ? {\n commits: gitStats.totalCommits,\n activeDays: gitStats.activeDays,\n avgPerDay: gitStats.avgCommitsPerDay,\n byRepo: Array.from(gitStats.commitsByRepo.entries()).map(([repo, commits]) => ({\n repo,\n commits,\n })),\n } : undefined;\n\n // Search for topic-relevant memory if provided\n let relevantMemory: { squad: string; agent: string; snippet: string }[] | undefined;\n if (options.topic) {\n const results = searchMemory(options.topic);\n relevantMemory = results.slice(0, 5).map(r => ({\n squad: r.entry.squad,\n agent: r.entry.agent,\n snippet: r.matches[0]?.substring(0, 150) || '',\n }));\n }\n\n // Read business brief and sync to bridge\n const brief = readBusinessBrief(squadsDir);\n if (brief && squadsDir) {\n const briefPath = join(squadsDir, '..', 'BUSINESS_BRIEF.md');\n // Sync in background, don't block\n syncBriefToBridge(brief, briefPath).catch(() => {});\n }\n\n return {\n timestamp: new Date().toISOString(),\n brief,\n squads: squadBriefings,\n goals: {\n active: totalActive,\n completed: totalCompleted,\n bySquad: goalsBySquad,\n },\n costs,\n rateLimits: rateLimitsData,\n git,\n sessions: {\n active: sessions.totalSessions,\n bySquad: sessions.squadCount,\n },\n relevantMemory,\n };\n}\n\n// ============================================================================\n// Human Output\n// ============================================================================\n\nfunction renderHumanBriefing(data: BriefingData, options: BriefingOptions): void {\n writeLine();\n writeLine(` ${gradient('squads')} ${colors.dim}context-feed${RESET}`);\n writeLine();\n\n // Handle error (e.g., invalid squad)\n if (data.error) {\n writeLine(` ${colors.yellow}${icons.warning || '⚠'}${RESET} ${data.error}`);\n writeLine();\n return;\n }\n\n // Business Brief (top priority context)\n if (data.brief) {\n if (data.brief.priority) {\n const runwayColor = data.brief.runway === 'HIGH' ? colors.red :\n data.brief.runway === 'MEDIUM' ? colors.yellow : colors.green;\n writeLine(` ${bold}#1 Priority${RESET} ${runwayColor}[${data.brief.runway || '—'}]${RESET}`);\n writeLine(` ${colors.white}${data.brief.priority}${RESET}`);\n writeLine();\n }\n\n if (data.brief.focus && data.brief.focus.length > 0) {\n writeLine(` ${bold}Focus${RESET}`);\n for (const item of data.brief.focus.slice(0, 3)) {\n writeLine(` ${colors.cyan}→${RESET} ${item}`);\n }\n writeLine();\n }\n\n if (data.brief.blockers && data.brief.blockers.length > 0) {\n writeLine(` ${colors.red}${bold}Blockers${RESET}`);\n for (const blocker of data.brief.blockers) {\n writeLine(` ${colors.red}✗${RESET} ${blocker}`);\n }\n writeLine();\n }\n }\n\n // Sessions indicator\n if (data.sessions.active > 0) {\n writeLine(` ${colors.green}${icons.active}${RESET} ${data.sessions.active} active sessions across ${data.sessions.bySquad} squads`);\n writeLine();\n }\n\n // Goals summary\n if (data.goals.active > 0) {\n writeLine(` ${bold}Active Goals${RESET} ${colors.dim}(${data.goals.active})${RESET}`);\n writeLine();\n for (const sq of data.goals.bySquad) {\n writeLine(` ${colors.cyan}${sq.squad}${RESET}`);\n for (const goal of sq.goals.slice(0, 2)) {\n writeLine(` ${icons.active} ${goal}`);\n }\n if (sq.goals.length > 2) {\n writeLine(` ${colors.dim}+${sq.goals.length - 2} more${RESET}`);\n }\n }\n writeLine();\n }\n\n // Costs snapshot\n if (data.costs) {\n const { budget } = data.costs;\n const usedBar = '█'.repeat(Math.min(Math.round(budget.usedPct / 5), 20));\n const emptyBar = '░'.repeat(20 - usedBar.length);\n\n writeLine(` ${bold}Budget${RESET}`);\n writeLine(` ${colors.dim}$${budget.used.toFixed(2)}/${budget.daily} today${RESET} ${usedBar}${emptyBar} ${budget.usedPct.toFixed(0)}%`);\n writeLine();\n }\n\n // Rate limits (if available and verbose)\n if (data.rateLimits && options.verbose) {\n writeLine(` ${bold}Rate Limits${RESET}`);\n for (const model of data.rateLimits.models.slice(0, 3)) {\n const shortName = model.model.replace('claude-', '').replace(/-\\d+$/, '');\n writeLine(` ${colors.dim}${shortName}:${RESET} ${model.requestsRemaining} req, ${Math.round(model.tokensRemaining / 1000)}k tok`);\n }\n writeLine();\n }\n\n // Git activity (last 7 days)\n if (data.git && data.git.commits > 0) {\n writeLine(` ${bold}Git Activity${RESET} ${colors.dim}(7d)${RESET}`);\n writeLine(` ${data.git.commits} commits, ${data.git.avgPerDay}/day avg`);\n writeLine();\n }\n\n // Squads with activity\n const activeSquads = data.squads.filter(s => s.activeGoals.length > 0 || s.memoryEntries > 0);\n if (activeSquads.length > 0 && options.verbose) {\n const w = { name: 14, agents: 8, memory: 10, activity: 10 };\n const tableWidth = w.name + w.agents + w.memory + w.activity + 4;\n\n writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);\n writeLine(` ${colors.purple}${box.vertical}${RESET} ${bold}${padEnd('SQUAD', w.name)}${RESET}${bold}${padEnd('AGENTS', w.agents)}${RESET}${bold}${padEnd('MEMORY', w.memory)}${RESET}${bold}ACTIVITY${RESET} ${colors.purple}${box.vertical}${RESET}`);\n writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);\n\n for (const sq of activeSquads.slice(0, 8)) {\n const row = ` ${colors.purple}${box.vertical}${RESET} ` +\n `${colors.cyan}${padEnd(sq.name, w.name)}${RESET}` +\n `${padEnd(String(sq.agentCount), w.agents)}` +\n `${padEnd(String(sq.memoryEntries), w.memory)}` +\n `${padEnd(sq.lastActivity || '—', w.activity - 2)}` +\n `${colors.purple}${box.vertical}${RESET}`;\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\n // Topic-relevant memory\n if (data.relevantMemory && data.relevantMemory.length > 0) {\n writeLine(` ${bold}Relevant Memory${RESET} ${colors.dim}(\"${options.topic}\")${RESET}`);\n for (const mem of data.relevantMemory) {\n writeLine(` ${colors.cyan}${mem.squad}/${mem.agent}${RESET}`);\n writeLine(` ${colors.dim}${mem.snippet}${RESET}`);\n }\n writeLine();\n }\n\n // Commands\n writeLine(` ${colors.dim}$${RESET} squads feed ${colors.cyan}--topic \"pricing\"${RESET} ${colors.dim}Topic-focused${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads feed ${colors.cyan}--squad website${RESET} ${colors.dim}Single squad${RESET}`);\n writeLine(` ${colors.dim}$${RESET} squads feed ${colors.cyan}--agent${RESET} ${colors.dim}JSON for agents${RESET}`);\n writeLine();\n}\n\n// ============================================================================\n// Agent Output (JSON)\n// ============================================================================\n\nfunction renderAgentBriefing(data: BriefingData): void {\n // Clean output for agent consumption\n console.log(JSON.stringify(data, null, 2));\n}\n\n// ============================================================================\n// Command Export\n// ============================================================================\n\nexport async function contextFeedCommand(options: BriefingOptions = {}): Promise<void> {\n const squadsDir = findSquadsDir();\n\n if (!squadsDir) {\n if (options.json || options.agent) {\n console.log(JSON.stringify({ error: 'No .agents/squads directory found' }));\n } else {\n writeLine(`${colors.red}No .agents/squads directory found${RESET}`);\n writeLine(`${colors.dim}Run \\`squads init\\` to create one.${RESET}`);\n }\n process.exit(1);\n }\n\n const data = await collectBriefingData(options);\n\n if (options.json || options.agent) {\n renderAgentBriefing(data);\n } else {\n renderHumanBriefing(data, options);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,SAAS,YAAY,UAAU,aAAa,oBAAoB;AAChE,SAAS,YAAY;AA2FrB,IAAM,aAAa,QAAQ,IAAI,qBAAqB;AAEpD,eAAe,kBAAkB,OAAsB,YAAsC;AAC3F,MAAI;AACF,UAAM,WAAW,MAAM,MAAM,GAAG,UAAU,cAAc;AAAA,MACtD,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,MAC9C,MAAM,KAAK,UAAU;AAAA,QACnB,UAAU,MAAM;AAAA,QAChB,QAAQ,MAAM;AAAA,QACd,OAAO,MAAM,SAAS,CAAC;AAAA,QACvB,UAAU,MAAM,YAAY,CAAC;AAAA,QAC7B,oBAAoB,MAAM,qBAAqB,CAAC;AAAA,QAChD,aAAa,MAAM,OAAO;AAAA,QAC1B,aAAa;AAAA,QACb,WAAW;AAAA,MACb,CAAC;AAAA,IACH,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,MAAM,SAAS,KAAK;AACnC,WAAO,OAAO,WAAW,YAAY,OAAO,WAAW;AAAA,EACzD,QAAQ;AAEN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,kBAAkB,WAAqD;AAC9E,MAAI,CAAC,UAAW,QAAO;AAGvB,QAAM,YAAY,KAAK,WAAW,MAAM,mBAAmB;AAC3D,MAAI,CAAC,WAAW,SAAS,EAAG,QAAO;AAEnC,MAAI;AACF,UAAM,UAAU,aAAa,WAAW,OAAO;AAC/C,UAAM,QAAuB,EAAE,KAAK,QAAQ;AAG5C,UAAM,gBAAgB,QAAQ,MAAM,uCAAuC;AAC3E,QAAI,eAAe;AACjB,YAAM,WAAW,cAAc,CAAC,EAAE,KAAK;AAAA,IACzC;AAGA,UAAM,cAAc,QAAQ,MAAM,uCAAuC;AACzE,QAAI,aAAa;AACf,YAAM,gBAAgB,YAAY,CAAC,EAAE,MAAM,4BAA4B;AACvE,UAAI,eAAe;AACjB,cAAM,SAAS,cAAc,CAAC;AAAA,MAChC;AAAA,IACF;AAGA,UAAM,aAAa,QAAQ,MAAM,8CAA8C;AAC/E,QAAI,YAAY;AACd,YAAM,QAAQ,WAAW,CAAC,EAAE,MAAM,4BAA4B;AAC9D,UAAI,OAAO;AACT,cAAM,QAAQ,MAAM,IAAI,UAAQ;AAC9B,gBAAM,QAAQ,KAAK,MAAM,iBAAiB;AAC1C,iBAAO,QAAQ,MAAM,CAAC,EAAE,KAAK,IAAI;AAAA,QACnC,CAAC;AAAA,MACH;AAAA,IACF;AAGA,UAAM,gBAAgB,QAAQ,MAAM,yCAAyC;AAC7E,QAAI,eAAe;AACjB,YAAM,OAAO,cAAc,CAAC,EAAE,KAAK;AACnC,UAAI,KAAK,YAAY,EAAE,SAAS,MAAM,GAAG;AACvC,cAAM,WAAW,CAAC;AAAA,MACpB,OAAO;AACL,cAAM,QAAQ,KAAK,MAAM,cAAc;AACvC,YAAI,OAAO;AACT,gBAAM,WAAW,MAAM,IAAI,UAAQ,KAAK,QAAQ,SAAS,EAAE,EAAE,KAAK,CAAC;AAAA,QACrE;AAAA,MACF;AAAA,IACF;AAGA,UAAM,gBAAgB,QAAQ,MAAM,mDAAmD;AACvF,QAAI,eAAe;AACjB,YAAM,QAAQ,cAAc,CAAC,EAAE,MAAM,kBAAkB;AACvD,UAAI,OAAO;AACT,cAAM,oBAAoB,MAAM,IAAI,UAAQ,KAAK,QAAQ,aAAa,EAAE,EAAE,KAAK,CAAC;AAAA,MAClF;AAAA,IACF;AAEA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAMA,eAAe,oBAAoB,SAAiD;AAClF,QAAM,YAAY,cAAc;AAChC,QAAM,YAAY,cAAc;AAChC,QAAM,UAAU,YAAY,KAAK,WAAW,MAAM,MAAM,IAAI,IAAI;AAGhE,QAAM,YAAY,YAAY,WAAW,SAAS,IAAI,CAAC;AAGvD,MAAI,QAAQ,SAAS,CAAC,UAAU,SAAS,QAAQ,KAAK,GAAG;AACvD,WAAO;AAAA,MACL,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,OAAO,UAAU,QAAQ,KAAK,2BAA2B,UAAU,KAAK,IAAI,CAAC;AAAA,MAC7E,QAAQ,CAAC;AAAA,MACT,OAAO,EAAE,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAC,EAAE;AAAA,MAC9C,UAAU,EAAE,QAAQ,GAAG,SAAS,EAAE;AAAA,IACpC;AAAA,EACF;AAEA,QAAM,aAAa,QAAQ,QAAQ,CAAC,QAAQ,KAAK,IAAI;AAGrD,QAAM,CAAC,aAAa,YAAY,UAAU,QAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,IACtE,iBAAiB;AAAA,IACjB,gBAAgB;AAAA,IAChB,2BAA2B;AAAA,IAC3B,UAAU,qBAAqB,SAAS,CAAC,IAAI,QAAQ,QAAQ,IAAI;AAAA,EACnE,CAAC;AAGD,QAAM,iBAAkC,CAAC;AACzC,QAAM,eAAqD,CAAC;AAC5D,MAAI,cAAc;AAClB,MAAI,iBAAiB;AAErB,aAAW,aAAa,YAAY;AAClC,UAAM,QAAQ,UAAU,SAAS;AACjC,QAAI,CAAC,MAAO;AAEZ,UAAM,SAAS,YAAY,WAAW,WAAW,SAAS,IAAI,CAAC;AAC/D,UAAM,cAAc,MAAM,MAAM,OAAO,OAAK,CAAC,EAAE,SAAS;AACxD,UAAM,iBAAiB,MAAM,MAAM,OAAO,OAAK,EAAE,SAAS;AAE1D,mBAAe,YAAY;AAC3B,sBAAkB,eAAe;AAGjC,UAAM,SAAS,cAAc,SAAS;AACtC,UAAM,eAAyB,CAAC;AAGhC,eAAW,SAAS,OAAO,MAAM,GAAG,CAAC,GAAG;AACtC,YAAM,QAAQ,MAAM,QAAQ,MAAM,IAAI,EAAE,OAAO,OAAK,EAAE,KAAK,KAAK,CAAC,EAAE,WAAW,GAAG,CAAC;AAClF,UAAI,MAAM,SAAS,GAAG;AACpB,qBAAa,KAAK,MAAM,CAAC,EAAE,UAAU,GAAG,GAAG,CAAC;AAAA,MAC9C;AAAA,IACF;AAGA,QAAI;AACJ,QAAI,WAAW;AACb,YAAM,kBAAkB,KAAK,WAAW,SAAS;AACjD,UAAI,WAAW,eAAe,GAAG;AAC/B,YAAI,aAAa;AACjB,YAAI;AACF,gBAAM,UAAU,CAAC,QAAgB;AAC/B,kBAAM,UAAU,YAAY,KAAK,EAAE,eAAe,KAAK,CAAC;AACxD,uBAAW,SAAS,SAAS;AAC3B,oBAAM,WAAW,KAAK,KAAK,MAAM,IAAI;AACrC,kBAAI,MAAM,YAAY,GAAG;AACvB,wBAAQ,QAAQ;AAAA,cAClB,WAAW,MAAM,KAAK,SAAS,KAAK,GAAG;AACrC,sBAAM,OAAO,SAAS,QAAQ;AAC9B,oBAAI,KAAK,UAAU,YAAY;AAC7B,+BAAa,KAAK;AAAA,gBACpB;AAAA,cACF;AAAA,YACF;AAAA,UACF;AACA,kBAAQ,eAAe;AAAA,QACzB,QAAQ;AAAA,QAER;AAEA,YAAI,aAAa,GAAG;AAClB,gBAAM,UAAU,KAAK,OAAO,KAAK,IAAI,IAAI,eAAe,MAAO,KAAK,KAAK,GAAG;AAC5E,cAAI,YAAY,EAAG,gBAAe;AAAA,mBACzB,YAAY,EAAG,gBAAe;AAAA,cAClC,gBAAe,GAAG,OAAO;AAAA,QAChC;AAAA,MACF;AAAA,IACF;AAEA,mBAAe,KAAK;AAAA,MAClB,MAAM;AAAA,MACN,SAAS,MAAM;AAAA,MACf,YAAY,OAAO;AAAA,MACnB,aAAa,YAAY,IAAI,QAAM;AAAA,QACjC,aAAa,EAAE;AAAA,QACf,UAAU,EAAE;AAAA,MACd,EAAE;AAAA,MACF,eAAe,OAAO;AAAA,MACtB;AAAA,MACA;AAAA,IACF,CAAC;AAED,QAAI,YAAY,SAAS,GAAG;AAC1B,mBAAa,KAAK;AAAA,QAChB,OAAO;AAAA,QACP,OAAO,YAAY,IAAI,OAAK,EAAE,WAAW;AAAA,MAC3C,CAAC;AAAA,IACH;AAAA,EACF;AAGA,QAAM,QAAQ,cAAc;AAAA,IAC1B,OAAO;AAAA,MACL,aAAa,YAAY,MAAM;AAAA,MAC/B,MAAM,YAAY,MAAM;AAAA,IAC1B;AAAA,IACA,QAAQ,YAAY;AAAA,IACpB,SAAS,YAAY,QAAQ,IAAI,QAAM;AAAA,MACrC,OAAO,EAAE;AAAA,MACT,MAAM,EAAE;AAAA,MACR,aAAa,EAAE;AAAA,IACjB,EAAE;AAAA,EACJ,IAAI;AAGJ,QAAM,iBAAiB,WAAW,WAAW,SAAS;AAAA,IACpD,QAAQ,OAAO,OAAO,WAAW,MAAM,EAAE,IAAI,QAAM;AAAA,MACjD,OAAO,EAAE;AAAA,MACT,mBAAmB,EAAE;AAAA,MACrB,iBAAiB,EAAE;AAAA,IACrB,EAAE;AAAA,EACJ,IAAI;AAGJ,QAAM,MAAM,WAAW;AAAA,IACrB,SAAS,SAAS;AAAA,IAClB,YAAY,SAAS;AAAA,IACrB,WAAW,SAAS;AAAA,IACpB,QAAQ,MAAM,KAAK,SAAS,cAAc,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,OAAO,OAAO;AAAA,MAC7E;AAAA,MACA;AAAA,IACF,EAAE;AAAA,EACJ,IAAI;AAGJ,MAAI;AACJ,MAAI,QAAQ,OAAO;AACjB,UAAM,UAAU,aAAa,QAAQ,KAAK;AAC1C,qBAAiB,QAAQ,MAAM,GAAG,CAAC,EAAE,IAAI,QAAM;AAAA,MAC7C,OAAO,EAAE,MAAM;AAAA,MACf,OAAO,EAAE,MAAM;AAAA,MACf,SAAS,EAAE,QAAQ,CAAC,GAAG,UAAU,GAAG,GAAG,KAAK;AAAA,IAC9C,EAAE;AAAA,EACJ;AAGA,QAAM,QAAQ,kBAAkB,SAAS;AACzC,MAAI,SAAS,WAAW;AACtB,UAAM,YAAY,KAAK,WAAW,MAAM,mBAAmB;AAE3D,sBAAkB,OAAO,SAAS,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACpD;AAEA,SAAO;AAAA,IACL,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IAClC;AAAA,IACA,QAAQ;AAAA,IACR,OAAO;AAAA,MACL,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,SAAS;AAAA,IACX;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ;AAAA,IACA,UAAU;AAAA,MACR,QAAQ,SAAS;AAAA,MACjB,SAAS,SAAS;AAAA,IACpB;AAAA,IACA;AAAA,EACF;AACF;AAMA,SAAS,oBAAoB,MAAoB,SAAgC;AAC/E,YAAU;AACV,YAAU,KAAK,SAAS,QAAQ,CAAC,IAAI,OAAO,GAAG,eAAe,KAAK,EAAE;AACrE,YAAU;AAGV,MAAI,KAAK,OAAO;AACd,cAAU,KAAK,OAAO,MAAM,GAAG,MAAM,WAAW,QAAG,GAAG,KAAK,IAAI,KAAK,KAAK,EAAE;AAC3E,cAAU;AACV;AAAA,EACF;AAGA,MAAI,KAAK,OAAO;AACd,QAAI,KAAK,MAAM,UAAU;AACvB,YAAM,cAAc,KAAK,MAAM,WAAW,SAAS,OAAO,MACtC,KAAK,MAAM,WAAW,WAAW,OAAO,SAAS,OAAO;AAC5E,gBAAU,KAAK,IAAI,cAAc,KAAK,IAAI,WAAW,IAAI,KAAK,MAAM,UAAU,QAAG,IAAI,KAAK,EAAE;AAC5F,gBAAU,KAAK,OAAO,KAAK,GAAG,KAAK,MAAM,QAAQ,GAAG,KAAK,EAAE;AAC3D,gBAAU;AAAA,IACZ;AAEA,QAAI,KAAK,MAAM,SAAS,KAAK,MAAM,MAAM,SAAS,GAAG;AACnD,gBAAU,KAAK,IAAI,QAAQ,KAAK,EAAE;AAClC,iBAAW,QAAQ,KAAK,MAAM,MAAM,MAAM,GAAG,CAAC,GAAG;AAC/C,kBAAU,KAAK,OAAO,IAAI,SAAI,KAAK,IAAI,IAAI,EAAE;AAAA,MAC/C;AACA,gBAAU;AAAA,IACZ;AAEA,QAAI,KAAK,MAAM,YAAY,KAAK,MAAM,SAAS,SAAS,GAAG;AACzD,gBAAU,KAAK,OAAO,GAAG,GAAG,IAAI,WAAW,KAAK,EAAE;AAClD,iBAAW,WAAW,KAAK,MAAM,UAAU;AACzC,kBAAU,KAAK,OAAO,GAAG,SAAI,KAAK,IAAI,OAAO,EAAE;AAAA,MACjD;AACA,gBAAU;AAAA,IACZ;AAAA,EACF;AAGA,MAAI,KAAK,SAAS,SAAS,GAAG;AAC5B,cAAU,KAAK,OAAO,KAAK,GAAG,MAAM,MAAM,GAAG,KAAK,IAAI,KAAK,SAAS,MAAM,2BAA2B,KAAK,SAAS,OAAO,SAAS;AACnI,cAAU;AAAA,EACZ;AAGA,MAAI,KAAK,MAAM,SAAS,GAAG;AACzB,cAAU,KAAK,IAAI,eAAe,KAAK,IAAI,OAAO,GAAG,IAAI,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE;AACrF,cAAU;AACV,eAAW,MAAM,KAAK,MAAM,SAAS;AACnC,gBAAU,KAAK,OAAO,IAAI,GAAG,GAAG,KAAK,GAAG,KAAK,EAAE;AAC/C,iBAAW,QAAQ,GAAG,MAAM,MAAM,GAAG,CAAC,GAAG;AACvC,kBAAU,OAAO,MAAM,MAAM,IAAI,IAAI,EAAE;AAAA,MACzC;AACA,UAAI,GAAG,MAAM,SAAS,GAAG;AACvB,kBAAU,OAAO,OAAO,GAAG,IAAI,GAAG,MAAM,SAAS,CAAC,QAAQ,KAAK,EAAE;AAAA,MACnE;AAAA,IACF;AACA,cAAU;AAAA,EACZ;AAGA,MAAI,KAAK,OAAO;AACd,UAAM,EAAE,OAAO,IAAI,KAAK;AACxB,UAAM,UAAU,SAAI,OAAO,KAAK,IAAI,KAAK,MAAM,OAAO,UAAU,CAAC,GAAG,EAAE,CAAC;AACvE,UAAM,WAAW,SAAI,OAAO,KAAK,QAAQ,MAAM;AAE/C,cAAU,KAAK,IAAI,SAAS,KAAK,EAAE;AACnC,cAAU,KAAK,OAAO,GAAG,IAAI,OAAO,KAAK,QAAQ,CAAC,CAAC,IAAI,OAAO,KAAK,SAAS,KAAK,IAAI,OAAO,GAAG,QAAQ,IAAI,OAAO,QAAQ,QAAQ,CAAC,CAAC,GAAG;AACvI,cAAU;AAAA,EACZ;AAGA,MAAI,KAAK,cAAc,QAAQ,SAAS;AACtC,cAAU,KAAK,IAAI,cAAc,KAAK,EAAE;AACxC,eAAW,SAAS,KAAK,WAAW,OAAO,MAAM,GAAG,CAAC,GAAG;AACtD,YAAM,YAAY,MAAM,MAAM,QAAQ,WAAW,EAAE,EAAE,QAAQ,SAAS,EAAE;AACxE,gBAAU,KAAK,OAAO,GAAG,GAAG,SAAS,IAAI,KAAK,IAAI,MAAM,iBAAiB,SAAS,KAAK,MAAM,MAAM,kBAAkB,GAAI,CAAC,OAAO;AAAA,IACnI;AACA,cAAU;AAAA,EACZ;AAGA,MAAI,KAAK,OAAO,KAAK,IAAI,UAAU,GAAG;AACpC,cAAU,KAAK,IAAI,eAAe,KAAK,IAAI,OAAO,GAAG,OAAO,KAAK,EAAE;AACnE,cAAU,KAAK,KAAK,IAAI,OAAO,aAAa,KAAK,IAAI,SAAS,UAAU;AACxE,cAAU;AAAA,EACZ;AAGA,QAAM,eAAe,KAAK,OAAO,OAAO,OAAK,EAAE,YAAY,SAAS,KAAK,EAAE,gBAAgB,CAAC;AAC5F,MAAI,aAAa,SAAS,KAAK,QAAQ,SAAS;AAC9C,UAAM,IAAI,EAAE,MAAM,IAAI,QAAQ,GAAG,QAAQ,IAAI,UAAU,GAAG;AAC1D,UAAM,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW;AAE/D,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;AACpI,cAAU,KAAK,OAAO,MAAM,GAAG,IAAI,QAAQ,GAAG,KAAK,IAAI,IAAI,GAAG,OAAO,SAAS,EAAE,IAAI,CAAC,GAAG,KAAK,GAAG,IAAI,GAAG,OAAO,UAAU,EAAE,MAAM,CAAC,GAAG,KAAK,GAAG,IAAI,GAAG,OAAO,UAAU,EAAE,MAAM,CAAC,GAAG,KAAK,GAAG,IAAI,WAAW,KAAK,IAAI,OAAO,MAAM,GAAG,IAAI,QAAQ,GAAG,KAAK,EAAE;AACtP,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,MAAM,aAAa,MAAM,GAAG,CAAC,GAAG;AACzC,YAAM,MAAM,KAAK,OAAO,MAAM,GAAG,IAAI,QAAQ,GAAG,KAAK,IAChD,OAAO,IAAI,GAAG,OAAO,GAAG,MAAM,EAAE,IAAI,CAAC,GAAG,KAAK,GAC7C,OAAO,OAAO,GAAG,UAAU,GAAG,EAAE,MAAM,CAAC,GACvC,OAAO,OAAO,GAAG,aAAa,GAAG,EAAE,MAAM,CAAC,GAC1C,OAAO,GAAG,gBAAgB,UAAK,EAAE,WAAW,CAAC,CAAC,GAC9C,OAAO,MAAM,GAAG,IAAI,QAAQ,GAAG,KAAK;AACzC,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;AAAA,EACZ;AAGA,MAAI,KAAK,kBAAkB,KAAK,eAAe,SAAS,GAAG;AACzD,cAAU,KAAK,IAAI,kBAAkB,KAAK,IAAI,OAAO,GAAG,KAAK,QAAQ,KAAK,KAAK,KAAK,EAAE;AACtF,eAAW,OAAO,KAAK,gBAAgB;AACrC,gBAAU,KAAK,OAAO,IAAI,GAAG,IAAI,KAAK,IAAI,IAAI,KAAK,GAAG,KAAK,EAAE;AAC7D,gBAAU,OAAO,OAAO,GAAG,GAAG,IAAI,OAAO,GAAG,KAAK,EAAE;AAAA,IACrD;AACA,cAAU;AAAA,EACZ;AAGA,YAAU,KAAK,OAAO,GAAG,IAAI,KAAK,gBAAgB,OAAO,IAAI,oBAAoB,KAAK,OAAO,OAAO,GAAG,gBAAgB,KAAK,EAAE;AAC9H,YAAU,KAAK,OAAO,GAAG,IAAI,KAAK,gBAAgB,OAAO,IAAI,kBAAkB,KAAK,QAAQ,OAAO,GAAG,eAAe,KAAK,EAAE;AAC5H,YAAU,KAAK,OAAO,GAAG,IAAI,KAAK,gBAAgB,OAAO,IAAI,UAAU,KAAK,gBAAgB,OAAO,GAAG,kBAAkB,KAAK,EAAE;AAC/H,YAAU;AACZ;AAMA,SAAS,oBAAoB,MAA0B;AAErD,UAAQ,IAAI,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAC3C;AAMA,eAAsB,mBAAmB,UAA2B,CAAC,GAAkB;AACrF,QAAM,YAAY,cAAc;AAEhC,MAAI,CAAC,WAAW;AACd,QAAI,QAAQ,QAAQ,QAAQ,OAAO;AACjC,cAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,oCAAoC,CAAC,CAAC;AAAA,IAC5E,OAAO;AACL,gBAAU,GAAG,OAAO,GAAG,oCAAoC,KAAK,EAAE;AAClE,gBAAU,GAAG,OAAO,GAAG,qCAAqC,KAAK,EAAE;AAAA,IACrE;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,OAAO,MAAM,oBAAoB,OAAO;AAE9C,MAAI,QAAQ,QAAQ,QAAQ,OAAO;AACjC,wBAAoB,IAAI;AAAA,EAC1B,OAAO;AACL,wBAAoB,MAAM,OAAO;AAAA,EACnC;AACF;","names":[]}