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.
Files changed (189) hide show
  1. package/package/common.d.ts +4 -1
  2. package/package/components/AIAgentLogViewer.svelte +1 -1
  3. package/package/components/ArgEnum.svelte +14 -5
  4. package/package/components/ArgInput.svelte +23 -15
  5. package/package/components/ArgInput.svelte.d.ts +1 -1
  6. package/package/components/ChannelSelector.svelte +92 -18
  7. package/package/components/ChannelSelector.svelte.d.ts +2 -0
  8. package/package/components/ConnectionSection.svelte +12 -1
  9. package/package/components/Dev.svelte +18 -5
  10. package/package/components/Dev.svelte.d.ts +23 -1
  11. package/package/components/DisplayResult.svelte +36 -23
  12. package/package/components/DropdownV2.svelte +8 -2
  13. package/package/components/DropdownV2.svelte.d.ts +1 -0
  14. package/package/components/DynamicInput.svelte +10 -10
  15. package/package/components/EditableSchemaForm.svelte +21 -7
  16. package/package/components/EditorSettings.svelte +11 -9
  17. package/package/components/ErrorOrRecoveryHandler.svelte +14 -20
  18. package/package/components/FlowHistoryJobPicker.svelte +3 -0
  19. package/package/components/FlowHistoryJobPicker.svelte.d.ts +1 -0
  20. package/package/components/FlowJobResult.svelte +5 -5
  21. package/package/components/FlowLogRow.svelte +2 -2
  22. package/package/components/FlowLogViewer.svelte +228 -57
  23. package/package/components/FlowLogViewer.svelte.d.ts +16 -5
  24. package/package/components/FlowLogViewerWrapper.svelte +56 -3
  25. package/package/components/FlowLogViewerWrapper.svelte.d.ts +4 -3
  26. package/package/components/FlowLoopIterationPreview.svelte +4 -4
  27. package/package/components/FlowMetadata.svelte +3 -4
  28. package/package/components/FlowMetadata.svelte.d.ts +4 -18
  29. package/package/components/FlowPreviewContent.svelte +9 -3
  30. package/package/components/FlowPreviewContent.svelte.d.ts +1 -1
  31. package/package/components/FlowStatusViewer.svelte +62 -59
  32. package/package/components/FlowStatusViewer.svelte.d.ts +2 -2
  33. package/package/components/FlowStatusViewerInner.svelte +186 -94
  34. package/package/components/FlowStatusViewerInner.svelte.d.ts +10 -3
  35. package/package/components/FlowTimeline.svelte +110 -131
  36. package/package/components/FlowTimeline.svelte.d.ts +13 -4
  37. package/package/components/FlowTimelineBar.svelte +227 -0
  38. package/package/components/FlowTimelineBar.svelte.d.ts +24 -0
  39. package/package/components/InputTransformForm.svelte +119 -3
  40. package/package/components/InputTransformForm.svelte.d.ts +3 -0
  41. package/package/components/InputTransformSchemaForm.svelte +5 -1
  42. package/package/components/InputTransformSchemaForm.svelte.d.ts +2 -0
  43. package/package/components/InstanceSetting.svelte +17 -42
  44. package/package/components/InstanceSettings.svelte +12 -21
  45. package/package/components/JobArgs.svelte +15 -16
  46. package/package/components/JobArgs.svelte.d.ts +4 -18
  47. package/package/components/JobLoader.svelte +23 -42
  48. package/package/components/JobLoader.svelte.d.ts +2 -0
  49. package/package/components/JobStatus.svelte +1 -1
  50. package/package/components/JobStatus.svelte.d.ts +4 -18
  51. package/package/components/ModulePreviewResultViewer.svelte +1 -7
  52. package/package/components/NextcloudSetting.svelte +6 -1
  53. package/package/components/Password.svelte +7 -11
  54. package/package/components/Password.svelte.d.ts +5 -20
  55. package/package/components/PasswordArgInput.svelte +35 -15
  56. package/package/components/PasswordArgInput.svelte.d.ts +4 -18
  57. package/package/components/QueuePosition.svelte +6 -2
  58. package/package/components/RunForm.svelte +5 -14
  59. package/package/components/S3ArrayHelperButton.svelte +12 -0
  60. package/package/components/S3ArrayHelperButton.svelte.d.ts +8 -0
  61. package/package/components/ScriptEditor.svelte +5 -6
  62. package/package/components/StringTypeNarrowing.svelte +39 -24
  63. package/package/components/StringTypeNarrowing.svelte.d.ts +1 -1
  64. package/package/components/TeamSelector.svelte +83 -37
  65. package/package/components/TeamSelector.svelte.d.ts +0 -1
  66. package/package/components/apps/components/buttons/AppButton.svelte +11 -1
  67. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +13 -4
  68. package/package/components/apps/components/display/table/SyncColumnDefs.svelte +2 -2
  69. package/package/components/apps/components/display/table/utils.js +1 -1
  70. package/package/components/apps/components/helpers/RefreshButton.svelte +5 -1
  71. package/package/components/apps/components/helpers/RunnableComponent.svelte +0 -2
  72. package/package/components/apps/components/helpers/RunnableWrapper.svelte.d.ts +1 -0
  73. package/package/components/apps/components/layout/AppTabs.svelte +116 -71
  74. package/package/components/apps/components/layout/AppTabs.svelte.d.ts +1 -0
  75. package/package/components/apps/editor/component/ComponentInner.svelte +1 -0
  76. package/package/components/apps/editor/component/components.d.ts +16 -1
  77. package/package/components/apps/editor/component/components.js +22 -2
  78. package/package/components/apps/editor/settingsPanel/ComponentPanel.svelte +2 -0
  79. package/package/components/apps/editor/settingsPanel/GridTab.svelte +19 -1
  80. package/package/components/apps/editor/settingsPanel/GridTab.svelte.d.ts +3 -1
  81. package/package/components/apps/editor/settingsPanel/GridTabHidden.svelte +52 -0
  82. package/package/components/apps/editor/settingsPanel/GridTabHidden.svelte.d.ts +9 -0
  83. package/package/components/auditLogs/AuditLogsFilters.svelte +6 -0
  84. package/package/components/auditLogs/AuditLogsTable.svelte +17 -7
  85. package/package/components/auditLogs/AuditLogsTable.svelte.d.ts +1 -0
  86. package/package/components/common/CloseButton.svelte +2 -2
  87. package/package/components/common/CloseButton.svelte.d.ts +1 -0
  88. package/package/components/common/layout/List.svelte +3 -7
  89. package/package/components/common/layout/List.svelte.d.ts +7 -29
  90. package/package/components/common/popup/PopupV2.svelte +8 -25
  91. package/package/components/common/popup/PopupV2.svelte.d.ts +4 -2
  92. package/package/components/common/table/ScriptRow.svelte +22 -2
  93. package/package/components/copilot/FlowCopilotInputsModal.svelte +26 -23
  94. package/package/components/copilot/chat/AIChatManager.svelte.js +3 -2
  95. package/package/components/copilot/chat/ProviderModelSelector.svelte +1 -1
  96. package/package/components/copilot/chat/flow/FlowAIChat.svelte +4 -2
  97. package/package/components/copilot/chat/script/core.d.ts +4 -4
  98. package/package/components/copilot/chat/script/core.js +93 -34
  99. package/package/components/copilot/lib.d.ts +1 -0
  100. package/package/components/copilot/lib.js +6 -3
  101. package/package/components/custom_ui.d.ts +2 -0
  102. package/package/components/flows/FlowProgressBar.svelte +16 -16
  103. package/package/components/flows/FlowProgressBar.svelte.d.ts +7 -22
  104. package/package/components/flows/content/FlowInputsQuick.svelte +3 -2
  105. package/package/components/flows/content/FlowInputsQuick.svelte.d.ts +1 -0
  106. package/package/components/flows/content/FlowModuleComponent.svelte +24 -1
  107. package/package/components/flows/flowInfers.js +34 -8
  108. package/package/components/flows/flowStore.d.ts +4 -1
  109. package/package/components/flows/map/FlowJobsMenu.svelte +3 -3
  110. package/package/components/flows/map/FlowJobsMenu.svelte.d.ts +1 -1
  111. package/package/components/flows/map/InsertModuleButton.svelte +4 -14
  112. package/package/components/flows/map/InsertModuleButton.svelte.d.ts +0 -1
  113. package/package/components/flows/map/InsertModuleInner.svelte +17 -20
  114. package/package/components/flows/map/MapItem.svelte +1 -1
  115. package/package/components/flows/pickers/PickHubScriptQuick.svelte +38 -52
  116. package/package/components/flows/pickers/PickHubScriptQuick.svelte.d.ts +1 -0
  117. package/package/components/flows/pickers/WorkspaceScriptPickerQuick.svelte +27 -15
  118. package/package/components/flows/pickers/WorkspaceScriptPickerQuick.svelte.d.ts +1 -0
  119. package/package/components/flows/propPicker/OutputPicker.svelte +2 -0
  120. package/package/components/git_sync/DetectionFlow.svelte +33 -44
  121. package/package/components/git_sync/DetectionFlow.svelte.d.ts +1 -0
  122. package/package/components/git_sync/GitSyncContext.svelte.d.ts +22 -0
  123. package/package/components/git_sync/GitSyncContext.svelte.js +145 -5
  124. package/package/components/git_sync/GitSyncModeDisplay.svelte +14 -0
  125. package/package/components/git_sync/GitSyncModeDisplay.svelte.d.ts +9 -0
  126. package/package/components/git_sync/GitSyncRepositoryCard.svelte +365 -253
  127. package/package/components/git_sync/GitSyncRepositoryCard.svelte.d.ts +10 -1
  128. package/package/components/git_sync/GitSyncSection.svelte +134 -14
  129. package/package/components/git_sync/PullWorkspaceModal.svelte +24 -32
  130. package/package/components/git_sync/PushWorkspaceModal.svelte +24 -32
  131. package/package/components/graph/model.d.ts +5 -5
  132. package/package/components/graph/renderers/edges/EmptyEdge.svelte +3 -10
  133. package/package/components/graph/renderers/edges/EmptyEdge.svelte.d.ts +4 -18
  134. package/package/components/graph/renderers/nodes/AIToolNode.svelte +2 -2
  135. package/package/components/graph/renderers/nodes/NewAIToolNode.svelte +5 -10
  136. package/package/components/home/ItemsList.svelte +1 -1
  137. package/package/components/jobs/JobProgressBar.svelte +27 -21
  138. package/package/components/jobs/JobProgressBar.svelte.d.ts +9 -24
  139. package/package/components/meltComponents/MenuSingleItem.svelte +3 -8
  140. package/package/components/meltComponents/MenuSingleItem.svelte.d.ts +0 -3
  141. package/package/components/meltComponents/Popover.svelte +3 -2
  142. package/package/components/meltComponents/Popover.svelte.d.ts +1 -0
  143. package/package/components/meltComponents/Tooltip.svelte +1 -1
  144. package/package/components/progressBar/ProgressBar.svelte +39 -53
  145. package/package/components/progressBar/ProgressBar.svelte.d.ts +11 -26
  146. package/package/components/runs/JobsLoader.svelte +1 -1
  147. package/package/components/runs/NoWorkerWithTagWarning.svelte +3 -3
  148. package/package/components/runs/NoWorkerWithTagWarning.svelte.d.ts +1 -1
  149. package/package/components/schema/AddPropertyV2.svelte +7 -4
  150. package/package/components/schema/PropertyEditor.svelte.d.ts +1 -1
  151. package/package/components/select/MultiSelect.svelte +2 -2
  152. package/package/components/select/MultiSelect.svelte.d.ts +1 -0
  153. package/package/components/settings/WorkspaceUserSettings.svelte +92 -1
  154. package/package/components/sidebar/MenuLink.svelte +2 -1
  155. package/package/components/sidebar/MenuLink.svelte.d.ts +1 -0
  156. package/package/components/sidebar/SidebarContent.svelte +27 -27
  157. package/package/components/table/Cell.svelte +7 -14
  158. package/package/components/table/Cell.svelte.d.ts +13 -35
  159. package/package/components/triggers/AddTriggersButton.svelte +1 -0
  160. package/package/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte +1 -1
  161. package/package/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte.d.ts +2 -1
  162. package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +28 -5
  163. package/package/components/triggers/gcp/utils.js +1 -0
  164. package/package/components/triggers/schedules/ScheduleEditorInner.svelte +1 -0
  165. package/package/components/triggers/webhook/WebhooksConfigSection.svelte +143 -63
  166. package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +22 -0
  167. package/package/components/triggers/websocket/utils.js +1 -0
  168. package/package/components/workspaceSettings/AISettings.svelte +8 -2
  169. package/package/components/workspaceSettings/AISettings.svelte.d.ts +2 -1
  170. package/package/components/workspaceSettings/ModelTokenLimits.svelte +165 -0
  171. package/package/components/workspaceSettings/ModelTokenLimits.svelte.d.ts +8 -0
  172. package/package/components/workspaceSettings/StorageSettings.svelte +123 -51
  173. package/package/gen/core/OpenAPI.js +1 -1
  174. package/package/gen/schemas.gen.d.ts +141 -16
  175. package/package/gen/schemas.gen.js +144 -16
  176. package/package/gen/services.gen.d.ts +62 -42
  177. package/package/gen/services.gen.js +131 -82
  178. package/package/gen/types.gen.d.ts +218 -144
  179. package/package/hubPaths.json +2 -1
  180. package/package/services/JobManager.js +10 -7
  181. package/package/stores.d.ts +1 -0
  182. package/package/stores.js +6 -3
  183. package/package/timelineCompute.svelte.d.ts +21 -0
  184. package/package/timelineCompute.svelte.js +113 -0
  185. package/package/utils.d.ts +15 -8
  186. package/package/utils.js +62 -12
  187. package/package/workspace_settings.d.ts +13 -8
  188. package/package/workspace_settings.js +46 -11
  189. package/package.json +2 -2
@@ -10,7 +10,10 @@ export interface PropertyDisplayInfo {
10
10
  index: number;
11
11
  propertiesNumber: number;
12
12
  }
13
- export type EnumType = string[] | undefined;
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;
@@ -6,7 +6,7 @@ import { onMount } from 'svelte';
6
6
  const resultSchema = z.object({
7
7
  messages: z.array(z.object({
8
8
  role: z.string(),
9
- content: z.string().optional(),
9
+ content: z.unknown(),
10
10
  agent_action: z
11
11
  .union([
12
12
  z.object({
@@ -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].map((item) => ({
8
- value: item,
9
- label: enumLabels?.[item] ?? item
10
- }));
11
- if (create && filterText && l.every((i) => i.value !== filterText)) {
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
- nvalue = enum_?.[0];
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
- {#if !disabled && itemPicker && extra?.['disableVariablePicker'] != true}
1169
- <!-- svelte-ignore a11y_click_events_have_key_events -->
1170
- <button
1171
- class="absolute right-1 top-1 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"
1172
- onclick={() => {
1173
- pickForField = label
1174
- itemPicker?.openDrawer?.()
1175
- }}
1176
- title="Insert a Variable"
1177
- >
1178
- <DollarSign class="!text-tertiary" size={14} />
1179
- </button>
1180
- {/if}
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" | "properties" | "defaultValue" | "placeholder" | "pattern" | "valid" | "oneOf" | "format" | "order" | "editor" | "enum_" | "itemsType" | "pickForField">;
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
- let { disabled = false, placeholder = 'Select channel', selectedChannel = $bindable(undefined), containerClass = 'w-64', minWidth = '160px', channels = [] } = $props();
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
- <Select
9
- containerStyle={'min-width: ' + minWidth}
10
- items={channels.map((channel) => ({
11
- label: channel.channel_name ?? 'Unknown Channel',
12
- value: channel.channel_id ?? ''
13
- }))}
14
- {placeholder}
15
- bind:value={
16
- () => selectedChannel?.channel_id,
17
- (value) => (selectedChannel = channels.find((channel) => channel.channel_id === value))
18
- }
19
- clearable
20
- disabled={disabled || channels.length === 0}
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
- sendUserToast('Failed to connect to Teams', true);
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 class="h-full">
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
- declare const Dev: import("svelte").Component<Record<string, never>, {}, "">;
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
- (json.every((item) => item && typeof item === 'object' && Object.keys(item).length > 0 && !Array.isArray(item)) ||
51
- (Array.isArray(json[0]) &&
52
- json[0].every((item) => typeof item === 'string') &&
53
- json
54
- .slice(1)
55
- .every((item) => item &&
56
- typeof item === 'object' &&
57
- Object.keys(item).length > 0 &&
58
- !Array.isArray(item)))));
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.slice(1);
261
- const result = rows.map((row) => {
270
+ const rows = new Array(json.length - 1);
271
+ for (let i = 1; i < json.length; i++) {
262
272
  const obj = {};
263
- for (const header of headers) {
264
- obj[header] = row[header];
273
+ const row = json[i];
274
+ for (let j = 0; j < headers.length; j++) {
275
+ obj[headers[j]] = row[headers[j]];
265
276
  }
266
- return obj;
267
- });
268
- return result;
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
- resultKind = inferResultKind(result);
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
- 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, buttonReplacement, menu } = $props();
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 {...$menuEl} use:$menuEl.action data-menu class="z-[6000] transition-all duration-100">
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}
@@ -14,6 +14,7 @@ interface Props {
14
14
  customWidth?: number | undefined;
15
15
  customMenu?: boolean;
16
16
  class?: string | undefined;
17
+ enableFlyTransition?: boolean;
17
18
  buttonReplacement?: import('svelte').Snippet;
18
19
  menu?: import('svelte').Snippet;
19
20
  }
@@ -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
- const [inputType, entrypoint] = format.includes('-') ? format.split('-', 2) : [format, ''];
29
- const isMultiple = inputType === 'dynmultiselect';
30
- const isSelect = inputType === 'dynselect' || inputType === 'dynmultiselect';
31
- if (isMultiple && value === undefined) {
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
- helperScript?.type == 'inline'
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].type === 'object' && schema.properties[k].properties) {
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.type !== 'object')
117
- return property.type;
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.type === 'object' && DynamicInput.isDynInputFormat(props.format);
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
- type: 'inline',
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].type}
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].type}
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
- <Button
19
- btnClasses="text-tertiary"
20
- color="light"
21
- size="xs"
22
- nonCaptureEvent={true}
23
- startIcon={{ icon: Settings }}
24
- iconOnly
25
- title="Editor settings"
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">