@happyvertical/smrt-chat 0.30.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.
Files changed (169) hide show
  1. package/AGENTS.md +35 -0
  2. package/CLAUDE.md +1 -0
  3. package/LICENSE +7 -0
  4. package/README.md +163 -0
  5. package/dist/__smrt-register__.d.ts +2 -0
  6. package/dist/__smrt-register__.d.ts.map +1 -0
  7. package/dist/chunks/ChatService-Dpzc1Pa5.js +2044 -0
  8. package/dist/chunks/ChatService-Dpzc1Pa5.js.map +1 -0
  9. package/dist/collections/AgentSessionCollection.d.ts +57 -0
  10. package/dist/collections/AgentSessionCollection.d.ts.map +1 -0
  11. package/dist/collections/ChatMessageCollection.d.ts +79 -0
  12. package/dist/collections/ChatMessageCollection.d.ts.map +1 -0
  13. package/dist/collections/ChatParticipantCollection.d.ts +26 -0
  14. package/dist/collections/ChatParticipantCollection.d.ts.map +1 -0
  15. package/dist/collections/ChatReactionCollection.d.ts +23 -0
  16. package/dist/collections/ChatReactionCollection.d.ts.map +1 -0
  17. package/dist/collections/ChatRoomCollection.d.ts +43 -0
  18. package/dist/collections/ChatRoomCollection.d.ts.map +1 -0
  19. package/dist/collections/ChatThreadCollection.d.ts +9 -0
  20. package/dist/collections/ChatThreadCollection.d.ts.map +1 -0
  21. package/dist/index.d.ts +5 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +18 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/internal/agent-runtime.d.ts +16 -0
  26. package/dist/internal/agent-runtime.d.ts.map +1 -0
  27. package/dist/internal/agent-runtime.js +5 -0
  28. package/dist/internal/agent-runtime.js.map +1 -0
  29. package/dist/manifest.json +2811 -0
  30. package/dist/models/AgentSession.d.ts +70 -0
  31. package/dist/models/AgentSession.d.ts.map +1 -0
  32. package/dist/models/ChatMessage.d.ts +55 -0
  33. package/dist/models/ChatMessage.d.ts.map +1 -0
  34. package/dist/models/ChatParticipant.d.ts +32 -0
  35. package/dist/models/ChatParticipant.d.ts.map +1 -0
  36. package/dist/models/ChatReaction.d.ts +19 -0
  37. package/dist/models/ChatReaction.d.ts.map +1 -0
  38. package/dist/models/ChatRoom.d.ts +44 -0
  39. package/dist/models/ChatRoom.d.ts.map +1 -0
  40. package/dist/models/ChatThread.d.ts +24 -0
  41. package/dist/models/ChatThread.d.ts.map +1 -0
  42. package/dist/models/index.d.ts +7 -0
  43. package/dist/models/index.d.ts.map +1 -0
  44. package/dist/playground.d.ts +2 -0
  45. package/dist/playground.d.ts.map +1 -0
  46. package/dist/playground.js +166 -0
  47. package/dist/playground.js.map +1 -0
  48. package/dist/services/ChatService.d.ts +390 -0
  49. package/dist/services/ChatService.d.ts.map +1 -0
  50. package/dist/services/index.d.ts +2 -0
  51. package/dist/services/index.d.ts.map +1 -0
  52. package/dist/smrt-knowledge.json +1507 -0
  53. package/dist/svelte/components/agent/AgentChat.svelte +542 -0
  54. package/dist/svelte/components/agent/AgentChat.svelte.d.ts +21 -0
  55. package/dist/svelte/components/agent/AgentChat.svelte.d.ts.map +1 -0
  56. package/dist/svelte/components/agent/AgentSelector.svelte +175 -0
  57. package/dist/svelte/components/agent/AgentSelector.svelte.d.ts +11 -0
  58. package/dist/svelte/components/agent/AgentSelector.svelte.d.ts.map +1 -0
  59. package/dist/svelte/components/agent/AgentSessionPanel.svelte +322 -0
  60. package/dist/svelte/components/agent/AgentSessionPanel.svelte.d.ts +15 -0
  61. package/dist/svelte/components/agent/AgentSessionPanel.svelte.d.ts.map +1 -0
  62. package/dist/svelte/components/agent/ToolCallDisplay.svelte +335 -0
  63. package/dist/svelte/components/agent/ToolCallDisplay.svelte.d.ts +9 -0
  64. package/dist/svelte/components/agent/ToolCallDisplay.svelte.d.ts.map +1 -0
  65. package/dist/svelte/components/agent/message-blocks.d.ts +12 -0
  66. package/dist/svelte/components/agent/message-blocks.d.ts.map +1 -0
  67. package/dist/svelte/components/agent/message-blocks.js +41 -0
  68. package/dist/svelte/components/agent/message-blocks.test.js +31 -0
  69. package/dist/svelte/components/dialogs/RoomCreateDialog.svelte +403 -0
  70. package/dist/svelte/components/dialogs/RoomCreateDialog.svelte.d.ts +16 -0
  71. package/dist/svelte/components/dialogs/RoomCreateDialog.svelte.d.ts.map +1 -0
  72. package/dist/svelte/components/dialogs/SearchMessages.svelte +457 -0
  73. package/dist/svelte/components/dialogs/SearchMessages.svelte.d.ts +17 -0
  74. package/dist/svelte/components/dialogs/SearchMessages.svelte.d.ts.map +1 -0
  75. package/dist/svelte/components/layout/ChatLayout.svelte +150 -0
  76. package/dist/svelte/components/layout/ChatLayout.svelte.d.ts +18 -0
  77. package/dist/svelte/components/layout/ChatLayout.svelte.d.ts.map +1 -0
  78. package/dist/svelte/components/layout/MemberList.svelte +389 -0
  79. package/dist/svelte/components/layout/MemberList.svelte.d.ts +11 -0
  80. package/dist/svelte/components/layout/MemberList.svelte.d.ts.map +1 -0
  81. package/dist/svelte/components/layout/RoomHeader.svelte +241 -0
  82. package/dist/svelte/components/layout/RoomHeader.svelte.d.ts +15 -0
  83. package/dist/svelte/components/layout/RoomHeader.svelte.d.ts.map +1 -0
  84. package/dist/svelte/components/layout/RoomList.svelte +471 -0
  85. package/dist/svelte/components/layout/RoomList.svelte.d.ts +15 -0
  86. package/dist/svelte/components/layout/RoomList.svelte.d.ts.map +1 -0
  87. package/dist/svelte/components/messages/MessageInput.svelte +232 -0
  88. package/dist/svelte/components/messages/MessageInput.svelte.d.ts +20 -0
  89. package/dist/svelte/components/messages/MessageInput.svelte.d.ts.map +1 -0
  90. package/dist/svelte/components/messages/MessageItem.svelte +431 -0
  91. package/dist/svelte/components/messages/MessageItem.svelte.d.ts +19 -0
  92. package/dist/svelte/components/messages/MessageItem.svelte.d.ts.map +1 -0
  93. package/dist/svelte/components/messages/MessageList.svelte +129 -0
  94. package/dist/svelte/components/messages/MessageList.svelte.d.ts +17 -0
  95. package/dist/svelte/components/messages/MessageList.svelte.d.ts.map +1 -0
  96. package/dist/svelte/components/messages/ThreadPanel.svelte +156 -0
  97. package/dist/svelte/components/messages/ThreadPanel.svelte.d.ts +17 -0
  98. package/dist/svelte/components/messages/ThreadPanel.svelte.d.ts.map +1 -0
  99. package/dist/svelte/components/messages/__tests__/MessageInput.test.js +38 -0
  100. package/dist/svelte/components/shared/Avatar.svelte +30 -0
  101. package/dist/svelte/components/shared/Avatar.svelte.d.ts +14 -0
  102. package/dist/svelte/components/shared/Avatar.svelte.d.ts.map +1 -0
  103. package/dist/svelte/components/shared/FileUpload.svelte +382 -0
  104. package/dist/svelte/components/shared/FileUpload.svelte.d.ts +14 -0
  105. package/dist/svelte/components/shared/FileUpload.svelte.d.ts.map +1 -0
  106. package/dist/svelte/components/shared/LinkPreview.svelte +108 -0
  107. package/dist/svelte/components/shared/LinkPreview.svelte.d.ts +18 -0
  108. package/dist/svelte/components/shared/LinkPreview.svelte.d.ts.map +1 -0
  109. package/dist/svelte/components/shared/MentionAutocomplete.svelte +168 -0
  110. package/dist/svelte/components/shared/MentionAutocomplete.svelte.d.ts +18 -0
  111. package/dist/svelte/components/shared/MentionAutocomplete.svelte.d.ts.map +1 -0
  112. package/dist/svelte/components/shared/MessageBubble.svelte +81 -0
  113. package/dist/svelte/components/shared/MessageBubble.svelte.d.ts +16 -0
  114. package/dist/svelte/components/shared/MessageBubble.svelte.d.ts.map +1 -0
  115. package/dist/svelte/components/shared/ReactionPicker.svelte +103 -0
  116. package/dist/svelte/components/shared/ReactionPicker.svelte.d.ts +10 -0
  117. package/dist/svelte/components/shared/ReactionPicker.svelte.d.ts.map +1 -0
  118. package/dist/svelte/components/shared/ReadReceipts.svelte +127 -0
  119. package/dist/svelte/components/shared/ReadReceipts.svelte.d.ts +13 -0
  120. package/dist/svelte/components/shared/ReadReceipts.svelte.d.ts.map +1 -0
  121. package/dist/svelte/components/shared/TypingIndicator.svelte +90 -0
  122. package/dist/svelte/components/shared/TypingIndicator.svelte.d.ts +12 -0
  123. package/dist/svelte/components/shared/TypingIndicator.svelte.d.ts.map +1 -0
  124. package/dist/svelte/components/shared/UserPresence.svelte +65 -0
  125. package/dist/svelte/components/shared/UserPresence.svelte.d.ts +13 -0
  126. package/dist/svelte/components/shared/UserPresence.svelte.d.ts.map +1 -0
  127. package/dist/svelte/components/shared/__tests__/Avatar.test.js +20 -0
  128. package/dist/svelte/components/shared/__tests__/LinkPreview.test.js +29 -0
  129. package/dist/svelte/components/shared/__tests__/MessageBubble.test.js +21 -0
  130. package/dist/svelte/components/shared/__tests__/ReactionPicker.test.js +35 -0
  131. package/dist/svelte/components/shared/__tests__/ReadReceipts.test.js +28 -0
  132. package/dist/svelte/components/shared/__tests__/TypingIndicator.test.js +27 -0
  133. package/dist/svelte/components/shared/__tests__/UserPresence.test.js +23 -0
  134. package/dist/svelte/components/tabs/ChatTab.svelte +240 -0
  135. package/dist/svelte/components/tabs/ChatTab.svelte.d.ts +21 -0
  136. package/dist/svelte/components/tabs/ChatTab.svelte.d.ts.map +1 -0
  137. package/dist/svelte/components/tabs/ChatTabList.svelte +158 -0
  138. package/dist/svelte/components/tabs/ChatTabList.svelte.d.ts +13 -0
  139. package/dist/svelte/components/tabs/ChatTabList.svelte.d.ts.map +1 -0
  140. package/dist/svelte/components/tabs/ChatTabs.svelte +88 -0
  141. package/dist/svelte/components/tabs/ChatTabs.svelte.d.ts +21 -0
  142. package/dist/svelte/components/tabs/ChatTabs.svelte.d.ts.map +1 -0
  143. package/dist/svelte/components/tabs/MiniChat.svelte +253 -0
  144. package/dist/svelte/components/tabs/MiniChat.svelte.d.ts +15 -0
  145. package/dist/svelte/components/tabs/MiniChat.svelte.d.ts.map +1 -0
  146. package/dist/svelte/i18n.d.ts +51 -0
  147. package/dist/svelte/i18n.d.ts.map +1 -0
  148. package/dist/svelte/i18n.js +72 -0
  149. package/dist/svelte/i18n.messages.d.ts +50 -0
  150. package/dist/svelte/i18n.messages.d.ts.map +1 -0
  151. package/dist/svelte/i18n.messages.js +69 -0
  152. package/dist/svelte/index.d.ts +48 -0
  153. package/dist/svelte/index.d.ts.map +1 -0
  154. package/dist/svelte/index.js +117 -0
  155. package/dist/svelte/playground.d.ts +171 -0
  156. package/dist/svelte/playground.d.ts.map +1 -0
  157. package/dist/svelte/playground.js +161 -0
  158. package/dist/svelte/types.d.ts +116 -0
  159. package/dist/svelte/types.d.ts.map +1 -0
  160. package/dist/svelte/types.js +1 -0
  161. package/dist/types.d.ts +99 -0
  162. package/dist/types.d.ts.map +1 -0
  163. package/dist/types.js +2 -0
  164. package/dist/types.js.map +1 -0
  165. package/dist/ui.d.ts +4 -0
  166. package/dist/ui.d.ts.map +1 -0
  167. package/dist/ui.js +92 -0
  168. package/dist/ui.js.map +1 -0
  169. package/package.json +95 -0
@@ -0,0 +1,253 @@
1
+ <script lang="ts">
2
+ /**
3
+ * MiniChat - Compact chat window for tab mode
4
+ * Simplified message list + input in minimal space.
5
+ * No thread panel, no reactions. Just messages and a send box.
6
+ */
7
+ import { useI18n } from '@happyvertical/smrt-ui/i18n';
8
+ import { M } from '../../i18n.messages.js';
9
+ import type { ChatMessageData } from '../../types.js';
10
+ import Avatar from '../shared/Avatar.svelte';
11
+
12
+ const { t } = useI18n();
13
+
14
+ export interface Props {
15
+ /** Messages to display */
16
+ messages: ChatMessageData[];
17
+ /** Current user's profile ID */
18
+ currentProfileId: string;
19
+ /** Send a message */
20
+ onsend: (content: string) => void;
21
+ /** Maximum height for the message area in px */
22
+ maxHeight?: number;
23
+ }
24
+
25
+ const { messages, currentProfileId, onsend, maxHeight = 360 }: Props = $props();
26
+
27
+ let inputValue = $state('');
28
+ let messageContainer: HTMLDivElement | undefined = $state();
29
+
30
+ function handleSubmit(event: Event) {
31
+ event.preventDefault();
32
+ const trimmed = inputValue.trim();
33
+ if (!trimmed) return;
34
+ onsend(trimmed);
35
+ inputValue = '';
36
+ }
37
+
38
+ function handleKeydown(event: KeyboardEvent) {
39
+ if (event.key === 'Enter' && !event.shiftKey) {
40
+ event.preventDefault();
41
+ handleSubmit(event);
42
+ }
43
+ }
44
+
45
+ function formatTime(date: string | Date): string {
46
+ const d = typeof date === 'string' ? new Date(date) : date;
47
+ return d.toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit' });
48
+ }
49
+
50
+ $effect(() => {
51
+ if (messages.length && messageContainer) {
52
+ messageContainer.scrollTop = messageContainer.scrollHeight;
53
+ }
54
+ });
55
+ </script>
56
+
57
+ <div class="mini-chat">
58
+ <div
59
+ class="mini-chat__messages"
60
+ style:max-height="{maxHeight}px"
61
+ bind:this={messageContainer}
62
+ role="log"
63
+ aria-label={t(M['chat.mini_chat.messages_label'])}
64
+ >
65
+ {#each messages as msg (msg.id)}
66
+ {@const isOwn = msg.senderProfileId === currentProfileId}
67
+ <div class="mini-chat__msg" class:mini-chat__msg--own={isOwn}>
68
+ {#if !isOwn}
69
+ <Avatar name={msg.senderName} avatarUrl={msg.senderAvatarUrl} size="sm" />
70
+ {/if}
71
+ <div class="mini-chat__bubble" class:mini-chat__bubble--own={isOwn}>
72
+ {#if !isOwn}
73
+ <span class="mini-chat__sender">{msg.senderName}</span>
74
+ {/if}
75
+ <span class="mini-chat__text">{msg.content}</span>
76
+ <time class="mini-chat__time">{formatTime(msg.createdAt)}</time>
77
+ </div>
78
+ </div>
79
+ {/each}
80
+
81
+ {#if messages.length === 0}
82
+ <div class="mini-chat__empty">
83
+ <span class="mini-chat__empty-text">{t(M['chat.mini_chat.no_messages'])}</span>
84
+ </div>
85
+ {/if}
86
+ </div>
87
+
88
+ <form class="mini-chat__input-bar" onsubmit={handleSubmit}>
89
+ <input
90
+ class="mini-chat__input"
91
+ type="text"
92
+ placeholder={t(M['chat.mini_chat.placeholder'])}
93
+ bind:value={inputValue}
94
+ onkeydown={handleKeydown}
95
+ aria-label={t(M['chat.mini_chat.input_label'])}
96
+ />
97
+ <button
98
+ class="mini-chat__send-btn"
99
+ type="submit"
100
+ disabled={!inputValue.trim()}
101
+ aria-label={t(M['chat.mini_chat.send'])}
102
+ >
103
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
104
+ <path d="M2.01 21L23 12 2.01 3 2 10l15 2-15 2z" />
105
+ </svg>
106
+ </button>
107
+ </form>
108
+ </div>
109
+
110
+ <style>
111
+ .mini-chat {
112
+ display: flex;
113
+ flex-direction: column;
114
+ height: 100%;
115
+ }
116
+
117
+ .mini-chat__messages {
118
+ flex: 1;
119
+ overflow-y: auto;
120
+ padding: var(--smrt-spacing-2, 8px);
121
+ display: flex;
122
+ flex-direction: column;
123
+ gap: var(--smrt-spacing-2, 8px);
124
+ scroll-behavior: smooth;
125
+ }
126
+
127
+ .mini-chat__msg {
128
+ display: flex;
129
+ align-items: flex-end;
130
+ gap: var(--smrt-spacing-2, 8px);
131
+ max-width: 85%;
132
+ }
133
+
134
+ .mini-chat__msg--own {
135
+ align-self: flex-end;
136
+ flex-direction: row-reverse;
137
+ }
138
+
139
+ .mini-chat__bubble {
140
+ display: flex;
141
+ flex-direction: column;
142
+ gap: var(--smrt-spacing-1, 4px);
143
+ padding: var(--smrt-spacing-2, 8px) var(--smrt-spacing-3, 12px);
144
+ border-radius: var(--smrt-radius-medium, 8px);
145
+ background: var(--smrt-color-surface-container, #f0f0f4);
146
+ color: var(--smrt-color-on-surface, #1a1c1e);
147
+ word-break: break-word;
148
+ }
149
+
150
+ .mini-chat__bubble--own {
151
+ background: var(--smrt-color-primary-container, #d6e3ff);
152
+ color: var(--smrt-color-on-primary-container, #001a41);
153
+ }
154
+
155
+ .mini-chat__sender {
156
+ font-size: var(--smrt-typography-label-small-size, 0.6875rem);
157
+ font-weight: var(--smrt-typography-weight-semibold, 600);
158
+ color: var(--smrt-color-primary, #005ac1);
159
+ line-height: 1;
160
+ }
161
+
162
+ .mini-chat__text {
163
+ font: var(--smrt-typography-body-small-font, 0.8125rem/1.4 sans-serif);
164
+ }
165
+
166
+ .mini-chat__time {
167
+ font-size: var(--smrt-typography-label-small-size, 0.625rem);
168
+ color: var(--smrt-color-outline, #74777f);
169
+ align-self: flex-end;
170
+ line-height: 1;
171
+ }
172
+
173
+ .mini-chat__empty {
174
+ display: flex;
175
+ align-items: center;
176
+ justify-content: center;
177
+ height: 100%;
178
+ min-height: 80px;
179
+ }
180
+
181
+ .mini-chat__empty-text {
182
+ font: var(--smrt-typography-body-small-font, 0.8125rem/1.4 sans-serif);
183
+ color: var(--smrt-color-outline, #74777f);
184
+ }
185
+
186
+ .mini-chat__input-bar {
187
+ display: flex;
188
+ align-items: center;
189
+ gap: var(--smrt-spacing-1, 4px);
190
+ padding: var(--smrt-spacing-2, 8px);
191
+ border-top: 1px solid var(--smrt-color-outline-variant, #c4c6d0);
192
+ background: var(--smrt-color-surface, #fefbff);
193
+ }
194
+
195
+ .mini-chat__input {
196
+ flex: 1;
197
+ border: 1px solid var(--smrt-color-outline-variant, #c4c6d0);
198
+ border-radius: var(--smrt-radius-full, 9999px);
199
+ padding: var(--smrt-spacing-2, 8px) var(--smrt-spacing-3, 12px);
200
+ font: var(--smrt-typography-body-small-font, 0.8125rem/1.4 sans-serif);
201
+ color: var(--smrt-color-on-surface, #1a1c1e);
202
+ background: var(--smrt-color-surface-container-low, #f7f7fb);
203
+ outline: none;
204
+ }
205
+
206
+ .mini-chat__input:focus {
207
+ border-color: var(--smrt-color-primary, #005ac1);
208
+ box-shadow: 0 0 0 1px var(--smrt-color-primary, #005ac1);
209
+ }
210
+
211
+ .mini-chat__input::placeholder {
212
+ color: var(--smrt-color-outline, #74777f);
213
+ }
214
+
215
+ .mini-chat__send-btn {
216
+ display: inline-flex;
217
+ align-items: center;
218
+ justify-content: center;
219
+ width: 32px;
220
+ height: 32px;
221
+ border: none;
222
+ background: var(--smrt-color-primary, #005ac1);
223
+ color: var(--smrt-color-on-primary, #ffffff);
224
+ border-radius: var(--smrt-radius-full, 9999px);
225
+ cursor: pointer;
226
+ flex-shrink: 0;
227
+ transition: opacity var(--smrt-duration-short2, 150ms);
228
+ }
229
+
230
+ .mini-chat__send-btn:disabled {
231
+ opacity: 0.4;
232
+ cursor: not-allowed;
233
+ }
234
+
235
+ .mini-chat__send-btn:not(:disabled):hover {
236
+ opacity: 0.85;
237
+ }
238
+
239
+ .mini-chat__send-btn:focus-visible {
240
+ outline: 2px solid var(--smrt-color-primary, #005ac1);
241
+ outline-offset: 2px;
242
+ }
243
+
244
+ @media (prefers-reduced-motion: reduce) {
245
+ .mini-chat__messages {
246
+ scroll-behavior: auto;
247
+ }
248
+
249
+ .mini-chat__send-btn {
250
+ transition: none;
251
+ }
252
+ }
253
+ </style>
@@ -0,0 +1,15 @@
1
+ import type { ChatMessageData } from '../../types.js';
2
+ export interface Props {
3
+ /** Messages to display */
4
+ messages: ChatMessageData[];
5
+ /** Current user's profile ID */
6
+ currentProfileId: string;
7
+ /** Send a message */
8
+ onsend: (content: string) => void;
9
+ /** Maximum height for the message area in px */
10
+ maxHeight?: number;
11
+ }
12
+ declare const MiniChat: import("svelte").Component<Props, {}, "">;
13
+ type MiniChat = ReturnType<typeof MiniChat>;
14
+ export default MiniChat;
15
+ //# sourceMappingURL=MiniChat.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MiniChat.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/components/tabs/MiniChat.svelte.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAItD,MAAM,WAAW,KAAK;IACpB,0BAA0B;IAC1B,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,gCAAgC;IAChC,gBAAgB,EAAE,MAAM,CAAC;IACzB,qBAAqB;IACrB,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAkFD,QAAA,MAAM,QAAQ,2CAAwC,CAAC;AACvD,KAAK,QAAQ,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC;AAC5C,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,51 @@
1
+ export declare const M: {
2
+ readonly 'chat.agent_chat.conversation': "chat.agent_chat.conversation";
3
+ readonly 'chat.agent_chat.inactive_notice': "chat.agent_chat.inactive_notice";
4
+ readonly 'chat.agent_chat.input_placeholder': "chat.agent_chat.input_placeholder";
5
+ readonly 'chat.agent_chat.message_input': "chat.agent_chat.message_input";
6
+ readonly 'chat.agent_chat.send_message': "chat.agent_chat.send_message";
7
+ readonly 'chat.agent_chat.messages': "chat.agent_chat.messages";
8
+ readonly 'chat.agent_chat.updated_fields': "chat.agent_chat.updated_fields";
9
+ readonly 'chat.agent_chat.empty': "chat.agent_chat.empty";
10
+ readonly 'chat.agent_chat.field_changes': "chat.agent_chat.field_changes";
11
+ readonly 'chat.agent_selector.select_an_agent': "chat.agent_selector.select_an_agent";
12
+ readonly 'chat.agent_selector.title': "chat.agent_selector.title";
13
+ readonly 'chat.agent_selector.available_agents': "chat.agent_selector.available_agents";
14
+ readonly 'chat.agent_selector.empty': "chat.agent_selector.empty";
15
+ readonly 'chat.agent_session_panel.sessions': "chat.agent_session_panel.sessions";
16
+ readonly 'chat.agent_session_panel.new_session': "chat.agent_session_panel.new_session";
17
+ readonly 'chat.agent_session_panel.session_list': "chat.agent_session_panel.session_list";
18
+ readonly 'chat.agent_session_panel.empty': "chat.agent_session_panel.empty";
19
+ readonly 'chat.tool_call_display.tool_call': "chat.tool_call_display.tool_call";
20
+ readonly 'chat.tool_call_display.running': "chat.tool_call_display.running";
21
+ readonly 'chat.room_create_dialog.close': "chat.room_create_dialog.close";
22
+ readonly 'chat.room_create_dialog.title': "chat.room_create_dialog.title";
23
+ readonly 'chat.room_create_dialog.room_name': "chat.room_create_dialog.room_name";
24
+ readonly 'chat.room_create_dialog.required': "chat.room_create_dialog.required";
25
+ readonly 'chat.room_create_dialog.name_placeholder': "chat.room_create_dialog.name_placeholder";
26
+ readonly 'chat.room_create_dialog.room_type': "chat.room_create_dialog.room_type";
27
+ readonly 'chat.room_create_dialog.description_placeholder': "chat.room_create_dialog.description_placeholder";
28
+ readonly 'chat.room_create_dialog.create_room': "chat.room_create_dialog.create_room";
29
+ readonly 'chat.search_messages.search': "chat.search_messages.search";
30
+ readonly 'chat.search_messages.title': "chat.search_messages.title";
31
+ readonly 'chat.search_messages.close': "chat.search_messages.close";
32
+ readonly 'chat.search_messages.input_placeholder': "chat.search_messages.input_placeholder";
33
+ readonly 'chat.search_messages.query': "chat.search_messages.query";
34
+ readonly 'chat.search_messages.clear': "chat.search_messages.clear";
35
+ readonly 'chat.search_messages.results': "chat.search_messages.results";
36
+ readonly 'chat.search_messages.results_count': "chat.search_messages.results_count";
37
+ readonly 'chat.search_messages.no_results': "chat.search_messages.no_results";
38
+ readonly 'chat.search_messages.no_results_hint': "chat.search_messages.no_results_hint";
39
+ readonly 'chat.search_messages.empty': "chat.search_messages.empty";
40
+ readonly 'chat.file_upload.preview': "chat.file_upload.preview";
41
+ readonly 'chat.file_upload.remove': "chat.file_upload.remove";
42
+ readonly 'chat.file_upload.upload_files': "chat.file_upload.upload_files";
43
+ readonly 'chat.file_upload.disabled': "chat.file_upload.disabled";
44
+ readonly 'chat.file_upload.drop_files': "chat.file_upload.drop_files";
45
+ readonly 'chat.file_upload.max_size': "chat.file_upload.max_size";
46
+ readonly 'chat.mention_autocomplete.suggestions': "chat.mention_autocomplete.suggestions";
47
+ readonly 'chat.reaction_picker.reactions': "chat.reaction_picker.reactions";
48
+ readonly 'chat.reaction_picker.react_with': "chat.reaction_picker.react_with";
49
+ readonly 'chat.read_receipts.read_status': "chat.read_receipts.read_status";
50
+ };
51
+ //# sourceMappingURL=i18n.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../../src/svelte/i18n.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqEZ,CAAC"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * smrt-chat Svelte component message catalog (Sweep S13 #1418).
3
+ *
4
+ * English code defaults for user-facing strings in the chat components under
5
+ * `src/svelte/components/`. Keys use the `chat.` namespace
6
+ * (`chat.<component>.<descriptor>`). Importing this module registers the
7
+ * defaults so `useI18n().t` renders correctly even without a server snapshot.
8
+ *
9
+ * `M` is a typed key map — `M['chat.agent_chat.empty']` is the key literal — so
10
+ * component call sites stay typo-safe.
11
+ */
12
+ import { defineMessages } from '@happyvertical/smrt-ui/i18n';
13
+ export const M = defineMessages({
14
+ // AgentChat
15
+ 'chat.agent_chat.conversation': 'Agent conversation',
16
+ 'chat.agent_chat.inactive_notice': 'Session {status}. Cannot send messages.',
17
+ 'chat.agent_chat.input_placeholder': 'Ask the AI to write or edit content...',
18
+ 'chat.agent_chat.message_input': 'Message input',
19
+ 'chat.agent_chat.send_message': 'Send message',
20
+ 'chat.agent_chat.messages': 'Conversation messages',
21
+ 'chat.agent_chat.updated_fields': '✓ Updated {count} field{plural}',
22
+ 'chat.agent_chat.empty': 'Ask the AI to write or edit your content',
23
+ 'chat.agent_chat.field_changes': 'Field Changes',
24
+ // AgentSelector
25
+ 'chat.agent_selector.select_an_agent': 'Select an agent',
26
+ 'chat.agent_selector.title': 'Choose an Agent',
27
+ 'chat.agent_selector.available_agents': 'Available agents',
28
+ 'chat.agent_selector.empty': 'No agents available',
29
+ // AgentSessionPanel
30
+ 'chat.agent_session_panel.sessions': 'Agent sessions',
31
+ 'chat.agent_session_panel.new_session': 'New session',
32
+ 'chat.agent_session_panel.session_list': 'Session list',
33
+ 'chat.agent_session_panel.empty': 'No sessions yet',
34
+ // ToolCallDisplay
35
+ 'chat.tool_call_display.tool_call': 'Tool call: {toolName}',
36
+ 'chat.tool_call_display.running': 'Running',
37
+ // RoomCreateDialog
38
+ 'chat.room_create_dialog.close': 'Close room creation dialog',
39
+ 'chat.room_create_dialog.title': 'Create a Room',
40
+ 'chat.room_create_dialog.room_name': 'Room Name',
41
+ 'chat.room_create_dialog.required': 'required',
42
+ 'chat.room_create_dialog.name_placeholder': 'e.g. general, project-updates',
43
+ 'chat.room_create_dialog.room_type': 'Room Type',
44
+ 'chat.room_create_dialog.description_placeholder': 'What is this room about?',
45
+ 'chat.room_create_dialog.create_room': 'Create Room',
46
+ // SearchMessages
47
+ 'chat.search_messages.search': 'Search messages',
48
+ 'chat.search_messages.title': 'Search Messages',
49
+ 'chat.search_messages.close': 'Close search',
50
+ 'chat.search_messages.input_placeholder': 'Search messages...',
51
+ 'chat.search_messages.query': 'Search query',
52
+ 'chat.search_messages.clear': 'Clear search',
53
+ 'chat.search_messages.results': 'Search results',
54
+ 'chat.search_messages.results_count': '{count} result{plural} found',
55
+ 'chat.search_messages.no_results': 'No messages found for "{query}"',
56
+ 'chat.search_messages.no_results_hint': 'Try different keywords or check your spelling',
57
+ 'chat.search_messages.empty': 'Enter a search term to find messages',
58
+ // FileUpload
59
+ 'chat.file_upload.preview': 'Files to upload',
60
+ 'chat.file_upload.remove': 'Remove {name}',
61
+ 'chat.file_upload.upload_files': 'Upload {count} file{plural}',
62
+ 'chat.file_upload.disabled': 'Upload disabled',
63
+ 'chat.file_upload.drop_files': 'Drop files here or click to browse',
64
+ 'chat.file_upload.max_size': 'Max {size} per file',
65
+ // MentionAutocomplete
66
+ 'chat.mention_autocomplete.suggestions': 'Mention suggestions',
67
+ // ReactionPicker
68
+ 'chat.reaction_picker.reactions': 'Emoji reactions',
69
+ 'chat.reaction_picker.react_with': 'React with {emoji}',
70
+ // ReadReceipts
71
+ 'chat.read_receipts.read_status': '{readCount} of {total} read',
72
+ });
@@ -0,0 +1,50 @@
1
+ export declare const M: {
2
+ readonly 'chat.chat_layout.rooms_label': "chat.chat_layout.rooms_label";
3
+ readonly 'chat.chat_layout.resize_sidebar': "chat.chat_layout.resize_sidebar";
4
+ readonly 'chat.member_list.room_members': "chat.member_list.room_members";
5
+ readonly 'chat.member_list.close': "chat.member_list.close";
6
+ readonly 'chat.member_list.empty': "chat.member_list.empty";
7
+ readonly 'chat.room_header.room_label': "chat.room_header.room_label";
8
+ readonly 'chat.room_header.show_members': "chat.room_header.show_members";
9
+ readonly 'chat.room_header.members': "chat.room_header.members";
10
+ readonly 'chat.room_header.search_messages': "chat.room_header.search_messages";
11
+ readonly 'chat.room_header.search': "chat.room_header.search";
12
+ readonly 'chat.room_list.rooms_label': "chat.room_list.rooms_label";
13
+ readonly 'chat.room_list.create_new_room': "chat.room_list.create_new_room";
14
+ readonly 'chat.room_list.new_room': "chat.room_list.new_room";
15
+ readonly 'chat.room_list.direct_messages': "chat.room_list.direct_messages";
16
+ readonly 'chat.room_list.unread_messages': "chat.room_list.unread_messages";
17
+ readonly 'chat.room_list.no_rooms': "chat.room_list.no_rooms";
18
+ readonly 'chat.room_list.create_first_room': "chat.room_list.create_first_room";
19
+ readonly 'chat.message_input.cancel_reply': "chat.message_input.cancel_reply";
20
+ readonly 'chat.message_input.input_label': "chat.message_input.input_label";
21
+ readonly 'chat.message_input.send': "chat.message_input.send";
22
+ readonly 'chat.message_item.message_from': "chat.message_item.message_from";
23
+ readonly 'chat.message_item.add_reaction': "chat.message_item.add_reaction";
24
+ readonly 'chat.message_item.reply': "chat.message_item.reply";
25
+ readonly 'chat.message_item.edit': "chat.message_item.edit";
26
+ readonly 'chat.message_item.delete': "chat.message_item.delete";
27
+ readonly 'chat.message_list.messages_label': "chat.message_list.messages_label";
28
+ readonly 'chat.message_list.no_messages': "chat.message_list.no_messages";
29
+ readonly 'chat.thread_panel.thread_label': "chat.thread_panel.thread_label";
30
+ readonly 'chat.thread_panel.close': "chat.thread_panel.close";
31
+ readonly 'chat.thread_panel.reply_placeholder': "chat.thread_panel.reply_placeholder";
32
+ readonly 'chat.chat_tab.chat_with': "chat.chat_tab.chat_with";
33
+ readonly 'chat.chat_tab.collapse': "chat.chat_tab.collapse";
34
+ readonly 'chat.chat_tab.minimize': "chat.chat_tab.minimize";
35
+ readonly 'chat.chat_tab.close': "chat.chat_tab.close";
36
+ readonly 'chat.chat_tab.open_chat_with': "chat.chat_tab.open_chat_with";
37
+ readonly 'chat.chat_tab.unread': "chat.chat_tab.unread";
38
+ readonly 'chat.chat_tab_list.minimized_chats': "chat.chat_tab_list.minimized_chats";
39
+ readonly 'chat.chat_tab_list.open_chat_with': "chat.chat_tab_list.open_chat_with";
40
+ readonly 'chat.chat_tab_list.unread': "chat.chat_tab_list.unread";
41
+ readonly 'chat.chat_tab_list.close_chat_with': "chat.chat_tab_list.close_chat_with";
42
+ readonly 'chat.chat_tab_list.close': "chat.chat_tab_list.close";
43
+ readonly 'chat.chat_tabs.tabs_label': "chat.chat_tabs.tabs_label";
44
+ readonly 'chat.mini_chat.messages_label': "chat.mini_chat.messages_label";
45
+ readonly 'chat.mini_chat.no_messages': "chat.mini_chat.no_messages";
46
+ readonly 'chat.mini_chat.placeholder': "chat.mini_chat.placeholder";
47
+ readonly 'chat.mini_chat.input_label': "chat.mini_chat.input_label";
48
+ readonly 'chat.mini_chat.send': "chat.mini_chat.send";
49
+ };
50
+ //# sourceMappingURL=i18n.messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.messages.d.ts","sourceRoot":"","sources":["../../src/svelte/i18n.messages.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuEZ,CAAC"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Chat component message catalog (i18n, Sweep S13 #1418).
3
+ *
4
+ * English code defaults for user-facing strings in the chat Svelte components
5
+ * under `tabs/`, `messages/`, and `layout/`. Keys follow
6
+ * `chat.<component>.<descriptor>`.
7
+ */
8
+ import { defineMessages } from '@happyvertical/smrt-ui/i18n';
9
+ export const M = defineMessages({
10
+ // ChatLayout
11
+ 'chat.chat_layout.rooms_label': 'Chat rooms',
12
+ 'chat.chat_layout.resize_sidebar': 'Resize sidebar',
13
+ // MemberList
14
+ 'chat.member_list.room_members': 'Room members',
15
+ 'chat.member_list.close': 'Close member list',
16
+ 'chat.member_list.empty': 'No members',
17
+ // RoomHeader
18
+ 'chat.room_header.room_label': 'Room: {name}',
19
+ 'chat.room_header.show_members': 'Show members ({count})',
20
+ 'chat.room_header.members': 'Members',
21
+ 'chat.room_header.search_messages': 'Search messages',
22
+ 'chat.room_header.search': 'Search',
23
+ // RoomList
24
+ 'chat.room_list.rooms_label': 'Chat rooms',
25
+ 'chat.room_list.create_new_room': 'Create new room',
26
+ 'chat.room_list.new_room': '+ New Room',
27
+ 'chat.room_list.direct_messages': 'Direct Messages',
28
+ 'chat.room_list.unread_messages': '{count} unread messages',
29
+ 'chat.room_list.no_rooms': 'No rooms yet',
30
+ 'chat.room_list.create_first_room': 'Create your first room',
31
+ // MessageInput
32
+ 'chat.message_input.cancel_reply': 'Cancel reply',
33
+ 'chat.message_input.input_label': 'Message input',
34
+ 'chat.message_input.send': 'Send message',
35
+ // MessageItem
36
+ 'chat.message_item.message_from': 'Message from {name}',
37
+ 'chat.message_item.add_reaction': 'Add reaction',
38
+ 'chat.message_item.reply': 'Reply',
39
+ 'chat.message_item.edit': 'Edit',
40
+ 'chat.message_item.delete': 'Delete',
41
+ // MessageList
42
+ 'chat.message_list.messages_label': 'Messages',
43
+ 'chat.message_list.no_messages': 'No messages yet',
44
+ // ThreadPanel
45
+ 'chat.thread_panel.thread_label': 'Thread: {title}',
46
+ 'chat.thread_panel.close': 'Close thread',
47
+ 'chat.thread_panel.reply_placeholder': 'Reply in thread...',
48
+ // ChatTab
49
+ 'chat.chat_tab.chat_with': 'Chat with {name}',
50
+ 'chat.chat_tab.collapse': 'Collapse chat',
51
+ 'chat.chat_tab.minimize': 'Minimize',
52
+ 'chat.chat_tab.close': 'Close',
53
+ 'chat.chat_tab.open_chat_with': 'Open chat with {name}',
54
+ 'chat.chat_tab.unread': '{count} unread',
55
+ // ChatTabList
56
+ 'chat.chat_tab_list.minimized_chats': 'Minimized chats',
57
+ 'chat.chat_tab_list.open_chat_with': 'Open chat with {name}',
58
+ 'chat.chat_tab_list.unread': '{count} unread',
59
+ 'chat.chat_tab_list.close_chat_with': 'Close chat with {name}',
60
+ 'chat.chat_tab_list.close': 'Close',
61
+ // ChatTabs
62
+ 'chat.chat_tabs.tabs_label': 'Chat tabs',
63
+ // MiniChat
64
+ 'chat.mini_chat.messages_label': 'Chat messages',
65
+ 'chat.mini_chat.no_messages': 'No messages yet',
66
+ 'chat.mini_chat.placeholder': 'Type a message...',
67
+ 'chat.mini_chat.input_label': 'Message input',
68
+ 'chat.mini_chat.send': 'Send message',
69
+ });
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Chat Svelte Components
3
+ *
4
+ * This module auto-registers all chat UI components with the ModuleUIRegistry
5
+ * when imported. Import this module to enable registry-based component discovery.
6
+ *
7
+ * @example Direct imports
8
+ * ```typescript
9
+ * import { ChatLayout, MessageList, MessageInput } from '@happyvertical/smrt-chat/svelte';
10
+ * ```
11
+ *
12
+ * @example Registry-based discovery
13
+ * ```typescript
14
+ * import { ModuleUIRegistry } from '@happyvertical/smrt-ui/registry';
15
+ * import '@happyvertical/smrt-chat/svelte'; // Auto-registers components
16
+ *
17
+ * const Component = ModuleUIRegistry.get('@happyvertical/smrt-chat', 'chat-layout');
18
+ * ```
19
+ */
20
+ export { default as AgentChat } from './components/agent/AgentChat.svelte';
21
+ export { default as AgentSelector } from './components/agent/AgentSelector.svelte';
22
+ export { default as AgentSessionPanel } from './components/agent/AgentSessionPanel.svelte';
23
+ export { default as ToolCallDisplay } from './components/agent/ToolCallDisplay.svelte';
24
+ export { default as RoomCreateDialog } from './components/dialogs/RoomCreateDialog.svelte';
25
+ export { default as SearchMessages } from './components/dialogs/SearchMessages.svelte';
26
+ export { default as ChatLayout } from './components/layout/ChatLayout.svelte';
27
+ export { default as MemberList } from './components/layout/MemberList.svelte';
28
+ export { default as RoomHeader } from './components/layout/RoomHeader.svelte';
29
+ export { default as RoomList } from './components/layout/RoomList.svelte';
30
+ export { default as MessageInput } from './components/messages/MessageInput.svelte';
31
+ export { default as MessageItem } from './components/messages/MessageItem.svelte';
32
+ export { default as MessageList } from './components/messages/MessageList.svelte';
33
+ export { default as ThreadPanel } from './components/messages/ThreadPanel.svelte';
34
+ export { default as Avatar } from './components/shared/Avatar.svelte';
35
+ export { default as FileUpload } from './components/shared/FileUpload.svelte';
36
+ export { default as LinkPreview } from './components/shared/LinkPreview.svelte';
37
+ export { default as MentionAutocomplete } from './components/shared/MentionAutocomplete.svelte';
38
+ export { default as MessageBubble } from './components/shared/MessageBubble.svelte';
39
+ export { default as ReactionPicker } from './components/shared/ReactionPicker.svelte';
40
+ export { default as ReadReceipts } from './components/shared/ReadReceipts.svelte';
41
+ export { default as TypingIndicator } from './components/shared/TypingIndicator.svelte';
42
+ export { default as UserPresence } from './components/shared/UserPresence.svelte';
43
+ export { default as ChatTab } from './components/tabs/ChatTab.svelte';
44
+ export { default as ChatTabList } from './components/tabs/ChatTabList.svelte';
45
+ export { default as ChatTabs } from './components/tabs/ChatTabs.svelte';
46
+ export { default as MiniChat } from './components/tabs/MiniChat.svelte';
47
+ export type { AgentDescriptor, AgentSessionData, ChatAttachmentData, ChatMessageData, ChatParticipantData, ChatRoomData, ChatTabState, ChatThreadData, ReactionSummary, ToolCallDisplayData, } from './types.js';
48
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/svelte/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAsCH,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,yCAAyC,CAAC;AACnF,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,6CAA6C,CAAC;AAC3F,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,2CAA2C,CAAC;AACvF,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,8CAA8C,CAAC;AAC3F,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAEvF,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACpF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,0CAA0C,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,0CAA0C,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,0CAA0C,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,gDAAgD,CAAC;AAChG,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,0CAA0C,CAAC;AACpF,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,2CAA2C,CAAC;AACtF,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,yCAAyC,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,4CAA4C,CAAC;AACxF,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,yCAAyC,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAGxE,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EACf,mBAAmB,EACnB,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,eAAe,EACf,mBAAmB,GACpB,MAAM,YAAY,CAAC"}