windmill-components 1.531.1 → 1.537.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.
Files changed (153) hide show
  1. package/package/components/ArgInput.svelte +69 -19
  2. package/package/components/Auth0Setting.svelte +8 -3
  3. package/package/components/Dev.svelte +5 -4
  4. package/package/components/DiffDrawer.svelte +2 -2
  5. package/package/components/DiffEditor.svelte +34 -37
  6. package/package/components/DiffEditor.svelte.d.ts +23 -39
  7. package/package/components/EditableSchemaForm.svelte +67 -67
  8. package/package/components/EditableSchemaForm.svelte.d.ts +3 -3
  9. package/package/components/Editor.svelte +32 -11
  10. package/package/components/Editor.svelte.d.ts +6 -0
  11. package/package/components/EditorBar.svelte +2 -2
  12. package/package/components/EditorBar.svelte.d.ts +1 -0
  13. package/package/components/FieldHeader.svelte +1 -1
  14. package/package/components/FlowBuilder.svelte +7 -4
  15. package/package/components/FlowPreviewContent.svelte +3 -3
  16. package/package/components/FlowStatusViewer.svelte +28 -0
  17. package/package/components/FlowStatusViewerInner.svelte +72 -20
  18. package/package/components/FlowStatusViewerInner.svelte.d.ts +7 -0
  19. package/package/components/ModulePreview.svelte +2 -1
  20. package/package/components/ModulePreview.svelte.d.ts +1 -0
  21. package/package/components/ModulePreviewForm.svelte +72 -65
  22. package/package/components/ModulePreviewResultViewer.svelte +13 -18
  23. package/package/components/ModuleTest.svelte +10 -6
  24. package/package/components/ModuleTest.svelte.d.ts +1 -0
  25. package/package/components/OktaSetting.svelte +8 -3
  26. package/package/components/Portal.svelte +11 -7
  27. package/package/components/Portal.svelte.d.ts +19 -39
  28. package/package/components/ResourceEditor.svelte +4 -0
  29. package/package/components/RunForm.svelte +2 -2
  30. package/package/components/RunForm.svelte.d.ts +1 -1
  31. package/package/components/RunFormAdvancedPopup.svelte +13 -1
  32. package/package/components/SchemaForm.svelte +1 -2
  33. package/package/components/ScriptBuilder.svelte +1 -1
  34. package/package/components/ScriptEditor.svelte +22 -7
  35. package/package/components/SimpleEditor.svelte +0 -1
  36. package/package/components/StringTypeNarrowing.svelte.d.ts +1 -1
  37. package/package/components/apps/components/layout/AppModal.svelte +2 -2
  38. package/package/components/apps/editor/component/ComponentNavigation.svelte +3 -2
  39. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte +1 -1
  40. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte +0 -1
  41. package/package/components/apps/editor/settingsPanel/ArrayStaticInputEditor.svelte +3 -1
  42. package/package/components/apps/editor/settingsPanel/GridCondition.svelte +3 -1
  43. package/package/components/apps/editor/settingsPanel/GridNavbar.svelte +3 -1
  44. package/package/components/apps/editor/settingsPanel/GridTab.svelte +3 -1
  45. package/package/components/apps/editor/settingsPanel/OneOfInputSpecsEditor.svelte +55 -53
  46. package/package/components/apps/editor/settingsPanel/TableActions.svelte +3 -1
  47. package/package/components/common/button/model.d.ts +1 -1
  48. package/package/components/common/drawer/Disposable.svelte +51 -30
  49. package/package/components/common/drawer/Disposable.svelte.d.ts +12 -44
  50. package/package/components/common/drawer/Drawer.svelte +15 -11
  51. package/package/components/copilot/FlowInlineScriptAIButton.svelte +4 -2
  52. package/package/components/copilot/FlowInlineScriptAIButton.svelte.d.ts +4 -1
  53. package/package/components/copilot/MetadataGen.svelte +14 -3
  54. package/package/components/copilot/autocomplete/Autocompletor.js +0 -2
  55. package/package/components/copilot/chat/AIChat.svelte +2 -4
  56. package/package/components/copilot/chat/AIChatInput.svelte +3 -3
  57. package/package/components/copilot/chat/AIChatManager.svelte.js +24 -12
  58. package/package/components/copilot/chat/AvailableContextList.svelte +243 -26
  59. package/package/components/copilot/chat/AvailableContextList.svelte.d.ts +2 -1
  60. package/package/components/copilot/chat/ContextElementBadge.svelte +31 -15
  61. package/package/components/copilot/chat/ContextElementBadge.svelte.d.ts +5 -20
  62. package/package/components/copilot/chat/ContextManager.svelte.d.ts +15 -2
  63. package/package/components/copilot/chat/ContextManager.svelte.js +134 -24
  64. package/package/components/copilot/chat/ContextTextarea.svelte +22 -49
  65. package/package/components/copilot/chat/ToolContentDisplay.svelte +10 -1
  66. package/package/components/copilot/chat/ToolExecutionDisplay.svelte +3 -3
  67. package/package/components/copilot/chat/context.d.ts +19 -1
  68. package/package/components/copilot/chat/context.js +1 -0
  69. package/package/components/copilot/chat/flow/FlowAIChat.svelte +109 -7
  70. package/package/components/copilot/chat/flow/core.d.ts +13 -1
  71. package/package/components/copilot/chat/flow/core.js +171 -19
  72. package/package/components/copilot/chat/flow/uiIntents.d.ts +8 -0
  73. package/package/components/copilot/chat/flow/uiIntents.js +5 -0
  74. package/package/components/copilot/chat/flow/useUiIntent.d.ts +5 -0
  75. package/package/components/copilot/chat/flow/useUiIntent.js +12 -0
  76. package/package/components/copilot/chat/monaco-adapter.d.ts +22 -4
  77. package/package/components/copilot/chat/monaco-adapter.js +55 -16
  78. package/package/components/copilot/chat/script/core.d.ts +2 -2
  79. package/package/components/copilot/chat/script/core.js +54 -124
  80. package/package/components/copilot/chat/shared.d.ts +14 -2
  81. package/package/components/copilot/chat/shared.js +170 -7
  82. package/package/components/copilot/lib.js +12 -7
  83. package/package/components/copilot/shared.d.ts +1 -1
  84. package/package/components/copilot/shared.js +16 -10
  85. package/package/components/flows/FlowEditor.svelte +15 -1
  86. package/package/components/flows/FlowEditor.svelte.d.ts +1 -0
  87. package/package/components/flows/FlowModuleIcon.svelte +39 -0
  88. package/package/components/flows/FlowModuleIcon.svelte.d.ts +10 -0
  89. package/package/components/flows/common/FlowCardHeader.svelte +4 -1
  90. package/package/components/flows/content/FlowBranchesAllWrapper.svelte +6 -0
  91. package/package/components/flows/content/FlowBranchesOneWrapper.svelte +6 -0
  92. package/package/components/flows/content/FlowEditorPanel.svelte +2 -1
  93. package/package/components/flows/content/FlowEditorPanel.svelte.d.ts +1 -0
  94. package/package/components/flows/content/FlowInput.svelte +31 -34
  95. package/package/components/flows/content/FlowInput.svelte.d.ts +1 -0
  96. package/package/components/flows/content/FlowLoop.svelte +7 -0
  97. package/package/components/flows/content/FlowModuleComponent.svelte +39 -44
  98. package/package/components/flows/content/FlowModuleScript.svelte +1 -1
  99. package/package/components/flows/content/FlowModuleSuspend.svelte +16 -18
  100. package/package/components/flows/content/FlowWhileLoop.svelte +6 -0
  101. package/package/components/flows/content/ScriptEditorDrawer.svelte +9 -11
  102. package/package/components/flows/dfs.d.ts +1 -1
  103. package/package/components/flows/dfs.js +6 -6
  104. package/package/components/flows/flowInfers.js +7 -7
  105. package/package/components/flows/flowStateUtils.svelte.js +1 -2
  106. package/package/components/flows/map/FlowModuleSchemaItem.svelte +12 -26
  107. package/package/components/flows/map/MapItem.svelte +12 -39
  108. package/package/components/flows/map/VirtualItem.svelte +1 -1
  109. package/package/components/flows/pickers/TopLevelNode.svelte +1 -1
  110. package/package/components/flows/propPicker/InputPickerInner.svelte +5 -5
  111. package/package/components/flows/propPicker/OutputPickerInner.svelte +143 -118
  112. package/package/components/flows/propPicker/OutputPickerInner.svelte.d.ts +7 -16
  113. package/package/components/flows/{testSteps.svelte.d.ts → stepsInputArgs.svelte.d.ts} +2 -1
  114. package/package/components/flows/{testSteps.svelte.js → stepsInputArgs.svelte.js} +15 -3
  115. package/package/components/flows/types.d.ts +16 -3
  116. package/package/components/flows/utils.js +3 -0
  117. package/package/components/graph/FlowGraphV2.svelte +1 -1
  118. package/package/components/graph/renderers/nodes/AIToolNode.svelte +4 -4
  119. package/package/components/graph/renderers/nodes/NewAIToolNode.svelte +71 -54
  120. package/package/components/propertyPicker/ObjectViewer.svelte +11 -3
  121. package/package/components/raw_apps/RawAppInlineScriptEditor.svelte +1 -1
  122. package/package/components/schema/AddPropertyV2.svelte +2 -7
  123. package/package/components/schema/AddPropertyV2.svelte.d.ts +3 -20
  124. package/package/components/schema/EditableSchemaDrawer.svelte +109 -115
  125. package/package/components/schema/EditableSchemaDrawer.svelte.d.ts +2 -1
  126. package/package/components/schema/EditableSchemaSdkWrapper.svelte +16 -3
  127. package/package/components/schema/EditableSchemaSdkWrapper.svelte.d.ts +4 -1
  128. package/package/components/schema/EditableSchemaWrapper.svelte +3 -10
  129. package/package/components/schema/FlowPropertyEditor.svelte +83 -57
  130. package/package/components/schema/FlowPropertyEditor.svelte.d.ts +1 -1
  131. package/package/components/schema/PropertyEditor.svelte.d.ts +1 -1
  132. package/package/components/schema/SchemaFormDND.svelte +11 -10
  133. package/package/components/schema/SchemaFormDND.svelte.d.ts +3 -2
  134. package/package/components/schema/editable_schema_wrapper.d.ts +0 -3
  135. package/package/components/schema/jsonSchemaResource.svelte.d.ts +2 -0
  136. package/package/components/schema/jsonSchemaResource.svelte.js +40 -0
  137. package/package/components/settings/PremiumInfo.svelte +7 -2
  138. package/package/components/triggers/CaptureWrapper.svelte +2 -13
  139. package/package/components/triggers/CaptureWrapper.svelte.d.ts +1 -1
  140. package/package/components/triggers/TriggersWrapper.svelte +1 -0
  141. package/package/components/triggers/http/RouteEditorInner.svelte +1 -1
  142. package/package/components/triggers/nats/NatsTriggerEditorInner.svelte +23 -20
  143. package/package/components/triggers/nats/NatsTriggersConfigSection.svelte +15 -27
  144. package/package/components/triggers/nats/NatsTriggersConfigSection.svelte.d.ts +7 -5
  145. package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +16 -16
  146. package/package/hubPaths.json +3 -1
  147. package/package/script_helpers.d.ts +2 -2
  148. package/package/script_helpers.js +2 -0
  149. package/package/stores.d.ts +1 -0
  150. package/package/stores.js +8 -1
  151. package/package/utils.d.ts +1 -1
  152. package/package.json +14 -14
  153. package/package/components/ModulePreviewResultViewer.svelte.d.ts +0 -28
@@ -1,52 +1,20 @@
1
- export declare let openedDrawers: string[];
2
- 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> {
3
- new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
4
- $$bindings?: Bindings;
5
- } & Exports;
6
- (internal: unknown, props: Props & {
7
- $$events?: Events;
8
- $$slots?: Slots;
9
- }): Exports & {
10
- $set?: any;
11
- $on?: any;
12
- };
13
- z_$$bindings?: Bindings;
14
- }
15
- type $$__sveltets_2_PropsWithChildren<Props, Slots> = Props & (Slots extends {
16
- default: any;
17
- } ? Props extends Record<string, never> ? any : {
18
- children?: any;
19
- } : {});
20
- declare const Disposable: $$__sveltets_2_IsomorphicComponent<$$__sveltets_2_PropsWithChildren<{
1
+ export declare let openedDrawers: {
2
+ val: string[];
3
+ };
4
+ interface Props {
21
5
  open?: boolean;
22
- id?: string;
6
+ id?: any;
23
7
  preventEscape?: boolean;
24
8
  initialOffset?: number;
25
- toggleDrawer?: () => void;
26
- openDrawer?: () => void;
27
- closeDrawer?: () => void;
28
- isOpen?: () => boolean;
29
- }, {
30
- default: {
31
- handleClickAway: (e: any) => void;
32
- zIndex: number;
33
- closeDrawer: () => void;
34
- open: boolean;
35
- };
36
- }>, {
37
- [evt: string]: CustomEvent<any>;
38
- }, {
39
- default: {
40
- handleClickAway: (e: any) => void;
41
- zIndex: number;
42
- closeDrawer: () => void;
43
- open: boolean;
44
- };
45
- }, {
9
+ children?: import('svelte').Snippet<[any]>;
10
+ onOpen?: () => void;
11
+ onClose?: () => void;
12
+ }
13
+ declare const Disposable: import("svelte").Component<Props, {
46
14
  toggleDrawer: () => void;
47
15
  openDrawer: () => void;
48
16
  closeDrawer: () => void;
49
17
  isOpen: () => boolean;
50
- }, string>;
51
- type Disposable = InstanceType<typeof Disposable>;
18
+ }, "open">;
19
+ type Disposable = ReturnType<typeof Disposable>;
52
20
  export default Disposable;
@@ -1,9 +1,9 @@
1
- <script lang="ts">import { onMount, createEventDispatcher } from 'svelte';
1
+ <script lang="ts">import { onMount, createEventDispatcher, untrack } from 'svelte';
2
2
  import { BROWSER } from 'esm-env';
3
3
  import Disposable from './Disposable.svelte';
4
4
  import ConditionalPortal from './ConditionalPortal.svelte';
5
5
  import { chatState } from '../../copilot/chat/sharedChatState.svelte';
6
- let { open = $bindable(undefined), duration = 0.3, placement = 'right', size = '600px', alwaysOpen = false, shouldUsePortal = true, offset = 0, preventEscape = false, disableChatOffset = false, class: clazz = '', positionClass = undefined, children } = $props();
6
+ let { open = $bindable(undefined), duration = 0.3, placement = 'right', size = '600px', alwaysOpen = false, shouldUsePortal = true, offset = 0, preventEscape = false, disableChatOffset = false, class: clazz = '', positionClass = undefined, children: children_render } = $props();
7
7
  if (open === undefined) {
8
8
  open = false;
9
9
  }
@@ -16,10 +16,12 @@ export function openDrawer() {
16
16
  disposable?.openDrawer();
17
17
  }
18
18
  export function closeDrawer() {
19
+ if (open) {
20
+ setTimeout(() => {
21
+ dispatch('afterClose');
22
+ }, durationMs);
23
+ }
19
24
  disposable?.closeDrawer();
20
- setTimeout(() => {
21
- dispatch('afterClose');
22
- }, durationMs);
23
25
  }
24
26
  export function isOpen() {
25
27
  return open;
@@ -39,7 +41,10 @@ $effect(() => {
39
41
  scrollLock(open ?? false);
40
42
  });
41
43
  $effect(() => {
42
- open ? openDrawer() : closeDrawer();
44
+ open;
45
+ untrack(() => {
46
+ open ? openDrawer() : closeDrawer();
47
+ });
43
48
  });
44
49
  let timeout = $state(true);
45
50
  $effect(() => {
@@ -48,7 +53,6 @@ $effect(() => {
48
53
  onMount(() => {
49
54
  mounted = true;
50
55
  });
51
- const children_render = $derived(children);
52
56
  const aiChatOpen = $derived(chatState.size > 0);
53
57
  </script>
54
58
 
@@ -57,11 +61,11 @@ const aiChatOpen = $derived(chatState.size > 0);
57
61
  initialOffset={offset}
58
62
  bind:open
59
63
  bind:this={disposable}
60
- on:open
61
- on:close
64
+ onOpen={() => dispatch('open')}
65
+ onClose={() => dispatch('close')}
62
66
  {preventEscape}
63
67
  >
64
- {#snippet children({ handleClickAway, zIndex })}
68
+ {#snippet children({ handleClickAway, zIndex, isTop })}
65
69
  <aside
66
70
  class="drawer windmill-app windmill-drawer {clazz ?? ''} {positionClass ?? ''} {aiChatOpen
67
71
  ? 'respect-global-chat'
@@ -76,7 +80,7 @@ const aiChatOpen = $derived(chatState.size > 0);
76
80
  <div class="overlay {positionClass ?? ''}" onclick={handleClickAway}></div>
77
81
  <div class="panel {placement} {positionClass}" class:size>
78
82
  {#if open || !timeout || alwaysOpen}
79
- {@render children_render?.({ open })}
83
+ {@render children_render?.({ open, isTop })}
80
84
  {/if}
81
85
  </div>
82
86
  </aside>
@@ -6,6 +6,7 @@ import { ExternalLink, WandSparkles } from 'lucide-svelte';
6
6
  import { base } from '../../base';
7
7
  import { twMerge } from 'tailwind-merge';
8
8
  import { aiChatManager, AIMode } from './chat/AIChatManager.svelte';
9
+ const { moduleId } = $props();
9
10
  const aiChatScriptModeClasses = $derived(aiChatManager.mode === AIMode.SCRIPT && aiChatManager.isOpen
10
11
  ? 'dark:bg-violet-900 bg-violet-100'
11
12
  : '');
@@ -18,7 +19,7 @@ const aiChatScriptModeClasses = $derived(aiChatManager.mode === AIMode.SCRIPT &&
18
19
  btnClasses={twMerge('!px-2', aiChatScriptModeClasses)}
19
20
  {onClick}
20
21
  iconOnly
21
- title="Open AI chat in script mode"
22
+ title="Open AI chat"
22
23
  startIcon={{ icon: WandSparkles, classes: 'text-violet-800 dark:text-violet-400' }}
23
24
  />
24
25
  {/snippet}
@@ -26,7 +27,8 @@ const aiChatScriptModeClasses = $derived(aiChatManager.mode === AIMode.SCRIPT &&
26
27
  {#if $copilotInfo.enabled}
27
28
  {@render button(() => {
28
29
  aiChatManager.openChat()
29
- aiChatManager.changeMode(AIMode.SCRIPT)
30
+ const availableContext = aiChatManager.contextManager.getAvailableContext()
31
+ aiChatManager.contextManager.setSelectedModuleContext(moduleId, availableContext)
30
32
  })}
31
33
  {:else}
32
34
  <Popover
@@ -1,3 +1,6 @@
1
- declare const FlowInlineScriptAiButton: import("svelte").Component<Record<string, never>, {}, "">;
1
+ interface Props {
2
+ moduleId?: string;
3
+ }
4
+ declare const FlowInlineScriptAiButton: import("svelte").Component<Props, {}, "">;
2
5
  type FlowInlineScriptAiButton = ReturnType<typeof FlowInlineScriptAiButton>;
3
6
  export default FlowInlineScriptAiButton;
@@ -16,6 +16,7 @@ const promptConfigs = {
16
16
  You are a helpful AI assistant. You generate very brief summaries from scripts.
17
17
  The summaries need to be as short as possible (maximum 8 words) and only give a global idea. Do not specify the programming language. Do not use any punctation. Avoid using prepositions and articles.
18
18
  Examples: List the commits of a GitHub repository, Divide a number by 16, etc..
19
+ **Return only the summary, no other text.**
19
20
  `,
20
21
  user: `
21
22
  Generate a very short summary for the script below:
@@ -32,6 +33,7 @@ These descriptions are used to explain to other users what the script does and h
32
33
  Be as short as possible to give a global idea, maximum 3-4 sentences.
33
34
  All scripts export an asynchronous function called main, do not include it in the description.
34
35
  Do not describe how to call it either.
36
+ **Return only the description, no other text.**
35
37
  `,
36
38
  user: `
37
39
  Generate a description for the script below:
@@ -45,6 +47,7 @@ Generate a description for the script below:
45
47
  system: `
46
48
  You are a helpful AI assistant. You generate very brief summaries from scripts.
47
49
  The summaries need to be as short as possible (maximum 8 words) and only give a global idea. Do not use any punctation. Avoid using prepositions and articles.
50
+ **Return only the summary, no other text.**
48
51
  `,
49
52
  user: `
50
53
  Summarize the flow below in one very short sentence without punctation:
@@ -57,6 +60,7 @@ You are a helpful AI assistant. You generate descriptions from flow.
57
60
  These descriptions are used to explain to other users what the flow does and how to use it.
58
61
  Be as short as possible to give a global idea, maximum 3-4 sentences.
59
62
  Do not include line breaks.
63
+ **Return only the description, no other text.**
60
64
  `,
61
65
  user: `
62
66
  Generate a description for the flow below:
@@ -65,13 +69,15 @@ Generate a description for the flow below:
65
69
  },
66
70
  agentToolFunctionName: {
67
71
  system: `
68
- You are a helpful AI assistant. You generate function names from scripts.
69
- These function names will be used by an AI agent to call this tool.
72
+ You are a helpful AI assistant. You generate tool names from scripts.
73
+ These tool names will be used by an AI agent to call this tool.
74
+ It has to be based on the script code content not on the main function name.
70
75
  It has to respect the following regex: /[a-zA-Z0-9_]+/
71
76
  Examples: generate_image, classify_image, summarize_text, etc.
77
+ **Return only the tool name, no other text.**
72
78
  `,
73
79
  user: `
74
- Generate a function name for the script below:
80
+ Generate a tool name for the script below:
75
81
  {code}`,
76
82
  placeholderName: 'code'
77
83
  }
@@ -290,6 +296,11 @@ onDestroy(() => {
290
296
  on:focus={() => (focused = true)}
291
297
  on:blur={() => (focused = false)}
292
298
  />
299
+ {#if promptConfigName === 'agentToolFunctionName' && !validateToolName(content ?? '')}
300
+ <div class="text-3xs text-red-400 absolute -bottom-4">
301
+ Invalid tool name, should only contain letters, numbers and underscores
302
+ </div>
303
+ {/if}
293
304
  {/if}
294
305
  <!-- <slot {updateFocus} {active} {generatedContent} classNames={active ? '!indent-[8.8rem]' : ''} /> -->
295
306
  </div>
@@ -128,9 +128,7 @@ export class Autocompletor {
128
128
  ]
129
129
  };
130
130
  },
131
- // @ts-ignore
132
131
  disposeInlineCompletions: () => { },
133
- freeInlineCompletions: () => { }
134
132
  });
135
133
  this.#cursorDisposable = editor.onDidChangeCursorPosition(async (e) => {
136
134
  deletionsCues.clear();
@@ -47,7 +47,7 @@ $effect(() => {
47
47
  aiChatManager.listenForDbSchemasChanges($dbSchemas);
48
48
  });
49
49
  $effect(() => {
50
- aiChatManager.listenForScriptEditorContextChange($dbSchemas, $workspaceStore, $copilotSessionModel);
50
+ aiChatManager.listenForContextChange($dbSchemas, $workspaceStore, $copilotSessionModel);
51
51
  });
52
52
  $effect(() => {
53
53
  aiChatManager.updateMode(untrack(() => aiChatManager.mode));
@@ -80,9 +80,7 @@ $effect(() => {
80
80
  pastChats={historyManager.getPastChats()}
81
81
  bind:selectedContext={
82
82
  () => aiChatManager.contextManager.getSelectedContext(),
83
- (sc) => {
84
- aiChatManager.scriptEditorOptions && aiChatManager.contextManager.setSelectedContext(sc)
85
- }
83
+ (sc) => aiChatManager.contextManager.setSelectedContext(sc)
86
84
  }
87
85
  availableContext={aiChatManager.contextManager.getAvailableContext()}
88
86
  messages={aiChatManager.currentReply
@@ -33,7 +33,7 @@ let contextTextareaComponent = $state();
33
33
  let instructionsTextareaComponent = $state();
34
34
  let instructions = $state(initialInstructions);
35
35
  export function focusInput() {
36
- if (aiChatManager.mode === AIMode.SCRIPT) {
36
+ if (aiChatManager.mode === AIMode.SCRIPT || aiChatManager.mode === AIMode.FLOW) {
37
37
  contextTextareaComponent?.focus();
38
38
  }
39
39
  else {
@@ -82,7 +82,7 @@ $effect(() => {
82
82
  </script>
83
83
 
84
84
  <div use:clickOutside class="relative">
85
- {#if aiChatManager.mode === AIMode.SCRIPT}
85
+ {#if aiChatManager.mode === AIMode.SCRIPT || aiChatManager.mode === AIMode.FLOW}
86
86
  {#if showContext}
87
87
  <div class="flex flex-row gap-1 mb-1 overflow-scroll pt-2 no-scrollbar">
88
88
  <Popover>
@@ -107,7 +107,7 @@ $effect(() => {
107
107
  <ContextElementBadge
108
108
  contextElement={element}
109
109
  deletable
110
- on:delete={() => {
110
+ onDelete={() => {
111
111
  selectedContext = selectedContext?.filter(
112
112
  (c) => c.type !== element.type || c.title !== element.title
113
113
  )
@@ -12,10 +12,9 @@ import { getCompletion, getModelContextWindow } from '../lib';
12
12
  import { dfs } from '../../flows/previousResults';
13
13
  import { getStringError } from './utils';
14
14
  import { untrack } from 'svelte';
15
- import { copilotSessionModel } from '../../../stores';
15
+ import { getCurrentModel } from '../../../stores';
16
16
  import { askTools, prepareAskSystemMessage, prepareAskUserMessage } from './ask/core';
17
17
  import { chatState, DEFAULT_SIZE, triggerablesByAi } from './sharedChatState.svelte';
18
- import { get } from 'svelte/store';
19
18
  import { prepareApiSystemMessage, prepareApiUserMessage } from './api/core';
20
19
  // If the estimated token usage is greater than the model context window - the threshold, we delete the oldest message
21
20
  const MAX_TOKENS_THRESHOLD_PERCENTAGE = 0.05;
@@ -53,6 +52,7 @@ class AIChatManager {
53
52
  tools = $state([]);
54
53
  helpers = $state(undefined);
55
54
  scriptEditorOptions = $state(undefined);
55
+ flowOptions = $state(undefined);
56
56
  scriptEditorApplyCode = $state(undefined);
57
57
  scriptEditorShowDiffMode = $state(undefined);
58
58
  flowAiChatHelpers = $state(undefined);
@@ -61,7 +61,7 @@ class AIChatManager {
61
61
  aiChatInput = $state(null);
62
62
  confirmationCallback = $state(undefined);
63
63
  allowedModes = $derived({
64
- script: this.scriptEditorOptions !== undefined,
64
+ script: this.flowAiChatHelpers === undefined && this.scriptEditorOptions !== undefined,
65
65
  flow: this.flowAiChatHelpers !== undefined,
66
66
  navigator: true,
67
67
  ask: true,
@@ -82,7 +82,8 @@ class AIChatManager {
82
82
  }
83
83
  return acc;
84
84
  }, 0);
85
- const modelContextWindow = getModelContextWindow(get(copilotSessionModel)?.model ?? '');
85
+ const model = getCurrentModel();
86
+ const modelContextWindow = getModelContextWindow(model.model);
86
87
  return (estimatedTokens >
87
88
  modelContextWindow -
88
89
  Math.max(modelContextWindow * MAX_TOKENS_THRESHOLD_PERCENTAGE, MAX_TOKENS_HARD_LIMIT));
@@ -507,7 +508,7 @@ class AIChatManager {
507
508
  }
508
509
  try {
509
510
  const oldSelectedContext = this.contextManager?.getSelectedContext() ?? [];
510
- if (this.mode === AIMode.SCRIPT) {
511
+ if (this.mode === AIMode.SCRIPT || this.mode === AIMode.FLOW) {
511
512
  this.contextManager?.updateContextOnRequest(options);
512
513
  }
513
514
  this.loading = true;
@@ -527,7 +528,9 @@ class AIChatManager {
527
528
  {
528
529
  role: 'user',
529
530
  content: this.instructions,
530
- contextElements: this.mode === AIMode.SCRIPT ? oldSelectedContext : undefined,
531
+ contextElements: this.mode === AIMode.SCRIPT || this.mode === AIMode.FLOW
532
+ ? oldSelectedContext
533
+ : undefined,
531
534
  snapshot,
532
535
  index: this.messages.length // matching with actual messages index. not -1 because it's not yet added to the messages array
533
536
  }
@@ -545,7 +548,7 @@ class AIChatManager {
545
548
  };
546
549
  switch (this.mode) {
547
550
  case AIMode.FLOW:
548
- userMessage = prepareFlowUserMessage(oldInstructions, this.flowAiChatHelpers.getFlowAndSelectedId());
551
+ userMessage = prepareFlowUserMessage(oldInstructions, this.flowAiChatHelpers.getFlowAndSelectedId(), oldSelectedContext);
549
552
  break;
550
553
  case AIMode.NAVIGATOR:
551
554
  userMessage = prepareNavigatorUserMessage(oldInstructions);
@@ -672,12 +675,14 @@ class AIChatManager {
672
675
  this.contextManager?.setFixContext();
673
676
  this.sendRequest();
674
677
  };
675
- addSelectedLinesToContext = (lines, startLine, endLine) => {
678
+ addSelectedLinesToContext = (lines, startLine, endLine, moduleId) => {
676
679
  if (!this.open) {
677
680
  this.toggleOpen();
678
681
  }
679
- this.changeMode(AIMode.SCRIPT);
680
- this.contextManager?.addSelectedLinesToContext(lines, startLine, endLine);
682
+ if (!moduleId) {
683
+ this.changeMode(AIMode.SCRIPT);
684
+ }
685
+ this.contextManager?.addSelectedLinesToContext(lines, startLine, endLine, moduleId);
681
686
  this.focusInput();
682
687
  };
683
688
  saveAndClear = async () => {
@@ -712,10 +717,16 @@ class AIChatManager {
712
717
  isPreprocessor: moduleId === 'preprocessor'
713
718
  });
714
719
  };
715
- listenForScriptEditorContextChange = (dbSchemas, workspaceStore, copilotSessionModel) => {
716
- if (this.scriptEditorOptions) {
720
+ listenForContextChange = (dbSchemas, workspaceStore, copilotSessionModel) => {
721
+ if (this.mode === AIMode.SCRIPT && this.scriptEditorOptions) {
717
722
  this.contextManager.updateAvailableContext(this.scriptEditorOptions, dbSchemas, workspaceStore ?? '', !copilotSessionModel?.model.endsWith('/thinking'), untrack(() => this.contextManager.getSelectedContext()));
718
723
  }
724
+ else if (this.mode === AIMode.FLOW && this.flowOptions) {
725
+ this.contextManager.updateAvailableContextForFlow(this.flowOptions, dbSchemas, workspaceStore ?? '', !copilotSessionModel?.model.endsWith('/thinking'), untrack(() => this.contextManager.getSelectedContext()));
726
+ }
727
+ if (this.scriptEditorOptions) {
728
+ this.contextManager.setScriptOptions(this.scriptEditorOptions);
729
+ }
719
730
  };
720
731
  listenForDbSchemasChanges = (dbSchemas) => {
721
732
  this.displayMessages = ContextManager.updateDisplayMessages(untrack(() => this.displayMessages), dbSchemas);
@@ -792,6 +803,7 @@ class AIChatManager {
792
803
  else {
793
804
  this.scriptEditorOptions = undefined;
794
805
  }
806
+ untrack(() => this.contextManager?.setSelectedModuleContext(selectedId, untrack(() => this.contextManager.getAvailableContext())));
795
807
  return () => {
796
808
  this.scriptEditorOptions = undefined;
797
809
  };