zelari-code 0.2.1 → 0.4.3

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 (105) hide show
  1. package/README.md +55 -2
  2. package/dist/agents/councilApi.js +7 -7
  3. package/dist/agents/councilApi.js.map +1 -1
  4. package/dist/agents/councilDirectives.js +3 -3
  5. package/dist/agents/promoteMember.js +2 -2
  6. package/dist/agents/roles.js +32 -32
  7. package/dist/agents/roles.js.map +1 -1
  8. package/dist/agents/skills/builtin/debugging.js +4 -4
  9. package/dist/agents/skills/builtin/debugging.js.map +1 -1
  10. package/dist/agents/skills/builtin/docs.js +13 -23
  11. package/dist/agents/skills/builtin/docs.js.map +1 -1
  12. package/dist/agents/skills/builtin/git-ops.js +3 -3
  13. package/dist/agents/skills/builtin/git-ops.js.map +1 -1
  14. package/dist/agents/skills/builtin/planning.js +4 -4
  15. package/dist/agents/skills/builtin/planning.js.map +1 -1
  16. package/dist/agents/skills/builtin/refactoring.js +3 -3
  17. package/dist/agents/skills/builtin/refactoring.js.map +1 -1
  18. package/dist/agents/skills/builtin/review.js +9 -9
  19. package/dist/agents/skills/builtin/review.js.map +1 -1
  20. package/dist/agents/skills/builtin/testing.js +3 -3
  21. package/dist/agents/skills/builtin/testing.js.map +1 -1
  22. package/dist/agents/tools.js +9 -2
  23. package/dist/agents/tools.js.map +1 -1
  24. package/dist/cli/app.js +80 -1832
  25. package/dist/cli/app.js.map +1 -1
  26. package/dist/cli/components/ChatStream.js +71 -2
  27. package/dist/cli/components/ChatStream.js.map +1 -1
  28. package/dist/cli/components/CollapsibleToolOutput.js +21 -3
  29. package/dist/cli/components/CollapsibleToolOutput.js.map +1 -1
  30. package/dist/cli/components/Header.js +20 -1
  31. package/dist/cli/components/Header.js.map +1 -1
  32. package/dist/cli/components/InputBar.js +34 -2
  33. package/dist/cli/components/InputBar.js.map +1 -1
  34. package/dist/cli/components/Sidebar.js +30 -3
  35. package/dist/cli/components/Sidebar.js.map +1 -1
  36. package/dist/cli/councilDispatcher.js +9 -1
  37. package/dist/cli/councilDispatcher.js.map +1 -1
  38. package/dist/cli/hooks/chatStats.js +28 -0
  39. package/dist/cli/hooks/chatStats.js.map +1 -0
  40. package/dist/cli/hooks/eventsToMessages.js +80 -0
  41. package/dist/cli/hooks/eventsToMessages.js.map +1 -0
  42. package/dist/cli/hooks/messageHelpers.js +75 -0
  43. package/dist/cli/hooks/messageHelpers.js.map +1 -0
  44. package/dist/cli/hooks/skillCompare.js +69 -0
  45. package/dist/cli/hooks/skillCompare.js.map +1 -0
  46. package/dist/cli/hooks/steer.js +28 -0
  47. package/dist/cli/hooks/steer.js.map +1 -0
  48. package/dist/cli/hooks/useChatTurn.js +307 -0
  49. package/dist/cli/hooks/useChatTurn.js.map +1 -0
  50. package/dist/cli/hooks/useSession.js +107 -0
  51. package/dist/cli/hooks/useSession.js.map +1 -0
  52. package/dist/cli/hooks/useSlashDispatch.js +300 -0
  53. package/dist/cli/hooks/useSlashDispatch.js.map +1 -0
  54. package/dist/cli/hooks/useTerminalSize.js +60 -0
  55. package/dist/cli/hooks/useTerminalSize.js.map +1 -0
  56. package/dist/cli/main.bundled.js +24193 -21635
  57. package/dist/cli/main.bundled.js.map +4 -4
  58. package/dist/cli/main.js +1 -1
  59. package/dist/cli/sessionManager.js +46 -0
  60. package/dist/cli/sessionManager.js.map +1 -1
  61. package/dist/cli/slashCommands.js +72 -3
  62. package/dist/cli/slashCommands.js.map +1 -1
  63. package/dist/cli/slashHandlers/branch.js +48 -0
  64. package/dist/cli/slashHandlers/branch.js.map +1 -0
  65. package/dist/cli/slashHandlers/git.js +115 -0
  66. package/dist/cli/slashHandlers/git.js.map +1 -0
  67. package/dist/cli/slashHandlers/provider.js +199 -0
  68. package/dist/cli/slashHandlers/provider.js.map +1 -0
  69. package/dist/cli/slashHandlers/skills.js +82 -0
  70. package/dist/cli/slashHandlers/skills.js.map +1 -0
  71. package/dist/cli/slashHandlers/workspace.js +118 -0
  72. package/dist/cli/slashHandlers/workspace.js.map +1 -0
  73. package/dist/cli/toolRegistry.js +12 -3
  74. package/dist/cli/toolRegistry.js.map +1 -1
  75. package/dist/cli/utils/duration.js +34 -0
  76. package/dist/cli/utils/duration.js.map +1 -0
  77. package/dist/cli/workspace/agentsMd.js +314 -0
  78. package/dist/cli/workspace/agentsMd.js.map +1 -0
  79. package/dist/cli/workspace/index.js +24 -0
  80. package/dist/cli/workspace/index.js.map +1 -0
  81. package/dist/cli/workspace/paths.js +88 -0
  82. package/dist/cli/workspace/paths.js.map +1 -0
  83. package/dist/cli/workspace/postCouncilHook.js +38 -0
  84. package/dist/cli/workspace/postCouncilHook.js.map +1 -0
  85. package/dist/cli/workspace/storage.js +392 -0
  86. package/dist/cli/workspace/storage.js.map +1 -0
  87. package/dist/cli/workspace/stubs.js +528 -0
  88. package/dist/cli/workspace/stubs.js.map +1 -0
  89. package/dist/cli/workspace/toolRegistry.js +61 -0
  90. package/dist/cli/workspace/toolRegistry.js.map +1 -0
  91. package/dist/cli/workspace/types.js +10 -0
  92. package/dist/cli/workspace/types.js.map +1 -0
  93. package/dist/main/core/AgentHarness.js +15 -1
  94. package/dist/main/core/AgentHarness.js.map +1 -1
  95. package/dist/main/core/tools/builtin/_walk.js +129 -0
  96. package/dist/main/core/tools/builtin/_walk.js.map +1 -0
  97. package/dist/main/core/tools/builtin/diff.js +477 -0
  98. package/dist/main/core/tools/builtin/diff.js.map +1 -0
  99. package/dist/main/core/tools/builtin/listFiles.js +5 -43
  100. package/dist/main/core/tools/builtin/listFiles.js.map +1 -1
  101. package/dist/main/core/tools/builtin/search.js +120 -28
  102. package/dist/main/core/tools/builtin/search.js.map +1 -1
  103. package/dist/main/core/tools/zodBridge.js +8 -0
  104. package/dist/main/core/tools/zodBridge.js.map +1 -1
  105. package/package.json +5 -2
@@ -0,0 +1,300 @@
1
+ // @ts-nocheck — pre-existing strict-mode type narrowing issues carried over
2
+ // from app.tsx. Runtime is correct; tighten signatures in a follow-up.
3
+ import { useCallback } from 'react';
4
+ import { handleSlashCommand } from '../slashCommands.js';
5
+ import { appendSystem, appendUser } from './messageHelpers.js';
6
+ import { sessionKindRouter } from '../sessionManager.js';
7
+ import { newSessionId } from '../sessionManager.js';
8
+ import { handleDiff, handleUndo, handleCompact, handleUpdateCheck, handleUpdatePerform, handlePromoteMember, } from '../slashHandlers/git.js';
9
+ import { handleBranchCreate, handleBranchList, handleBranchCheckout, } from '../slashHandlers/branch.js';
10
+ import { handleWorkspaceShow, handleWorkspaceSync, handleWorkspaceReset, } from '../slashHandlers/workspace.js';
11
+ import { handleProviderList, handleProviderSet, handleProviderCustom, handleProviderRefresh, handleProviderStatus, handleLoginKey, handleLoginOAuthGrok, handleModelShow, handleModelSet, handleModelsList, handleModelsRefresh, } from '../slashHandlers/provider.js';
12
+ import { handleSkillStats, handleSkillCompare, handleCouncilFeedback, handleSteer, handleClearChat, } from '../slashHandlers/skills.js';
13
+ export function useSlashDispatch(params) {
14
+ const { skills, sessionId, messages, setMessages, setInput, setBusy, setSessionId, setSessionActive, setProviderConfig, activeProviderSpec, activeModel, providerDefaults, harnessRef, setQueueCount, dispatchPrompt, dispatchCouncilPrompt, } = params;
15
+ return useCallback(async (value) => {
16
+ if (!value.trim())
17
+ return;
18
+ // We can't read `busy` here (would need to be a dep); the InputBar is
19
+ // disabled when busy, so this is a belt-and-suspenders guard.
20
+ const result = handleSlashCommand(value, skills);
21
+ // Base context — passed to every handler that needs chat state.
22
+ const baseCtx = { setMessages, setInput };
23
+ // Some handlers (e.g. handleCompact) need read access to the live message
24
+ // list — supply a wider ctx for them.
25
+ const fullCtx = { ...baseCtx, messages };
26
+ const providerCtx = {
27
+ ...baseCtx, setProviderConfig, setBusy,
28
+ activeProviderSpec, activeModel, providerDefaults,
29
+ };
30
+ const skillCtx = { ...baseCtx, setBusy, sessionId };
31
+ const branchCtx = { ...baseCtx, sessionId };
32
+ const steerCtx = { ...skillCtx, harnessRef, setQueueCount, dispatchPrompt };
33
+ // Local refs to optional callbacks so the closure types are tight.
34
+ const { onNewSession, onExit } = params;
35
+ // ── Unhandled: free-form prompt → dispatch to LLM ──
36
+ if (!result.handled) {
37
+ appendUser(setMessages, value);
38
+ setSessionActive(true);
39
+ await dispatchPrompt(value);
40
+ setInput('');
41
+ return;
42
+ }
43
+ // ── Session kinds ──
44
+ if (result.kind === 'session' || result.kind === 'resume' || result.kind === 'new') {
45
+ // Session-kind commands touch the persistence layer (sessions directory,
46
+ // current-session marker, writerRef) which lives in App. We delegate
47
+ // to the helpers exported from sessionManager and apply the writerRef
48
+ // + messages reset ourselves.
49
+ if (result.kind === 'session') {
50
+ const { message: sysMsg } = await sessionKindRouter('session');
51
+ appendSystem(setMessages, sysMsg);
52
+ }
53
+ else if (result.kind === 'resume' && result.targetSessionId) {
54
+ const { message: sysMsg } = await sessionKindRouter('resume', result.targetSessionId);
55
+ appendSystem(setMessages, sysMsg);
56
+ }
57
+ else if (result.kind === 'new') {
58
+ // Generate the id HERE (not inside sessionKindRouter) so the in-memory
59
+ // state, the on-disk current-session marker, and the writerRef ALL
60
+ // share the same id. The previous split-brain bug fired both
61
+ // sessionKindRouter's internal newSessionId() AND a second
62
+ // newSessionId() here, leaving idA on disk and idB in memory.
63
+ const id = newSessionId();
64
+ const { message: sysMsg } = await sessionKindRouter('new', undefined, id);
65
+ appendSystem(setMessages, sysMsg);
66
+ setSessionId(id);
67
+ setMessages([]);
68
+ setSessionActive(false);
69
+ onNewSession?.(id);
70
+ }
71
+ setInput('');
72
+ return;
73
+ }
74
+ // ── Council ──
75
+ if (result.kind === 'council' && result.councilInput) {
76
+ appendUser(setMessages, `/council ${result.councilInput}`);
77
+ setSessionActive(true);
78
+ setInput('');
79
+ await dispatchCouncilPrompt(result.councilInput);
80
+ return;
81
+ }
82
+ // ── Council feedback ──
83
+ if (result.kind === 'council_feedback' && result.feedbackMemberId && typeof result.feedbackScore === 'number') {
84
+ handleCouncilFeedback(skillCtx, result.feedbackMemberId, result.feedbackScore, result.feedbackNote);
85
+ setInput('');
86
+ return;
87
+ }
88
+ // ── Provider ops ──
89
+ if (result.kind === 'provider_set' && result.provider) {
90
+ handleProviderSet(providerCtx, result.provider);
91
+ setInput('');
92
+ return;
93
+ }
94
+ if (result.kind === 'provider_list') {
95
+ handleProviderList(providerCtx);
96
+ setInput('');
97
+ return;
98
+ }
99
+ if (result.kind === 'provider_custom') {
100
+ handleProviderCustom(providerCtx, {
101
+ endpoint: result.customEndpoint,
102
+ clear: result.customClear,
103
+ message: result.message,
104
+ });
105
+ setInput('');
106
+ return;
107
+ }
108
+ if (result.kind === 'provider_refresh' && result.provider) {
109
+ await handleProviderRefresh(providerCtx, result.provider);
110
+ setInput('');
111
+ return;
112
+ }
113
+ if (result.kind === 'provider_status' && result.provider) {
114
+ await handleProviderStatus(providerCtx, result.provider);
115
+ setInput('');
116
+ return;
117
+ }
118
+ // ── Login ──
119
+ if (result.kind === 'login' && result.provider && result.loginKey) {
120
+ await handleLoginKey(providerCtx, result.provider, result.loginKey);
121
+ setInput('');
122
+ return;
123
+ }
124
+ if (result.kind === 'login_oauth' && result.provider === 'grok') {
125
+ await handleLoginOAuthGrok(providerCtx);
126
+ setInput('');
127
+ return;
128
+ }
129
+ // ── Model ──
130
+ if (result.kind === 'model_set' && result.model) {
131
+ handleModelSet(providerCtx, result.model);
132
+ setInput('');
133
+ return;
134
+ }
135
+ if (result.kind === 'model_show') {
136
+ handleModelShow(providerCtx);
137
+ setInput('');
138
+ return;
139
+ }
140
+ if (result.kind === 'models_list') {
141
+ handleModelsList(providerCtx);
142
+ setInput('');
143
+ return;
144
+ }
145
+ if (result.kind === 'models_refresh' || result.kind === 'model_refresh') {
146
+ handleModelsRefresh(providerCtx);
147
+ setInput('');
148
+ return;
149
+ }
150
+ // ── Branch ──
151
+ if (result.kind === 'branch_create' && result.branchName) {
152
+ if (!sessionId) {
153
+ appendSystem(setMessages, '[branch] no active session — wait for bootstrap or run a prompt first');
154
+ }
155
+ else {
156
+ await handleBranchCreate(branchCtx, result.branchName);
157
+ }
158
+ setInput('');
159
+ return;
160
+ }
161
+ if (result.kind === 'branch_list') {
162
+ await handleBranchList(branchCtx);
163
+ setInput('');
164
+ return;
165
+ }
166
+ if (result.kind === 'branch_checkout' && result.branchName) {
167
+ await handleBranchCheckout(branchCtx, result.branchName);
168
+ setInput('');
169
+ return;
170
+ }
171
+ // ── Steer ──
172
+ if (result.kind === 'steer' || result.kind === 'steer_interrupt') {
173
+ await handleSteer(steerCtx, result.steerText, result.message);
174
+ setInput('');
175
+ return;
176
+ }
177
+ if (result.kind === 'steer_no_active_run') {
178
+ if (result.message)
179
+ appendSystem(setMessages, result.message);
180
+ setInput('');
181
+ return;
182
+ }
183
+ // ── Update ──
184
+ if (result.kind === 'update_check') {
185
+ await handleUpdateCheck(baseCtx);
186
+ setInput('');
187
+ return;
188
+ }
189
+ if (result.kind === 'update_perform') {
190
+ await handleUpdatePerform(baseCtx);
191
+ setInput('');
192
+ return;
193
+ }
194
+ if (result.kind === 'update_usage') {
195
+ appendSystem(setMessages, result.message ?? 'Usage: /update [--yes|-y]');
196
+ setInput('');
197
+ return;
198
+ }
199
+ // ── Workspace ──
200
+ if (result.kind === 'workspace') {
201
+ appendSystem(setMessages, result.message ?? 'Usage: /workspace (see /workspace --help or docs/plans/2026-07-01-council-workspace-cli-stubs.md)');
202
+ setInput('');
203
+ return;
204
+ }
205
+ if (result.kind === 'workspace_show' && result.workspaceWhat) {
206
+ const what = result.workspaceWhat;
207
+ await handleWorkspaceShow(baseCtx, what);
208
+ setInput('');
209
+ return;
210
+ }
211
+ if (result.kind === 'workspace_sync') {
212
+ await handleWorkspaceSync(baseCtx);
213
+ setInput('');
214
+ return;
215
+ }
216
+ if (result.kind === 'workspace_reset') {
217
+ await handleWorkspaceReset(baseCtx, !!result.workspaceForce);
218
+ setInput('');
219
+ return;
220
+ }
221
+ // ── Compact ──
222
+ if (result.kind === 'compact') {
223
+ handleCompact(fullCtx, result.compactThreshold, result.compactKeepRecent);
224
+ setInput('');
225
+ return;
226
+ }
227
+ // ── Diff / undo ──
228
+ if (result.kind === 'diff') {
229
+ await handleDiff(baseCtx, !!result.diffStaged);
230
+ setInput('');
231
+ return;
232
+ }
233
+ if (result.kind === 'undo' || result.kind === 'undo_confirm') {
234
+ await handleUndo(baseCtx, result.message, result.kind === 'undo_confirm' && !!result.undoConfirmed);
235
+ setInput('');
236
+ return;
237
+ }
238
+ // ── Promote member ──
239
+ if (result.kind === 'promote_member' && result.promoteMemberId) {
240
+ await handlePromoteMember(baseCtx, result.promoteMemberId);
241
+ setInput('');
242
+ return;
243
+ }
244
+ if (result.kind === 'promote_member_error') {
245
+ appendSystem(setMessages, result.promoteMemberError ?? 'Usage: /promote-member <memberId>');
246
+ setInput('');
247
+ return;
248
+ }
249
+ // ── Skill stats / compare ──
250
+ if (result.kind === 'skill_stats') {
251
+ await handleSkillStats(skillCtx, result.skillStatsSkillId);
252
+ setInput('');
253
+ return;
254
+ }
255
+ if (result.kind === 'skill-compare') {
256
+ await handleSkillCompare(skillCtx, result.compareIds, result.message);
257
+ setInput('');
258
+ return;
259
+ }
260
+ // ── Skill invocation (special: dispatches to LLM) ──
261
+ if (result.kind === 'skill' && result.expandedSkill) {
262
+ // The skill's expanded prompt goes through the normal chat-turn pipeline
263
+ // so it gets logged, streamed, and session-stats-tracked.
264
+ const sysMsg = result.message
265
+ ?? `[skill] ${result.expandedSkill.skillId} — prompt ready (dispatch lands in Phase 14.7)`;
266
+ appendSystem(setMessages, sysMsg);
267
+ setInput('');
268
+ await dispatchPrompt(result.expandedSkill.prompt);
269
+ return;
270
+ }
271
+ // ── Clear / exit ──
272
+ if (result.kind === 'clear') {
273
+ handleClearChat(setMessages, setSessionActive);
274
+ setInput('');
275
+ return;
276
+ }
277
+ if (result.kind === 'exit') {
278
+ // Hand off to the App via callback so writerRef close + process.exit
279
+ // happen in the right place.
280
+ setInput('');
281
+ onExit?.();
282
+ return;
283
+ }
284
+ // ── Help / unknown ──
285
+ if (result.message) {
286
+ appendSystem(setMessages, result.message);
287
+ setInput('');
288
+ return;
289
+ }
290
+ appendSystem(setMessages, `[${result.kind}] handled`);
291
+ setInput('');
292
+ }, [
293
+ skills, sessionId, messages,
294
+ setMessages, setInput, setBusy, setSessionId, setSessionActive, setProviderConfig,
295
+ activeProviderSpec, activeModel, providerDefaults,
296
+ harnessRef, setQueueCount, dispatchPrompt, dispatchCouncilPrompt,
297
+ params,
298
+ ]);
299
+ }
300
+ //# sourceMappingURL=useSlashDispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSlashDispatch.js","sourceRoot":"","sources":["../../../src/cli/hooks/useSlashDispatch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import { useEffect, useState } from 'react';
2
+ import { useStdout } from 'ink';
3
+ /**
4
+ * useTerminalSize — reactive stdout dimensions.
5
+ *
6
+ * Returns the current terminal size and re-renders on resize events.
7
+ * Coalesces bursts of resize events into a single state update per
8
+ * animation frame so a fast drag doesn't trigger 100+ redraws.
9
+ *
10
+ * Extracted from app.tsx (Task v0.4.2 audit split) so it can be unit-tested
11
+ * and reused by other components that care about dimensions (Sidebar,
12
+ * ChatStream already take height/width as props).
13
+ */
14
+ export function useTerminalSize(options = {}) {
15
+ const { defaults = { columns: 80, rows: 24 }, coalesceMs = 16 } = options;
16
+ const { stdout } = useStdout();
17
+ const [size, setSize] = useState({
18
+ columns: stdout?.columns ?? defaults.columns,
19
+ rows: stdout?.rows ?? defaults.rows,
20
+ });
21
+ useEffect(() => {
22
+ if (!stdout)
23
+ return;
24
+ // v0.4.3 audit fix: if stdout resolves AFTER the initial render (e.g.
25
+ // test bootstrap or some terminal wrappers), the size would stay at
26
+ // the default 80x24 until the user manually resized. Pull the current
27
+ // dimensions immediately when stdout becomes available.
28
+ setSize({
29
+ columns: stdout.columns ?? defaults.columns,
30
+ rows: stdout.rows ?? defaults.rows,
31
+ });
32
+ let rafId = null;
33
+ const handleResize = () => {
34
+ if (coalesceMs <= 0) {
35
+ setSize({
36
+ columns: stdout.columns ?? defaults.columns,
37
+ rows: stdout.rows ?? defaults.rows,
38
+ });
39
+ return;
40
+ }
41
+ if (rafId !== null)
42
+ clearTimeout(rafId);
43
+ rafId = setTimeout(() => {
44
+ setSize({
45
+ columns: stdout.columns ?? defaults.columns,
46
+ rows: stdout.rows ?? defaults.rows,
47
+ });
48
+ rafId = null;
49
+ }, coalesceMs);
50
+ };
51
+ stdout.on('resize', handleResize);
52
+ return () => {
53
+ stdout.off('resize', handleResize);
54
+ if (rafId !== null)
55
+ clearTimeout(rafId);
56
+ };
57
+ }, [stdout, defaults.columns, defaults.rows, coalesceMs]);
58
+ return size;
59
+ }
60
+ //# sourceMappingURL=useTerminalSize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTerminalSize.js","sourceRoot":"","sources":["../../../src/cli/hooks/useTerminalSize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAmBhC;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAAC,UAA+B,EAAE;IAC/D,MAAM,EAAE,QAAQ,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,UAAU,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;IAC1E,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IAC/B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAe;QAC7C,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,QAAQ,CAAC,OAAO;QAC5C,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,QAAQ,CAAC,IAAI;KACpC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,sEAAsE;QACtE,oEAAoE;QACpE,sEAAsE;QACtE,wDAAwD;QACxD,OAAO,CAAC;YACN,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO;YAC3C,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI;SACnC,CAAC,CAAC;QACH,IAAI,KAAK,GAAyC,IAAI,CAAC;QACvD,MAAM,YAAY,GAAG,GAAG,EAAE;YACxB,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;gBACpB,OAAO,CAAC;oBACN,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO;oBAC3C,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI;iBACnC,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YACD,IAAI,KAAK,KAAK,IAAI;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;YACxC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBACtB,OAAO,CAAC;oBACN,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO;oBAC3C,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI;iBACnC,CAAC,CAAC;gBACH,KAAK,GAAG,IAAI,CAAC;YACf,CAAC,EAAE,UAAU,CAAC,CAAC;QACjB,CAAC,CAAC;QACF,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAClC,OAAO,GAAG,EAAE;YACV,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YACnC,IAAI,KAAK,KAAK,IAAI;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;QAC1C,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC;IAE1D,OAAO,IAAI,CAAC;AACd,CAAC"}