@cristiancorreau/forge 2.11.0 → 2.13.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.
@@ -0,0 +1,379 @@
1
+ import { join } from 'path';
2
+ import { spawnSync } from 'child_process';
3
+ import * as p from '@clack/prompts';
4
+ import { resolveForgeRoot } from '../lib/paths.js';
5
+ import { findProjectYaml } from '../lib/yaml.js';
6
+ import { runAudit } from './audit.js';
7
+ import { runDoctor } from './doctor.js';
8
+ import { searchSkills, listInstalledHooks, listTemplates, getConfigSummary, } from '../lib/panel-data.js';
9
+ import { searchCatalog, installItem, } from '../lib/catalog-install.js';
10
+ import { bold, dim, green, cyan, gray, yellow, red, icons } from '../ui/colors.js';
11
+ import { box } from '../ui/box.js';
12
+ const HELP = `Usage: forge panel
13
+
14
+ Open the interactive forge panel: a navigable view of the project's
15
+ configuration, monitoring (audit + doctor), skill search, a catalog
16
+ searcher+installer (skills/profiles/templates), hooks and templates.
17
+
18
+ Runs full-screen under Bun (OpenTUI). On plain Node it falls back to a menu
19
+ that prints each section. With no project.yaml it still works (showing the
20
+ catalog), but it is most useful inside a configured project.
21
+
22
+ Options:
23
+ -h, --help Show this help
24
+ `;
25
+ // OpenTUI panels require Bun runtime.
26
+ const isBun = typeof globalThis.Bun !== 'undefined';
27
+ /** Locate a usable `bun` binary: PATH first, then standard install locations. */
28
+ function findBun() {
29
+ const candidates = [
30
+ 'bun',
31
+ join(process.env.HOME ?? '', '.bun', 'bin', 'bun'),
32
+ '/opt/homebrew/bin/bun',
33
+ '/usr/local/bin/bun',
34
+ ];
35
+ for (const bin of candidates) {
36
+ try {
37
+ const r = spawnSync(bin, ['--version'], { encoding: 'utf8', timeout: 2000 });
38
+ if (r.status === 0)
39
+ return bin;
40
+ }
41
+ catch { /* try next */ }
42
+ }
43
+ return null;
44
+ }
45
+ /**
46
+ * If running under Node with a TTY, re-launch the CLI under Bun (if available)
47
+ * so the OpenTUI panel can render. Returns false if it couldn't re-launch (the
48
+ * caller then uses the @clack fallback); exits the process if it did.
49
+ */
50
+ function tryReLaunchWithBun() {
51
+ if (isBun)
52
+ return false;
53
+ if (process.env.FORGE_NO_BUN === '1')
54
+ return false;
55
+ if (process.env.FORGE_BUN_RELAUNCH === '1')
56
+ return false; // already relaunched
57
+ if (!process.stdin.isTTY || !process.stdout.isTTY)
58
+ return false;
59
+ const bun = findBun();
60
+ if (!bun)
61
+ return false;
62
+ const cliPath = new URL('../cli.js', import.meta.url).pathname;
63
+ const result = spawnSync(bun, [cliPath, 'panel'], {
64
+ stdio: 'inherit',
65
+ env: { ...process.env, FORGE_BUN_RELAUNCH: '1' },
66
+ });
67
+ process.exit(result.status ?? 0);
68
+ }
69
+ function forgeRootOrNull() {
70
+ try {
71
+ return resolveForgeRoot();
72
+ }
73
+ catch {
74
+ return null;
75
+ }
76
+ }
77
+ // ─── Node fallback (@clack/prompts) ───────────────────────────────────────────
78
+ function printConfigSection(root) {
79
+ const c = getConfigSummary(root);
80
+ if (!c.found) {
81
+ console.log(dim(' No se encontró project.yaml en este directorio.'));
82
+ console.log(dim(' Ejecutá ') + cyan('forge init') + dim(' para configurar el proyecto.'));
83
+ return;
84
+ }
85
+ const lines = [];
86
+ lines.push(`${bold('Proyecto')} ${c.name}`);
87
+ lines.push(`${bold('Mode')} ${c.mode} ${bold('Lenguaje')} ${c.language}`);
88
+ if (c.stack.length) {
89
+ lines.push('');
90
+ lines.push(bold('Stack'));
91
+ for (const { key, value } of c.stack)
92
+ lines.push(` ${gray(key.padEnd(16))} ${value}`);
93
+ }
94
+ lines.push('');
95
+ lines.push(bold('Agentes'));
96
+ lines.push(` ${gray('active'.padEnd(16))} ${c.agentsActive.join(', ') || dim('—')}`);
97
+ if (c.agentsSpecialized.length)
98
+ lines.push(` ${gray('specialized'.padEnd(16))} ${c.agentsSpecialized.join(', ')}`);
99
+ if (c.agentsCompliance.length)
100
+ lines.push(` ${gray('compliance'.padEnd(16))} ${c.agentsCompliance.join(', ')}`);
101
+ if (c.profiles.length)
102
+ lines.push(` ${gray('profiles'.padEnd(16))} ${c.profiles.join(', ')}`);
103
+ lines.push('');
104
+ lines.push(`${bold('Skills')} ${c.skills.join(', ') || dim('ninguna')}`);
105
+ lines.push(`${bold('Runtimes')} ${c.runtimes.join(', ') || dim('ninguno')}`);
106
+ if (c.compliance.length)
107
+ lines.push(`${bold('Compliance')} ${c.compliance.join(', ')}`);
108
+ if (c.deploy)
109
+ lines.push(`${bold('Deploy')} ${c.deploy.provider ?? '—'}${c.deploy.url ? ' ' + c.deploy.url : ''}`);
110
+ console.log(box('Configuración', lines));
111
+ console.log(dim(` Fuente: ${c.yamlPath}`));
112
+ }
113
+ function printMonitorSection(root) {
114
+ const a = runAudit(root);
115
+ const d = runDoctor(root);
116
+ const lines = [];
117
+ lines.push(`Audit: ${green(a.summary.ok + ' OK')} · ${cyan(a.summary.info + ' info')} · ` +
118
+ `${yellow(a.summary.warnings + ' warn')} · ${red(a.summary.errors + ' ✗')}`);
119
+ lines.push(`Hooks instalados: ${a.hooksInstalled}`);
120
+ lines.push(`Manifest: ${a.manifestStatus}`);
121
+ lines.push('');
122
+ lines.push(`Node ${d.nodeVersion} · forge root ${d.forgeRootOk ? green('ok') : red('no')} · assets ${d.assetsOk ? green('ok') : red('faltan')}`);
123
+ lines.push(`Runtimes detectados: ${d.runtimesDetected.join(', ') || dim('ninguno')}`);
124
+ lines.push('');
125
+ lines.push(bold('Runtimes'));
126
+ for (const rt of d.runtimes) {
127
+ const mark = rt.installed ? icons.ok : gray('○');
128
+ const tag = rt.active ? cyan(' ● active') : '';
129
+ const ver = rt.installed && rt.version ? dim(' ' + rt.version) : (rt.installed ? '' : dim(' — ausente'));
130
+ lines.push(` ${mark} ${rt.label.padEnd(14)}${ver}${tag}`);
131
+ }
132
+ console.log(box(d.ok && a.summary.errors === 0 ? 'Monitoreo — todo en orden' : 'Monitoreo', lines));
133
+ }
134
+ function printSkillRows(rows) {
135
+ if (rows.length === 0) {
136
+ console.log(dim(' Sin resultados.'));
137
+ return;
138
+ }
139
+ const width = Math.max(...rows.map(r => r.command.length));
140
+ for (const r of rows) {
141
+ const mark = r.active ? icons.ok : gray('·');
142
+ console.log(` ${mark} ${cyan(r.command.padEnd(width))} ${gray('[' + r.category + ']')} ${r.purpose}`);
143
+ console.log(` ${' '.repeat(width)} ${dim('trigger: ' + r.trigger)}`);
144
+ }
145
+ const active = rows.filter(r => r.active).length;
146
+ console.log('\n' + dim(` ${rows.length} skill(s) · ${active} activa(s) en project.yaml`));
147
+ }
148
+ async function skillsSearchSection(root) {
149
+ const q = await p.text({
150
+ message: 'Buscar skills (nombre, categoría, comando, trigger) — Enter para ver todas',
151
+ placeholder: 'wiki, deploy, security…',
152
+ });
153
+ if (p.isCancel(q))
154
+ return;
155
+ printSkillRows(searchSkills(String(q ?? ''), root));
156
+ }
157
+ const TYPE_TAG = {
158
+ skill: 'skill', profile: 'profile', template: 'template',
159
+ };
160
+ function printCatalogRows(items) {
161
+ if (items.length === 0) {
162
+ console.log(dim(' Sin resultados.'));
163
+ return;
164
+ }
165
+ const width = Math.max(...items.map(i => i.label.length));
166
+ for (const it of items) {
167
+ const mark = it.installed ? green('✓') : gray('·');
168
+ const tag = gray('[' + TYPE_TAG[it.type] + ']');
169
+ const state = it.installed ? dim(' (ya instalado)') : '';
170
+ console.log(` ${mark} ${cyan(it.label.padEnd(width))} ${tag} ${it.description}${state}`);
171
+ }
172
+ const installed = items.filter(i => i.installed).length;
173
+ console.log('\n' + dim(` ${items.length} ítem(s) · ${installed} ya instalado(s)`));
174
+ }
175
+ /**
176
+ * Interactive catalog search → select → install in the @clack fallback. Lets
177
+ * the user filter installable items (skills/profiles/templates), pick one and
178
+ * install it (with a confirm). Idempotent and YAML-safe via the data layer.
179
+ */
180
+ async function catalogSearchInstallSection(root) {
181
+ const q = await p.text({
182
+ message: 'Buscar en el catálogo (skills, profiles, templates) — Enter para ver todo',
183
+ placeholder: 'wiki, hono, spec…',
184
+ });
185
+ if (p.isCancel(q))
186
+ return;
187
+ const forgeRoot = forgeRootOrNull();
188
+ const items = searchCatalog(forgeRoot, root, String(q ?? ''));
189
+ printCatalogRows(items);
190
+ if (items.length === 0)
191
+ return;
192
+ const installable = items.filter(i => !i.installed);
193
+ if (installable.length === 0) {
194
+ console.log('\n' + dim(' Todos los resultados ya están instalados.'));
195
+ return;
196
+ }
197
+ const pick = await p.select({
198
+ message: '¿Qué querés instalar/activar?',
199
+ options: [
200
+ ...installable.map(i => ({
201
+ value: `${i.type}:${i.id}`,
202
+ label: `${i.label} ${gray('[' + TYPE_TAG[i.type] + ']')}`,
203
+ hint: i.description,
204
+ })),
205
+ { value: '__cancel__', label: 'Cancelar' },
206
+ ],
207
+ });
208
+ if (p.isCancel(pick) || pick === '__cancel__')
209
+ return;
210
+ const chosen = installable.find(i => `${i.type}:${i.id}` === pick);
211
+ if (!chosen)
212
+ return;
213
+ const confirm = await p.confirm({
214
+ message: `Instalar ${chosen.label} (${TYPE_TAG[chosen.type]})?`,
215
+ });
216
+ if (p.isCancel(confirm) || !confirm) {
217
+ console.log(dim(' Cancelado.'));
218
+ return;
219
+ }
220
+ const res = installItem(root, forgeRoot, { type: chosen.type, id: chosen.id });
221
+ if (res.ok) {
222
+ console.log(' ' + green(icons.ok) + ' ' + res.message);
223
+ for (const f of res.changed)
224
+ console.log(' ' + dim('→ ' + f));
225
+ }
226
+ else {
227
+ console.log(' ' + red('✗') + ' ' + res.message);
228
+ }
229
+ }
230
+ function printHooksSection(root) {
231
+ const hooks = listInstalledHooks(root, forgeRootOrNull());
232
+ if (hooks.length === 0) {
233
+ console.log(dim(' No hay hooks en el registry ni en .claude/hooks/.'));
234
+ return;
235
+ }
236
+ const truncate = (s, n = 90) => (s.length > n ? s.slice(0, n - 1) + '…' : s);
237
+ const lines = [];
238
+ for (const h of hooks) {
239
+ const mark = h.installed ? icons.ok : gray('○');
240
+ const matcher = h.matcher ? ` ${dim('matcher=' + h.matcher)}` : '';
241
+ lines.push(`${mark} ${bold(h.hook.padEnd(22))} ${cyan(h.event)}${matcher} ${gray('[' + h.mode + ']')}`);
242
+ if (h.description)
243
+ lines.push(` ${dim(truncate(h.description))}`);
244
+ }
245
+ console.log(box('Hooks', lines));
246
+ console.log(dim(' ✓ instalado en .claude/hooks/ ○ declarado en el registry pero no instalado'));
247
+ }
248
+ function printTemplatesSection() {
249
+ const templates = listTemplates(forgeRootOrNull());
250
+ if (templates.length === 0) {
251
+ console.log(dim(' No se encontraron templates (forge root ausente).'));
252
+ return;
253
+ }
254
+ const lines = [];
255
+ let lastCat = '';
256
+ for (const t of templates) {
257
+ if (t.category !== lastCat) {
258
+ lines.push(bold(t.category));
259
+ lastCat = t.category;
260
+ }
261
+ lines.push(` ${cyan(t.name.padEnd(26))} ${dim(t.description)}`);
262
+ }
263
+ console.log(box('Templates', lines));
264
+ }
265
+ /**
266
+ * Non-interactive snapshot: print every section once. Used when there is no TTY
267
+ * (piped/CI) so the panel never crashes and still surfaces useful information.
268
+ */
269
+ function printStaticSnapshot(root) {
270
+ console.log(cyan(bold('forge panel')) + dim(' — snapshot (sin TTY interactiva)') + '\n');
271
+ printConfigSection(root);
272
+ console.log('');
273
+ printMonitorSection(root);
274
+ console.log('');
275
+ printSkillRows(searchSkills('', root));
276
+ console.log('');
277
+ console.log(cyan(bold('Catálogo — buscar e instalar')) + dim(' (skills · profiles · templates)') + '\n');
278
+ printCatalogRows(searchCatalog(forgeRootOrNull(), root, ''));
279
+ console.log('');
280
+ printHooksSection(root);
281
+ console.log('');
282
+ printTemplatesSection();
283
+ return 0;
284
+ }
285
+ async function runClackFallback(root) {
286
+ // No interactive TTY → print a one-shot snapshot instead of prompting (which
287
+ // would throw ERR_TTY_INIT_FAILED on a /dev/null or piped stdin).
288
+ if (!process.stdin.isTTY || !process.stdout.isTTY) {
289
+ return printStaticSnapshot(root);
290
+ }
291
+ p.intro(' forge panel ');
292
+ if (!findProjectYaml(root)) {
293
+ p.note('No hay project.yaml en este directorio. El panel muestra el catálogo\nglobal; ejecutá `forge init` para configurar el proyecto.', 'Aviso');
294
+ }
295
+ // Loop until the user picks Salir.
296
+ for (;;) {
297
+ const choice = await p.select({
298
+ message: '¿Qué querés ver?',
299
+ options: [
300
+ { value: 'config', label: 'Configuración', hint: 'resumen de project.yaml' },
301
+ { value: 'monitor', label: 'Monitoreo', hint: 'audit + doctor' },
302
+ { value: 'skills', label: 'Skills', hint: 'buscar en el catálogo' },
303
+ { value: 'catalog', label: 'Catálogo — buscar e instalar', hint: 'skills · profiles · templates' },
304
+ { value: 'hooks', label: 'Hooks', hint: 'instalados + registry' },
305
+ { value: 'templates', label: 'Templates', hint: 'wiki / spec / modes' },
306
+ { value: 'editor', label: 'Abrir project.yaml en $EDITOR' },
307
+ { value: 'exit', label: 'Salir' },
308
+ ],
309
+ });
310
+ if (p.isCancel(choice) || choice === 'exit')
311
+ break;
312
+ console.log('');
313
+ switch (choice) {
314
+ case 'config':
315
+ printConfigSection(root);
316
+ break;
317
+ case 'monitor':
318
+ printMonitorSection(root);
319
+ break;
320
+ case 'skills':
321
+ await skillsSearchSection(root);
322
+ break;
323
+ case 'catalog':
324
+ await catalogSearchInstallSection(root);
325
+ break;
326
+ case 'hooks':
327
+ printHooksSection(root);
328
+ break;
329
+ case 'templates':
330
+ printTemplatesSection();
331
+ break;
332
+ case 'editor':
333
+ openEditor(root);
334
+ break;
335
+ }
336
+ console.log('');
337
+ }
338
+ p.outro('Listo.');
339
+ return 0;
340
+ }
341
+ function openEditor(root) {
342
+ const yamlPath = findProjectYaml(root);
343
+ if (!yamlPath) {
344
+ console.log(dim(' No hay project.yaml para abrir.'));
345
+ return;
346
+ }
347
+ const editor = process.env.EDITOR || process.env.VISUAL;
348
+ if (!editor) {
349
+ console.log(dim(' $EDITOR no definido. Ruta: ') + yamlPath);
350
+ return;
351
+ }
352
+ spawnSync(editor, [yamlPath], { stdio: 'inherit' });
353
+ }
354
+ // ─── Entry point ──────────────────────────────────────────────────────────────
355
+ export async function panel(args) {
356
+ if (args.includes('-h') || args.includes('--help')) {
357
+ process.stdout.write(HELP);
358
+ return 0;
359
+ }
360
+ const root = process.cwd();
361
+ // Full-screen OpenTUI under Bun.
362
+ if (isBun && process.stdout.isTTY) {
363
+ try {
364
+ const { runPanel } = await import('../tui/panel.js');
365
+ await runPanel(root);
366
+ return 0;
367
+ }
368
+ catch {
369
+ // fall through to the clack fallback
370
+ }
371
+ }
372
+ // On Node with Bun installed + a TTY, re-launch under Bun for OpenTUI.
373
+ if (!isBun && process.stdout.isTTY) {
374
+ tryReLaunchWithBun(); // exits the process on success
375
+ }
376
+ // Node fallback (no Bun, or not a TTY): @clack menu.
377
+ return runClackFallback(root);
378
+ }
379
+ //# sourceMappingURL=panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel.js","sourceRoot":"","sources":["../../src/commands/panel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import { type TemplateEntry } from './panel-data.js';
2
+ export type CatalogItemType = 'skill' | 'profile' | 'template';
3
+ export interface CatalogItem {
4
+ type: CatalogItemType;
5
+ /** Stable id used by the installers (skill id, profile name, template id). */
6
+ id: string;
7
+ /** Short human label for the UI. */
8
+ label: string;
9
+ /** One-line description. */
10
+ description: string;
11
+ /** True when it is already in project.yaml or already scaffolded on disk. */
12
+ installed: boolean;
13
+ }
14
+ export interface InstallResult {
15
+ ok: boolean;
16
+ /** True when nothing changed because it was already installed. */
17
+ alreadyInstalled: boolean;
18
+ /** Human message (Spanish) describing the outcome. */
19
+ message: string;
20
+ /** Files created/touched (relative to projectRoot). */
21
+ changed: string[];
22
+ }
23
+ /** Profile names available in the forge assets tree (profiles/<name>/). */
24
+ export declare function listAvailableProfiles(forgeRoot: string | null): string[];
25
+ /**
26
+ * Stable id for a template entry, used by installTemplate. Wiki templates all
27
+ * collapse to the single `wiki` install target; spec/mode/claude-md keep their
28
+ * file name (without extension) so each is addressable.
29
+ */
30
+ export declare function templateInstallId(t: TemplateEntry): string;
31
+ /**
32
+ * Unified, case-insensitive substring search across installable items: skills,
33
+ * profiles and templates. An empty query returns the whole catalog. Each item
34
+ * is marked `installed` against project.yaml and/or the scaffolded state on
35
+ * disk. Profiles and templates require a `forgeRoot`; with `forgeRoot === null`
36
+ * only skills are returned.
37
+ */
38
+ export declare function searchCatalog(forgeRoot: string | null, projectRoot: string, query: string): CatalogItem[];
39
+ /**
40
+ * Activate a skill: add its id to project.yaml `skills` (dedupe, surgical edit)
41
+ * and copy its slash command into `.claude/commands/` when one is bundled
42
+ * (`adapters/claude-code/commands/<id>.md`). Idempotent.
43
+ */
44
+ export declare function installSkill(projectRoot: string, forgeRoot: string | null, id: string): InstallResult;
45
+ /**
46
+ * Activate a profile: add its name to project.yaml `agents.profiles` (dedupe,
47
+ * surgical edit) and install the profile's agents into `.claude/agents/`.
48
+ * Idempotent.
49
+ */
50
+ export declare function installProfile(projectRoot: string, forgeRoot: string | null, name: string): InstallResult;
51
+ /**
52
+ * Scaffold a template into the project (idempotent):
53
+ * - `wiki` → full templated wiki structure
54
+ * - `spec:spec-template.md` → docs/specs/_template.md from the bundled spec template
55
+ * - `claude-md:project.md` → CLAUDE.md if missing
56
+ * - `claude-md:architecture.rules` → .claude/architecture.rules if missing
57
+ * - `mode:*` → project.yaml mode template into docs/ (reference copy)
58
+ */
59
+ export declare function installTemplate(projectRoot: string, forgeRoot: string | null, id: string): InstallResult;
60
+ /** Install any catalog item by type. Convenience wrapper for the UI layers. */
61
+ export declare function installItem(projectRoot: string, forgeRoot: string | null, item: Pick<CatalogItem, 'type' | 'id'>): InstallResult;
62
+ //# sourceMappingURL=catalog-install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog-install.d.ts","sourceRoot":"","sources":["../../src/lib/catalog-install.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIpE,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,CAAC;AAE/D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,eAAe,CAAC;IACtB,8EAA8E;IAC9E,EAAE,EAAE,MAAM,CAAC;IACX,oCAAoC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,4BAA4B;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,6EAA6E;IAC7E,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,kEAAkE;IAClE,gBAAgB,EAAE,OAAO,CAAC;IAC1B,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AA8BD,2EAA2E;AAC3E,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,EAAE,CAQxE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAG1D;AAuBD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,GACZ,WAAW,EAAE,CAgDf;AA2MD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,aAAa,CA8CrG;AAID;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,CA6CzG;AAID;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,aAAa,CA8ExG;AAsCD,+EAA+E;AAC/E,wBAAgB,WAAW,CACzB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC,GACrC,aAAa,CAOf"}