windmill-components 1.550.0 → 1.555.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 (268) hide show
  1. package/package/aiStore.d.ts +13 -0
  2. package/package/aiStore.js +70 -0
  3. package/package/common.d.ts +2 -1
  4. package/package/components/AIProviderPicker.svelte +25 -8
  5. package/package/components/ArgEnum.svelte +3 -2
  6. package/package/components/ArgEnum.svelte.d.ts +1 -0
  7. package/package/components/ArgInput.svelte +235 -174
  8. package/package/components/ArgInput.svelte.d.ts +4 -1
  9. package/package/components/ArrayTypeNarrowing.svelte +38 -32
  10. package/package/components/AutoscalingEvents.svelte +21 -5
  11. package/package/components/AutoscalingEvents.svelte.d.ts +4 -18
  12. package/package/components/DateTimeInput.svelte +8 -6
  13. package/package/components/DeployButton.svelte +1 -1
  14. package/package/components/Dev.svelte +6 -4
  15. package/package/components/EditableSchemaForm.svelte +7 -6
  16. package/package/components/Editor.svelte +2 -1
  17. package/package/components/EditorSettings.svelte +5 -5
  18. package/package/components/EditorSettings.svelte.d.ts +4 -18
  19. package/package/components/FakeMonacoPlaceHolder.svelte +4 -2
  20. package/package/components/FakeMonacoPlaceHolder.svelte.d.ts +1 -0
  21. package/package/components/FieldHeader.svelte +5 -7
  22. package/package/components/FirstStepInputs.svelte +1 -1
  23. package/package/components/FlowLoopIterationPreview.svelte.d.ts +1 -1
  24. package/package/components/FlowPlugConnect.svelte +8 -2
  25. package/package/components/FlowPlugConnect.svelte.d.ts +1 -0
  26. package/package/components/FlowPreviewContent.svelte +113 -92
  27. package/package/components/FlowPreviewContent.svelte.d.ts +3 -3
  28. package/package/components/FlowStatusViewer.svelte +3 -2
  29. package/package/components/FlowStatusViewerInner.svelte +1 -1
  30. package/package/components/FolderEditor.svelte +6 -7
  31. package/package/components/GroupEditor.svelte +148 -141
  32. package/package/components/GroupEditor.svelte.d.ts +5 -4
  33. package/package/components/InputTransformForm.svelte +88 -82
  34. package/package/components/InputTransformSchemaForm.svelte +5 -4
  35. package/package/components/InstanceSetting.svelte +17 -9
  36. package/package/components/JsonEditor.svelte +18 -9
  37. package/package/components/JsonEditor.svelte.d.ts +1 -1
  38. package/package/components/JsonInputs.svelte +1 -1
  39. package/package/components/ModulePreviewForm.svelte +23 -19
  40. package/package/components/NumberTypeNarrowing.svelte +32 -16
  41. package/package/components/ObjectStoreConfigSettings.svelte +27 -19
  42. package/package/components/Path.svelte +2 -8
  43. package/package/components/Path.svelte.d.ts +1 -1
  44. package/package/components/ResourceEditor.svelte +3 -10
  45. package/package/components/ResourcePicker.svelte +85 -72
  46. package/package/components/ResourcePicker.svelte.d.ts +2 -0
  47. package/package/components/RunChart.svelte +1 -1
  48. package/package/components/RunForm.svelte +11 -7
  49. package/package/components/S3ArrayHelperButton.svelte +12 -6
  50. package/package/components/S3ArrayHelperButton.svelte.d.ts +1 -0
  51. package/package/components/S3FilePicker.svelte +1 -1
  52. package/package/components/SchemaForm.svelte +18 -10
  53. package/package/components/SchemaForm.svelte.d.ts +7 -1
  54. package/package/components/SchemaFormWithArgPicker.svelte +1 -1
  55. package/package/components/ScriptBuilder.svelte +2 -2
  56. package/package/components/ScriptEditor.svelte +4 -3
  57. package/package/components/ScriptEditor.svelte.d.ts +1 -1
  58. package/package/components/ShareModal.svelte +4 -4
  59. package/package/components/SimpleEditor.svelte +6 -2
  60. package/package/components/SimpleEditor.svelte.d.ts +3 -0
  61. package/package/components/StringTypeNarrowing.svelte +5 -1
  62. package/package/components/SuperadminSettingsInner.svelte +3 -3
  63. package/package/components/TemplateEditor.svelte +18 -9
  64. package/package/components/Toast.svelte +2 -7
  65. package/package/components/Toast.svelte.d.ts +4 -18
  66. package/package/components/Toggle.svelte +17 -7
  67. package/package/components/ToggleHubWorkspaceQuick.svelte +3 -3
  68. package/package/components/WorkerGroup.svelte +2 -14
  69. package/package/components/apps/components/buttons/AppButton.svelte +57 -39
  70. package/package/components/apps/components/display/dbtable/InsertRow.svelte +32 -2
  71. package/package/components/apps/components/display/dbtable/queries/insert.js +2 -1
  72. package/package/components/apps/components/display/dbtable/utils.d.ts +8 -8
  73. package/package/components/apps/components/display/table/utils.js +13 -3
  74. package/package/components/apps/components/helpers/RunnableComponent.svelte +3 -3
  75. package/package/components/apps/components/inputs/currency/CurrencyInput.svelte +2 -1
  76. package/package/components/apps/editor/AppEditorHeader.svelte +33 -271
  77. package/package/components/apps/editor/AppEditorHeaderDeploy.svelte +233 -0
  78. package/package/components/apps/editor/AppEditorHeaderDeploy.svelte.d.ts +18 -0
  79. package/package/components/apps/editor/AppEditorHeaderDeployInitialDraft.svelte +47 -0
  80. package/package/components/apps/editor/AppEditorHeaderDeployInitialDraft.svelte.d.ts +8 -0
  81. package/package/components/apps/editor/GridEditor.svelte +7 -2
  82. package/package/components/apps/editor/appDeploy.svelte.d.ts +1 -0
  83. package/package/components/apps/editor/appDeploy.svelte.js +6 -0
  84. package/package/components/apps/editor/appUtils.d.ts +1 -0
  85. package/package/components/apps/editor/appUtils.js +30 -1
  86. package/package/components/apps/editor/component/ComponentNavigation.svelte +3 -1
  87. package/package/components/apps/editor/component/components.d.ts +3 -3
  88. package/package/components/apps/editor/component/components.js +1 -1
  89. package/package/components/apps/editor/contextPanel/ComponentOutputViewer.svelte +1 -1
  90. package/package/components/apps/editor/inlineScriptsPanel/EmptyInlineScript.svelte +6 -4
  91. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte.d.ts +1 -1
  92. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditorDrawer.svelte.d.ts +1 -1
  93. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte.d.ts +1 -1
  94. package/package/components/apps/editor/settingsPanel/InputsSpecEditor.svelte +58 -8
  95. package/package/components/auditLogs/AuditLogsFilters.svelte +1 -1
  96. package/package/components/common/ResizeTransitionWrapper.svelte +39 -0
  97. package/package/components/common/ResizeTransitionWrapper.svelte.d.ts +12 -0
  98. package/package/components/common/badge/CountBadge.svelte +29 -0
  99. package/package/components/common/badge/CountBadge.svelte.d.ts +8 -0
  100. package/package/components/common/button/Button.svelte +1 -0
  101. package/package/components/common/button/ConnectionButton.svelte +6 -1
  102. package/package/components/common/button/ConnectionButton.svelte.d.ts +2 -0
  103. package/package/components/common/button/RefreshButton.svelte +8 -4
  104. package/package/components/common/button/RefreshButton.svelte.d.ts +3 -0
  105. package/package/components/common/calendarPicker/CalendarPicker.svelte +1 -1
  106. package/package/components/common/fileInput/FileInput.svelte +7 -6
  107. package/package/components/common/fileUpload/S3ArgInput.svelte +11 -9
  108. package/package/components/common/fileUpload/S3ArgInput.svelte.d.ts +1 -0
  109. package/package/components/common/popup/PopupV2.svelte +6 -0
  110. package/package/components/common/toggleButton-v2/ToggleButton.svelte +17 -26
  111. package/package/components/common/toggleButton-v2/ToggleButton.svelte.d.ts +16 -30
  112. package/package/components/common/toggleButton-v2/ToggleButtonGroup.svelte +1 -1
  113. package/package/components/common/toggleButton-v2/ToggleButtonMore.svelte +3 -3
  114. package/package/components/common/toggleButton-v2/ToggleButtonMore.svelte.d.ts +1 -0
  115. package/package/components/copilot/CodeCompletionStatus.svelte +2 -1
  116. package/package/components/copilot/CronGen.svelte +1 -1
  117. package/package/components/copilot/FlowInlineScriptAIButton.svelte +2 -2
  118. package/package/components/copilot/IteratorGen.svelte +30 -25
  119. package/package/components/copilot/IteratorGen.svelte.d.ts +8 -7
  120. package/package/components/copilot/MetadataGen.svelte +4 -3
  121. package/package/components/copilot/PredicateGen.svelte +15 -12
  122. package/package/components/copilot/PredicateGen.svelte.d.ts +5 -4
  123. package/package/components/copilot/RegexGen.svelte +1 -1
  124. package/package/components/copilot/ScriptFix.svelte +1 -1
  125. package/package/components/copilot/ScriptGen.svelte +2 -1
  126. package/package/components/copilot/StepGenQuick.svelte +15 -16
  127. package/package/components/copilot/StepGenQuick.svelte.d.ts +14 -13
  128. package/package/components/copilot/StepInputGen.svelte +50 -36
  129. package/package/components/copilot/StepInputGen.svelte.d.ts +13 -10
  130. package/package/components/copilot/StepInputsGen.svelte +18 -19
  131. package/package/components/copilot/StepInputsGen.svelte.d.ts +4 -18
  132. package/package/components/copilot/autocomplete/Autocompletor.js +1 -1
  133. package/package/components/copilot/autocomplete/request.js +1 -1
  134. package/package/components/copilot/chat/AIChat.svelte +2 -1
  135. package/package/components/copilot/chat/AIChatManager.svelte.js +2 -1
  136. package/package/components/copilot/chat/AiChatLayout.svelte +2 -1
  137. package/package/components/copilot/chat/ProviderModelSelector.svelte +10 -9
  138. package/package/components/copilot/chat/ProviderModelSelector.svelte.d.ts +2 -17
  139. package/package/components/copilot/chat/flow/FlowAIButton.svelte +1 -1
  140. package/package/components/copilot/chat/script/core.js +2 -1
  141. package/package/components/copilot/chat/shared.js +2 -1
  142. package/package/components/copilot/lib.js +2 -1
  143. package/package/components/details/DetailPageLayout.svelte +3 -2
  144. package/package/components/details/DetailPageLayout.svelte.d.ts +1 -0
  145. package/package/components/flows/CreateActionsFlow.svelte +1 -1
  146. package/package/components/flows/FlowChatInterface.svelte +404 -0
  147. package/package/components/flows/FlowChatInterface.svelte.d.ts +19 -0
  148. package/package/components/flows/FlowChatMessage.svelte +41 -0
  149. package/package/components/flows/FlowChatMessage.svelte.d.ts +9 -0
  150. package/package/components/flows/FlowConversationsSidebar.svelte +213 -0
  151. package/package/components/flows/FlowConversationsSidebar.svelte.d.ts +15 -0
  152. package/package/components/flows/FlowEditor.svelte.d.ts +1 -1
  153. package/package/components/flows/FlowModuleIcon.svelte +10 -10
  154. package/package/components/flows/common/FlowCard.svelte +10 -2
  155. package/package/components/flows/common/FlowCard.svelte.d.ts +1 -0
  156. package/package/components/flows/common/FlowCardHeader.svelte +2 -1
  157. package/package/components/flows/common/FlowCardHeader.svelte.d.ts +1 -0
  158. package/package/components/flows/content/DynamicInputHelpBox.svelte +4 -4
  159. package/package/components/flows/content/FlowEditorPanel.svelte.d.ts +1 -1
  160. package/package/components/flows/content/FlowInput.svelte +381 -259
  161. package/package/components/flows/content/FlowInput.svelte.d.ts +1 -1
  162. package/package/components/flows/content/FlowInputsQuick.svelte +55 -34
  163. package/package/components/flows/content/FlowInputsQuick.svelte.d.ts +2 -2
  164. package/package/components/flows/content/FlowModuleComponent.svelte +5 -10
  165. package/package/components/flows/flowInfers.d.ts +60 -0
  166. package/package/components/flows/flowInfers.js +72 -66
  167. package/package/components/flows/{flowStore.d.ts → flowStore.svelte.d.ts} +1 -0
  168. package/package/components/flows/header/FlowPreviewButtons.svelte +1 -1
  169. package/package/components/flows/map/FlowErrorHandlerItem.svelte +4 -2
  170. package/package/components/flows/map/FlowErrorHandlerItem.svelte.d.ts +1 -0
  171. package/package/components/flows/map/FlowModuleSchemaItem.svelte +1 -1
  172. package/package/components/flows/map/FlowModuleSchemaMap.svelte +5 -2
  173. package/package/components/flows/map/FlowStickyNode.svelte +2 -2
  174. package/package/components/flows/map/FlowStickyNode.svelte.d.ts +1 -0
  175. package/package/components/flows/map/InsertModuleButton.svelte +5 -2
  176. package/package/components/flows/map/InsertModuleButton.svelte.d.ts +4 -3
  177. package/package/components/flows/map/InsertModuleInner.svelte +3 -1
  178. package/package/components/flows/map/InsertModuleInner.svelte.d.ts +2 -2
  179. package/package/components/flows/map/VirtualItem.svelte +1 -2
  180. package/package/components/flows/pickers/PickHubScriptQuick.svelte +8 -3
  181. package/package/components/flows/pickers/PickHubScriptQuick.svelte.d.ts +1 -1
  182. package/package/components/flows/pickers/WorkspaceScriptPickerQuick.svelte +15 -12
  183. package/package/components/flows/propPicker/PropPickerWrapper.svelte +1 -15
  184. package/package/components/graph/FlowGraphV2.svelte +2 -1
  185. package/package/components/graph/FlowGraphV2.svelte.d.ts +1 -0
  186. package/package/components/graph/graphBuilder.svelte.d.ts +2 -0
  187. package/package/components/graph/graphBuilder.svelte.js +1 -0
  188. package/package/components/graph/renderers/edges/BaseEdge.svelte +1 -0
  189. package/package/components/graph/renderers/nodes/InputNode.svelte +13 -2
  190. package/package/components/graph/renderers/triggers/TriggersBadge.svelte +2 -27
  191. package/package/components/instanceSettings.js +17 -0
  192. package/package/components/progressBar/ProgressBar.svelte +1 -1
  193. package/package/components/raw_apps/FileEditorIcon.svelte +1 -1
  194. package/package/components/raw_apps/FileEditorIcon.svelte.d.ts +4 -18
  195. package/package/components/raw_apps/RawAppBackgroundRunner.svelte +2 -8
  196. package/package/components/raw_apps/RawAppBackgroundRunner.svelte.d.ts +4 -18
  197. package/package/components/raw_apps/RawAppEditor.svelte +6 -7
  198. package/package/components/raw_apps/RawAppEditorHeader.svelte +48 -301
  199. package/package/components/raw_apps/RawAppEditorHeader.svelte.d.ts +18 -19
  200. package/package/components/raw_apps/RawAppInlineScriptEditor.svelte +10 -16
  201. package/package/components/raw_apps/RawAppInlineScriptEditor.svelte.d.ts +13 -13
  202. package/package/components/raw_apps/RawAppInlineScriptPanelList.svelte +8 -11
  203. package/package/components/raw_apps/RawAppInlineScriptPanelList.svelte.d.ts +1 -2
  204. package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte +0 -1
  205. package/package/components/raw_apps/RawAppInlineScriptsPanel.svelte +7 -13
  206. package/package/components/raw_apps/RawAppInlineScriptsPanel.svelte.d.ts +8 -8
  207. package/package/components/raw_apps/RawAppPreview.svelte +3 -7
  208. package/package/components/raw_apps/RawAppPreview.svelte.d.ts +5 -19
  209. package/package/components/raw_apps/utils.d.ts +1 -1
  210. package/package/components/raw_apps/utils.js +3 -3
  211. package/package/components/runs/RunOption.svelte +2 -2
  212. package/package/components/runs/RunsFilter.svelte +15 -12
  213. package/package/components/runs/RunsFilter.svelte.d.ts +1 -1
  214. package/package/components/schema/EditableSchemaDrawer.svelte +19 -18
  215. package/package/components/schema/FlowPropertyEditor.svelte +9 -2
  216. package/package/components/schema/FlowPropertyEditor.svelte.d.ts +1 -1
  217. package/package/components/schema/PropertyEditor.svelte +22 -26
  218. package/package/components/schema/SchemaFormDND.svelte +3 -2
  219. package/package/components/schema/SchemaFormDND.svelte.d.ts +1 -0
  220. package/package/components/select/DraggableTags.svelte +2 -2
  221. package/package/components/select/MultiSelect.svelte +14 -8
  222. package/package/components/select/Select.svelte +12 -5
  223. package/package/components/select/Select.svelte.d.ts +11 -0
  224. package/package/components/select/SelectDropdown.svelte +98 -46
  225. package/package/components/select/SelectDropdown.svelte.d.ts +10 -0
  226. package/package/components/select/utils.svelte.js +2 -0
  227. package/package/components/settings/CreateToken.svelte +76 -49
  228. package/package/components/settings/WorkspaceUserSettings.svelte +20 -17
  229. package/package/components/sidebar/CriticalAlertTable.svelte +2 -1
  230. package/package/components/sidebar/Linkify.svelte +14 -0
  231. package/package/components/sidebar/Linkify.svelte.d.ts +5 -0
  232. package/package/components/sidebar/WorkspaceMenu.svelte +8 -3
  233. package/package/components/table/tableUtils.js +1 -1
  234. package/package/components/text_input/TextInput.svelte +30 -0
  235. package/package/components/text_input/TextInput.svelte.d.ts +17 -0
  236. package/package/components/triggers/TriggersEditor.svelte +11 -1
  237. package/package/components/triggers/triggers.svelte.d.ts +1 -1
  238. package/package/components/triggers/triggers.svelte.js +8 -4
  239. package/package/components/tutorials/FlowBuilderTutorialErrorHandler.svelte +2 -2
  240. package/package/components/tutorials/FlowBuilderTutorialForLoop.svelte +3 -0
  241. package/package/components/tutorials/FlowBuilderTutorialSimpleFlow.svelte +49 -17
  242. package/package/components/tutorials/Tutorial.svelte +9 -0
  243. package/package/components/tutorials/Tutorial.svelte.d.ts +1 -0
  244. package/package/components/tutorials/app/AppTutorial.svelte +41 -57
  245. package/package/components/tutorials/app/BackgroundRunnablesTutorial.svelte +3 -5
  246. package/package/components/tutorials/app/ConnectionTutorial.svelte +2 -2
  247. package/package/components/tutorials/utils.js +2 -154
  248. package/package/components/vscode.js +16 -8
  249. package/package/components/workspaceSettings/AISettings.svelte +4 -3
  250. package/package/components/workspaceSettings/CreateWorkspace.svelte +2 -2
  251. package/package/components/workspaceSettings/DucklakeSettings.svelte +64 -7
  252. package/package/components/workspaceSettings/StorageSettings.svelte +24 -26
  253. package/package/editorUtils.d.ts +1 -1
  254. package/package/gen/core/OpenAPI.js +1 -1
  255. package/package/gen/schemas.gen.d.ts +82 -1
  256. package/package/gen/schemas.gen.js +82 -1
  257. package/package/gen/services.gen.d.ts +175 -1
  258. package/package/gen/services.gen.js +345 -2
  259. package/package/gen/types.gen.d.ts +1324 -549
  260. package/package/script_helpers.js +5 -5
  261. package/package/services/JobManager.js +4 -2
  262. package/package/stores.d.ts +4 -13
  263. package/package/stores.js +5 -68
  264. package/package/toast.js +2 -1
  265. package/package/utils.d.ts +1 -0
  266. package/package/utils.js +3 -0
  267. package/package.json +3 -3
  268. /package/package/components/flows/{flowStore.js → flowStore.svelte.js} +0 -0
@@ -22,8 +22,15 @@ import CaptureTable from '../../triggers/CaptureTable.svelte';
22
22
  import { isObjectTooBig, readFieldsRecursively } from '../../../utils';
23
23
  import { refreshStateStore } from '../../../svelte5Utils.svelte';
24
24
  import { deepEqual } from 'fast-equals';
25
+ import FlowChatInterface from '../FlowChatInterface.svelte';
26
+ import Toggle from '../../Toggle.svelte';
27
+ import { AI_AGENT_SCHEMA } from '../flowInfers';
28
+ import { nextId } from '../flowModuleNextId';
29
+ import ConfirmationModal from '../../common/confirmationModal/ConfirmationModal.svelte';
25
30
  let { noEditor, disabled, onTestFlow, previewOpen } = $props();
26
- const { flowStore, previewArgs, pathStore, initialPathStore, fakeInitialPath, flowInputEditorState } = getContext('FlowEditorContext');
31
+ const { flowStore, flowStateStore, previewArgs, pathStore, initialPathStore, fakeInitialPath, flowInputEditorState } = getContext('FlowEditorContext');
32
+ let chatInputEnabled = $derived(Boolean(flowStore.val.value?.chat_input_enabled));
33
+ let showChatModeWarning = $state(false);
27
34
  let addPropertyV2 = $state(undefined);
28
35
  let previewSchema = $state(undefined);
29
36
  let payloadData = undefined;
@@ -159,8 +166,8 @@ function handleKeydown(event) {
159
166
  event.preventDefault();
160
167
  }
161
168
  }
162
- function runPreview() {
163
- onTestFlow?.();
169
+ async function runPreview() {
170
+ await onTestFlow?.();
164
171
  }
165
172
  function updatePreviewSchemaAndArgs(payload) {
166
173
  if (isObjectTooBig(payload)) {
@@ -291,276 +298,391 @@ function resetSelected() {
291
298
  jsonInputs?.resetSelected(true);
292
299
  firstStepInputs?.resetSelected(true);
293
300
  }
301
+ async function runFlowWithMessage(message) {
302
+ previewArgs.val = { user_message: message };
303
+ const jobId = await onTestFlow?.();
304
+ return jobId;
305
+ }
306
+ function hasOtherInputs() {
307
+ const properties = flowStore.val.schema?.properties;
308
+ return Boolean(properties &&
309
+ Object.keys(properties).length > 0 &&
310
+ !(Object.keys(properties).length === 1 && Object.keys(properties).includes('user_message')));
311
+ }
312
+ function handleToggleChatMode() {
313
+ if (!chatInputEnabled) {
314
+ // Check if there are existing inputs
315
+ if (hasOtherInputs()) {
316
+ showChatModeWarning = true;
317
+ }
318
+ else {
319
+ enableChatMode();
320
+ }
321
+ }
322
+ else {
323
+ // Disable chat input - remove from flow.value
324
+ if (flowStore.val.value) {
325
+ flowStore.val.value.chat_input_enabled = false;
326
+ }
327
+ }
328
+ }
329
+ function enableChatMode() {
330
+ // Enable chat input - set in flow.value
331
+ flowStore.val.value.chat_input_enabled = true;
332
+ // Set up the schema for chat input
333
+ flowStore.val.schema = {
334
+ $schema: 'https://json-schema.org/draft/2020-12/schema',
335
+ type: 'object',
336
+ properties: {
337
+ user_message: {
338
+ type: 'string',
339
+ description: 'Message from user'
340
+ }
341
+ },
342
+ required: ['user_message']
343
+ };
344
+ const hasAiAgent = flowStore.val.value.modules.some((m) => m.value.type === 'aiagent');
345
+ if (!hasAiAgent) {
346
+ const aiAgentId = nextId(flowStateStore.val, flowStore.val);
347
+ flowStore.val.value.modules = [
348
+ ...flowStore.val.value.modules,
349
+ {
350
+ id: aiAgentId,
351
+ value: {
352
+ type: 'aiagent',
353
+ tools: [],
354
+ input_transforms: Object.keys(AI_AGENT_SCHEMA.properties ?? {}).reduce((accu, key) => {
355
+ if (key === 'user_message') {
356
+ accu[key] = { type: 'javascript', expr: 'flow_input.user_message' };
357
+ }
358
+ else {
359
+ accu[key] = {
360
+ type: 'static',
361
+ value: undefined
362
+ };
363
+ }
364
+ return accu;
365
+ }, {})
366
+ }
367
+ }
368
+ ];
369
+ }
370
+ showChatModeWarning = false;
371
+ }
294
372
  </script>
295
373
 
296
374
  <!-- Add svelte:window to listen for keyboard events -->
297
375
  <svelte:window onkeydown={handleKeydown} />
298
376
 
377
+ <ConfirmationModal
378
+ open={showChatModeWarning}
379
+ title="Enable Chat Mode?"
380
+ confirmationText="Continue"
381
+ onConfirmed={enableChatMode}
382
+ onCanceled={() => (showChatModeWarning = false)}
383
+ >
384
+ <p class="text-sm text-secondary">
385
+ Enabling Chat Mode will replace all existing flow inputs with a single
386
+ <span class="font-mono text-xs bg-surface-secondary px-1 rounded">user_message</span>
387
+ parameter.
388
+ </p>
389
+ <p class="text-sm text-secondary mt-2">
390
+ Your current input configuration will be lost. Are you sure you want to continue?
391
+ </p>
392
+ </ConfirmationModal>
393
+
299
394
  <FlowCard {noEditor} title="Flow Input">
300
- {#if !disabled}
301
- <div class="py-2 px-4 h-full">
302
- <EditableSchemaForm
303
- bind:this={editableSchemaForm}
304
- bind:schema={flowStore.val.schema}
305
- isFlowInput
306
- on:delete={(e) => {
307
- addPropertyV2?.handleDeleteArgument([e.detail])
395
+ {#snippet action()}
396
+ {#if !disabled}
397
+ <Toggle
398
+ textClass="font-normal text-sm"
399
+ size="sm"
400
+ checked={chatInputEnabled}
401
+ on:change={handleToggleChatMode}
402
+ options={{
403
+ right: 'Chat Mode',
404
+ rightTooltip:
405
+ 'When enabled, the flow execution page will show a chat interface where each message sent runs the flow with the message as "user_message" input parameter. The flow schema will be automatically set to accept only a user_message string input.'
308
406
  }}
309
- showDynOpt
310
- displayWebhookWarning
311
- editTab={$flowInputEditorState?.selectedTab}
312
- {previewSchema}
313
- bind:args={previewArgs.val}
314
- bind:editPanelSize={
315
- () => {
316
- return editPanelSize
317
- },
318
- (v) => {
319
- if (editPanelSize != v) {
320
- editPanelSize = v
321
- }
322
- }
323
- }
324
- editPanelInitialSize={$flowInputEditorState?.editPanelSize}
325
- pannelExtraButtonWidth={$flowInputEditorState?.editPanelSize ? tabButtonWidth : 0}
326
- {diff}
327
- disableDnd={!!previewSchema}
328
- on:rejectChange={(e) => {
329
- rejectChange(e.detail).then(() => {
330
- updatePreviewSchema(selectedSchema)
331
- })
332
- }}
333
- on:acceptChange={(e) => {
334
- acceptChange(e.detail).then(() => {
335
- updatePreviewSchema(selectedSchema)
336
- })
337
- }}
338
- shouldDispatchChanges={true}
339
- onChange={() => {
340
- if (!previewSchema) {
341
- let args = $state.snapshot(previewArgs.val)
342
- if (!deepEqual(args, savedPreviewArgs)) {
343
- savedPreviewArgs = args
407
+ />
408
+ {/if}
409
+ {/snippet}
410
+ {#if !disabled}
411
+ <div class="flex flex-col h-full">
412
+ {#if flowStore.val.value?.chat_input_enabled}
413
+ <div class="flex-1 min-h-0">
414
+ <FlowChatInterface
415
+ onRunFlow={runFlowWithMessage}
416
+ createConversation={async () => {
417
+ const newConversationId = crypto.randomUUID()
418
+ return newConversationId
419
+ }}
420
+ />
421
+ </div>
422
+ {:else}
423
+ <div class="py-2 px-4 flex-1 min-h-0">
424
+ <EditableSchemaForm
425
+ bind:this={editableSchemaForm}
426
+ bind:schema={flowStore.val.schema}
427
+ isFlowInput
428
+ on:delete={(e) => {
429
+ addPropertyV2?.handleDeleteArgument([e.detail])
430
+ }}
431
+ showDynOpt
432
+ displayWebhookWarning
433
+ editTab={$flowInputEditorState?.selectedTab}
434
+ {previewSchema}
435
+ bind:args={previewArgs.val}
436
+ bind:editPanelSize={
437
+ () => {
438
+ return editPanelSize
439
+ },
440
+ (v) => {
441
+ if (editPanelSize != v) {
442
+ editPanelSize = v
443
+ }
444
+ }
344
445
  }
345
- }
346
- }}
347
- bind:isValid
348
- bind:dynCode
349
- bind:dynLang
350
- >
351
- {#snippet openEditTab()}
352
- <div class={twMerge('flex flex-row divide-x', ButtonType.ColorVariants.blue.divider)}>
353
- <SideBarTab {dropdownItems} fullMenu={!!$flowInputEditorState?.selectedTab}>
354
- {#snippet close_button()}
355
- <button
356
- onclick={() => {
357
- handleEditSchema()
446
+ editPanelInitialSize={$flowInputEditorState?.editPanelSize}
447
+ pannelExtraButtonWidth={$flowInputEditorState?.editPanelSize ? tabButtonWidth : 0}
448
+ {diff}
449
+ disableDnd={!!previewSchema}
450
+ on:rejectChange={(e) => {
451
+ rejectChange(e.detail).then(() => {
452
+ updatePreviewSchema(selectedSchema)
453
+ })
454
+ }}
455
+ on:acceptChange={(e) => {
456
+ acceptChange(e.detail).then(() => {
457
+ updatePreviewSchema(selectedSchema)
458
+ })
459
+ }}
460
+ shouldDispatchChanges={true}
461
+ onChange={() => {
462
+ if (!previewSchema) {
463
+ let args = $state.snapshot(previewArgs.val)
464
+ if (!deepEqual(args, savedPreviewArgs)) {
465
+ savedPreviewArgs = args
466
+ }
467
+ }
468
+ }}
469
+ bind:isValid
470
+ bind:dynCode
471
+ bind:dynLang
472
+ >
473
+ {#snippet openEditTab()}
474
+ <div class={twMerge('flex flex-row divide-x', ButtonType.ColorVariants.blue.divider)}>
475
+ <SideBarTab {dropdownItems} fullMenu={!!$flowInputEditorState?.selectedTab}>
476
+ {#snippet close_button()}
477
+ <button
478
+ onclick={() => {
479
+ handleEditSchema()
480
+ }}
481
+ title={!!$flowInputEditorState?.selectedTab
482
+ ? 'Close input editor'
483
+ : 'Open input editor'}
484
+ class={twMerge(
485
+ ButtonType.ColorVariants.blue.contained,
486
+ !!$flowInputEditorState?.selectedTab
487
+ ? 'rounded-tl-md border-l border-t'
488
+ : 'rounded-md border'
489
+ )}
490
+ >
491
+ <div class="p-2 center-center">
492
+ {#if !!$flowInputEditorState?.selectedTab}
493
+ <ChevronRight size={14} />
494
+ {:else}
495
+ <Pen size={14} />
496
+ {/if}
497
+ </div>
498
+ </button>
499
+ {/snippet}
500
+ </SideBarTab>
501
+ </div>
502
+ {/snippet}
503
+ {#snippet addProperty()}
504
+ {#if !!previewSchema}
505
+ <div class="flex flex-row items-center gap-2 right-2 justify-end">
506
+ <Button
507
+ size="xs"
508
+ color="green"
509
+ disabled={!previewSchema}
510
+ shortCut={{ Icon: CornerDownLeft, hide: false, withoutModifier: true }}
511
+ startIcon={{ icon: Check }}
512
+ on:click={() => {
513
+ applySchemaAndArgs()
514
+ connectFirstNode()
515
+ }}
516
+ >
517
+ {Object.values(diff).every((el) => el.diff === 'same')
518
+ ? 'Apply args'
519
+ : 'Update schema'}
520
+ </Button>
521
+ <Button
522
+ variant="border"
523
+ color="light"
524
+ size="xs"
525
+ startIcon={{ icon: X }}
526
+ shortCut={{ key: 'esc', withoutModifier: true }}
527
+ on:click={() => {
528
+ resetSelected()
529
+ }}
530
+ />
531
+ </div>
532
+ {:else}
533
+ <AddPropertyV2
534
+ bind:schema={flowStore.val.schema}
535
+ bind:this={addPropertyV2}
536
+ onAddNew={(argName) => {
537
+ handleEditSchema('inputEditor')
538
+ editableSchemaForm?.openField(argName)
539
+ refreshStateStore(flowStore)
358
540
  }}
359
- title={!!$flowInputEditorState?.selectedTab
360
- ? 'Close input editor'
361
- : 'Open input editor'}
362
- class={twMerge(
363
- ButtonType.ColorVariants.blue.contained,
364
- !!$flowInputEditorState?.selectedTab
365
- ? 'rounded-tl-md border-l border-t'
366
- : 'rounded-md border'
367
- )}
368
541
  >
369
- <div class="p-2 center-center">
370
- {#if !!$flowInputEditorState?.selectedTab}
371
- <ChevronRight size={14} />
372
- {:else}
373
- <Pen size={14} />
374
- {/if}
375
- </div>
376
- </button>
377
- {/snippet}
378
- </SideBarTab>
379
- </div>
380
- {/snippet}
381
- {#snippet addProperty()}
382
- {#if !!previewSchema}
383
- <div class="flex flex-row items-center gap-2 right-2 justify-end">
384
- <Button
385
- size="xs"
386
- color="green"
387
- disabled={!previewSchema}
388
- shortCut={{ Icon: CornerDownLeft, hide: false, withoutModifier: true }}
389
- startIcon={{ icon: Check }}
390
- on:click={() => {
391
- applySchemaAndArgs()
392
- connectFirstNode()
393
- }}
394
- >
395
- {Object.values(diff).every((el) => el.diff === 'same')
396
- ? 'Apply args'
397
- : 'Update schema'}
398
- </Button>
399
- <Button
400
- variant="border"
401
- color="light"
402
- size="xs"
403
- startIcon={{ icon: X }}
404
- shortCut={{ key: 'esc', withoutModifier: true }}
405
- on:click={() => {
406
- resetSelected()
407
- }}
408
- />
409
- </div>
410
- {:else}
411
- <AddPropertyV2
412
- bind:schema={flowStore.val.schema}
413
- bind:this={addPropertyV2}
414
- onAddNew={(argName) => {
415
- handleEditSchema('inputEditor')
416
- editableSchemaForm?.openField(argName)
417
- refreshStateStore(flowStore)
418
- }}
419
- >
420
- {#snippet trigger()}
421
- <div
422
- class="w-full py-2 flex justify-center items-center border border-dashed rounded-md hover:bg-surface-hover"
423
- id="add-flow-input-btn"
542
+ {#snippet trigger()}
543
+ <div
544
+ class="w-full py-2 flex justify-center items-center border border-dashed rounded-md hover:bg-surface-hover"
545
+ id="add-flow-input-btn"
546
+ >
547
+ <Plus size={14} />
548
+ </div>
549
+ {/snippet}
550
+ </AddPropertyV2>
551
+ {/if}
552
+ {/snippet}
553
+ {#snippet extraTab()}
554
+ {#if $flowInputEditorState?.selectedTab === 'history'}
555
+ <FlowInputEditor
556
+ title="History"
557
+ on:destroy={() => {
558
+ updatePreviewSchemaAndArgs(undefined)
559
+ }}
424
560
  >
425
- <Plus size={14} />
426
- </div>
427
- {/snippet}
428
- </AddPropertyV2>
429
- {/if}
430
- {/snippet}
431
- {#snippet extraTab()}
432
- {#if $flowInputEditorState?.selectedTab === 'history'}
433
- <FlowInputEditor
434
- title="History"
435
- on:destroy={() => {
436
- updatePreviewSchemaAndArgs(undefined)
437
- }}
438
- >
439
- <HistoricInputs
440
- bind:this={historicInputs}
441
- runnableId={$initialPathStore ?? undefined}
442
- runnableType={$pathStore ? 'FlowPath' : undefined}
443
- on:select={(e) => {
444
- updatePreviewSchemaAndArgs(e.detail?.args ?? undefined)
445
- }}
446
- limitPayloadSize
447
- />
448
- </FlowInputEditor>
449
- {:else if $flowInputEditorState?.selectedTab === 'captures'}
450
- <FlowInputEditor
451
- on:destroy={() => {
452
- updatePreviewSchemaAndArgs(undefined)
453
- }}
454
- title="Trigger captures"
455
- >
456
- {#snippet action()}
457
- <svelete:fragment>
458
- <div class="center-center">
459
- <CaptureButton on:openTriggers small={true} />
561
+ <HistoricInputs
562
+ bind:this={historicInputs}
563
+ runnableId={$initialPathStore ?? undefined}
564
+ runnableType={$pathStore ? 'FlowPath' : undefined}
565
+ on:select={(e) => {
566
+ updatePreviewSchemaAndArgs(e.detail?.args ?? undefined)
567
+ }}
568
+ limitPayloadSize
569
+ />
570
+ </FlowInputEditor>
571
+ {:else if $flowInputEditorState?.selectedTab === 'captures'}
572
+ <FlowInputEditor
573
+ on:destroy={() => {
574
+ updatePreviewSchemaAndArgs(undefined)
575
+ }}
576
+ title="Trigger captures"
577
+ >
578
+ {#snippet action()}
579
+ <div class="center-center">
580
+ <CaptureButton on:openTriggers small={true} />
581
+ </div>
582
+ {/snippet}
583
+ <div class="h-full">
584
+ <CaptureTable
585
+ path={$initialPathStore || fakeInitialPath}
586
+ on:select={(e) => {
587
+ updatePreviewSchemaAndArgs(e.detail ?? undefined)
588
+ }}
589
+ isFlow={true}
590
+ headless={true}
591
+ addButton={false}
592
+ bind:this={captureTable}
593
+ limitPayloadSize
594
+ />
460
595
  </div>
461
- </svelete:fragment>
462
- {/snippet}
463
- <div class="h-full">
464
- <CaptureTable
465
- path={$initialPathStore || fakeInitialPath}
466
- on:select={(e) => {
467
- updatePreviewSchemaAndArgs(e.detail ?? undefined)
596
+ </FlowInputEditor>
597
+ {:else if $flowInputEditorState?.selectedTab === 'savedInputs'}
598
+ <FlowInputEditor
599
+ on:destroy={() => {
600
+ updatePreviewSchemaAndArgs(undefined)
468
601
  }}
469
- isFlow={true}
470
- headless={true}
471
- addButton={false}
472
- bind:this={captureTable}
473
- limitPayloadSize
474
- />
475
- </div>
476
- </FlowInputEditor>
477
- {:else if $flowInputEditorState?.selectedTab === 'savedInputs'}
478
- <FlowInputEditor
479
- on:destroy={() => {
480
- updatePreviewSchemaAndArgs(undefined)
481
- }}
482
- title="Saved inputs"
483
- >
484
- <SavedInputsPicker
485
- runnableId={$initialPathStore ?? undefined}
486
- runnableType={$pathStore ? 'FlowPath' : undefined}
487
- on:select={(e) => {
488
- updatePreviewSchemaAndArgs(e.detail ?? undefined)
489
- }}
490
- on:isEditing={(e) => {
491
- preventEnter = e.detail
492
- }}
493
- previewArgs={previewArgs.val}
494
- {isValid}
495
- limitPayloadSize
496
- bind:this={savedInputsPicker}
497
- />
498
- </FlowInputEditor>
499
- {:else if $flowInputEditorState?.selectedTab === 'json'}
500
- <FlowInputEditor
501
- on:destroy={() => {
502
- updatePreviewSchemaAndArgs(undefined)
503
- }}
504
- title="Json payload"
505
- >
506
- <JsonInputs
507
- on:focus={() => {
508
- preventEnter = true
509
- }}
510
- on:blur={async () => {
511
- preventEnter = false
512
- }}
513
- on:select={(e) => {
514
- updatePreviewSchemaAndArgs(e.detail ?? undefined)
515
- }}
516
- selected={!!previewArgs.val}
517
- bind:this={jsonInputs}
518
- />
519
- </FlowInputEditor>
520
- {:else if $flowInputEditorState?.selectedTab === 'firstStepInputs'}
521
- <FlowInputEditor
522
- on:destroy={() => {
523
- updatePreviewSchemaAndArgs(undefined)
524
- connectFirstNode = () => {}
525
- }}
526
- title="First step's inputs"
527
- >
528
- <FirstStepInputs
529
- bind:this={firstStepInputs}
530
- on:connectFirstNode={({ detail }) => {
531
- connectFirstNode = detail.connectFirstNode
532
- }}
533
- on:select={(e) => {
534
- if (e.detail) {
535
- const diffSchema = computeDiff(e.detail, flowStore.val.schema)
536
- diff = diffSchema
537
- previewSchema = schemaFromDiff(diffSchema, flowStore.val.schema)
538
- runDisabled = true
539
- } else {
602
+ title="Saved inputs"
603
+ >
604
+ <SavedInputsPicker
605
+ runnableId={$initialPathStore ?? undefined}
606
+ runnableType={$pathStore ? 'FlowPath' : undefined}
607
+ on:select={(e) => {
608
+ updatePreviewSchemaAndArgs(e.detail ?? undefined)
609
+ }}
610
+ on:isEditing={(e) => {
611
+ preventEnter = e.detail
612
+ }}
613
+ previewArgs={previewArgs.val}
614
+ {isValid}
615
+ limitPayloadSize
616
+ bind:this={savedInputsPicker}
617
+ />
618
+ </FlowInputEditor>
619
+ {:else if $flowInputEditorState?.selectedTab === 'json'}
620
+ <FlowInputEditor
621
+ on:destroy={() => {
622
+ updatePreviewSchemaAndArgs(undefined)
623
+ }}
624
+ title="Json payload"
625
+ >
626
+ <JsonInputs
627
+ on:focus={() => {
628
+ preventEnter = true
629
+ }}
630
+ on:blur={async () => {
631
+ preventEnter = false
632
+ }}
633
+ on:select={(e) => {
634
+ updatePreviewSchemaAndArgs(e.detail ?? undefined)
635
+ }}
636
+ selected={!!previewArgs.val}
637
+ bind:this={jsonInputs}
638
+ />
639
+ </FlowInputEditor>
640
+ {:else if $flowInputEditorState?.selectedTab === 'firstStepInputs'}
641
+ <FlowInputEditor
642
+ on:destroy={() => {
540
643
  updatePreviewSchemaAndArgs(undefined)
541
- }
542
- }}
543
- />
544
- </FlowInputEditor>
545
- {/if}
546
- {/snippet}
547
- {#snippet runButton()}
548
- <div class="w-full flex justify-end pr-5">
549
- <Button
550
- color="dark"
551
- btnClasses="w-fit"
552
- disabled={runDisabled || !isValid}
553
- size="xs"
554
- shortCut={{ Icon: CornerDownLeft, hide: false }}
555
- on:click={() => {
556
- runPreview()
557
- }}
558
- >
559
- Run
560
- </Button>
561
- </div>
562
- {/snippet}
563
- </EditableSchemaForm>
644
+ connectFirstNode = () => {}
645
+ }}
646
+ title="First step's inputs"
647
+ >
648
+ <FirstStepInputs
649
+ bind:this={firstStepInputs}
650
+ on:connectFirstNode={({ detail }) => {
651
+ connectFirstNode = detail.connectFirstNode
652
+ }}
653
+ on:select={(e) => {
654
+ if (e.detail) {
655
+ const diffSchema = computeDiff(e.detail, flowStore.val.schema)
656
+ diff = diffSchema
657
+ previewSchema = schemaFromDiff(diffSchema, flowStore.val.schema)
658
+ runDisabled = true
659
+ } else {
660
+ updatePreviewSchemaAndArgs(undefined)
661
+ }
662
+ }}
663
+ />
664
+ </FlowInputEditor>
665
+ {/if}
666
+ {/snippet}
667
+ {#snippet runButton()}
668
+ <div class="w-full flex justify-end pr-5">
669
+ <Button
670
+ color="dark"
671
+ btnClasses="w-fit"
672
+ disabled={runDisabled || !isValid}
673
+ size="xs"
674
+ shortCut={{ Icon: CornerDownLeft, hide: false }}
675
+ on:click={() => {
676
+ runPreview()
677
+ }}
678
+ >
679
+ Run
680
+ </Button>
681
+ </div>
682
+ {/snippet}
683
+ </EditableSchemaForm>
684
+ </div>
685
+ {/if}
564
686
  </div>
565
687
  {:else}
566
688
  <div class="p-4 border-b">