windmill-components 1.613.5 → 1.623.2

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 (254) hide show
  1. package/package/cancelable-promise-utils.js +4 -2
  2. package/package/components/ApiConnectForm.svelte +6 -0
  3. package/package/components/AppConnectDrawer.svelte +1 -0
  4. package/package/components/AppConnectInner.svelte +1 -0
  5. package/package/components/AuthSettings.svelte +3 -1
  6. package/package/components/BedrockCredentialsCheck.svelte +241 -0
  7. package/package/components/BedrockCredentialsCheck.svelte.d.ts +3 -0
  8. package/package/components/CenteredPage.svelte +2 -1
  9. package/package/components/CenteredPage.svelte.d.ts +1 -0
  10. package/package/components/CompareWorkspaces.svelte +74 -16
  11. package/package/components/DBManager.svelte +35 -31
  12. package/package/components/DBManager.svelte.d.ts +13 -3
  13. package/package/components/DBManagerContent.svelte +23 -62
  14. package/package/components/DBManagerContent.svelte.d.ts +37 -3
  15. package/package/components/DBManagerDrawer.svelte +7 -9
  16. package/package/components/DBTable.svelte +1 -1
  17. package/package/components/DBTable.svelte.d.ts +3 -1
  18. package/package/components/DBTableEditor.svelte +66 -49
  19. package/package/components/DBTableEditor.svelte.d.ts +1 -1
  20. package/package/components/DateInput.svelte +29 -35
  21. package/package/components/DateInput.svelte.d.ts +10 -11
  22. package/package/components/DedicatedWorkersSelector.svelte +569 -0
  23. package/package/components/DedicatedWorkersSelector.svelte.d.ts +8 -0
  24. package/package/components/DeployWorkspace.svelte +106 -29
  25. package/package/components/DropdownV2.svelte +2 -1
  26. package/package/components/DropdownV2.svelte.d.ts +1 -0
  27. package/package/components/Editor.svelte +1 -10
  28. package/package/components/FlowGraphViewer.svelte +5 -2
  29. package/package/components/FlowGraphViewer.svelte.d.ts +2 -0
  30. package/package/components/FlowLoopIterationPreview.svelte.d.ts +1 -1
  31. package/package/components/FlowPreviewContent.svelte.d.ts +1 -1
  32. package/package/components/FlowStatusViewerInner.svelte +6 -3
  33. package/package/components/ForkWorkspaceBanner.svelte +16 -0
  34. package/package/components/InfiniteList.svelte +27 -20
  35. package/package/components/InfiniteList.svelte.d.ts +2 -0
  36. package/package/components/JobLoader.svelte.d.ts +1 -1
  37. package/package/components/Login.svelte +6 -0
  38. package/package/components/NextcloudSetting.svelte +1 -1
  39. package/package/components/OAuthSetting.svelte +12 -23
  40. package/package/components/PocketIdSetting.svelte +82 -0
  41. package/package/components/PocketIdSetting.svelte.d.ts +6 -0
  42. package/package/components/ResourceEditor.svelte +4 -4
  43. package/package/components/ResourcePicker.svelte +1 -0
  44. package/package/components/RunForm.svelte +9 -17
  45. package/package/components/RunForm.svelte.d.ts +0 -1
  46. package/package/components/RunsPage.svelte +34 -0
  47. package/package/components/SavedInputsPicker.svelte +1 -1
  48. package/package/components/SavedInputsV2.svelte +35 -36
  49. package/package/components/Section.svelte +1 -1
  50. package/package/components/Star.svelte +8 -12
  51. package/package/components/Star.svelte.d.ts +6 -19
  52. package/package/components/StringTypeNarrowing.svelte.d.ts +1 -1
  53. package/package/components/TimeAgo.svelte +49 -7
  54. package/package/components/TimeAgo.svelte.d.ts +1 -0
  55. package/package/components/Toast.svelte +5 -1
  56. package/package/components/WorkerGroup.svelte +35 -20
  57. package/package/components/WorkerGroup.svelte.d.ts +1 -0
  58. package/package/components/apps/components/display/InsertRowDrawerButton.svelte +1 -1
  59. package/package/components/apps/components/display/dbtable/AppDbExplorer.svelte +2 -1
  60. package/package/components/apps/components/display/dbtable/dbFeatures.d.ts +9 -0
  61. package/package/components/apps/components/display/dbtable/dbFeatures.js +32 -0
  62. package/package/components/apps/components/display/dbtable/metadata.d.ts +3 -3
  63. package/package/components/apps/components/display/dbtable/metadata.js +120 -130
  64. package/package/components/apps/components/display/dbtable/queries/alterTable.js +13 -5
  65. package/package/components/apps/components/display/dbtable/queries/alterTable.test.js +1 -1
  66. package/package/components/apps/components/display/dbtable/queries/createTable.js +2 -0
  67. package/package/components/apps/components/display/dbtable/queries/relationalKeys.d.ts +1 -3
  68. package/package/components/apps/components/display/dbtable/queries/relationalKeys.js +41 -42
  69. package/package/components/apps/components/display/dbtable/tableEditor.js +18 -0
  70. package/package/components/apps/components/display/dbtable/utils.d.ts +1 -8
  71. package/package/components/apps/components/display/dbtable/utils.js +27 -34
  72. package/package/components/apps/components/display/table/AppAggridTable.svelte +8 -0
  73. package/package/components/apps/components/display/table/AppAggridTableActions.svelte +9 -9
  74. package/package/components/apps/components/display/table/AppAggridTableActions.svelte.d.ts +1 -1
  75. package/package/components/apps/components/inputs/AppMultiSelectV2.svelte +2 -4
  76. package/package/components/assets/AssetsDropdownButton.svelte +1 -1
  77. package/package/components/assets/AssetsUsageDrawer.svelte +98 -27
  78. package/package/components/assets/AssetsUsageDrawer.svelte.d.ts +5 -6
  79. package/package/components/assets/lib.d.ts +3 -2
  80. package/package/components/assets/lib.js +3 -1
  81. package/package/components/common/CloseButton.svelte +2 -1
  82. package/package/components/common/CloseButton.svelte.d.ts +1 -0
  83. package/package/components/common/badge/CountBadge.svelte +4 -3
  84. package/package/components/common/badge/CountBadge.svelte.d.ts +1 -0
  85. package/package/components/common/button/Button.svelte +1 -1
  86. package/package/components/common/confirmationModal/ConfirmationModal.svelte +2 -1
  87. package/package/components/common/confirmationModal/ConfirmationModal.svelte.d.ts +1 -0
  88. package/package/components/common/drawer/Drawer.svelte +4 -1
  89. package/package/components/common/drawer/DrawerContent.svelte +6 -3
  90. package/package/components/common/drawer/DrawerContent.svelte.d.ts +1 -0
  91. package/package/components/common/modal/Modal2.svelte +1 -0
  92. package/package/components/common/table/AppRow.svelte +4 -1
  93. package/package/components/common/table/FlowRow.svelte +4 -1
  94. package/package/components/common/table/RawAppRow.svelte +4 -1
  95. package/package/components/common/table/Row.svelte +11 -21
  96. package/package/components/common/table/Row.svelte.d.ts +4 -20
  97. package/package/components/common/table/RowIcon.svelte +6 -2
  98. package/package/components/common/table/RowIcon.svelte.d.ts +1 -1
  99. package/package/components/common/table/ScriptRow.svelte +4 -1
  100. package/package/components/copilot/autocomplete/Autocompletor.d.ts +1 -1
  101. package/package/components/copilot/autocomplete/Autocompletor.js +4 -4
  102. package/package/components/copilot/autocomplete/request.js +13 -9
  103. package/package/components/copilot/chat/script/core.js +5 -4
  104. package/package/components/copilot/lib.js +2 -9
  105. package/package/components/copilot/utils.d.ts +5 -0
  106. package/package/components/copilot/utils.js +8 -0
  107. package/package/components/dbOps.d.ts +1 -1
  108. package/package/components/dbOps.js +2 -2
  109. package/package/components/details/DetailPageHeader.svelte +21 -7
  110. package/package/components/details/DetailPageHeader.svelte.d.ts +2 -1
  111. package/package/components/details/DetailPageLayout.svelte +10 -1
  112. package/package/components/details/DetailPageLayout.svelte.d.ts +1 -0
  113. package/package/components/flows/conversations/FlowConversationsSidebar.svelte +79 -77
  114. package/package/components/flows/propPicker/OutputPickerInner.svelte.d.ts +1 -1
  115. package/package/components/graph/FlowGraphV2.svelte +7 -1
  116. package/package/components/graph/renderers/triggers/TriggersBadge.svelte +41 -24
  117. package/package/components/home/ItemsList.svelte +2 -1
  118. package/package/components/home/treeViewUtils.js +1 -1
  119. package/package/components/icons/NextcloudIcon.svelte +3 -2
  120. package/package/components/icons/NextcloudIcon.svelte.d.ts +2 -0
  121. package/package/components/icons/PocketIdIcon.svelte +9 -0
  122. package/package/components/icons/PocketIdIcon.svelte.d.ts +9 -0
  123. package/package/components/icons/index.js +3 -1
  124. package/package/components/instanceSettings.d.ts +1 -1
  125. package/package/components/instanceSettings.js +1 -0
  126. package/package/components/raw_apps/RawAppDataTableDrawer.svelte +1 -3
  127. package/package/components/raw_apps/datatableUtils.svelte.js +1 -1
  128. package/package/components/schema/EditableSchemaWrapper.svelte +2 -2
  129. package/package/components/select/MultiSelect.svelte +1 -1
  130. package/package/components/select/SelectDropdown.svelte +15 -3
  131. package/package/components/settings/ChangeWorkspaceId.svelte +8 -7
  132. package/package/components/settings/CreateToken.svelte +3 -3
  133. package/package/components/settings/WorkspaceUserSettings.svelte +6 -5
  134. package/package/components/sidebar/MenuButton.svelte +13 -5
  135. package/package/components/sidebar/MultiplayerMenu.svelte +2 -2
  136. package/package/components/sidebar/SidebarContent.svelte +32 -4
  137. package/package/components/sidebar/UserMenu.svelte +2 -2
  138. package/package/components/table/DataTable.svelte +6 -2
  139. package/package/components/table/DataTable.svelte.d.ts +1 -0
  140. package/package/components/triggers/AddTriggersButton.svelte +17 -4
  141. package/package/components/triggers/TriggersEditor.svelte +4 -0
  142. package/package/components/triggers/TriggersWrapper.svelte +14 -0
  143. package/package/components/triggers/native/NativeTriggerEditor.svelte +379 -0
  144. package/package/components/triggers/native/NativeTriggerEditor.svelte.d.ts +26 -0
  145. package/package/components/triggers/native/NativeTriggerTable.svelte +155 -0
  146. package/package/components/triggers/native/NativeTriggerTable.svelte.d.ts +16 -0
  147. package/package/components/triggers/native/NativeTriggersPanel.svelte +40 -0
  148. package/package/components/triggers/native/NativeTriggersPanel.svelte.d.ts +15 -0
  149. package/package/components/triggers/native/services/nextcloud/NextcloudTriggerForm.svelte +104 -0
  150. package/package/components/triggers/native/services/nextcloud/NextcloudTriggerForm.svelte.d.ts +18 -0
  151. package/package/components/triggers/native/utils.d.ts +74 -0
  152. package/package/components/triggers/native/utils.js +152 -0
  153. package/package/components/triggers/triggers.svelte.d.ts +2 -1
  154. package/package/components/triggers/triggers.svelte.js +36 -8
  155. package/package/components/triggers/utils.js +18 -5
  156. package/package/components/triggers.d.ts +1 -1
  157. package/package/components/workspaceSettings/AISettings.svelte +2 -1
  158. package/package/components/workspaceSettings/CustomInstanceDbSelect.svelte +1 -0
  159. package/package/components/workspaceSettings/CustomInstanceDbWizardModal.svelte +3 -1
  160. package/package/components/workspaceSettings/DataTableSettings.svelte +2 -1
  161. package/package/components/workspaceSettings/DucklakeSettings.svelte +8 -3
  162. package/package/components/workspaceSettings/OAuthClientConfig.svelte +180 -0
  163. package/package/components/workspaceSettings/OAuthClientConfig.svelte.d.ts +14 -0
  164. package/package/components/workspaceSettings/StorageSettings.svelte +7 -2
  165. package/package/components/workspaceSettings/WorkspaceIntegrations.svelte +302 -0
  166. package/package/components/workspaceSettings/WorkspaceIntegrations.svelte.d.ts +3 -0
  167. package/package/consts.js +0 -2
  168. package/package/gen/core/OpenAPI.js +1 -1
  169. package/package/gen/schemas.gen.d.ts +384 -3
  170. package/package/gen/schemas.gen.js +390 -3
  171. package/package/gen/services.gen.d.ts +200 -13
  172. package/package/gen/services.gen.js +383 -24
  173. package/package/gen/types.gen.d.ts +884 -94
  174. package/package/hub.js +2 -2
  175. package/package/hubPaths.json +1 -1
  176. package/package/refreshUser.d.ts +5 -1
  177. package/package/refreshUser.js +20 -30
  178. package/package/storeUtils.js +2 -0
  179. package/package/svelte5Utils.svelte.d.ts +61 -0
  180. package/package/svelte5Utils.svelte.js +170 -0
  181. package/package/utils.js +3 -0
  182. package/package.json +4 -6
  183. package/dist/sharedUtils/assets/tokens/colorTokensConfig.d.ts +0 -2
  184. package/dist/sharedUtils/base.d.ts +0 -1
  185. package/dist/sharedUtils/cloud.d.ts +0 -1
  186. package/dist/sharedUtils/common.d.ts +0 -111
  187. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/count.d.ts +0 -5
  188. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/delete.d.ts +0 -5
  189. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/insert.d.ts +0 -5
  190. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/select.d.ts +0 -13
  191. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/update.d.ts +0 -11
  192. package/dist/sharedUtils/components/apps/components/display/dbtable/utils.d.ts +0 -95
  193. package/dist/sharedUtils/components/apps/editor/appPolicy.d.ts +0 -6
  194. package/dist/sharedUtils/components/apps/editor/appUtilsCore.d.ts +0 -7
  195. package/dist/sharedUtils/components/apps/editor/appUtilsS3.d.ts +0 -33
  196. package/dist/sharedUtils/components/apps/editor/commonAppUtils.d.ts +0 -10
  197. package/dist/sharedUtils/components/apps/editor/component/components.d.ts +0 -5371
  198. package/dist/sharedUtils/components/apps/editor/component/default-codes.d.ts +0 -3
  199. package/dist/sharedUtils/components/apps/editor/component/index.d.ts +0 -3
  200. package/dist/sharedUtils/components/apps/editor/component/sets.d.ts +0 -7
  201. package/dist/sharedUtils/components/apps/editor/componentsPanel/componentDefaultProps.d.ts +0 -3
  202. package/dist/sharedUtils/components/apps/gridUtils.d.ts +0 -14
  203. package/dist/sharedUtils/components/apps/inputType.d.ts +0 -178
  204. package/dist/sharedUtils/components/apps/rx.d.ts +0 -29
  205. package/dist/sharedUtils/components/apps/sharedTypes.d.ts +0 -21
  206. package/dist/sharedUtils/components/apps/types.d.ts +0 -274
  207. package/dist/sharedUtils/components/assets/lib.d.ts +0 -25
  208. package/dist/sharedUtils/components/common/alert/model.d.ts +0 -2
  209. package/dist/sharedUtils/components/common/badge/model.d.ts +0 -8
  210. package/dist/sharedUtils/components/common/button/model.d.ts +0 -45
  211. package/dist/sharedUtils/components/common/fileInput/model.d.ts +0 -1
  212. package/dist/sharedUtils/components/common/index.d.ts +0 -24
  213. package/dist/sharedUtils/components/common/skeleton/model.d.ts +0 -21
  214. package/dist/sharedUtils/components/dbTypes.d.ts +0 -14
  215. package/dist/sharedUtils/components/diff_drawer.d.ts +0 -26
  216. package/dist/sharedUtils/components/ducklake.d.ts +0 -1
  217. package/dist/sharedUtils/components/flows/scheduleUtils.d.ts +0 -7
  218. package/dist/sharedUtils/components/icons/index.d.ts +0 -101
  219. package/dist/sharedUtils/components/random_positive_adjetive.d.ts +0 -1
  220. package/dist/sharedUtils/components/raw_apps/rawAppPolicy.d.ts +0 -10
  221. package/dist/sharedUtils/components/raw_apps/utils.d.ts +0 -15
  222. package/dist/sharedUtils/components/triggers/email/utils.d.ts +0 -4
  223. package/dist/sharedUtils/components/triggers/gcp/utils.d.ts +0 -2
  224. package/dist/sharedUtils/components/triggers/http/utils.d.ts +0 -11
  225. package/dist/sharedUtils/components/triggers/kafka/utils.d.ts +0 -2
  226. package/dist/sharedUtils/components/triggers/mqtt/utils.d.ts +0 -2
  227. package/dist/sharedUtils/components/triggers/nats/utils.d.ts +0 -2
  228. package/dist/sharedUtils/components/triggers/postgres/utils.d.ts +0 -8
  229. package/dist/sharedUtils/components/triggers/sqs/utils.d.ts +0 -2
  230. package/dist/sharedUtils/components/triggers/triggers.svelte.d.ts +0 -32
  231. package/dist/sharedUtils/components/triggers/utils.d.ts +0 -80
  232. package/dist/sharedUtils/components/triggers/websocket/utils.d.ts +0 -2
  233. package/dist/sharedUtils/components/triggers.d.ts +0 -20
  234. package/dist/sharedUtils/gen/core/ApiError.d.ts +0 -10
  235. package/dist/sharedUtils/gen/core/ApiRequestOptions.d.ts +0 -13
  236. package/dist/sharedUtils/gen/core/ApiResult.d.ts +0 -7
  237. package/dist/sharedUtils/gen/core/CancelablePromise.d.ts +0 -26
  238. package/dist/sharedUtils/gen/core/OpenAPI.d.ts +0 -27
  239. package/dist/sharedUtils/gen/core/request.d.ts +0 -29
  240. package/dist/sharedUtils/gen/index.d.ts +0 -6
  241. package/dist/sharedUtils/gen/schemas.gen.d.ts +0 -7036
  242. package/dist/sharedUtils/gen/services.gen.d.ts +0 -6047
  243. package/dist/sharedUtils/gen/types.gen.d.ts +0 -21881
  244. package/dist/sharedUtils/history.svelte.d.ts +0 -9
  245. package/dist/sharedUtils/hub.d.ts +0 -49
  246. package/dist/sharedUtils/jsr.json +0 -6
  247. package/dist/sharedUtils/lib.d.ts +0 -5
  248. package/dist/sharedUtils/lib.es.js +0 -1588
  249. package/dist/sharedUtils/package.json +0 -12
  250. package/dist/sharedUtils/schema.d.ts +0 -3
  251. package/dist/sharedUtils/stores.d.ts +0 -97
  252. package/dist/sharedUtils/svelte5Utils.svelte.d.ts +0 -80
  253. package/dist/sharedUtils/toast.d.ts +0 -8
  254. package/dist/sharedUtils/utils.d.ts +0 -265
@@ -1,3 +1,11 @@
1
+ interface Props {
2
+ value?: string | null | undefined;
3
+ autofocus?: boolean | null;
4
+ minDate?: string | undefined;
5
+ maxDate?: string | undefined;
6
+ dateFormat?: string | undefined;
7
+ disabled?: boolean;
8
+ }
1
9
  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> {
2
10
  new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
11
  $$bindings?: Bindings;
@@ -11,19 +19,10 @@ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> =
11
19
  };
12
20
  z_$$bindings?: Bindings;
13
21
  }
14
- declare const DateInput: $$__sveltets_2_IsomorphicComponent<{
15
- value?: string | null | undefined;
16
- autofocus?: boolean | null;
17
- minDate?: string | undefined;
18
- maxDate?: string | undefined;
19
- dateFormat?: string | undefined;
20
- disabled?: boolean;
21
- }, {
22
- pointerdown: PointerEvent;
23
- focus: FocusEvent;
22
+ declare const DateInput: $$__sveltets_2_IsomorphicComponent<Props, {
24
23
  change: CustomEvent<any>;
25
24
  } & {
26
25
  [evt: string]: CustomEvent<any>;
27
- }, {}, {}, string>;
26
+ }, {}, {}, "value">;
28
27
  type DateInput = InstanceType<typeof DateInput>;
29
28
  export default DateInput;
@@ -0,0 +1,569 @@
1
+ <script lang="ts">import { ScriptService, FlowService, WorkspaceService } from '../gen';
2
+ import { Check, X, RefreshCcw, ChevronDown, ChevronRight, CodeXml } from 'lucide-svelte';
3
+ import { Button } from './common';
4
+ import Select from './select/Select.svelte';
5
+ import { sendUserToast } from '../toast';
6
+ import Badge from './common/badge/Badge.svelte';
7
+ import { SvelteMap } from 'svelte/reactivity';
8
+ import { untrack } from 'svelte';
9
+ import BarsStaggered from './icons/BarsStaggered.svelte';
10
+ let { selectedTags = $bindable([]), disabled = false, onchange } = $props();
11
+ let selectedWorkspace = $state(undefined);
12
+ let runnables = $state([]);
13
+ let loading = $state(false);
14
+ let workspaces = $state([]);
15
+ let workspacesLoading = $state(true);
16
+ let selectorExpanded = $state(false);
17
+ let selectedTagsInfo = $state(new SvelteMap());
18
+ // Languages that support dedicated workers
19
+ const DEDICATED_WORKER_LANGUAGES = ['python3', 'bun', 'deno'];
20
+ // Parse a tag to extract workspace, type (script/flow), and path
21
+ function parseTag(tag) {
22
+ const colonIndex = tag.indexOf(':');
23
+ if (colonIndex === -1)
24
+ return null;
25
+ const workspace = tag.substring(0, colonIndex);
26
+ const rest = tag.substring(colonIndex + 1);
27
+ if (rest.startsWith('flow/')) {
28
+ return { workspace, type: 'flow', path: rest.substring(5) };
29
+ }
30
+ else {
31
+ return { workspace, type: 'script', path: rest };
32
+ }
33
+ }
34
+ // Resolve workspace script languages and filter to supported languages
35
+ async function resolveAndFilterRunners(workspace, preliminaryRunners) {
36
+ const runnersWithLanguage = await Promise.all(preliminaryRunners.map(async (runner) => {
37
+ if (!runner.isInline && runner.scriptPath) {
38
+ try {
39
+ const script = await ScriptService.getScriptByPath({
40
+ workspace,
41
+ path: runner.scriptPath
42
+ });
43
+ return { ...runner, language: script.language };
44
+ }
45
+ catch (e) {
46
+ console.error(`Failed to fetch script ${runner.scriptPath}`, e);
47
+ return { ...runner, language: undefined };
48
+ }
49
+ }
50
+ return runner;
51
+ }));
52
+ // Filter to only supported languages
53
+ return runnersWithLanguage.filter((runner) => runner.language && DEDICATED_WORKER_LANGUAGES.includes(runner.language));
54
+ }
55
+ // Load detailed info for all selected tags
56
+ async function loadSelectedTagsInfo(tags) {
57
+ if (tags.length === 0) {
58
+ selectedTagsInfo = new SvelteMap();
59
+ return;
60
+ }
61
+ // Capture current state without tracking to avoid infinite loops
62
+ const currentInfo = untrack(() => selectedTagsInfo);
63
+ const currentRunnables = untrack(() => runnables);
64
+ const newInfo = new SvelteMap();
65
+ try {
66
+ await Promise.all(tags.map(async (tag) => {
67
+ // Check if we already have this info cached
68
+ const existing = currentInfo.get(tag);
69
+ if (existing && (existing.type === 'script' || existing.runners !== undefined)) {
70
+ newInfo.set(tag, existing);
71
+ return;
72
+ }
73
+ // Check if we have it loaded in runnables
74
+ const existingRunnable = currentRunnables.find((r) => r.tag === tag);
75
+ if (existingRunnable) {
76
+ newInfo.set(tag, {
77
+ tag,
78
+ workspace: tag.substring(0, tag.indexOf(':')),
79
+ type: existingRunnable.type,
80
+ path: existingRunnable.path,
81
+ runners: existingRunnable.runners,
82
+ expanded: existing?.expanded ?? false
83
+ });
84
+ return;
85
+ }
86
+ // Parse and fetch
87
+ const parsed = parseTag(tag);
88
+ if (!parsed)
89
+ return;
90
+ if (parsed.type === 'script') {
91
+ newInfo.set(tag, {
92
+ tag,
93
+ workspace: parsed.workspace,
94
+ type: 'script',
95
+ path: parsed.path
96
+ });
97
+ }
98
+ else {
99
+ // Flows need to fetch to get runners
100
+ try {
101
+ const flow = await FlowService.getFlowByPath({
102
+ workspace: parsed.workspace,
103
+ path: parsed.path
104
+ });
105
+ const preliminaryRunners = flow.value?.modules
106
+ ? extractRunnersFromModules(flow.value.modules)
107
+ : [];
108
+ const runners = await resolveAndFilterRunners(parsed.workspace, preliminaryRunners);
109
+ newInfo.set(tag, {
110
+ tag,
111
+ workspace: parsed.workspace,
112
+ type: 'flow',
113
+ path: parsed.path,
114
+ runners,
115
+ expanded: existing?.expanded ?? false
116
+ });
117
+ }
118
+ catch (e) {
119
+ console.error(`Failed to load flow ${parsed.path}`, e);
120
+ newInfo.set(tag, {
121
+ tag,
122
+ workspace: parsed.workspace,
123
+ type: 'flow',
124
+ path: parsed.path,
125
+ runners: []
126
+ });
127
+ }
128
+ }
129
+ }));
130
+ }
131
+ finally {
132
+ selectedTagsInfo = newInfo;
133
+ }
134
+ }
135
+ function toggleSelectedTagExpanded(tag) {
136
+ const info = selectedTagsInfo.get(tag);
137
+ if (info) {
138
+ // Need to set the whole object to trigger reactivity
139
+ selectedTagsInfo.set(tag, { ...info, expanded: !info.expanded });
140
+ }
141
+ }
142
+ // Auto-expand selector if no tags selected
143
+ $effect(() => {
144
+ if (selectedTags.length === 0) {
145
+ selectorExpanded = true;
146
+ }
147
+ });
148
+ // Load selected tags info when selectedTags change
149
+ $effect(() => {
150
+ loadSelectedTagsInfo(selectedTags);
151
+ });
152
+ $effect(() => {
153
+ loadWorkspaces();
154
+ });
155
+ async function loadWorkspaces() {
156
+ try {
157
+ workspacesLoading = true;
158
+ const ws = await WorkspaceService.listWorkspaces();
159
+ workspaces = ws.map((w) => ({ id: w.id, name: w.name }));
160
+ }
161
+ catch (e) {
162
+ console.error('Failed to load workspaces', e);
163
+ sendUserToast('Failed to load workspaces', true);
164
+ }
165
+ finally {
166
+ workspacesLoading = false;
167
+ }
168
+ }
169
+ // Extract runners from flow modules recursively
170
+ // Returns runners with language info for inline scripts, and scriptPath for workspace scripts
171
+ function extractRunnersFromModules(modules) {
172
+ const runners = [];
173
+ for (const module of modules) {
174
+ const value = module.value;
175
+ switch (value.type) {
176
+ case 'rawscript':
177
+ if (DEDICATED_WORKER_LANGUAGES.includes(value.language)) {
178
+ runners.push({
179
+ stepId: module.id,
180
+ stepSummary: module.summary,
181
+ language: value.language,
182
+ scriptPath: value.path,
183
+ isInline: true
184
+ });
185
+ }
186
+ break;
187
+ case 'script':
188
+ // For workspace script references, we'll resolve the language later
189
+ runners.push({
190
+ stepId: module.id,
191
+ stepSummary: module.summary,
192
+ language: undefined, // Will be resolved by fetching the script
193
+ scriptPath: value.path,
194
+ isInline: false
195
+ });
196
+ break;
197
+ case 'forloopflow':
198
+ runners.push(...extractRunnersFromModules(value.modules));
199
+ break;
200
+ case 'whileloopflow':
201
+ runners.push(...extractRunnersFromModules(value.modules));
202
+ break;
203
+ case 'branchone':
204
+ for (const branch of value.branches) {
205
+ runners.push(...extractRunnersFromModules(branch.modules));
206
+ }
207
+ runners.push(...extractRunnersFromModules(value.default));
208
+ break;
209
+ case 'branchall':
210
+ for (const branch of value.branches) {
211
+ runners.push(...extractRunnersFromModules(branch.modules));
212
+ }
213
+ break;
214
+ }
215
+ }
216
+ return runners;
217
+ }
218
+ async function loadFlowRunners(runnable) {
219
+ if (!selectedWorkspace || runnable.type !== 'flow')
220
+ return;
221
+ try {
222
+ runnable.loadingRunners = true;
223
+ const flow = await FlowService.getFlowByPath({
224
+ workspace: selectedWorkspace,
225
+ path: runnable.path
226
+ });
227
+ if (flow.value?.modules) {
228
+ const preliminaryRunners = extractRunnersFromModules(flow.value.modules);
229
+ runnable.runners = await resolveAndFilterRunners(selectedWorkspace, preliminaryRunners);
230
+ }
231
+ else {
232
+ runnable.runners = [];
233
+ }
234
+ }
235
+ catch (e) {
236
+ console.error('Failed to load flow runners', e);
237
+ runnable.runners = [];
238
+ }
239
+ finally {
240
+ runnable.loadingRunners = false;
241
+ }
242
+ }
243
+ async function loadRunnables(workspaceId) {
244
+ try {
245
+ loading = true;
246
+ runnables = [];
247
+ const [scripts, flows] = await Promise.all([
248
+ ScriptService.listScripts({
249
+ workspace: workspaceId,
250
+ dedicatedWorker: true
251
+ }),
252
+ FlowService.listFlows({
253
+ workspace: workspaceId,
254
+ dedicatedWorker: true
255
+ })
256
+ ]);
257
+ const newRunnables = [];
258
+ // Add scripts with supported languages
259
+ for (const script of scripts) {
260
+ if (DEDICATED_WORKER_LANGUAGES.includes(script.language ?? '')) {
261
+ const tag = `${workspaceId}:${script.path}`;
262
+ newRunnables.push({
263
+ tag,
264
+ displayName: script.path,
265
+ language: script.language ?? 'unknown',
266
+ type: 'script',
267
+ path: script.path,
268
+ selected: selectedTags.includes(tag)
269
+ });
270
+ }
271
+ }
272
+ // Add flows
273
+ for (const flow of flows) {
274
+ const tag = `${workspaceId}:flow/${flow.path}`;
275
+ newRunnables.push({
276
+ tag,
277
+ displayName: flow.path,
278
+ language: 'flow',
279
+ type: 'flow',
280
+ path: flow.path,
281
+ selected: selectedTags.includes(tag),
282
+ runners: undefined,
283
+ loadingRunners: false,
284
+ expanded: false
285
+ });
286
+ }
287
+ runnables = newRunnables;
288
+ // Load runners for all flows in parallel
289
+ await Promise.all(runnables.filter((r) => r.type === 'flow').map((r) => loadFlowRunners(r)));
290
+ }
291
+ catch (e) {
292
+ console.error('Failed to load runnables', e);
293
+ sendUserToast('Failed to load scripts/flows', true);
294
+ }
295
+ finally {
296
+ loading = false;
297
+ }
298
+ }
299
+ function toggleRunnable(runnable) {
300
+ runnable.selected = !runnable.selected;
301
+ updateSelectedTags();
302
+ }
303
+ function toggleExpanded(runnable) {
304
+ runnable.expanded = !runnable.expanded;
305
+ }
306
+ function selectAll() {
307
+ for (const runnable of runnables) {
308
+ runnable.selected = true;
309
+ }
310
+ updateSelectedTags();
311
+ }
312
+ function deselectAll() {
313
+ for (const runnable of runnables) {
314
+ runnable.selected = false;
315
+ }
316
+ updateSelectedTags();
317
+ }
318
+ function updateSelectedTags() {
319
+ selectedTags = runnables.filter((r) => r.selected).map((r) => r.tag);
320
+ onchange?.(selectedTags);
321
+ }
322
+ function removeTag(tag) {
323
+ selectedTags = selectedTags.filter((t) => t !== tag);
324
+ // Also update runnable state if visible
325
+ const runnable = runnables.find((r) => r.tag === tag);
326
+ if (runnable) {
327
+ runnable.selected = false;
328
+ }
329
+ onchange?.(selectedTags);
330
+ }
331
+ $effect(() => {
332
+ if (selectedWorkspace) {
333
+ loadRunnables(selectedWorkspace);
334
+ }
335
+ });
336
+ let selectedCount = $derived(runnables.filter((r) => r.selected).length);
337
+ </script>
338
+
339
+ <div class="flex flex-col gap-3">
340
+ <!-- Selected tags summary -->
341
+ {#if selectedTags.length > 0}
342
+ <div class="flex flex-col gap-2">
343
+ <div class="border rounded-md divide-y bg-surface max-h-48 overflow-y-auto">
344
+ {#each selectedTags as tag (tag)}
345
+ {@const info = selectedTagsInfo.get(tag)}
346
+ <div>
347
+ <div class="flex items-center">
348
+ {#if info?.type === 'flow' && info.runners && info.runners.length > 0}
349
+ <button
350
+ class="p-2 hover:bg-surface-hover transition-colors"
351
+ onclick={(e) => {
352
+ e.stopPropagation()
353
+ toggleSelectedTagExpanded(tag)
354
+ }}
355
+ >
356
+ {#if info.expanded}
357
+ <ChevronDown class="h-3 w-3 text-tertiary" />
358
+ {:else}
359
+ <ChevronRight class="h-3 w-3 text-tertiary" />
360
+ {/if}
361
+ </button>
362
+ {:else}
363
+ <div class="w-7"></div>
364
+ {/if}
365
+ <div class="flex-1 flex items-center gap-2 px-2 py-1.5 min-w-0">
366
+ {#if info}
367
+ {#if info.type === 'flow'}
368
+ <BarsStaggered size={14} class="flex-shrink-0 text-secondary" />
369
+ {:else}
370
+ <CodeXml size={14} class="flex-shrink-0 text-secondary" />
371
+ {/if}
372
+ <span class="text-xs truncate flex-1">{info.path}</span>
373
+ <span class="text-xs text-tertiary flex-shrink-0">({info.workspace})</span>
374
+ {#if info.type === 'flow' && info.runners}
375
+ <Badge color="indigo" small>
376
+ {info.runners.length} runner{info.runners.length !== 1 ? 's' : ''}
377
+ </Badge>
378
+ {:else if info.type === 'script'}
379
+ <Badge color="blue" small>1 runner</Badge>
380
+ {/if}
381
+ {:else}
382
+ <span class="text-xs text-tertiary truncate">{tag}</span>
383
+ {/if}
384
+ </div>
385
+ {#if !disabled}
386
+ <button
387
+ class="p-2 hover:text-red-500 transition-colors"
388
+ onclick={(e) => {
389
+ e.stopPropagation()
390
+ removeTag(tag)
391
+ }}
392
+ >
393
+ <X class="h-3 w-3" />
394
+ </button>
395
+ {/if}
396
+ </div>
397
+
398
+ {#if info?.type === 'flow' && info.expanded && info.runners}
399
+ <div class="bg-surface-secondary border-t">
400
+ {#each info.runners as runner (runner.stepId)}
401
+ <div class="flex items-center gap-2 px-9 py-1 text-xs border-t first:border-t-0">
402
+ <span class="font-mono text-tertiary">{runner.stepId}</span>
403
+ {#if runner.stepSummary}
404
+ <span class="text-secondary truncate flex-1">{runner.stepSummary}</span>
405
+ {/if}
406
+ <Badge color="gray" small>
407
+ {runner.isInline ? runner.language : runner.scriptPath}
408
+ </Badge>
409
+ </div>
410
+ {/each}
411
+ </div>
412
+ {/if}
413
+ </div>
414
+ {/each}
415
+ </div>
416
+ </div>
417
+ {/if}
418
+
419
+ <!-- Collapsible selector section -->
420
+ <div class="border rounded-md">
421
+ <button
422
+ class="w-full flex items-center gap-2 px-3 py-2 text-left hover:bg-surface-hover transition-colors"
423
+ onclick={() => (selectorExpanded = !selectorExpanded)}
424
+ {disabled}
425
+ >
426
+ {#if selectorExpanded}
427
+ <ChevronDown class="h-4 w-4 text-secondary" />
428
+ {:else}
429
+ <ChevronRight class="h-4 w-4 text-secondary" />
430
+ {/if}
431
+ <span class="text-sm">
432
+ {selectedTags.length > 0 ? 'Add more scripts/flows' : 'Select scripts/flows'}
433
+ </span>
434
+ </button>
435
+
436
+ {#if selectorExpanded}
437
+ <div class="border-t px-3 py-3 flex flex-col gap-3">
438
+ <!-- Workspace selector -->
439
+ <div class="flex flex-col gap-1">
440
+ <span class="text-xs text-secondary">Workspace</span>
441
+ <Select
442
+ bind:value={selectedWorkspace}
443
+ items={workspaces.map((w) => ({ value: w.id, label: `${w.name} (${w.id})` }))}
444
+ placeholder="Select workspace..."
445
+ disabled={disabled || workspacesLoading}
446
+ />
447
+ </div>
448
+
449
+ <!-- Scripts/flows list -->
450
+ {#if selectedWorkspace}
451
+ <div class="flex flex-col gap-2">
452
+ <div class="flex items-center justify-between">
453
+ <span class="text-xs text-secondary">Scripts/flows with dedicated worker enabled</span
454
+ >
455
+ {#if !loading && runnables.length > 0}
456
+ <div class="flex gap-1">
457
+ <Button size="xs2" color="light" on:click={selectAll} {disabled}>All</Button>
458
+ <Button size="xs2" color="light" on:click={deselectAll} {disabled}>None</Button>
459
+ <Button
460
+ size="xs2"
461
+ color="light"
462
+ iconOnly
463
+ startIcon={{ icon: RefreshCcw }}
464
+ on:click={() => selectedWorkspace && loadRunnables(selectedWorkspace)}
465
+ {disabled}
466
+ />
467
+ </div>
468
+ {/if}
469
+ </div>
470
+
471
+ {#if loading}
472
+ <div class="flex items-center justify-center py-4">
473
+ <RefreshCcw class="animate-spin h-4 w-4 text-secondary" />
474
+ <span class="ml-2 text-xs text-secondary">Loading...</span>
475
+ </div>
476
+ {:else if runnables.length === 0}
477
+ <div class="text-xs text-tertiary py-3 text-center">
478
+ No scripts or flows with dedicated worker enabled found.
479
+ </div>
480
+ {:else}
481
+ <div class="border rounded-md divide-y max-h-64 overflow-y-auto bg-surface">
482
+ {#each runnables as runnable (runnable.tag)}
483
+ <div>
484
+ <div class="flex items-center">
485
+ {#if runnable.type === 'flow' && runnable.runners && runnable.runners.length > 0}
486
+ <button
487
+ class="p-2 hover:bg-surface-hover transition-colors"
488
+ onclick={(e) => {
489
+ e.stopPropagation()
490
+ toggleExpanded(runnable)
491
+ }}
492
+ {disabled}
493
+ >
494
+ {#if runnable.expanded}
495
+ <ChevronDown class="h-3 w-3 text-tertiary" />
496
+ {:else}
497
+ <ChevronRight class="h-3 w-3 text-tertiary" />
498
+ {/if}
499
+ </button>
500
+ {:else}
501
+ <div class="w-7"></div>
502
+ {/if}
503
+ <button
504
+ class="flex-1 flex items-center gap-2 px-2 py-1.5 hover:bg-surface-hover transition-colors text-left"
505
+ onclick={(e) => {
506
+ e.stopPropagation()
507
+ if (!disabled) toggleRunnable(runnable)
508
+ }}
509
+ {disabled}
510
+ >
511
+ <div
512
+ class="w-4 h-4 border rounded flex items-center justify-center flex-shrink-0"
513
+ class:bg-blue-500={runnable.selected}
514
+ class:border-blue-500={runnable.selected}
515
+ >
516
+ {#if runnable.selected}
517
+ <Check class="h-3 w-3 text-white" />
518
+ {/if}
519
+ </div>
520
+ <span class="flex-1 text-xs truncate">{runnable.displayName}</span>
521
+ {#if runnable.type === 'flow' && runnable.runners}
522
+ <span class="text-xs text-tertiary">
523
+ {runnable.runners.length}
524
+ </span>
525
+ {/if}
526
+ <Badge color={runnable.type === 'flow' ? 'indigo' : 'blue'} small>
527
+ {runnable.type === 'flow' ? 'flow' : runnable.language}
528
+ </Badge>
529
+ </button>
530
+ </div>
531
+
532
+ {#if runnable.type === 'flow' && runnable.expanded && runnable.runners}
533
+ <div class="bg-surface-secondary border-t">
534
+ {#if runnable.runners.length === 0}
535
+ <div class="px-9 py-1.5 text-xs text-tertiary italic">
536
+ No eligible steps (python3/bun/deno)
537
+ </div>
538
+ {:else}
539
+ {#each runnable.runners as runner (runner.stepId)}
540
+ <div
541
+ class="flex items-center gap-2 px-9 py-1 text-xs border-t first:border-t-0"
542
+ >
543
+ <span class="font-mono text-tertiary">{runner.stepId}</span>
544
+ {#if runner.stepSummary}
545
+ <span class="text-secondary truncate flex-1">
546
+ {runner.stepSummary}
547
+ </span>
548
+ {/if}
549
+ <Badge color="gray" small>
550
+ {runner.isInline ? runner.language : runner.scriptPath}
551
+ </Badge>
552
+ </div>
553
+ {/each}
554
+ {/if}
555
+ </div>
556
+ {/if}
557
+ </div>
558
+ {/each}
559
+ </div>
560
+ <div class="text-xs text-tertiary">
561
+ {selectedCount} selected
562
+ </div>
563
+ {/if}
564
+ </div>
565
+ {/if}
566
+ </div>
567
+ {/if}
568
+ </div>
569
+ </div>
@@ -0,0 +1,8 @@
1
+ interface Props {
2
+ selectedTags: string[];
3
+ disabled?: boolean;
4
+ onchange?: (tags: string[]) => void;
5
+ }
6
+ declare const DedicatedWorkersSelector: import("svelte").Component<Props, {}, "selectedTags">;
7
+ type DedicatedWorkersSelector = ReturnType<typeof DedicatedWorkersSelector>;
8
+ export default DedicatedWorkersSelector;