windmill-components 1.695.0 → 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.
Files changed (157) hide show
  1. package/dist/sharedUtils/assets/tokens/colorTokensConfig.d.ts +2 -0
  2. package/dist/sharedUtils/base.d.ts +1 -0
  3. package/dist/sharedUtils/cloud.d.ts +1 -0
  4. package/dist/sharedUtils/common.d.ts +111 -0
  5. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/count.d.ts +5 -0
  6. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/delete.d.ts +5 -0
  7. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/insert.d.ts +5 -0
  8. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/select.d.ts +13 -0
  9. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/update.d.ts +11 -0
  10. package/dist/sharedUtils/components/apps/components/display/dbtable/utils.d.ts +95 -0
  11. package/dist/sharedUtils/components/apps/editor/appPolicy.d.ts +6 -0
  12. package/dist/sharedUtils/components/apps/editor/appUtilsCore.d.ts +7 -0
  13. package/dist/sharedUtils/components/apps/editor/appUtilsS3.d.ts +33 -0
  14. package/dist/sharedUtils/components/apps/editor/commonAppUtils.d.ts +10 -0
  15. package/dist/sharedUtils/components/apps/editor/component/components.d.ts +5371 -0
  16. package/dist/sharedUtils/components/apps/editor/component/default-codes.d.ts +3 -0
  17. package/dist/sharedUtils/components/apps/editor/component/index.d.ts +3 -0
  18. package/dist/sharedUtils/components/apps/editor/component/sets.d.ts +7 -0
  19. package/dist/sharedUtils/components/apps/editor/componentsPanel/componentDefaultProps.d.ts +3 -0
  20. package/dist/sharedUtils/components/apps/gridUtils.d.ts +14 -0
  21. package/dist/sharedUtils/components/apps/inputType.d.ts +178 -0
  22. package/dist/sharedUtils/components/apps/rx.d.ts +29 -0
  23. package/dist/sharedUtils/components/apps/sharedTypes.d.ts +21 -0
  24. package/dist/sharedUtils/components/apps/types.d.ts +274 -0
  25. package/dist/sharedUtils/components/assets/lib.d.ts +25 -0
  26. package/dist/sharedUtils/components/common/alert/model.d.ts +2 -0
  27. package/dist/sharedUtils/components/common/badge/model.d.ts +8 -0
  28. package/dist/sharedUtils/components/common/button/model.d.ts +45 -0
  29. package/dist/sharedUtils/components/common/fileInput/model.d.ts +1 -0
  30. package/dist/sharedUtils/components/common/index.d.ts +24 -0
  31. package/dist/sharedUtils/components/common/skeleton/model.d.ts +21 -0
  32. package/dist/sharedUtils/components/dbTypes.d.ts +14 -0
  33. package/dist/sharedUtils/components/diff_drawer.d.ts +26 -0
  34. package/dist/sharedUtils/components/ducklake.d.ts +1 -0
  35. package/dist/sharedUtils/components/flows/scheduleUtils.d.ts +7 -0
  36. package/dist/sharedUtils/components/icons/index.d.ts +101 -0
  37. package/dist/sharedUtils/components/random_positive_adjetive.d.ts +1 -0
  38. package/dist/sharedUtils/components/raw_apps/rawAppPolicy.d.ts +10 -0
  39. package/dist/sharedUtils/components/raw_apps/utils.d.ts +15 -0
  40. package/dist/sharedUtils/components/triggers/email/utils.d.ts +4 -0
  41. package/dist/sharedUtils/components/triggers/gcp/utils.d.ts +2 -0
  42. package/dist/sharedUtils/components/triggers/http/utils.d.ts +11 -0
  43. package/dist/sharedUtils/components/triggers/kafka/utils.d.ts +2 -0
  44. package/dist/sharedUtils/components/triggers/mqtt/utils.d.ts +2 -0
  45. package/dist/sharedUtils/components/triggers/nats/utils.d.ts +2 -0
  46. package/dist/sharedUtils/components/triggers/postgres/utils.d.ts +8 -0
  47. package/dist/sharedUtils/components/triggers/sqs/utils.d.ts +2 -0
  48. package/dist/sharedUtils/components/triggers/triggers.svelte.d.ts +32 -0
  49. package/dist/sharedUtils/components/triggers/utils.d.ts +80 -0
  50. package/dist/sharedUtils/components/triggers/websocket/utils.d.ts +2 -0
  51. package/dist/sharedUtils/components/triggers.d.ts +20 -0
  52. package/dist/sharedUtils/gen/core/ApiError.d.ts +10 -0
  53. package/dist/sharedUtils/gen/core/ApiRequestOptions.d.ts +13 -0
  54. package/dist/sharedUtils/gen/core/ApiResult.d.ts +7 -0
  55. package/dist/sharedUtils/gen/core/CancelablePromise.d.ts +26 -0
  56. package/dist/sharedUtils/gen/core/OpenAPI.d.ts +27 -0
  57. package/dist/sharedUtils/gen/core/request.d.ts +29 -0
  58. package/dist/sharedUtils/gen/index.d.ts +6 -0
  59. package/dist/sharedUtils/gen/schemas.gen.d.ts +7036 -0
  60. package/dist/sharedUtils/gen/services.gen.d.ts +6047 -0
  61. package/dist/sharedUtils/gen/types.gen.d.ts +21881 -0
  62. package/dist/sharedUtils/history.svelte.d.ts +9 -0
  63. package/dist/sharedUtils/hub.d.ts +49 -0
  64. package/dist/sharedUtils/jsr.json +6 -0
  65. package/dist/sharedUtils/lib.d.ts +5 -0
  66. package/dist/sharedUtils/lib.es.js +1588 -0
  67. package/dist/sharedUtils/package.json +12 -0
  68. package/dist/sharedUtils/schema.d.ts +3 -0
  69. package/dist/sharedUtils/stores.d.ts +97 -0
  70. package/dist/sharedUtils/svelte5Utils.svelte.d.ts +80 -0
  71. package/dist/sharedUtils/toast.d.ts +8 -0
  72. package/dist/sharedUtils/utils.d.ts +265 -0
  73. package/package/components/AppConnectInner.svelte +38 -5
  74. package/package/components/CompareWorkspaces.svelte +142 -486
  75. package/package/components/Editor.svelte +5 -4
  76. package/package/components/Editor.svelte.d.ts +1 -0
  77. package/package/components/FilterSearchbar.svelte +3 -1
  78. package/package/components/FilterSearchbar.svelte.d.ts +1 -0
  79. package/package/components/ForkWorkspaceBanner.svelte +16 -0
  80. package/package/components/LogViewer.svelte +51 -60
  81. package/package/components/OnBehalfOfSelector.svelte +10 -7
  82. package/package/components/ResourceEditor.svelte +198 -311
  83. package/package/components/ResourceEditor.svelte.d.ts +3 -3
  84. package/package/components/ResourceEditorDrawer.svelte +17 -6
  85. package/package/components/ResourceForm.svelte +235 -0
  86. package/package/components/ResourceForm.svelte.d.ts +25 -0
  87. package/package/components/RunsPage.svelte +1 -0
  88. package/package/components/ScriptBuilder.svelte +1 -0
  89. package/package/components/ScriptEditor.svelte +10 -3
  90. package/package/components/ScriptEditor.svelte.d.ts +1 -0
  91. package/package/components/TaggedTextInput.svelte +4 -1
  92. package/package/components/TaggedTextInput.svelte.d.ts +2 -0
  93. package/package/components/VariableEditor.svelte +177 -199
  94. package/package/components/VariableEditor.svelte.d.ts +1 -2
  95. package/package/components/VariableForm.svelte +133 -0
  96. package/package/components/VariableForm.svelte.d.ts +22 -0
  97. package/package/components/WsSpecificVersions.svelte +39 -0
  98. package/package/components/WsSpecificVersions.svelte.d.ts +9 -0
  99. package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +0 -1
  100. package/package/components/apps/editor/AppEditorHeaderDeploy.svelte.d.ts +1 -1
  101. package/package/components/common/table/AppRow.svelte +2 -1
  102. package/package/components/common/table/AppRow.svelte.d.ts +1 -0
  103. package/package/components/common/table/FlowRow.svelte +2 -1
  104. package/package/components/common/table/FlowRow.svelte.d.ts +1 -0
  105. package/package/components/common/table/RawAppRow.svelte +2 -1
  106. package/package/components/common/table/RawAppRow.svelte.d.ts +1 -0
  107. package/package/components/common/table/Row.svelte +11 -3
  108. package/package/components/common/table/Row.svelte.d.ts +2 -1
  109. package/package/components/common/table/RowIcon.svelte +18 -2
  110. package/package/components/common/table/RowIcon.svelte.d.ts +1 -1
  111. package/package/components/common/table/ScriptRow.svelte +2 -1
  112. package/package/components/common/table/ScriptRow.svelte.d.ts +1 -0
  113. package/package/components/copilot/autocomplete/Autocompletor.d.ts +3 -1
  114. package/package/components/copilot/autocomplete/Autocompletor.js +5 -2
  115. package/package/components/copilot/autocomplete/request.d.ts +1 -0
  116. package/package/components/copilot/autocomplete/request.js +1 -1
  117. package/package/components/copilot/chat/AIChatManager.svelte.js +14 -4
  118. package/package/components/copilot/chat/AiChatLayout.svelte +2 -0
  119. package/package/components/copilot/chat/ContextManager.svelte.d.ts +1 -0
  120. package/package/components/copilot/chat/CreatedResourceActionDrawers.svelte +129 -0
  121. package/package/components/copilot/chat/CreatedResourceActionDrawers.svelte.d.ts +4 -0
  122. package/package/components/copilot/chat/ToolExecutionDisplay.svelte +14 -6
  123. package/package/components/copilot/chat/ToolMessageActions.svelte +73 -0
  124. package/package/components/copilot/chat/ToolMessageActions.svelte.d.ts +7 -0
  125. package/package/components/copilot/chat/createdResourceActions.svelte.d.ts +6 -0
  126. package/package/components/copilot/chat/createdResourceActions.svelte.js +29 -0
  127. package/package/components/copilot/chat/script/core.d.ts +6 -2
  128. package/package/components/copilot/chat/script/core.js +13 -7
  129. package/package/components/copilot/chat/script/wacPrompt.test.d.ts +1 -0
  130. package/package/components/copilot/chat/script/wacPrompt.test.js +25 -0
  131. package/package/components/copilot/chat/shared.d.ts +12 -0
  132. package/package/components/copilot/chat/shared.test.js +23 -2
  133. package/package/components/copilot/chat/workspaceTools.js +34 -4
  134. package/package/components/flows/content/ScriptEditorDrawer.svelte +1 -0
  135. package/package/components/graph/wacToFlow.js +1 -1
  136. package/package/components/graph/wacToFlow.test.d.ts +1 -0
  137. package/package/components/graph/wacToFlow.test.js +17 -0
  138. package/package/components/home/Item.svelte +5 -1
  139. package/package/components/home/Item.svelte.d.ts +1 -0
  140. package/package/components/home/ItemsList.svelte +260 -3
  141. package/package/components/instanceSettings/SecretBackendConfig.svelte +457 -88
  142. package/package/components/runs/useJobsLoader.svelte.js +5 -11
  143. package/package/components/sidebar/WorkspaceMenu.svelte +19 -5
  144. package/package/externalDomain.d.ts +2 -0
  145. package/package/externalDomain.js +16 -0
  146. package/package/gen/core/OpenAPI.js +1 -1
  147. package/package/gen/types.gen.d.ts +0 -112
  148. package/package/hubPaths.json +2 -2
  149. package/package/system_prompts/index.d.ts +1 -1
  150. package/package/system_prompts/index.js +22 -3
  151. package/package/system_prompts/prompts.d.ts +2 -2
  152. package/package/system_prompts/prompts.js +6 -3
  153. package/package/utils_deployable.d.ts +162 -638
  154. package/package/utils_deployable.js +75 -143
  155. package/package/utils_workspace_deploy.d.ts +10 -4
  156. package/package/utils_workspace_deploy.js +167 -42
  157. 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
- // Use triggerKind if kind is 'trigger' and triggerKind is provided
10
- let effectiveKind = $derived(kind === 'trigger' && triggerKind ? triggerKind : kind);
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;
@@ -6,4 +6,5 @@ export declare function autocompleteRequest(context: {
6
6
  scriptLang: ScriptLang | 'bunnative' | 'jsx' | 'tsx' | 'json';
7
7
  markers: editor.IMarker[];
8
8
  libraries: string;
9
+ workflowAsCode?: boolean;
9
10
  }, abortController: AbortController): Promise<string | undefined>;
@@ -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, { lang: options.lang });
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, { lang: options.lang });
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
@@ -13,6 +13,7 @@ export interface ScriptOptions {
13
13
  lastSavedCode?: string;
14
14
  lastDeployedCode?: string;
15
15
  diffMode: boolean;
16
+ workflowAsCode?: boolean;
16
17
  }
17
18
  export interface FlowOptions {
18
19
  currentFlow: ExtendedOpenFlow;
@@ -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>
@@ -0,0 +1,4 @@
1
+ import type { Component } from 'svelte';
2
+ declare const CreatedResourceActionDrawers: Component<Record<string, never>, {}, "">;
3
+ type CreatedResourceActionDrawers = ReturnType<typeof CreatedResourceActionDrawers>;
4
+ export default CreatedResourceActionDrawers;
@@ -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
- <ToolContentDisplay
106
- title="Result"
107
- content={message.result}
108
- error={message.error}
109
- loading={message.isLoading}
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
+ }