@aexol/spectral 0.9.46 → 0.9.48

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 (35) hide show
  1. package/dist/agent/index.d.ts.map +1 -1
  2. package/dist/agent/index.js +15 -1
  3. package/dist/commands/serve.d.ts.map +1 -1
  4. package/dist/commands/serve.js +77 -4
  5. package/dist/extensions/browser/browser-service.d.ts.map +1 -1
  6. package/dist/extensions/browser/browser-service.js +13 -3
  7. package/dist/relay/auto-optimizer.d.ts +41 -0
  8. package/dist/relay/auto-optimizer.d.ts.map +1 -0
  9. package/dist/relay/auto-optimizer.js +488 -0
  10. package/dist/relay/client.d.ts.map +1 -1
  11. package/dist/relay/client.js +10 -0
  12. package/dist/relay/dispatcher.d.ts +20 -2
  13. package/dist/relay/dispatcher.d.ts.map +1 -1
  14. package/dist/relay/dispatcher.js +27 -0
  15. package/dist/sdk/coding-agent/core/agent-session.d.ts +6 -0
  16. package/dist/sdk/coding-agent/core/agent-session.d.ts.map +1 -1
  17. package/dist/sdk/coding-agent/core/agent-session.js +37 -0
  18. package/dist/sdk/coding-agent/core/settings-manager.d.ts +12 -0
  19. package/dist/sdk/coding-agent/core/settings-manager.d.ts.map +1 -1
  20. package/dist/sdk/coding-agent/core/settings-manager.js +33 -0
  21. package/dist/sdk/coding-agent/core/system-prompt-mutator.d.ts +17 -0
  22. package/dist/sdk/coding-agent/core/system-prompt-mutator.d.ts.map +1 -0
  23. package/dist/sdk/coding-agent/core/system-prompt-mutator.js +138 -0
  24. package/dist/server/agent-bridge.d.ts +1 -0
  25. package/dist/server/agent-bridge.d.ts.map +1 -1
  26. package/dist/server/agent-bridge.js +32 -10
  27. package/dist/server/handlers/prompt-mutation-settings.d.ts +34 -0
  28. package/dist/server/handlers/prompt-mutation-settings.d.ts.map +1 -0
  29. package/dist/server/handlers/prompt-mutation-settings.js +58 -0
  30. package/dist/server/shutdown.d.ts +2 -0
  31. package/dist/server/shutdown.d.ts.map +1 -1
  32. package/dist/server/shutdown.js +13 -0
  33. package/dist/server/wire.d.ts +41 -1
  34. package/dist/server/wire.d.ts.map +1 -1
  35. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAWH,OAAO,EACN,KAAK,YAAY,EAEjB,MAAM,8BAA8B,CAAC;AAuetC,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,CAAC,EAAE;IAAE,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CA+UvG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAWH,OAAO,EACN,KAAK,YAAY,EAEjB,MAAM,8BAA8B,CAAC;AAsftC,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,CAAC,EAAE;IAAE,cAAc,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CA+UvG"}
@@ -26,6 +26,7 @@
26
26
  */
27
27
  import { agentLoop } from "../sdk/agent-core/index.js";
28
28
  import { StringEnum } from "../sdk/ai/index.js";
29
+ import { mutateSystemPrompt } from "../sdk/coding-agent/core/system-prompt-mutator.js";
29
30
  import { Type } from "typebox";
30
31
  import { discoverAgents } from "./agents.js";
31
32
  import { loadAgentSettings } from "../server/handlers/agent-settings.js";
@@ -196,6 +197,19 @@ async function runSingleAgent(defaultCwd, agents, agentName, task, cwd, step, si
196
197
  const combinedPrompt = mainSystemPrompt
197
198
  ? `${mainSystemPrompt}\n\n---\n\nSubagent: ${agent.name}\n${agent.systemPrompt}`
198
199
  : agent.systemPrompt;
200
+ // Apply system prompt mutation if enabled in settings (opt-in)
201
+ let effectivePrompt = combinedPrompt;
202
+ if (ctx.settingsManager) {
203
+ const mutationResult = await mutateSystemPrompt({
204
+ systemPrompt: combinedPrompt,
205
+ modelRegistry: ctx.modelRegistry,
206
+ settingsManager: ctx.settingsManager,
207
+ cacheSuffix: `subagent:${agent.name}`,
208
+ });
209
+ if (mutationResult.mutated) {
210
+ effectivePrompt = mutationResult.prompt;
211
+ }
212
+ }
199
213
  // Resolve model — session model preferred, agent-configured as fallback
200
214
  const sessionModel = ctx.model && ctx.modelRegistry.hasConfiguredAuth(ctx.model) ? ctx.model : undefined;
201
215
  const model = sessionModel ?? resolveModelString(agent.model, ctx.modelRegistry);
@@ -262,7 +276,7 @@ async function runSingleAgent(defaultCwd, agents, agentName, task, cwd, step, si
262
276
  toolExecution: "parallel",
263
277
  };
264
278
  const stream = agentLoop([{ role: "user", content: [{ type: "text", text: task }], timestamp: Date.now() }], {
265
- systemPrompt: combinedPrompt,
279
+ systemPrompt: effectivePrompt,
266
280
  messages: [],
267
281
  tools,
268
282
  }, config, signal);
@@ -1 +1 @@
1
- {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAuBH,OAAO,EAAE,WAAW,EAAmB,MAAM,oBAAoB,CAAC;AASlE,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAGnE,OAAO,EAAmB,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAsBrE;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAazD;AAED,MAAM,WAAW,eAAe;IAC9B,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,cAAc,EAAE,OAAO,CAAC;CACzB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,eAAe,CA6B9D;AAED,MAAM,WAAW,eAAe;IAC9B,iEAAiE;IACjE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,uCAAuC;IACvC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,4CAA4C;IAC5C,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,+DAA+D;IAC/D,aAAa,CAAC,EAAE,qBAAqB,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;CAC/E;AAED,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,KAAK,EAAE,YAAY,CAAC;IACpB,wDAAwD;IACxD,OAAO,EAAE,oBAAoB,CAAC;IAC9B,4CAA4C;IAC5C,KAAK,EAAE,WAAW,CAAC;IACnB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,wBAAsB,QAAQ,CAAC,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,cAAc,CAAC,CA0YlF;AAwDD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAa5E"}
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAyBH,OAAO,EAAE,WAAW,EAAmB,MAAM,oBAAoB,CAAC;AAWlE,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAGnE,OAAO,EAAmB,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAsBrE;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAazD;AAED,MAAM,WAAW,eAAe;IAC9B,8CAA8C;IAC9C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,cAAc,EAAE,OAAO,CAAC;CACzB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,eAAe,CA6B9D;AAED,MAAM,WAAW,eAAe;IAC9B,iEAAiE;IACjE,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,uCAAuC;IACvC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,4CAA4C;IAC5C,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,+DAA+D;IAC/D,aAAa,CAAC,EAAE,qBAAqB,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;CAC/E;AAED,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,KAAK,EAAE,YAAY,CAAC;IACpB,wDAAwD;IACxD,OAAO,EAAE,oBAAoB,CAAC;IAC9B,4CAA4C;IAC5C,KAAK,EAAE,WAAW,CAAC;IACnB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,wBAAsB,QAAQ,CAAC,IAAI,GAAE,eAAoB,GAAG,OAAO,CAAC,cAAc,CAAC,CAqdlF;AAwDD;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAa5E"}
@@ -38,8 +38,9 @@ import { SettingsManager } from "../sdk/coding-agent/core/settings-manager.js";
38
38
  import { getAgentDir } from "../sdk/coding-agent/config.js";
39
39
  import { requireLogin } from "../preflight.js";
40
40
  import { RelayClient } from "../relay/client.js";
41
- import { detachAllSubscribers, handleAutoResearchFrame, handleCancelTurn, handleClientMessage, handleRestRequest, handleSubscribe, } from "../relay/dispatcher.js";
41
+ import { detachAllSubscribers, handleAutoOptimizeFrame, handleAutoResearchFrame, handleCancelTurn, handleClientMessage, handleRestRequest, handleSubscribe, } from "../relay/dispatcher.js";
42
42
  import { ensureMachineRegistered } from "../relay/registration.js";
43
+ import { saveMachine } from "../relay/machine-store.js";
43
44
  import { SessionStreamManager } from "../server/session-stream.js";
44
45
  import { gracefulShutdown } from "../server/shutdown.js";
45
46
  import { getLiveMcpState } from "../mcp/state-getter.js";
@@ -275,6 +276,16 @@ export async function runServe(opts = {}) {
275
276
  });
276
277
  return;
277
278
  }
279
+ if (frame.kind === "auto_optimize") {
280
+ handleAutoOptimizeFrame(frame, {
281
+ store,
282
+ manager,
283
+ relay: r,
284
+ subscribers,
285
+ cwd,
286
+ });
287
+ return;
288
+ }
278
289
  if (frame.kind === "config_patch") {
279
290
  handleConfigPatch(frame, {
280
291
  cwd,
@@ -284,6 +295,51 @@ export async function runServe(opts = {}) {
284
295
  });
285
296
  return;
286
297
  }
298
+ if (frame.kind === "machine_team_changed") {
299
+ const mtc = frame;
300
+ const existing = registration.record;
301
+ saveMachine({
302
+ machineId: existing.machineId,
303
+ machineName: existing.machineName,
304
+ machineJwt: mtc.machineJwt,
305
+ teamId: mtc.teamId,
306
+ ownerId: existing.ownerId,
307
+ visibility: existing.visibility,
308
+ registeredAt: Date.now(),
309
+ hostname: existing.hostname,
310
+ version: existing.version,
311
+ }).catch((err) => {
312
+ const msg = err instanceof Error ? err.message : String(err);
313
+ process.stderr.write(`[serve] Failed to save team change: ${msg}\n`);
314
+ });
315
+ // Update registration record so future re-registrations pick up the new team
316
+ registration = {
317
+ reused: false,
318
+ record: {
319
+ ...existing,
320
+ machineJwt: mtc.machineJwt,
321
+ teamId: mtc.teamId,
322
+ },
323
+ };
324
+ // Re-create relay with new JWT
325
+ r.dispose();
326
+ relay = new RelayClient({
327
+ relayUrl,
328
+ machineJwt: mtc.machineJwt,
329
+ backendUrl,
330
+ webSocketImpl: opts.webSocketImpl,
331
+ fetchImpl: opts.fetchImpl,
332
+ logger: silent
333
+ ? { log: () => { }, warn: () => { }, error: () => { } }
334
+ : console,
335
+ });
336
+ wireRelay(relay);
337
+ relay.connect();
338
+ if (!silent) {
339
+ process.stdout.write(`✓ Machine moved to team ${mtc.teamId}. Reconnecting with new credentials…\n`);
340
+ }
341
+ return;
342
+ }
287
343
  // Other frames (error, machine_disconnected addressed to us, etc.)
288
344
  // are ignored at this layer. Future batches may surface them in
289
345
  // structured logs.
@@ -303,6 +359,8 @@ export async function runServe(opts = {}) {
303
359
  });
304
360
  if (!silent) {
305
361
  r.on("close", ({ code, reason }) => {
362
+ if (reason === "team-changed")
363
+ return; // handled in frame handler
306
364
  process.stdout.write(`Relay closed (${code}${reason ? `: ${reason}` : ""}); will reconnect…\n`);
307
365
  });
308
366
  r.on("reconnect-scheduled", ({ delayMs, attempt }) => {
@@ -418,6 +476,15 @@ export async function runServe(opts = {}) {
418
476
  catch {
419
477
  // ignore — best-effort
420
478
  }
479
+ // Close browser instances (Playwright) so Chrome for Testing
480
+ // processes don't stay alive after the relay shuts down.
481
+ try {
482
+ const { BrowserService } = await import("../extensions/browser/browser-service.js");
483
+ await BrowserService.getInstance().close();
484
+ }
485
+ catch {
486
+ // browser extension may not be loaded or already closed
487
+ }
421
488
  if (!silent)
422
489
  process.stdout.write("Spectral relay stopped\n");
423
490
  };
@@ -459,9 +526,6 @@ export async function runServe(opts = {}) {
459
526
  void gracefulShutdown({
460
527
  inFlightCount: () => manager.activeTurnCount(),
461
528
  closeRelay: () => {
462
- // Mirror our own `close()`: dispose the relay (sends close 1000).
463
- // We don't await here because RelayClient.dispose is sync and
464
- // the shutdown helper expects a void|Promise return.
465
529
  relay.dispose();
466
530
  },
467
531
  disposeManager: () => {
@@ -470,6 +534,15 @@ export async function runServe(opts = {}) {
470
534
  closeStore: () => {
471
535
  store.close();
472
536
  },
537
+ closeBrowser: async () => {
538
+ try {
539
+ const { BrowserService } = await import("../extensions/browser/browser-service.js");
540
+ await BrowserService.getInstance().close();
541
+ }
542
+ catch {
543
+ // browser extension may not be loaded
544
+ }
545
+ },
473
546
  logger: silent
474
547
  ? { log: () => { }, warn: () => { }, error: () => { } }
475
548
  : console,
@@ -1 +1 @@
1
- {"version":3,"file":"browser-service.d.ts","sourceRoot":"","sources":["../../../src/extensions/browser/browser-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"browser-service.d.ts","sourceRoot":"","sources":["../../../src/extensions/browser/browser-service.ts"],"names":[],"mappings":"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"}
@@ -275,6 +275,7 @@ export class BrowserService {
275
275
  this.nextNetworkIndex = 0;
276
276
  }
277
277
  async close() {
278
+ // Close each page (ignore errors if already closed).
278
279
  for (const page of this.pages) {
279
280
  try {
280
281
  await page.close();
@@ -283,18 +284,27 @@ export class BrowserService {
283
284
  }
284
285
  this.pages = [];
285
286
  this.activePageIndex = 0;
287
+ // Close the browser context.
286
288
  if (this.context) {
287
289
  try {
288
- await this.context.close();
290
+ await Promise.race([
291
+ this.context.close(),
292
+ new Promise((_, reject) => setTimeout(() => reject(new Error("context.close timed out")), 5_000)),
293
+ ]);
289
294
  }
290
295
  catch { /* ignore */ }
291
296
  this.context = null;
292
297
  }
298
+ // Close the browser process (Playwright-managed Chromium).
299
+ // Use a timeout so a hung close doesn't block server shutdown.
293
300
  if (this.browser) {
294
301
  try {
295
- await this.browser.close();
302
+ await Promise.race([
303
+ this.browser.close(),
304
+ new Promise((_, reject) => setTimeout(() => reject(new Error("browser.close timed out")), 5_000)),
305
+ ]);
296
306
  }
297
- catch { /* ignore */ }
307
+ catch { /* ignore — process.exit will clean up orphans */ }
298
308
  this.browser = null;
299
309
  }
300
310
  this._recording = null;
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Auto-Optimizer (CLI side)
3
+ *
4
+ * Two-phase pipeline for project file optimization, modeled after auto-research.
5
+ *
6
+ * Phase 1 — Analyze (action: "analyze"):
7
+ * 1. Scan project filesystem for optimization candidates (size, duplication, complexity).
8
+ * 2. Build an analysis prompt for the agent.
9
+ * 3. Send prompt to the agent session via manager.prompt() with skipPersistence.
10
+ * 4. Parse the agent's response into structured AutoOptimizeRecommendation[].
11
+ * 5. Emit auto_optimize_analysis_complete via relay with recommendations.
12
+ *
13
+ * Phase 2 — Execute (action: "execute"):
14
+ * 1. Receive approvedItemIds from the frame.
15
+ * 2. Apply each approved recommendation via the agent session.
16
+ * 3. Run quality gates (type-check, lint, tests) on modified files.
17
+ * 4. Emit auto_optimize_execution_complete with per-item results and gate status.
18
+ *
19
+ * All errors are surfaced as auto_optimize_error events on the wire.
20
+ */
21
+ import type { SessionStore } from "../server/storage.js";
22
+ import type { SessionStreamManager, Subscriber } from "../server/session-stream.js";
23
+ import type { RelayClient } from "./client.js";
24
+ export interface AutoOptimizeInput {
25
+ projectId: string;
26
+ sessionId: string;
27
+ action: "analyze" | "execute";
28
+ approvedItemIds?: string[];
29
+ }
30
+ export interface AutoOptimizeDeps {
31
+ store: SessionStore;
32
+ manager: SessionStreamManager;
33
+ relay: Pick<RelayClient, "send">;
34
+ subscribers: Map<string, Subscriber>;
35
+ cwd: string;
36
+ logger?: {
37
+ error: (...args: unknown[]) => void;
38
+ };
39
+ }
40
+ export declare function handleAutoOptimize(input: AutoOptimizeInput, deps: AutoOptimizeDeps): void;
41
+ //# sourceMappingURL=auto-optimizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-optimizer.d.ts","sourceRoot":"","sources":["../../src/relay/auto-optimizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EACV,oBAAoB,EACpB,UAAU,EACX,MAAM,6BAA6B,CAAC;AAErC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,SAAS,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,oBAAoB,CAAC;IAC9B,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACjC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;KAAE,CAAC;CAClD;AA+UD,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,iBAAiB,EACxB,IAAI,EAAE,gBAAgB,GACrB,IAAI,CAoON"}