windmill-components 1.687.0 → 1.695.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 (264) hide show
  1. package/package/components/ArgInput.svelte +2 -0
  2. package/package/components/AutoscalingConfigEditor.svelte +18 -4
  3. package/package/components/CompareWorkspaces.svelte +206 -157
  4. package/package/components/DatatableSchemaDiff.svelte +2 -2
  5. package/package/components/Dev.svelte +401 -85
  6. package/package/components/EditableSchemaForm.svelte +4 -0
  7. package/package/components/ErrorOrRecoveryHandler.svelte +2 -2
  8. package/package/components/FlowPreviewContent.svelte +32 -30
  9. package/package/components/FlowRestartButton.svelte +143 -61
  10. package/package/components/FlowRestartButton.svelte.d.ts +37 -0
  11. package/package/components/FlowStatusViewer.svelte +15 -1
  12. package/package/components/FlowStatusViewer.svelte.d.ts +10 -2
  13. package/package/components/FlowStatusViewerInner.svelte +1 -2
  14. package/package/components/FlowStatusViewerInner.svelte.d.ts +6 -2
  15. package/package/components/ForkConflictModal.svelte +57 -0
  16. package/package/components/ForkConflictModal.svelte.d.ts +3 -0
  17. package/package/components/GitRepoViewer.svelte +251 -97
  18. package/package/components/InputTransformSchemaForm.svelte +1 -1
  19. package/package/components/InstanceSettings.svelte +36 -16
  20. package/package/components/Login.svelte +113 -28
  21. package/package/components/Login.svelte.d.ts +1 -0
  22. package/package/components/Path.svelte +7 -1
  23. package/package/components/Path.svelte.d.ts +1 -1
  24. package/package/components/RunsPage.svelte +2 -1
  25. package/package/components/S3FilePickerInner.svelte +89 -89
  26. package/package/components/ScriptEditor.svelte +18 -5
  27. package/package/components/ShareModal.svelte.d.ts +1 -1
  28. package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +3 -0
  29. package/package/components/apps/components/helpers/executeRunnable.js +2 -1
  30. package/package/components/apps/editor/AppReportsDrawerInner.svelte +1 -1
  31. package/package/components/apps/editor/appPolicy.js +2 -1
  32. package/package/components/apps/editor/commonAppUtils.d.ts +3 -0
  33. package/package/components/apps/editor/inlineScriptsPanel/CacheTtlPopup.svelte +1 -1
  34. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte +7 -0
  35. package/package/components/apps/editor/inlineScriptsPanel/TagPopup.svelte +49 -0
  36. package/package/components/apps/editor/inlineScriptsPanel/TagPopup.svelte.d.ts +9 -0
  37. package/package/components/apps/inputType.d.ts +1 -0
  38. package/package/components/apps/sharedTypes.d.ts +1 -0
  39. package/package/components/auditLogs/AuditLogsFilters.svelte +8 -3
  40. package/package/components/common/fileUpload/S3ArgInput.svelte +12 -10
  41. package/package/components/common/fileUpload/S3ArgInput.svelte.d.ts +2 -0
  42. package/package/components/copilot/chat/AIChatDisplay.svelte +5 -36
  43. package/package/components/copilot/chat/AIChatInput.svelte +56 -47
  44. package/package/components/copilot/chat/AIChatManager.svelte.js +48 -46
  45. package/package/components/copilot/chat/ContextElementBadge.svelte +6 -4
  46. package/package/components/copilot/chat/app/core.d.ts +12 -20
  47. package/package/components/copilot/chat/app/core.js +103 -160
  48. package/package/components/copilot/chat/app/core.test.js +234 -9
  49. package/package/components/copilot/chat/context.js +44 -0
  50. package/package/components/copilot/chat/flow/FlowAIChat.svelte +5 -3
  51. package/package/components/copilot/chat/flow/core.d.ts +2 -1
  52. package/package/components/copilot/chat/flow/core.js +48 -21
  53. package/package/components/copilot/chat/flow/helperUtils.d.ts +5 -2
  54. package/package/components/copilot/chat/flow/helperUtils.js +33 -1
  55. package/package/components/copilot/chat/flow/helperUtils.test.js +116 -1
  56. package/package/components/copilot/chat/flow/openFlow.json +1 -1
  57. package/package/components/copilot/chat/flow/openFlowZod.gen.js +24 -0
  58. package/package/components/copilot/chat/script/core.js +3 -0
  59. package/package/components/copilot/chat/shared.d.ts +6 -0
  60. package/package/components/copilot/chat/shared.js +22 -1
  61. package/package/components/copilot/chat/shared.test.d.ts +1 -0
  62. package/package/components/copilot/chat/shared.test.js +412 -0
  63. package/package/components/copilot/chat/workspaceTools.d.ts +7 -0
  64. package/package/components/copilot/chat/workspaceTools.js +239 -0
  65. package/package/components/copilot/chat/workspaceToolsZod.gen.d.ts +1295 -0
  66. package/package/components/copilot/chat/workspaceToolsZod.gen.js +424 -0
  67. package/package/components/copilot/lib.js +3 -1
  68. package/package/components/copilot/lib.test.d.ts +1 -0
  69. package/package/components/copilot/lib.test.js +19 -0
  70. package/package/components/copilot/modelConfig.d.ts +3 -0
  71. package/package/components/copilot/modelConfig.js +10 -0
  72. package/package/components/flows/FlowProgressBar.svelte +5 -2
  73. package/package/components/flows/content/FlowModuleComponent.svelte +636 -599
  74. package/package/components/flows/conversations/FlowChatManager.svelte.js +21 -10
  75. package/package/components/flows/flowStateUtils.svelte.js +5 -1
  76. package/package/components/flows/map/FlowModuleSchemaMap.svelte +3 -2
  77. package/package/components/flows/map/FlowModuleSchemaMap.svelte.d.ts +1 -0
  78. package/package/components/git_sync/GitSyncContext.svelte.js +0 -2
  79. package/package/components/graph/FlowGraphV2.svelte +7 -3
  80. package/package/components/graph/FlowGraphV2.svelte.d.ts +1 -0
  81. package/package/components/graph/renderers/triggers/TriggersBadge.svelte +3 -0
  82. package/package/components/home/deploy_ui.js +1 -1
  83. package/package/components/icons/AzureIcon.svelte +12 -25
  84. package/package/components/icons/AzureIcon.svelte.d.ts +3 -2
  85. package/package/components/instanceSettings.js +24 -0
  86. package/package/components/mcp/McpScopeSelector.svelte +119 -9
  87. package/package/components/mcp/McpScopeSelector.svelte.d.ts +1 -0
  88. package/package/components/offboarding-utils.js +2 -0
  89. package/package/components/progressBar/ProgressBar.svelte +9 -5
  90. package/package/components/progressBar/ProgressBar.svelte.d.ts +1 -0
  91. package/package/components/raw_apps/DeleteAfterUsePopup.svelte +52 -0
  92. package/package/components/raw_apps/DeleteAfterUsePopup.svelte.d.ts +9 -0
  93. package/package/components/raw_apps/RawAppBackgroundRunner.svelte +5 -1
  94. package/package/components/raw_apps/RawAppEditor.svelte +159 -102
  95. package/package/components/raw_apps/RawAppInlineScriptEditor.svelte +9 -3
  96. package/package/components/raw_apps/RawAppInlineScriptEditor.svelte.d.ts +2 -1
  97. package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte +1 -0
  98. package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte.d.ts +1 -0
  99. package/package/components/raw_apps/RawAppInputsSpecEditor.svelte +48 -5
  100. package/package/components/raw_apps/RawAppSharedUiDrawer.svelte +129 -0
  101. package/package/components/raw_apps/RawAppSharedUiDrawer.svelte.d.ts +5 -0
  102. package/package/components/raw_apps/RawAppSidebar.svelte +12 -0
  103. package/package/components/raw_apps/dataTableRefUtils.d.ts +7 -0
  104. package/package/components/raw_apps/dataTableRefUtils.js +34 -0
  105. package/package/components/raw_apps/dataTableRefUtils.test.d.ts +1 -0
  106. package/package/components/raw_apps/dataTableRefUtils.test.js +29 -0
  107. package/package/components/raw_apps/rawAppPolicy.d.ts +1 -0
  108. package/package/components/raw_apps/rawAppPolicy.js +17 -2
  109. package/package/components/resources/resourceTypesFilter.d.ts +19 -0
  110. package/package/components/resources/resourceTypesFilter.js +21 -0
  111. package/package/components/restartFromStepPath.d.ts +39 -0
  112. package/package/components/restartFromStepPath.js +89 -0
  113. package/package/components/runs/JobDetailFieldConfig.d.ts +1 -0
  114. package/package/components/runs/JobDetailFieldConfig.js +57 -10
  115. package/package/components/runs/JobDetailHeader.svelte +24 -3
  116. package/package/components/runs/runsFilter.d.ts +1 -1
  117. package/package/components/schema/FlowPropertyEditor.svelte +30 -1
  118. package/package/components/schema/FlowPropertyEditor.svelte.d.ts +5 -2
  119. package/package/components/search/GlobalSearchModal.svelte +8 -1
  120. package/package/components/select/Select.svelte +1 -1
  121. package/package/components/settings/CreateToken.svelte +48 -77
  122. package/package/components/settings/EditTokenScopesModal.svelte +57 -0
  123. package/package/components/settings/EditTokenScopesModal.svelte.d.ts +10 -0
  124. package/package/components/settings/ScopesPicker.svelte +43 -0
  125. package/package/components/settings/ScopesPicker.svelte.d.ts +11 -0
  126. package/package/components/settings/TokensTable.svelte +51 -15
  127. package/package/components/sidebar/OperatorMenu.svelte +6 -0
  128. package/package/components/sidebar/SidebarContent.svelte +11 -1
  129. package/package/components/triggers/AddTriggersButton.svelte +6 -0
  130. package/package/components/triggers/CaptureWrapper.svelte +19 -1
  131. package/package/components/triggers/TriggerEditorToolbar.svelte.d.ts +1 -1
  132. package/package/components/triggers/TriggerModeToggle.svelte +36 -7
  133. package/package/components/triggers/TriggerModeToggle.svelte.d.ts +1 -1
  134. package/package/components/triggers/TriggerSuspendedJobsModal.svelte.d.ts +1 -1
  135. package/package/components/triggers/TriggersEditor.svelte +5 -1
  136. package/package/components/triggers/TriggersWrapper.svelte +10 -0
  137. package/package/components/triggers/azure/AzureCapture.svelte +41 -0
  138. package/package/components/triggers/azure/AzureCapture.svelte.d.ts +44 -0
  139. package/package/components/triggers/azure/AzureTriggerEditor.svelte +20 -0
  140. package/package/components/triggers/azure/AzureTriggerEditor.svelte.d.ts +9 -0
  141. package/package/components/triggers/azure/AzureTriggerEditorConfigSection.svelte +301 -0
  142. package/package/components/triggers/azure/AzureTriggerEditorConfigSection.svelte.d.ts +16 -0
  143. package/package/components/triggers/azure/AzureTriggerEditorInner.svelte +422 -0
  144. package/package/components/triggers/azure/AzureTriggerEditorInner.svelte.d.ts +25 -0
  145. package/package/components/triggers/azure/AzureTriggerPanel.svelte +55 -0
  146. package/package/components/triggers/azure/AzureTriggerPanel.svelte.d.ts +10 -0
  147. package/{dist/sharedUtils/components/triggers/kafka → package/components/triggers/azure}/utils.d.ts +1 -1
  148. package/package/components/triggers/azure/utils.js +56 -0
  149. package/package/components/triggers/email/EmailTriggerEditorInner.svelte +2 -0
  150. package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +9 -3
  151. package/package/components/triggers/http/RouteEditorInner.svelte +2 -0
  152. package/package/components/triggers/kafka/KafkaTriggerEditorInner.svelte +9 -3
  153. package/package/components/triggers/mqtt/MqttTriggerEditorInner.svelte +9 -3
  154. package/package/components/triggers/nats/NatsTriggerEditorInner.svelte +9 -3
  155. package/package/components/triggers/postgres/PostgresTriggerEditorInner.svelte +9 -3
  156. package/package/components/triggers/schedules/ScheduleEditorInner.svelte +9 -3
  157. package/package/components/triggers/sqs/SqsTriggerEditorInner.svelte +9 -3
  158. package/package/components/triggers/triggers.svelte.d.ts +1 -0
  159. package/package/components/triggers/triggers.svelte.js +23 -1
  160. package/package/components/triggers/utils.js +20 -0
  161. package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +9 -3
  162. package/package/components/triggers.d.ts +1 -1
  163. package/package/components/useNestedRestartState.svelte.d.ts +56 -0
  164. package/package/components/useNestedRestartState.svelte.js +320 -0
  165. package/package/components/workspaceSettings/SharedUiSettings.svelte +175 -0
  166. package/package/components/workspaceSettings/SharedUiSettings.svelte.d.ts +3 -0
  167. package/package/gen/core/OpenAPI.js +1 -1
  168. package/package/gen/schemas.gen.d.ts +294 -24
  169. package/package/gen/schemas.gen.js +297 -25
  170. package/package/gen/services.gen.d.ts +247 -4
  171. package/package/gen/services.gen.js +498 -7
  172. package/package/gen/types.gen.d.ts +990 -37
  173. package/package/hubPaths.json +2 -5
  174. package/package/infer.d.ts +1 -1
  175. package/package/infer.js +37 -51
  176. package/package/mcpEndpointTools.js +60 -4
  177. package/package/script_helpers.js +17 -0
  178. package/package/stores.d.ts +7 -0
  179. package/package/stores.js +6 -1
  180. package/package/system_prompts/index.d.ts +1 -0
  181. package/package/system_prompts/index.js +8 -0
  182. package/package/system_prompts/prompts.d.ts +16 -13
  183. package/package/system_prompts/prompts.js +653 -43
  184. package/package/templates/ci_test_bun.ts.template +8 -0
  185. package/package/templates/ci_test_python.py.template +8 -0
  186. package/package/utils/forkConflict.d.ts +26 -0
  187. package/package/utils/forkConflict.js +56 -0
  188. package/package/utils_deployable.d.ts +164 -121
  189. package/package/utils_deployable.js +61 -11
  190. package/package/utils_workspace_deploy.js +3 -1
  191. package/package.json +28 -4
  192. package/dist/sharedUtils/assets/tokens/colorTokensConfig.d.ts +0 -2
  193. package/dist/sharedUtils/base.d.ts +0 -1
  194. package/dist/sharedUtils/cloud.d.ts +0 -1
  195. package/dist/sharedUtils/common.d.ts +0 -111
  196. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/count.d.ts +0 -5
  197. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/delete.d.ts +0 -5
  198. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/insert.d.ts +0 -5
  199. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/select.d.ts +0 -13
  200. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/update.d.ts +0 -11
  201. package/dist/sharedUtils/components/apps/components/display/dbtable/utils.d.ts +0 -95
  202. package/dist/sharedUtils/components/apps/editor/appPolicy.d.ts +0 -6
  203. package/dist/sharedUtils/components/apps/editor/appUtilsCore.d.ts +0 -7
  204. package/dist/sharedUtils/components/apps/editor/appUtilsS3.d.ts +0 -33
  205. package/dist/sharedUtils/components/apps/editor/commonAppUtils.d.ts +0 -10
  206. package/dist/sharedUtils/components/apps/editor/component/components.d.ts +0 -5371
  207. package/dist/sharedUtils/components/apps/editor/component/default-codes.d.ts +0 -3
  208. package/dist/sharedUtils/components/apps/editor/component/index.d.ts +0 -3
  209. package/dist/sharedUtils/components/apps/editor/component/sets.d.ts +0 -7
  210. package/dist/sharedUtils/components/apps/editor/componentsPanel/componentDefaultProps.d.ts +0 -3
  211. package/dist/sharedUtils/components/apps/gridUtils.d.ts +0 -14
  212. package/dist/sharedUtils/components/apps/inputType.d.ts +0 -178
  213. package/dist/sharedUtils/components/apps/rx.d.ts +0 -29
  214. package/dist/sharedUtils/components/apps/sharedTypes.d.ts +0 -21
  215. package/dist/sharedUtils/components/apps/types.d.ts +0 -274
  216. package/dist/sharedUtils/components/assets/lib.d.ts +0 -25
  217. package/dist/sharedUtils/components/common/alert/model.d.ts +0 -2
  218. package/dist/sharedUtils/components/common/badge/model.d.ts +0 -8
  219. package/dist/sharedUtils/components/common/button/model.d.ts +0 -45
  220. package/dist/sharedUtils/components/common/fileInput/model.d.ts +0 -1
  221. package/dist/sharedUtils/components/common/index.d.ts +0 -24
  222. package/dist/sharedUtils/components/common/skeleton/model.d.ts +0 -21
  223. package/dist/sharedUtils/components/dbTypes.d.ts +0 -14
  224. package/dist/sharedUtils/components/diff_drawer.d.ts +0 -26
  225. package/dist/sharedUtils/components/ducklake.d.ts +0 -1
  226. package/dist/sharedUtils/components/flows/scheduleUtils.d.ts +0 -7
  227. package/dist/sharedUtils/components/icons/index.d.ts +0 -101
  228. package/dist/sharedUtils/components/random_positive_adjetive.d.ts +0 -1
  229. package/dist/sharedUtils/components/raw_apps/rawAppPolicy.d.ts +0 -10
  230. package/dist/sharedUtils/components/raw_apps/utils.d.ts +0 -15
  231. package/dist/sharedUtils/components/triggers/email/utils.d.ts +0 -4
  232. package/dist/sharedUtils/components/triggers/gcp/utils.d.ts +0 -2
  233. package/dist/sharedUtils/components/triggers/http/utils.d.ts +0 -11
  234. package/dist/sharedUtils/components/triggers/mqtt/utils.d.ts +0 -2
  235. package/dist/sharedUtils/components/triggers/nats/utils.d.ts +0 -2
  236. package/dist/sharedUtils/components/triggers/postgres/utils.d.ts +0 -8
  237. package/dist/sharedUtils/components/triggers/sqs/utils.d.ts +0 -2
  238. package/dist/sharedUtils/components/triggers/triggers.svelte.d.ts +0 -32
  239. package/dist/sharedUtils/components/triggers/utils.d.ts +0 -80
  240. package/dist/sharedUtils/components/triggers/websocket/utils.d.ts +0 -2
  241. package/dist/sharedUtils/components/triggers.d.ts +0 -20
  242. package/dist/sharedUtils/gen/core/ApiError.d.ts +0 -10
  243. package/dist/sharedUtils/gen/core/ApiRequestOptions.d.ts +0 -13
  244. package/dist/sharedUtils/gen/core/ApiResult.d.ts +0 -7
  245. package/dist/sharedUtils/gen/core/CancelablePromise.d.ts +0 -26
  246. package/dist/sharedUtils/gen/core/OpenAPI.d.ts +0 -27
  247. package/dist/sharedUtils/gen/core/request.d.ts +0 -29
  248. package/dist/sharedUtils/gen/index.d.ts +0 -6
  249. package/dist/sharedUtils/gen/schemas.gen.d.ts +0 -7036
  250. package/dist/sharedUtils/gen/services.gen.d.ts +0 -6047
  251. package/dist/sharedUtils/gen/types.gen.d.ts +0 -21881
  252. package/dist/sharedUtils/history.svelte.d.ts +0 -9
  253. package/dist/sharedUtils/hub.d.ts +0 -49
  254. package/dist/sharedUtils/jsr.json +0 -6
  255. package/dist/sharedUtils/lib.d.ts +0 -5
  256. package/dist/sharedUtils/lib.es.js +0 -1588
  257. package/dist/sharedUtils/package.json +0 -12
  258. package/dist/sharedUtils/schema.d.ts +0 -3
  259. package/dist/sharedUtils/stores.d.ts +0 -97
  260. package/dist/sharedUtils/svelte5Utils.svelte.d.ts +0 -80
  261. package/dist/sharedUtils/toast.d.ts +0 -8
  262. package/dist/sharedUtils/utils.d.ts +0 -265
  263. package/package/components/copilot/chat/flow/openFlowZod.js +0 -24
  264. /package/package/components/copilot/chat/flow/{openFlowZod.d.ts → openFlowZod.gen.d.ts} +0 -0
@@ -1,4 +1,4 @@
1
- import { FlowConversationService, JobService } from '../../../gen';
1
+ import { FlowConversationsService, JobService } from '../../../gen';
2
2
  import { sendUserToast } from '../../../toast';
3
3
  import { waitJob } from '../../waitJob';
4
4
  import { tick } from 'svelte';
@@ -126,7 +126,7 @@ export class FlowChatManager {
126
126
  async deleteConversation(conversationId) {
127
127
  try {
128
128
  this.deletingConversationId = conversationId;
129
- await FlowConversationService.deleteFlowConversation({
129
+ await FlowConversationsService.deleteFlowConversation({
130
130
  workspace: get(workspaceStore),
131
131
  conversationId
132
132
  });
@@ -176,7 +176,7 @@ export class FlowChatManager {
176
176
  if (!get(workspaceStore) || !this.#path)
177
177
  return [];
178
178
  try {
179
- const response = await FlowConversationService.listFlowConversations({
179
+ const response = await FlowConversationsService.listFlowConversations({
180
180
  workspace: get(workspaceStore),
181
181
  flowPath: this.#path,
182
182
  page: page,
@@ -208,7 +208,7 @@ export class FlowChatManager {
208
208
  const pageToFetch = reset ? 1 : this.page + 1;
209
209
  try {
210
210
  const previousScrollHeight = this.messagesContainer?.scrollHeight || 0;
211
- const response = await FlowConversationService.listConversationMessages({
211
+ const response = await FlowConversationsService.listConversationMessages({
212
212
  workspace: get(workspaceStore),
213
213
  conversationId: conversationIdToUse,
214
214
  page: pageToFetch,
@@ -266,6 +266,15 @@ export class FlowChatManager {
266
266
  messageElement.scrollIntoView({ behavior: 'smooth', block: 'start' });
267
267
  }
268
268
  }
269
+ getLastPersistedMessageSeq() {
270
+ for (let i = this.messages.length - 1; i >= 0; i--) {
271
+ const message = this.messages[i];
272
+ if (!message.id.startsWith('temp-')) {
273
+ return message.created_seq;
274
+ }
275
+ }
276
+ return undefined;
277
+ }
269
278
  // Polling
270
279
  async pollJobResult(jobId) {
271
280
  try {
@@ -291,19 +300,18 @@ export class FlowChatManager {
291
300
  if (!get(workspaceStore))
292
301
  return;
293
302
  try {
294
- const lastId = this.messages[this.messages.length - 1].id;
295
- const response = await FlowConversationService.listConversationMessages({
303
+ const lastSeq = this.getLastPersistedMessageSeq();
304
+ const response = await FlowConversationsService.listConversationMessages({
296
305
  workspace: get(workspaceStore),
297
306
  conversationId: conversationId,
298
307
  page: 1,
299
308
  perPage: 50,
300
- afterId: lastId
309
+ afterSeq: lastSeq
301
310
  });
302
311
  if (options?.isNewConversation) {
303
312
  await this.refreshConversations();
304
313
  }
305
314
  const filteredResponse = response.filter((msg) => msg.message_type !== 'user');
306
- // Add any new intermediate messages not already present
307
315
  for (const msg of filteredResponse) {
308
316
  if (!this.messages.find((m) => m.id === msg.id)) {
309
317
  this.messages = [...this.messages, msg];
@@ -312,7 +320,7 @@ export class FlowChatManager {
312
320
  // Only remove temporary messages when explicitly requested (e.g., after job completion)
313
321
  // During streaming, we keep temp messages to avoid them disappearing due to race conditions
314
322
  if (options?.removeTempMessages) {
315
- this.messages = this.messages.filter((msg) => !msg.id.startsWith('temp-'));
323
+ this.messages = this.messages.filter((msg) => !msg.id.startsWith('temp-') || msg.message_type === 'user');
316
324
  }
317
325
  }
318
326
  catch (error) {
@@ -355,9 +363,10 @@ export class FlowChatManager {
355
363
  // Invalidate the conversation cache
356
364
  delete this.#conversationsCache[currentConversationId];
357
365
  const userMessage = {
358
- id: randomUUID(),
366
+ id: `temp-${randomUUID()}`,
359
367
  content: this.inputMessage.trim(),
360
368
  created_at: new Date().toISOString(),
369
+ created_seq: 0,
361
370
  message_type: 'user',
362
371
  conversation_id: currentConversationId
363
372
  };
@@ -470,6 +479,7 @@ export class FlowChatManager {
470
479
  id: 'temp-' + randomUUID(),
471
480
  content: newContent,
472
481
  created_at: new Date().toISOString(),
482
+ created_seq: 0,
473
483
  message_type: 'tool',
474
484
  conversation_id: currentConversationId,
475
485
  job_id: '',
@@ -493,6 +503,7 @@ export class FlowChatManager {
493
503
  id: assistantMessageId,
494
504
  content: accumulatedContent,
495
505
  created_at: new Date().toISOString(),
506
+ created_seq: 0,
496
507
  message_type: 'assistant',
497
508
  conversation_id: currentConversationId,
498
509
  job_id: '',
@@ -27,7 +27,11 @@ export async function loadFlowModuleState(flowModule) {
27
27
  }
28
28
  catch (e) {
29
29
  console.debug(e);
30
- return emptyFlowModuleState();
30
+ // Leave schema undefined so onSelectedIdChange in FlowModuleComponent
31
+ // can detect the failed inference and retry when the module is selected.
32
+ return {
33
+ previewResult: NEVER_TESTED_THIS_FAR
34
+ };
31
35
  }
32
36
  }
33
37
  export async function pickScript(path, summary, id, hash, kind) {
@@ -27,7 +27,7 @@ import { getNoteEditorContext } from '../../graph/noteEditor.svelte';
27
27
  import { GroupedModulesProxy } from '../../graph/groupedModulesProxy.svelte';
28
28
  import { GroupDisplayState } from '../../graph/groupEditor.svelte';
29
29
  import { matchStructureNode, dfsStructure, moduleToStructureNode } from '../../graph/flowStructure';
30
- let { sidebarSize = $bindable(undefined), disableStaticInputs = false, disableTutorials = false, disableAi = false, disableSettings = false, newFlow = false, smallErrorHandler = false, workspace = $workspaceStore, onTestUpTo, onEditInput, localModuleStates = {}, testModuleStates = new ModulesTestStates(), aiChatOpen, showFlowAiButton, toggleAiChat, isOwner, onTestFlow, isRunning, onCancelTestFlow, onOpenPreview, onHideJobStatus, individualStepTests = false, flowJob = undefined, showJobStatus = false, suspendStatus = $bindable({ val: {} }), onDelete, flowHasChanged } = $props();
30
+ let { sidebarSize = $bindable(undefined), disableStaticInputs = false, disableTutorials = false, disableAi = false, disableSettings = false, newFlow = false, smallErrorHandler = false, workspace = $workspaceStore, onTestUpTo, onEditInput, localModuleStates = {}, testModuleStates = new ModulesTestStates(), aiChatOpen, showFlowAiButton, toggleAiChat, isOwner, onTestFlow, isRunning, onCancelTestFlow, onOpenPreview, onHideJobStatus, individualStepTests = false, flowJob = undefined, showJobStatus = false, suspendStatus = $bindable({ val: {} }), onDelete, controlsPosition = 'top', flowHasChanged } = $props();
31
31
  const { customUi, selectionManager, history, flowStateStore, flowStore, pathStore } = getContext('FlowEditorContext');
32
32
  const moveManager = new MoveManager();
33
33
  const { triggersCount, triggersState } = getContext('TriggerContext');
@@ -405,7 +405,7 @@ $effect(() => {
405
405
  />
406
406
  </div>
407
407
 
408
- <div class="z-10 flex-auto grow bg-surface-secondary" bind:clientHeight={minHeight}>
408
+ <div class="z-10 flex-auto grow min-h-0 bg-surface-secondary" bind:clientHeight={minHeight}>
409
409
  <FlowGraphV2
410
410
  bind:this={graph}
411
411
  earlyStop={flowStore.val.value?.skip_expr !== undefined}
@@ -780,6 +780,7 @@ $effect(() => {
780
780
  {onCancelTestFlow}
781
781
  {onOpenPreview}
782
782
  {onHideJobStatus}
783
+ {controlsPosition}
783
784
  exitNoteMode={() => (noteMode = false)}
784
785
  onNotePositionUpdate={(noteId, position) => {
785
786
  // Update note position via NoteEditor context in edit mode
@@ -35,6 +35,7 @@ interface Props {
35
35
  }>>;
36
36
  onDelete?: (id: string) => void;
37
37
  flowHasChanged?: boolean;
38
+ controlsPosition?: 'top' | 'bottom';
38
39
  }
39
40
  interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
40
41
  new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
@@ -98,7 +98,6 @@ export function createGitSyncContext(workspace) {
98
98
  script_path: repo.script_path,
99
99
  use_individual_branch: repo.use_individual_branch,
100
100
  group_by_folder: repo.group_by_folder,
101
- force_branch: repo.force_branch,
102
101
  settings: repo.settings,
103
102
  exclude_types_override: repo.exclude_types_override
104
103
  };
@@ -364,7 +363,6 @@ export function createGitSyncContext(workspace) {
364
363
  script_path: repoToSave.script_path,
365
364
  use_individual_branch: repoToSave.use_individual_branch,
366
365
  group_by_folder: repoToSave.group_by_folder,
367
- force_branch: repoToSave.force_branch,
368
366
  settings: repoToSave.settings,
369
367
  exclude_types_override: repoToSave.exclude_types_override
370
368
  }
@@ -71,7 +71,7 @@ const diffManager = createFlowDiffManager();
71
71
  let fullWidth = 0;
72
72
  let width = $state(0);
73
73
  let simplifiableFlow = $state(undefined);
74
- let { onInsert = undefined, onDelete = undefined, onMove = undefined, onDuplicate = undefined, onDeleteBranch = undefined, onNewBranch = undefined, onSelect = undefined, onChangeId = undefined, onUpdateMock = undefined, onSelectedIteration = undefined, success = undefined, modules = [], groupedModules: groupedModulesProp = undefined, groupError = undefined, failureModule = undefined, preprocessorModule = undefined, minHeight = 0, maxHeight = undefined, notSelectable = false, flowModuleStates = undefined, testModuleStates = undefined, moduleActions = undefined, selectionManager: selectionManagerProp = undefined, path = undefined, newFlow = false, insertable = false, earlyStop = false, cache = false, scroll = false, moveManager = undefined, download = false, fullSize = false, disableAi = false, triggerNode = false, workspace = $workspaceStore ?? 'NO_WORKSPACE', editMode = false, allowSimplifiedPoll = true, expandedSubflows = $bindable({}), onTestUpTo = undefined, onEditInput = undefined, isOwner = false, onTestFlow = undefined, isRunning = false, onCancelTestFlow = undefined, onOpenPreview = undefined, onHideJobStatus = undefined, individualStepTests = false, flowJob = undefined, showJobStatus = false, suspendStatus = {}, flowHasChanged = false, noteMode = false, notes = undefined, groups = undefined, groupDisplayState: groupDisplayStateProp = undefined, exitNoteMode = undefined, onNotePositionUpdate = undefined, chatInputEnabled = false, sharedViewport = undefined, onViewportChange = undefined, leftHeader = undefined, diffBeforeFlow = undefined, currentInputSchema = undefined, markRemovedAsShadowed = false, multiSelectEnabled = false, onDeleteMultiple = undefined, onDuplicateMultiple = undefined, onMoveMultiple = undefined, movingIds = undefined, outerDivClass = '' } = $props();
74
+ let { onInsert = undefined, onDelete = undefined, onMove = undefined, onDuplicate = undefined, onDeleteBranch = undefined, onNewBranch = undefined, onSelect = undefined, onChangeId = undefined, onUpdateMock = undefined, onSelectedIteration = undefined, success = undefined, modules = [], groupedModules: groupedModulesProp = undefined, groupError = undefined, failureModule = undefined, preprocessorModule = undefined, minHeight = 0, maxHeight = undefined, notSelectable = false, flowModuleStates = undefined, testModuleStates = undefined, moduleActions = undefined, selectionManager: selectionManagerProp = undefined, path = undefined, newFlow = false, insertable = false, earlyStop = false, cache = false, scroll = false, moveManager = undefined, download = false, fullSize = false, disableAi = false, triggerNode = false, workspace = $workspaceStore ?? 'NO_WORKSPACE', editMode = false, allowSimplifiedPoll = true, expandedSubflows = $bindable({}), onTestUpTo = undefined, onEditInput = undefined, isOwner = false, onTestFlow = undefined, isRunning = false, onCancelTestFlow = undefined, onOpenPreview = undefined, onHideJobStatus = undefined, individualStepTests = false, flowJob = undefined, showJobStatus = false, suspendStatus = {}, flowHasChanged = false, noteMode = false, notes = undefined, groups = undefined, groupDisplayState: groupDisplayStateProp = undefined, exitNoteMode = undefined, onNotePositionUpdate = undefined, chatInputEnabled = false, sharedViewport = undefined, onViewportChange = undefined, leftHeader = undefined, diffBeforeFlow = undefined, currentInputSchema = undefined, markRemovedAsShadowed = false, multiSelectEnabled = false, onDeleteMultiple = undefined, onDuplicateMultiple = undefined, onMoveMultiple = undefined, movingIds = undefined, controlsPosition = 'top', outerDivClass = '' } = $props();
75
75
  // Initialize note manager with fine-grained reactivity
76
76
  const noteManager = new NoteManager(() => notes ?? [], (newNodes) => {
77
77
  nodes = newNodes;
@@ -458,11 +458,15 @@ function updateHeight() {
458
458
  else {
459
459
  const minY = Math.min(...nodes.map((n) => n.position.y));
460
460
  const maxBottom = Math.max(...nodes.map((n) => n.position.y + NODE.height + 100));
461
- height = Math.max(maxBottom - minY, minHeight);
461
+ const computed = maxBottom - minY;
462
+ height = Math.max(Math.min(computed, maxHeight ?? computed), minHeight);
462
463
  }
463
464
  }
464
465
  $effect(() => {
466
+ // Track both bounds — updateHeight() reads both, so missing one (as
467
+ // maxHeight was) leaves height stale when only that bound changes.
465
468
  minHeight;
469
+ maxHeight;
466
470
  untrack(() => updateHeight());
467
471
  });
468
472
  const nodeTypes = {
@@ -819,7 +823,7 @@ const modifierKey = isMac() ? 'Meta' : 'Control';
819
823
  </div>
820
824
  {:else}
821
825
  <Controls
822
- position="top-right"
826
+ position={controlsPosition === 'bottom' ? 'bottom-right' : 'top-right'}
823
827
  orientation="horizontal"
824
828
  showLock={false}
825
829
  fitViewOptions={{ nodes: nodes.filter((n) => n.type !== 'note') }}
@@ -126,6 +126,7 @@ interface Props {
126
126
  diffBeforeFlow?: OpenFlow;
127
127
  currentInputSchema?: Record<string, any>;
128
128
  markRemovedAsShadowed?: boolean;
129
+ controlsPosition?: 'top' | 'bottom';
129
130
  outerDivClass?: string;
130
131
  }
131
132
  declare const FlowGraphV2: import("svelte").Component<Props, {
@@ -5,6 +5,7 @@ import { getContext } from 'svelte';
5
5
  import {} from '../../../triggers';
6
6
  import { enterpriseLicense } from '../../../../stores';
7
7
  import { MqttIcon, NatsIcon, KafkaIcon, AwsIcon, GoogleCloudIcon } from '../../../icons';
8
+ import AzureIcon from '../../../icons/AzureIcon.svelte';
8
9
  import {} from '../../../triggers/utils';
9
10
  import { Menu, Menubar, MeltButton, MenuItem, Tooltip } from '../../../meltComponents';
10
11
  import { twMerge } from 'tailwind-merge';
@@ -34,6 +35,7 @@ let triggerTypeConfig = $derived(() => {
34
35
  mqtt: { icon: MqttIcon, countKey: 'mqtt_count', disabled: !$enterpriseLicense },
35
36
  sqs: { icon: AwsIcon, countKey: 'sqs_count', disabled: !$enterpriseLicense },
36
37
  gcp: { icon: GoogleCloudIcon, countKey: 'gcp_count', disabled: !$enterpriseLicense },
38
+ azure: { icon: AzureIcon, countKey: 'azure_count', disabled: !$enterpriseLicense },
37
39
  poll: { icon: SchedulePollIcon },
38
40
  cli: { icon: Terminal },
39
41
  nextcloud: { icon: NextcloudIcon, countKey: 'nextcloud_count' },
@@ -58,6 +60,7 @@ let allTypes = $derived([
58
60
  'mqtt',
59
61
  'sqs',
60
62
  'gcp',
63
+ 'azure',
61
64
  'email',
62
65
  'poll',
63
66
  'cli',
@@ -16,6 +16,6 @@ async function getDeployUiSettingsInner() {
16
16
  if (!get(enterpriseLicense)) {
17
17
  return ALL_DEPLOYABLE;
18
18
  }
19
- let settings = await WorkspaceService.getSettings({ workspace: get(workspaceStore) });
19
+ let settings = await WorkspaceService.getPublicSettings({ workspace: get(workspaceStore) });
20
20
  return settings.deploy_ui ?? ALL_DEPLOYABLE;
21
21
  }
@@ -1,29 +1,16 @@
1
1
  <script lang="ts">"use strict";
2
- let { height = '24px', width = '24px' } = $props();
2
+ let { size = 16, color = undefined, class: clazz = '' } = $props();
3
3
  </script>
4
4
 
5
- <svg id="azure" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 374.5 377.3" {width} {height}
6
- ><style>
7
- .st0-azure {
8
- fill: #00bef2;
9
- }
10
- .st1-azure {
11
- fill: #fff;
12
- stroke: #fff;
13
- stroke-width: 1.2357;
14
- stroke-linecap: round;
15
- stroke-linejoin: round;
16
- }</style><g id="layer1" transform="translate(-39.022 -78.115)"
17
- ><g id="g1016" transform="translate(-63.947 -88.179)"
18
- ><path
19
- id="path1008"
20
- class="st0-azure"
21
- d="M290 166.3c.4 0 .8.5 1.4 1.4.5.8 42.6 51.3 93.6 112.2 51 60.9 92.6 111 92.4 111.3-.1.3-40.7 33.6-90.2 73.9s-91.6 74.6-93.5 76.2c-3.3 2.7-3.5 2.8-4.7 1.6-.7-.7-42.9-35.2-93.8-76.7S102.8 390.5 103 390c.2-.5 42-50.4 93.1-111s92.9-110.7 93.1-111.5c.2-.8.5-1.2.8-1.2z"
22
- /><path
23
- id="path923"
24
- class="st1-azure"
25
- d="M283.1 483.6c-5.8-2.1-12.8-8.1-15.7-13.7-3.6-6.9-3.3-17.7.7-26.3 3.1-6.4 3.1-6.6 1.1-8.1-1.1-.8-14.4-8.2-29.4-16.3-15-8.1-28.1-15.2-29-15.7-1.2-.7-3.2 0-6.8 2.3-11.7 7.4-23.9 6.6-33.5-2.3-6.9-6.4-8.9-10.9-8.9-20.1 0-8.9 1.8-13.5 7.5-19.2 7.7-7.7 18-10.3 27.9-7 5.4 1.8 5.5 1.8 8.9-.8 4-3 36.1-32.3 51.6-47l10.7-10.2-3.2-6.7c-6.5-13.5-3.2-28.5 8.2-37.5 6.2-4.9 10.8-6.4 19.7-6.4 20.8 0 35.3 21.8 27.5 41.3-2.1 5.4-2.1 5.5-.1 8.8 1.7 2.9 30.6 37.8 45.9 55.6 2.7 3.1 5.7 5.6 6.7 5.6s4.4-1 7.6-2.2c14.9-5.9 30.6.7 36.8 15.5 4 9.5.5 22.3-8 30-6 5.4-10.4 7.1-18.4 7.1-5.6 0-7.7-.6-13.6-3.8-4.4-2.4-7.8-3.6-9.2-3.2-2.4.6-39.3 25.9-47.5 32.5-5 4.1-5.4 5.6-2.8 11.7 2.5 6 2.2 15.4-.6 21.3-3.1 6.5-10.8 13-17.5 15-6.8 1.9-10.9 1.9-16.6-.2zm1.7-110.2v-57l-3.2-4.4c-1.8-2.4-3.5-4.4-3.8-4.4-1.3 0-65.9 58.7-65.9 59.9 0 .3 1 3.3 2.2 6.5 1.2 3.3 2.1 8 2 10.7-.1 2.7-.1 5.7-.1 6.7.1 2.3 21.7 16.1 54.1 34.8 8.9 5.2 12 6.5 13.1 5.6 1.3-1.1 1.6-12.2 1.6-58.4zm27.4 50.4c42.8-26.9 50.8-32.3 51.3-34.3.3-1.2.7-5.9.8-10.6l.3-8.4-21.8-25.9c-23.4-27.7-32-37.1-34-37.1-.7 0-4.2 2-7.8 4.4l-6.6 4.4.3 56.9c.3 51 .7 59.6 2.6 59.6.2.1 7-4 14.9-9z"
26
- /></g
27
- ></g
28
- ></svg
5
+ <svg
6
+ xmlns="http://www.w3.org/2000/svg"
7
+ width={`${size}px`}
8
+ height={`${size}px`}
9
+ viewBox="0 0 24 24"
10
+ fill={color ?? 'currentColor'}
11
+ class={clazz}
29
12
  >
13
+ <path
14
+ d="M22.379 23.343a1.62 1.62 0 0 0 1.536-1.1l.029-.092q.053-.164.081-.336v-.016a1.68 1.68 0 0 0-.268-1.227L15.147 5.44a1.63 1.63 0 0 0-1.354-.724l-3.473.011L5.94 8.57a6 6 0 0 0-1.386 1.74L.262 17.717a1.63 1.63 0 0 0 1.422 2.429l-.055-.013zM13.398 7.25l5.322 9.183-10.683.024zm-3.363 12.754-8.316.021 8.318-14.4 1.795 3.1-6.516 11.274z"
15
+ />
16
+ </svg>
@@ -1,6 +1,7 @@
1
1
  interface Props {
2
- height?: string;
3
- width?: string;
2
+ size?: number;
3
+ color?: string | undefined;
4
+ class?: string;
4
5
  }
5
6
  declare const AzureIcon: import("svelte").Component<Props, {}, "">;
6
7
  type AzureIcon = ReturnType<typeof AzureIcon>;
@@ -301,6 +301,14 @@ export const settings = {
301
301
  key: 'disable_password_login',
302
302
  fieldType: 'boolean',
303
303
  storage: 'setting'
304
+ },
305
+ {
306
+ label: 'Auto-login SSO provider',
307
+ description: 'If set, the login page redirects automatically to this provider. Use the OAuth provider key (e.g. "okta", "google") or "saml". The provider must be configured; otherwise the setting is ignored. Visit /user/login?no_sso=1 to bypass the redirect and fall back to the normal login form.',
308
+ key: 'auto_login_provider',
309
+ fieldType: 'text',
310
+ placeholder: 'okta',
311
+ storage: 'setting'
304
312
  }
305
313
  ],
306
314
  'DB Health': [],
@@ -409,6 +417,22 @@ export const settings = {
409
417
  ee_only: '',
410
418
  hiddenIfEmpty: true
411
419
  },
420
+ {
421
+ label: 'Minimum release age (uv / Python)',
422
+ description: 'Refuse to install Python packages younger than this many seconds. Protects against supply-chain attacks via freshly published versions. Wires to <code>uv pip --exclude-newer</code>.',
423
+ key: 'uv_exclude_newer',
424
+ fieldType: 'seconds',
425
+ placeholder: '604800',
426
+ storage: 'setting'
427
+ },
428
+ {
429
+ label: 'Minimum release age (bun / npm)',
430
+ description: 'Refuse to install npm packages younger than this many seconds. Protects against supply-chain attacks via freshly published versions. Sets <code>BUN_INSTALL_MINIMUM_RELEASE_AGE</code>.',
431
+ key: 'bun_install_min_release_age',
432
+ fieldType: 'seconds',
433
+ placeholder: '604800',
434
+ storage: 'setting'
435
+ },
412
436
  {
413
437
  label: 'Nuget Config',
414
438
  description: 'Write a nuget.config file to set custom package sources and credentials. Use <clear /> inside <packageSources> to remove default sources and only use your custom ones',
@@ -9,18 +9,19 @@ import { FlowService, FolderService, IntegrationService, ScriptService } from '.
9
9
  import { mcpEndpointTools } from '../../mcpEndpointTools';
10
10
  import InfoIcon from 'lucide-svelte/icons/info';
11
11
  import { SvelteMap } from 'svelte/reactivity';
12
- let { workspaceId, scope = $bindable() } = $props();
13
- let selectedMode = $state('favorites');
14
- let selectedFolders = $state([]);
12
+ let { workspaceId, scope = $bindable(), initialScope } = $props();
13
+ const parsedInitial = parseInitialScope(initialScope);
14
+ let selectedMode = $state(parsedInitial.mode);
15
+ let selectedFolders = $state(parsedInitial.folders);
15
16
  let allFolders = $state([]);
16
17
  let loadingFolders = $state(false);
17
18
  let folderNamesCache = new Map();
18
- let selectedScripts = $state([]);
19
- let selectedFlows = $state([]);
20
- let selectedEndpoints = $state([]);
21
- let customScriptPatterns = $state('');
22
- let customFlowPatterns = $state('');
23
- let newMcpApps = $state([]);
19
+ let selectedScripts = $state(parsedInitial.scripts);
20
+ let selectedFlows = $state(parsedInitial.flows);
21
+ let selectedEndpoints = $state(parsedInitial.endpoints);
22
+ let customScriptPatterns = $state(parsedInitial.scriptPatterns);
23
+ let customFlowPatterns = $state(parsedInitial.flowPatterns);
24
+ let newMcpApps = $state(parsedInitial.hubApps);
24
25
  let allScripts = $state([]);
25
26
  let allFlows = $state([]);
26
27
  let allApps = $state([]);
@@ -35,6 +36,88 @@ function parsePatterns(input) {
35
36
  .map((p) => p.trim())
36
37
  .filter((p) => p.length > 0);
37
38
  }
39
+ function parseInitialScope(input) {
40
+ const empty = {
41
+ mode: 'favorites',
42
+ folders: [],
43
+ scripts: [],
44
+ flows: [],
45
+ endpoints: [],
46
+ scriptPatterns: '',
47
+ flowPatterns: '',
48
+ hubApps: []
49
+ };
50
+ if (!input)
51
+ return empty;
52
+ const parts = input.split(/\s+/).filter((p) => p.length > 0);
53
+ if (parts.length === 0)
54
+ return empty;
55
+ const byKind = {};
56
+ let mode = 'custom';
57
+ const hubApps = [];
58
+ for (const part of parts) {
59
+ if (part === 'mcp:favorites') {
60
+ mode = 'favorites';
61
+ }
62
+ else if (part === 'mcp:all') {
63
+ mode = 'all';
64
+ }
65
+ else if (part.startsWith('mcp:hub:')) {
66
+ hubApps.push(...parsePatterns(part.slice('mcp:hub:'.length)));
67
+ }
68
+ else if (part.startsWith('mcp:scripts:')) {
69
+ byKind.scripts = parsePatterns(part.slice('mcp:scripts:'.length));
70
+ }
71
+ else if (part.startsWith('mcp:flows:')) {
72
+ byKind.flows = parsePatterns(part.slice('mcp:flows:'.length));
73
+ }
74
+ else if (part.startsWith('mcp:endpoints:')) {
75
+ byKind.endpoints = parsePatterns(part.slice('mcp:endpoints:'.length));
76
+ }
77
+ }
78
+ // Detect folder mode: scripts and flows are exclusively `f/X/*` patterns
79
+ // for the same set of folders, and endpoints is exactly `*`.
80
+ const folderRe = /^f\/([^/]+)\/\*$/;
81
+ const scriptFolders = (byKind.scripts ?? []).map((p) => p.match(folderRe)?.[1]);
82
+ const flowFolders = (byKind.flows ?? []).map((p) => p.match(folderRe)?.[1]);
83
+ const allScriptsAreFolders = scriptFolders.length > 0 && scriptFolders.every((f) => !!f);
84
+ const allFlowsAreFolders = flowFolders.length > 0 && flowFolders.every((f) => !!f);
85
+ const sameFolders = allScriptsAreFolders &&
86
+ allFlowsAreFolders &&
87
+ scriptFolders.length === flowFolders.length &&
88
+ scriptFolders.every((f, i) => f === flowFolders[i]);
89
+ const endpointsIsAll = byKind.endpoints?.length === 1 && byKind.endpoints[0] === '*';
90
+ if (mode !== 'favorites' && mode !== 'all' && sameFolders && endpointsIsAll) {
91
+ return {
92
+ mode: 'folder',
93
+ folders: scriptFolders.filter((f) => !!f),
94
+ scripts: [],
95
+ flows: [],
96
+ endpoints: [],
97
+ scriptPatterns: '',
98
+ flowPatterns: '',
99
+ hubApps
100
+ };
101
+ }
102
+ if (mode === 'favorites' || mode === 'all') {
103
+ return { ...empty, mode, hubApps };
104
+ }
105
+ // Custom mode: split each list into "selectable" entries (later filtered
106
+ // against allScripts/allFlows once loaded) and free-form patterns.
107
+ // We can't know yet which are real paths vs wildcard patterns, so pass
108
+ // everything as patterns; once allScripts/allFlows load, $effect will
109
+ // move matching entries into selectedScripts/selectedFlows.
110
+ return {
111
+ mode: 'custom',
112
+ folders: [],
113
+ scripts: [],
114
+ flows: [],
115
+ endpoints: byKind.endpoints ?? [],
116
+ scriptPatterns: (byKind.scripts ?? []).join(','),
117
+ flowPatterns: (byKind.flows ?? []).join(','),
118
+ hubApps
119
+ };
120
+ }
38
121
  // Compute scope string from selections
39
122
  $effect(() => {
40
123
  let scopeParts = [];
@@ -229,6 +312,33 @@ $effect(() => {
229
312
  loadAllScriptsAndFlows(workspaceId);
230
313
  }
231
314
  });
315
+ // One-shot: once allScripts/allFlows are loaded, split the
316
+ // initial pattern text into known paths (selectedScripts/Flows) vs
317
+ // remaining wildcards/unknowns (kept in pattern textbox).
318
+ let initialSplitDone = $state(false);
319
+ $effect(() => {
320
+ if (initialSplitDone || selectedMode !== 'custom')
321
+ return;
322
+ if (allScripts.length === 0 && allFlows.length === 0)
323
+ return;
324
+ const scriptSet = new Set(allScripts);
325
+ const flowSet = new Set(allFlows);
326
+ const scriptParts = parsePatterns(customScriptPatterns);
327
+ const knownScripts = scriptParts.filter((p) => scriptSet.has(p));
328
+ const remainingScripts = scriptParts.filter((p) => !scriptSet.has(p));
329
+ const flowParts = parsePatterns(customFlowPatterns);
330
+ const knownFlows = flowParts.filter((p) => flowSet.has(p));
331
+ const remainingFlows = flowParts.filter((p) => !flowSet.has(p));
332
+ if (knownScripts.length > 0) {
333
+ selectedScripts = [...new Set([...selectedScripts, ...knownScripts])];
334
+ customScriptPatterns = remainingScripts.join(',');
335
+ }
336
+ if (knownFlows.length > 0) {
337
+ selectedFlows = [...new Set([...selectedFlows, ...knownFlows])];
338
+ customFlowPatterns = remainingFlows.join(',');
339
+ }
340
+ initialSplitDone = true;
341
+ });
232
342
  const warning = $derived(selectedMode === 'all'
233
343
  ? 'Create your first scripts or flows to make them available via MCP.'
234
344
  : selectedMode === 'favorites'
@@ -1,6 +1,7 @@
1
1
  interface Props {
2
2
  workspaceId: string;
3
3
  scope: string;
4
+ initialScope?: string;
4
5
  }
5
6
  declare const McpScopeSelector: import("svelte").Component<Props, {}, "scope">;
6
7
  type McpScopeSelector = ReturnType<typeof McpScopeSelector>;
@@ -26,6 +26,7 @@ const TRIGGER_TABLE_TO_ROUTE = {
26
26
  nats_trigger: 'nats_triggers',
27
27
  sqs_trigger: 'sqs_triggers',
28
28
  gcp_trigger: 'gcp_triggers',
29
+ azure_trigger: 'azure_triggers',
29
30
  email_trigger: 'email_triggers'
30
31
  };
31
32
  const TRIGGER_TABLE_TO_LABEL = {
@@ -37,6 +38,7 @@ const TRIGGER_TABLE_TO_LABEL = {
37
38
  nats_trigger: 'nats trigger',
38
39
  sqs_trigger: 'sqs trigger',
39
40
  gcp_trigger: 'gcp trigger',
41
+ azure_trigger: 'azure trigger',
40
42
  email_trigger: 'email trigger'
41
43
  };
42
44
  export function flattenPaths(p) {
@@ -3,7 +3,7 @@ import { linear } from 'svelte/easing';
3
3
  import { twMerge } from 'tailwind-merge';
4
4
  import { Loader2 } from 'lucide-svelte';
5
5
  import { fade } from 'svelte/transition';
6
- let { error = undefined, index, subIndex, subLength, nextInProgress = false, subIndexIsPercent = false, compact = false, hideStepTitle = false, slim = false, length, class: className = '', textPosition = 'top', stepId, showStepId = false, isWaitingForEvents = false, isCanceled = false, isScheduled = false } = $props();
6
+ let { error = undefined, index, subIndex, subLength, nextInProgress = false, subIndexIsPercent = false, compact = false, hideStepTitle = false, slim = false, length, class: className = '', textPosition = 'top', stepId, showStepId = false, isWaitingForEvents = false, isCanceled = false, isScheduled = false, isSkipped = false } = $props();
7
7
  let duration = 200;
8
8
  let percent = new Tween(0, { duration, easing: linear });
9
9
  export function resetP() {
@@ -87,13 +87,15 @@ const status = $derived(error != undefined ? 'error' : finished ? 'done' : 'runn
87
87
  : 'text-blue-700 dark:text-blue-200'}"
88
88
  >
89
89
  <div class={twMerge(slim ? 'text-xs' : 'text-sm', 'flex items-center gap-1')}>
90
- {#if status == 'running' && !isCanceled && !isScheduled}
90
+ {#if status == 'running' && !isCanceled && !isScheduled && !isSkipped}
91
91
  <Loader2 class="animate-spin" size={14} />
92
92
  {/if}
93
- {#key status + isWaitingForEvents + stepId + isCanceled + isScheduled}
93
+ {#key status + isWaitingForEvents + stepId + isCanceled + isScheduled + isSkipped}
94
94
  <span in:fade={{ duration: 150 }}>
95
95
  {#if status == 'error'}
96
96
  Error occurred
97
+ {:else if isSkipped}
98
+ Skipped
97
99
  {:else if status == 'done' && isCanceled}
98
100
  Canceled
99
101
  {:else if status == 'done'}
@@ -109,9 +111,11 @@ const status = $derived(error != undefined ? 'error' : finished ? 'done' : 'runn
109
111
  {:else if hideStepTitle}
110
112
  {isCanceled ? 'Canceled' : 'Running'}
111
113
  {:else if subIndexIsPercent}
112
- {(isCanceled ? 'Canceled at ' : '') + `Step ${index + 1} (${subIndex !== undefined ? subIndex + '%' : ''})`}
114
+ {(isCanceled ? 'Canceled at ' : '') +
115
+ `Step ${index + 1} (${subIndex !== undefined ? subIndex + '%' : ''})`}
113
116
  {:else}
114
- {(isCanceled ? 'Canceled at ' : '') + `Step ${index + 1}${subIndex !== undefined ? `.${subIndex + 1}` : ''}`}
117
+ {(isCanceled ? 'Canceled at ' : '') +
118
+ `Step ${index + 1}${subIndex !== undefined ? `.${subIndex + 1}` : ''}`}
115
119
  {/if}
116
120
  </span>
117
121
  {/key}
@@ -16,6 +16,7 @@ interface Props {
16
16
  isWaitingForEvents?: boolean;
17
17
  isCanceled?: boolean;
18
18
  isScheduled?: boolean;
19
+ isSkipped?: boolean;
19
20
  }
20
21
  declare const ProgressBar: import("svelte").Component<Props, {
21
22
  resetP: () => void;
@@ -0,0 +1,52 @@
1
+ <script lang="ts">import Toggle from '../Toggle.svelte';
2
+ import { Button, SecondsInput } from '../common';
3
+ import { Trash } from 'lucide-svelte';
4
+ import Popover from '../meltComponents/Popover.svelte';
5
+ import { autoPlacement } from '@floating-ui/core';
6
+ let { delete_after_secs = $bindable(), btnProps } = $props();
7
+ const enabled = $derived(typeof delete_after_secs === 'number' && delete_after_secs >= 0);
8
+ </script>
9
+
10
+ <Popover
11
+ floatingConfig={{
12
+ middleware: [
13
+ autoPlacement({
14
+ allowedPlacements: ['bottom-start', 'bottom-end', 'top-start', 'top-end', 'top', 'bottom']
15
+ })
16
+ ]
17
+ }}
18
+ closeButton
19
+ contentClasses="block text-primary p-4"
20
+ >
21
+ {#snippet trigger()}
22
+ <Button
23
+ nonCaptureEvent={true}
24
+ btnClasses={enabled
25
+ ? 'bg-blue-100 text-blue-800 border border-blue-300 hover:bg-blue-200 dark:bg-frost-700 dark:text-frost-100 dark:border-frost-600'
26
+ : 'bg-surface text-primary hover:bg-hover'}
27
+ color="light"
28
+ variant="contained"
29
+ size="xs2"
30
+ iconOnly
31
+ startIcon={{ icon: Trash }}
32
+ title="Delete job metadata after the job completes"
33
+ {...btnProps}
34
+ />
35
+ {/snippet}
36
+ {#snippet content()}
37
+ <Toggle
38
+ checked={enabled}
39
+ on:change={() => {
40
+ delete_after_secs = enabled ? undefined : 0
41
+ }}
42
+ options={{
43
+ right: 'Delete job metadata after the job completes'
44
+ }}
45
+ />
46
+ <div class="mt-4">
47
+ <span class="text-xs font-bold">Delay before deletion</span>
48
+ <SecondsInput bind:seconds={delete_after_secs} disabled={!enabled} />
49
+ <span class="text-2xs text-tertiary block mt-1">0 = immediate</span>
50
+ </div>
51
+ {/snippet}
52
+ </Popover>
@@ -0,0 +1,9 @@
1
+ import { Button } from '../common';
2
+ import type { ComponentProps } from 'svelte';
3
+ interface Props {
4
+ delete_after_secs: number | undefined;
5
+ btnProps?: ComponentProps<typeof Button>;
6
+ }
7
+ declare const DeleteAfterUsePopup: import("svelte").Component<Props, {}, "delete_after_secs">;
8
+ type DeleteAfterUsePopup = ReturnType<typeof DeleteAfterUsePopup>;
9
+ export default DeleteAfterUsePopup;