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.
- package/package/cancelable-promise-utils.js +4 -2
- package/package/components/ApiConnectForm.svelte +6 -0
- package/package/components/AppConnectDrawer.svelte +1 -0
- package/package/components/AppConnectInner.svelte +1 -0
- package/package/components/AuthSettings.svelte +3 -1
- package/package/components/BedrockCredentialsCheck.svelte +241 -0
- package/package/components/BedrockCredentialsCheck.svelte.d.ts +3 -0
- package/package/components/CenteredPage.svelte +2 -1
- package/package/components/CenteredPage.svelte.d.ts +1 -0
- package/package/components/CompareWorkspaces.svelte +74 -16
- package/package/components/DBManager.svelte +35 -31
- package/package/components/DBManager.svelte.d.ts +13 -3
- package/package/components/DBManagerContent.svelte +23 -62
- package/package/components/DBManagerContent.svelte.d.ts +37 -3
- package/package/components/DBManagerDrawer.svelte +7 -9
- package/package/components/DBTable.svelte +1 -1
- package/package/components/DBTable.svelte.d.ts +3 -1
- package/package/components/DBTableEditor.svelte +66 -49
- package/package/components/DBTableEditor.svelte.d.ts +1 -1
- package/package/components/DateInput.svelte +29 -35
- package/package/components/DateInput.svelte.d.ts +10 -11
- package/package/components/DedicatedWorkersSelector.svelte +569 -0
- package/package/components/DedicatedWorkersSelector.svelte.d.ts +8 -0
- package/package/components/DeployWorkspace.svelte +106 -29
- package/package/components/DropdownV2.svelte +2 -1
- package/package/components/DropdownV2.svelte.d.ts +1 -0
- package/package/components/Editor.svelte +1 -10
- package/package/components/FlowGraphViewer.svelte +5 -2
- package/package/components/FlowGraphViewer.svelte.d.ts +2 -0
- package/package/components/FlowLoopIterationPreview.svelte.d.ts +1 -1
- package/package/components/FlowPreviewContent.svelte.d.ts +1 -1
- package/package/components/FlowStatusViewerInner.svelte +6 -3
- package/package/components/ForkWorkspaceBanner.svelte +16 -0
- package/package/components/InfiniteList.svelte +27 -20
- package/package/components/InfiniteList.svelte.d.ts +2 -0
- package/package/components/JobLoader.svelte.d.ts +1 -1
- package/package/components/Login.svelte +6 -0
- package/package/components/NextcloudSetting.svelte +1 -1
- package/package/components/OAuthSetting.svelte +12 -23
- package/package/components/PocketIdSetting.svelte +82 -0
- package/package/components/PocketIdSetting.svelte.d.ts +6 -0
- package/package/components/ResourceEditor.svelte +4 -4
- package/package/components/ResourcePicker.svelte +1 -0
- package/package/components/RunForm.svelte +9 -17
- package/package/components/RunForm.svelte.d.ts +0 -1
- package/package/components/RunsPage.svelte +34 -0
- package/package/components/SavedInputsPicker.svelte +1 -1
- package/package/components/SavedInputsV2.svelte +35 -36
- package/package/components/Section.svelte +1 -1
- package/package/components/Star.svelte +8 -12
- package/package/components/Star.svelte.d.ts +6 -19
- package/package/components/StringTypeNarrowing.svelte.d.ts +1 -1
- package/package/components/TimeAgo.svelte +49 -7
- package/package/components/TimeAgo.svelte.d.ts +1 -0
- package/package/components/Toast.svelte +5 -1
- package/package/components/WorkerGroup.svelte +35 -20
- package/package/components/WorkerGroup.svelte.d.ts +1 -0
- package/package/components/apps/components/display/InsertRowDrawerButton.svelte +1 -1
- package/package/components/apps/components/display/dbtable/AppDbExplorer.svelte +2 -1
- package/package/components/apps/components/display/dbtable/dbFeatures.d.ts +9 -0
- package/package/components/apps/components/display/dbtable/dbFeatures.js +32 -0
- package/package/components/apps/components/display/dbtable/metadata.d.ts +3 -3
- package/package/components/apps/components/display/dbtable/metadata.js +120 -130
- package/package/components/apps/components/display/dbtable/queries/alterTable.js +13 -5
- package/package/components/apps/components/display/dbtable/queries/alterTable.test.js +1 -1
- package/package/components/apps/components/display/dbtable/queries/createTable.js +2 -0
- package/package/components/apps/components/display/dbtable/queries/relationalKeys.d.ts +1 -3
- package/package/components/apps/components/display/dbtable/queries/relationalKeys.js +41 -42
- package/package/components/apps/components/display/dbtable/tableEditor.js +18 -0
- package/package/components/apps/components/display/dbtable/utils.d.ts +1 -8
- package/package/components/apps/components/display/dbtable/utils.js +27 -34
- package/package/components/apps/components/display/table/AppAggridTable.svelte +8 -0
- package/package/components/apps/components/display/table/AppAggridTableActions.svelte +9 -9
- package/package/components/apps/components/display/table/AppAggridTableActions.svelte.d.ts +1 -1
- package/package/components/apps/components/inputs/AppMultiSelectV2.svelte +2 -4
- package/package/components/assets/AssetsDropdownButton.svelte +1 -1
- package/package/components/assets/AssetsUsageDrawer.svelte +98 -27
- package/package/components/assets/AssetsUsageDrawer.svelte.d.ts +5 -6
- package/package/components/assets/lib.d.ts +3 -2
- package/package/components/assets/lib.js +3 -1
- package/package/components/common/CloseButton.svelte +2 -1
- package/package/components/common/CloseButton.svelte.d.ts +1 -0
- package/package/components/common/badge/CountBadge.svelte +4 -3
- package/package/components/common/badge/CountBadge.svelte.d.ts +1 -0
- package/package/components/common/button/Button.svelte +1 -1
- package/package/components/common/confirmationModal/ConfirmationModal.svelte +2 -1
- package/package/components/common/confirmationModal/ConfirmationModal.svelte.d.ts +1 -0
- package/package/components/common/drawer/Drawer.svelte +4 -1
- package/package/components/common/drawer/DrawerContent.svelte +6 -3
- package/package/components/common/drawer/DrawerContent.svelte.d.ts +1 -0
- package/package/components/common/modal/Modal2.svelte +1 -0
- package/package/components/common/table/AppRow.svelte +4 -1
- package/package/components/common/table/FlowRow.svelte +4 -1
- package/package/components/common/table/RawAppRow.svelte +4 -1
- package/package/components/common/table/Row.svelte +11 -21
- package/package/components/common/table/Row.svelte.d.ts +4 -20
- package/package/components/common/table/RowIcon.svelte +6 -2
- package/package/components/common/table/RowIcon.svelte.d.ts +1 -1
- package/package/components/common/table/ScriptRow.svelte +4 -1
- package/package/components/copilot/autocomplete/Autocompletor.d.ts +1 -1
- package/package/components/copilot/autocomplete/Autocompletor.js +4 -4
- package/package/components/copilot/autocomplete/request.js +13 -9
- package/package/components/copilot/chat/script/core.js +5 -4
- package/package/components/copilot/lib.js +2 -9
- package/package/components/copilot/utils.d.ts +5 -0
- package/package/components/copilot/utils.js +8 -0
- package/package/components/dbOps.d.ts +1 -1
- package/package/components/dbOps.js +2 -2
- package/package/components/details/DetailPageHeader.svelte +21 -7
- package/package/components/details/DetailPageHeader.svelte.d.ts +2 -1
- package/package/components/details/DetailPageLayout.svelte +10 -1
- package/package/components/details/DetailPageLayout.svelte.d.ts +1 -0
- package/package/components/flows/conversations/FlowConversationsSidebar.svelte +79 -77
- package/package/components/flows/propPicker/OutputPickerInner.svelte.d.ts +1 -1
- package/package/components/graph/FlowGraphV2.svelte +7 -1
- package/package/components/graph/renderers/triggers/TriggersBadge.svelte +41 -24
- package/package/components/home/ItemsList.svelte +2 -1
- package/package/components/home/treeViewUtils.js +1 -1
- package/package/components/icons/NextcloudIcon.svelte +3 -2
- package/package/components/icons/NextcloudIcon.svelte.d.ts +2 -0
- package/package/components/icons/PocketIdIcon.svelte +9 -0
- package/package/components/icons/PocketIdIcon.svelte.d.ts +9 -0
- package/package/components/icons/index.js +3 -1
- package/package/components/instanceSettings.d.ts +1 -1
- package/package/components/instanceSettings.js +1 -0
- package/package/components/raw_apps/RawAppDataTableDrawer.svelte +1 -3
- package/package/components/raw_apps/datatableUtils.svelte.js +1 -1
- package/package/components/schema/EditableSchemaWrapper.svelte +2 -2
- package/package/components/select/MultiSelect.svelte +1 -1
- package/package/components/select/SelectDropdown.svelte +15 -3
- package/package/components/settings/ChangeWorkspaceId.svelte +8 -7
- package/package/components/settings/CreateToken.svelte +3 -3
- package/package/components/settings/WorkspaceUserSettings.svelte +6 -5
- package/package/components/sidebar/MenuButton.svelte +13 -5
- package/package/components/sidebar/MultiplayerMenu.svelte +2 -2
- package/package/components/sidebar/SidebarContent.svelte +32 -4
- package/package/components/sidebar/UserMenu.svelte +2 -2
- package/package/components/table/DataTable.svelte +6 -2
- package/package/components/table/DataTable.svelte.d.ts +1 -0
- package/package/components/triggers/AddTriggersButton.svelte +17 -4
- package/package/components/triggers/TriggersEditor.svelte +4 -0
- package/package/components/triggers/TriggersWrapper.svelte +14 -0
- package/package/components/triggers/native/NativeTriggerEditor.svelte +379 -0
- package/package/components/triggers/native/NativeTriggerEditor.svelte.d.ts +26 -0
- package/package/components/triggers/native/NativeTriggerTable.svelte +155 -0
- package/package/components/triggers/native/NativeTriggerTable.svelte.d.ts +16 -0
- package/package/components/triggers/native/NativeTriggersPanel.svelte +40 -0
- package/package/components/triggers/native/NativeTriggersPanel.svelte.d.ts +15 -0
- package/package/components/triggers/native/services/nextcloud/NextcloudTriggerForm.svelte +104 -0
- package/package/components/triggers/native/services/nextcloud/NextcloudTriggerForm.svelte.d.ts +18 -0
- package/package/components/triggers/native/utils.d.ts +74 -0
- package/package/components/triggers/native/utils.js +152 -0
- package/package/components/triggers/triggers.svelte.d.ts +2 -1
- package/package/components/triggers/triggers.svelte.js +36 -8
- package/package/components/triggers/utils.js +18 -5
- package/package/components/triggers.d.ts +1 -1
- package/package/components/workspaceSettings/AISettings.svelte +2 -1
- package/package/components/workspaceSettings/CustomInstanceDbSelect.svelte +1 -0
- package/package/components/workspaceSettings/CustomInstanceDbWizardModal.svelte +3 -1
- package/package/components/workspaceSettings/DataTableSettings.svelte +2 -1
- package/package/components/workspaceSettings/DucklakeSettings.svelte +8 -3
- package/package/components/workspaceSettings/OAuthClientConfig.svelte +180 -0
- package/package/components/workspaceSettings/OAuthClientConfig.svelte.d.ts +14 -0
- package/package/components/workspaceSettings/StorageSettings.svelte +7 -2
- package/package/components/workspaceSettings/WorkspaceIntegrations.svelte +302 -0
- package/package/components/workspaceSettings/WorkspaceIntegrations.svelte.d.ts +3 -0
- package/package/consts.js +0 -2
- package/package/gen/core/OpenAPI.js +1 -1
- package/package/gen/schemas.gen.d.ts +384 -3
- package/package/gen/schemas.gen.js +390 -3
- package/package/gen/services.gen.d.ts +200 -13
- package/package/gen/services.gen.js +383 -24
- package/package/gen/types.gen.d.ts +884 -94
- package/package/hub.js +2 -2
- package/package/hubPaths.json +1 -1
- package/package/refreshUser.d.ts +5 -1
- package/package/refreshUser.js +20 -30
- package/package/storeUtils.js +2 -0
- package/package/svelte5Utils.svelte.d.ts +61 -0
- package/package/svelte5Utils.svelte.js +170 -0
- package/package/utils.js +3 -0
- package/package.json +4 -6
- package/dist/sharedUtils/assets/tokens/colorTokensConfig.d.ts +0 -2
- package/dist/sharedUtils/base.d.ts +0 -1
- package/dist/sharedUtils/cloud.d.ts +0 -1
- package/dist/sharedUtils/common.d.ts +0 -111
- package/dist/sharedUtils/components/apps/components/display/dbtable/queries/count.d.ts +0 -5
- package/dist/sharedUtils/components/apps/components/display/dbtable/queries/delete.d.ts +0 -5
- package/dist/sharedUtils/components/apps/components/display/dbtable/queries/insert.d.ts +0 -5
- package/dist/sharedUtils/components/apps/components/display/dbtable/queries/select.d.ts +0 -13
- package/dist/sharedUtils/components/apps/components/display/dbtable/queries/update.d.ts +0 -11
- package/dist/sharedUtils/components/apps/components/display/dbtable/utils.d.ts +0 -95
- package/dist/sharedUtils/components/apps/editor/appPolicy.d.ts +0 -6
- package/dist/sharedUtils/components/apps/editor/appUtilsCore.d.ts +0 -7
- package/dist/sharedUtils/components/apps/editor/appUtilsS3.d.ts +0 -33
- package/dist/sharedUtils/components/apps/editor/commonAppUtils.d.ts +0 -10
- package/dist/sharedUtils/components/apps/editor/component/components.d.ts +0 -5371
- package/dist/sharedUtils/components/apps/editor/component/default-codes.d.ts +0 -3
- package/dist/sharedUtils/components/apps/editor/component/index.d.ts +0 -3
- package/dist/sharedUtils/components/apps/editor/component/sets.d.ts +0 -7
- package/dist/sharedUtils/components/apps/editor/componentsPanel/componentDefaultProps.d.ts +0 -3
- package/dist/sharedUtils/components/apps/gridUtils.d.ts +0 -14
- package/dist/sharedUtils/components/apps/inputType.d.ts +0 -178
- package/dist/sharedUtils/components/apps/rx.d.ts +0 -29
- package/dist/sharedUtils/components/apps/sharedTypes.d.ts +0 -21
- package/dist/sharedUtils/components/apps/types.d.ts +0 -274
- package/dist/sharedUtils/components/assets/lib.d.ts +0 -25
- package/dist/sharedUtils/components/common/alert/model.d.ts +0 -2
- package/dist/sharedUtils/components/common/badge/model.d.ts +0 -8
- package/dist/sharedUtils/components/common/button/model.d.ts +0 -45
- package/dist/sharedUtils/components/common/fileInput/model.d.ts +0 -1
- package/dist/sharedUtils/components/common/index.d.ts +0 -24
- package/dist/sharedUtils/components/common/skeleton/model.d.ts +0 -21
- package/dist/sharedUtils/components/dbTypes.d.ts +0 -14
- package/dist/sharedUtils/components/diff_drawer.d.ts +0 -26
- package/dist/sharedUtils/components/ducklake.d.ts +0 -1
- package/dist/sharedUtils/components/flows/scheduleUtils.d.ts +0 -7
- package/dist/sharedUtils/components/icons/index.d.ts +0 -101
- package/dist/sharedUtils/components/random_positive_adjetive.d.ts +0 -1
- package/dist/sharedUtils/components/raw_apps/rawAppPolicy.d.ts +0 -10
- package/dist/sharedUtils/components/raw_apps/utils.d.ts +0 -15
- package/dist/sharedUtils/components/triggers/email/utils.d.ts +0 -4
- package/dist/sharedUtils/components/triggers/gcp/utils.d.ts +0 -2
- package/dist/sharedUtils/components/triggers/http/utils.d.ts +0 -11
- package/dist/sharedUtils/components/triggers/kafka/utils.d.ts +0 -2
- package/dist/sharedUtils/components/triggers/mqtt/utils.d.ts +0 -2
- package/dist/sharedUtils/components/triggers/nats/utils.d.ts +0 -2
- package/dist/sharedUtils/components/triggers/postgres/utils.d.ts +0 -8
- package/dist/sharedUtils/components/triggers/sqs/utils.d.ts +0 -2
- package/dist/sharedUtils/components/triggers/triggers.svelte.d.ts +0 -32
- package/dist/sharedUtils/components/triggers/utils.d.ts +0 -80
- package/dist/sharedUtils/components/triggers/websocket/utils.d.ts +0 -2
- package/dist/sharedUtils/components/triggers.d.ts +0 -20
- package/dist/sharedUtils/gen/core/ApiError.d.ts +0 -10
- package/dist/sharedUtils/gen/core/ApiRequestOptions.d.ts +0 -13
- package/dist/sharedUtils/gen/core/ApiResult.d.ts +0 -7
- package/dist/sharedUtils/gen/core/CancelablePromise.d.ts +0 -26
- package/dist/sharedUtils/gen/core/OpenAPI.d.ts +0 -27
- package/dist/sharedUtils/gen/core/request.d.ts +0 -29
- package/dist/sharedUtils/gen/index.d.ts +0 -6
- package/dist/sharedUtils/gen/schemas.gen.d.ts +0 -7036
- package/dist/sharedUtils/gen/services.gen.d.ts +0 -6047
- package/dist/sharedUtils/gen/types.gen.d.ts +0 -21881
- package/dist/sharedUtils/history.svelte.d.ts +0 -9
- package/dist/sharedUtils/hub.d.ts +0 -49
- package/dist/sharedUtils/jsr.json +0 -6
- package/dist/sharedUtils/lib.d.ts +0 -5
- package/dist/sharedUtils/lib.es.js +0 -1588
- package/dist/sharedUtils/package.json +0 -12
- package/dist/sharedUtils/schema.d.ts +0 -3
- package/dist/sharedUtils/stores.d.ts +0 -97
- package/dist/sharedUtils/svelte5Utils.svelte.d.ts +0 -80
- package/dist/sharedUtils/toast.d.ts +0 -8
- package/dist/sharedUtils/utils.d.ts +0 -265
|
@@ -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
|
-
}, {}, {},
|
|
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;
|