opencode-lark 0.1.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 (138) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/LICENSE +21 -0
  3. package/README.md +322 -0
  4. package/README.zh-CN.md +324 -0
  5. package/bin/opencode-lark.js +2 -0
  6. package/dist/channel/base-plugin.d.ts +31 -0
  7. package/dist/channel/base-plugin.d.ts.map +1 -0
  8. package/dist/channel/base-plugin.js +42 -0
  9. package/dist/channel/base-plugin.js.map +1 -0
  10. package/dist/channel/feishu/feishu-plugin.d.ts +36 -0
  11. package/dist/channel/feishu/feishu-plugin.d.ts.map +1 -0
  12. package/dist/channel/feishu/feishu-plugin.js +149 -0
  13. package/dist/channel/feishu/feishu-plugin.js.map +1 -0
  14. package/dist/channel/feishu/index.d.ts +2 -0
  15. package/dist/channel/feishu/index.d.ts.map +1 -0
  16. package/dist/channel/feishu/index.js +2 -0
  17. package/dist/channel/feishu/index.js.map +1 -0
  18. package/dist/channel/index.d.ts +4 -0
  19. package/dist/channel/index.d.ts.map +1 -0
  20. package/dist/channel/index.js +4 -0
  21. package/dist/channel/index.js.map +1 -0
  22. package/dist/channel/manager.d.ts +37 -0
  23. package/dist/channel/manager.d.ts.map +1 -0
  24. package/dist/channel/manager.js +68 -0
  25. package/dist/channel/manager.js.map +1 -0
  26. package/dist/channel/mock/mock-plugin.d.ts +24 -0
  27. package/dist/channel/mock/mock-plugin.d.ts.map +1 -0
  28. package/dist/channel/mock/mock-plugin.js +42 -0
  29. package/dist/channel/mock/mock-plugin.js.map +1 -0
  30. package/dist/channel/types.d.ts +226 -0
  31. package/dist/channel/types.d.ts.map +1 -0
  32. package/dist/channel/types.js +7 -0
  33. package/dist/channel/types.js.map +1 -0
  34. package/dist/cron/cron-service.d.ts +40 -0
  35. package/dist/cron/cron-service.d.ts.map +1 -0
  36. package/dist/cron/cron-service.js +140 -0
  37. package/dist/cron/cron-service.js.map +1 -0
  38. package/dist/cron/heartbeat.d.ts +30 -0
  39. package/dist/cron/heartbeat.d.ts.map +1 -0
  40. package/dist/cron/heartbeat.js +76 -0
  41. package/dist/cron/heartbeat.js.map +1 -0
  42. package/dist/feishu/api-client.d.ts +19 -0
  43. package/dist/feishu/api-client.d.ts.map +1 -0
  44. package/dist/feishu/api-client.js +98 -0
  45. package/dist/feishu/api-client.js.map +1 -0
  46. package/dist/feishu/card-builder.d.ts +10 -0
  47. package/dist/feishu/card-builder.d.ts.map +1 -0
  48. package/dist/feishu/card-builder.js +74 -0
  49. package/dist/feishu/card-builder.js.map +1 -0
  50. package/dist/feishu/cardkit-client.d.ts +48 -0
  51. package/dist/feishu/cardkit-client.d.ts.map +1 -0
  52. package/dist/feishu/cardkit-client.js +97 -0
  53. package/dist/feishu/cardkit-client.js.map +1 -0
  54. package/dist/feishu/message-dedup.d.ts +28 -0
  55. package/dist/feishu/message-dedup.d.ts.map +1 -0
  56. package/dist/feishu/message-dedup.js +58 -0
  57. package/dist/feishu/message-dedup.js.map +1 -0
  58. package/dist/feishu/webhook-server.d.ts +20 -0
  59. package/dist/feishu/webhook-server.d.ts.map +1 -0
  60. package/dist/feishu/webhook-server.js +111 -0
  61. package/dist/feishu/webhook-server.js.map +1 -0
  62. package/dist/feishu/ws-client.d.ts +17 -0
  63. package/dist/feishu/ws-client.d.ts.map +1 -0
  64. package/dist/feishu/ws-client.js +158 -0
  65. package/dist/feishu/ws-client.js.map +1 -0
  66. package/dist/handler/interactive-handler.d.ts +16 -0
  67. package/dist/handler/interactive-handler.d.ts.map +1 -0
  68. package/dist/handler/interactive-handler.js +86 -0
  69. package/dist/handler/interactive-handler.js.map +1 -0
  70. package/dist/handler/interactive-poller.d.ts +16 -0
  71. package/dist/handler/interactive-poller.d.ts.map +1 -0
  72. package/dist/handler/interactive-poller.js +147 -0
  73. package/dist/handler/interactive-poller.js.map +1 -0
  74. package/dist/handler/message-handler.d.ts +34 -0
  75. package/dist/handler/message-handler.d.ts.map +1 -0
  76. package/dist/handler/message-handler.js +305 -0
  77. package/dist/handler/message-handler.js.map +1 -0
  78. package/dist/handler/streaming-integration.d.ts +21 -0
  79. package/dist/handler/streaming-integration.d.ts.map +1 -0
  80. package/dist/handler/streaming-integration.js +325 -0
  81. package/dist/handler/streaming-integration.js.map +1 -0
  82. package/dist/index.d.ts +16 -0
  83. package/dist/index.d.ts.map +1 -0
  84. package/dist/index.js +281 -0
  85. package/dist/index.js.map +1 -0
  86. package/dist/memory/memory-manager.d.ts +16 -0
  87. package/dist/memory/memory-manager.d.ts.map +1 -0
  88. package/dist/memory/memory-manager.js +58 -0
  89. package/dist/memory/memory-manager.js.map +1 -0
  90. package/dist/session/progress-tracker.d.ts +12 -0
  91. package/dist/session/progress-tracker.d.ts.map +1 -0
  92. package/dist/session/progress-tracker.js +46 -0
  93. package/dist/session/progress-tracker.js.map +1 -0
  94. package/dist/session/session-manager.d.ts +15 -0
  95. package/dist/session/session-manager.d.ts.map +1 -0
  96. package/dist/session/session-manager.js +91 -0
  97. package/dist/session/session-manager.js.map +1 -0
  98. package/dist/streaming/event-processor.d.ts +74 -0
  99. package/dist/streaming/event-processor.d.ts.map +1 -0
  100. package/dist/streaming/event-processor.js +240 -0
  101. package/dist/streaming/event-processor.js.map +1 -0
  102. package/dist/streaming/session-observer.d.ts +19 -0
  103. package/dist/streaming/session-observer.d.ts.map +1 -0
  104. package/dist/streaming/session-observer.js +140 -0
  105. package/dist/streaming/session-observer.js.map +1 -0
  106. package/dist/streaming/streaming-card.d.ts +37 -0
  107. package/dist/streaming/streaming-card.d.ts.map +1 -0
  108. package/dist/streaming/streaming-card.js +139 -0
  109. package/dist/streaming/streaming-card.js.map +1 -0
  110. package/dist/streaming/subagent-card.d.ts +32 -0
  111. package/dist/streaming/subagent-card.d.ts.map +1 -0
  112. package/dist/streaming/subagent-card.js +103 -0
  113. package/dist/streaming/subagent-card.js.map +1 -0
  114. package/dist/streaming/subagent-tracker.d.ts +45 -0
  115. package/dist/streaming/subagent-tracker.d.ts.map +1 -0
  116. package/dist/streaming/subagent-tracker.js +118 -0
  117. package/dist/streaming/subagent-tracker.js.map +1 -0
  118. package/dist/types.d.ts +55 -0
  119. package/dist/types.d.ts.map +1 -0
  120. package/dist/types.js +5 -0
  121. package/dist/types.js.map +1 -0
  122. package/dist/utils/config.d.ts +197 -0
  123. package/dist/utils/config.d.ts.map +1 -0
  124. package/dist/utils/config.js +87 -0
  125. package/dist/utils/config.js.map +1 -0
  126. package/dist/utils/db.d.ts +12 -0
  127. package/dist/utils/db.d.ts.map +1 -0
  128. package/dist/utils/db.js +35 -0
  129. package/dist/utils/db.js.map +1 -0
  130. package/dist/utils/event-listeners.d.ts +12 -0
  131. package/dist/utils/event-listeners.d.ts.map +1 -0
  132. package/dist/utils/event-listeners.js +21 -0
  133. package/dist/utils/event-listeners.js.map +1 -0
  134. package/dist/utils/logger.d.ts +11 -0
  135. package/dist/utils/logger.d.ts.map +1 -0
  136. package/dist/utils/logger.js +38 -0
  137. package/dist/utils/logger.js.map +1 -0
  138. package/package.json +41 -0
@@ -0,0 +1,305 @@
1
+ /**
2
+ * Message handler — extracted from index.ts handleMessage().
3
+ *
4
+ * Supports two modes:
5
+ * 1. Event-driven (preferred): POST message → subscribe to SSE events → collect TextDelta → respond on SessionIdle
6
+ * 2. Sync fallback: POST message → parse response body → respond immediately
7
+ */
8
+ import { addListener, removeListener } from "../utils/event-listeners.js";
9
+ // ── Constants ──
10
+ const EVENT_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes
11
+ // ── Factory ──
12
+ export function createMessageHandler(deps) {
13
+ const { serverUrl, sessionManager, memoryManager, dedup, eventProcessor, feishuClient, progressTracker, eventListeners, ownedSessions, logger, } = deps;
14
+ const notifiedFeishuKeys = new Set();
15
+ return async function handleMessage(event) {
16
+ // ── 1. Dedup check ──
17
+ if (dedup.isDuplicate(event.event_id)) {
18
+ return;
19
+ }
20
+ // ── 2. Skip non-text messages ──
21
+ if (event.message.message_type !== "text") {
22
+ logger.debug(`Skipping non-text message: ${event.message.message_type}`);
23
+ return;
24
+ }
25
+ // ── 3. Parse user text ──
26
+ let userText;
27
+ try {
28
+ const parsed = JSON.parse(event.message.content);
29
+ userText = parsed.text ?? "";
30
+ }
31
+ catch {
32
+ userText = event.message.content;
33
+ }
34
+ if (!userText.trim())
35
+ return;
36
+ // ── 4. Resolve feishuKey ──
37
+ const feishuKey = event.chat_type === "p2p"
38
+ ? event.chat_id
39
+ : event.root_id
40
+ ? `${event.chat_id}:${event.root_id}`
41
+ : `${event.chat_id}:${event.message_id}`;
42
+ logger.info(`Message from ${feishuKey}: ${userText.slice(0, 80)}...`);
43
+ // ── 5. Send thinking indicator ──
44
+ // With streaming bridge: add emoji reaction to user message.
45
+ // Without streaming bridge: send thinking card via sendMessage.
46
+ const thinkingMessageId = deps.streamingBridge
47
+ ? null
48
+ : await progressTracker.sendThinking(event.chat_id);
49
+ let reactionId = null;
50
+ if (deps.streamingBridge) {
51
+ try {
52
+ const reactionResult = await feishuClient.addReaction(event.message_id, "Typing");
53
+ reactionId = reactionResult?.data?.reaction_id ?? null;
54
+ }
55
+ catch (err) {
56
+ logger.warn(`addReaction failed: ${err}`);
57
+ }
58
+ }
59
+ // ── 6. Get/create session ──
60
+ const sessionId = await sessionManager.getOrCreate(feishuKey);
61
+ ownedSessions.add(sessionId);
62
+ // ── 6a. First-bind notification ──
63
+ if (!notifiedFeishuKeys.has(feishuKey)) {
64
+ notifiedFeishuKeys.add(feishuKey);
65
+ await feishuClient.sendMessage(event.chat_id, {
66
+ msg_type: "text",
67
+ content: JSON.stringify({ text: "已连接 session: " + sessionId }),
68
+ });
69
+ }
70
+ // ── 6b. Wire observer ──
71
+ if (deps.observer) {
72
+ deps.observer.observe(sessionId, event.chat_id);
73
+ }
74
+ // ── 7. Memory search + build parts ──
75
+ const memoryResults = memoryManager.searchMemory(userText);
76
+ const memoryContext = memoryResults.length > 0
77
+ ? memoryResults.map((r) => r.snippet).join("\n")
78
+ : "";
79
+ const parts = [];
80
+ if (memoryContext) {
81
+ parts.push({
82
+ type: "text",
83
+ text: `[Memory Context]\n${memoryContext}\n\n[User Message]\n${userText}`,
84
+ });
85
+ }
86
+ else {
87
+ parts.push({ type: "text", text: userText });
88
+ }
89
+ // ── 8. Build the POST-to-opencode function ──
90
+ const promptUrl = `${serverUrl}/session/${sessionId}/message`;
91
+ const postBody = JSON.stringify({ parts });
92
+ async function postToOpencode() {
93
+ const resp = await fetch(promptUrl, {
94
+ method: "POST",
95
+ headers: { "Content-Type": "application/json" },
96
+ body: postBody,
97
+ });
98
+ if (!resp.ok) {
99
+ throw new Error(`Prompt HTTP error: ${resp.status}`);
100
+ }
101
+ const rawText = await resp.text();
102
+ logger.info(`Prompt response (${rawText.length} bytes): ${rawText.slice(0, 200)}`);
103
+ return rawText;
104
+ }
105
+ // ── 9. Try streaming bridge (registers listener BEFORE POST) → sync fallback ──
106
+ if (deps.streamingBridge) {
107
+ // Register ownership listener to mark Feishu-initiated messageIds
108
+ let ownershipListener = null;
109
+ if (deps.observer) {
110
+ ownershipListener = (rawEvent) => {
111
+ const props = rawEvent && typeof rawEvent === "object" ? rawEvent.properties : null;
112
+ if (!props || typeof props !== "object")
113
+ return;
114
+ const p = props;
115
+ const part = p.part;
116
+ const mid = part && typeof part === "object" ? part.messageID : p.messageID;
117
+ if (typeof mid === "string")
118
+ deps.observer.markOwned(mid);
119
+ };
120
+ addListener(eventListeners, sessionId, ownershipListener);
121
+ }
122
+ try {
123
+ await deps.streamingBridge.handleMessage(event.chat_id, sessionId, eventListeners, eventProcessor, postToOpencode, (responseText) => {
124
+ if (ownershipListener)
125
+ removeListener(eventListeners, sessionId, ownershipListener);
126
+ memoryManager.saveMemory(sessionId, `Q: ${userText}\nA: ${responseText.slice(0, 500)}`);
127
+ }, event.message_id, reactionId);
128
+ logger.info(`Response sent for session ${sessionId} (streaming bridge)`);
129
+ return;
130
+ }
131
+ catch (err) {
132
+ if (ownershipListener)
133
+ removeListener(eventListeners, sessionId, ownershipListener);
134
+ logger.warn(`Streaming bridge failed, falling back to sync: ${err}`);
135
+ if (reactionId) {
136
+ await feishuClient.deleteReaction(event.message_id, reactionId).catch(() => { });
137
+ }
138
+ try {
139
+ const rawText = await postToOpencode();
140
+ await handleSyncFallback(rawText, sessionId, userText, event, thinkingMessageId);
141
+ }
142
+ catch (postErr) {
143
+ logger.error(`Sync fallback POST also failed: ${postErr}`);
144
+ const errorMessage = "处理请求时出错了。";
145
+ await feishuClient.replyMessage(event.message_id, {
146
+ msg_type: "text",
147
+ content: JSON.stringify({ text: errorMessage }),
148
+ });
149
+ }
150
+ logger.info(`Response sent for session ${sessionId} (sync fallback)`);
151
+ return;
152
+ }
153
+ }
154
+ // No streaming bridge — direct POST then event-driven → sync fallback
155
+ let rawText;
156
+ try {
157
+ rawText = await postToOpencode();
158
+ }
159
+ catch (err) {
160
+ logger.error(`POST to opencode failed: ${err}`);
161
+ if (thinkingMessageId) {
162
+ await progressTracker.updateWithError(thinkingMessageId, "处理请求时出错了。");
163
+ }
164
+ else {
165
+ await feishuClient.sendMessage(event.chat_id, {
166
+ msg_type: "text",
167
+ content: JSON.stringify({ text: "抱歉,处理请求时出错了。" }),
168
+ });
169
+ }
170
+ return;
171
+ }
172
+ // Register ownership listener for event-driven path
173
+ let ownershipListenerEd = null;
174
+ if (deps.observer) {
175
+ ownershipListenerEd = (rawEvent) => {
176
+ const props = rawEvent && typeof rawEvent === "object" ? rawEvent.properties : null;
177
+ if (!props || typeof props !== "object")
178
+ return;
179
+ const p = props;
180
+ const part = p.part;
181
+ const mid = part && typeof part === "object" ? part.messageID : p.messageID;
182
+ if (typeof mid === "string")
183
+ deps.observer.markOwned(mid);
184
+ };
185
+ addListener(eventListeners, sessionId, ownershipListenerEd);
186
+ }
187
+ try {
188
+ await waitForEventDrivenResponse(sessionId, userText, event, thinkingMessageId);
189
+ }
190
+ catch (err) {
191
+ logger.warn(`Event-driven flow failed, falling back to sync: ${err}`);
192
+ await handleSyncFallback(rawText, sessionId, userText, event, thinkingMessageId);
193
+ }
194
+ finally {
195
+ if (ownershipListenerEd)
196
+ removeListener(eventListeners, sessionId, ownershipListenerEd);
197
+ }
198
+ logger.info(`Response sent for session ${sessionId}`);
199
+ };
200
+ // ── Event-driven flow ──
201
+ async function waitForEventDrivenResponse(sessionId, userText, event, thinkingMessageId) {
202
+ return new Promise((resolve, reject) => {
203
+ let textBuffer = "";
204
+ let settled = false;
205
+ const myListener = (rawEvent) => {
206
+ const action = eventProcessor.processEvent(rawEvent);
207
+ if (!action)
208
+ return;
209
+ if (action.sessionId !== sessionId)
210
+ return;
211
+ switch (action.type) {
212
+ case "TextDelta":
213
+ textBuffer += action.text;
214
+ break;
215
+ case "SessionIdle": {
216
+ if (settled)
217
+ return;
218
+ settled = true;
219
+ cleanup();
220
+ const responseText = textBuffer.trim() || "(无回复)";
221
+ // Save memory + send response
222
+ memoryManager.saveMemory(sessionId, `Q: ${userText}\nA: ${responseText.slice(0, 500)}`);
223
+ sendResponse(responseText, event, thinkingMessageId)
224
+ .then(resolve)
225
+ .catch(reject);
226
+ break;
227
+ }
228
+ default:
229
+ break;
230
+ }
231
+ };
232
+ // Timeout guard
233
+ const timer = setTimeout(() => {
234
+ if (settled)
235
+ return;
236
+ settled = true;
237
+ cleanup();
238
+ reject(new Error(`Event-driven flow timed out after ${EVENT_TIMEOUT_MS}ms`));
239
+ }, EVENT_TIMEOUT_MS);
240
+ function cleanup() {
241
+ clearTimeout(timer);
242
+ removeListener(eventListeners, sessionId, myListener);
243
+ }
244
+ // Register listener keyed by sessionId
245
+ addListener(eventListeners, sessionId, myListener);
246
+ });
247
+ }
248
+ // ── Sync fallback (existing behavior) ──
249
+ async function handleSyncFallback(rawText, sessionId, userText, event, thinkingMessageId) {
250
+ if (!rawText.trim()) {
251
+ logger.error("Empty response body from opencode server");
252
+ if (thinkingMessageId) {
253
+ await progressTracker.updateWithError(thinkingMessageId, "服务器返回了空响应。");
254
+ }
255
+ else {
256
+ await feishuClient.sendMessage(event.chat_id, {
257
+ msg_type: "text",
258
+ content: JSON.stringify({ text: "抱歉,服务器返回了空响应。" }),
259
+ });
260
+ }
261
+ return;
262
+ }
263
+ let promptData = {};
264
+ try {
265
+ promptData = JSON.parse(rawText);
266
+ }
267
+ catch (e) {
268
+ logger.error(`Failed to parse prompt response: ${e}`);
269
+ logger.error(`Raw response: ${rawText.slice(0, 500)}`);
270
+ }
271
+ logger.info(`Prompt parts count: ${promptData.parts?.length ?? 0}`);
272
+ const responseText = promptData.parts
273
+ ?.filter((p) => p.type === "text" && p.text)
274
+ .map((p) => p.text ?? "")
275
+ .join("\n")
276
+ .trim() || "(无回复)";
277
+ memoryManager.saveMemory(sessionId, `Q: ${userText}\nA: ${responseText.slice(0, 500)}`);
278
+ await sendResponse(responseText, event, thinkingMessageId);
279
+ }
280
+ // ── Shared response sender ──
281
+ async function sendResponse(responseText, event, thinkingMessageId) {
282
+ if (thinkingMessageId) {
283
+ await progressTracker.updateWithResponse(thinkingMessageId, responseText);
284
+ }
285
+ else if (event.chat_type === "p2p") {
286
+ const truncated = responseText.length > 4000
287
+ ? responseText.slice(0, 4000) + "\n\n...(truncated)"
288
+ : responseText;
289
+ await feishuClient.sendMessage(event.chat_id, {
290
+ msg_type: "text",
291
+ content: JSON.stringify({ text: truncated }),
292
+ });
293
+ }
294
+ else {
295
+ const truncated = responseText.length > 4000
296
+ ? responseText.slice(0, 4000) + "\n\n...(truncated)"
297
+ : responseText;
298
+ await feishuClient.replyMessage(event.message_id, {
299
+ msg_type: "text",
300
+ content: JSON.stringify({ text: truncated }),
301
+ });
302
+ }
303
+ }
304
+ }
305
+ //# sourceMappingURL=message-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-handler.js","sourceRoot":"","sources":["../../src/handler/message-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { CardKitClient } from "../feishu/cardkit-client.js";
2
+ import type { FeishuApiClient } from "../feishu/api-client.js";
3
+ import type { SubAgentTracker } from "../streaming/subagent-tracker.js";
4
+ import type { Logger } from "../utils/logger.js";
5
+ import type { EventProcessor } from "../streaming/event-processor.js";
6
+ import type { QuestionAsked, PermissionRequested } from "../streaming/event-processor.js";
7
+ import type { EventListenerMap } from "../utils/event-listeners.js";
8
+ export interface StreamingBridgeDeps {
9
+ cardkitClient: CardKitClient;
10
+ feishuClient: FeishuApiClient;
11
+ subAgentTracker: SubAgentTracker;
12
+ logger: Logger;
13
+ seenInteractiveIds: Set<string>;
14
+ }
15
+ export interface StreamingBridge {
16
+ handleMessage(chatId: string, sessionId: string, eventListeners: EventListenerMap, eventProcessor: EventProcessor, sendMessage: () => Promise<string>, onComplete: (text: string) => void, messageId: string, reactionId: string | null): Promise<void>;
17
+ }
18
+ export declare function createStreamingBridge(deps: StreamingBridgeDeps): StreamingBridge;
19
+ export declare function buildQuestionCard(action: QuestionAsked): Record<string, unknown>;
20
+ export declare function buildPermissionCard(action: PermissionRequested): Record<string, unknown>;
21
+ //# sourceMappingURL=streaming-integration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming-integration.d.ts","sourceRoot":"","sources":["../../src/handler/streaming-integration.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAA;AACvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAA;AACzF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAMnE,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,aAAa,CAAA;IAC5B,YAAY,EAAE,eAAe,CAAA;IAC7B,eAAe,EAAE,eAAe,CAAA;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAChC;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,CACX,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,gBAAgB,EAChC,cAAc,EAAE,cAAc,EAC9B,WAAW,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,EAClC,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAClC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GAAG,IAAI,GACxB,OAAO,CAAC,IAAI,CAAC,CAAA;CACjB;AASD,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,mBAAmB,GACxB,eAAe,CAmOjB;AAsDD,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,aAAa,GACpB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAsCzB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,mBAAmB,GAC1B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAqCzB"}