@messenger-box/tailwind-ui-inbox 10.0.3-alpha.73 → 10.0.3-alpha.74

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 (145) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/lib/components/AIAgent/AIAgent.d.ts +7 -0
  3. package/lib/components/AIAgent/AIAgent.d.ts.map +1 -1
  4. package/lib/components/AIAgent/AIAgent.js +362 -615
  5. package/lib/components/AIAgent/AIAgent.js.map +1 -1
  6. package/lib/components/InboxMessage/InputComponent.d.ts.map +1 -1
  7. package/lib/components/InboxMessage/InputComponent.js +143 -140
  8. package/lib/components/InboxMessage/InputComponent.js.map +1 -1
  9. package/lib/components/InboxMessage/RightSidebarAi.d.ts +23 -0
  10. package/lib/components/InboxMessage/RightSidebarAi.d.ts.map +1 -0
  11. package/lib/components/InboxMessage/RightSidebarAi.js +9 -0
  12. package/lib/components/InboxMessage/RightSidebarAi.js.map +1 -0
  13. package/lib/components/InboxMessage/index.d.ts +1 -0
  14. package/lib/components/InboxMessage/index.d.ts.map +1 -1
  15. package/lib/components/InboxMessage/message-widgets/ErrorFixCard.d.ts +11 -0
  16. package/lib/components/InboxMessage/message-widgets/ErrorFixCard.d.ts.map +1 -0
  17. package/lib/components/InboxMessage/message-widgets/ErrorFixCard.js +194 -0
  18. package/lib/components/InboxMessage/message-widgets/ErrorFixCard.js.map +1 -0
  19. package/lib/components/InboxMessage/message-widgets/ModernMessageGroup.d.ts +5 -1
  20. package/lib/components/InboxMessage/message-widgets/ModernMessageGroup.d.ts.map +1 -1
  21. package/lib/components/InboxMessage/message-widgets/ModernMessageGroup.js +308 -857
  22. package/lib/components/InboxMessage/message-widgets/ModernMessageGroup.js.map +1 -1
  23. package/lib/components/ModelConfigPanel.d.ts +12 -0
  24. package/lib/components/ModelConfigPanel.d.ts.map +1 -0
  25. package/lib/components/ModelConfigPanel.js +304 -0
  26. package/lib/components/ModelConfigPanel.js.map +1 -0
  27. package/lib/components/filler-components/RightSiderBar.d.ts +24 -0
  28. package/lib/components/filler-components/RightSiderBar.d.ts.map +1 -0
  29. package/lib/components/filler-components/RightSiderBar.js +335 -0
  30. package/lib/components/filler-components/RightSiderBar.js.map +1 -0
  31. package/lib/components/index.d.ts +4 -2
  32. package/lib/components/index.d.ts.map +1 -1
  33. package/lib/components/live-code-editor/hybrid-live-editor.d.ts +20 -0
  34. package/lib/components/live-code-editor/hybrid-live-editor.d.ts.map +1 -0
  35. package/lib/components/live-code-editor/hybrid-live-editor.js +68 -0
  36. package/lib/components/live-code-editor/hybrid-live-editor.js.map +1 -0
  37. package/lib/components/live-code-editor/index.d.ts +4 -0
  38. package/lib/components/live-code-editor/index.d.ts.map +1 -0
  39. package/lib/components/live-code-editor/live-code-editor.d.ts +14 -0
  40. package/lib/components/live-code-editor/live-code-editor.d.ts.map +1 -0
  41. package/lib/components/live-code-editor/live-code-editor.js +207 -0
  42. package/lib/components/live-code-editor/live-code-editor.js.map +1 -0
  43. package/lib/components/slot-fill/chat-message-filler.js +1 -1
  44. package/lib/components/slot-fill/chat-message-filler.js.map +1 -1
  45. package/lib/components/slot-fill/index.d.ts +1 -0
  46. package/lib/components/slot-fill/index.d.ts.map +1 -1
  47. package/lib/components/slot-fill/right-sidebar-filler.d.ts +4 -0
  48. package/lib/components/slot-fill/right-sidebar-filler.d.ts.map +1 -0
  49. package/lib/components/slot-fill/right-sidebar-filler.js +13 -0
  50. package/lib/components/slot-fill/right-sidebar-filler.js.map +1 -0
  51. package/lib/components/ui/button.d.ts +9 -0
  52. package/lib/components/ui/button.d.ts.map +1 -0
  53. package/lib/compute.js +1 -2
  54. package/lib/container/AiInbox.d.ts.map +1 -1
  55. package/lib/container/AiLandingInput.d.ts.map +1 -1
  56. package/lib/container/AiLandingInput.js +46 -119
  57. package/lib/container/AiLandingInput.js.map +1 -1
  58. package/lib/container/Inbox.js +1 -1
  59. package/lib/container/Inbox.js.map +1 -1
  60. package/lib/container/InboxAiMessagesLoader.d.ts +0 -21
  61. package/lib/container/InboxAiMessagesLoader.d.ts.map +1 -1
  62. package/lib/container/InboxAiMessagesLoader.js +18 -32
  63. package/lib/container/InboxAiMessagesLoader.js.map +1 -1
  64. package/lib/container/ServiceInbox.js +1 -1
  65. package/lib/container/ServiceInbox.js.map +1 -1
  66. package/lib/container/ThreadMessages.js +1 -1
  67. package/lib/container/ThreadMessages.js.map +1 -1
  68. package/lib/container/ThreadMessagesInbox.js +1 -1
  69. package/lib/container/ThreadMessagesInbox.js.map +1 -1
  70. package/lib/container/Threads.js +1 -1
  71. package/lib/container/Threads.js.map +1 -1
  72. package/lib/container/index.d.ts +2 -1
  73. package/lib/container/index.d.ts.map +1 -1
  74. package/lib/enums/messenger-slot-fill-name-enum.d.ts +2 -1
  75. package/lib/enums/messenger-slot-fill-name-enum.d.ts.map +1 -1
  76. package/lib/enums/messenger-slot-fill-name-enum.js +1 -0
  77. package/lib/enums/messenger-slot-fill-name-enum.js.map +1 -1
  78. package/lib/hooks/index.d.ts +3 -0
  79. package/lib/hooks/index.d.ts.map +1 -0
  80. package/lib/hooks/use-file-sync.d.ts +16 -0
  81. package/lib/hooks/use-file-sync.d.ts.map +1 -0
  82. package/lib/hooks/use-file-sync.js +63 -0
  83. package/lib/hooks/use-file-sync.js.map +1 -0
  84. package/lib/hooks/usePersistentModelConfig.d.ts +15 -0
  85. package/lib/hooks/usePersistentModelConfig.d.ts.map +1 -0
  86. package/lib/hooks/usePersistentModelConfig.js +46 -0
  87. package/lib/hooks/usePersistentModelConfig.js.map +1 -0
  88. package/lib/index.d.ts +4 -2
  89. package/lib/index.d.ts.map +1 -1
  90. package/lib/index.js +1 -1
  91. package/lib/machines/aiAgentMachine.d.ts.map +1 -1
  92. package/lib/machines/aiAgentMachine.js +64 -21
  93. package/lib/machines/aiAgentMachine.js.map +1 -1
  94. package/lib/machines/aiAgentMachine.simple.d.ts +3 -0
  95. package/lib/machines/aiAgentMachine.simple.d.ts.map +1 -0
  96. package/lib/machines/aiAgentMachine.simple.js +108 -0
  97. package/lib/machines/aiAgentMachine.simple.js.map +1 -0
  98. package/lib/machines/index.d.ts +3 -0
  99. package/lib/machines/index.d.ts.map +1 -0
  100. package/lib/module.d.ts +2 -1
  101. package/lib/module.d.ts.map +1 -1
  102. package/lib/module.js +11 -3
  103. package/lib/module.js.map +1 -1
  104. package/lib/routes.json +1 -2
  105. package/lib/templates/InboxWithAi.d.ts.map +1 -1
  106. package/lib/templates/InboxWithAi.js +129 -70
  107. package/lib/templates/InboxWithAi.js.map +1 -1
  108. package/lib/templates/InboxWithAi.tsx +151 -90
  109. package/lib/utils/utils.d.ts +2 -0
  110. package/lib/utils/utils.d.ts.map +1 -0
  111. package/lib/utils/utils.js +3 -0
  112. package/lib/utils/utils.js.map +1 -0
  113. package/package.json +8 -5
  114. package/src/components/AIAgent/AIAgent.tsx +469 -731
  115. package/src/components/AIAgent/AIAgent.tsx.bk +1365 -0
  116. package/src/components/InboxMessage/InputComponent.tsx +2 -1
  117. package/src/components/InboxMessage/RightSidebarAi.tsx +37 -0
  118. package/src/components/InboxMessage/index.ts +1 -0
  119. package/src/components/InboxMessage/message-widgets/ErrorFixCard.tsx +240 -0
  120. package/src/components/InboxMessage/message-widgets/ModernMessageGroup.tsx +337 -1116
  121. package/src/components/ModelConfigPanel.tsx +334 -0
  122. package/src/components/filler-components/RightSiderBar.tsx +408 -0
  123. package/src/components/index.ts +4 -1
  124. package/src/components/live-code-editor/hybrid-live-editor.tsx +105 -0
  125. package/src/components/live-code-editor/index.ts +3 -0
  126. package/src/components/live-code-editor/live-code-editor.tsx +257 -0
  127. package/src/components/slot-fill/index.ts +1 -0
  128. package/src/components/slot-fill/right-sidebar-filler.tsx +39 -0
  129. package/src/components/ui/button.tsx +32 -0
  130. package/src/container/AiInbox.tsx +26 -3
  131. package/src/container/AiLandingInput.tsx +48 -22
  132. package/src/container/InboxAiMessagesLoader.tsx +17 -31
  133. package/src/container/index.ts +2 -0
  134. package/src/enums/messenger-slot-fill-name-enum.ts +1 -0
  135. package/src/hooks/index.ts +2 -0
  136. package/src/hooks/use-file-sync.ts +91 -0
  137. package/src/hooks/usePersistentModelConfig.ts +63 -0
  138. package/src/index.ts +7 -0
  139. package/src/machines/aiAgentMachine.simple.ts +89 -0
  140. package/src/machines/aiAgentMachine.ts +67 -19
  141. package/src/machines/aiAgentMachine.ts.bk +1296 -0
  142. package/src/machines/index.ts +2 -0
  143. package/src/module.tsx +10 -1
  144. package/src/templates/InboxWithAi.tsx +151 -90
  145. package/src/utils/utils.ts +3 -0
@@ -0,0 +1,335 @@
1
+ import*as React from'react';import {HybridLiveEditor}from'../live-code-editor/hybrid-live-editor.js';import {useOnChatMessageAddedSubscription}from'common/graphql';const RightSidebarFillComponent = props => {
2
+ const {
3
+ channelId,
4
+ detailSidebarOptions,
5
+ windowWidth,
6
+ windowHeight,
7
+ activeTab,
8
+ messages,
9
+ selectedPost,
10
+ setIsLoading,
11
+ isLoading
12
+ } = props;
13
+ const hybridLiveEditorRef = React.useRef(null);
14
+ const previewIframeRef = React.useRef(null);
15
+ // State for subscription data and active fragment
16
+ const [subscriptionData, setSubscriptionData] = React.useState(null);
17
+ const [activeFragment, setActiveFragment] = React.useState(null);
18
+ const [currentFiles, setCurrentFiles] = React.useState({});
19
+ const [canvasLayers, setCanvasLayers] = React.useState([]);
20
+ // const [isLoading, setIsLoading] = React.useState(false);
21
+ // Component mount tracking
22
+ React.useMemo(() => `right-sidebar-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`, []);
23
+ const handleCopyToClipboard = React.useCallback(text => {
24
+ navigator.clipboard.writeText(text);
25
+ }, []);
26
+ const handleFileUpdate = React.useCallback(async (filePath, content) => {
27
+ // TODO: Implement file update logic for the channel
28
+ console.log('File update:', {
29
+ filePath,
30
+ content
31
+ });
32
+ }, []);
33
+ // Create complete file context by merging currentFiles with activeFragment files
34
+ const completeFileContext = React.useMemo(() => {
35
+ if (!activeFragment?.files) {
36
+ console.log('📂 Using currentFiles as complete context (no activeFragment.files)');
37
+ return currentFiles;
38
+ }
39
+ // Merge currentFiles with activeFragment files, giving priority to activeFragment files
40
+ const merged = {
41
+ ...currentFiles
42
+ };
43
+ // Override with activeFragment files (these are the most recent changes)
44
+ Object.entries(activeFragment.files).forEach(([path, content]) => {
45
+ merged[path] = content;
46
+ });
47
+ // Validate file context integrity
48
+ const hasPackageJson = 'package.json' in merged;
49
+ const hasMainFiles = Object.keys(merged).some(path => path.includes('index.') || path.includes('main.') || path.includes('App.') || path.includes('src/'));
50
+ console.log('📂 Complete file context created:', {
51
+ currentFilesCount: Object.keys(currentFiles).length,
52
+ activeFragmentFilesCount: Object.keys(activeFragment.files).length,
53
+ mergedFilesCount: Object.keys(merged).length,
54
+ hasPackageJson,
55
+ hasMainFiles,
56
+ activeFragmentFiles: Object.keys(activeFragment.files),
57
+ allFiles: Object.keys(merged),
58
+ validation: {
59
+ isComplete: hasPackageJson && hasMainFiles,
60
+ missingPackageJson: !hasPackageJson,
61
+ missingMainFiles: !hasMainFiles
62
+ }
63
+ });
64
+ if (!hasPackageJson) {
65
+ console.warn('⚠️ File context missing package.json - this may cause issues in sandbox');
66
+ }
67
+ if (!hasMainFiles) {
68
+ console.warn('⚠️ File context missing main application files - this may cause issues in sandbox');
69
+ }
70
+ return merged;
71
+ }, [currentFiles, activeFragment?.files]);
72
+ // Determine if we should show preview or editor based on activeTab
73
+ const isPreviewMode = activeTab === 'preview';
74
+ const {
75
+ data: chatMessageAddedData
76
+ } = useOnChatMessageAddedSubscription({
77
+ variables: {
78
+ channelId: channelId?.toString() || ''
79
+ },
80
+ skip: !channelId
81
+ });
82
+ // Turn on loader when new data is about to be processed
83
+ React.useEffect(() => {
84
+ if (chatMessageAddedData?.chatMessageAdded || selectedPost) ;
85
+ }, [chatMessageAddedData, selectedPost]);
86
+ // Handle subscription data updates - prefer response update structure like use-ai-messages.ts
87
+ React.useEffect(() => {
88
+ if (chatMessageAddedData?.chatMessageAdded || selectedPost) {
89
+ // Prefer explicitly selected post to ensure UI updates when it changes
90
+ const message = selectedPost || chatMessageAddedData?.chatMessageAdded;
91
+ // console.log('=== SUBSCRIPTION MESSAGE DEBUG ===');
92
+ // console.log('Full message:', JSON.stringify(message, null, 2));
93
+ // console.log('Message props:', message.props);
94
+ // console.log('Message propsConfiguration:', message.propsConfiguration);
95
+ // Extract strictly from message.propsConfiguration (fragment only)
96
+ let extracted = null;
97
+ let fragmentSource = null;
98
+ try {
99
+ // 1) Preferred: contents.props.fragment
100
+ const cfg = message.propsConfiguration || {};
101
+ const contents = cfg.contents || cfg.content || {};
102
+ if (contents?.props?.fragment) {
103
+ const frag = contents.props.fragment;
104
+ extracted = {
105
+ sandboxUrl: frag.sandboxUrl || frag.url,
106
+ sandboxId: frag.sandboxId,
107
+ projectId: cfg.projectId || contents.projectId || frag.projectId,
108
+ modelConfig: cfg.modelConfig || contents.modelConfig || frag.modelConfig,
109
+ files: frag.files || {},
110
+ canvasLayers: contents.canvasLayers || cfg.canvasLayers || frag.canvasLayers,
111
+ summary: contents.summary || cfg.summary || frag.summary,
112
+ title: frag.title || contents.title || cfg.title,
113
+ isError: frag.isError
114
+ };
115
+ fragmentSource = 'propsConfiguration.contents.props.fragment';
116
+ }
117
+ // 2) Fallback: contents.fragment
118
+ if (!extracted && contents?.fragment) {
119
+ const frag = contents.fragment;
120
+ extracted = {
121
+ sandboxUrl: frag.sandboxUrl || frag.url,
122
+ sandboxId: frag.sandboxId,
123
+ projectId: cfg.projectId || contents.projectId || frag.projectId,
124
+ modelConfig: cfg.modelConfig || contents.modelConfig || frag.modelConfig,
125
+ files: frag.files || {},
126
+ canvasLayers: contents.canvasLayers || cfg.canvasLayers || frag.canvasLayers,
127
+ summary: contents.summary || cfg.summary || frag.summary,
128
+ title: frag.title || contents.title || cfg.title,
129
+ isError: frag.isError
130
+ };
131
+ fragmentSource = 'propsConfiguration.contents.fragment';
132
+ }
133
+ // 3) Fallback: propsConfiguration.fragment (top-level)
134
+ if (!extracted && cfg?.fragment) {
135
+ const frag = cfg.fragment;
136
+ extracted = {
137
+ sandboxUrl: frag.sandboxUrl || frag.url,
138
+ sandboxId: frag.sandboxId,
139
+ projectId: cfg.projectId || frag.projectId,
140
+ modelConfig: cfg.modelConfig || frag.modelConfig,
141
+ files: frag.files || {},
142
+ canvasLayers: cfg.canvasLayers || frag.canvasLayers,
143
+ summary: cfg.summary || frag.summary,
144
+ title: frag.title || cfg.title,
145
+ isError: frag.isError
146
+ };
147
+ fragmentSource = 'propsConfiguration.fragment';
148
+ }
149
+ } catch (error) {
150
+ console.error('Error extracting response from message:', error);
151
+ }
152
+ // console.log('Extracted response fragment source:', fragmentSource);
153
+ // console.log('Extracted response:', extracted);
154
+ if (extracted && (extracted.sandboxUrl || extracted.url)) {
155
+ console.log('✅ Processing response update:', extracted);
156
+ // Update subscription data snapshot
157
+ setSubscriptionData(extracted);
158
+ // Build active fragment
159
+ const fragment = {
160
+ id: message.id,
161
+ sandboxUrl: extracted.sandboxUrl || extracted.url,
162
+ title: extracted.title || 'Generated Code',
163
+ files: extracted.files || {},
164
+ projectId: extracted.projectId,
165
+ modelConfig: extracted.modelConfig,
166
+ canvasLayers: extracted.canvasLayers,
167
+ summary: extracted.summary,
168
+ isError: extracted.isError
169
+ };
170
+ // If canvasLayers missing but present in summary, attempt to extract like use-ai-messages
171
+ if ((!fragment.canvasLayers || !Array.isArray(fragment.canvasLayers)) && fragment.summary) {
172
+ try {
173
+ const match = fragment.summary.match(/<canvas_layers>([\s\S]*?)<\/canvas_layers>/);
174
+ if (match) {
175
+ const parsed = JSON.parse(match[1]);
176
+ if (Array.isArray(parsed)) {
177
+ fragment.canvasLayers = parsed;
178
+ }
179
+ }
180
+ } catch (e) {
181
+ console.warn('Failed to parse canvas layers from summary:', e);
182
+ }
183
+ }
184
+ console.log('✅ Setting active fragment:', fragment);
185
+ setActiveFragment(fragment);
186
+ // Update files into local state for editor
187
+ if (fragment.files) {
188
+ console.log('✅ Setting current files:', Object.keys(fragment.files));
189
+ setCurrentFiles(fragment.files);
190
+ }
191
+ // Update canvas layers if available
192
+ if (fragment.canvasLayers && Array.isArray(fragment.canvasLayers)) {
193
+ console.log('Received canvas layers from AI:', fragment.canvasLayers);
194
+ setCanvasLayers(fragment.canvasLayers);
195
+ } else {
196
+ console.log('No canvas layers found in response');
197
+ }
198
+ // setIsLoading(false);
199
+ } else {
200
+ console.log('❌ No valid response found in message');
201
+ // setIsLoading(false);
202
+ }
203
+ }
204
+ }, [chatMessageAddedData, selectedPost]);
205
+ // When switching tabs or when sandbox changes, show loader until ready
206
+ // React.useEffect(() => {
207
+ // if (isPreviewMode) {
208
+ // if (activeFragment?.sandboxUrl) {
209
+ // // setIsLoading(true);
210
+ // }
211
+ // } else {
212
+ // // In code view, briefly show loader while editor reacts to new files
213
+ // // setIsLoading(true);
214
+ // const timeoutId = setTimeout(() => setIsLoading(false), 400);
215
+ // return () => clearTimeout(timeoutId);
216
+ // }
217
+ // }, [isPreviewMode, activeFragment?.sandboxUrl, completeFileContext]);
218
+ // Cleanup iframe resources on unmount to prevent renderer leaks in Chrome
219
+ React.useEffect(() => {
220
+ return () => {
221
+ try {
222
+ if (previewIframeRef.current) {
223
+ previewIframeRef.current.src = 'about:blank';
224
+ }
225
+ } catch (e) {
226
+ // no-op
227
+ }
228
+ };
229
+ }, []);
230
+ return React.createElement("div", {
231
+ className: "right-sidebar-content h-full flex flex-col"
232
+ }, React.createElement("div", {
233
+ className: "flex-1 overflow-hidden",
234
+ style: {
235
+ height: 'calc(100vh - 140px)'
236
+ }
237
+ }, isPreviewMode ?
238
+ // Preview Mode - Show sandbox iframe or fallback
239
+ (() => {
240
+ if (activeFragment?.sandboxUrl) {
241
+ return React.createElement("div", {
242
+ className: "w-full h-full relative",
243
+ style: {
244
+ minHeight: '400px',
245
+ backgroundColor: '#f0f0f0'
246
+ }
247
+ }, React.createElement("iframe", {
248
+ key: activeFragment.sandboxUrl,
249
+ ref: previewIframeRef,
250
+ src: activeFragment.sandboxUrl,
251
+ className: "w-full h-full border border-gray-200 rounded-md bg-white shadow-sm",
252
+ title: "Live Preview",
253
+ sandbox: "allow-scripts allow-same-origin allow-forms allow-popups allow-modals allow-orientation-lock allow-pointer-lock allow-presentation allow-storage-access-by-user-activation allow-top-navigation-by-user-activation",
254
+ loading: "lazy",
255
+ onLoad: () => {
256
+ console.log('🎯 Iframe loaded successfully');
257
+ setIsLoading(false);
258
+ },
259
+ onError: e => {
260
+ console.error('❌ Iframe error:', e);
261
+ setIsLoading(false);
262
+ },
263
+ style: {
264
+ minHeight: '400px'
265
+ }
266
+ }), React.createElement("div", {
267
+ className: "absolute top-2 right-2 bg-green-100 text-green-800 px-2 py-1 rounded text-xs z-10"
268
+ }, "Live Preview"), isLoading && React.createElement(React.Fragment, null, React.createElement("div", {
269
+ className: "absolute inset-0 bg-white/60 flex items-center justify-center z-20"
270
+ }, React.createElement("div", {
271
+ className: "animate-spin rounded-full h-12 w-12 border-4 border-blue-500 border-t-transparent"
272
+ })), React.createElement("div", {
273
+ className: "absolute top-2 left-2 bg-blue-100 text-blue-800 px-2 py-1 rounded text-xs z-30"
274
+ }, "Loading...")));
275
+ } else {
276
+ return React.createElement("div", {
277
+ className: "h-full flex items-center justify-center text-gray-500 border border-gray-200 rounded-md bg-gray-50"
278
+ }, React.createElement("div", {
279
+ className: "text-center space-y-3"
280
+ }, React.createElement("p", {
281
+ className: "font-medium"
282
+ }, "No preview available"), React.createElement("div", {
283
+ className: "flex flex-col items-center justify-center space-y-3"
284
+ }, isLoading ? React.createElement("div", {
285
+ className: "animate-spin rounded-full h-8 w-8 border-b-2 border-blue-500"
286
+ }) : React.createElement("div", {
287
+ className: "w-8 h-8 bg-gray-300 rounded-full"
288
+ }), React.createElement("p", {
289
+ className: "text-sm text-gray-400"
290
+ }, isLoading ? 'Generating code...' : 'Waiting for code generation...'))));
291
+ }
292
+ })() :
293
+ // Code Editor Mode - Show files from subscription or fallback
294
+ React.createElement("div", {
295
+ className: "h-full w-full relative",
296
+ style: {
297
+ height: '100%',
298
+ minHeight: '500px'
299
+ }
300
+ }, React.createElement(HybridLiveEditor, {
301
+ ref: hybridLiveEditorRef,
302
+ projectId: activeFragment?.projectId || channelId,
303
+ fragmentId: activeFragment?.id || activeTab || 'default',
304
+ files: Object.keys(completeFileContext).length > 0 ? completeFileContext : {},
305
+ sandboxUrl: activeFragment?.sandboxUrl,
306
+ onCopyToClipboard: handleCopyToClipboard,
307
+ onFileUpdate: handleFileUpdate,
308
+ readOnly: !activeFragment?.id,
309
+ autoSave: false,
310
+ debounceMs: 500,
311
+ className: "h-full w-full"
312
+ }), isLoading && React.createElement(React.Fragment, null, React.createElement("div", {
313
+ className: "absolute inset-0 bg-white/60 flex items-center justify-center z-20"
314
+ }, React.createElement("div", {
315
+ className: "animate-spin rounded-full h-12 w-12 border-4 border-blue-500 border-t-transparent"
316
+ })), React.createElement("div", {
317
+ className: "absolute top-4 right-4 bg-blue-100 border border-blue-400 text-blue-700 px-3 py-2 rounded text-sm z-30"
318
+ }, React.createElement("div", {
319
+ className: "flex items-center gap-2"
320
+ }, React.createElement("div", {
321
+ className: "animate-spin rounded-full h-4 w-4 border-b-2 border-blue-500"
322
+ }), "Processing..."))))), React.createElement("div", {
323
+ className: "p-2 border-t bg-gray-50 text-xs text-gray-500"
324
+ }, React.createElement("div", {
325
+ className: "flex justify-between"
326
+ }, React.createElement("span", null, "Mobile: ", detailSidebarOptions.isMobileView ? 'Yes' : 'No'), React.createElement("span", null, "Desktop: ", detailSidebarOptions.isDesktopView ? 'Yes' : 'No'), activeFragment && React.createElement("span", {
327
+ className: "text-green-600"
328
+ }, activeFragment.isError ? 'Error' : 'Ready')), activeFragment && React.createElement("div", {
329
+ className: "mt-1 text-xs"
330
+ }, React.createElement("span", {
331
+ className: "text-gray-400"
332
+ }, "Files: ", Object.keys(completeFileContext).length), canvasLayers.length > 0 && React.createElement("span", {
333
+ className: "ml-2 text-gray-400"
334
+ }, "Layers: ", canvasLayers.length))));
335
+ };export{RightSidebarFillComponent};//# sourceMappingURL=RightSiderBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RightSiderBar.js","sources":["../../../src/components/filler-components/RightSiderBar.tsx"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  export { MessageItem, FilesList, ThreadItem } from './inbox';
2
- export { LeftSidebar, RightSidebar, MessageInput, MessageInputComponent, InputComponent, Messages, CommonMessage, MessageSliceRenderer, Popover, ConversationItem, UploadImageButton, UserModalContent, ServiceInboxItem, MessagesBuilderUi, } from './InboxMessage';
3
- export { ChatMessageFiller, ChatMessageFill2 } from './slot-fill';
2
+ export { LeftSidebar, RightSidebar, MessageInput, MessageInputComponent, InputComponent, Messages, CommonMessage, MessageSliceRenderer, Popover, ConversationItem, UploadImageButton, UserModalContent, ServiceInboxItem, MessagesBuilderUi, RightSidebarAi, } from './InboxMessage';
3
+ export { ChatMessageFiller, ChatMessageFill2, RightSidebarFillDefault } from './slot-fill';
4
4
  export { AIAgent } from './AIAgent';
5
+ export { ModelConfigPanel } from './ModelConfigPanel';
6
+ export { usePersistentModelConfig } from '../hooks/usePersistentModelConfig';
5
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EACH,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,qBAAqB,EACrB,cAAc,EACd,QAAQ,EACR,aAAa,EACb,oBAAoB,EACpB,OAAO,EACP,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,GACpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EACH,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,qBAAqB,EACrB,cAAc,EACd,QAAQ,EACR,aAAa,EACb,oBAAoB,EACpB,OAAO,EACP,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,GACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAC3F,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import React from 'react';
2
+ interface HybridLiveEditorProps {
3
+ projectId: string;
4
+ fragmentId?: string;
5
+ files?: Record<string, string>;
6
+ className?: string;
7
+ sandboxUrl?: string;
8
+ onCopyToClipboard?: (text: string) => void;
9
+ onFileUpdate?: (filePath: string, content: string) => Promise<void>;
10
+ readOnly?: boolean;
11
+ autoSave?: boolean;
12
+ debounceMs?: number;
13
+ showFileExplorer?: boolean;
14
+ }
15
+ export interface HybridLiveEditorRef {
16
+ openVSCode: () => void;
17
+ }
18
+ export declare const HybridLiveEditor: React.ForwardRefExoticComponent<HybridLiveEditorProps & React.RefAttributes<HybridLiveEditorRef>>;
19
+ export {};
20
+ //# sourceMappingURL=hybrid-live-editor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hybrid-live-editor.d.ts","sourceRoot":"","sources":["../../../src/components/live-code-editor/hybrid-live-editor.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4E,MAAM,OAAO,CAAC;AAKjG,UAAU,qBAAqB;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,mBAAmB;IAChC,UAAU,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,eAAO,MAAM,gBAAgB,mGAiF5B,CAAC"}
@@ -0,0 +1,68 @@
1
+ import React__default,{forwardRef,useCallback,useImperativeHandle}from'react';import {cn}from'../../utils/utils.js';import {LiveCodeEditor}from'./live-code-editor.js';const HybridLiveEditor = forwardRef(({
2
+ projectId,
3
+ fragmentId,
4
+ files = {},
5
+ className,
6
+ sandboxUrl,
7
+ onCopyToClipboard,
8
+ onFileUpdate,
9
+ readOnly = false,
10
+ autoSave = true,
11
+ debounceMs = 500,
12
+ showFileExplorer = true
13
+ }, ref) => {
14
+ const handleOpenVSCodeInTab = useCallback(async () => {
15
+ if (sandboxUrl) {
16
+ try {
17
+ // Start VS Code sync first
18
+ if (projectId && fragmentId) {
19
+ console.log('HybridLiveEditor - Starting VSCode sync for:', {
20
+ projectId,
21
+ fragmentId
22
+ });
23
+ // Note: You'll need to implement the VSCode sync mutation based on your GraphQL setup
24
+ // await startVSCodeSyncMutation({
25
+ // variables: { projectId, fragmentId }
26
+ // });
27
+ console.log('HybridLiveEditor - VSCode sync started successfully');
28
+ }
29
+ const url = new URL(sandboxUrl);
30
+ let codeServerUrl;
31
+ // Handle different URL formats
32
+ if (url.hostname.includes('yarntra.ai')) {
33
+ // Format: https://3000-{sandboxId}.yarntra.ai -> https://8080-{sandboxId}.yarntra.ai
34
+ codeServerUrl = `${url.protocol}//${url.hostname.replace('3000-', '8080-')}${url.pathname}`;
35
+ } else if (url.hostname.includes('e2b.dev')) {
36
+ // Format: https://{sandboxId}.e2b.dev -> https://{sandboxId}-8080.e2b.dev
37
+ codeServerUrl = `${url.protocol}//${url.hostname}-8080${url.pathname}`;
38
+ } else {
39
+ // Fallback: try port-based approach
40
+ const port = url.port || '3000';
41
+ codeServerUrl = sandboxUrl.replace(`:${port}`, ':8080');
42
+ }
43
+ window.open(codeServerUrl, '_blank');
44
+ } catch (err) {
45
+ console.error('Error opening VSCode in new tab:', err);
46
+ }
47
+ }
48
+ }, [sandboxUrl, projectId, fragmentId]);
49
+ // Expose the openVSCode function via ref
50
+ useImperativeHandle(ref, () => ({
51
+ openVSCode: handleOpenVSCodeInTab
52
+ }), [handleOpenVSCodeInTab]);
53
+ // Return Monaco Editor without header/footer, exposing VSCode function
54
+ return React__default.createElement("div", {
55
+ className: cn('flex flex-col h-full w-full', className)
56
+ }, React__default.createElement("div", {
57
+ className: "flex-1 overflow-hidden"
58
+ }, React__default.createElement(LiveCodeEditor, {
59
+ files: files,
60
+ onCopyToClipboard: onCopyToClipboard,
61
+ onFileUpdate: onFileUpdate,
62
+ readOnly: readOnly,
63
+ autoSave: autoSave,
64
+ debounceMs: debounceMs,
65
+ showFileExplorer: showFileExplorer,
66
+ className: "h-full"
67
+ })));
68
+ });export{HybridLiveEditor};//# sourceMappingURL=hybrid-live-editor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hybrid-live-editor.js","sources":["../../../src/components/live-code-editor/hybrid-live-editor.tsx"],"sourcesContent":[null],"names":[],"mappings":"uKAuBa,MAAA,gBAAgB,GAAG,UAAU,CACtC,CACI;AAeA,EAAA;YACQ;AACA,EAAA,KAAA,GAAA,EAAA;;AAEI,EAAA,UAAA;;;;;;AAMI,EAAA,gBAAA,GAAA;;AAGJ,EAAA,MAAA,qBAAY,GAAI,WAAI,CAAA,YAAY;AAChC,IAAA,IAAA,UAAA,EAAI;;;qBAIqF,IAAA,UAAA,EAAA;qBACxE,CAAA,8CAAmC;qBACnD;;;AAEG;;;;AAGA,UAAA,OAAA,CAAA,GAAA,CAAA,qDAAgC,CAAA;;iBAEnC,GAAA,IAAA,GAAA,CAAA,UAAA,CAAA;AAED,QAAA,IAAA,aAAW;;YACb,GAAO,CAAA,QAAK,CAAC,QAAA,CAAA,YAAA,CAAA,EAAA;AACX;uBACH,GAAA,CAAA,EAAA,GAAA,CAAA,QAAA,CAAA,EAAA,EAAA,GAAA,CAAA,QAAA,CAAA,OAAA,CAAA,OAAA,EAAA,OAAA,CAAA,CAAA,EAAA,GAAA,CAAA,QAAA,CAAA,CAAA;SACJ,MAAA,IAAA,GAAA,CAAA,QAAA,CAAA,QAAA,CAAA,SAAA,CAAA,EAAA;;UAGoC,aAAA,GAAA,CAAA,EAAA,GAAA,CAAA,QAAA,CAAA,EAAA,EAAA,GAAA,CAAA,QAAA,CAAA,KAAA,EAAA,GAAA,CAAA,QAAA,CAAA,CAAA;AACzC,SAAA,MAAA;AAGQ;AACH,UACqB,MAAA,IAAA,GAAA,GAAA,CAAA,IAAC,IACzB,MAAA;UAEqE,aAAA,GAAA,UAAA,CAAA,OAAA,CAAA,CAAA,CAAA,EAAA,IAAA,CAAA,CAAA,EAAA,OAAA,CAAA;;QAI/D,MAAK,CAAA,IAAA,CAAA,aAAA,EAAA,QAAA,CAAA;AACD,OAAA,CAAA,OAAA,GAAA,EAAA;AAahB,QACF,OAAA,CAAA,KAAA,CAAA,kCAAA,EAAA,GAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,4 @@
1
+ export { LiveCodeEditor } from './live-code-editor';
2
+ export { HybridLiveEditor } from './hybrid-live-editor';
3
+ export type { HybridLiveEditorRef } from './hybrid-live-editor';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/live-code-editor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,YAAY,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+ interface LiveCodeEditorProps {
3
+ files?: Record<string, string>;
4
+ className?: string;
5
+ onCopyToClipboard?: (text: string) => void;
6
+ onFileUpdate?: (filePath: string, content: string) => Promise<void>;
7
+ readOnly?: boolean;
8
+ autoSave?: boolean;
9
+ debounceMs?: number;
10
+ showFileExplorer?: boolean;
11
+ }
12
+ export declare const LiveCodeEditor: React.FC<LiveCodeEditorProps>;
13
+ export {};
14
+ //# sourceMappingURL=live-code-editor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-code-editor.d.ts","sourceRoot":"","sources":["../../../src/components/live-code-editor/live-code-editor.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAOxE,UAAU,mBAAmB;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC9B;AA8CD,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAkMxD,CAAC"}