squads-cli 0.2.0 → 0.2.1

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 (223) hide show
  1. package/README.md +521 -288
  2. package/dist/auth-YW3UPFSB.js +23 -0
  3. package/dist/auth-YW3UPFSB.js.map +1 -0
  4. package/dist/autonomy-PSVZVX7A.js +105 -0
  5. package/dist/autonomy-PSVZVX7A.js.map +1 -0
  6. package/dist/chunk-67RO2HKR.js +174 -0
  7. package/dist/chunk-67RO2HKR.js.map +1 -0
  8. package/dist/chunk-7OCVIDC7.js +12 -0
  9. package/dist/chunk-7OCVIDC7.js.map +1 -0
  10. package/dist/chunk-BODLDQY7.js +452 -0
  11. package/dist/chunk-BODLDQY7.js.map +1 -0
  12. package/dist/chunk-EHQJHRIW.js +103 -0
  13. package/dist/chunk-EHQJHRIW.js.map +1 -0
  14. package/dist/chunk-FFFCFZ6A.js +121 -0
  15. package/dist/chunk-FFFCFZ6A.js.map +1 -0
  16. package/dist/chunk-FIWT2NMM.js +165 -0
  17. package/dist/chunk-FIWT2NMM.js.map +1 -0
  18. package/dist/chunk-HF4WR7RA.js +154 -0
  19. package/dist/chunk-HF4WR7RA.js.map +1 -0
  20. package/dist/chunk-J6QF4ZQX.js +230 -0
  21. package/dist/chunk-J6QF4ZQX.js.map +1 -0
  22. package/dist/chunk-LOA3KWYJ.js +294 -0
  23. package/dist/chunk-LOA3KWYJ.js.map +1 -0
  24. package/dist/chunk-M5FXNY6Y.js +384 -0
  25. package/dist/chunk-M5FXNY6Y.js.map +1 -0
  26. package/dist/chunk-QHNUMM4V.js +87 -0
  27. package/dist/chunk-QHNUMM4V.js.map +1 -0
  28. package/dist/chunk-QJ7C7CMB.js +223 -0
  29. package/dist/chunk-QJ7C7CMB.js.map +1 -0
  30. package/dist/chunk-RM6BWILN.js +74 -0
  31. package/dist/chunk-RM6BWILN.js.map +1 -0
  32. package/dist/chunk-TYFTF53O.js +613 -0
  33. package/dist/chunk-TYFTF53O.js.map +1 -0
  34. package/dist/chunk-TZXD6WFN.js +420 -0
  35. package/dist/chunk-TZXD6WFN.js.map +1 -0
  36. package/dist/chunk-WVOIY5GW.js +621 -0
  37. package/dist/chunk-WVOIY5GW.js.map +1 -0
  38. package/dist/chunk-Z2UKDBNL.js +162 -0
  39. package/dist/chunk-Z2UKDBNL.js.map +1 -0
  40. package/dist/chunk-ZTQ7ISUR.js +338 -0
  41. package/dist/chunk-ZTQ7ISUR.js.map +1 -0
  42. package/dist/cli.js +2483 -5902
  43. package/dist/cli.js.map +1 -1
  44. package/dist/context-GWPF4SEY.js +291 -0
  45. package/dist/context-GWPF4SEY.js.map +1 -0
  46. package/dist/context-feed-AJGVAR6H.js +394 -0
  47. package/dist/context-feed-AJGVAR6H.js.map +1 -0
  48. package/dist/cost-XBCDJ7XC.js +275 -0
  49. package/dist/cost-XBCDJ7XC.js.map +1 -0
  50. package/dist/create-BLFGG6PF.js +286 -0
  51. package/dist/create-BLFGG6PF.js.map +1 -0
  52. package/dist/dashboard-LGT2B2BL.js +951 -0
  53. package/dist/dashboard-LGT2B2BL.js.map +1 -0
  54. package/dist/dashboard-RMK2BOD2.js +794 -0
  55. package/dist/dashboard-RMK2BOD2.js.map +1 -0
  56. package/dist/doctor-XPUIIBHJ.js +374 -0
  57. package/dist/doctor-XPUIIBHJ.js.map +1 -0
  58. package/dist/env-config-SQEI3Y7Y.js +21 -0
  59. package/dist/env-config-SQEI3Y7Y.js.map +1 -0
  60. package/dist/exec-OUXM7JBF.js +223 -0
  61. package/dist/exec-OUXM7JBF.js.map +1 -0
  62. package/dist/feedback-KNAOG5QK.js +229 -0
  63. package/dist/feedback-KNAOG5QK.js.map +1 -0
  64. package/dist/github-UQTM5KMS.js +23 -0
  65. package/dist/github-UQTM5KMS.js.map +1 -0
  66. package/dist/goal-BVHV5573.js +168 -0
  67. package/dist/goal-BVHV5573.js.map +1 -0
  68. package/dist/health-4UXN44PF.js +218 -0
  69. package/dist/health-4UXN44PF.js.map +1 -0
  70. package/dist/history-ILH3SWHB.js +232 -0
  71. package/dist/history-ILH3SWHB.js.map +1 -0
  72. package/dist/index.d.ts +736 -8
  73. package/dist/index.js +1312 -6
  74. package/dist/index.js.map +1 -1
  75. package/dist/init-XQZ7BOGT.js +812 -0
  76. package/dist/init-XQZ7BOGT.js.map +1 -0
  77. package/dist/kpi-RQIU7WGK.js +413 -0
  78. package/dist/kpi-RQIU7WGK.js.map +1 -0
  79. package/dist/learn-OIFUVZAS.js +269 -0
  80. package/dist/learn-OIFUVZAS.js.map +1 -0
  81. package/dist/login-DXZANWZY.js +155 -0
  82. package/dist/login-DXZANWZY.js.map +1 -0
  83. package/dist/memory-T3ACCS7E.js +560 -0
  84. package/dist/memory-T3ACCS7E.js.map +1 -0
  85. package/dist/memory-VNF2VFRB.js +23 -0
  86. package/dist/memory-VNF2VFRB.js.map +1 -0
  87. package/dist/progress-DAUZMT3N.js +202 -0
  88. package/dist/progress-DAUZMT3N.js.map +1 -0
  89. package/dist/providers-3P5D2XL5.js +65 -0
  90. package/dist/providers-3P5D2XL5.js.map +1 -0
  91. package/dist/results-UECWGLTB.js +224 -0
  92. package/dist/results-UECWGLTB.js.map +1 -0
  93. package/dist/run-I6KAXU6U.js +4049 -0
  94. package/dist/run-I6KAXU6U.js.map +1 -0
  95. package/dist/session-HBU6KZOD.js +64 -0
  96. package/dist/session-HBU6KZOD.js.map +1 -0
  97. package/dist/sessions-CK25VGPL.js +333 -0
  98. package/dist/sessions-CK25VGPL.js.map +1 -0
  99. package/dist/squad-parser-DCG65BJS.js +35 -0
  100. package/dist/squad-parser-DCG65BJS.js.map +1 -0
  101. package/dist/stats-G6NAU5BD.js +334 -0
  102. package/dist/stats-G6NAU5BD.js.map +1 -0
  103. package/dist/status-AQNLDZVN.js +352 -0
  104. package/dist/status-AQNLDZVN.js.map +1 -0
  105. package/dist/sync-ZI3MHA4G.js +836 -0
  106. package/dist/sync-ZI3MHA4G.js.map +1 -0
  107. package/dist/templates/core/AGENTS.md.template +51 -0
  108. package/dist/templates/core/BUSINESS_BRIEF.md.template +29 -0
  109. package/dist/templates/core/CLAUDE.md.template +48 -0
  110. package/dist/templates/core/provider.yaml.template +5 -0
  111. package/dist/templates/first-squad/SQUAD.md.template +23 -0
  112. package/dist/templates/first-squad/lead.md.template +44 -0
  113. package/dist/templates/memory/getting-started/state.md.template +19 -0
  114. package/dist/templates/seed/BUSINESS_BRIEF.md.template +27 -0
  115. package/dist/templates/seed/CLAUDE.md.template +119 -0
  116. package/dist/templates/seed/README.md.template +42 -0
  117. package/dist/templates/seed/config/SYSTEM.md +52 -0
  118. package/dist/templates/seed/config/provider.yaml +4 -0
  119. package/dist/templates/seed/hooks/settings.json.template +31 -0
  120. package/dist/templates/seed/memory/company/directives.md +37 -0
  121. package/dist/templates/seed/memory/company/manager/state.md +16 -0
  122. package/dist/templates/seed/memory/engineering/issue-solver/state.md +12 -0
  123. package/dist/templates/seed/memory/intelligence/intel-lead/state.md +9 -0
  124. package/dist/templates/seed/memory/marketing/content-drafter/state.md +12 -0
  125. package/dist/templates/seed/memory/operations/ops-lead/state.md +12 -0
  126. package/dist/templates/seed/memory/product/lead/state.md +14 -0
  127. package/dist/templates/seed/memory/research/lead/state.md +14 -0
  128. package/dist/templates/seed/skills/gh/SKILL.md +57 -0
  129. package/dist/templates/seed/skills/squads-cli/SKILL.md +84 -0
  130. package/dist/templates/seed/squads/company/SQUAD.md +51 -0
  131. package/dist/templates/seed/squads/company/company-critic.md +49 -0
  132. package/dist/templates/seed/squads/company/company-eval.md +49 -0
  133. package/dist/templates/seed/squads/company/event-dispatcher.md +43 -0
  134. package/dist/templates/seed/squads/company/goal-tracker.md +43 -0
  135. package/dist/templates/seed/squads/company/manager.md +54 -0
  136. package/dist/templates/seed/squads/engineering/SQUAD.md +48 -0
  137. package/dist/templates/seed/squads/engineering/code-reviewer.md +57 -0
  138. package/dist/templates/seed/squads/engineering/issue-solver.md +58 -0
  139. package/dist/templates/seed/squads/engineering/test-writer.md +50 -0
  140. package/dist/templates/seed/squads/intelligence/SQUAD.md +38 -0
  141. package/dist/templates/seed/squads/intelligence/intel-critic.md +36 -0
  142. package/dist/templates/seed/squads/intelligence/intel-eval.md +31 -0
  143. package/dist/templates/seed/squads/intelligence/intel-lead.md +71 -0
  144. package/dist/templates/seed/squads/marketing/SQUAD.md +47 -0
  145. package/dist/templates/seed/squads/marketing/content-drafter.md +71 -0
  146. package/dist/templates/seed/squads/marketing/growth-analyst.md +49 -0
  147. package/dist/templates/seed/squads/marketing/social-poster.md +44 -0
  148. package/dist/templates/seed/squads/operations/SQUAD.md +45 -0
  149. package/dist/templates/seed/squads/operations/finance-tracker.md +47 -0
  150. package/dist/templates/seed/squads/operations/goal-tracker.md +48 -0
  151. package/dist/templates/seed/squads/operations/ops-lead.md +58 -0
  152. package/dist/templates/seed/squads/product/SQUAD.md +41 -0
  153. package/dist/templates/seed/squads/product/lead.md +56 -0
  154. package/dist/templates/seed/squads/product/scanner.md +50 -0
  155. package/dist/templates/seed/squads/product/worker.md +55 -0
  156. package/dist/templates/seed/squads/research/SQUAD.md +38 -0
  157. package/dist/templates/seed/squads/research/analyst.md +50 -0
  158. package/dist/templates/seed/squads/research/lead.md +52 -0
  159. package/dist/templates/seed/squads/research/synthesizer.md +59 -0
  160. package/dist/templates/skills/squads-learn/SKILL.md +86 -0
  161. package/dist/templates/skills/squads-workflow/instruction.md +70 -0
  162. package/dist/terminal-FBQFQTKZ.js +55 -0
  163. package/dist/terminal-FBQFQTKZ.js.map +1 -0
  164. package/dist/update-D7CGIZ3M.js +18 -0
  165. package/dist/update-D7CGIZ3M.js.map +1 -0
  166. package/dist/update-STU276HR.js +83 -0
  167. package/dist/update-STU276HR.js.map +1 -0
  168. package/package.json +31 -13
  169. package/templates/core/AGENTS.md.template +51 -0
  170. package/templates/core/BUSINESS_BRIEF.md.template +29 -0
  171. package/templates/core/CLAUDE.md.template +48 -0
  172. package/templates/core/provider.yaml.template +5 -0
  173. package/templates/first-squad/SQUAD.md.template +23 -0
  174. package/templates/first-squad/lead.md.template +44 -0
  175. package/templates/memory/getting-started/state.md.template +19 -0
  176. package/templates/seed/BUSINESS_BRIEF.md.template +27 -0
  177. package/templates/seed/CLAUDE.md.template +119 -0
  178. package/templates/seed/README.md.template +42 -0
  179. package/templates/seed/config/SYSTEM.md +52 -0
  180. package/templates/seed/config/provider.yaml +4 -0
  181. package/templates/seed/hooks/settings.json.template +31 -0
  182. package/templates/seed/memory/company/directives.md +37 -0
  183. package/templates/seed/memory/company/manager/state.md +16 -0
  184. package/templates/seed/memory/engineering/issue-solver/state.md +12 -0
  185. package/templates/seed/memory/intelligence/intel-lead/state.md +9 -0
  186. package/templates/seed/memory/marketing/content-drafter/state.md +12 -0
  187. package/templates/seed/memory/operations/ops-lead/state.md +12 -0
  188. package/templates/seed/memory/product/lead/state.md +14 -0
  189. package/templates/seed/memory/research/lead/state.md +14 -0
  190. package/templates/seed/skills/gh/SKILL.md +57 -0
  191. package/templates/seed/skills/squads-cli/SKILL.md +84 -0
  192. package/templates/seed/squads/company/SQUAD.md +51 -0
  193. package/templates/seed/squads/company/company-critic.md +49 -0
  194. package/templates/seed/squads/company/company-eval.md +49 -0
  195. package/templates/seed/squads/company/event-dispatcher.md +43 -0
  196. package/templates/seed/squads/company/goal-tracker.md +43 -0
  197. package/templates/seed/squads/company/manager.md +54 -0
  198. package/templates/seed/squads/engineering/SQUAD.md +48 -0
  199. package/templates/seed/squads/engineering/code-reviewer.md +57 -0
  200. package/templates/seed/squads/engineering/issue-solver.md +58 -0
  201. package/templates/seed/squads/engineering/test-writer.md +50 -0
  202. package/templates/seed/squads/intelligence/SQUAD.md +38 -0
  203. package/templates/seed/squads/intelligence/intel-critic.md +36 -0
  204. package/templates/seed/squads/intelligence/intel-eval.md +31 -0
  205. package/templates/seed/squads/intelligence/intel-lead.md +71 -0
  206. package/templates/seed/squads/marketing/SQUAD.md +47 -0
  207. package/templates/seed/squads/marketing/content-drafter.md +71 -0
  208. package/templates/seed/squads/marketing/growth-analyst.md +49 -0
  209. package/templates/seed/squads/marketing/social-poster.md +44 -0
  210. package/templates/seed/squads/operations/SQUAD.md +45 -0
  211. package/templates/seed/squads/operations/finance-tracker.md +47 -0
  212. package/templates/seed/squads/operations/goal-tracker.md +48 -0
  213. package/templates/seed/squads/operations/ops-lead.md +58 -0
  214. package/templates/seed/squads/product/SQUAD.md +41 -0
  215. package/templates/seed/squads/product/lead.md +56 -0
  216. package/templates/seed/squads/product/scanner.md +50 -0
  217. package/templates/seed/squads/product/worker.md +55 -0
  218. package/templates/seed/squads/research/SQUAD.md +38 -0
  219. package/templates/seed/squads/research/analyst.md +50 -0
  220. package/templates/seed/squads/research/lead.md +52 -0
  221. package/templates/seed/squads/research/synthesizer.md +59 -0
  222. package/templates/skills/squads-learn/SKILL.md +86 -0
  223. package/templates/skills/squads-workflow/instruction.md +70 -0
@@ -0,0 +1,394 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ fetchBridgeStats,
4
+ fetchRateLimits
5
+ } from "./chunk-WVOIY5GW.js";
6
+ import "./chunk-LOA3KWYJ.js";
7
+ import {
8
+ getEnv
9
+ } from "./chunk-EHQJHRIW.js";
10
+ import {
11
+ getLiveSessionSummaryAsync
12
+ } from "./chunk-BODLDQY7.js";
13
+ import {
14
+ getMultiRepoGitStats
15
+ } from "./chunk-TZXD6WFN.js";
16
+ import {
17
+ findSquadsDir,
18
+ listAgents,
19
+ listSquads,
20
+ loadSquad
21
+ } from "./chunk-TYFTF53O.js";
22
+ import {
23
+ findMemoryDir,
24
+ getSquadState,
25
+ searchMemory
26
+ } from "./chunk-ZTQ7ISUR.js";
27
+ import {
28
+ RESET,
29
+ bold,
30
+ box,
31
+ colors,
32
+ gradient,
33
+ icons,
34
+ padEnd,
35
+ writeLine
36
+ } from "./chunk-M5FXNY6Y.js";
37
+ import "./chunk-7OCVIDC7.js";
38
+
39
+ // src/commands/context-feed.ts
40
+ import { existsSync, statSync, readdirSync, readFileSync } from "fs";
41
+ import { join } from "path";
42
+ var BRIDGE_URL = getEnv().bridge_url;
43
+ async function syncBriefToBridge(brief, sourcePath) {
44
+ try {
45
+ const response = await fetch(`${BRIDGE_URL}/api/brief`, {
46
+ method: "POST",
47
+ headers: { "Content-Type": "application/json" },
48
+ body: JSON.stringify({
49
+ priority: brief.priority,
50
+ runway: brief.runway,
51
+ focus: brief.focus || [],
52
+ blockers: brief.blockers || [],
53
+ decision_framework: brief.decisionFramework || [],
54
+ raw_content: brief.raw || "",
55
+ source_path: sourcePath,
56
+ synced_by: "cli"
57
+ })
58
+ });
59
+ if (!response.ok) {
60
+ return false;
61
+ }
62
+ const result = await response.json();
63
+ return result.status === "synced" || result.status === "unchanged";
64
+ } catch {
65
+ return false;
66
+ }
67
+ }
68
+ function readBusinessBrief(squadsDir) {
69
+ if (!squadsDir) return void 0;
70
+ const briefPath = join(squadsDir, "..", "BUSINESS_BRIEF.md");
71
+ if (!existsSync(briefPath)) return void 0;
72
+ try {
73
+ const content = readFileSync(briefPath, "utf-8");
74
+ const brief = { raw: content };
75
+ const priorityMatch = content.match(/##\s*#1 Priority\s*\n+\*\*([^*]+)\*\*/);
76
+ if (priorityMatch) {
77
+ brief.priority = priorityMatch[1].trim();
78
+ }
79
+ const runwayMatch = content.match(/##\s*Runway\s*\n+([\s\S]*?)(?=\n##|$)/);
80
+ if (runwayMatch) {
81
+ const pressureMatch = runwayMatch[1].match(/\*\*Pressure\*\*:\s*(\w+)/i);
82
+ if (pressureMatch) {
83
+ brief.runway = pressureMatch[1];
84
+ }
85
+ }
86
+ const focusMatch = content.match(/##\s*Current Focus\s*\n+([\s\S]*?)(?=\n##|$)/);
87
+ if (focusMatch) {
88
+ const items = focusMatch[1].match(/^\d+\.\s*\*\*([^*]+)\*\*/gm);
89
+ if (items) {
90
+ brief.focus = items.map((item) => {
91
+ const match = item.match(/\*\*([^*]+)\*\*/);
92
+ return match ? match[1].trim() : item;
93
+ });
94
+ }
95
+ }
96
+ const blockersMatch = content.match(/##\s*Blockers\s*\n+([\s\S]*?)(?=\n##|$)/);
97
+ if (blockersMatch) {
98
+ const text = blockersMatch[1].trim();
99
+ if (text.toLowerCase().includes("none")) {
100
+ brief.blockers = [];
101
+ } else {
102
+ const items = text.match(/^-\s*(.+)$/gm);
103
+ if (items) {
104
+ brief.blockers = items.map((item) => item.replace(/^-\s*/, "").trim());
105
+ }
106
+ }
107
+ }
108
+ const decisionMatch = content.match(/##\s*Decision Framework\s*\n+([\s\S]*?)(?=\n##|$)/);
109
+ if (decisionMatch) {
110
+ const items = decisionMatch[1].match(/^\d+\.\s*(.+)$/gm);
111
+ if (items) {
112
+ brief.decisionFramework = items.map((item) => item.replace(/^\d+\.\s*/, "").trim());
113
+ }
114
+ }
115
+ return brief;
116
+ } catch {
117
+ return void 0;
118
+ }
119
+ }
120
+ async function collectBriefingData(options) {
121
+ const squadsDir = findSquadsDir();
122
+ const memoryDir = findMemoryDir();
123
+ const baseDir = squadsDir ? join(squadsDir, "..", "..", "..") : null;
124
+ const allSquads = squadsDir ? listSquads(squadsDir) : [];
125
+ if (options.squad && !allSquads.includes(options.squad)) {
126
+ return {
127
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
128
+ error: `Squad "${options.squad}" not found. Available: ${allSquads.join(", ")}`,
129
+ squads: [],
130
+ goals: { active: 0, completed: 0, bySquad: [] },
131
+ sessions: { active: 0, bySquad: 0 }
132
+ };
133
+ }
134
+ const squadNames = options.squad ? [options.squad] : allSquads;
135
+ const [bridgeStats, rateLimits, sessions, gitStats] = await Promise.all([
136
+ fetchBridgeStats(),
137
+ fetchRateLimits(),
138
+ getLiveSessionSummaryAsync(),
139
+ baseDir ? getMultiRepoGitStats(baseDir, 7) : Promise.resolve(null)
140
+ ]);
141
+ const squadBriefings = [];
142
+ const goalsBySquad = [];
143
+ let totalActive = 0;
144
+ let totalCompleted = 0;
145
+ for (const squadName of squadNames) {
146
+ const squad = loadSquad(squadName);
147
+ if (!squad) continue;
148
+ const agents = squadsDir ? listAgents(squadsDir, squadName) : [];
149
+ const activeGoals = squad.goals.filter((g) => !g.completed);
150
+ const completedGoals = squad.goals.filter((g) => g.completed);
151
+ totalActive += activeGoals.length;
152
+ totalCompleted += completedGoals.length;
153
+ const states = getSquadState(squadName);
154
+ const recentMemory = [];
155
+ for (const state of states.slice(0, 3)) {
156
+ const lines = state.content.split("\n").filter((l) => l.trim() && !l.startsWith("#"));
157
+ if (lines.length > 0) {
158
+ recentMemory.push(lines[0].substring(0, 100));
159
+ }
160
+ }
161
+ let lastActivity;
162
+ if (memoryDir) {
163
+ const squadMemoryPath = join(memoryDir, squadName);
164
+ if (existsSync(squadMemoryPath)) {
165
+ let mostRecent = 0;
166
+ try {
167
+ const walkDir = (dir) => {
168
+ const entries = readdirSync(dir, { withFileTypes: true });
169
+ for (const entry of entries) {
170
+ const fullPath = join(dir, entry.name);
171
+ if (entry.isDirectory()) {
172
+ walkDir(fullPath);
173
+ } else if (entry.name.endsWith(".md")) {
174
+ const stat = statSync(fullPath);
175
+ if (stat.mtimeMs > mostRecent) {
176
+ mostRecent = stat.mtimeMs;
177
+ }
178
+ }
179
+ }
180
+ };
181
+ walkDir(squadMemoryPath);
182
+ } catch {
183
+ }
184
+ if (mostRecent > 0) {
185
+ const daysAgo = Math.floor((Date.now() - mostRecent) / (1e3 * 60 * 60 * 24));
186
+ if (daysAgo === 0) lastActivity = "today";
187
+ else if (daysAgo === 1) lastActivity = "yesterday";
188
+ else lastActivity = `${daysAgo}d ago`;
189
+ }
190
+ }
191
+ }
192
+ squadBriefings.push({
193
+ name: squadName,
194
+ mission: squad.mission,
195
+ agentCount: agents.length,
196
+ activeGoals: activeGoals.map((g) => ({
197
+ description: g.description,
198
+ progress: g.progress
199
+ })),
200
+ memoryEntries: states.length,
201
+ recentMemory,
202
+ lastActivity
203
+ });
204
+ if (activeGoals.length > 0) {
205
+ goalsBySquad.push({
206
+ squad: squadName,
207
+ goals: activeGoals.map((g) => g.description)
208
+ });
209
+ }
210
+ }
211
+ const costs = bridgeStats ? {
212
+ today: {
213
+ generations: bridgeStats.today.generations,
214
+ cost: bridgeStats.today.costUsd
215
+ },
216
+ budget: bridgeStats.budget,
217
+ bySquad: bridgeStats.bySquad.map((s) => ({
218
+ squad: s.squad,
219
+ cost: s.costUsd,
220
+ generations: s.generations
221
+ }))
222
+ } : void 0;
223
+ const rateLimitsData = rateLimits.source !== "none" ? {
224
+ models: Object.values(rateLimits.limits).map((l) => ({
225
+ model: l.model,
226
+ requestsRemaining: l.requestsRemaining,
227
+ tokensRemaining: l.tokensRemaining
228
+ }))
229
+ } : void 0;
230
+ const git = gitStats ? {
231
+ commits: gitStats.totalCommits,
232
+ activeDays: gitStats.activeDays,
233
+ avgPerDay: gitStats.avgCommitsPerDay,
234
+ byRepo: Array.from(gitStats.commitsByRepo.entries()).map(([repo, commits]) => ({
235
+ repo,
236
+ commits
237
+ }))
238
+ } : void 0;
239
+ let relevantMemory;
240
+ if (options.topic) {
241
+ const results = searchMemory(options.topic);
242
+ relevantMemory = results.slice(0, 5).map((r) => ({
243
+ squad: r.entry.squad,
244
+ agent: r.entry.agent,
245
+ snippet: r.matches[0]?.substring(0, 150) || ""
246
+ }));
247
+ }
248
+ const brief = readBusinessBrief(squadsDir);
249
+ if (brief && squadsDir) {
250
+ const briefPath = join(squadsDir, "..", "BUSINESS_BRIEF.md");
251
+ syncBriefToBridge(brief, briefPath).catch(() => {
252
+ });
253
+ }
254
+ return {
255
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
256
+ brief,
257
+ squads: squadBriefings,
258
+ goals: {
259
+ active: totalActive,
260
+ completed: totalCompleted,
261
+ bySquad: goalsBySquad
262
+ },
263
+ costs,
264
+ rateLimits: rateLimitsData,
265
+ git,
266
+ sessions: {
267
+ active: sessions.totalSessions,
268
+ bySquad: sessions.squadCount
269
+ },
270
+ relevantMemory
271
+ };
272
+ }
273
+ function renderHumanBriefing(data, options) {
274
+ writeLine();
275
+ writeLine(` ${gradient("squads")} ${colors.dim}context-feed${RESET}`);
276
+ writeLine();
277
+ if (data.error) {
278
+ writeLine(` ${colors.yellow}${icons.warning || "\u26A0"}${RESET} ${data.error}`);
279
+ writeLine();
280
+ return;
281
+ }
282
+ if (data.brief) {
283
+ if (data.brief.priority) {
284
+ const runwayColor = data.brief.runway === "HIGH" ? colors.red : data.brief.runway === "MEDIUM" ? colors.yellow : colors.green;
285
+ writeLine(` ${bold}#1 Priority${RESET} ${runwayColor}[${data.brief.runway || "\u2014"}]${RESET}`);
286
+ writeLine(` ${colors.white}${data.brief.priority}${RESET}`);
287
+ writeLine();
288
+ }
289
+ if (data.brief.focus && data.brief.focus.length > 0) {
290
+ writeLine(` ${bold}Focus${RESET}`);
291
+ for (const item of data.brief.focus.slice(0, 3)) {
292
+ writeLine(` ${colors.cyan}\u2192${RESET} ${item}`);
293
+ }
294
+ writeLine();
295
+ }
296
+ if (data.brief.blockers && data.brief.blockers.length > 0) {
297
+ writeLine(` ${colors.red}${bold}Blockers${RESET}`);
298
+ for (const blocker of data.brief.blockers) {
299
+ writeLine(` ${colors.red}\u2717${RESET} ${blocker}`);
300
+ }
301
+ writeLine();
302
+ }
303
+ }
304
+ if (data.sessions.active > 0) {
305
+ writeLine(` ${colors.green}${icons.active}${RESET} ${data.sessions.active} active sessions across ${data.sessions.bySquad} squads`);
306
+ writeLine();
307
+ }
308
+ if (data.goals.active > 0) {
309
+ writeLine(` ${bold}Active Goals${RESET} ${colors.dim}(${data.goals.active})${RESET}`);
310
+ writeLine();
311
+ for (const sq of data.goals.bySquad) {
312
+ writeLine(` ${colors.cyan}${sq.squad}${RESET}`);
313
+ for (const goal of sq.goals.slice(0, 2)) {
314
+ writeLine(` ${icons.active} ${goal}`);
315
+ }
316
+ if (sq.goals.length > 2) {
317
+ writeLine(` ${colors.dim}+${sq.goals.length - 2} more${RESET}`);
318
+ }
319
+ }
320
+ writeLine();
321
+ }
322
+ if (data.costs) {
323
+ const { budget } = data.costs;
324
+ const usedBar = "\u2588".repeat(Math.min(Math.round(budget.usedPct / 5), 20));
325
+ const emptyBar = "\u2591".repeat(20 - usedBar.length);
326
+ writeLine(` ${bold}Budget${RESET}`);
327
+ writeLine(` ${colors.dim}$${budget.used.toFixed(2)}/${budget.daily} today${RESET} ${usedBar}${emptyBar} ${budget.usedPct.toFixed(0)}%`);
328
+ writeLine();
329
+ }
330
+ if (data.rateLimits && options.verbose) {
331
+ writeLine(` ${bold}Rate Limits${RESET}`);
332
+ for (const model of data.rateLimits.models.slice(0, 3)) {
333
+ const shortName = model.model.replace("claude-", "").replace(/-\d+$/, "");
334
+ writeLine(` ${colors.dim}${shortName}:${RESET} ${model.requestsRemaining} req, ${Math.round(model.tokensRemaining / 1e3)}k tok`);
335
+ }
336
+ writeLine();
337
+ }
338
+ if (data.git && data.git.commits > 0) {
339
+ writeLine(` ${bold}Git Activity${RESET} ${colors.dim}(7d)${RESET}`);
340
+ writeLine(` ${data.git.commits} commits, ${data.git.avgPerDay}/day avg`);
341
+ writeLine();
342
+ }
343
+ const activeSquads = data.squads.filter((s) => s.activeGoals.length > 0 || s.memoryEntries > 0);
344
+ if (activeSquads.length > 0 && options.verbose) {
345
+ const w = { name: 14, agents: 8, memory: 10, activity: 10 };
346
+ const tableWidth = w.name + w.agents + w.memory + w.activity + 4;
347
+ writeLine(` ${colors.purple}${box.topLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.topRight}${RESET}`);
348
+ 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}`);
349
+ writeLine(` ${colors.purple}${box.teeRight}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.teeLeft}${RESET}`);
350
+ for (const sq of activeSquads.slice(0, 8)) {
351
+ 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}`;
352
+ writeLine(row);
353
+ }
354
+ writeLine(` ${colors.purple}${box.bottomLeft}${colors.dim}${box.horizontal.repeat(tableWidth)}${colors.purple}${box.bottomRight}${RESET}`);
355
+ writeLine();
356
+ }
357
+ if (data.relevantMemory && data.relevantMemory.length > 0) {
358
+ writeLine(` ${bold}Relevant Memory${RESET} ${colors.dim}("${options.topic}")${RESET}`);
359
+ for (const mem of data.relevantMemory) {
360
+ writeLine(` ${colors.cyan}${mem.squad}/${mem.agent}${RESET}`);
361
+ writeLine(` ${colors.dim}${mem.snippet}${RESET}`);
362
+ }
363
+ writeLine();
364
+ }
365
+ writeLine(` ${colors.dim}$${RESET} squads feed ${colors.cyan}--topic "pricing"${RESET} ${colors.dim}Topic-focused${RESET}`);
366
+ writeLine(` ${colors.dim}$${RESET} squads feed ${colors.cyan}--squad website${RESET} ${colors.dim}Single squad${RESET}`);
367
+ writeLine(` ${colors.dim}$${RESET} squads feed ${colors.cyan}--agent${RESET} ${colors.dim}JSON for agents${RESET}`);
368
+ writeLine();
369
+ }
370
+ function renderAgentBriefing(data) {
371
+ console.log(JSON.stringify(data, null, 2));
372
+ }
373
+ async function contextFeedCommand(options = {}) {
374
+ const squadsDir = findSquadsDir();
375
+ if (!squadsDir) {
376
+ if (options.json || options.agent) {
377
+ console.log(JSON.stringify({ error: "No .agents/squads directory found" }));
378
+ } else {
379
+ writeLine(`${colors.red}No .agents/squads directory found${RESET}`);
380
+ writeLine(`${colors.dim}Run \`squads init\` to create one.${RESET}`);
381
+ }
382
+ process.exit(1);
383
+ }
384
+ const data = await collectBriefingData(options);
385
+ if (options.json || options.agent) {
386
+ renderAgentBriefing(data);
387
+ } else {
388
+ renderHumanBriefing(data, options);
389
+ }
390
+ }
391
+ export {
392
+ contextFeedCommand
393
+ };
394
+ //# sourceMappingURL=context-feed-AJGVAR6H.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 { getEnv } from '../lib/env-config.js';\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 = getEnv().bridge_url;\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;AA4FrB,IAAM,aAAa,OAAO,EAAE;AAE5B,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":[]}