windmill-components 1.504.5 → 1.510.1
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/ata/index.js +1 -1
- package/package/components/AppConnectInner.svelte +161 -29
- package/package/components/ArgInput.svelte +33 -103
- package/package/components/AuthSettings.svelte +45 -1
- package/package/components/Dev.svelte +31 -24
- package/package/components/DisplayResult.svelte +53 -26
- package/package/components/DisplayResult.svelte.d.ts +1 -1
- package/package/components/DynSelect.svelte +3 -3
- package/package/components/Editor.svelte +7 -4
- package/package/components/EditorBar.svelte +2 -2
- package/package/components/ErrorOrRecoveryHandler.svelte +73 -67
- package/package/components/ErrorOrRecoveryHandler.svelte.d.ts +8 -24
- package/package/components/FlowBuilder.svelte +11 -2
- package/package/components/FlowJobResult.svelte +12 -17
- package/package/components/FlowJobResult.svelte.d.ts +5 -18
- package/package/components/FlowPreviewContent.svelte +13 -10
- package/package/components/FlowPreviewContent.svelte.d.ts +1 -1
- package/package/components/FlowPreviewResult.svelte +14 -6
- package/package/components/FlowStatusViewer.svelte +11 -24
- package/package/components/FlowStatusViewer.svelte.d.ts +19 -18
- package/package/components/FlowStatusViewerInner.svelte +110 -131
- package/package/components/FlowStatusViewerInner.svelte.d.ts +20 -18
- package/package/components/GitDiffPreview.svelte +55 -0
- package/package/components/GitDiffPreview.svelte.d.ts +13 -0
- package/package/components/HistoricInputs.svelte +2 -2
- package/package/components/InitGitRepoPopover.svelte +410 -0
- package/package/components/InitGitRepoPopover.svelte.d.ts +13 -0
- package/package/components/InstanceSetting.svelte +21 -9
- package/package/components/InstanceSettings.svelte +16 -3
- package/package/components/JobLoader.svelte +567 -0
- package/package/components/JobLoader.svelte.d.ts +53 -0
- package/package/components/JobLogs.svelte +6 -4
- package/package/components/JobLogs.svelte.d.ts +5 -18
- package/package/components/LightweightResourcePicker.svelte +18 -39
- package/package/components/LightweightResourcePicker.svelte.d.ts +6 -22
- package/package/components/LogViewer.svelte +35 -41
- package/package/components/LogViewer.svelte.d.ts +6 -20
- package/package/components/ModulePreviewResultViewer.svelte +3 -1
- package/package/components/ModulePreviewResultViewer.svelte.d.ts +1 -0
- package/package/components/ModuleTest.svelte +16 -11
- package/package/components/PullGitRepoPopover.svelte +355 -0
- package/package/components/PullGitRepoPopover.svelte.d.ts +18 -0
- package/package/components/S3FilePicker.svelte +5 -3
- package/package/components/SavedInputs.svelte +2 -2
- package/package/components/ScriptBuilder.svelte +4 -3
- package/package/components/ScriptEditor.svelte +34 -31
- package/package/components/ScriptEditor.svelte.d.ts +3 -3
- package/package/components/ServiceLogsInner.svelte +2 -1
- package/package/components/ServiceLogsInner.svelte.d.ts +1 -0
- package/package/components/UserSettings.svelte +1 -1
- package/package/components/WorkerTagSelect.svelte +32 -3
- package/package/components/apps/components/buttons/AppButton.svelte +7 -1
- package/package/components/apps/components/buttons/AppButton.svelte.d.ts +1 -0
- package/package/components/apps/components/display/AppCustomComponent.svelte +1 -1
- package/package/components/apps/components/display/AppDisplayComponentByJobId.svelte +16 -11
- package/package/components/apps/components/display/AppJobIdLogComponent.svelte +13 -10
- package/package/components/apps/components/display/AppMenu.svelte +5 -0
- package/package/components/apps/components/display/dbtable/AppDbExplorer.svelte +3 -3
- package/package/components/apps/components/display/dbtable/DeleteRow.svelte +3 -3
- package/package/components/apps/components/display/dbtable/InsertRowRunnable.svelte +3 -3
- package/package/components/apps/components/display/dbtable/UpdateCell.svelte +3 -3
- package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +3 -3
- package/package/components/apps/components/helpers/RunnableComponent.svelte +65 -54
- package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +5 -5
- package/package/components/apps/components/inputs/AppUserResource.svelte +26 -8
- package/package/components/apps/editor/AppEditorHeader.svelte +11 -5
- package/package/components/apps/editor/AppJobsDrawer.svelte +5 -5
- package/package/components/apps/editor/RunnableJobPanel.svelte +4 -4
- package/package/components/apps/editor/component/components.d.ts +12 -0
- package/package/components/apps/editor/component/components.js +19 -7
- package/package/components/assets/AssetButtons.svelte +38 -0
- package/package/components/assets/AssetButtons.svelte.d.ts +15 -0
- package/package/components/assets/AssetsDropdownButton.svelte +60 -72
- package/package/components/assets/AssetsDropdownButton.svelte.d.ts +3 -4
- package/package/components/assets/AssetsUsageDrawer.svelte +10 -10
- package/package/components/assets/JobAssetsViewer.svelte +79 -0
- package/package/components/assets/JobAssetsViewer.svelte.d.ts +7 -0
- package/package/components/assets/README_DEV.md +0 -0
- package/package/components/assets/lib.d.ts +9 -1
- package/package/components/assets/lib.js +48 -7
- package/package/components/common/fileUpload/FileUpload.svelte +126 -84
- package/package/components/common/fileUpload/FileUpload.svelte.d.ts +13 -3
- package/package/components/common/fileUpload/S3ArgInput.svelte +111 -0
- package/package/components/common/fileUpload/S3ArgInput.svelte.d.ts +21 -0
- package/package/components/common/table/ScriptRow.svelte +3 -1
- package/package/components/copilot/autocomplete/Autocompletor.js +23 -5
- package/package/components/copilot/chat/AIChatDisplay.svelte +8 -0
- package/package/components/copilot/chat/AIChatManager.svelte.js +13 -8
- package/package/components/copilot/chat/flow/ModuleAcceptReject.svelte +5 -5
- package/package/components/copilot/chat/flow/core.d.ts +1 -1
- package/package/components/copilot/chat/flow/core.js +2 -38
- package/package/components/copilot/chat/navigator/apiTools.d.ts +8 -0
- package/package/components/copilot/chat/navigator/apiTools.js +95 -15
- package/package/components/copilot/chat/navigator/core.d.ts +1 -1
- package/package/components/copilot/chat/navigator/core.js +2 -1
- package/package/components/copilot/chat/script/core.d.ts +11 -2
- package/package/components/copilot/chat/script/core.js +135 -1
- package/package/components/copilot/chat/shared.d.ts +10 -0
- package/package/components/copilot/chat/shared.js +56 -0
- package/package/components/copilot/lib.d.ts +1 -0
- package/package/components/copilot/lib.js +27 -9
- package/package/components/custom_ui.d.ts +1 -0
- package/package/components/flows/FlowAssetsHandler.svelte +133 -0
- package/package/components/flows/FlowAssetsHandler.svelte.d.ts +14 -0
- package/package/components/flows/content/FlowModuleComponent.svelte +16 -18
- package/package/components/flows/flowStore.d.ts +1 -1
- package/package/components/flows/map/FlowModuleSchemaItem.svelte +1 -0
- package/package/components/flows/propPicker/OutputPicker.svelte +9 -4
- package/package/components/flows/scheduleUtils.js +1 -1
- package/package/components/flows/types.d.ts +2 -1
- package/package/components/graph/FlowGraphV2.svelte +8 -104
- package/package/components/graph/FlowGraphV2.svelte.d.ts +0 -2
- package/package/components/graph/graphBuilder.svelte.d.ts +6 -3
- package/package/components/graph/graphBuilder.svelte.js +35 -9
- package/package/components/graph/renderers/edges/BaseEdge.svelte +2 -5
- package/package/components/graph/renderers/edges/BaseEdge.svelte.d.ts +1 -0
- package/package/components/graph/renderers/nodes/AssetNode.svelte +23 -20
- package/package/components/graph/renderers/nodes/AssetNode.svelte.d.ts +5 -10
- package/package/components/graph/renderers/nodes/AssetsOverflowedNode.svelte +1 -1
- package/package/components/graph/util.js +1 -1
- package/package/components/home/ItemsList.svelte +2 -0
- package/package/components/icons/AssetGenericIcon.svelte +0 -3
- package/package/components/jobs/JobPreview.svelte +10 -6
- package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte +13 -12
- package/package/components/runs/BatchReRunOptionsPane.svelte +5 -1
- package/package/components/runs/JobPreview.svelte +26 -16
- package/package/components/runs/{JobLoader.svelte.d.ts → JobsLoader.svelte.d.ts} +3 -3
- package/package/components/runs/NoWorkerWithTagWarning.svelte +2 -2
- package/package/components/runs/NoWorkerWithTagWarning.svelte.d.ts +1 -0
- package/package/components/runs/RunsFilter.svelte.d.ts +1 -1
- package/package/components/schema/AddPropertyFormV2.svelte +42 -33
- package/package/components/schema/AddPropertyFormV2.svelte.d.ts +1 -0
- package/package/components/schema/AddPropertyV2.svelte +2 -1
- package/package/components/schema/AddPropertyV2.svelte.d.ts +1 -0
- package/package/components/schema/EditableSchemaWrapper.svelte +3 -1
- package/package/components/schema/editable_schema_wrapper.d.ts +3 -0
- package/package/components/scriptEditor/LogPanel.svelte +3 -2
- package/package/components/script_builder.d.ts +2 -2
- package/package/components/settings/CreateToken.svelte +76 -41
- package/package/components/settings/CreateToken.svelte.d.ts +1 -1
- package/package/components/settings/ScopeSelector.svelte +613 -0
- package/package/components/settings/ScopeSelector.svelte.d.ts +8 -0
- package/package/components/settings/TokenDisplay.svelte +103 -0
- package/package/components/settings/TokenDisplay.svelte.d.ts +10 -0
- package/package/components/settings/TokensTable.svelte +70 -349
- package/package/components/sidebar/CriticalAlertModal.svelte +3 -0
- package/package/components/triggers/DeleteTriggerButton.svelte +1 -1
- package/package/components/triggers/TriggerEditorToolbar.svelte +3 -3
- package/package/components/triggers/TriggerRetriesAndErrorHandler.svelte +55 -0
- package/package/components/triggers/TriggerRetriesAndErrorHandler.svelte.d.ts +13 -0
- package/package/components/triggers/TriggersEditor.svelte +45 -3
- package/package/components/triggers/TriggersWrapper.svelte +2 -2
- package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +43 -2
- package/package/components/triggers/gcp/utils.js +9 -1
- package/package/components/triggers/http/OpenAPISpecGenerator.svelte +1 -0
- package/package/components/triggers/http/RouteEditorInner.svelte +208 -164
- package/package/components/triggers/http/RouteEditorInner.svelte.d.ts +6 -2
- package/package/components/triggers/http/utils.js +9 -3
- package/package/components/triggers/kafka/KafkaTriggerEditorInner.svelte +43 -2
- package/package/components/triggers/kafka/utils.js +9 -1
- package/package/components/triggers/mqtt/MqttEditorConfigSection.svelte +4 -132
- package/package/components/triggers/mqtt/MqttEditorConfigSection.svelte.d.ts +2 -5
- package/package/components/triggers/mqtt/MqttTriggerEditorInner.svelte +178 -9
- package/package/components/triggers/mqtt/utils.js +9 -1
- package/package/components/triggers/nats/NatsTriggerEditorInner.svelte +43 -2
- package/package/components/triggers/nats/utils.js +9 -1
- package/package/components/triggers/postgres/PostgresTriggerEditorInner.svelte +41 -2
- package/package/components/triggers/postgres/utils.js +9 -1
- package/package/components/triggers/schedules/ScheduleEditorInner.svelte +34 -88
- package/package/components/triggers/sqs/SqsTriggerEditorInner.svelte +43 -2
- package/package/components/triggers/sqs/utils.js +9 -1
- package/package/components/triggers/utils.js +12 -0
- package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +43 -2
- package/package/components/triggers/websocket/utils.js +11 -1
- package/package/components/workspaceSettings/AISettings.svelte +0 -2
- package/package/components/workspaceSettings/FilterList.svelte +56 -0
- package/package/components/workspaceSettings/FilterList.svelte.d.ts +8 -0
- package/package/components/workspaceSettings/GitSyncFilterSettings.svelte +785 -0
- package/package/components/workspaceSettings/GitSyncFilterSettings.svelte.d.ts +18 -0
- package/package/gen/core/OpenAPI.js +1 -1
- package/package/gen/schemas.gen.d.ts +305 -23
- package/package/gen/schemas.gen.js +305 -23
- package/package/gen/services.gen.d.ts +33 -1
- package/package/gen/services.gen.js +66 -2
- package/package/gen/types.gen.d.ts +216 -11
- package/package/history.svelte.js +0 -2
- package/package/hub.d.ts +1 -0
- package/package/hubPaths.json +5 -2
- package/package/infer.js +16 -10
- package/package/svelte5Utils.svelte.d.ts +1 -0
- package/package/svelte5Utils.svelte.js +25 -18
- package/package/toast.js +10 -0
- package/package/utils.d.ts +3 -2
- package/package/utils.js +20 -5
- package/package.json +11 -11
- package/package/components/ResultJobLoader.svelte +0 -219
- package/package/components/ResultJobLoader.svelte.d.ts +0 -52
- package/package/components/TestJobLoader.svelte +0 -274
- package/package/components/TestJobLoader.svelte.d.ts +0 -43
- package/package/components/icons/AssetVarIcon.svelte +0 -31
- package/package/components/icons/AssetVarIcon.svelte.d.ts +0 -9
- /package/package/components/runs/{JobLoader.svelte → JobsLoader.svelte} +0 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
<script lang="ts">import { copyToClipboard } from '../../utils';
|
|
2
|
+
import { Clipboard } from 'lucide-svelte';
|
|
3
|
+
import ClipboardPanel from '../details/ClipboardPanel.svelte';
|
|
4
|
+
import Alert from '../common/alert/Alert.svelte';
|
|
5
|
+
let { token, type = 'token', mcpUrl, title, onCopy } = $props();
|
|
6
|
+
function handleCopyClick() {
|
|
7
|
+
copyToClipboard(token);
|
|
8
|
+
onCopy?.();
|
|
9
|
+
}
|
|
10
|
+
const displayTitle = $derived(title || (type === 'mcp' ? 'MCP URL Generated Successfully' : 'Token Created Successfully'));
|
|
11
|
+
const colorScheme = {
|
|
12
|
+
gradient: 'from-blue-50 to-indigo-50 dark:from-blue-900/20 dark:to-indigo-900/20',
|
|
13
|
+
border: 'border-blue-200 dark:border-blue-700',
|
|
14
|
+
iconBg: 'bg-blue-100 dark:bg-blue-800',
|
|
15
|
+
iconColor: 'text-blue-600 dark:text-blue-300',
|
|
16
|
+
titleColor: 'text-blue-800 dark:text-blue-200',
|
|
17
|
+
labelColor: 'text-blue-700 dark:text-blue-300',
|
|
18
|
+
infoBg: 'bg-blue-50 dark:bg-blue-900/30',
|
|
19
|
+
infoBorder: 'border-blue-200 dark:border-blue-600',
|
|
20
|
+
infoText: 'text-blue-700 dark:text-blue-300'
|
|
21
|
+
};
|
|
22
|
+
</script>
|
|
23
|
+
|
|
24
|
+
<div class="border rounded-lg mb-6 p-4 bg-gradient-to-r {colorScheme.gradient} {colorScheme.border} shadow-sm">
|
|
25
|
+
<div class="flex items-start gap-3">
|
|
26
|
+
<div class="flex-shrink-0 w-8 h-8 {colorScheme.iconBg} rounded-full flex items-center justify-center mt-0.5">
|
|
27
|
+
{#if type === 'mcp'}
|
|
28
|
+
<svg class="w-4 h-4 {colorScheme.iconColor}" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
29
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13.828 10.172a4 4 0 00-5.656 0l-4 4a4 4 0 105.656 5.656l1.102-1.101m-.758-4.899a4 4 0 005.656 0l4-4a4 4 0 00-5.656-5.656l-1.1 1.1"></path>
|
|
30
|
+
</svg>
|
|
31
|
+
{:else}
|
|
32
|
+
<svg class="w-4 h-4 {colorScheme.iconColor}" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
33
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
|
|
34
|
+
</svg>
|
|
35
|
+
{/if}
|
|
36
|
+
</div>
|
|
37
|
+
<div class="flex-1 min-w-0">
|
|
38
|
+
<h4 class="text-sm font-semibold {colorScheme.titleColor} mb-2">
|
|
39
|
+
{displayTitle}
|
|
40
|
+
</h4>
|
|
41
|
+
|
|
42
|
+
{#if type === 'mcp' && mcpUrl}
|
|
43
|
+
<div class="space-y-3">
|
|
44
|
+
<div>
|
|
45
|
+
<!-- svelte-ignore a11y_label_has_associated_control -->
|
|
46
|
+
<label class="block text-xs font-medium {colorScheme.labelColor} mb-1">
|
|
47
|
+
Your MCP Server URL:
|
|
48
|
+
</label>
|
|
49
|
+
<ClipboardPanel content={mcpUrl} />
|
|
50
|
+
</div>
|
|
51
|
+
<div>
|
|
52
|
+
<!-- svelte-ignore a11y_label_has_associated_control -->
|
|
53
|
+
<label class="block text-xs font-medium {colorScheme.labelColor} mb-1">
|
|
54
|
+
Your Token:
|
|
55
|
+
</label>
|
|
56
|
+
<div class="bg-white dark:bg-gray-800 rounded-md p-3 border {colorScheme.border}">
|
|
57
|
+
<div class="flex items-center justify-between gap-2">
|
|
58
|
+
<code class="text-sm font-mono text-gray-800 dark:text-gray-200 break-all flex-1">
|
|
59
|
+
{token}
|
|
60
|
+
</code>
|
|
61
|
+
<button
|
|
62
|
+
onclick={handleCopyClick}
|
|
63
|
+
class="flex-shrink-0 p-1.5 text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-700 rounded transition-colors"
|
|
64
|
+
title="Copy token"
|
|
65
|
+
>
|
|
66
|
+
<Clipboard size={16} />
|
|
67
|
+
</button>
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
70
|
+
</div>
|
|
71
|
+
<Alert type="warning" title="Important" size="xs">
|
|
72
|
+
Make sure to copy both the URL and token now. You won't be able to see them again!
|
|
73
|
+
</Alert>
|
|
74
|
+
<div class="{colorScheme.infoBg} rounded-md p-2 border {colorScheme.infoBorder}">
|
|
75
|
+
<p class="text-xs {colorScheme.infoText}">
|
|
76
|
+
<strong>Next steps:</strong> Use this URL in your MCP-compatible client (like Claude Desktop) to access your Windmill scripts and flows as tools.
|
|
77
|
+
</p>
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
80
|
+
{:else}
|
|
81
|
+
<div class="bg-white dark:bg-gray-800 rounded-md p-3 border {colorScheme.border}">
|
|
82
|
+
<div class="flex items-center justify-between gap-2">
|
|
83
|
+
<code class="text-sm font-mono text-gray-800 dark:text-gray-200 break-all flex-1">
|
|
84
|
+
{token}
|
|
85
|
+
</code>
|
|
86
|
+
<button
|
|
87
|
+
onclick={handleCopyClick}
|
|
88
|
+
class="flex-shrink-0 p-1.5 text-gray-500 hover:text-gray-400 dark:hover:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-700 rounded transition-colors"
|
|
89
|
+
title="Copy token"
|
|
90
|
+
>
|
|
91
|
+
<Clipboard size={16} />
|
|
92
|
+
</button>
|
|
93
|
+
</div>
|
|
94
|
+
</div>
|
|
95
|
+
<div class="mt-3">
|
|
96
|
+
<Alert type="warning" title="Important" size="xs">
|
|
97
|
+
Make sure to copy your personal access token now. You won't be able to see it again!
|
|
98
|
+
</Alert>
|
|
99
|
+
</div>
|
|
100
|
+
{/if}
|
|
101
|
+
</div>
|
|
102
|
+
</div>
|
|
103
|
+
</div>
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
token: string;
|
|
3
|
+
type?: 'token' | 'mcp';
|
|
4
|
+
mcpUrl?: string;
|
|
5
|
+
title?: string;
|
|
6
|
+
onCopy?: () => void;
|
|
7
|
+
}
|
|
8
|
+
declare const TokenDisplay: import("svelte").Component<Props, {}, "">;
|
|
9
|
+
type TokenDisplay = ReturnType<typeof TokenDisplay>;
|
|
10
|
+
export default TokenDisplay;
|
|
@@ -1,111 +1,21 @@
|
|
|
1
1
|
<script lang="ts">import TableCustom from '../TableCustom.svelte';
|
|
2
|
-
import { displayDate
|
|
3
|
-
import {
|
|
4
|
-
import { Button } from '../common';
|
|
5
|
-
import { Clipboard, Plus } from 'lucide-svelte';
|
|
6
|
-
import { workspaceStore, userWorkspaces } from '../../stores';
|
|
2
|
+
import { displayDate } from '../../utils';
|
|
3
|
+
import { UserService } from '../../gen';
|
|
7
4
|
import { createEventDispatcher } from 'svelte';
|
|
8
|
-
import ToggleButtonGroup from '../common/toggleButton-v2/ToggleButtonGroup.svelte';
|
|
9
|
-
import ToggleButton from '../common/toggleButton-v2/ToggleButton.svelte';
|
|
10
|
-
import Toggle from '../Toggle.svelte';
|
|
11
|
-
import ClipboardPanel from '../details/ClipboardPanel.svelte';
|
|
12
5
|
import { sendUserToast } from '../../toast';
|
|
13
|
-
import
|
|
14
|
-
import { safeSelectItems } from '../select/utils.svelte';
|
|
6
|
+
import CreateToken from './CreateToken.svelte';
|
|
15
7
|
let { showMcpMode = false, openWithMcpMode = false, defaultNewTokenLabel, defaultNewTokenWorkspace, scopes } = $props();
|
|
16
8
|
// --- Local State ---
|
|
17
9
|
let tokens = $state([]);
|
|
18
10
|
let tokenPage = $state(1);
|
|
19
11
|
let newTokenLabel = $state(defaultNewTokenLabel);
|
|
20
|
-
let newToken = $state(undefined);
|
|
21
|
-
let newTokenExpiration = $state(undefined);
|
|
22
|
-
let newTokenWorkspace = $state(defaultNewTokenWorkspace);
|
|
23
|
-
let newMcpApps = $state([]);
|
|
24
|
-
let displayCreateToken = $state(scopes != undefined);
|
|
25
|
-
let mcpCreationMode = $state(false);
|
|
26
|
-
let newMcpScope = $state('favorites');
|
|
27
|
-
let newMcpToken = $state(undefined);
|
|
28
|
-
let loadingApps = $state(false);
|
|
29
|
-
let errorFetchApps = $state(false);
|
|
30
|
-
let allApps = $state([]);
|
|
31
|
-
function ensureCurrentWorkspaceIncluded(workspacesList, currentWorkspace) {
|
|
32
|
-
if (!currentWorkspace) {
|
|
33
|
-
return workspacesList;
|
|
34
|
-
}
|
|
35
|
-
const hasCurrentWorkspace = workspacesList.some((w) => w.id === currentWorkspace);
|
|
36
|
-
if (hasCurrentWorkspace) {
|
|
37
|
-
return workspacesList;
|
|
38
|
-
}
|
|
39
|
-
return [{ id: currentWorkspace, name: currentWorkspace }, ...workspacesList];
|
|
40
|
-
}
|
|
41
|
-
const workspaces = $derived(ensureCurrentWorkspaceIncluded($userWorkspaces, $workspaceStore));
|
|
42
|
-
const mcpBaseUrl = $derived(`${window.location.origin}/api/mcp/w/${newTokenWorkspace}/sse?token=`);
|
|
43
12
|
const dispatch = createEventDispatcher();
|
|
44
13
|
$effect(() => {
|
|
45
|
-
if (openWithMcpMode) {
|
|
46
|
-
handleCreateClick('mcpUrl');
|
|
47
|
-
}
|
|
48
14
|
listTokens();
|
|
49
15
|
});
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
}
|
|
54
|
-
else {
|
|
55
|
-
newMcpApps = [];
|
|
56
|
-
}
|
|
57
|
-
});
|
|
58
|
-
// --- Functions ---
|
|
59
|
-
async function createToken(mcpMode = false) {
|
|
60
|
-
try {
|
|
61
|
-
let date;
|
|
62
|
-
if (newTokenExpiration) {
|
|
63
|
-
date = new Date(new Date().getTime() + newTokenExpiration * 1000);
|
|
64
|
-
}
|
|
65
|
-
let tokenScopes = scopes;
|
|
66
|
-
if (mcpMode) {
|
|
67
|
-
tokenScopes = [`mcp:${newMcpScope}`];
|
|
68
|
-
if (newMcpApps.length > 0) {
|
|
69
|
-
tokenScopes.push(`mcp:hub:${newMcpApps.join(',')}`);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
const createdToken = await UserService.createToken({
|
|
73
|
-
requestBody: {
|
|
74
|
-
label: newTokenLabel,
|
|
75
|
-
expiration: date?.toISOString(),
|
|
76
|
-
scopes: tokenScopes,
|
|
77
|
-
workspace_id: mcpMode ? newTokenWorkspace || $workspaceStore : newTokenWorkspace
|
|
78
|
-
}
|
|
79
|
-
});
|
|
80
|
-
if (mcpMode) {
|
|
81
|
-
newMcpToken = `${createdToken}`;
|
|
82
|
-
}
|
|
83
|
-
else {
|
|
84
|
-
newToken = `${createdToken}`;
|
|
85
|
-
}
|
|
86
|
-
dispatch('tokenCreated', newToken ?? newMcpToken);
|
|
87
|
-
listTokens();
|
|
88
|
-
mcpCreationMode = false;
|
|
89
|
-
displayCreateToken = false;
|
|
90
|
-
}
|
|
91
|
-
catch (err) {
|
|
92
|
-
console.error('Failed to create token:', err);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
function handleCreateClick(type) {
|
|
96
|
-
mcpCreationMode = type === 'mcpUrl';
|
|
97
|
-
displayCreateToken = true;
|
|
98
|
-
newMcpToken = undefined;
|
|
99
|
-
newToken = undefined;
|
|
100
|
-
newTokenExpiration = undefined;
|
|
101
|
-
newMcpApps = [];
|
|
102
|
-
newTokenLabel = type === 'mcpUrl' ? 'MCP token' : undefined;
|
|
103
|
-
}
|
|
104
|
-
function handleCreateTokenClick() {
|
|
105
|
-
handleCreateClick('token');
|
|
106
|
-
}
|
|
107
|
-
function handleCopyClick() {
|
|
108
|
-
copyToClipboard(newToken ?? '');
|
|
16
|
+
function handleTokenCreated(token) {
|
|
17
|
+
dispatch('tokenCreated', token);
|
|
18
|
+
listTokens();
|
|
109
19
|
}
|
|
110
20
|
async function handleDeleteClick(tokenPrefix) {
|
|
111
21
|
await UserService.deleteToken({ tokenPrefix });
|
|
@@ -127,266 +37,77 @@ function handlePreviousPage() {
|
|
|
127
37
|
tokenPage -= 1;
|
|
128
38
|
listTokens();
|
|
129
39
|
}
|
|
130
|
-
async function getAllApps() {
|
|
131
|
-
if (allApps.length > 0) {
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
try {
|
|
135
|
-
loadingApps = true;
|
|
136
|
-
allApps = (await IntegrationService.listHubIntegrations({
|
|
137
|
-
kind: 'script'
|
|
138
|
-
})).map((x) => x.name);
|
|
139
|
-
}
|
|
140
|
-
catch (err) {
|
|
141
|
-
console.error('Hub is not available');
|
|
142
|
-
allApps = [];
|
|
143
|
-
errorFetchApps = true;
|
|
144
|
-
}
|
|
145
|
-
finally {
|
|
146
|
-
loadingApps = false;
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
40
|
</script>
|
|
150
41
|
|
|
151
|
-
<div class="
|
|
152
|
-
<
|
|
153
|
-
|
|
154
|
-
<Button
|
|
155
|
-
aiId="account-settings-create-token"
|
|
156
|
-
aiDescription="Create a new token to authenticate to the Windmill API"
|
|
157
|
-
size="sm"
|
|
158
|
-
startIcon={{ icon: Plus }}
|
|
159
|
-
btnClasses={displayCreateToken ? 'hidden' : ''}
|
|
160
|
-
on:click={handleCreateTokenClick}
|
|
161
|
-
>
|
|
162
|
-
Create token
|
|
163
|
-
</Button>
|
|
42
|
+
<div class="flex flex-col min-h-0">
|
|
43
|
+
<div class="text-2xs text-tertiary italic pb-2 mt-2">
|
|
44
|
+
Authenticate to the Windmill API with access tokens.
|
|
164
45
|
</div>
|
|
165
|
-
</div>
|
|
166
|
-
<div class="text-2xs text-tertiary italic pb-6">
|
|
167
|
-
Authenticate to the Windmill API with access tokens.
|
|
168
|
-
</div>
|
|
169
46
|
|
|
170
|
-
<
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
47
|
+
<CreateToken
|
|
48
|
+
{showMcpMode}
|
|
49
|
+
{openWithMcpMode}
|
|
50
|
+
bind:newTokenLabel
|
|
51
|
+
{defaultNewTokenWorkspace}
|
|
52
|
+
{scopes}
|
|
53
|
+
onTokenCreated={handleTokenCreated}
|
|
54
|
+
/>
|
|
55
|
+
<div class="overflow-auto flex-1 min-h-64">
|
|
56
|
+
<TableCustom>
|
|
57
|
+
<!-- @migration-task: migrate this slot by hand, `header-row` is an invalid identifier -->
|
|
58
|
+
<tr slot="header-row">
|
|
59
|
+
<th>prefix</th>
|
|
60
|
+
<th>label</th>
|
|
61
|
+
<th>expiration</th>
|
|
62
|
+
<th>scopes</th>
|
|
63
|
+
<th></th>
|
|
64
|
+
</tr>
|
|
65
|
+
{#snippet body()}
|
|
66
|
+
<tbody>
|
|
67
|
+
{#if tokens && tokens.length > 0}
|
|
68
|
+
{#each tokens as { token_prefix, expiration, label, scopes }}
|
|
69
|
+
<tr>
|
|
70
|
+
<td class="grow">{token_prefix}****</td>
|
|
71
|
+
<td class="grow">{label ?? ''}</td>
|
|
72
|
+
<td class="grow">{displayDate(expiration ?? '')}</td>
|
|
73
|
+
<td class="grow">{scopes?.join(', ') ?? ''}</td>
|
|
74
|
+
<td class="grow">
|
|
75
|
+
<button
|
|
76
|
+
class="text-red-500 text-xs underline"
|
|
77
|
+
onclick={() => handleDeleteClick(token_prefix)}
|
|
78
|
+
>
|
|
79
|
+
Delete
|
|
80
|
+
</button>
|
|
81
|
+
</td>
|
|
82
|
+
</tr>
|
|
83
|
+
{/each}
|
|
84
|
+
{:else if tokens && tokens.length === 0}
|
|
85
|
+
<tr class="px-6">
|
|
86
|
+
<td class="text-secondary italic text-xs"> There are no tokens yet</td>
|
|
87
|
+
</tr>
|
|
88
|
+
{:else}
|
|
89
|
+
<tr><td>Loading...</td></tr>
|
|
90
|
+
{/if}
|
|
91
|
+
</tbody>
|
|
92
|
+
{/snippet}
|
|
93
|
+
</TableCustom>
|
|
94
|
+
<div class="flex flex-row-reverse gap-2 w-full">
|
|
95
|
+
{#if tokens?.length == 100}
|
|
96
|
+
<button
|
|
97
|
+
class="p-1 underline text-sm whitespace-nowrap text-center"
|
|
98
|
+
onclick={handleNextPage}
|
|
99
|
+
>
|
|
100
|
+
Next
|
|
179
101
|
</button>
|
|
180
|
-
</div>
|
|
181
|
-
<div class="pt-1 text-xs ml-2">
|
|
182
|
-
Make sure to copy your personal access token now. You won't be able to see it again!
|
|
183
|
-
</div>
|
|
184
|
-
</div>
|
|
185
|
-
{/if}
|
|
186
|
-
|
|
187
|
-
{#if newMcpToken}
|
|
188
|
-
<div
|
|
189
|
-
class="border rounded-md mb-6 px-2 py-2 bg-green-50 dark:bg-green-200 dark:text-green-800 flex flex-row flex-wrap"
|
|
190
|
-
>
|
|
191
|
-
<p class="text-sm mb-2">New MCP URL:</p>
|
|
192
|
-
<ClipboardPanel content={`${mcpBaseUrl}${newMcpToken}`} />
|
|
193
|
-
<p class="pt-1 text-xs">
|
|
194
|
-
Make sure to copy this URL now. You won't be able to see it again!
|
|
195
|
-
</p>
|
|
196
|
-
</div>
|
|
197
|
-
{/if}
|
|
198
|
-
|
|
199
|
-
{#if displayCreateToken}
|
|
200
|
-
<div class="py-3 px-3 border rounded-md mb-6 bg-surface-secondary min-w-min">
|
|
201
|
-
<h3 class="pb-3 font-semibold">Add a new token</h3>
|
|
202
|
-
|
|
203
|
-
{#if showMcpMode}
|
|
204
|
-
<div class="mb-4 flex flex-row flex-shrink-0">
|
|
205
|
-
<Toggle
|
|
206
|
-
on:change={(e) => {
|
|
207
|
-
mcpCreationMode = e.detail
|
|
208
|
-
if (e.detail) {
|
|
209
|
-
newTokenLabel = 'MCP token'
|
|
210
|
-
newTokenExpiration = undefined
|
|
211
|
-
newTokenWorkspace = $workspaceStore
|
|
212
|
-
} else {
|
|
213
|
-
newTokenLabel = undefined
|
|
214
|
-
newTokenExpiration = undefined
|
|
215
|
-
newTokenWorkspace = defaultNewTokenWorkspace
|
|
216
|
-
}
|
|
217
|
-
}}
|
|
218
|
-
checked={mcpCreationMode}
|
|
219
|
-
options={{
|
|
220
|
-
right: 'Generate MCP URL',
|
|
221
|
-
rightTooltip:
|
|
222
|
-
'Generate a new MCP URL to make your scripts and flows available as tools through your LLM clients.',
|
|
223
|
-
rightDocumentationLink: 'https://www.windmill.dev/docs/core_concepts/mcp'
|
|
224
|
-
}}
|
|
225
|
-
size="xs"
|
|
226
|
-
aiId="account-settings-create-mcp-token"
|
|
227
|
-
aiDescription="Create a new MCP token to authenticate to the Windmill API"
|
|
228
|
-
/>
|
|
229
|
-
</div>
|
|
230
|
-
{/if}
|
|
231
|
-
|
|
232
|
-
{#if scopes != undefined}
|
|
233
|
-
<div class="mb-4">
|
|
234
|
-
<span class="block mb-1">Scope</span>
|
|
235
|
-
{#each scopes as scope}
|
|
236
|
-
<input disabled type="text" value={scope} class="mb-2 w-full" />
|
|
237
|
-
{/each}
|
|
238
|
-
</div>
|
|
239
102
|
{/if}
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
<span class="block mb-1">Scope</span>
|
|
245
|
-
<ToggleButtonGroup bind:selected={newMcpScope} allowEmpty={false}>
|
|
246
|
-
{#snippet children({ item })}
|
|
247
|
-
<ToggleButton
|
|
248
|
-
{item}
|
|
249
|
-
value="favorites"
|
|
250
|
-
label="Favorites only"
|
|
251
|
-
tooltip="Make only your favorite scripts and flows available as tools"
|
|
252
|
-
/>
|
|
253
|
-
<ToggleButton
|
|
254
|
-
{item}
|
|
255
|
-
value="all"
|
|
256
|
-
label="All scripts/flows"
|
|
257
|
-
tooltip="Make all your scripts and flows available as tools"
|
|
258
|
-
/>
|
|
259
|
-
{/snippet}
|
|
260
|
-
</ToggleButtonGroup>
|
|
261
|
-
</div>
|
|
262
|
-
|
|
263
|
-
<div>
|
|
264
|
-
<span class="block mb-1">Hub scripts (optional)</span>
|
|
265
|
-
{#if loadingApps}
|
|
266
|
-
<div>Loading...</div>
|
|
267
|
-
{:else if errorFetchApps}
|
|
268
|
-
<div>Error fetching apps</div>
|
|
269
|
-
{:else}
|
|
270
|
-
<MultiSelect
|
|
271
|
-
items={safeSelectItems(allApps)}
|
|
272
|
-
placeholder="Select apps"
|
|
273
|
-
bind:value={newMcpApps}
|
|
274
|
-
class="!bg-surface"
|
|
275
|
-
/>
|
|
276
|
-
{/if}
|
|
277
|
-
</div>
|
|
278
|
-
|
|
279
|
-
<div>
|
|
280
|
-
<span class="block mb-1">Workspace</span>
|
|
281
|
-
<select
|
|
282
|
-
bind:value={newTokenWorkspace}
|
|
283
|
-
disabled={workspaces.length === 1}
|
|
284
|
-
class="w-full !bg-surface"
|
|
285
|
-
>
|
|
286
|
-
{#each workspaces as workspace}
|
|
287
|
-
<option value={workspace.id}>{workspace.name}</option>
|
|
288
|
-
{/each}
|
|
289
|
-
</select>
|
|
290
|
-
</div>
|
|
291
|
-
{/if}
|
|
292
|
-
|
|
293
|
-
<div>
|
|
294
|
-
<span class="block mb-1">Label <span class="text-xs text-tertiary">(optional)</span></span
|
|
295
|
-
>
|
|
296
|
-
<input type="text" bind:value={newTokenLabel} class="w-full !bg-surface" />
|
|
297
|
-
</div>
|
|
298
|
-
|
|
299
|
-
{#if !mcpCreationMode}
|
|
300
|
-
<div>
|
|
301
|
-
<span class="block mb-1"
|
|
302
|
-
>Expires In <span class="text-xs text-tertiary">(optional)</span></span
|
|
303
|
-
>
|
|
304
|
-
<select bind:value={newTokenExpiration} class="w-full !bg-surface">
|
|
305
|
-
<option value={undefined}>No expiration</option>
|
|
306
|
-
<option value={15 * 60}>15m</option>
|
|
307
|
-
<option value={30 * 60}>30m</option>
|
|
308
|
-
<option value={1 * 60 * 60}>1h</option>
|
|
309
|
-
<option value={1 * 24 * 60 * 60}>1d</option>
|
|
310
|
-
<option value={7 * 24 * 60 * 60}>7d</option>
|
|
311
|
-
<option value={30 * 24 * 60 * 60}>30d</option>
|
|
312
|
-
<option value={90 * 24 * 60 * 60}>90d</option>
|
|
313
|
-
</select>
|
|
314
|
-
</div>
|
|
315
|
-
{/if}
|
|
316
|
-
</div>
|
|
317
|
-
|
|
318
|
-
<div class="mt-4 flex justify-end gap-2 flex-row">
|
|
319
|
-
<Button
|
|
320
|
-
on:click={() => {
|
|
321
|
-
mcpCreationMode = false
|
|
322
|
-
displayCreateToken = false
|
|
323
|
-
}}
|
|
324
|
-
>
|
|
325
|
-
Cancel
|
|
326
|
-
</Button>
|
|
327
|
-
<Button
|
|
328
|
-
on:click={() => createToken(mcpCreationMode)}
|
|
329
|
-
disabled={mcpCreationMode && newTokenWorkspace == undefined}
|
|
103
|
+
{#if tokenPage > 1}
|
|
104
|
+
<button
|
|
105
|
+
class="p-1 underline text-sm whitespace-nowrap text-center"
|
|
106
|
+
onclick={handlePreviousPage}
|
|
330
107
|
>
|
|
331
|
-
|
|
332
|
-
</
|
|
333
|
-
|
|
108
|
+
Previous
|
|
109
|
+
</button>
|
|
110
|
+
{/if}
|
|
334
111
|
</div>
|
|
335
|
-
{/if}
|
|
336
|
-
</div>
|
|
337
|
-
|
|
338
|
-
<div class="overflow-auto">
|
|
339
|
-
<TableCustom>
|
|
340
|
-
<!-- @migration-task: migrate this slot by hand, `header-row` is an invalid identifier -->
|
|
341
|
-
<tr slot="header-row">
|
|
342
|
-
<th>prefix</th>
|
|
343
|
-
<th>label</th>
|
|
344
|
-
<th>expiration</th>
|
|
345
|
-
<th>scopes</th>
|
|
346
|
-
<th></th>
|
|
347
|
-
</tr>
|
|
348
|
-
{#snippet body()}
|
|
349
|
-
<tbody>
|
|
350
|
-
{#if tokens && tokens.length > 0}
|
|
351
|
-
{#each tokens as { token_prefix, expiration, label, scopes }}
|
|
352
|
-
<tr>
|
|
353
|
-
<td class="grow">{token_prefix}****</td>
|
|
354
|
-
<td class="grow">{label ?? ''}</td>
|
|
355
|
-
<td class="grow">{displayDate(expiration ?? '')}</td>
|
|
356
|
-
<td class="grow">{scopes?.join(', ') ?? ''}</td>
|
|
357
|
-
<td class="grow">
|
|
358
|
-
<button
|
|
359
|
-
class="text-red-500 text-xs underline"
|
|
360
|
-
onclick={() => handleDeleteClick(token_prefix)}
|
|
361
|
-
>
|
|
362
|
-
Delete
|
|
363
|
-
</button>
|
|
364
|
-
</td>
|
|
365
|
-
</tr>
|
|
366
|
-
{/each}
|
|
367
|
-
{:else if tokens && tokens.length === 0}
|
|
368
|
-
<tr class="px-6">
|
|
369
|
-
<td class="text-secondary italic text-xs"> There are no tokens yet</td>
|
|
370
|
-
</tr>
|
|
371
|
-
{:else}
|
|
372
|
-
<tr><td>Loading...</td></tr>
|
|
373
|
-
{/if}
|
|
374
|
-
</tbody>
|
|
375
|
-
{/snippet}
|
|
376
|
-
</TableCustom>
|
|
377
|
-
<div class="flex flex-row-reverse gap-2 w-full">
|
|
378
|
-
{#if tokens?.length == 100}
|
|
379
|
-
<button class="p-1 underline text-sm whitespace-nowrap text-center" onclick={handleNextPage}>
|
|
380
|
-
Next
|
|
381
|
-
</button>
|
|
382
|
-
{/if}
|
|
383
|
-
{#if tokenPage > 1}
|
|
384
|
-
<button
|
|
385
|
-
class="p-1 underline text-sm whitespace-nowrap text-center"
|
|
386
|
-
onclick={handlePreviousPage}
|
|
387
|
-
>
|
|
388
|
-
Previous
|
|
389
|
-
</button>
|
|
390
|
-
{/if}
|
|
391
112
|
</div>
|
|
392
113
|
</div>
|
|
@@ -74,6 +74,9 @@ async function saveGlobalMuteSetting() {
|
|
|
74
74
|
childRef.refreshAlerts();
|
|
75
75
|
}
|
|
76
76
|
async function updateHasUnacknowledgedCriticalAlerts(sendToast = false) {
|
|
77
|
+
if (typeof document !== 'undefined' && document.visibilityState !== 'visible') {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
77
80
|
if (checkingForNewAlerts)
|
|
78
81
|
return;
|
|
79
82
|
checkingForNewAlerts = true;
|
|
@@ -9,7 +9,7 @@ let confirmationModalOpen = $state(false);
|
|
|
9
9
|
</script>
|
|
10
10
|
|
|
11
11
|
<ConfirmationModal
|
|
12
|
-
title=
|
|
12
|
+
title={`Are you sure you want to delete this ${trigger?.isDraft ? 'draft' : 'deployed'} trigger ?`}
|
|
13
13
|
confirmationText="Delete"
|
|
14
14
|
open={confirmationModalOpen}
|
|
15
15
|
on:canceled={() => {
|
|
@@ -49,7 +49,7 @@ const canSave = $derived((permissions === 'write' && edit) || permissions === 'c
|
|
|
49
49
|
/>
|
|
50
50
|
</div>
|
|
51
51
|
{/if}
|
|
52
|
-
{#if trigger?.isDraft}
|
|
52
|
+
{#if trigger?.isDraft || permissions === 'create'}
|
|
53
53
|
<DeleteTriggerButton {onDelete} {trigger} />
|
|
54
54
|
{:else if !trigger?.isDraft && trigger?.draftConfig}
|
|
55
55
|
<Button
|
|
@@ -63,12 +63,12 @@ const canSave = $derived((permissions === 'write' && edit) || permissions === 'c
|
|
|
63
63
|
Reset changes
|
|
64
64
|
</Button>
|
|
65
65
|
{/if}
|
|
66
|
-
{#if canSave
|
|
66
|
+
{#if canSave}
|
|
67
67
|
<Tooltip placement="bottom-end" disablePopup={!saveDisabled && !cloudDisabled && isDeployed}>
|
|
68
68
|
<Button
|
|
69
69
|
size="xs"
|
|
70
70
|
startIcon={{ icon: Save }}
|
|
71
|
-
disabled={saveDisabled || cloudDisabled || !isDeployed}
|
|
71
|
+
disabled={saveDisabled || cloudDisabled || !isDeployed || !trigger?.draftConfig}
|
|
72
72
|
on:click={() => {
|
|
73
73
|
onUpdate?.()
|
|
74
74
|
}}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
<script lang="ts">import { enterpriseLicense } from '../../stores';
|
|
2
|
+
import { emptyString } from '../../utils';
|
|
3
|
+
import Alert from '../common/alert/Alert.svelte';
|
|
4
|
+
import ErrorOrRecoveryHandler from '../ErrorOrRecoveryHandler.svelte';
|
|
5
|
+
import FlowRetries from '../flows/content/FlowRetries.svelte';
|
|
6
|
+
import Tooltip from '../Tooltip.svelte';
|
|
7
|
+
let { optionTabSelected, itemKind, can_write, errorHandlerSelected = $bindable(), error_handler_path = $bindable(), error_handler_args = $bindable(), retry = $bindable() } = $props();
|
|
8
|
+
</script>
|
|
9
|
+
|
|
10
|
+
{#if ['error_handler', 'retries'].includes(optionTabSelected) && itemKind !== 'script'}
|
|
11
|
+
<Alert type="info" title="Only available for scripts" class="mb-2">
|
|
12
|
+
Error Handler and Retries are only available for scripts. For flows, use the built-in <a
|
|
13
|
+
href="https://www.windmill.dev/docs/flows/flow_error_handler"
|
|
14
|
+
target="_blank">error handler</a
|
|
15
|
+
>
|
|
16
|
+
and <a href="https://www.windmill.dev/docs/flows/retries" target="_blank">retries</a>.
|
|
17
|
+
</Alert>
|
|
18
|
+
{:else if optionTabSelected === 'error_handler'}
|
|
19
|
+
<ErrorOrRecoveryHandler
|
|
20
|
+
isEditable={can_write}
|
|
21
|
+
errorOrRecovery="error"
|
|
22
|
+
showScriptHelpText={true}
|
|
23
|
+
bind:handlerSelected={errorHandlerSelected}
|
|
24
|
+
bind:handlerPath={error_handler_path}
|
|
25
|
+
toggleText="Alert channel on error"
|
|
26
|
+
customScriptTemplate="/scripts/add?hub=hub%2F13953%2Fwindmill%2Ftrigger_error_handler_template"
|
|
27
|
+
customHandlerKind="script"
|
|
28
|
+
bind:handlerExtraArgs={error_handler_args}
|
|
29
|
+
>
|
|
30
|
+
{#snippet customTabTooltip()}
|
|
31
|
+
<Tooltip>
|
|
32
|
+
<div class="flex gap-20 items-start mt-3">
|
|
33
|
+
<div class="text-sm"
|
|
34
|
+
>The following args will be passed to the error handler:
|
|
35
|
+
<ul class="mt-1 ml-2">
|
|
36
|
+
<li><b>workspace_id</b>: The ID of the workspace that the trigger belongs to.</li>
|
|
37
|
+
<li><b>job_id</b>: The UUID of the job that errored.</li>
|
|
38
|
+
<li><b>path</b>: The path of the script or flow that failed.</li>
|
|
39
|
+
<li><b>is_flow</b>: Whether the runnable is a flow.</li>
|
|
40
|
+
<li
|
|
41
|
+
><b>trigger_path</b>: The path of the trigger in the format
|
|
42
|
+
trigger_type/trigger_path.</li
|
|
43
|
+
>
|
|
44
|
+
<li><b>error</b>: The error details.</li>
|
|
45
|
+
<li><b>started_at</b>: The start datetime of the latest job that failed.</li>
|
|
46
|
+
</ul>
|
|
47
|
+
</div>
|
|
48
|
+
</div>
|
|
49
|
+
</Tooltip>
|
|
50
|
+
{/snippet}</ErrorOrRecoveryHandler
|
|
51
|
+
>
|
|
52
|
+
{:else if optionTabSelected === 'retries'}
|
|
53
|
+
{@const disabled = !can_write || emptyString($enterpriseLicense)}
|
|
54
|
+
<FlowRetries bind:flowModuleRetry={retry} {disabled} />
|
|
55
|
+
{/if}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Retry } from '../../gen';
|
|
2
|
+
type $$ComponentProps = {
|
|
3
|
+
optionTabSelected: 'error_handler' | 'retries' | string;
|
|
4
|
+
itemKind: 'script' | 'flow';
|
|
5
|
+
can_write: boolean;
|
|
6
|
+
errorHandlerSelected: 'custom' | 'slack' | 'teams';
|
|
7
|
+
error_handler_path: string | undefined;
|
|
8
|
+
error_handler_args: Record<string, any>;
|
|
9
|
+
retry: Retry | undefined;
|
|
10
|
+
};
|
|
11
|
+
declare const TriggerRetriesAndErrorHandler: import("svelte").Component<$$ComponentProps, {}, "retry" | "error_handler_path" | "error_handler_args" | "errorHandlerSelected">;
|
|
12
|
+
type TriggerRetriesAndErrorHandler = ReturnType<typeof TriggerRetriesAndErrorHandler>;
|
|
13
|
+
export default TriggerRetriesAndErrorHandler;
|