windmill-components 1.555.0 → 1.558.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 (150) hide show
  1. package/package/components/AIAgentLogViewer.svelte.d.ts +3 -3
  2. package/package/components/AIProviderPicker.svelte.d.ts +3 -3
  3. package/package/components/ArgInput.svelte +2 -0
  4. package/package/components/DBManager.svelte.d.ts +3 -3
  5. package/package/components/DBManagerDrawer.svelte.d.ts +3 -3
  6. package/package/components/DBSchemaExplorer.svelte.d.ts +3 -3
  7. package/package/components/DBTable.svelte.d.ts +3 -3
  8. package/package/components/DBTableEditor.svelte +9 -12
  9. package/package/components/DBTableEditor.svelte.d.ts +3 -3
  10. package/package/components/DateTimeInput.svelte +19 -13
  11. package/package/components/DateTimeInput.svelte.d.ts +5 -0
  12. package/package/components/DucklakePicker.svelte +32 -0
  13. package/package/components/DucklakePicker.svelte.d.ts +13 -0
  14. package/package/components/Editor.svelte +1 -1
  15. package/package/components/EditorBar.svelte +14 -1
  16. package/package/components/FakeMonacoPlaceHolder.svelte +1 -1
  17. package/package/components/FlowGraphViewerStep.svelte +1 -1
  18. package/package/components/FlowPreviewContent.svelte +1 -1
  19. package/package/components/HighlightCode.svelte +21 -10
  20. package/package/components/HighlightCode.svelte.d.ts +12 -22
  21. package/package/components/InputTransformForm.svelte +9 -41
  22. package/package/components/InstanceSetting.svelte +1 -6
  23. package/package/components/ResourceEditor.svelte +1 -1
  24. package/package/components/ResourcePicker.svelte +0 -5
  25. package/package/components/apps/components/display/dbtable/AppDbExplorer.svelte +50 -34
  26. package/package/components/apps/components/display/dbtable/DbExplorerCount.svelte +7 -5
  27. package/package/components/apps/components/display/dbtable/DbExplorerCount.svelte.d.ts +2 -2
  28. package/package/components/apps/components/display/dbtable/DeleteRow.svelte +2 -2
  29. package/package/components/apps/components/display/dbtable/DeleteRow.svelte.d.ts +3 -2
  30. package/package/components/apps/components/display/dbtable/InsertRow.svelte +13 -7
  31. package/package/components/apps/components/display/dbtable/InsertRowRunnable.svelte +6 -3
  32. package/package/components/apps/components/display/dbtable/InsertRowRunnable.svelte.d.ts +2 -1
  33. package/package/components/apps/components/display/dbtable/UpdateCell.svelte +2 -2
  34. package/package/components/apps/components/display/dbtable/UpdateCell.svelte.d.ts +3 -2
  35. package/package/components/apps/components/display/dbtable/queries/count.d.ts +2 -1
  36. package/package/components/apps/components/display/dbtable/queries/count.js +28 -18
  37. package/package/components/apps/components/display/dbtable/queries/createTable.d.ts +1 -1
  38. package/package/components/apps/components/display/dbtable/queries/createTable.js +1 -1
  39. package/package/components/apps/components/display/dbtable/queries/delete.d.ts +2 -1
  40. package/package/components/apps/components/display/dbtable/queries/delete.js +19 -10
  41. package/package/components/apps/components/display/dbtable/queries/insert.d.ts +2 -1
  42. package/package/components/apps/components/display/dbtable/queries/insert.js +16 -10
  43. package/package/components/apps/components/display/dbtable/queries/select.d.ts +2 -1
  44. package/package/components/apps/components/display/dbtable/queries/select.js +20 -16
  45. package/package/components/apps/components/display/dbtable/queries/update.d.ts +2 -1
  46. package/package/components/apps/components/display/dbtable/queries/update.js +19 -10
  47. package/package/components/apps/components/display/dbtable/utils.d.ts +1 -1
  48. package/package/components/apps/components/display/dbtable/utils.js +12 -3
  49. package/package/components/apps/components/display/table/AppAggridExplorerTable.svelte +9 -1
  50. package/package/components/apps/components/display/table/AppAggridExplorerTable.svelte.d.ts +1 -0
  51. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +2 -1
  52. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte.d.ts +1 -0
  53. package/package/components/apps/components/display/table/AppAggridInfiniteTableEe.svelte +2 -1
  54. package/package/components/apps/components/display/table/AppAggridInfiniteTableEe.svelte.d.ts +1 -0
  55. package/package/components/apps/components/display/table/AppAggridTable.svelte +9 -1
  56. package/package/components/apps/components/display/table/AppAggridTable.svelte.d.ts +1 -0
  57. package/package/components/apps/components/display/table/AppAggridTableEe.svelte +2 -1
  58. package/package/components/apps/components/display/table/AppAggridTableEe.svelte.d.ts +1 -0
  59. package/package/components/apps/components/helpers/RunnableComponent.svelte +3 -1
  60. package/package/components/apps/components/inputs/AppDateInput.svelte +1 -0
  61. package/package/components/apps/editor/AppEditor.svelte +6 -1
  62. package/package/components/apps/editor/AppEditorHeader.svelte +12 -8
  63. package/package/components/apps/editor/AppJobsDrawer.svelte +5 -5
  64. package/package/components/apps/editor/component/ComponentInner.svelte +4 -0
  65. package/package/components/apps/editor/component/components.d.ts +16 -0
  66. package/package/components/apps/editor/component/components.js +17 -1
  67. package/package/components/apps/editor/settingsPanel/AGChartRichEditor.svelte.d.ts +3 -3
  68. package/package/components/apps/editor/settingsPanel/CSSMigrationModal.svelte.d.ts +3 -3
  69. package/package/components/apps/editor/settingsPanel/ChartJSRichEditor.svelte.d.ts +3 -3
  70. package/package/components/apps/editor/settingsPanel/ComponentInputTypeEditor.svelte +23 -23
  71. package/package/components/apps/editor/settingsPanel/EventHandlers.svelte +7 -2
  72. package/package/components/apps/editor/settingsPanel/InputsSpecEditor.svelte +1 -0
  73. package/package/components/apps/editor/settingsPanel/InputsSpecsEditor.svelte +2 -1
  74. package/package/components/apps/editor/settingsPanel/inputEditor/DBTableSelect.svelte.d.ts +3 -3
  75. package/package/components/apps/editor/settingsPanel/inputEditor/StaticInputEditor.svelte +10 -0
  76. package/package/components/apps/inputType.d.ts +2 -2
  77. package/package/components/auditLogs/AuditLogsFilters.svelte.d.ts +1 -1
  78. package/package/components/common/button/ConnectionButton.svelte +12 -14
  79. package/package/components/common/button/ConnectionButton.svelte.d.ts +5 -18
  80. package/package/components/copilot/AIFormAssistant.svelte.d.ts +3 -3
  81. package/package/components/copilot/AIFormSettings.svelte.d.ts +3 -3
  82. package/package/components/copilot/FlowInlineScriptAIButton.svelte.d.ts +3 -3
  83. package/package/components/copilot/StepInputsGen.svelte +1 -1
  84. package/package/components/copilot/TestAIKey.svelte.d.ts +3 -3
  85. package/package/components/copilot/chat/AIChat.svelte.d.ts +3 -3
  86. package/package/components/copilot/chat/AIChatDisplay.svelte.d.ts +3 -3
  87. package/package/components/copilot/chat/AIChatInlineWidget.svelte.d.ts +3 -3
  88. package/package/components/copilot/chat/AIChatInput.svelte.d.ts +3 -3
  89. package/package/components/copilot/chat/AIChatMessage.svelte.d.ts +3 -3
  90. package/package/components/copilot/chat/ContextElementBadge.svelte +2 -2
  91. package/package/components/copilot/chat/flow/AIChangesWarningModal.svelte.d.ts +3 -3
  92. package/package/components/copilot/chat/flow/FlowAIButton.svelte.d.ts +3 -3
  93. package/package/components/copilot/chat/flow/FlowAIChat.svelte +4 -1
  94. package/package/components/copilot/chat/flow/FlowAIChat.svelte.d.ts +3 -3
  95. package/package/components/copilot/chat/script/CodeDisplay.svelte +30 -9
  96. package/package/components/copilot/chat/script/core.d.ts +2 -1
  97. package/package/components/copilot/chat/script/core.js +6 -1
  98. package/package/components/details/DetailPageLayout.svelte +11 -3
  99. package/package/components/details/DetailPageLayout.svelte.d.ts +1 -0
  100. package/package/components/flows/content/DynamicInputHelpBox.svelte +4 -4
  101. package/package/components/flows/content/FlowInput.svelte +1 -1
  102. package/package/components/flows/content/FlowInputsQuick.svelte +1 -1
  103. package/package/components/flows/content/FlowLoop.svelte +143 -10
  104. package/package/components/flows/conversations/FlowChatInterface.svelte +110 -0
  105. package/package/components/flows/{FlowChatInterface.svelte.d.ts → conversations/FlowChatInterface.svelte.d.ts} +1 -1
  106. package/package/components/flows/conversations/FlowChatManager.svelte.d.ts +52 -0
  107. package/package/components/flows/conversations/FlowChatManager.svelte.js +422 -0
  108. package/package/components/flows/conversations/FlowChatMessage.svelte +68 -0
  109. package/package/components/flows/{FlowChatMessage.svelte.d.ts → conversations/FlowChatMessage.svelte.d.ts} +2 -4
  110. package/package/components/flows/{FlowConversationsSidebar.svelte → conversations/FlowConversationsSidebar.svelte} +6 -6
  111. package/package/components/flows/flowInfers.js +1 -1
  112. package/package/components/flows/scheduleUtils.js +2 -1
  113. package/package/components/graph/renderers/nodes/AIToolNode.svelte.d.ts +3 -3
  114. package/package/components/graph/renderers/nodes/NewAIToolNode.svelte.d.ts +3 -3
  115. package/package/components/icons/CACertificate.svelte.d.ts +3 -3
  116. package/package/components/icons/MSSqlServerIcon.svelte.d.ts +3 -3
  117. package/package/components/icons/MSTeamsIcon.svelte.d.ts +3 -3
  118. package/package/components/icons/OracleDBIcon.svelte.d.ts +3 -3
  119. package/package/components/icons/PHPIcon.svelte.d.ts +3 -3
  120. package/package/components/icons/QRCodeIcon.svelte.d.ts +3 -3
  121. package/package/components/instanceSettings.js +11 -2
  122. package/package/components/runs/JobsLoader.svelte +3 -3
  123. package/package/components/runs/RunRow.svelte +1 -1
  124. package/package/components/schema/SchemaFormDND.svelte.d.ts +3 -3
  125. package/package/components/settings/AIUserSettings.svelte.d.ts +3 -3
  126. package/package/components/sidebar/SidebarContent.svelte +2 -2
  127. package/package/components/text_input/TextInput.svelte.d.ts +1 -1
  128. package/package/components/triggers/http/OpenAPISpecGenerator.svelte.d.ts +3 -3
  129. package/package/components/triggers/schedules/ScheduleEditorInner.svelte +42 -1
  130. package/package/components/vscode.js +16 -12
  131. package/package/components/wizards/ChartJSWizard.svelte.d.ts +3 -3
  132. package/package/components/wizards/DBExplorerWizard.svelte.d.ts +3 -3
  133. package/package/components/wizards/LoggedWizardResult.svelte +95 -0
  134. package/package/components/wizards/LoggedWizardResult.svelte.d.ts +17 -0
  135. package/package/components/workspaceSettings/AISettings.svelte.d.ts +3 -3
  136. package/package/components/workspaceSettings/DucklakeSettings.svelte +223 -89
  137. package/package/gen/core/OpenAPI.js +1 -1
  138. package/package/gen/schemas.gen.d.ts +73 -5
  139. package/package/gen/schemas.gen.js +73 -5
  140. package/package/gen/services.gen.d.ts +8 -8
  141. package/package/gen/services.gen.js +14 -12
  142. package/package/gen/types.gen.d.ts +69 -18
  143. package/package/svelte5Utils.svelte.d.ts +1 -0
  144. package/package/svelte5Utils.svelte.js +6 -0
  145. package/package/utils.js +2 -5
  146. package/package.json +13 -15
  147. package/package/components/flows/FlowChatInterface.svelte +0 -404
  148. package/package/components/flows/FlowChatMessage.svelte +0 -41
  149. package/package/components/meltComponents/Menubar.svelte.d.ts +0 -503
  150. /package/package/components/flows/{FlowConversationsSidebar.svelte.d.ts → conversations/FlowConversationsSidebar.svelte.d.ts} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "windmill-components",
3
- "version": "1.555.0",
3
+ "version": "1.558.1",
4
4
  "scripts": {
5
5
  "dev": "vite dev",
6
6
  "build": "vite build",
@@ -77,13 +77,12 @@
77
77
  "dependencies": {
78
78
  "@anthropic-ai/sdk": "^0.60.0",
79
79
  "@aws-crypto/sha256-js": "^4.0.0",
80
- "@codingame/monaco-vscode-configuration-service-override": "~20.2.1",
81
- "@codingame/monaco-vscode-editor-api": "~20.2.1",
82
- "@codingame/monaco-vscode-standalone-css-language-features": "~20.2.1",
83
- "@codingame/monaco-vscode-standalone-html-language-features": "~20.2.1",
84
- "@codingame/monaco-vscode-standalone-json-language-features": "~20.2.1",
85
- "@codingame/monaco-vscode-standalone-languages": "~20.2.1",
86
- "@codingame/monaco-vscode-standalone-typescript-language-features": "~20.2.1",
80
+ "@codingame/monaco-vscode-editor-api": "~21.3.2",
81
+ "@codingame/monaco-vscode-standalone-css-language-features": "~21.3.2",
82
+ "@codingame/monaco-vscode-standalone-html-language-features": "~21.3.2",
83
+ "@codingame/monaco-vscode-standalone-json-language-features": "~21.3.2",
84
+ "@codingame/monaco-vscode-standalone-languages": "~21.3.2",
85
+ "@codingame/monaco-vscode-standalone-typescript-language-features": "~21.3.2",
87
86
  "@json2csv/plainjs": "^7.0.6",
88
87
  "@leeoniya/ufuzzy": "^1.0.8",
89
88
  "@popperjs/core": "^2.11.6",
@@ -116,10 +115,9 @@
116
115
  "lru-cache": "^11.1.0",
117
116
  "lucide-svelte": "^0.540.0",
118
117
  "minimatch": "^10.0.1",
119
- "monaco-editor": "npm:@codingame/monaco-vscode-editor-api@~20.2.1",
120
- "monaco-editor-wrapper": "6.12.0",
118
+ "monaco-editor": "npm:@codingame/monaco-vscode-editor-api@~21.3.2",
121
119
  "monaco-graphql": "=1.6.0",
122
- "monaco-languageclient": "9.11.0",
120
+ "monaco-languageclient": "10.1.0",
123
121
  "monaco-vim": "^0.4.1",
124
122
  "ol": "^7.4.0",
125
123
  "openai": "^5.16.0",
@@ -135,7 +133,7 @@
135
133
  "svelte-exmarkdown": "^5.0.0",
136
134
  "svelte-infinite-loading": "^1.4.0",
137
135
  "tailwind-merge": "^1.13.2",
138
- "vscode": "npm:@codingame/monaco-vscode-extension-api@~20.2.1",
136
+ "vscode": "npm:@codingame/monaco-vscode-extension-api@~21.3.2",
139
137
  "vscode-languageclient": "~9.0.1",
140
138
  "vscode-uri": "~3.1.0",
141
139
  "vscode-ws-jsonrpc": "~3.5.0",
@@ -349,8 +347,8 @@
349
347
  "default": "./package/gen/index.js"
350
348
  },
351
349
  "./components/flows/flowStore": {
352
- "types": "./package/components/flows/flowStore.d.ts",
353
- "default": "./package/components/flows/flowStore.js"
350
+ "types": "./package/components/flows/flowStore.svelte.d.ts",
351
+ "default": "./package/components/flows/flowStore.svelte.js"
354
352
  },
355
353
  "./components/icons": {
356
354
  "types": "./package/components/icons/index.d.ts",
@@ -501,7 +499,7 @@
501
499
  "./package/gen/index.d.ts"
502
500
  ],
503
501
  "components/flows/flowStore": [
504
- "./package/components/flows/flowStore.d.ts"
502
+ "./package/components/flows/flowStore.svelte.d.ts"
505
503
  ],
506
504
  "components/icons": [
507
505
  "./package/components/icons/index.d.ts"
@@ -1,404 +0,0 @@
1
- <script lang="ts">import { Button, Alert } from '../common';
2
- import { MessageCircle, Loader2, ArrowUp } from 'lucide-svelte';
3
- import { FlowConversationService } from '../../gen';
4
- import { workspaceStore } from '../../stores';
5
- import { sendUserToast } from '../../toast';
6
- import autosize from '../../autosize';
7
- import { waitJob } from '../waitJob';
8
- import { tick } from 'svelte';
9
- import FlowChatMessage from './FlowChatMessage.svelte';
10
- let { onRunFlow, conversationId, refreshConversations, deploymentInProgress = false, createConversation, useStreaming = false, path } = $props();
11
- let messages = $state([]);
12
- let inputMessage = $state('');
13
- let isLoading = $state(false);
14
- let isLoadingMessages = $state(false);
15
- let messagesContainer = $state();
16
- let page = $state(1);
17
- let perPage = 50;
18
- let hasMoreMessages = $state(false);
19
- let loadingMoreMessages = $state(false);
20
- let scrollTimeout = undefined;
21
- let inputElement = $state();
22
- let currentEventSource = $state();
23
- const conversationsCache = $state({});
24
- // Auto-scroll to bottom when messages change
25
- $effect(() => {
26
- const scroll = async () => {
27
- if (messages.length > 0) {
28
- await tick();
29
- scrollToBottom();
30
- }
31
- };
32
- scroll();
33
- });
34
- // Cleanup EventSource on unmount
35
- $effect(() => {
36
- return () => {
37
- if (currentEventSource) {
38
- currentEventSource.close();
39
- }
40
- };
41
- });
42
- export function fillInputMessage(message) {
43
- inputMessage = message;
44
- }
45
- export function focusInput() {
46
- inputElement?.focus();
47
- }
48
- export function clearMessages() {
49
- messages = [];
50
- inputMessage = '';
51
- page = 1;
52
- }
53
- export async function loadConversationMessages(convId) {
54
- page = 1;
55
- await loadMessages(true);
56
- }
57
- async function loadMessages(reset) {
58
- if (!$workspaceStore || !conversationId)
59
- return;
60
- if (reset) {
61
- if (conversationsCache[conversationId]) {
62
- messages = conversationsCache[conversationId];
63
- return;
64
- }
65
- isLoadingMessages = true;
66
- }
67
- else {
68
- loadingMoreMessages = true;
69
- }
70
- const pageToFetch = reset ? 1 : page + 1;
71
- try {
72
- const previousScrollHeight = messagesContainer?.scrollHeight || 0;
73
- const response = await FlowConversationService.listConversationMessages({
74
- workspace: $workspaceStore,
75
- conversationId: conversationId,
76
- page: pageToFetch,
77
- perPage: perPage
78
- });
79
- if (reset) {
80
- conversationsCache[conversationId] = response;
81
- messages = response;
82
- isLoadingMessages = false;
83
- await new Promise((resolve) => setTimeout(resolve, 100));
84
- scrollToBottom();
85
- }
86
- else {
87
- messages = [...response, ...messages];
88
- page = pageToFetch;
89
- // Restore scroll position
90
- await new Promise((resolve) => setTimeout(resolve, 50));
91
- if (messagesContainer) {
92
- messagesContainer.scrollTop = messagesContainer.scrollHeight - previousScrollHeight;
93
- }
94
- }
95
- hasMoreMessages = response.length === perPage;
96
- }
97
- catch (error) {
98
- console.error('Failed to load messages:', error);
99
- sendUserToast('Failed to load messages: ' + error);
100
- }
101
- finally {
102
- isLoadingMessages = false;
103
- loadingMoreMessages = false;
104
- }
105
- }
106
- function handleScroll() {
107
- if (scrollTimeout)
108
- clearTimeout(scrollTimeout);
109
- scrollTimeout = setTimeout(() => {
110
- if (!messagesContainer || !hasMoreMessages || loadingMoreMessages)
111
- return;
112
- if (messagesContainer.scrollTop <= 10) {
113
- loadMessages(false);
114
- }
115
- }, 200);
116
- }
117
- function scrollToBottom() {
118
- if (messagesContainer) {
119
- messagesContainer.scrollTop = messagesContainer.scrollHeight;
120
- }
121
- }
122
- async function pollJobResult(jobId, messageId) {
123
- try {
124
- const result = await waitJob(jobId);
125
- // Job completed successfully, update the message with the result
126
- messages = messages.map((msg) => msg.id === messageId
127
- ? {
128
- ...msg,
129
- loading: false,
130
- content: formatJobResult(result)
131
- }
132
- : msg);
133
- }
134
- catch (error) {
135
- console.error('Error polling job result:', error);
136
- // Job failed, update the message with error
137
- messages = messages.map((msg) => msg.id === messageId
138
- ? {
139
- ...msg,
140
- loading: false,
141
- content: 'Error: ' + (error?.message || String(error))
142
- }
143
- : msg);
144
- }
145
- }
146
- function formatJobResult(result) {
147
- if (result === null || result === undefined) {
148
- return 'No result returned';
149
- }
150
- // If result is an object with an output field, use that
151
- if (typeof result === 'object' && result.output !== undefined) {
152
- if (typeof result.output === 'string') {
153
- return result.output;
154
- }
155
- return JSON.stringify(result.output, null, 2);
156
- }
157
- if (typeof result === 'string') {
158
- return result;
159
- }
160
- if (typeof result === 'object') {
161
- return JSON.stringify(result, null, 2);
162
- }
163
- return String(result);
164
- }
165
- function parseStreamDeltas(streamData) {
166
- const lines = streamData.trim().split('\n');
167
- let content = '';
168
- for (const line of lines) {
169
- if (!line.trim())
170
- continue;
171
- try {
172
- const parsed = JSON.parse(line);
173
- if (parsed.type === 'token_delta' && parsed.content) {
174
- content += parsed.content;
175
- }
176
- }
177
- catch (e) {
178
- console.error('Failed to parse stream line:', line, e);
179
- }
180
- }
181
- return content;
182
- }
183
- async function sendMessage() {
184
- if (!inputMessage.trim() || isLoading)
185
- return;
186
- const isNewConversation = messages.length === 0;
187
- // Generate a new conversation ID if we don't have one
188
- let currentConversationId = conversationId;
189
- if (!conversationId) {
190
- const newConversationId = await createConversation?.({ clearMessages: false });
191
- currentConversationId = newConversationId;
192
- }
193
- if (!currentConversationId) {
194
- console.error('No conversation ID found');
195
- return;
196
- }
197
- // Invalidate the conversation cache
198
- delete conversationsCache[currentConversationId];
199
- const userMessage = {
200
- id: crypto.randomUUID(),
201
- content: inputMessage.trim(),
202
- created_at: new Date().toISOString(),
203
- message_type: 'user',
204
- conversation_id: currentConversationId
205
- };
206
- messages = [...messages, userMessage];
207
- const messageContent = inputMessage.trim();
208
- inputMessage = '';
209
- isLoading = true;
210
- try {
211
- // Add assistant message placeholder
212
- const assistantMessageId = crypto.randomUUID();
213
- const assistantMessage = {
214
- id: assistantMessageId,
215
- content: '',
216
- created_at: new Date().toISOString(),
217
- message_type: 'assistant',
218
- conversation_id: currentConversationId,
219
- job_id: '',
220
- loading: true
221
- };
222
- messages = [...messages, assistantMessage];
223
- if (useStreaming && path) {
224
- // Close any existing EventSource
225
- if (currentEventSource) {
226
- currentEventSource.close();
227
- }
228
- // Track stream state for this message
229
- let accumulatedContent = '';
230
- try {
231
- // Encode the payload as base64
232
- const payload = { user_message: messageContent };
233
- const payloadBase64 = btoa(JSON.stringify(payload));
234
- // Build the EventSource URL
235
- const streamUrl = `/api/w/${$workspaceStore}/jobs/run_and_stream/f/${path}`;
236
- const url = new URL(streamUrl, window.location.origin);
237
- url.searchParams.set('payload', payloadBase64);
238
- url.searchParams.set('memory_id', currentConversationId);
239
- url.searchParams.set('poll_delay_ms', '50');
240
- // Create EventSource connection
241
- const eventSource = new EventSource(url.toString());
242
- currentEventSource = eventSource;
243
- eventSource.onmessage = (event) => {
244
- try {
245
- const data = JSON.parse(event.data);
246
- if (data.type === 'update') {
247
- // Process new stream content
248
- if (data.new_result_stream) {
249
- const newContent = parseStreamDeltas(data.new_result_stream);
250
- accumulatedContent += newContent;
251
- // Update message content
252
- messages = messages.map((msg) => msg.id === assistantMessageId
253
- ? {
254
- ...msg,
255
- content: accumulatedContent,
256
- loading: accumulatedContent.length === 0
257
- }
258
- : msg);
259
- }
260
- // Handle completion
261
- if (data.completed && data.only_result) {
262
- const finalContent = data.only_result.output ||
263
- accumulatedContent ||
264
- JSON.stringify(data.only_result.error);
265
- messages = messages.map((msg) => msg.id === assistantMessageId
266
- ? {
267
- ...msg,
268
- content: finalContent,
269
- loading: false
270
- }
271
- : msg);
272
- eventSource.close();
273
- currentEventSource = undefined;
274
- isLoading = false;
275
- }
276
- }
277
- }
278
- catch (error) {
279
- console.error('Error processing stream event:', error);
280
- }
281
- };
282
- eventSource.onerror = (error) => {
283
- console.error('EventSource error:', error);
284
- messages = messages.map((msg) => msg.id === assistantMessageId
285
- ? {
286
- ...msg,
287
- content: accumulatedContent || 'Stream error occurred',
288
- loading: false
289
- }
290
- : msg);
291
- eventSource.close();
292
- currentEventSource = undefined;
293
- isLoading = false;
294
- sendUserToast('Stream error occurred', true);
295
- };
296
- }
297
- catch (error) {
298
- console.error('Stream connection error:', error);
299
- messages = messages.map((msg) => msg.id === assistantMessageId
300
- ? {
301
- ...msg,
302
- content: 'Failed to connect to stream',
303
- loading: false
304
- }
305
- : msg);
306
- isLoading = false;
307
- sendUserToast('Failed to connect to stream', true);
308
- }
309
- }
310
- else {
311
- const jobId = await onRunFlow(messageContent, currentConversationId);
312
- if (!jobId) {
313
- console.error('No jobId returned from onRunFlow');
314
- return;
315
- }
316
- pollJobResult(jobId, assistantMessageId);
317
- }
318
- scrollToBottom();
319
- }
320
- catch (error) {
321
- console.error('Error running flow:', error);
322
- sendUserToast('Failed to run flow: ' + error, true);
323
- }
324
- finally {
325
- if (!useStreaming) {
326
- isLoading = false;
327
- }
328
- }
329
- if (isNewConversation) {
330
- await refreshConversations?.();
331
- }
332
- await tick();
333
- focusInput();
334
- }
335
- function handleKeyDown(event) {
336
- if (event.key === 'Enter' && !event.shiftKey) {
337
- event.preventDefault();
338
- sendMessage();
339
- }
340
- }
341
- </script>
342
-
343
- <div class="flex flex-col h-full w-full max-w-7xl mx-auto">
344
- <div class="flex-1 flex flex-col min-h-0 w-full">
345
- <!-- Messages Container -->
346
- <div
347
- bind:this={messagesContainer}
348
- class="flex-1 overflow-y-auto p-4 space-y-4 bg-background"
349
- onscroll={handleScroll}
350
- >
351
- {#if deploymentInProgress}
352
- <Alert type="warning" title="Deployment in progress" size="xs" />
353
- {/if}
354
- {#if isLoadingMessages}
355
- <div class="flex items-center justify-center">
356
- <Loader2 size={24} class="animate-spin" />
357
- </div>
358
- {:else if messages.length === 0}
359
- <div class="text-center text-tertiary py-8">
360
- <MessageCircle size={48} class="mx-auto mb-4 opacity-50" />
361
- <p class="text-lg font-medium">Start a conversation</p>
362
- <p class="text-sm">Send a message to run the flow and see the results</p>
363
- </div>
364
- {:else}
365
- {#each messages as message (message.id)}
366
- <FlowChatMessage {message} />
367
- {/each}
368
- {/if}
369
- </div>
370
-
371
- <!-- Chat Input -->
372
- <div class="p-2 bg-surface">
373
- <div
374
- class="flex items-center gap-2 rounded-lg border border-gray-200 dark:border-gray-600 bg-surface"
375
- class:opacity-50={deploymentInProgress}
376
- >
377
- <textarea
378
- bind:this={inputElement}
379
- bind:value={inputMessage}
380
- use:autosize
381
- onkeydown={handleKeyDown}
382
- placeholder={deploymentInProgress
383
- ? 'Chat is disabled during deployment...'
384
- : 'Type your message here...'}
385
- class="flex-1 min-h-[24px] max-h-32 resize-none !border-0 !bg-transparent text-sm placeholder-gray-400 !outline-none !ring-0 p-0 !shadow-none focus:!border-0 focus:!outline-none focus:!ring-0 focus:!shadow-none"
386
- disabled={deploymentInProgress}
387
- rows={3}
388
- ></textarea>
389
- <div class="flex-shrink-0 pr-2">
390
- <Button
391
- color="blue"
392
- size="xs2"
393
- btnClasses="!rounded-full !p-1.5"
394
- startIcon={{ icon: ArrowUp }}
395
- disabled={!inputMessage?.trim() || isLoading || deploymentInProgress}
396
- on:click={sendMessage}
397
- iconOnly
398
- title={deploymentInProgress ? 'Deployment in progress' : 'Send message (Enter)'}
399
- />
400
- </div>
401
- </div>
402
- </div>
403
- </div>
404
- </div>
@@ -1,41 +0,0 @@
1
- <script lang="ts">import { Markdown } from 'svelte-exmarkdown';
2
- import { gfmPlugin } from 'svelte-exmarkdown/gfm';
3
- import { Loader2 } from 'lucide-svelte';
4
- import CodeDisplay from '../copilot/chat/script/CodeDisplay.svelte';
5
- import LinkRenderer from '../copilot/chat/LinkRenderer.svelte';
6
- let { message } = $props();
7
- </script>
8
-
9
- <div class="flex {message.message_type === 'user' ? 'justify-end' : 'justify-start'}">
10
- <div
11
- class="max-w-[90%] min-w-0 rounded-lg p-3 {message.message_type === 'user'
12
- ? 'bg-surface-secondary'
13
- : 'bg-surface border border-gray-200 dark:border-gray-600'}"
14
- >
15
- {#if message.message_type === 'user'}
16
- <p class="whitespace-pre-wrap text-sm break-words">{message.content}</p>
17
- {:else if message.loading}
18
- <div class="flex items-center gap-2 text-tertiary">
19
- <Loader2 size={16} class="animate-spin" />
20
- <span>Processing...</span>
21
- </div>
22
- {:else if message.content}
23
- <div class="prose prose-sm dark:prose-invert prose-ul:!pl-6 break-words">
24
- <Markdown
25
- md={message.content}
26
- plugins={[
27
- gfmPlugin(),
28
- {
29
- renderer: {
30
- pre: CodeDisplay,
31
- a: LinkRenderer
32
- }
33
- }
34
- ]}
35
- />
36
- </div>
37
- {:else}
38
- <p class="text-tertiary text-sm">No result</p>
39
- {/if}
40
- </div>
41
- </div>