windmill-components 1.542.4 → 1.550.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/common.d.ts +4 -1
- package/package/components/AIAgentLogViewer.svelte +1 -1
- package/package/components/ArgEnum.svelte +14 -5
- package/package/components/ArgInput.svelte +23 -15
- package/package/components/ArgInput.svelte.d.ts +1 -1
- package/package/components/ChannelSelector.svelte +92 -18
- package/package/components/ChannelSelector.svelte.d.ts +2 -0
- package/package/components/ConnectionSection.svelte +12 -1
- package/package/components/Dev.svelte +18 -5
- package/package/components/Dev.svelte.d.ts +23 -1
- package/package/components/DisplayResult.svelte +36 -23
- package/package/components/DropdownV2.svelte +8 -2
- package/package/components/DropdownV2.svelte.d.ts +1 -0
- package/package/components/DynamicInput.svelte +10 -10
- package/package/components/EditableSchemaForm.svelte +21 -7
- package/package/components/EditorSettings.svelte +11 -9
- package/package/components/ErrorOrRecoveryHandler.svelte +14 -20
- package/package/components/FlowHistoryJobPicker.svelte +3 -0
- package/package/components/FlowHistoryJobPicker.svelte.d.ts +1 -0
- package/package/components/FlowJobResult.svelte +5 -5
- package/package/components/FlowLogRow.svelte +2 -2
- package/package/components/FlowLogViewer.svelte +228 -57
- package/package/components/FlowLogViewer.svelte.d.ts +16 -5
- package/package/components/FlowLogViewerWrapper.svelte +56 -3
- package/package/components/FlowLogViewerWrapper.svelte.d.ts +4 -3
- package/package/components/FlowLoopIterationPreview.svelte +4 -4
- package/package/components/FlowMetadata.svelte +3 -4
- package/package/components/FlowMetadata.svelte.d.ts +4 -18
- package/package/components/FlowPreviewContent.svelte +9 -3
- package/package/components/FlowPreviewContent.svelte.d.ts +1 -1
- package/package/components/FlowStatusViewer.svelte +62 -59
- package/package/components/FlowStatusViewer.svelte.d.ts +2 -2
- package/package/components/FlowStatusViewerInner.svelte +186 -94
- package/package/components/FlowStatusViewerInner.svelte.d.ts +10 -3
- package/package/components/FlowTimeline.svelte +110 -131
- package/package/components/FlowTimeline.svelte.d.ts +13 -4
- package/package/components/FlowTimelineBar.svelte +227 -0
- package/package/components/FlowTimelineBar.svelte.d.ts +24 -0
- package/package/components/InputTransformForm.svelte +119 -3
- package/package/components/InputTransformForm.svelte.d.ts +3 -0
- package/package/components/InputTransformSchemaForm.svelte +5 -1
- package/package/components/InputTransformSchemaForm.svelte.d.ts +2 -0
- package/package/components/InstanceSetting.svelte +17 -42
- package/package/components/InstanceSettings.svelte +12 -21
- package/package/components/JobArgs.svelte +15 -16
- package/package/components/JobArgs.svelte.d.ts +4 -18
- package/package/components/JobLoader.svelte +23 -42
- package/package/components/JobLoader.svelte.d.ts +2 -0
- package/package/components/JobStatus.svelte +1 -1
- package/package/components/JobStatus.svelte.d.ts +4 -18
- package/package/components/ModulePreviewResultViewer.svelte +1 -7
- package/package/components/NextcloudSetting.svelte +6 -1
- package/package/components/Password.svelte +7 -11
- package/package/components/Password.svelte.d.ts +5 -20
- package/package/components/PasswordArgInput.svelte +35 -15
- package/package/components/PasswordArgInput.svelte.d.ts +4 -18
- package/package/components/QueuePosition.svelte +6 -2
- package/package/components/RunForm.svelte +5 -14
- package/package/components/S3ArrayHelperButton.svelte +12 -0
- package/package/components/S3ArrayHelperButton.svelte.d.ts +8 -0
- package/package/components/ScriptEditor.svelte +5 -6
- package/package/components/StringTypeNarrowing.svelte +39 -24
- package/package/components/StringTypeNarrowing.svelte.d.ts +1 -1
- package/package/components/TeamSelector.svelte +83 -37
- package/package/components/TeamSelector.svelte.d.ts +0 -1
- package/package/components/apps/components/buttons/AppButton.svelte +11 -1
- package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +13 -4
- package/package/components/apps/components/display/table/SyncColumnDefs.svelte +2 -2
- package/package/components/apps/components/display/table/utils.js +1 -1
- package/package/components/apps/components/helpers/RefreshButton.svelte +5 -1
- package/package/components/apps/components/helpers/RunnableComponent.svelte +0 -2
- package/package/components/apps/components/helpers/RunnableWrapper.svelte.d.ts +1 -0
- package/package/components/apps/components/layout/AppTabs.svelte +116 -71
- package/package/components/apps/components/layout/AppTabs.svelte.d.ts +1 -0
- package/package/components/apps/editor/component/ComponentInner.svelte +1 -0
- package/package/components/apps/editor/component/components.d.ts +16 -1
- package/package/components/apps/editor/component/components.js +22 -2
- package/package/components/apps/editor/settingsPanel/ComponentPanel.svelte +2 -0
- package/package/components/apps/editor/settingsPanel/GridTab.svelte +19 -1
- package/package/components/apps/editor/settingsPanel/GridTab.svelte.d.ts +3 -1
- package/package/components/apps/editor/settingsPanel/GridTabHidden.svelte +52 -0
- package/package/components/apps/editor/settingsPanel/GridTabHidden.svelte.d.ts +9 -0
- package/package/components/auditLogs/AuditLogsFilters.svelte +6 -0
- package/package/components/auditLogs/AuditLogsTable.svelte +17 -7
- package/package/components/auditLogs/AuditLogsTable.svelte.d.ts +1 -0
- package/package/components/common/CloseButton.svelte +2 -2
- package/package/components/common/CloseButton.svelte.d.ts +1 -0
- package/package/components/common/layout/List.svelte +3 -7
- package/package/components/common/layout/List.svelte.d.ts +7 -29
- package/package/components/common/popup/PopupV2.svelte +8 -25
- package/package/components/common/popup/PopupV2.svelte.d.ts +4 -2
- package/package/components/common/table/ScriptRow.svelte +22 -2
- package/package/components/copilot/FlowCopilotInputsModal.svelte +26 -23
- package/package/components/copilot/chat/AIChatManager.svelte.js +3 -2
- package/package/components/copilot/chat/ProviderModelSelector.svelte +1 -1
- package/package/components/copilot/chat/flow/FlowAIChat.svelte +4 -2
- package/package/components/copilot/chat/script/core.d.ts +4 -4
- package/package/components/copilot/chat/script/core.js +93 -34
- package/package/components/copilot/lib.d.ts +1 -0
- package/package/components/copilot/lib.js +6 -3
- package/package/components/custom_ui.d.ts +2 -0
- package/package/components/flows/FlowProgressBar.svelte +16 -16
- package/package/components/flows/FlowProgressBar.svelte.d.ts +7 -22
- package/package/components/flows/content/FlowInputsQuick.svelte +3 -2
- package/package/components/flows/content/FlowInputsQuick.svelte.d.ts +1 -0
- package/package/components/flows/content/FlowModuleComponent.svelte +24 -1
- package/package/components/flows/flowInfers.js +34 -8
- package/package/components/flows/flowStore.d.ts +4 -1
- package/package/components/flows/map/FlowJobsMenu.svelte +3 -3
- package/package/components/flows/map/FlowJobsMenu.svelte.d.ts +1 -1
- package/package/components/flows/map/InsertModuleButton.svelte +4 -14
- package/package/components/flows/map/InsertModuleButton.svelte.d.ts +0 -1
- package/package/components/flows/map/InsertModuleInner.svelte +17 -20
- package/package/components/flows/map/MapItem.svelte +1 -1
- package/package/components/flows/pickers/PickHubScriptQuick.svelte +38 -52
- package/package/components/flows/pickers/PickHubScriptQuick.svelte.d.ts +1 -0
- package/package/components/flows/pickers/WorkspaceScriptPickerQuick.svelte +27 -15
- package/package/components/flows/pickers/WorkspaceScriptPickerQuick.svelte.d.ts +1 -0
- package/package/components/flows/propPicker/OutputPicker.svelte +2 -0
- package/package/components/git_sync/DetectionFlow.svelte +33 -44
- package/package/components/git_sync/DetectionFlow.svelte.d.ts +1 -0
- package/package/components/git_sync/GitSyncContext.svelte.d.ts +22 -0
- package/package/components/git_sync/GitSyncContext.svelte.js +145 -5
- package/package/components/git_sync/GitSyncModeDisplay.svelte +14 -0
- package/package/components/git_sync/GitSyncModeDisplay.svelte.d.ts +9 -0
- package/package/components/git_sync/GitSyncRepositoryCard.svelte +365 -253
- package/package/components/git_sync/GitSyncRepositoryCard.svelte.d.ts +10 -1
- package/package/components/git_sync/GitSyncSection.svelte +134 -14
- package/package/components/git_sync/PullWorkspaceModal.svelte +24 -32
- package/package/components/git_sync/PushWorkspaceModal.svelte +24 -32
- package/package/components/graph/model.d.ts +5 -5
- package/package/components/graph/renderers/edges/EmptyEdge.svelte +3 -10
- package/package/components/graph/renderers/edges/EmptyEdge.svelte.d.ts +4 -18
- package/package/components/graph/renderers/nodes/AIToolNode.svelte +2 -2
- package/package/components/graph/renderers/nodes/NewAIToolNode.svelte +5 -10
- package/package/components/home/ItemsList.svelte +1 -1
- package/package/components/jobs/JobProgressBar.svelte +27 -21
- package/package/components/jobs/JobProgressBar.svelte.d.ts +9 -24
- package/package/components/meltComponents/MenuSingleItem.svelte +3 -8
- package/package/components/meltComponents/MenuSingleItem.svelte.d.ts +0 -3
- package/package/components/meltComponents/Popover.svelte +3 -2
- package/package/components/meltComponents/Popover.svelte.d.ts +1 -0
- package/package/components/meltComponents/Tooltip.svelte +1 -1
- package/package/components/progressBar/ProgressBar.svelte +39 -53
- package/package/components/progressBar/ProgressBar.svelte.d.ts +11 -26
- package/package/components/runs/JobsLoader.svelte +1 -1
- package/package/components/runs/NoWorkerWithTagWarning.svelte +3 -3
- package/package/components/runs/NoWorkerWithTagWarning.svelte.d.ts +1 -1
- package/package/components/schema/AddPropertyV2.svelte +7 -4
- package/package/components/schema/PropertyEditor.svelte.d.ts +1 -1
- package/package/components/select/MultiSelect.svelte +2 -2
- package/package/components/select/MultiSelect.svelte.d.ts +1 -0
- package/package/components/settings/WorkspaceUserSettings.svelte +92 -1
- package/package/components/sidebar/MenuLink.svelte +2 -1
- package/package/components/sidebar/MenuLink.svelte.d.ts +1 -0
- package/package/components/sidebar/SidebarContent.svelte +27 -27
- package/package/components/table/Cell.svelte +7 -14
- package/package/components/table/Cell.svelte.d.ts +13 -35
- package/package/components/triggers/AddTriggersButton.svelte +1 -0
- package/package/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte +1 -1
- package/package/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte.d.ts +2 -1
- package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +28 -5
- package/package/components/triggers/gcp/utils.js +1 -0
- package/package/components/triggers/schedules/ScheduleEditorInner.svelte +1 -0
- package/package/components/triggers/webhook/WebhooksConfigSection.svelte +143 -63
- package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +22 -0
- package/package/components/triggers/websocket/utils.js +1 -0
- package/package/components/workspaceSettings/AISettings.svelte +8 -2
- package/package/components/workspaceSettings/AISettings.svelte.d.ts +2 -1
- package/package/components/workspaceSettings/ModelTokenLimits.svelte +165 -0
- package/package/components/workspaceSettings/ModelTokenLimits.svelte.d.ts +8 -0
- package/package/components/workspaceSettings/StorageSettings.svelte +123 -51
- package/package/gen/core/OpenAPI.js +1 -1
- package/package/gen/schemas.gen.d.ts +141 -16
- package/package/gen/schemas.gen.js +144 -16
- package/package/gen/services.gen.d.ts +62 -42
- package/package/gen/services.gen.js +131 -82
- package/package/gen/types.gen.d.ts +218 -144
- package/package/hubPaths.json +2 -1
- package/package/services/JobManager.js +10 -7
- package/package/stores.d.ts +1 -0
- package/package/stores.js +6 -3
- package/package/timelineCompute.svelte.d.ts +21 -0
- package/package/timelineCompute.svelte.js +113 -0
- package/package/utils.d.ts +15 -8
- package/package/utils.js +62 -12
- package/package/workspace_settings.d.ts +13 -8
- package/package/workspace_settings.js +46 -11
- package/package.json +2 -2
package/package/common.d.ts
CHANGED
|
@@ -10,7 +10,10 @@ export interface PropertyDisplayInfo {
|
|
|
10
10
|
index: number;
|
|
11
11
|
propertiesNumber: number;
|
|
12
12
|
}
|
|
13
|
-
export type EnumType = string[] |
|
|
13
|
+
export type EnumType = string[] | {
|
|
14
|
+
value: string;
|
|
15
|
+
label: string;
|
|
16
|
+
}[] | undefined;
|
|
14
17
|
export interface SchemaProperty {
|
|
15
18
|
type: string | undefined;
|
|
16
19
|
description?: string;
|
|
@@ -4,11 +4,20 @@ let { disabled, value = $bindable(), enum_, autofocus, defaultValue, valid, crea
|
|
|
4
4
|
const dispatch = createEventDispatcher();
|
|
5
5
|
let customItems = $state([]);
|
|
6
6
|
let items = $derived.by(() => {
|
|
7
|
-
const l = [...(enum_ ? enum_ : []), ...customItems]
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
const l = [...(enum_ ? enum_ : []), ...customItems]
|
|
8
|
+
.map((item) => {
|
|
9
|
+
if (typeof item === 'string') {
|
|
10
|
+
return {
|
|
11
|
+
value: item,
|
|
12
|
+
label: enumLabels?.[item] ?? item
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
else if (typeof item === 'object') {
|
|
16
|
+
return item;
|
|
17
|
+
}
|
|
18
|
+
})
|
|
19
|
+
.filter((i) => i != undefined);
|
|
20
|
+
if (create && filterText && l.every((i) => i?.value !== filterText)) {
|
|
12
21
|
l.push({ value: filterText, label: `Add new: ${filterText}` });
|
|
13
22
|
}
|
|
14
23
|
return l;
|
|
@@ -92,7 +92,13 @@ function computeDefaultValue(inputCat, defaultValue, nnullable) {
|
|
|
92
92
|
nvalue = nullable ? null : '';
|
|
93
93
|
}
|
|
94
94
|
else if (inputCat == 'enum' && required) {
|
|
95
|
-
|
|
95
|
+
let firstV = enum_?.[0];
|
|
96
|
+
if (typeof firstV === 'string') {
|
|
97
|
+
nvalue = firstV;
|
|
98
|
+
}
|
|
99
|
+
else if (firstV && typeof firstV === 'object') {
|
|
100
|
+
nvalue = firstV.value;
|
|
101
|
+
}
|
|
96
102
|
}
|
|
97
103
|
else if (inputCat == 'boolean') {
|
|
98
104
|
nvalue = false;
|
|
@@ -372,7 +378,7 @@ onDestroy(() => {
|
|
|
372
378
|
<!-- svelte-ignore a11y_autofocus -->
|
|
373
379
|
<div
|
|
374
380
|
class={twMerge(
|
|
375
|
-
'flex flex-col w-full rounded-md relative',
|
|
381
|
+
'flex flex-col w-full rounded-md relative group',
|
|
376
382
|
minW ? 'min-w-[250px]' : '',
|
|
377
383
|
diffStatus?.diff ? 'px-2' : '',
|
|
378
384
|
diffStatus?.diff == 'added'
|
|
@@ -1165,19 +1171,21 @@ onDestroy(() => {
|
|
|
1165
1171
|
bind:value
|
|
1166
1172
|
></textarea>
|
|
1167
1173
|
{/key}
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1174
|
+
{/if}
|
|
1175
|
+
{#if !disabled && itemPicker && extra?.['disableVariablePicker'] != true}
|
|
1176
|
+
<!-- svelte-ignore a11y_click_events_have_key_events -->
|
|
1177
|
+
<button
|
|
1178
|
+
class="absolute {password || extra?.['password'] == true
|
|
1179
|
+
? 'right-16 top-1.5'
|
|
1180
|
+
: 'right-1 top-1'} opacity-0 group-hover:opacity-100 duration-200 py-1 min-w-min !px-2 items-center text-gray-800 bg-surface-secondary border rounded center-center hover:bg-gray-300 transition-all cursor-pointer"
|
|
1181
|
+
onclick={() => {
|
|
1182
|
+
pickForField = label
|
|
1183
|
+
itemPicker?.openDrawer?.()
|
|
1184
|
+
}}
|
|
1185
|
+
title="Insert a Variable"
|
|
1186
|
+
>
|
|
1187
|
+
<DollarSign class="!text-tertiary" size={14} />
|
|
1188
|
+
</button>
|
|
1181
1189
|
{/if}
|
|
1182
1190
|
</div>
|
|
1183
1191
|
{@render variableInput()}
|
|
@@ -105,6 +105,6 @@ declare const ArgInput: $$__sveltets_2_IsomorphicComponent<Props, {
|
|
|
105
105
|
[evt: string]: CustomEvent<any>;
|
|
106
106
|
}, {}, {
|
|
107
107
|
focus: () => void;
|
|
108
|
-
}, "value" | "description" | "title" | "
|
|
108
|
+
}, "value" | "description" | "title" | "pattern" | "properties" | "defaultValue" | "placeholder" | "valid" | "oneOf" | "format" | "order" | "editor" | "enum_" | "itemsType" | "pickForField">;
|
|
109
109
|
type ArgInput = InstanceType<typeof ArgInput>;
|
|
110
110
|
export default ArgInput;
|
|
@@ -1,28 +1,102 @@
|
|
|
1
1
|
<script lang="ts">import Select from './select/Select.svelte';
|
|
2
|
-
|
|
2
|
+
import { WorkspaceService } from '../gen';
|
|
3
|
+
import { workspaceStore } from '../stores';
|
|
4
|
+
import { debounce } from '../utils';
|
|
5
|
+
let { disabled = false, placeholder = 'Select channel', selectedChannel = $bindable(undefined), containerClass = 'w-64', minWidth = '160px', channels = undefined, teamId, onError } = $props();
|
|
6
|
+
let isFetching = $state(false);
|
|
7
|
+
let searchResults = $state([]);
|
|
8
|
+
// Only enable search mode if no channels are provided AND teamId is provided
|
|
9
|
+
const searchMode = !channels && !!teamId;
|
|
10
|
+
// Determine which channels to show: provided channels or search results
|
|
11
|
+
// In search mode, include the selected channel if it exists
|
|
12
|
+
let displayChannels = $derived(() => {
|
|
13
|
+
const baseChannels = channels || searchResults;
|
|
14
|
+
if (searchMode && selectedChannel && !baseChannels.find(c => c.channel_id === selectedChannel?.channel_id)) {
|
|
15
|
+
return [selectedChannel, ...baseChannels];
|
|
16
|
+
}
|
|
17
|
+
return baseChannels;
|
|
18
|
+
});
|
|
19
|
+
// Create separate filter text for search mode
|
|
20
|
+
let searchFilterText = $state('');
|
|
21
|
+
// Debounced search function
|
|
22
|
+
const debouncedSearch = debounce(async (query) => {
|
|
23
|
+
await searchChannels(query);
|
|
24
|
+
}, 500);
|
|
25
|
+
// Watch for search filter text changes (only in search mode)
|
|
26
|
+
$effect(() => {
|
|
27
|
+
if (searchMode) {
|
|
28
|
+
if (searchFilterText.length >= 1) {
|
|
29
|
+
debouncedSearch.debounced(searchFilterText);
|
|
30
|
+
}
|
|
31
|
+
else if (searchFilterText.length === 0) {
|
|
32
|
+
searchResults = [];
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
async function searchChannels(query) {
|
|
37
|
+
if (!query || !teamId)
|
|
38
|
+
return;
|
|
39
|
+
isFetching = true;
|
|
40
|
+
try {
|
|
41
|
+
const response = await WorkspaceService.listAvailableTeamsChannels({
|
|
42
|
+
workspace: $workspaceStore,
|
|
43
|
+
teamId: teamId,
|
|
44
|
+
search: query
|
|
45
|
+
});
|
|
46
|
+
searchResults = response || [];
|
|
47
|
+
isFetching = false;
|
|
48
|
+
return searchResults;
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
isFetching = false;
|
|
52
|
+
onError?.(error);
|
|
53
|
+
console.error('Error searching channels:', error);
|
|
54
|
+
searchResults = [];
|
|
55
|
+
return [];
|
|
56
|
+
}
|
|
57
|
+
}
|
|
3
58
|
</script>
|
|
4
59
|
|
|
5
60
|
<div class={containerClass}>
|
|
6
61
|
<div class="flex items-center gap-2">
|
|
7
62
|
<div class="flex-grow" style="min-width: {minWidth};">
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
63
|
+
{#if searchMode}
|
|
64
|
+
<Select
|
|
65
|
+
containerStyle={'min-width: ' + minWidth}
|
|
66
|
+
items={searchFilterText.length >= 1 || (searchFilterText.length === 0 && selectedChannel) ? displayChannels().filter(channel => channel.channel_id && channel.channel_name).map((channel) => ({
|
|
67
|
+
label: channel.channel_name ?? 'Unknown Channel',
|
|
68
|
+
value: channel.channel_id ?? ''
|
|
69
|
+
})) : []}
|
|
70
|
+
placeholder={isFetching ? "Searching..." : (teamId ? "Search channels..." : "Select a team first")}
|
|
71
|
+
clearable
|
|
72
|
+
disabled={disabled || isFetching || !teamId}
|
|
73
|
+
bind:filterText={searchFilterText}
|
|
74
|
+
bind:value={
|
|
75
|
+
() => selectedChannel?.channel_id,
|
|
76
|
+
(value) => {
|
|
77
|
+
selectedChannel = value ? displayChannels().find((channel) => channel.channel_id === value) : undefined
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/>
|
|
81
|
+
{:else}
|
|
82
|
+
<Select
|
|
83
|
+
containerStyle={'min-width: ' + minWidth}
|
|
84
|
+
items={displayChannels().filter(channel => channel.channel_id && channel.channel_name).map((channel) => ({
|
|
85
|
+
label: channel.channel_name ?? 'Unknown Channel',
|
|
86
|
+
value: channel.channel_id ?? ''
|
|
87
|
+
}))}
|
|
88
|
+
{placeholder}
|
|
89
|
+
clearable
|
|
90
|
+
disabled={disabled || displayChannels().length === 0}
|
|
91
|
+
bind:value={
|
|
92
|
+
() => selectedChannel?.channel_id,
|
|
93
|
+
(value) => {
|
|
94
|
+
selectedChannel = value ? displayChannels().find((channel) => channel.channel_id === value) : undefined
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/>
|
|
98
|
+
{/if}
|
|
22
99
|
</div>
|
|
23
100
|
</div>
|
|
24
101
|
|
|
25
|
-
{#if channels.length === 0 && !disabled}
|
|
26
|
-
<div class="text-xs text-tertiary mt-1">No channels available</div>
|
|
27
|
-
{/if}
|
|
28
102
|
</div>
|
|
@@ -9,6 +9,8 @@ interface Props {
|
|
|
9
9
|
containerClass?: string;
|
|
10
10
|
minWidth?: string;
|
|
11
11
|
channels?: ChannelItem[];
|
|
12
|
+
teamId?: string;
|
|
13
|
+
onError?: (error: Error) => void;
|
|
12
14
|
}
|
|
13
15
|
declare const ChannelSelector: import("svelte").Component<Props, {}, "selectedChannel">;
|
|
14
16
|
type ChannelSelector = ReturnType<typeof ChannelSelector>;
|
|
@@ -37,7 +37,18 @@ async function connectTeams() {
|
|
|
37
37
|
onLoadSettings();
|
|
38
38
|
}
|
|
39
39
|
catch (error) {
|
|
40
|
-
|
|
40
|
+
// Extract the actual error message from the API response
|
|
41
|
+
let errorMessage = 'Failed to connect to Teams';
|
|
42
|
+
if (typeof error?.body === 'string') {
|
|
43
|
+
errorMessage = error.body;
|
|
44
|
+
}
|
|
45
|
+
else if (error?.body?.message) {
|
|
46
|
+
errorMessage = error.body.message;
|
|
47
|
+
}
|
|
48
|
+
else if (error?.message && error.message !== 'Bad Request') {
|
|
49
|
+
errorMessage = error.message;
|
|
50
|
+
}
|
|
51
|
+
sendUserToast(errorMessage, true);
|
|
41
52
|
console.error('Error connecting to Teams:', error);
|
|
42
53
|
}
|
|
43
54
|
}
|
|
@@ -29,6 +29,7 @@ import { workspaceAIClients } from './copilot/lib';
|
|
|
29
29
|
import { Triggers } from './triggers/triggers.svelte';
|
|
30
30
|
import { StepsInputArgs } from './flows/stepsInputArgs.svelte';
|
|
31
31
|
import { ModulesTestStates } from './modulesTest.svelte';
|
|
32
|
+
let { initial = undefined } = $props();
|
|
32
33
|
let flowCopilotContext = {
|
|
33
34
|
shouldUpdatePropertyType: writable({}),
|
|
34
35
|
exprsToSet: writable({}),
|
|
@@ -81,10 +82,13 @@ const flowPreviewContent = $derived(flowPreviewButtons?.getFlowPreviewContent())
|
|
|
81
82
|
const job = $derived(flowPreviewContent?.getJob());
|
|
82
83
|
let showJobStatus = $state(false);
|
|
83
84
|
let currentScript = $state(undefined);
|
|
85
|
+
let mode = $state('script');
|
|
86
|
+
let lastPath = undefined;
|
|
84
87
|
let schema = $state(emptySchema());
|
|
85
88
|
const href = window.location.href;
|
|
86
89
|
const indexQ = href.indexOf('?');
|
|
87
90
|
const searchParams = indexQ > -1 ? new URLSearchParams(href.substring(indexQ)) : undefined;
|
|
91
|
+
let relativePaths = $state([]);
|
|
88
92
|
if (searchParams?.has('local')) {
|
|
89
93
|
connectWs();
|
|
90
94
|
}
|
|
@@ -93,6 +97,15 @@ let lockChanges = false;
|
|
|
93
97
|
let timeout = undefined;
|
|
94
98
|
let loadingCodebaseButton = $state(false);
|
|
95
99
|
let lastCommandId = '';
|
|
100
|
+
if (initial) {
|
|
101
|
+
if (initial.type == 'script') {
|
|
102
|
+
replaceScript(initial.script);
|
|
103
|
+
}
|
|
104
|
+
else if (initial.type == 'flow') {
|
|
105
|
+
replaceFlow(initial.flow);
|
|
106
|
+
}
|
|
107
|
+
modeInitialized = true;
|
|
108
|
+
}
|
|
96
109
|
const el = (event) => {
|
|
97
110
|
// sendUserToast(`Received message from parent ${event.data.type}`, true)
|
|
98
111
|
if (event.data.type == 'runTest') {
|
|
@@ -312,8 +325,6 @@ async function onKeyDown(event) {
|
|
|
312
325
|
document.execCommand('paste');
|
|
313
326
|
}
|
|
314
327
|
}
|
|
315
|
-
let relativePaths = $state([]);
|
|
316
|
-
let lastPath = undefined;
|
|
317
328
|
async function replaceScript(lastEdit) {
|
|
318
329
|
mode = 'script';
|
|
319
330
|
currentScript = lastEdit;
|
|
@@ -338,7 +349,6 @@ async function replaceScript(lastEdit) {
|
|
|
338
349
|
validCode = false;
|
|
339
350
|
}
|
|
340
351
|
}
|
|
341
|
-
let mode = $state('script');
|
|
342
352
|
const flowStore = $state({
|
|
343
353
|
val: {
|
|
344
354
|
summary: '',
|
|
@@ -461,6 +471,9 @@ let token = $derived($page.url.searchParams.get('wm_token') ?? undefined);
|
|
|
461
471
|
let workspace = $derived($page.url.searchParams.get('workspace') ?? undefined);
|
|
462
472
|
let themeDarkRaw = $derived($page.url.searchParams.get('activeColorTheme'));
|
|
463
473
|
let themeDark = $derived(themeDarkRaw == '2' || themeDarkRaw == '4');
|
|
474
|
+
$effect.pre(() => {
|
|
475
|
+
setContext('AuthToken', { token });
|
|
476
|
+
});
|
|
464
477
|
$effect.pre(() => {
|
|
465
478
|
if (token) {
|
|
466
479
|
OpenAPI.WITH_CREDENTIALS = true;
|
|
@@ -536,7 +549,7 @@ const flowHasChanged = $derived(flowPreviewContent?.flowHasChanged());
|
|
|
536
549
|
|
|
537
550
|
<main class="h-screen w-full">
|
|
538
551
|
{#if mode == 'script'}
|
|
539
|
-
<div class="flex flex-col min-h-full overflow-auto">
|
|
552
|
+
<div class="flex flex-col min-h-full min-h-screen overflow-auto">
|
|
540
553
|
<div class="absolute top-0 left-2">
|
|
541
554
|
<DarkModeToggle bind:darkMode bind:this={darkModeToggle} forcedDarkMode={false} />
|
|
542
555
|
</div>
|
|
@@ -628,7 +641,7 @@ const flowHasChanged = $derived(flowPreviewContent?.flowHasChanged());
|
|
|
628
641
|
</Button>
|
|
629
642
|
{/if}
|
|
630
643
|
</div>
|
|
631
|
-
<Splitpanes horizontal
|
|
644
|
+
<Splitpanes horizontal style="height: 1000px;">
|
|
632
645
|
<Pane size={33}>
|
|
633
646
|
<div class="px-2">
|
|
634
647
|
<div class="break-words relative font-sans">
|
|
@@ -1,3 +1,25 @@
|
|
|
1
|
-
|
|
1
|
+
import { type Preview, type OpenFlow } from '../gen';
|
|
2
|
+
type LastEditScript = {
|
|
3
|
+
content: string;
|
|
4
|
+
path: string;
|
|
5
|
+
language: Preview['language'];
|
|
6
|
+
lock?: string;
|
|
7
|
+
isCodebase?: boolean;
|
|
8
|
+
tag?: string;
|
|
9
|
+
};
|
|
10
|
+
type LastEditFlow = {
|
|
11
|
+
flow: OpenFlow;
|
|
12
|
+
uriPath: string;
|
|
13
|
+
};
|
|
14
|
+
type $$ComponentProps = {
|
|
15
|
+
initial?: {
|
|
16
|
+
type: 'script';
|
|
17
|
+
script: LastEditScript;
|
|
18
|
+
} | {
|
|
19
|
+
type: 'flow';
|
|
20
|
+
flow: LastEditFlow;
|
|
21
|
+
} | undefined;
|
|
22
|
+
};
|
|
23
|
+
declare const Dev: import("svelte").Component<$$ComponentProps, {}, "">;
|
|
2
24
|
type Dev = ReturnType<typeof Dev>;
|
|
3
25
|
export default Dev;
|
|
@@ -22,7 +22,7 @@ import DownloadCsv from './table/DownloadCsv.svelte';
|
|
|
22
22
|
import { convertJsonToCsv } from './table/tableUtils';
|
|
23
23
|
import Tooltip from './Tooltip.svelte';
|
|
24
24
|
import HighlightTheme from './HighlightTheme.svelte';
|
|
25
|
-
import { getContext, hasContext, createEventDispatcher, onDestroy } from 'svelte';
|
|
25
|
+
import { getContext, hasContext, createEventDispatcher, onDestroy, untrack } from 'svelte';
|
|
26
26
|
import { toJsonStr } from '../utils';
|
|
27
27
|
import { userStore } from '../stores';
|
|
28
28
|
import ResultStreamDisplay from './ResultStreamDisplay.svelte';
|
|
@@ -45,17 +45,29 @@ function isTableCol(result, keys) {
|
|
|
45
45
|
}
|
|
46
46
|
function isTableRowObject(json) {
|
|
47
47
|
// check array of objects (with possible a first row of headers)
|
|
48
|
+
const hasHeaders = Array.isArray(json[0]) &&
|
|
49
|
+
json[0].length > 0 &&
|
|
50
|
+
json[0].length <= 50 &&
|
|
51
|
+
json[0].every((item) => typeof item === 'string');
|
|
52
|
+
return isTableRowObjectInner(json, hasHeaders);
|
|
53
|
+
}
|
|
54
|
+
function isTableRowObjectInner(json, hasHeaders) {
|
|
48
55
|
return (Array.isArray(json) &&
|
|
49
|
-
json.length > 0 &&
|
|
50
|
-
|
|
51
|
-
(
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
56
|
+
json.length > (hasHeaders ? 1 : 0) &&
|
|
57
|
+
json.every((item, index) => {
|
|
58
|
+
if (hasHeaders && index === 0) {
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
if (item && typeof item === 'object') {
|
|
62
|
+
let keys = Object.keys(item);
|
|
63
|
+
if (keys.length > 0 && !Array.isArray(item)) {
|
|
64
|
+
if (hasHeaders || keys.length <= 50) {
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return false;
|
|
70
|
+
}));
|
|
59
71
|
}
|
|
60
72
|
let largeObject = $state(undefined);
|
|
61
73
|
function checkIfS3(result, keys) {
|
|
@@ -92,6 +104,7 @@ function inferResultKind(result) {
|
|
|
92
104
|
return keys[0];
|
|
93
105
|
}
|
|
94
106
|
let size = roughSizeOfObject(result);
|
|
107
|
+
console.debug('size of object', size);
|
|
95
108
|
// Otherwise, check if the result is too large (10kb) for json
|
|
96
109
|
if (size > TABLE_MAX_SIZE) {
|
|
97
110
|
largeObject = true;
|
|
@@ -252,20 +265,18 @@ function handleArrayOfObjectsHeaders(json) {
|
|
|
252
265
|
json.length > 0 &&
|
|
253
266
|
Array.isArray(json[0]) &&
|
|
254
267
|
json[0].length > 0 &&
|
|
255
|
-
json[0].every((item) => typeof item === 'string')
|
|
256
|
-
json
|
|
257
|
-
.slice(1)
|
|
258
|
-
.every((item) => item && typeof item === 'object' && Object.keys(item).length > 0 && !Array.isArray(item))) {
|
|
268
|
+
json[0].every((item) => typeof item === 'string')) {
|
|
259
269
|
const headers = json[0];
|
|
260
|
-
const rows = json.
|
|
261
|
-
|
|
270
|
+
const rows = new Array(json.length - 1);
|
|
271
|
+
for (let i = 1; i < json.length; i++) {
|
|
262
272
|
const obj = {};
|
|
263
|
-
|
|
264
|
-
|
|
273
|
+
const row = json[i];
|
|
274
|
+
for (let j = 0; j < headers.length; j++) {
|
|
275
|
+
obj[headers[j]] = row[headers[j]];
|
|
265
276
|
}
|
|
266
|
-
|
|
267
|
-
}
|
|
268
|
-
return
|
|
277
|
+
rows[i - 1] = obj;
|
|
278
|
+
}
|
|
279
|
+
return rows;
|
|
269
280
|
}
|
|
270
281
|
return json;
|
|
271
282
|
}
|
|
@@ -340,7 +351,9 @@ onDestroy(() => {
|
|
|
340
351
|
$effect(() => {
|
|
341
352
|
;
|
|
342
353
|
[result];
|
|
343
|
-
|
|
354
|
+
untrack(() => {
|
|
355
|
+
resultKind = inferResultKind(result);
|
|
356
|
+
});
|
|
344
357
|
});
|
|
345
358
|
$effect(() => {
|
|
346
359
|
chooseToolbarLocation(!is_render_all &&
|
|
@@ -14,7 +14,8 @@ import Button from './common/button/Button.svelte';
|
|
|
14
14
|
import { twMerge } from 'tailwind-merge';
|
|
15
15
|
import { triggerableByAI } from '../actions/triggerableByAI.svelte';
|
|
16
16
|
import { untrack } from 'svelte';
|
|
17
|
-
|
|
17
|
+
import { fly } from 'svelte/transition';
|
|
18
|
+
let { aiId = undefined, aiDescription = undefined, items = [], disabled = false, placement = 'bottom-end', usePointerDownOutside = false, closeOnOtherDropdownOpen = true, fixedHeight = true, hidePopup = false, open = $bindable(false), customWidth = undefined, customMenu = false, class: classNames = undefined, enableFlyTransition = false, buttonReplacement, menu } = $props();
|
|
18
19
|
let buttonEl = $state(undefined);
|
|
19
20
|
const { elements: { menu: menuEl, item, trigger }, states, ids: { menu: dropdownId } } = createDropdownMenu({
|
|
20
21
|
positioning: {
|
|
@@ -102,7 +103,12 @@ async function getMenuElements() {
|
|
|
102
103
|
</button>
|
|
103
104
|
|
|
104
105
|
{#if open && !hidePopup}
|
|
105
|
-
<div
|
|
106
|
+
<div
|
|
107
|
+
{...$menuEl} use:$menuEl.action
|
|
108
|
+
data-menu
|
|
109
|
+
class="z-[6000] transition-all duration-100"
|
|
110
|
+
transition:fly={{ duration: enableFlyTransition ? 100 : 0, y: -16 }}
|
|
111
|
+
>
|
|
106
112
|
{#if customMenu}
|
|
107
113
|
{@render menu?.()}
|
|
108
114
|
{:else}
|
|
@@ -25,12 +25,14 @@ import {} from '../utils';
|
|
|
25
25
|
import { deepEqual } from 'fast-equals';
|
|
26
26
|
import { untrack } from 'svelte';
|
|
27
27
|
let { value = $bindable(), helperScript, format, otherArgs: otherArgs } = $props();
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
value
|
|
33
|
-
|
|
28
|
+
let [inputType, entrypoint] = $derived(format.includes('-') ? format.split('-', 2) : [format, '']);
|
|
29
|
+
let isMultiple = $derived(inputType === 'dynmultiselect');
|
|
30
|
+
let isSelect = $derived(inputType === 'dynselect' || inputType === 'dynmultiselect');
|
|
31
|
+
$effect.pre(() => {
|
|
32
|
+
if (isMultiple && value === undefined) {
|
|
33
|
+
value = [];
|
|
34
|
+
}
|
|
35
|
+
});
|
|
34
36
|
let resultJobLoader = $state();
|
|
35
37
|
let _items = usePromise(getItemsFromOptions, { clearValueOnRefresh: false });
|
|
36
38
|
let items = $derived(_items.value);
|
|
@@ -68,15 +70,13 @@ async function getItemsFromOptions() {
|
|
|
68
70
|
reject(error);
|
|
69
71
|
}
|
|
70
72
|
};
|
|
71
|
-
|
|
72
|
-
? resultJobLoader?.runPreview(helperScript?.path ?? 'NO_PATH', helperScript.code, helperScript.lang, { ...otherArgs, filterText, _ENTRYPOINT_OVERRIDE: entrypoint }, undefined, undefined, undefined, cb)
|
|
73
|
-
: resultJobLoader?.runScriptByHash(helperScript?.hash ?? 'NO_HASH', { ...otherArgs, filterText, _ENTRYPOINT_OVERRIDE: entrypoint }, cb);
|
|
73
|
+
resultJobLoader?.runDynamicInputScript(entrypoint, helperScript, { ...otherArgs, filterText, _ENTRYPOINT_OVERRIDE: entrypoint }, cb);
|
|
74
74
|
});
|
|
75
75
|
}
|
|
76
76
|
let neverLoaded = $state(true);
|
|
77
77
|
$effect(() => {
|
|
78
78
|
if (_items.value && value !== undefined && isSelect) {
|
|
79
|
-
if (isMultiple && Array.isArray(value)) {
|
|
79
|
+
if (isMultiple && Array.isArray(value) && Array.isArray(_items.value)) {
|
|
80
80
|
const availableValues = new Set(_items.value.map((x) => x.value));
|
|
81
81
|
const filteredValue = value.filter((v) => availableValues.has(v));
|
|
82
82
|
if (filteredValue.length !== value.length) {
|
|
@@ -82,7 +82,7 @@ function alignOrderWithProperties(schema) {
|
|
|
82
82
|
let index = 0;
|
|
83
83
|
let hasChanged = false;
|
|
84
84
|
for (let k of properties) {
|
|
85
|
-
if (schema.properties[k]
|
|
85
|
+
if (schema.properties[k]?.type === 'object' && schema.properties[k].properties) {
|
|
86
86
|
hasChanged = hasChanged || alignOrderWithProperties(schema.properties[k]);
|
|
87
87
|
}
|
|
88
88
|
if (!norder.includes(k)) {
|
|
@@ -113,8 +113,8 @@ let opened = $state(untrack(() => keys[0]));
|
|
|
113
113
|
function computeSelected(property) {
|
|
114
114
|
if (!opened)
|
|
115
115
|
return '';
|
|
116
|
-
if (property
|
|
117
|
-
return property
|
|
116
|
+
if (property?.type !== 'object')
|
|
117
|
+
return property?.type;
|
|
118
118
|
if (property.format === 'resource-s3_object')
|
|
119
119
|
return 'S3';
|
|
120
120
|
if (property.format?.startsWith('dynselect-'))
|
|
@@ -223,7 +223,7 @@ $effect(() => {
|
|
|
223
223
|
let dynamicFunctions = $derived(Object.entries(schema?.properties ?? {})
|
|
224
224
|
.filter(([_, property]) => {
|
|
225
225
|
const props = property;
|
|
226
|
-
return props
|
|
226
|
+
return props?.type === 'object' && DynamicInput.isDynInputFormat(props.format);
|
|
227
227
|
})
|
|
228
228
|
.map(([fieldName, _]) => fieldName.replace(/\s+/g, '_')));
|
|
229
229
|
const DYNAMIC_OPTIONS = [
|
|
@@ -246,6 +246,11 @@ function initDynFn(lang) {
|
|
|
246
246
|
return dynamicFunctions.map((functionName) => generateFn(functionName)).join('');
|
|
247
247
|
}
|
|
248
248
|
function updateDynCode(functionName, lang = 'bun') {
|
|
249
|
+
if ((lang == 'bun' && dynCode?.includes(`function ${functionName}`)) ||
|
|
250
|
+
(lang == 'python3' && dynCode?.includes(`def ${functionName}`))) {
|
|
251
|
+
// Don't add the function if it already exists
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
249
254
|
const generateFn = DynamicInput.getGenerateTemplateFn(lang);
|
|
250
255
|
const code = generateFn(functionName);
|
|
251
256
|
dynCode = dynCode ? dynCode.concat(code) : code;
|
|
@@ -315,7 +320,7 @@ let dndType = $state(generateRandomString());
|
|
|
315
320
|
}
|
|
316
321
|
}}
|
|
317
322
|
helperScript={{
|
|
318
|
-
|
|
323
|
+
source: 'inline',
|
|
319
324
|
code: dynCode!,
|
|
320
325
|
lang: dynLang!
|
|
321
326
|
}}
|
|
@@ -525,7 +530,7 @@ let dndType = $state(generateRandomString());
|
|
|
525
530
|
{#if typeof args == 'object' && schema?.properties[argName]}
|
|
526
531
|
<PropertyEditor
|
|
527
532
|
bind:description={schema.properties[argName].description}
|
|
528
|
-
type={schema.properties[argName]
|
|
533
|
+
type={schema.properties[argName]?.type}
|
|
529
534
|
bind:oneOf={schema.properties[argName].oneOf}
|
|
530
535
|
bind:pattern={schema.properties[argName].pattern}
|
|
531
536
|
bind:enum_={schema.properties[argName].enum}
|
|
@@ -574,6 +579,15 @@ let dndType = $state(generateRandomString());
|
|
|
574
579
|
nullable: undefined,
|
|
575
580
|
required: undefined
|
|
576
581
|
}
|
|
582
|
+
|
|
583
|
+
if (
|
|
584
|
+
isDynMultiselect &&
|
|
585
|
+
args &&
|
|
586
|
+
!Array.isArray(args?.[argName])
|
|
587
|
+
) {
|
|
588
|
+
args[argName] = []
|
|
589
|
+
}
|
|
590
|
+
|
|
577
591
|
if (isS3) {
|
|
578
592
|
schema.properties[argName] = {
|
|
579
593
|
...emptyProperty,
|
|
@@ -668,7 +682,7 @@ let dndType = $state(generateRandomString());
|
|
|
668
682
|
{itemPicker}
|
|
669
683
|
bind:nullable={schema.properties[argName].nullable}
|
|
670
684
|
bind:disabled={schema.properties[argName].disabled}
|
|
671
|
-
type={schema.properties[argName]
|
|
685
|
+
type={schema.properties[argName]?.type}
|
|
672
686
|
bind:oneOf={schema.properties[argName].oneOf}
|
|
673
687
|
bind:format={schema.properties[argName].format}
|
|
674
688
|
contentEncoding={schema.properties[argName].contentEncoding}
|
|
@@ -15,15 +15,17 @@ export let customUi = {};
|
|
|
15
15
|
contentClasses="flex flex-col gap-y-2 p-4"
|
|
16
16
|
>
|
|
17
17
|
<svelte:fragment slot="trigger">
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
18
|
+
{#if customUi.editorSettings != false}
|
|
19
|
+
<Button
|
|
20
|
+
btnClasses="text-tertiary"
|
|
21
|
+
color="light"
|
|
22
|
+
size="xs"
|
|
23
|
+
nonCaptureEvent={true}
|
|
24
|
+
startIcon={{ icon: Settings }}
|
|
25
|
+
iconOnly
|
|
26
|
+
title="Editor settings"
|
|
27
|
+
/>
|
|
28
|
+
{/if}
|
|
27
29
|
</svelte:fragment>
|
|
28
30
|
|
|
29
31
|
<svelte:fragment slot="content">
|