zelari-code 0.7.9 → 0.7.11

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 (108) hide show
  1. package/LICENSE +37 -37
  2. package/README.md +320 -295
  3. package/bin/zelari-code.js +62 -62
  4. package/dist/cli/app.js +33 -3
  5. package/dist/cli/app.js.map +1 -1
  6. package/dist/cli/components/LiveRegion.js +7 -3
  7. package/dist/cli/components/LiveRegion.js.map +1 -1
  8. package/dist/cli/components/SelectList.js +67 -0
  9. package/dist/cli/components/SelectList.js.map +1 -0
  10. package/dist/cli/components/Spinner.js +51 -0
  11. package/dist/cli/components/Spinner.js.map +1 -0
  12. package/dist/cli/components/SplashScreen.js +85 -85
  13. package/dist/cli/components/StatusBar.js +42 -34
  14. package/dist/cli/components/StatusBar.js.map +1 -1
  15. package/dist/cli/headless.js +10 -10
  16. package/dist/cli/hooks/useSlashDispatch.js +11 -1
  17. package/dist/cli/hooks/useSlashDispatch.js.map +1 -1
  18. package/dist/cli/keyStore.js +2 -2
  19. package/dist/cli/keyStore.js.map +1 -1
  20. package/dist/cli/main.bundled.js +15146 -14919
  21. package/dist/cli/main.bundled.js.map +4 -4
  22. package/dist/cli/main.js +1 -1
  23. package/dist/cli/main.js.map +1 -1
  24. package/dist/cli/modelDiscovery.js +42 -5
  25. package/dist/cli/modelDiscovery.js.map +1 -1
  26. package/dist/cli/provider/openai-compatible.js +4 -2
  27. package/dist/cli/provider/openai-compatible.js.map +1 -1
  28. package/dist/cli/slashCommands.js +22 -5
  29. package/dist/cli/slashCommands.js.map +1 -1
  30. package/dist/cli/slashHandlers/provider.js +102 -5
  31. package/dist/cli/slashHandlers/provider.js.map +1 -1
  32. package/package.json +2 -2
  33. package/dist/agents/advancedTools.js +0 -115
  34. package/dist/agents/advancedTools.js.map +0 -1
  35. package/dist/agents/councilApi.js +0 -375
  36. package/dist/agents/councilApi.js.map +0 -1
  37. package/dist/agents/councilDirectives.js +0 -100
  38. package/dist/agents/councilDirectives.js.map +0 -1
  39. package/dist/agents/promoteMember.js +0 -210
  40. package/dist/agents/promoteMember.js.map +0 -1
  41. package/dist/agents/promptModules.js +0 -139
  42. package/dist/agents/promptModules.js.map +0 -1
  43. package/dist/agents/roles.js +0 -299
  44. package/dist/agents/roles.js.map +0 -1
  45. package/dist/agents/skills/builtin/debugging.js +0 -248
  46. package/dist/agents/skills/builtin/debugging.js.map +0 -1
  47. package/dist/agents/skills/builtin/docs.js +0 -301
  48. package/dist/agents/skills/builtin/docs.js.map +0 -1
  49. package/dist/agents/skills/builtin/git-ops.js +0 -301
  50. package/dist/agents/skills/builtin/git-ops.js.map +0 -1
  51. package/dist/agents/skills/builtin/planning.js +0 -335
  52. package/dist/agents/skills/builtin/planning.js.map +0 -1
  53. package/dist/agents/skills/builtin/refactoring.js +0 -261
  54. package/dist/agents/skills/builtin/refactoring.js.map +0 -1
  55. package/dist/agents/skills/builtin/review.js +0 -302
  56. package/dist/agents/skills/builtin/review.js.map +0 -1
  57. package/dist/agents/skills/builtin/testing.js +0 -245
  58. package/dist/agents/skills/builtin/testing.js.map +0 -1
  59. package/dist/agents/skills.js +0 -272
  60. package/dist/agents/skills.js.map +0 -1
  61. package/dist/agents/systemPromptBuilder.js +0 -151
  62. package/dist/agents/systemPromptBuilder.js.map +0 -1
  63. package/dist/agents/toolSchemas.js +0 -249
  64. package/dist/agents/toolSchemas.js.map +0 -1
  65. package/dist/agents/tools.js +0 -196
  66. package/dist/agents/tools.js.map +0 -1
  67. package/dist/agents/vaultTools.js +0 -134
  68. package/dist/agents/vaultTools.js.map +0 -1
  69. package/dist/cli/components/CollapsibleToolOutput.js +0 -43
  70. package/dist/cli/components/CollapsibleToolOutput.js.map +0 -1
  71. package/dist/cli/components/Header.js +0 -38
  72. package/dist/cli/components/Header.js.map +0 -1
  73. package/dist/main/core/AgentHarness.js +0 -467
  74. package/dist/main/core/AgentHarness.js.map +0 -1
  75. package/dist/main/core/providerStream.js +0 -99
  76. package/dist/main/core/providerStream.js.map +0 -1
  77. package/dist/main/core/sessionJsonl.js +0 -99
  78. package/dist/main/core/sessionJsonl.js.map +0 -1
  79. package/dist/main/core/tools/auditLog.js +0 -26
  80. package/dist/main/core/tools/auditLog.js.map +0 -1
  81. package/dist/main/core/tools/builtin/filesystem.js +0 -110
  82. package/dist/main/core/tools/builtin/filesystem.js.map +0 -1
  83. package/dist/main/core/tools/builtin/listFiles.js +0 -86
  84. package/dist/main/core/tools/builtin/listFiles.js.map +0 -1
  85. package/dist/main/core/tools/builtin/search.js +0 -56
  86. package/dist/main/core/tools/builtin/search.js.map +0 -1
  87. package/dist/main/core/tools/builtin/shell.js +0 -51
  88. package/dist/main/core/tools/builtin/shell.js.map +0 -1
  89. package/dist/main/core/tools/registry.js +0 -71
  90. package/dist/main/core/tools/registry.js.map +0 -1
  91. package/dist/main/core/tools/toolTypes.js +0 -8
  92. package/dist/main/core/tools/toolTypes.js.map +0 -1
  93. package/dist/main/core/tools/zodBridge.js +0 -56
  94. package/dist/main/core/tools/zodBridge.js.map +0 -1
  95. package/dist/shared/eventBus.js +0 -104
  96. package/dist/shared/eventBus.js.map +0 -1
  97. package/dist/shared/events.js +0 -73
  98. package/dist/shared/events.js.map +0 -1
  99. package/dist/shared/index.js +0 -8
  100. package/dist/shared/index.js.map +0 -1
  101. package/dist/types/context.js +0 -3
  102. package/dist/types/context.js.map +0 -1
  103. package/dist/types/index.js +0 -2
  104. package/dist/types/index.js.map +0 -1
  105. package/dist/types/knowledge.js +0 -2
  106. package/dist/types/knowledge.js.map +0 -1
  107. package/dist/types/systemTypes.js +0 -10
  108. package/dist/types/systemTypes.js.map +0 -1
@@ -1,104 +0,0 @@
1
- /**
2
- * EventBus — typed, in-memory pub/sub over the {@link BrainEvent} union.
3
- *
4
- * This is the transport-agnostic core for fanning agent events out to any
5
- * frontend (Electron renderer today, Ink CLI tomorrow). It deals only in
6
- * provider-neutral {@link BrainEvent}s and pulls in no Node- or Electron-
7
- * specific APIs, so it is safe to import from the renderer/browser too.
8
- *
9
- * Dispatch rules:
10
- * - Typed subscribers (registered via {@link EventBus.subscribe}) fire first.
11
- * - Wildcard subscribers (registered via {@link EventBus.subscribeAll}) fire
12
- * afterwards, so type-specific handlers always see an event before the
13
- * catch-all observers do.
14
- * - A subscriber that throws — or returns a rejected Promise — is logged and
15
- * isolated; it never blocks the remaining subscribers.
16
- * - Async subscribers are fire-and-forget: the bus invokes the handler
17
- * synchronously and does NOT await its returned Promise.
18
- *
19
- * @see docs/plans/2026-06-28-zelari-code.md (Task 11.2)
20
- */
21
- export class EventBus {
22
- /** Per-type subscriber registry. */
23
- subscribers;
24
- /** Wildcard subscribers (receive every event). */
25
- wildcardSubscribers;
26
- constructor() {
27
- this.subscribers = new Map();
28
- this.wildcardSubscribers = new Set();
29
- }
30
- /** Subscribe to a specific event type. Returns an unsubscribe function. */
31
- subscribe(type, handler) {
32
- let set = this.subscribers.get(type);
33
- if (!set) {
34
- set = new Set();
35
- this.subscribers.set(type, set);
36
- }
37
- // The handler is narrowed to a single variant; emit() only ever dispatches
38
- // matching events to it, so widening the stored type is sound here.
39
- const stored = handler;
40
- set.add(stored);
41
- return () => {
42
- const current = this.subscribers.get(type);
43
- if (!current)
44
- return;
45
- current.delete(stored);
46
- if (current.size === 0)
47
- this.subscribers.delete(type);
48
- };
49
- }
50
- /** Subscribe to all events. Returns an unsubscribe function. */
51
- subscribeAll(handler) {
52
- this.wildcardSubscribers.add(handler);
53
- return () => {
54
- this.wildcardSubscribers.delete(handler);
55
- };
56
- }
57
- /**
58
- * Emit an event to all matching subscribers (typed first, then wildcard).
59
- * Errors in individual subscribers are logged but do not prevent other
60
- * subscribers from receiving the event.
61
- */
62
- emit(event) {
63
- const set = this.subscribers.get(event.type);
64
- if (set) {
65
- for (const handler of set)
66
- this.dispatch(handler, event);
67
- }
68
- for (const handler of this.wildcardSubscribers)
69
- this.dispatch(handler, event);
70
- }
71
- /** Remove all subscribers (typed + wildcard). */
72
- clear() {
73
- this.subscribers.clear();
74
- this.wildcardSubscribers.clear();
75
- }
76
- /**
77
- * Number of subscribers. With a `type`, returns typed subscribers for that
78
- * type; without, returns the total across all types plus wildcard handlers.
79
- */
80
- listenerCount(type) {
81
- if (type !== undefined) {
82
- return this.subscribers.get(type)?.size ?? 0;
83
- }
84
- let total = this.wildcardSubscribers.size;
85
- for (const set of this.subscribers.values())
86
- total += set.size;
87
- return total;
88
- }
89
- /** Invoke a single subscriber, isolating sync throws and async rejections. */
90
- dispatch(handler, event) {
91
- try {
92
- const result = handler(event);
93
- if (result instanceof Promise) {
94
- result.catch((err) => {
95
- console.error('[eventBus] subscriber error:', err);
96
- });
97
- }
98
- }
99
- catch (err) {
100
- console.error('[eventBus] subscriber error:', err);
101
- }
102
- }
103
- }
104
- //# sourceMappingURL=eventBus.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"eventBus.js","sourceRoot":"","sources":["../../src/shared/eventBus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAeH,MAAM,OAAO,QAAQ;IACnB,oCAAoC;IAC5B,WAAW,CAAuC;IAC1D,kDAAkD;IAC1C,mBAAmB,CAA2B;IAEtD;QACE,IAAI,CAAC,WAAW,GAAG,IAAI,GAAG,EAAE,CAAC;QAC7B,IAAI,CAAC,mBAAmB,GAAG,IAAI,GAAG,EAAE,CAAC;IACvC,CAAC;IAED,2EAA2E;IAC3E,SAAS,CACP,IAAO,EACP,OAAqD;QAErD,IAAI,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAClC,CAAC;QACD,2EAA2E;QAC3E,oEAAoE;QACpE,MAAM,MAAM,GAAG,OAAqB,CAAC;QACrC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAChB,OAAO,GAAG,EAAE;YACV,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3C,IAAI,CAAC,OAAO;gBAAE,OAAO;YACrB,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACvB,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC;gBAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxD,CAAC,CAAC;IACJ,CAAC;IAED,gEAAgE;IAChE,YAAY,CAAC,OAA4B;QACvC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACtC,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC3C,CAAC,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,IAAI,CAAC,KAAiB;QACpB,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,GAAG,EAAE,CAAC;YACR,KAAK,MAAM,OAAO,IAAI,GAAG;gBAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC3D,CAAC;QACD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,mBAAmB;YAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAChF,CAAC;IAED,iDAAiD;IACjD,KAAK;QACH,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;IACnC,CAAC;IAED;;;OAGG;IACH,aAAa,CAAC,IAAqB;QACjC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC;QAC1C,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;YAAE,KAAK,IAAI,GAAG,CAAC,IAAI,CAAC;QAC/D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,8EAA8E;IACtE,QAAQ,CAAC,OAAmB,EAAE,KAAiB;QACrD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9B,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;gBAC9B,MAAM,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;oBAC5B,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;gBACrD,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;CACF"}
@@ -1,73 +0,0 @@
1
- /**
2
- * BrainEvent — provider-neutral event contract for AnathemaBrain's agent system.
3
- *
4
- * These types are the ONLY contract between the agent loop (main process) and any
5
- * frontend (Electron renderer today, Ink CLI tomorrow). They are intentionally
6
- * standalone: no Electron imports, no project imports. Every payload is plain,
7
- * JSON-serializable data so events can cross the IPC boundary or a socket
8
- * untouched.
9
- *
10
- * @see docs/plans/2026-06-28-zelari-code.md (Task 11.1)
11
- */
12
- // --- Type guards ------------------------------------------------------------
13
- export function isBrainAgentStartEvent(e) {
14
- return e.type === 'agent_start';
15
- }
16
- export function isBrainAgentEndEvent(e) {
17
- return e.type === 'agent_end';
18
- }
19
- export function isBrainMessageStartEvent(e) {
20
- return e.type === 'message_start';
21
- }
22
- export function isBrainMessageDeltaEvent(e) {
23
- return e.type === 'message_delta';
24
- }
25
- export function isBrainMessageEndEvent(e) {
26
- return e.type === 'message_end';
27
- }
28
- export function isBrainThinkingDeltaEvent(e) {
29
- return e.type === 'thinking_delta';
30
- }
31
- export function isBrainToolExecutionStartEvent(e) {
32
- return e.type === 'tool_execution_start';
33
- }
34
- export function isBrainToolExecutionUpdateEvent(e) {
35
- return e.type === 'tool_execution_update';
36
- }
37
- export function isBrainToolExecutionEndEvent(e) {
38
- return e.type === 'tool_execution_end';
39
- }
40
- export function isBrainQueueUpdateEvent(e) {
41
- return e.type === 'queue_update';
42
- }
43
- export function isBrainSessionCompactedEvent(e) {
44
- return e.type === 'session_compacted';
45
- }
46
- export function isBrainErrorEvent(e) {
47
- return e.type === 'error';
48
- }
49
- export function isBrainMemberCostEvent(e) {
50
- return e.type === 'member_cost';
51
- }
52
- // --- Constructor ------------------------------------------------------------
53
- /**
54
- * Build a fully-formed {@link BrainEvent}, stamping the common `id` (UUID v4)
55
- * and `ts` (epoch ms) fields automatically. The caller supplies only the
56
- * variant-specific payload.
57
- *
58
- * Uses the global `crypto.randomUUID()` (Web Crypto), available in both Node 20+
59
- * and the browser/renderer — keeping this module free of Node-only imports.
60
- *
61
- * @example
62
- * const ev = createBrainEvent('message_delta', sessionId, { messageId, delta });
63
- */
64
- export function createBrainEvent(type, sessionId, data) {
65
- return {
66
- type,
67
- id: crypto.randomUUID(),
68
- ts: Date.now(),
69
- sessionId,
70
- ...data,
71
- };
72
- }
73
- //# sourceMappingURL=events.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/shared/events.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA+MH,+EAA+E;AAE/E,MAAM,UAAU,sBAAsB,CAAC,CAAa;IAClD,OAAO,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,CAAa;IAChD,OAAO,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,CAAa;IACpD,OAAO,CAAC,CAAC,IAAI,KAAK,eAAe,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,CAAa;IACpD,OAAO,CAAC,CAAC,IAAI,KAAK,eAAe,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,CAAa;IAClD,OAAO,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,CAAa;IACrD,OAAO,CAAC,CAAC,IAAI,KAAK,gBAAgB,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,CAAa;IAC1D,OAAO,CAAC,CAAC,IAAI,KAAK,sBAAsB,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,CAAa;IAC3D,OAAO,CAAC,CAAC,IAAI,KAAK,uBAAuB,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,CAAa;IACxD,OAAO,CAAC,CAAC,IAAI,KAAK,oBAAoB,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,CAAa;IACnD,OAAO,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,CAAa;IACxD,OAAO,CAAC,CAAC,IAAI,KAAK,mBAAmB,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,CAAa;IAC7C,OAAO,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,CAAa;IAClD,OAAO,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC;AAClC,CAAC;AAED,+EAA+E;AAE/E;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAO,EACP,SAAiB,EACjB,IAA+D;IAE/D,OAAO;QACL,IAAI;QACJ,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE;QACvB,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;QACd,SAAS;QACT,GAAG,IAAI;KACW,CAAC;AACvB,CAAC"}
@@ -1,8 +0,0 @@
1
- /**
2
- * Barrel for the provider-neutral `electron/shared` contract.
3
- *
4
- * Importable from both the Electron main process and the renderer — keep this
5
- * module free of any Electron or project-local dependency.
6
- */
7
- export * from './events.js';
8
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/shared/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,cAAc,aAAa,CAAC"}
@@ -1,3 +0,0 @@
1
- // Shared context types for workspace and RAG functionality
2
- export {};
3
- //# sourceMappingURL=context.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/types/context.ts"],"names":[],"mappings":"AAAA,2DAA2D"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=knowledge.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"knowledge.js","sourceRoot":"","sources":["../../src/types/knowledge.ts"],"names":[],"mappings":""}
@@ -1,10 +0,0 @@
1
- /** Default empty AI configuration. */
2
- export function createDefaultSystemPromptConfig() {
3
- return {
4
- enabledSkills: [],
5
- enabledTools: [],
6
- customPromptModules: [],
7
- agentSkillConfigs: [],
8
- };
9
- }
10
- //# sourceMappingURL=systemTypes.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"systemTypes.js","sourceRoot":"","sources":["../../src/types/systemTypes.ts"],"names":[],"mappings":"AAoIA,sCAAsC;AACtC,MAAM,UAAU,+BAA+B;IAC7C,OAAO;QACL,aAAa,EAAE,EAAE;QACjB,YAAY,EAAE,EAAE;QAChB,mBAAmB,EAAE,EAAE;QACvB,iBAAiB,EAAE,EAAE;KACtB,CAAC;AACJ,CAAC"}