windmill-components 1.695.1 → 1.698.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/sharedUtils/assets/tokens/colorTokensConfig.d.ts +2 -0
- package/dist/sharedUtils/base.d.ts +1 -0
- package/dist/sharedUtils/cloud.d.ts +1 -0
- package/dist/sharedUtils/common.d.ts +111 -0
- package/dist/sharedUtils/components/apps/components/display/dbtable/queries/count.d.ts +5 -0
- package/dist/sharedUtils/components/apps/components/display/dbtable/queries/delete.d.ts +5 -0
- package/dist/sharedUtils/components/apps/components/display/dbtable/queries/insert.d.ts +5 -0
- package/dist/sharedUtils/components/apps/components/display/dbtable/queries/select.d.ts +13 -0
- package/dist/sharedUtils/components/apps/components/display/dbtable/queries/update.d.ts +11 -0
- package/dist/sharedUtils/components/apps/components/display/dbtable/utils.d.ts +95 -0
- package/dist/sharedUtils/components/apps/editor/appPolicy.d.ts +6 -0
- package/dist/sharedUtils/components/apps/editor/appUtilsCore.d.ts +7 -0
- package/dist/sharedUtils/components/apps/editor/appUtilsS3.d.ts +33 -0
- package/dist/sharedUtils/components/apps/editor/commonAppUtils.d.ts +10 -0
- package/dist/sharedUtils/components/apps/editor/component/components.d.ts +5371 -0
- package/dist/sharedUtils/components/apps/editor/component/default-codes.d.ts +3 -0
- package/dist/sharedUtils/components/apps/editor/component/index.d.ts +3 -0
- package/dist/sharedUtils/components/apps/editor/component/sets.d.ts +7 -0
- package/dist/sharedUtils/components/apps/editor/componentsPanel/componentDefaultProps.d.ts +3 -0
- package/dist/sharedUtils/components/apps/gridUtils.d.ts +14 -0
- package/dist/sharedUtils/components/apps/inputType.d.ts +178 -0
- package/dist/sharedUtils/components/apps/rx.d.ts +29 -0
- package/dist/sharedUtils/components/apps/sharedTypes.d.ts +21 -0
- package/dist/sharedUtils/components/apps/types.d.ts +274 -0
- package/dist/sharedUtils/components/assets/lib.d.ts +25 -0
- package/dist/sharedUtils/components/common/alert/model.d.ts +2 -0
- package/dist/sharedUtils/components/common/badge/model.d.ts +8 -0
- package/dist/sharedUtils/components/common/button/model.d.ts +45 -0
- package/dist/sharedUtils/components/common/fileInput/model.d.ts +1 -0
- package/dist/sharedUtils/components/common/index.d.ts +24 -0
- package/dist/sharedUtils/components/common/skeleton/model.d.ts +21 -0
- package/dist/sharedUtils/components/dbTypes.d.ts +14 -0
- package/dist/sharedUtils/components/diff_drawer.d.ts +26 -0
- package/dist/sharedUtils/components/ducklake.d.ts +1 -0
- package/dist/sharedUtils/components/flows/scheduleUtils.d.ts +7 -0
- package/dist/sharedUtils/components/icons/index.d.ts +101 -0
- package/dist/sharedUtils/components/random_positive_adjetive.d.ts +1 -0
- package/dist/sharedUtils/components/raw_apps/rawAppPolicy.d.ts +10 -0
- package/dist/sharedUtils/components/raw_apps/utils.d.ts +15 -0
- package/dist/sharedUtils/components/triggers/email/utils.d.ts +4 -0
- package/dist/sharedUtils/components/triggers/gcp/utils.d.ts +2 -0
- package/dist/sharedUtils/components/triggers/http/utils.d.ts +11 -0
- package/dist/sharedUtils/components/triggers/kafka/utils.d.ts +2 -0
- package/dist/sharedUtils/components/triggers/mqtt/utils.d.ts +2 -0
- package/dist/sharedUtils/components/triggers/nats/utils.d.ts +2 -0
- package/dist/sharedUtils/components/triggers/postgres/utils.d.ts +8 -0
- package/dist/sharedUtils/components/triggers/sqs/utils.d.ts +2 -0
- package/dist/sharedUtils/components/triggers/triggers.svelte.d.ts +32 -0
- package/dist/sharedUtils/components/triggers/utils.d.ts +80 -0
- package/dist/sharedUtils/components/triggers/websocket/utils.d.ts +2 -0
- package/dist/sharedUtils/components/triggers.d.ts +20 -0
- package/dist/sharedUtils/gen/core/ApiError.d.ts +10 -0
- package/dist/sharedUtils/gen/core/ApiRequestOptions.d.ts +13 -0
- package/dist/sharedUtils/gen/core/ApiResult.d.ts +7 -0
- package/dist/sharedUtils/gen/core/CancelablePromise.d.ts +26 -0
- package/dist/sharedUtils/gen/core/OpenAPI.d.ts +27 -0
- package/dist/sharedUtils/gen/core/request.d.ts +29 -0
- package/dist/sharedUtils/gen/index.d.ts +6 -0
- package/dist/sharedUtils/gen/schemas.gen.d.ts +7036 -0
- package/dist/sharedUtils/gen/services.gen.d.ts +6047 -0
- package/dist/sharedUtils/gen/types.gen.d.ts +21881 -0
- package/dist/sharedUtils/history.svelte.d.ts +9 -0
- package/dist/sharedUtils/hub.d.ts +49 -0
- package/dist/sharedUtils/jsr.json +6 -0
- package/dist/sharedUtils/lib.d.ts +5 -0
- package/dist/sharedUtils/lib.es.js +1588 -0
- package/dist/sharedUtils/package.json +12 -0
- package/dist/sharedUtils/schema.d.ts +3 -0
- package/dist/sharedUtils/stores.d.ts +97 -0
- package/dist/sharedUtils/svelte5Utils.svelte.d.ts +80 -0
- package/dist/sharedUtils/toast.d.ts +8 -0
- package/dist/sharedUtils/utils.d.ts +265 -0
- package/package/components/AppConnectInner.svelte +38 -5
- package/package/components/CompareWorkspaces.svelte +142 -486
- package/package/components/Editor.svelte +5 -4
- package/package/components/Editor.svelte.d.ts +1 -0
- package/package/components/FilterSearchbar.svelte +3 -1
- package/package/components/FilterSearchbar.svelte.d.ts +1 -0
- package/package/components/ForkWorkspaceBanner.svelte +16 -0
- package/package/components/LogViewer.svelte +51 -60
- package/package/components/OnBehalfOfSelector.svelte +10 -7
- package/package/components/ResourceEditor.svelte +198 -311
- package/package/components/ResourceEditor.svelte.d.ts +3 -3
- package/package/components/ResourceEditorDrawer.svelte +17 -6
- package/package/components/ResourceForm.svelte +235 -0
- package/package/components/ResourceForm.svelte.d.ts +25 -0
- package/package/components/RunsPage.svelte +1 -0
- package/package/components/ScriptBuilder.svelte +1 -0
- package/package/components/ScriptEditor.svelte +10 -3
- package/package/components/ScriptEditor.svelte.d.ts +1 -0
- package/package/components/TaggedTextInput.svelte +4 -1
- package/package/components/TaggedTextInput.svelte.d.ts +2 -0
- package/package/components/VariableEditor.svelte +177 -199
- package/package/components/VariableEditor.svelte.d.ts +1 -2
- package/package/components/VariableForm.svelte +133 -0
- package/package/components/VariableForm.svelte.d.ts +22 -0
- package/package/components/WsSpecificVersions.svelte +39 -0
- package/package/components/WsSpecificVersions.svelte.d.ts +9 -0
- package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +0 -1
- package/package/components/apps/editor/AppEditorHeaderDeploy.svelte.d.ts +1 -1
- package/package/components/common/table/AppRow.svelte +2 -1
- package/package/components/common/table/AppRow.svelte.d.ts +1 -0
- package/package/components/common/table/FlowRow.svelte +2 -1
- package/package/components/common/table/FlowRow.svelte.d.ts +1 -0
- package/package/components/common/table/RawAppRow.svelte +2 -1
- package/package/components/common/table/RawAppRow.svelte.d.ts +1 -0
- package/package/components/common/table/Row.svelte +11 -3
- package/package/components/common/table/Row.svelte.d.ts +2 -1
- package/package/components/common/table/RowIcon.svelte +18 -2
- package/package/components/common/table/RowIcon.svelte.d.ts +1 -1
- package/package/components/common/table/ScriptRow.svelte +2 -1
- package/package/components/common/table/ScriptRow.svelte.d.ts +1 -0
- package/package/components/copilot/autocomplete/Autocompletor.d.ts +3 -1
- package/package/components/copilot/autocomplete/Autocompletor.js +5 -2
- package/package/components/copilot/autocomplete/request.d.ts +1 -0
- package/package/components/copilot/autocomplete/request.js +1 -1
- package/package/components/copilot/chat/AIChatManager.svelte.js +14 -4
- package/package/components/copilot/chat/AiChatLayout.svelte +2 -0
- package/package/components/copilot/chat/ContextManager.svelte.d.ts +1 -0
- package/package/components/copilot/chat/CreatedResourceActionDrawers.svelte +129 -0
- package/package/components/copilot/chat/CreatedResourceActionDrawers.svelte.d.ts +4 -0
- package/package/components/copilot/chat/ToolExecutionDisplay.svelte +14 -6
- package/package/components/copilot/chat/ToolMessageActions.svelte +73 -0
- package/package/components/copilot/chat/ToolMessageActions.svelte.d.ts +7 -0
- package/package/components/copilot/chat/createdResourceActions.svelte.d.ts +6 -0
- package/package/components/copilot/chat/createdResourceActions.svelte.js +29 -0
- package/package/components/copilot/chat/script/core.d.ts +6 -2
- package/package/components/copilot/chat/script/core.js +13 -7
- package/package/components/copilot/chat/script/wacPrompt.test.d.ts +1 -0
- package/package/components/copilot/chat/script/wacPrompt.test.js +25 -0
- package/package/components/copilot/chat/shared.d.ts +12 -0
- package/package/components/copilot/chat/shared.test.js +23 -2
- package/package/components/copilot/chat/workspaceTools.js +34 -4
- package/package/components/flows/content/ScriptEditorDrawer.svelte +1 -0
- package/package/components/graph/wacToFlow.js +1 -1
- package/package/components/graph/wacToFlow.test.d.ts +1 -0
- package/package/components/graph/wacToFlow.test.js +17 -0
- package/package/components/home/Item.svelte +5 -1
- package/package/components/home/Item.svelte.d.ts +1 -0
- package/package/components/home/ItemsList.svelte +260 -3
- package/package/components/instanceSettings/SecretBackendConfig.svelte +457 -88
- package/package/components/runs/useJobsLoader.svelte.js +5 -11
- package/package/components/sidebar/WorkspaceMenu.svelte +19 -5
- package/package/externalDomain.d.ts +2 -0
- package/package/externalDomain.js +16 -0
- package/package/gen/core/OpenAPI.js +1 -1
- package/package/gen/types.gen.d.ts +0 -112
- package/package/hubPaths.json +2 -2
- package/package/system_prompts/index.d.ts +1 -1
- package/package/system_prompts/index.js +22 -3
- package/package/system_prompts/prompts.d.ts +2 -2
- package/package/system_prompts/prompts.js +6 -3
- package/package/utils_deployable.d.ts +162 -638
- package/package/utils_deployable.js +75 -143
- package/package/utils_workspace_deploy.d.ts +10 -4
- package/package/utils_workspace_deploy.js +167 -42
- package/package.json +7 -3
|
@@ -16,6 +16,7 @@ interface Props {
|
|
|
16
16
|
depth?: number;
|
|
17
17
|
menuOpen?: boolean;
|
|
18
18
|
showEditButton?: boolean;
|
|
19
|
+
keyboardSelected?: boolean;
|
|
19
20
|
}
|
|
20
21
|
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> {
|
|
21
22
|
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
@@ -19,7 +19,7 @@ import { getDeployUiSettings } from '../../home/deploy_ui';
|
|
|
19
19
|
import { isRuleActive } from '../../../workspaceProtectionRules.svelte';
|
|
20
20
|
import { buildForkEditUrl } from '../../../utils/editInFork';
|
|
21
21
|
import { isCloudHosted } from '../../../cloud';
|
|
22
|
-
let { flow, marked, shareModal, moveDrawer, deleteConfirmedCallback = $bindable(), deploymentDrawer, errorHandlerMuted, depth = 0, menuOpen = $bindable(false), showEditButton = $bindable(true) } = $props();
|
|
22
|
+
let { flow, marked, shareModal, moveDrawer, deleteConfirmedCallback = $bindable(), deploymentDrawer, errorHandlerMuted, depth = 0, menuOpen = $bindable(false), showEditButton = $bindable(true), keyboardSelected = false } = $props();
|
|
23
23
|
const dispatch = createEventDispatcher();
|
|
24
24
|
async function archiveFlow(path, archived) {
|
|
25
25
|
try {
|
|
@@ -68,6 +68,7 @@ let flowHistory = $state(undefined);
|
|
|
68
68
|
{errorHandlerMuted}
|
|
69
69
|
canFavorite={!flow.draft_only}
|
|
70
70
|
{depth}
|
|
71
|
+
{keyboardSelected}
|
|
71
72
|
>
|
|
72
73
|
{#snippet badges()}
|
|
73
74
|
{#if flow.archived}
|
|
@@ -17,6 +17,7 @@ interface Props {
|
|
|
17
17
|
depth?: number;
|
|
18
18
|
menuOpen?: boolean;
|
|
19
19
|
showEditButton?: boolean;
|
|
20
|
+
keyboardSelected?: boolean;
|
|
20
21
|
}
|
|
21
22
|
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> {
|
|
22
23
|
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
@@ -7,7 +7,7 @@ import Row from './Row.svelte';
|
|
|
7
7
|
import { Globe, Shield } from 'lucide-svelte';
|
|
8
8
|
import { isDeployable } from '../../../utils_deployable';
|
|
9
9
|
import { getDeployUiSettings } from '../../home/deploy_ui';
|
|
10
|
-
let { app, marked, shareModal, deploymentDrawer, depth = 0, menuOpen = $bindable(false) } = $props();
|
|
10
|
+
let { app, marked, shareModal, deploymentDrawer, depth = 0, menuOpen = $bindable(false), keyboardSelected = false } = $props();
|
|
11
11
|
</script>
|
|
12
12
|
|
|
13
13
|
<Row
|
|
@@ -19,6 +19,7 @@ let { app, marked, shareModal, deploymentDrawer, depth = 0, menuOpen = $bindable
|
|
|
19
19
|
workspaceId={app.workspace_id ?? $workspaceStore ?? ''}
|
|
20
20
|
canFavorite={true}
|
|
21
21
|
{depth}
|
|
22
|
+
{keyboardSelected}
|
|
22
23
|
>
|
|
23
24
|
{#snippet badges()}
|
|
24
25
|
<SharedBadge canWrite={app.canWrite} extraPerms={app.extra_perms} />
|
|
@@ -10,6 +10,7 @@ interface Props {
|
|
|
10
10
|
deploymentDrawer: DeployWorkspaceDrawer;
|
|
11
11
|
depth?: number;
|
|
12
12
|
menuOpen?: boolean;
|
|
13
|
+
keyboardSelected?: boolean;
|
|
13
14
|
}
|
|
14
15
|
declare const RawAppRow: import("svelte").Component<Props, {}, "menuOpen">;
|
|
15
16
|
type RawAppRow = ReturnType<typeof RawAppRow>;
|
|
@@ -5,12 +5,18 @@ import { BellOff } from 'lucide-svelte';
|
|
|
5
5
|
import { twMerge } from 'tailwind-merge';
|
|
6
6
|
import { goto } from '../../../navigation';
|
|
7
7
|
import { triggerableByAI } from '../../../actions/triggerableByAI.svelte';
|
|
8
|
-
let { marked, selected = false, disabled = false, canFavorite = true, isSelectable = false, alignWithSelectable = false, errorHandlerMuted = false, aiId = undefined, aiDescription = undefined, kind = 'script', triggerKind = undefined, summary = undefined, path, href = undefined, workspaceId, depth = 0, badges, actions, customSummary, onSelect = () => { } } = $props();
|
|
8
|
+
let { marked, selected = false, keyboardSelected = false, disabled = false, canFavorite = true, isSelectable = false, alignWithSelectable = false, errorHandlerMuted = false, aiId = undefined, aiDescription = undefined, kind = 'script', triggerKind = undefined, summary = undefined, path, href = undefined, workspaceId, depth = 0, badges, actions, customSummary, onSelect = () => { } } = $props();
|
|
9
9
|
let displayPath = (untrack(() => depth) === 0
|
|
10
10
|
? untrack(() => path)
|
|
11
11
|
: untrack(() => path)
|
|
12
12
|
?.split('/')
|
|
13
13
|
?.slice(-1)?.[0]) ?? '';
|
|
14
|
+
let rowEl = $state();
|
|
15
|
+
$effect(() => {
|
|
16
|
+
if (keyboardSelected) {
|
|
17
|
+
rowEl?.scrollIntoView({ block: 'nearest' });
|
|
18
|
+
}
|
|
19
|
+
});
|
|
14
20
|
</script>
|
|
15
21
|
|
|
16
22
|
{#if href}
|
|
@@ -26,11 +32,12 @@ let displayPath = (untrack(() => depth) === 0
|
|
|
26
32
|
></div>
|
|
27
33
|
{/if}
|
|
28
34
|
<div
|
|
35
|
+
bind:this={rowEl}
|
|
29
36
|
class={twMerge(
|
|
30
37
|
'w-full inline-flex items-center gap-4 first-of-type:!border-t-0 first-of-type:rounded-t-md last-of-type:rounded-b-md [*:not(:last-child)]:border-b px-4 py-3 border-b last:border-b-0',
|
|
31
38
|
depth > 0 ? '!rounded-none' : '',
|
|
32
39
|
disabled ? 'opacity-25' : 'hover:bg-surface-hover',
|
|
33
|
-
selected ? 'bg-surface-accent-selected' : ''
|
|
40
|
+
selected ? 'bg-surface-accent-selected' : keyboardSelected ? 'bg-gray-200 dark:bg-gray-700' : ''
|
|
34
41
|
)}
|
|
35
42
|
style={depth > 0 ? `padding-left: ${depth * 32}px;` : ''}
|
|
36
43
|
>
|
|
@@ -43,6 +50,7 @@ let displayPath = (untrack(() => depth) === 0
|
|
|
43
50
|
{#if href}
|
|
44
51
|
<a
|
|
45
52
|
{href}
|
|
53
|
+
data-row-keyboard-selected={keyboardSelected ? 'true' : undefined}
|
|
46
54
|
class="min-w-0 grow hover:underline decoration-gray-400 inline-flex items-center gap-4"
|
|
47
55
|
>
|
|
48
56
|
{@render rowContent()}
|
|
@@ -69,7 +77,7 @@ let displayPath = (untrack(() => depth) === 0
|
|
|
69
77
|
<div class="w-9"></div>
|
|
70
78
|
{/if}
|
|
71
79
|
|
|
72
|
-
<div class="flex gap-1 items-center justify-end pr-2">
|
|
80
|
+
<div data-row-actions class="flex gap-1 items-center justify-end pr-2">
|
|
73
81
|
{@render actions?.()}
|
|
74
82
|
</div>
|
|
75
83
|
</div>
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
interface Props {
|
|
2
2
|
marked: string | undefined;
|
|
3
3
|
selected?: boolean;
|
|
4
|
+
keyboardSelected?: boolean;
|
|
4
5
|
disabled?: boolean;
|
|
5
6
|
canFavorite?: boolean;
|
|
6
7
|
isSelectable?: boolean;
|
|
@@ -8,7 +9,7 @@ interface Props {
|
|
|
8
9
|
errorHandlerMuted?: boolean;
|
|
9
10
|
aiId?: string | undefined;
|
|
10
11
|
aiDescription?: string | undefined;
|
|
11
|
-
kind?: 'script' | 'flow' | 'app' | 'raw_app' | 'resource' | 'variable' | 'resource_type' | 'folder' | 'schedule' | 'trigger';
|
|
12
|
+
kind?: 'script' | 'flow' | 'app' | 'raw_app' | 'resource' | 'variable' | 'resource_type' | 'folder' | 'schedule' | 'trigger' | 'http_trigger' | 'websocket_trigger' | 'kafka_trigger' | 'nats_trigger' | 'postgres_trigger' | 'mqtt_trigger' | 'sqs_trigger' | 'gcp_trigger' | 'azure_trigger' | 'email_trigger';
|
|
12
13
|
triggerKind?: string | undefined;
|
|
13
14
|
summary?: string | undefined;
|
|
14
15
|
path: string;
|
|
@@ -3,11 +3,25 @@ import KafkaIcon from '../../icons/KafkaIcon.svelte';
|
|
|
3
3
|
import NatsIcon from '../../icons/NatsIcon.svelte';
|
|
4
4
|
import MqttIcon from '../../icons/MqttIcon.svelte';
|
|
5
5
|
import AwsIcon from '../../icons/AwsIcon.svelte';
|
|
6
|
+
import AzureIcon from '../../icons/AzureIcon.svelte';
|
|
6
7
|
import GoogleCloudIcon from '../../icons/GoogleCloudIcon.svelte';
|
|
7
8
|
import { Boxes, Calendar, Code2, Database, DollarSign, Folder, LayoutDashboard, Mail, Route, Unplug } from 'lucide-svelte';
|
|
8
9
|
let { kind, triggerKind = undefined } = $props();
|
|
9
|
-
//
|
|
10
|
-
|
|
10
|
+
// Map per-kind backend names (e.g. `kafka_trigger`) to the legacy short
|
|
11
|
+
// names the icon switch already handles, so we don't have to duplicate cases.
|
|
12
|
+
const PER_KIND_TO_SHORT = {
|
|
13
|
+
http_trigger: 'routes',
|
|
14
|
+
websocket_trigger: 'websockets',
|
|
15
|
+
kafka_trigger: 'kafka',
|
|
16
|
+
nats_trigger: 'nats',
|
|
17
|
+
postgres_trigger: 'postgres',
|
|
18
|
+
mqtt_trigger: 'mqtt',
|
|
19
|
+
sqs_trigger: 'sqs',
|
|
20
|
+
gcp_trigger: 'gcp',
|
|
21
|
+
azure_trigger: 'azure',
|
|
22
|
+
email_trigger: 'emails'
|
|
23
|
+
};
|
|
24
|
+
let effectiveKind = $derived(kind === 'trigger' && triggerKind ? triggerKind : (PER_KIND_TO_SHORT[kind] ?? kind));
|
|
11
25
|
</script>
|
|
12
26
|
|
|
13
27
|
<div class="flex justify-center items-center" title={effectiveKind}>
|
|
@@ -43,6 +57,8 @@ let effectiveKind = $derived(kind === 'trigger' && triggerKind ? triggerKind : k
|
|
|
43
57
|
<AwsIcon size={16} class="text-gray-400" />
|
|
44
58
|
{:else if effectiveKind === 'gcp'}
|
|
45
59
|
<GoogleCloudIcon size={16} />
|
|
60
|
+
{:else if effectiveKind === 'azure'}
|
|
61
|
+
<AzureIcon size={16} />
|
|
46
62
|
{:else if effectiveKind === 'emails'}
|
|
47
63
|
<Mail size={16} class="text-gray-400" />
|
|
48
64
|
{:else if effectiveKind === 'trigger'}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
interface Props {
|
|
2
|
-
kind: 'script' | 'flow' | 'app' | 'raw_app' | 'resource' | 'variable' | 'resource_type' | 'folder' | 'schedule' | 'trigger' | 'routes' | 'schedules' | 'websockets' | 'postgres' | 'kafka' | 'nats' | 'mqtt' | 'sqs' | 'gcp' | 'emails';
|
|
2
|
+
kind: 'script' | 'flow' | 'app' | 'raw_app' | 'resource' | 'variable' | 'resource_type' | 'folder' | 'schedule' | 'trigger' | 'routes' | 'schedules' | 'websockets' | 'postgres' | 'kafka' | 'nats' | 'mqtt' | 'sqs' | 'gcp' | 'emails' | 'http_trigger' | 'websocket_trigger' | 'kafka_trigger' | 'nats_trigger' | 'postgres_trigger' | 'mqtt_trigger' | 'sqs_trigger' | 'gcp_trigger' | 'azure_trigger' | 'email_trigger';
|
|
3
3
|
/** For 'trigger' kind, specifies the specific trigger type (routes, schedules, etc.) */
|
|
4
4
|
triggerKind?: string | undefined;
|
|
5
5
|
}
|
|
@@ -26,7 +26,7 @@ import { scriptToHubUrl } from '../../../hub';
|
|
|
26
26
|
import { isRuleActive } from '../../../workspaceProtectionRules.svelte';
|
|
27
27
|
import { buildForkEditUrl } from '../../../utils/editInFork';
|
|
28
28
|
import { isCloudHosted } from '../../../cloud';
|
|
29
|
-
let { script, marked, shareModal, moveDrawer, deploymentDrawer, deleteConfirmedCallback = $bindable(), errorHandlerMuted, showCode, depth = 0, menuOpen = $bindable(false), showEditButton = $bindable(true) } = $props();
|
|
29
|
+
let { script, marked, shareModal, moveDrawer, deploymentDrawer, deleteConfirmedCallback = $bindable(), errorHandlerMuted, showCode, depth = 0, menuOpen = $bindable(false), showEditButton = $bindable(true), keyboardSelected = false } = $props();
|
|
30
30
|
const dispatch = createEventDispatcher();
|
|
31
31
|
async function archiveScript(path) {
|
|
32
32
|
await ScriptService.archiveScriptByPath({ workspace: $workspaceStore, path });
|
|
@@ -75,6 +75,7 @@ let wacExportDrawer = $state(undefined);
|
|
|
75
75
|
workspaceId={$workspaceStore ?? ''}
|
|
76
76
|
canFavorite={!script.draft_only}
|
|
77
77
|
{depth}
|
|
78
|
+
{keyboardSelected}
|
|
78
79
|
>
|
|
79
80
|
{#snippet badges()}
|
|
80
81
|
{#if script.lock_error_logs}
|
|
@@ -17,6 +17,7 @@ interface Props {
|
|
|
17
17
|
depth?: number;
|
|
18
18
|
menuOpen?: boolean;
|
|
19
19
|
showEditButton?: boolean;
|
|
20
|
+
keyboardSelected?: boolean;
|
|
20
21
|
}
|
|
21
22
|
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> {
|
|
22
23
|
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
@@ -3,7 +3,9 @@ import { editor as meditor } from 'monaco-editor';
|
|
|
3
3
|
import type { MonacoLanguageClient } from 'monaco-languageclient';
|
|
4
4
|
export declare class Autocompletor {
|
|
5
5
|
#private;
|
|
6
|
-
constructor(editor: meditor.IStandaloneCodeEditor, scriptLang: ScriptLang | 'bunnative' | 'jsx' | 'tsx' | 'json'
|
|
6
|
+
constructor(editor: meditor.IStandaloneCodeEditor, scriptLang: ScriptLang | 'bunnative' | 'jsx' | 'tsx' | 'json', options?: {
|
|
7
|
+
workflowAsCode?: boolean;
|
|
8
|
+
});
|
|
7
9
|
static isProviderModelSupported(providerModel: AIProviderModel | undefined): boolean;
|
|
8
10
|
dispose(): void;
|
|
9
11
|
setLanguageClient(client: MonacoLanguageClient): void;
|
|
@@ -35,6 +35,7 @@ export class Autocompletor {
|
|
|
35
35
|
max: 10
|
|
36
36
|
});
|
|
37
37
|
#scriptLang;
|
|
38
|
+
#workflowAsCode;
|
|
38
39
|
#abortController = new AbortController();
|
|
39
40
|
#completionDisposable;
|
|
40
41
|
#cursorDisposable;
|
|
@@ -42,13 +43,14 @@ export class Autocompletor {
|
|
|
42
43
|
#contextWindow = 0;
|
|
43
44
|
#shouldShowDeletionCue = false;
|
|
44
45
|
#languageClient = undefined;
|
|
45
|
-
constructor(editor, scriptLang) {
|
|
46
|
+
constructor(editor, scriptLang, options = {}) {
|
|
46
47
|
setGlobalCSS('ai-chat-autocomplete', `
|
|
47
48
|
.ai-completion-diff {
|
|
48
49
|
background: var(--vscode-diffEditor-removedTextBackground);
|
|
49
50
|
}
|
|
50
51
|
`);
|
|
51
52
|
this.#scriptLang = scriptLang;
|
|
53
|
+
this.#workflowAsCode = options.workflowAsCode ?? false;
|
|
52
54
|
const deletionsCues = editor.createDecorationsCollection();
|
|
53
55
|
const completionModel = get(copilotInfo).codeCompletionModel;
|
|
54
56
|
this.#contextWindow = getModelContextWindow(completionModel?.model ?? '');
|
|
@@ -368,7 +370,8 @@ export class Autocompletor {
|
|
|
368
370
|
suffix,
|
|
369
371
|
scriptLang: this.#scriptLang,
|
|
370
372
|
markers: markersAtCursor,
|
|
371
|
-
libraries: librariesCompletions
|
|
373
|
+
libraries: librariesCompletions,
|
|
374
|
+
workflowAsCode: this.#workflowAsCode
|
|
372
375
|
}, this.#abortController);
|
|
373
376
|
if (!completion) {
|
|
374
377
|
return;
|
|
@@ -21,7 +21,7 @@ export async function autocompleteRequest(context, abortController) {
|
|
|
21
21
|
let commentSymbol = getCommentSymbol(context.scriptLang);
|
|
22
22
|
let contextLines = comment(commentSymbol, 'You are a code completion assistant. You are given three important contexts (<LANGUAGE CONTEXT>, <DIAGNOSTICS>, <LIBRARY METHODS>) to help you complete the code.\n');
|
|
23
23
|
contextLines += comment(commentSymbol, 'LANGUAGE CONTEXT:\n');
|
|
24
|
-
contextLines += comment(commentSymbol, getLangContext(context.scriptLang) + '\n');
|
|
24
|
+
contextLines += comment(commentSymbol, getLangContext(context.scriptLang, { workflowAsCode: context.workflowAsCode }) + '\n');
|
|
25
25
|
contextLines += comment(commentSymbol, 'DIAGNOSTICS:\n');
|
|
26
26
|
contextLines += comment(commentSymbol, context.markers.map((m) => m.message).join('\n') + '\n');
|
|
27
27
|
contextLines += comment(commentSymbol, 'LIBRARY METHODS:\n');
|
|
@@ -190,8 +190,10 @@ class AIChatManager {
|
|
|
190
190
|
const currentModel = getCurrentModel();
|
|
191
191
|
const customPrompt = getCombinedCustomPrompt(mode);
|
|
192
192
|
const lang = options?.lang ?? this.scriptEditorOptions?.lang ?? 'bun';
|
|
193
|
+
const workflowAsCode = options?.workflowAsCode ??
|
|
194
|
+
(options?.lang ? false : (this.scriptEditorOptions?.workflowAsCode ?? false));
|
|
193
195
|
const context = this.contextManager.getSelectedContext();
|
|
194
|
-
this.systemMessage = prepareScriptSystemMessage(currentModel, lang, {}, customPrompt);
|
|
196
|
+
this.systemMessage = prepareScriptSystemMessage(currentModel, lang, { isPreprocessor: options?.isPreprocessor, workflowAsCode }, customPrompt);
|
|
195
197
|
this.systemMessage.content = this.systemMessage.content;
|
|
196
198
|
this.tools = [...prepareScriptTools(currentModel, lang, context)];
|
|
197
199
|
this.helpers = {
|
|
@@ -434,7 +436,9 @@ class AIChatManager {
|
|
|
434
436
|
});
|
|
435
437
|
const systemMessage = {
|
|
436
438
|
role: 'system',
|
|
437
|
-
content: prepareInlineChatSystemPrompt(lang
|
|
439
|
+
content: prepareInlineChatSystemPrompt(lang, {
|
|
440
|
+
workflowAsCode: this.scriptEditorOptions?.workflowAsCode ?? false
|
|
441
|
+
})
|
|
438
442
|
};
|
|
439
443
|
let reply = '';
|
|
440
444
|
try {
|
|
@@ -490,10 +494,16 @@ class AIChatManager {
|
|
|
490
494
|
};
|
|
491
495
|
sendRequest = async (options = {}) => {
|
|
492
496
|
if (options.mode) {
|
|
493
|
-
this.changeMode(options.mode, undefined, {
|
|
497
|
+
this.changeMode(options.mode, undefined, {
|
|
498
|
+
lang: options.lang,
|
|
499
|
+
isPreprocessor: options.isPreprocessor
|
|
500
|
+
});
|
|
494
501
|
}
|
|
495
502
|
else {
|
|
496
|
-
this.changeMode(this.mode, undefined, {
|
|
503
|
+
this.changeMode(this.mode, undefined, {
|
|
504
|
+
lang: options.lang,
|
|
505
|
+
isPreprocessor: options.isPreprocessor
|
|
506
|
+
});
|
|
497
507
|
}
|
|
498
508
|
if (options.instructions) {
|
|
499
509
|
this.instructions = options.instructions;
|
|
@@ -9,6 +9,7 @@ import { aiChatManager } from './AIChatManager.svelte';
|
|
|
9
9
|
import { onDestroy } from 'svelte';
|
|
10
10
|
import Button from '../../common/button/Button.svelte';
|
|
11
11
|
import { Menu } from 'lucide-svelte';
|
|
12
|
+
import CreatedResourceActionDrawers from './CreatedResourceActionDrawers.svelte';
|
|
12
13
|
let { noPadding: noBorder = false, isCollapsed = false, children, onMenuOpen, disableAi } = $props();
|
|
13
14
|
$effect(() => {
|
|
14
15
|
if (disableAi) {
|
|
@@ -29,6 +30,7 @@ onDestroy(() => {
|
|
|
29
30
|
</script>
|
|
30
31
|
|
|
31
32
|
{#if !disableAi}
|
|
33
|
+
<CreatedResourceActionDrawers />
|
|
32
34
|
<Splitpanes horizontal={false} class="flex-1 min-h-0">
|
|
33
35
|
<Pane size={100 - chatState.size} minSize={50} class="flex flex-col grow min-h-0 ">
|
|
34
36
|
<div
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
<script lang="ts">import { onDestroy, tick } from 'svelte';
|
|
2
|
+
import { Drawer } from '../../common';
|
|
3
|
+
import DrawerContent from '../../common/drawer/DrawerContent.svelte';
|
|
4
|
+
import { Loader2 } from 'lucide-svelte';
|
|
5
|
+
import { registerToolDisplayActionHandler } from './createdResourceActions.svelte';
|
|
6
|
+
const DRAWER_SIZE = '800px';
|
|
7
|
+
let drawer = $state(undefined);
|
|
8
|
+
let editor = $state(undefined);
|
|
9
|
+
let activeDrawer = $state(undefined);
|
|
10
|
+
let nextActiveDrawerId = 0;
|
|
11
|
+
const drawerConfigs = {
|
|
12
|
+
schedule: {
|
|
13
|
+
label: 'schedule',
|
|
14
|
+
load: () => import('../../triggers/schedules/ScheduleEditorInner.svelte')
|
|
15
|
+
},
|
|
16
|
+
http: {
|
|
17
|
+
label: 'HTTP trigger',
|
|
18
|
+
load: () => import('../../triggers/http/RouteEditorInner.svelte')
|
|
19
|
+
},
|
|
20
|
+
websocket: {
|
|
21
|
+
label: 'WebSocket trigger',
|
|
22
|
+
load: () => import('../../triggers/websocket/WebsocketTriggerEditorInner.svelte')
|
|
23
|
+
},
|
|
24
|
+
postgres: {
|
|
25
|
+
label: 'Postgres trigger',
|
|
26
|
+
load: () => import('../../triggers/postgres/PostgresTriggerEditorInner.svelte')
|
|
27
|
+
},
|
|
28
|
+
kafka: {
|
|
29
|
+
label: 'Kafka trigger',
|
|
30
|
+
load: () => import('../../triggers/kafka/KafkaTriggerEditorInner.svelte')
|
|
31
|
+
},
|
|
32
|
+
nats: {
|
|
33
|
+
label: 'NATS trigger',
|
|
34
|
+
load: () => import('../../triggers/nats/NatsTriggerEditorInner.svelte')
|
|
35
|
+
},
|
|
36
|
+
mqtt: {
|
|
37
|
+
label: 'MQTT trigger',
|
|
38
|
+
load: () => import('../../triggers/mqtt/MqttTriggerEditorInner.svelte')
|
|
39
|
+
},
|
|
40
|
+
sqs: {
|
|
41
|
+
label: 'SQS trigger',
|
|
42
|
+
load: () => import('../../triggers/sqs/SqsTriggerEditorInner.svelte')
|
|
43
|
+
},
|
|
44
|
+
gcp: {
|
|
45
|
+
label: 'GCP Pub/Sub trigger',
|
|
46
|
+
load: () => import('../../triggers/gcp/GcpTriggerEditorInner.svelte')
|
|
47
|
+
},
|
|
48
|
+
azure: {
|
|
49
|
+
label: 'Azure Event Grid trigger',
|
|
50
|
+
load: () => import('../../triggers/azure/AzureTriggerEditorInner.svelte')
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
const drawerTitle = $derived.by(() => {
|
|
54
|
+
const current = activeDrawer;
|
|
55
|
+
return current ? `Edit ${drawerConfigs[current.key].label} ${current.path}` : 'Edit trigger';
|
|
56
|
+
});
|
|
57
|
+
function waitForAnimationFrame() {
|
|
58
|
+
return new Promise((resolve) => {
|
|
59
|
+
if (typeof requestAnimationFrame === 'function') {
|
|
60
|
+
requestAnimationFrame(() => resolve());
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
resolve();
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
async function getEditor(request) {
|
|
68
|
+
await request.promise;
|
|
69
|
+
await tick();
|
|
70
|
+
await waitForAnimationFrame();
|
|
71
|
+
if (activeDrawer?.id !== request.id) {
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
if (!editor) {
|
|
75
|
+
await tick();
|
|
76
|
+
await waitForAnimationFrame();
|
|
77
|
+
}
|
|
78
|
+
if (!editor) {
|
|
79
|
+
throw new Error(`${drawerConfigs[request.key].label} drawer is not ready`);
|
|
80
|
+
}
|
|
81
|
+
return editor;
|
|
82
|
+
}
|
|
83
|
+
async function openCreatedResource(action) {
|
|
84
|
+
if (action.type !== 'open_created_resource') {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const key = action.resource === 'schedule' ? 'schedule' : action.triggerKind;
|
|
88
|
+
if (!key) {
|
|
89
|
+
throw new Error('Missing trigger kind');
|
|
90
|
+
}
|
|
91
|
+
const config = drawerConfigs[key];
|
|
92
|
+
const promise = activeDrawer?.key === key ? activeDrawer.promise : config.load();
|
|
93
|
+
if (activeDrawer?.key !== key) {
|
|
94
|
+
editor = undefined;
|
|
95
|
+
}
|
|
96
|
+
const request = { id: nextActiveDrawerId++, key, path: action.path, promise };
|
|
97
|
+
activeDrawer = request;
|
|
98
|
+
drawer?.openDrawer();
|
|
99
|
+
const currentEditor = await getEditor(request);
|
|
100
|
+
if (!currentEditor) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
await currentEditor.openEdit(action.path, action.targetKind === 'flow');
|
|
104
|
+
}
|
|
105
|
+
function onInnerUpdate() {
|
|
106
|
+
drawer?.closeDrawer();
|
|
107
|
+
}
|
|
108
|
+
const unregisterCreatedResourceHandler = registerToolDisplayActionHandler('open_created_resource', openCreatedResource);
|
|
109
|
+
onDestroy(() => {
|
|
110
|
+
unregisterCreatedResourceHandler();
|
|
111
|
+
});
|
|
112
|
+
</script>
|
|
113
|
+
|
|
114
|
+
<Drawer bind:this={drawer} size={DRAWER_SIZE}>
|
|
115
|
+
<DrawerContent title={drawerTitle} on:close={() => drawer?.closeDrawer()}>
|
|
116
|
+
{#if activeDrawer}
|
|
117
|
+
{#key activeDrawer.key}
|
|
118
|
+
{#await activeDrawer.promise}
|
|
119
|
+
<div class="p-4 flex justify-center">
|
|
120
|
+
<Loader2 class="animate-spin" />
|
|
121
|
+
</div>
|
|
122
|
+
{:then Module}
|
|
123
|
+
{@const Editor = Module.default as EditorComponent}
|
|
124
|
+
<Editor bind:this={editor} useDrawer={false} onUpdate={onInnerUpdate} />
|
|
125
|
+
{/await}
|
|
126
|
+
{/key}
|
|
127
|
+
{/if}
|
|
128
|
+
</DrawerContent>
|
|
129
|
+
</Drawer>
|
|
@@ -3,11 +3,15 @@ import { Button } from '../../common';
|
|
|
3
3
|
import { aiChatManager } from './AIChatManager.svelte';
|
|
4
4
|
import { twMerge } from 'tailwind-merge';
|
|
5
5
|
import ToolContentDisplay from './ToolContentDisplay.svelte';
|
|
6
|
+
import ToolMessageActions from './ToolMessageActions.svelte';
|
|
6
7
|
let { message } = $props();
|
|
7
8
|
const hasParameters = $derived(message.parameters !== undefined && Object.keys(message.parameters).length > 0);
|
|
8
9
|
let isExpanded = $derived(message.showDetails ||
|
|
9
10
|
(message.isStreamingArguments && hasParameters) ||
|
|
10
11
|
(message.isLoading && message.needsConfirmation));
|
|
12
|
+
const visibleActions = $derived(message.actions && !message.isLoading && !message.error && !message.needsConfirmation
|
|
13
|
+
? message.actions
|
|
14
|
+
: []);
|
|
11
15
|
</script>
|
|
12
16
|
|
|
13
17
|
<div
|
|
@@ -102,12 +106,16 @@ let isExpanded = $derived(message.showDetails ||
|
|
|
102
106
|
showWhileLoading={false}
|
|
103
107
|
/>
|
|
104
108
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
109
|
+
{#if visibleActions.length > 0}
|
|
110
|
+
<ToolMessageActions actions={visibleActions} />
|
|
111
|
+
{:else}
|
|
112
|
+
<ToolContentDisplay
|
|
113
|
+
title="Result"
|
|
114
|
+
content={message.result}
|
|
115
|
+
error={message.error}
|
|
116
|
+
loading={message.isLoading}
|
|
117
|
+
/>
|
|
118
|
+
{/if}
|
|
111
119
|
{/if}
|
|
112
120
|
</div>
|
|
113
121
|
{/if}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
<script lang="ts">import { Button } from '../../common';
|
|
2
|
+
import { Calendar, Database, Route, SquarePen, Unplug, Webhook } from 'lucide-svelte';
|
|
3
|
+
import AwsIcon from '../../icons/AwsIcon.svelte';
|
|
4
|
+
import AzureIcon from '../../icons/AzureIcon.svelte';
|
|
5
|
+
import GoogleCloudIcon from '../../icons/GoogleCloudIcon.svelte';
|
|
6
|
+
import KafkaIcon from '../../icons/KafkaIcon.svelte';
|
|
7
|
+
import MqttIcon from '../../icons/MqttIcon.svelte';
|
|
8
|
+
import NatsIcon from '../../icons/NatsIcon.svelte';
|
|
9
|
+
import { runToolDisplayAction } from './createdResourceActions.svelte';
|
|
10
|
+
let { actions } = $props();
|
|
11
|
+
let runningActionId = $state(undefined);
|
|
12
|
+
const actionCardConfigs = {
|
|
13
|
+
schedule: { title: 'Schedule', icon: Calendar },
|
|
14
|
+
http: { title: 'HTTP trigger', icon: Route },
|
|
15
|
+
websocket: { title: 'WebSocket trigger', icon: Unplug },
|
|
16
|
+
postgres: { title: 'Postgres trigger', icon: Database },
|
|
17
|
+
kafka: { title: 'Kafka trigger', icon: KafkaIcon },
|
|
18
|
+
nats: { title: 'NATS trigger', icon: NatsIcon },
|
|
19
|
+
mqtt: { title: 'MQTT trigger', icon: MqttIcon },
|
|
20
|
+
sqs: { title: 'SQS trigger', icon: AwsIcon },
|
|
21
|
+
gcp: { title: 'GCP Pub/Sub trigger', icon: GoogleCloudIcon },
|
|
22
|
+
azure: { title: 'Azure Event Grid trigger', icon: AzureIcon }
|
|
23
|
+
};
|
|
24
|
+
function getActionCardConfig(action) {
|
|
25
|
+
const key = action.resource === 'schedule' ? 'schedule' : action.triggerKind;
|
|
26
|
+
return key
|
|
27
|
+
? actionCardConfigs[key]
|
|
28
|
+
: { title: action.label.replace(/^Open\s+/i, ''), icon: Webhook };
|
|
29
|
+
}
|
|
30
|
+
async function handleAction(action) {
|
|
31
|
+
if (runningActionId) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
runningActionId = action.id;
|
|
35
|
+
try {
|
|
36
|
+
await runToolDisplayAction(action);
|
|
37
|
+
}
|
|
38
|
+
finally {
|
|
39
|
+
runningActionId = undefined;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
</script>
|
|
43
|
+
|
|
44
|
+
{#if actions.length > 0}
|
|
45
|
+
<div class="space-y-2">
|
|
46
|
+
{#each actions as action (action.id)}
|
|
47
|
+
{@const card = getActionCardConfig(action)}
|
|
48
|
+
{@const Icon = card.icon}
|
|
49
|
+
<div class="flex items-center gap-3 rounded-md border !border-green-500/40 bg-surface p-3">
|
|
50
|
+
<div
|
|
51
|
+
class="flex h-10 w-10 shrink-0 items-center justify-center rounded-md bg-blue-50 text-blue-600 dark:bg-blue-500/10 dark:text-blue-300"
|
|
52
|
+
>
|
|
53
|
+
<Icon class="h-5 w-5" />
|
|
54
|
+
</div>
|
|
55
|
+
<div class="min-w-0 flex-1">
|
|
56
|
+
<div class="truncate text-xs font-semibold text-primary">{card.title}</div>
|
|
57
|
+
<div class="truncate text-2xs text-secondary">{action.path}</div>
|
|
58
|
+
</div>
|
|
59
|
+
<Button
|
|
60
|
+
size="xs"
|
|
61
|
+
variant="default"
|
|
62
|
+
title={action.label}
|
|
63
|
+
loading={runningActionId === action.id}
|
|
64
|
+
disabled={runningActionId !== undefined && runningActionId !== action.id}
|
|
65
|
+
startIcon={{ icon: SquarePen }}
|
|
66
|
+
onClick={() => handleAction(action)}
|
|
67
|
+
>
|
|
68
|
+
Open
|
|
69
|
+
</Button>
|
|
70
|
+
</div>
|
|
71
|
+
{/each}
|
|
72
|
+
</div>
|
|
73
|
+
{/if}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ToolDisplayAction } from './shared';
|
|
2
|
+
interface Props {
|
|
3
|
+
actions: ToolDisplayAction[];
|
|
4
|
+
}
|
|
5
|
+
declare const ToolMessageActions: import("svelte").Component<Props, {}, "">;
|
|
6
|
+
type ToolMessageActions = ReturnType<typeof ToolMessageActions>;
|
|
7
|
+
export default ToolMessageActions;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { ToolDisplayAction } from './shared';
|
|
2
|
+
type MaybePromise<T> = T | Promise<T>;
|
|
3
|
+
type ToolDisplayActionHandler = (action: ToolDisplayAction) => MaybePromise<void>;
|
|
4
|
+
export declare function registerToolDisplayActionHandler(type: ToolDisplayAction['type'], handler: ToolDisplayActionHandler): () => void;
|
|
5
|
+
export declare function runToolDisplayAction(action: ToolDisplayAction): Promise<void>;
|
|
6
|
+
export {};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { sendUserToast } from '../../../toast';
|
|
2
|
+
const toolDisplayActionHandlers = $state({});
|
|
3
|
+
function formatUnknownError(error) {
|
|
4
|
+
if (error instanceof Error) {
|
|
5
|
+
return error.message;
|
|
6
|
+
}
|
|
7
|
+
return String(error);
|
|
8
|
+
}
|
|
9
|
+
export function registerToolDisplayActionHandler(type, handler) {
|
|
10
|
+
toolDisplayActionHandlers[type] = handler;
|
|
11
|
+
return () => {
|
|
12
|
+
if (toolDisplayActionHandlers[type] === handler) {
|
|
13
|
+
delete toolDisplayActionHandlers[type];
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export async function runToolDisplayAction(action) {
|
|
18
|
+
const handler = toolDisplayActionHandlers[action.type];
|
|
19
|
+
if (!handler) {
|
|
20
|
+
sendUserToast('This action is not available right now.', true);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
await handler(action);
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
sendUserToast(`Could not run action "${action.label}": ${formatUnknownError(error)}`, true);
|
|
28
|
+
}
|
|
29
|
+
}
|