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.
- package/package/components/ArgInput.svelte +2 -0
- package/package/components/AutoscalingConfigEditor.svelte +18 -4
- package/package/components/CompareWorkspaces.svelte +206 -157
- package/package/components/DatatableSchemaDiff.svelte +2 -2
- package/package/components/Dev.svelte +401 -85
- package/package/components/EditableSchemaForm.svelte +4 -0
- package/package/components/ErrorOrRecoveryHandler.svelte +2 -2
- package/package/components/FlowPreviewContent.svelte +32 -30
- package/package/components/FlowRestartButton.svelte +143 -61
- package/package/components/FlowRestartButton.svelte.d.ts +37 -0
- package/package/components/FlowStatusViewer.svelte +15 -1
- package/package/components/FlowStatusViewer.svelte.d.ts +10 -2
- package/package/components/FlowStatusViewerInner.svelte +1 -2
- package/package/components/FlowStatusViewerInner.svelte.d.ts +6 -2
- package/package/components/ForkConflictModal.svelte +57 -0
- package/package/components/ForkConflictModal.svelte.d.ts +3 -0
- package/package/components/GitRepoViewer.svelte +251 -97
- package/package/components/InputTransformSchemaForm.svelte +1 -1
- package/package/components/InstanceSettings.svelte +36 -16
- package/package/components/Login.svelte +113 -28
- package/package/components/Login.svelte.d.ts +1 -0
- package/package/components/Path.svelte +7 -1
- package/package/components/Path.svelte.d.ts +1 -1
- package/package/components/RunsPage.svelte +2 -1
- package/package/components/S3FilePickerInner.svelte +89 -89
- package/package/components/ScriptEditor.svelte +18 -5
- package/package/components/ShareModal.svelte.d.ts +1 -1
- package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +3 -0
- package/package/components/apps/components/helpers/executeRunnable.js +2 -1
- package/package/components/apps/editor/AppReportsDrawerInner.svelte +1 -1
- package/package/components/apps/editor/appPolicy.js +2 -1
- package/package/components/apps/editor/commonAppUtils.d.ts +3 -0
- package/package/components/apps/editor/inlineScriptsPanel/CacheTtlPopup.svelte +1 -1
- package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte +7 -0
- package/package/components/apps/editor/inlineScriptsPanel/TagPopup.svelte +49 -0
- package/package/components/apps/editor/inlineScriptsPanel/TagPopup.svelte.d.ts +9 -0
- package/package/components/apps/inputType.d.ts +1 -0
- package/package/components/apps/sharedTypes.d.ts +1 -0
- package/package/components/auditLogs/AuditLogsFilters.svelte +8 -3
- package/package/components/common/fileUpload/S3ArgInput.svelte +12 -10
- package/package/components/common/fileUpload/S3ArgInput.svelte.d.ts +2 -0
- package/package/components/copilot/chat/AIChatDisplay.svelte +5 -36
- package/package/components/copilot/chat/AIChatInput.svelte +56 -47
- package/package/components/copilot/chat/AIChatManager.svelte.js +48 -46
- package/package/components/copilot/chat/ContextElementBadge.svelte +6 -4
- package/package/components/copilot/chat/app/core.d.ts +12 -20
- package/package/components/copilot/chat/app/core.js +103 -160
- package/package/components/copilot/chat/app/core.test.js +234 -9
- package/package/components/copilot/chat/context.js +44 -0
- package/package/components/copilot/chat/flow/FlowAIChat.svelte +5 -3
- package/package/components/copilot/chat/flow/core.d.ts +2 -1
- package/package/components/copilot/chat/flow/core.js +48 -21
- package/package/components/copilot/chat/flow/helperUtils.d.ts +5 -2
- package/package/components/copilot/chat/flow/helperUtils.js +33 -1
- package/package/components/copilot/chat/flow/helperUtils.test.js +116 -1
- package/package/components/copilot/chat/flow/openFlow.json +1 -1
- package/package/components/copilot/chat/flow/openFlowZod.gen.js +24 -0
- package/package/components/copilot/chat/script/core.js +3 -0
- package/package/components/copilot/chat/shared.d.ts +6 -0
- package/package/components/copilot/chat/shared.js +22 -1
- package/package/components/copilot/chat/shared.test.d.ts +1 -0
- package/package/components/copilot/chat/shared.test.js +412 -0
- package/package/components/copilot/chat/workspaceTools.d.ts +7 -0
- package/package/components/copilot/chat/workspaceTools.js +239 -0
- package/package/components/copilot/chat/workspaceToolsZod.gen.d.ts +1295 -0
- package/package/components/copilot/chat/workspaceToolsZod.gen.js +424 -0
- package/package/components/copilot/lib.js +3 -1
- package/package/components/copilot/lib.test.d.ts +1 -0
- package/package/components/copilot/lib.test.js +19 -0
- package/package/components/copilot/modelConfig.d.ts +3 -0
- package/package/components/copilot/modelConfig.js +10 -0
- package/package/components/flows/FlowProgressBar.svelte +5 -2
- package/package/components/flows/content/FlowModuleComponent.svelte +636 -599
- package/package/components/flows/conversations/FlowChatManager.svelte.js +21 -10
- package/package/components/flows/flowStateUtils.svelte.js +5 -1
- package/package/components/flows/map/FlowModuleSchemaMap.svelte +3 -2
- package/package/components/flows/map/FlowModuleSchemaMap.svelte.d.ts +1 -0
- package/package/components/git_sync/GitSyncContext.svelte.js +0 -2
- package/package/components/graph/FlowGraphV2.svelte +7 -3
- package/package/components/graph/FlowGraphV2.svelte.d.ts +1 -0
- package/package/components/graph/renderers/triggers/TriggersBadge.svelte +3 -0
- package/package/components/home/deploy_ui.js +1 -1
- package/package/components/icons/AzureIcon.svelte +12 -25
- package/package/components/icons/AzureIcon.svelte.d.ts +3 -2
- package/package/components/instanceSettings.js +24 -0
- package/package/components/mcp/McpScopeSelector.svelte +119 -9
- package/package/components/mcp/McpScopeSelector.svelte.d.ts +1 -0
- package/package/components/offboarding-utils.js +2 -0
- package/package/components/progressBar/ProgressBar.svelte +9 -5
- package/package/components/progressBar/ProgressBar.svelte.d.ts +1 -0
- package/package/components/raw_apps/DeleteAfterUsePopup.svelte +52 -0
- package/package/components/raw_apps/DeleteAfterUsePopup.svelte.d.ts +9 -0
- package/package/components/raw_apps/RawAppBackgroundRunner.svelte +5 -1
- package/package/components/raw_apps/RawAppEditor.svelte +159 -102
- package/package/components/raw_apps/RawAppInlineScriptEditor.svelte +9 -3
- package/package/components/raw_apps/RawAppInlineScriptEditor.svelte.d.ts +2 -1
- package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte +1 -0
- package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte.d.ts +1 -0
- package/package/components/raw_apps/RawAppInputsSpecEditor.svelte +48 -5
- package/package/components/raw_apps/RawAppSharedUiDrawer.svelte +129 -0
- package/package/components/raw_apps/RawAppSharedUiDrawer.svelte.d.ts +5 -0
- package/package/components/raw_apps/RawAppSidebar.svelte +12 -0
- package/package/components/raw_apps/dataTableRefUtils.d.ts +7 -0
- package/package/components/raw_apps/dataTableRefUtils.js +34 -0
- package/package/components/raw_apps/dataTableRefUtils.test.d.ts +1 -0
- package/package/components/raw_apps/dataTableRefUtils.test.js +29 -0
- package/package/components/raw_apps/rawAppPolicy.d.ts +1 -0
- package/package/components/raw_apps/rawAppPolicy.js +17 -2
- package/package/components/resources/resourceTypesFilter.d.ts +19 -0
- package/package/components/resources/resourceTypesFilter.js +21 -0
- package/package/components/restartFromStepPath.d.ts +39 -0
- package/package/components/restartFromStepPath.js +89 -0
- package/package/components/runs/JobDetailFieldConfig.d.ts +1 -0
- package/package/components/runs/JobDetailFieldConfig.js +57 -10
- package/package/components/runs/JobDetailHeader.svelte +24 -3
- package/package/components/runs/runsFilter.d.ts +1 -1
- package/package/components/schema/FlowPropertyEditor.svelte +30 -1
- package/package/components/schema/FlowPropertyEditor.svelte.d.ts +5 -2
- package/package/components/search/GlobalSearchModal.svelte +8 -1
- package/package/components/select/Select.svelte +1 -1
- package/package/components/settings/CreateToken.svelte +48 -77
- package/package/components/settings/EditTokenScopesModal.svelte +57 -0
- package/package/components/settings/EditTokenScopesModal.svelte.d.ts +10 -0
- package/package/components/settings/ScopesPicker.svelte +43 -0
- package/package/components/settings/ScopesPicker.svelte.d.ts +11 -0
- package/package/components/settings/TokensTable.svelte +51 -15
- package/package/components/sidebar/OperatorMenu.svelte +6 -0
- package/package/components/sidebar/SidebarContent.svelte +11 -1
- package/package/components/triggers/AddTriggersButton.svelte +6 -0
- package/package/components/triggers/CaptureWrapper.svelte +19 -1
- package/package/components/triggers/TriggerEditorToolbar.svelte.d.ts +1 -1
- package/package/components/triggers/TriggerModeToggle.svelte +36 -7
- package/package/components/triggers/TriggerModeToggle.svelte.d.ts +1 -1
- package/package/components/triggers/TriggerSuspendedJobsModal.svelte.d.ts +1 -1
- package/package/components/triggers/TriggersEditor.svelte +5 -1
- package/package/components/triggers/TriggersWrapper.svelte +10 -0
- package/package/components/triggers/azure/AzureCapture.svelte +41 -0
- package/package/components/triggers/azure/AzureCapture.svelte.d.ts +44 -0
- package/package/components/triggers/azure/AzureTriggerEditor.svelte +20 -0
- package/package/components/triggers/azure/AzureTriggerEditor.svelte.d.ts +9 -0
- package/package/components/triggers/azure/AzureTriggerEditorConfigSection.svelte +301 -0
- package/package/components/triggers/azure/AzureTriggerEditorConfigSection.svelte.d.ts +16 -0
- package/package/components/triggers/azure/AzureTriggerEditorInner.svelte +422 -0
- package/package/components/triggers/azure/AzureTriggerEditorInner.svelte.d.ts +25 -0
- package/package/components/triggers/azure/AzureTriggerPanel.svelte +55 -0
- package/package/components/triggers/azure/AzureTriggerPanel.svelte.d.ts +10 -0
- package/{dist/sharedUtils/components/triggers/kafka → package/components/triggers/azure}/utils.d.ts +1 -1
- package/package/components/triggers/azure/utils.js +56 -0
- package/package/components/triggers/email/EmailTriggerEditorInner.svelte +2 -0
- package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +9 -3
- package/package/components/triggers/http/RouteEditorInner.svelte +2 -0
- package/package/components/triggers/kafka/KafkaTriggerEditorInner.svelte +9 -3
- package/package/components/triggers/mqtt/MqttTriggerEditorInner.svelte +9 -3
- package/package/components/triggers/nats/NatsTriggerEditorInner.svelte +9 -3
- package/package/components/triggers/postgres/PostgresTriggerEditorInner.svelte +9 -3
- package/package/components/triggers/schedules/ScheduleEditorInner.svelte +9 -3
- package/package/components/triggers/sqs/SqsTriggerEditorInner.svelte +9 -3
- package/package/components/triggers/triggers.svelte.d.ts +1 -0
- package/package/components/triggers/triggers.svelte.js +23 -1
- package/package/components/triggers/utils.js +20 -0
- package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +9 -3
- package/package/components/triggers.d.ts +1 -1
- package/package/components/useNestedRestartState.svelte.d.ts +56 -0
- package/package/components/useNestedRestartState.svelte.js +320 -0
- package/package/components/workspaceSettings/SharedUiSettings.svelte +175 -0
- package/package/components/workspaceSettings/SharedUiSettings.svelte.d.ts +3 -0
- package/package/gen/core/OpenAPI.js +1 -1
- package/package/gen/schemas.gen.d.ts +294 -24
- package/package/gen/schemas.gen.js +297 -25
- package/package/gen/services.gen.d.ts +247 -4
- package/package/gen/services.gen.js +498 -7
- package/package/gen/types.gen.d.ts +990 -37
- package/package/hubPaths.json +2 -5
- package/package/infer.d.ts +1 -1
- package/package/infer.js +37 -51
- package/package/mcpEndpointTools.js +60 -4
- package/package/script_helpers.js +17 -0
- package/package/stores.d.ts +7 -0
- package/package/stores.js +6 -1
- package/package/system_prompts/index.d.ts +1 -0
- package/package/system_prompts/index.js +8 -0
- package/package/system_prompts/prompts.d.ts +16 -13
- package/package/system_prompts/prompts.js +653 -43
- package/package/templates/ci_test_bun.ts.template +8 -0
- package/package/templates/ci_test_python.py.template +8 -0
- package/package/utils/forkConflict.d.ts +26 -0
- package/package/utils/forkConflict.js +56 -0
- package/package/utils_deployable.d.ts +164 -121
- package/package/utils_deployable.js +61 -11
- package/package/utils_workspace_deploy.js +3 -1
- package/package.json +28 -4
- package/dist/sharedUtils/assets/tokens/colorTokensConfig.d.ts +0 -2
- package/dist/sharedUtils/base.d.ts +0 -1
- package/dist/sharedUtils/cloud.d.ts +0 -1
- package/dist/sharedUtils/common.d.ts +0 -111
- package/dist/sharedUtils/components/apps/components/display/dbtable/queries/count.d.ts +0 -5
- package/dist/sharedUtils/components/apps/components/display/dbtable/queries/delete.d.ts +0 -5
- package/dist/sharedUtils/components/apps/components/display/dbtable/queries/insert.d.ts +0 -5
- package/dist/sharedUtils/components/apps/components/display/dbtable/queries/select.d.ts +0 -13
- package/dist/sharedUtils/components/apps/components/display/dbtable/queries/update.d.ts +0 -11
- package/dist/sharedUtils/components/apps/components/display/dbtable/utils.d.ts +0 -95
- package/dist/sharedUtils/components/apps/editor/appPolicy.d.ts +0 -6
- package/dist/sharedUtils/components/apps/editor/appUtilsCore.d.ts +0 -7
- package/dist/sharedUtils/components/apps/editor/appUtilsS3.d.ts +0 -33
- package/dist/sharedUtils/components/apps/editor/commonAppUtils.d.ts +0 -10
- package/dist/sharedUtils/components/apps/editor/component/components.d.ts +0 -5371
- package/dist/sharedUtils/components/apps/editor/component/default-codes.d.ts +0 -3
- package/dist/sharedUtils/components/apps/editor/component/index.d.ts +0 -3
- package/dist/sharedUtils/components/apps/editor/component/sets.d.ts +0 -7
- package/dist/sharedUtils/components/apps/editor/componentsPanel/componentDefaultProps.d.ts +0 -3
- package/dist/sharedUtils/components/apps/gridUtils.d.ts +0 -14
- package/dist/sharedUtils/components/apps/inputType.d.ts +0 -178
- package/dist/sharedUtils/components/apps/rx.d.ts +0 -29
- package/dist/sharedUtils/components/apps/sharedTypes.d.ts +0 -21
- package/dist/sharedUtils/components/apps/types.d.ts +0 -274
- package/dist/sharedUtils/components/assets/lib.d.ts +0 -25
- package/dist/sharedUtils/components/common/alert/model.d.ts +0 -2
- package/dist/sharedUtils/components/common/badge/model.d.ts +0 -8
- package/dist/sharedUtils/components/common/button/model.d.ts +0 -45
- package/dist/sharedUtils/components/common/fileInput/model.d.ts +0 -1
- package/dist/sharedUtils/components/common/index.d.ts +0 -24
- package/dist/sharedUtils/components/common/skeleton/model.d.ts +0 -21
- package/dist/sharedUtils/components/dbTypes.d.ts +0 -14
- package/dist/sharedUtils/components/diff_drawer.d.ts +0 -26
- package/dist/sharedUtils/components/ducklake.d.ts +0 -1
- package/dist/sharedUtils/components/flows/scheduleUtils.d.ts +0 -7
- package/dist/sharedUtils/components/icons/index.d.ts +0 -101
- package/dist/sharedUtils/components/random_positive_adjetive.d.ts +0 -1
- package/dist/sharedUtils/components/raw_apps/rawAppPolicy.d.ts +0 -10
- package/dist/sharedUtils/components/raw_apps/utils.d.ts +0 -15
- package/dist/sharedUtils/components/triggers/email/utils.d.ts +0 -4
- package/dist/sharedUtils/components/triggers/gcp/utils.d.ts +0 -2
- package/dist/sharedUtils/components/triggers/http/utils.d.ts +0 -11
- package/dist/sharedUtils/components/triggers/mqtt/utils.d.ts +0 -2
- package/dist/sharedUtils/components/triggers/nats/utils.d.ts +0 -2
- package/dist/sharedUtils/components/triggers/postgres/utils.d.ts +0 -8
- package/dist/sharedUtils/components/triggers/sqs/utils.d.ts +0 -2
- package/dist/sharedUtils/components/triggers/triggers.svelte.d.ts +0 -32
- package/dist/sharedUtils/components/triggers/utils.d.ts +0 -80
- package/dist/sharedUtils/components/triggers/websocket/utils.d.ts +0 -2
- package/dist/sharedUtils/components/triggers.d.ts +0 -20
- package/dist/sharedUtils/gen/core/ApiError.d.ts +0 -10
- package/dist/sharedUtils/gen/core/ApiRequestOptions.d.ts +0 -13
- package/dist/sharedUtils/gen/core/ApiResult.d.ts +0 -7
- package/dist/sharedUtils/gen/core/CancelablePromise.d.ts +0 -26
- package/dist/sharedUtils/gen/core/OpenAPI.d.ts +0 -27
- package/dist/sharedUtils/gen/core/request.d.ts +0 -29
- package/dist/sharedUtils/gen/index.d.ts +0 -6
- package/dist/sharedUtils/gen/schemas.gen.d.ts +0 -7036
- package/dist/sharedUtils/gen/services.gen.d.ts +0 -6047
- package/dist/sharedUtils/gen/types.gen.d.ts +0 -21881
- package/dist/sharedUtils/history.svelte.d.ts +0 -9
- package/dist/sharedUtils/hub.d.ts +0 -49
- package/dist/sharedUtils/jsr.json +0 -6
- package/dist/sharedUtils/lib.d.ts +0 -5
- package/dist/sharedUtils/lib.es.js +0 -1588
- package/dist/sharedUtils/package.json +0 -12
- package/dist/sharedUtils/schema.d.ts +0 -3
- package/dist/sharedUtils/stores.d.ts +0 -97
- package/dist/sharedUtils/svelte5Utils.svelte.d.ts +0 -80
- package/dist/sharedUtils/toast.d.ts +0 -8
- package/dist/sharedUtils/utils.d.ts +0 -265
- package/package/components/copilot/chat/flow/openFlowZod.js +0 -24
- /package/package/components/copilot/chat/flow/{openFlowZod.d.ts → openFlowZod.gen.d.ts} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
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
|
|
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
|
|
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
|
|
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
|
|
295
|
-
const response = await
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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=
|
|
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.
|
|
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 {
|
|
2
|
+
let { size = 16, color = undefined, class: clazz = '' } = $props();
|
|
3
3
|
</script>
|
|
4
4
|
|
|
5
|
-
<svg
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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>
|
|
@@ -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
|
-
|
|
14
|
-
let
|
|
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'
|
|
@@ -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 ' : '') +
|
|
114
|
+
{(isCanceled ? 'Canceled at ' : '') +
|
|
115
|
+
`Step ${index + 1} (${subIndex !== undefined ? subIndex + '%' : ''})`}
|
|
113
116
|
{:else}
|
|
114
|
-
{(isCanceled ? 'Canceled at ' : '') +
|
|
117
|
+
{(isCanceled ? 'Canceled at ' : '') +
|
|
118
|
+
`Step ${index + 1}${subIndex !== undefined ? `.${subIndex + 1}` : ''}`}
|
|
115
119
|
{/if}
|
|
116
120
|
</span>
|
|
117
121
|
{/key}
|
|
@@ -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;
|