windmill-components 1.522.0 → 1.531.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 (272) hide show
  1. package/package/components/AIAgentLogViewer.svelte +123 -0
  2. package/package/components/AIAgentLogViewer.svelte.d.ts +13 -0
  3. package/package/components/AppConnectInner.svelte +10 -10
  4. package/package/components/AutoscalingConfigEditor.svelte +76 -2
  5. package/package/components/Dev.svelte +12 -28
  6. package/package/components/DiffEditor.svelte +6 -3
  7. package/package/components/DiffEditor.svelte.d.ts +1 -0
  8. package/package/components/DisplayResult.svelte +16 -10
  9. package/package/components/DisplayResult.svelte.d.ts +1 -0
  10. package/package/components/EditableSchemaForm.svelte +5 -2
  11. package/package/components/Editor.svelte +26 -8
  12. package/package/components/Editor.svelte.d.ts +1 -1
  13. package/package/components/EditorBar.svelte +25 -5
  14. package/package/components/EditorSettings.svelte +6 -0
  15. package/package/components/FirstStepInputs.svelte +2 -2
  16. package/package/components/FlowBuilder.svelte +18 -36
  17. package/package/components/FlowGraphViewerStep.svelte +7 -0
  18. package/package/components/FlowJobResult.svelte +15 -63
  19. package/package/components/FlowJobResult.svelte.d.ts +10 -4
  20. package/package/components/FlowLogViewer.svelte +660 -0
  21. package/package/components/FlowLogViewer.svelte.d.ts +34 -0
  22. package/package/components/FlowLogViewerWrapper.svelte +52 -0
  23. package/package/components/FlowLogViewerWrapper.svelte.d.ts +21 -0
  24. package/package/components/FlowLoopIterationPreview.svelte +3 -3
  25. package/package/components/FlowPreviewContent.svelte +4 -5
  26. package/package/components/FlowPreviewContent.svelte.d.ts +7 -7
  27. package/package/components/FlowPreviewResult.svelte +4 -5
  28. package/package/components/FlowPreviewResult.svelte.d.ts +3 -5
  29. package/package/components/FlowStatusViewer.svelte +28 -16
  30. package/package/components/FlowStatusViewer.svelte.d.ts +19 -27
  31. package/package/components/FlowStatusViewerInner.svelte +483 -296
  32. package/package/components/FlowStatusViewerInner.svelte.d.ts +27 -33
  33. package/package/components/FlowTimeline.svelte +11 -13
  34. package/package/components/FlowTimeline.svelte.d.ts +6 -5
  35. package/package/components/FlowWrapper.svelte +3 -2
  36. package/package/components/HighlightCode.svelte +4 -1
  37. package/package/components/IconedResourceType.svelte +9 -5
  38. package/package/components/JobLoader.svelte +61 -8
  39. package/package/components/JobLoader.svelte.d.ts +9 -1
  40. package/package/components/LogViewer.svelte +8 -2
  41. package/package/components/LogViewer.svelte.d.ts +1 -0
  42. package/package/components/LogViewerHeader.svelte +32 -0
  43. package/package/components/LogViewerHeader.svelte.d.ts +8 -0
  44. package/package/components/ModulePreviewForm.svelte +10 -6
  45. package/package/components/ModulePreviewResultViewer.svelte +16 -0
  46. package/package/components/ModulePreviewResultViewer.svelte.d.ts +1 -1
  47. package/package/components/ModuleTest.svelte +59 -16
  48. package/package/components/RelativeLineNumbers.svelte +16 -0
  49. package/package/components/RelativeLineNumbers.svelte.d.ts +18 -0
  50. package/package/components/ResourceEditor.svelte +9 -4
  51. package/package/components/ScriptBuilder.svelte +13 -11
  52. package/package/components/ScriptEditor.svelte +2 -2
  53. package/package/components/SimpleEditor.svelte +10 -4
  54. package/package/components/SimpleEditor.svelte.d.ts +1 -0
  55. package/package/components/TemplateEditor.svelte +1 -1
  56. package/package/components/UserSettings.svelte +4 -4
  57. package/package/components/apps/components/display/AppAccordionList.svelte +1 -1
  58. package/package/components/apps/components/display/AppCarouselList.svelte +10 -8
  59. package/package/components/apps/components/display/AppJobIdFlowStatus.svelte +3 -3
  60. package/package/components/apps/components/display/table/AppAggridTable.svelte +2 -2
  61. package/package/components/apps/components/helpers/HiddenComponent.svelte +0 -1
  62. package/package/components/apps/components/helpers/InputValue.svelte +6 -1
  63. package/package/components/apps/components/helpers/NonRunnableComponent.svelte +8 -4
  64. package/package/components/apps/components/helpers/NonRunnableComponent.svelte.d.ts +1 -1
  65. package/package/components/apps/components/helpers/RunnableComponent.svelte +7 -8
  66. package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +1 -1
  67. package/package/components/apps/components/helpers/RunnableWrapper.svelte +12 -3
  68. package/package/components/apps/components/helpers/RunnableWrapper.svelte.d.ts +1 -1
  69. package/package/components/apps/components/inputs/AppCodeInputComponent.svelte +0 -5
  70. package/package/components/apps/components/layout/AppConditionalWrapper.svelte +1 -1
  71. package/package/components/apps/components/layout/AppContainer.svelte +1 -1
  72. package/package/components/apps/components/layout/AppDecisionTree.svelte +31 -20
  73. package/package/components/apps/components/layout/AppDrawer.svelte +1 -1
  74. package/package/components/apps/components/layout/AppList.svelte +9 -8
  75. package/package/components/apps/components/layout/AppModal.svelte +1 -1
  76. package/package/components/apps/components/layout/AppSplitpanes.svelte +5 -2
  77. package/package/components/apps/components/layout/AppStepper.svelte +9 -5
  78. package/package/components/apps/components/layout/AppTabs.svelte +2 -2
  79. package/package/components/apps/editor/AppJobsDrawer.svelte +2 -2
  80. package/package/components/apps/editor/GridEditor.svelte +24 -19
  81. package/package/components/apps/editor/GridEditor.svelte.d.ts +4 -1
  82. package/package/components/apps/editor/GridViewer.svelte +1 -1
  83. package/package/components/apps/editor/SubGridEditor.svelte +7 -11
  84. package/package/components/apps/editor/SubGridEditor.svelte.d.ts +3 -19
  85. package/package/components/apps/editor/appUtils.js +17 -68
  86. package/package/components/apps/editor/component/ComponentInner.svelte +845 -694
  87. package/package/components/apps/editor/component/componentCallbacks.svelte.js +8 -1
  88. package/package/components/apps/editor/contextPanel/components/OutputHeader.svelte +9 -46
  89. package/package/components/apps/editor/settingsPanel/DecisionTreeGraphEditor.svelte +29 -43
  90. package/package/components/apps/editor/settingsPanel/InputsSpecEditor.svelte +2 -1
  91. package/package/components/apps/editor/settingsPanel/InputsSpecEditor.svelte.d.ts +1 -0
  92. package/package/components/apps/editor/settingsPanel/inputEditor/EvalV2InputEditor.svelte +2 -2
  93. package/package/components/apps/editor/settingsPanel/inputEditor/EvalV2InputEditor.svelte.d.ts +1 -0
  94. package/package/components/apps/svelte-grid/Grid.svelte +23 -25
  95. package/package/components/apps/svelte-grid/Grid.svelte.d.ts +21 -9
  96. package/package/components/apps/svelte-grid/MoveResize.svelte +13 -15
  97. package/package/components/apps/svelte-grid/MoveResize.svelte.d.ts +17 -24
  98. package/package/components/apps/utils.d.ts +2 -0
  99. package/package/components/apps/utils.js +22 -0
  100. package/package/components/auditLogs/AuditLogsFilters.svelte.d.ts +1 -1
  101. package/package/components/common/fileDownload/FileDownload.svelte +1 -3
  102. package/package/components/common/fileDownload/FileDownload.svelte.d.ts +4 -18
  103. package/package/components/common/languageIcons/LanguageIcon.svelte +5 -2
  104. package/package/components/copilot/FlowInlineScriptAIButton.svelte +58 -0
  105. package/package/components/copilot/FlowInlineScriptAIButton.svelte.d.ts +3 -0
  106. package/package/components/copilot/MetadataGen.svelte +19 -1
  107. package/package/components/copilot/MetadataGen.svelte.d.ts +1 -1
  108. package/package/components/copilot/ScriptGen.svelte +23 -31
  109. package/package/components/copilot/ScriptGen.svelte.d.ts +0 -1
  110. package/package/components/copilot/autocomplete/Autocompletor.js +2 -0
  111. package/package/components/copilot/chat/AIChatDisplay.svelte +4 -4
  112. package/package/components/copilot/chat/AIChatInput.svelte +29 -6
  113. package/package/components/copilot/chat/AIChatManager.svelte.js +110 -26
  114. package/package/components/copilot/chat/AIChatMessage.svelte +3 -0
  115. package/package/components/copilot/chat/ToolContentDisplay.svelte +84 -0
  116. package/package/components/copilot/chat/ToolContentDisplay.svelte.d.ts +11 -0
  117. package/package/components/copilot/chat/ToolExecutionDisplay.svelte +105 -0
  118. package/package/components/copilot/chat/ToolExecutionDisplay.svelte.d.ts +7 -0
  119. package/package/components/copilot/chat/api/apiTools.d.ts +7 -0
  120. package/package/components/copilot/chat/api/apiTools.js +192 -0
  121. package/package/components/copilot/chat/api/core.d.ts +7 -0
  122. package/package/components/copilot/chat/api/core.js +61 -0
  123. package/package/components/copilot/chat/flow/FlowAIChat.svelte +4 -6
  124. package/package/components/copilot/chat/flow/core.js +213 -42
  125. package/package/components/copilot/chat/flow/utils.js +3 -0
  126. package/package/components/copilot/chat/monaco-adapter.d.ts +1 -1
  127. package/package/components/copilot/chat/monaco-adapter.js +10 -4
  128. package/package/components/copilot/chat/navigator/core.d.ts +1 -1
  129. package/package/components/copilot/chat/navigator/core.js +20 -22
  130. package/package/components/copilot/chat/script/core.d.ts +11 -3
  131. package/package/components/copilot/chat/script/core.js +92 -15
  132. package/package/components/copilot/chat/shared.d.ts +30 -3
  133. package/package/components/copilot/chat/shared.js +228 -9
  134. package/package/components/copilot/lib.d.ts +1 -1
  135. package/package/components/copilot/lib.js +15 -6
  136. package/package/components/custom_ui.d.ts +2 -0
  137. package/package/components/details/DetailPageLayout.svelte +34 -33
  138. package/package/components/flow_builder.d.ts +1 -2
  139. package/package/components/flows/FlowEditor.svelte +3 -3
  140. package/package/components/flows/FlowEditor.svelte.d.ts +7 -6
  141. package/package/components/flows/common/FlowCard.svelte +2 -2
  142. package/package/components/flows/common/FlowCard.svelte.d.ts +1 -0
  143. package/package/components/flows/common/FlowCardHeader.svelte +13 -4
  144. package/package/components/flows/common/FlowCardHeader.svelte.d.ts +1 -0
  145. package/package/components/flows/content/BranchPredicateEditor.svelte +4 -7
  146. package/package/components/flows/content/BranchPredicateEditor.svelte.d.ts +12 -11
  147. package/package/components/flows/content/FlowConstants.svelte +3 -3
  148. package/package/components/flows/content/FlowEditorPanel.svelte +3 -3
  149. package/package/components/flows/content/FlowEditorPanel.svelte.d.ts +2 -4
  150. package/package/components/flows/content/FlowInputsQuick.svelte +2 -1
  151. package/package/components/flows/content/FlowLoop.svelte +2 -2
  152. package/package/components/flows/content/FlowModuleComponent.svelte +130 -108
  153. package/package/components/flows/content/FlowModuleComponent.svelte.d.ts +1 -0
  154. package/package/components/flows/content/FlowModuleEarlyStop.svelte +2 -2
  155. package/package/components/flows/content/FlowModuleSkip.svelte +1 -1
  156. package/package/components/flows/content/FlowModuleSleep.svelte +1 -1
  157. package/package/components/flows/content/FlowModuleSuspend.svelte +1 -1
  158. package/package/components/flows/content/FlowModuleWrapper.svelte +15 -5
  159. package/package/components/flows/content/FlowModuleWrapper.svelte.d.ts +1 -0
  160. package/package/components/flows/content/FlowResult.svelte +2 -3
  161. package/package/components/flows/content/FlowResult.svelte.d.ts +2 -4
  162. package/package/components/flows/content/FlowWhileLoop.svelte +1 -1
  163. package/package/components/flows/dfs.d.ts +3 -1
  164. package/package/components/flows/dfs.js +5 -1
  165. package/package/components/flows/flowInfers.js +78 -0
  166. package/package/components/flows/flowState.d.ts +2 -3
  167. package/package/components/flows/flowState.js +2 -2
  168. package/package/components/flows/flowStateUtils.svelte.d.ts +4 -4
  169. package/package/components/flows/flowStateUtils.svelte.js +14 -13
  170. package/package/components/flows/flowStore.d.ts +3 -4
  171. package/package/components/flows/header/FlowPreviewButtons.svelte +2 -1
  172. package/package/components/flows/header/FlowYamlEditor.svelte +10 -1
  173. package/package/components/flows/map/FlowGraphPreviewButton.svelte +1 -1
  174. package/package/components/flows/map/FlowJobsMenu.svelte +7 -3
  175. package/package/components/flows/map/FlowJobsMenu.svelte.d.ts +1 -0
  176. package/package/components/flows/map/FlowModuleSchemaItem.svelte +12 -12
  177. package/package/components/flows/map/FlowModuleSchemaMap.svelte +26 -19
  178. package/package/components/flows/map/FlowModuleSchemaMap.svelte.d.ts +6 -4
  179. package/package/components/flows/map/InsertModuleInner.svelte +9 -1
  180. package/package/components/flows/map/InsertModuleInner.svelte.d.ts +1 -0
  181. package/package/components/flows/map/MapItem.svelte +4 -2
  182. package/package/components/flows/pickers/TopLevelNode.svelte +4 -1
  183. package/package/components/flows/propPicker/InputPickerInner.svelte +5 -4
  184. package/package/components/flows/propPicker/OutputBadge.svelte +11 -9
  185. package/package/components/flows/propPicker/OutputPickerInner.svelte +10 -1
  186. package/package/components/flows/propPicker/OutputPickerInner.svelte.d.ts +1 -1
  187. package/package/components/flows/testSteps.svelte.d.ts +3 -2
  188. package/package/components/flows/testSteps.svelte.js +26 -23
  189. package/package/components/flows/types.d.ts +1 -1
  190. package/package/components/flows/utils.d.ts +3 -5
  191. package/package/components/flows/utils.js +3 -4
  192. package/package/components/git_sync/GitSyncContext.svelte.js +2 -1
  193. package/package/components/graph/FlowGraphV2.svelte +44 -24
  194. package/package/components/graph/FlowGraphV2.svelte.d.ts +5 -2
  195. package/package/components/graph/graphBuilder.svelte.d.ts +49 -17
  196. package/package/components/graph/graphBuilder.svelte.js +30 -14
  197. package/package/components/graph/model.d.ts +9 -6
  198. package/package/components/graph/renderers/edges/BaseEdge.svelte +3 -3
  199. package/package/components/graph/renderers/edges/BaseEdge.svelte.d.ts +2 -3
  200. package/package/components/graph/renderers/nodes/AIToolNode.svelte +234 -0
  201. package/package/components/graph/renderers/nodes/AIToolNode.svelte.d.ts +24 -0
  202. package/package/components/graph/renderers/nodes/AssetNode.svelte +15 -10
  203. package/package/components/graph/renderers/nodes/AssetNode.svelte.d.ts +18 -1
  204. package/package/components/graph/renderers/nodes/BranchAllEndNode.svelte +1 -1
  205. package/package/components/graph/renderers/nodes/BranchAllStart.svelte +1 -1
  206. package/package/components/graph/renderers/nodes/BranchOneStart.svelte +1 -1
  207. package/package/components/graph/renderers/nodes/ForLoopEndNode.svelte +2 -2
  208. package/package/components/graph/renderers/nodes/ForLoopStartNode.svelte +1 -1
  209. package/package/components/graph/renderers/nodes/ModuleNode.svelte +21 -21
  210. package/package/components/graph/renderers/nodes/NewAIToolNode.svelte +64 -0
  211. package/package/components/graph/renderers/nodes/NewAIToolNode.svelte.d.ts +7 -0
  212. package/package/components/graph/renderers/nodes/branchOneEndNode.svelte +1 -1
  213. package/package/components/icons/RubyIcon.svelte +656 -0
  214. package/package/components/icons/RubyIcon.svelte.d.ts +7 -0
  215. package/package/components/instanceSettings.js +9 -0
  216. package/package/components/modulesTest.svelte.d.ts +6 -3
  217. package/package/components/modulesTest.svelte.js +32 -0
  218. package/package/components/preview/FlowPreviewStatus.svelte +3 -1
  219. package/package/components/raw_apps/RawAppEditor.svelte +27 -26
  220. package/package/components/raw_apps/RawAppEditor.svelte.d.ts +17 -17
  221. package/package/components/runs/{JobPreview.svelte → JobRunsPreview.svelte} +1 -4
  222. package/package/components/runs/{JobPreview.svelte.d.ts → JobRunsPreview.svelte.d.ts} +3 -3
  223. package/package/components/runs/RunRow.svelte +5 -1
  224. package/package/components/schema/AddProperty.svelte +41 -36
  225. package/package/components/schema/AddProperty.svelte.d.ts +2 -2
  226. package/package/components/schema/AddPropertyV2.svelte +41 -37
  227. package/package/components/schema/AddPropertyV2.svelte.d.ts +1 -1
  228. package/package/components/schema/FlowPropertyEditor.svelte +8 -6
  229. package/package/components/search/RunsSearch.svelte +1 -1
  230. package/package/components/settings/CreateToken.svelte +132 -12
  231. package/package/components/settings/CreateToken.svelte.d.ts +3 -20
  232. package/package/components/settings/TokenDisplay.svelte +18 -42
  233. package/package/components/settings/TokenDisplay.svelte.d.ts +0 -1
  234. package/package/components/settings/TokensTable.svelte +2 -4
  235. package/package/components/settings/TokensTable.svelte.d.ts +3 -19
  236. package/package/components/settings/WorkspaceUserSettings.svelte +428 -69
  237. package/package/components/sidebar/MenuButton.svelte +12 -10
  238. package/package/components/stepHistoryLoader.svelte.d.ts +2 -2
  239. package/package/components/stepHistoryLoader.svelte.js +7 -12
  240. package/package/components/triggers/http/OpenAPISpecGenerator.svelte +2 -2
  241. package/package/components/tutorials/FlowBuilderTutorialBranchOne.svelte +1 -1
  242. package/package/components/tutorials/FlowBuilderTutorialForLoop.svelte +4 -4
  243. package/package/components/tutorials/utils.js +3 -0
  244. package/package/components/worker_group.d.ts +4 -1
  245. package/package/components/worker_group.js +3 -2
  246. package/package/editorLangUtils.d.ts +1 -1
  247. package/package/editorLangUtils.js +2 -0
  248. package/package/editorUtils.d.ts +2 -1
  249. package/package/editorUtils.js +2 -1
  250. package/package/gen/core/OpenAPI.js +1 -1
  251. package/package/gen/schemas.gen.d.ts +296 -8
  252. package/package/gen/schemas.gen.js +364 -70
  253. package/package/gen/services.gen.d.ts +118 -16
  254. package/package/gen/services.gen.js +226 -19
  255. package/package/gen/types.gen.d.ts +660 -16
  256. package/package/hubPaths.json +7 -4
  257. package/package/infer.js +10 -1
  258. package/package/monaco_workers/graphql.worker.bundle.js +144 -110
  259. package/package/script_helpers.d.ts +3 -0
  260. package/package/script_helpers.js +58 -3
  261. package/package/scripts.d.ts +1 -1
  262. package/package/scripts.js +3 -2
  263. package/package/stores.d.ts +2 -0
  264. package/package/stores.js +2 -0
  265. package/package/svelte5Utils.svelte.d.ts +16 -0
  266. package/package/svelte5Utils.svelte.js +26 -0
  267. package/package/utils.d.ts +1 -1
  268. package/package.json +20 -19
  269. package/package/components/AllFlowLogs.svelte +0 -31
  270. package/package/components/AllFlowLogs.svelte.d.ts +0 -8
  271. package/package/components/copilot/chat/navigator/apiTools.d.ts +0 -68
  272. package/package/components/copilot/chat/navigator/apiTools.js +0 -258
@@ -1,10 +1,10 @@
1
1
  import { flowTools, prepareFlowSystemMessage, prepareFlowUserMessage } from './flow/core';
2
2
  import ContextManager from './ContextManager.svelte';
3
3
  import HistoryManager from './HistoryManager.svelte';
4
- import { processToolCall } from './shared';
4
+ import { extractCodeFromMarkdown, getLatestAssistantMessage, processToolCall } from './shared';
5
5
  import { INLINE_CHAT_SYSTEM_PROMPT, prepareScriptSystemMessage, prepareScriptTools } from './script/core';
6
6
  import { navigatorTools, prepareNavigatorSystemMessage } from './navigator/core';
7
- import { loadApiTools } from './navigator/apiTools';
7
+ import { loadApiTools } from './api/apiTools';
8
8
  import { prepareScriptUserMessage } from './script/core';
9
9
  import { prepareNavigatorUserMessage } from './navigator/core';
10
10
  import { sendUserToast } from '../../../toast';
@@ -13,9 +13,10 @@ import { dfs } from '../../flows/previousResults';
13
13
  import { getStringError } from './utils';
14
14
  import { untrack } from 'svelte';
15
15
  import { copilotSessionModel } from '../../../stores';
16
- import { askTools, prepareAskSystemMessage } from './ask/core';
16
+ import { askTools, prepareAskSystemMessage, prepareAskUserMessage } from './ask/core';
17
17
  import { chatState, DEFAULT_SIZE, triggerablesByAi } from './sharedChatState.svelte';
18
18
  import { get } from 'svelte/store';
19
+ import { prepareApiSystemMessage, prepareApiUserMessage } from './api/core';
19
20
  // If the estimated token usage is greater than the model context window - the threshold, we delete the oldest message
20
21
  const MAX_TOKENS_THRESHOLD_PERCENTAGE = 0.05;
21
22
  const MAX_TOKENS_HARD_LIMIT = 5000;
@@ -24,6 +25,7 @@ export var AIMode;
24
25
  AIMode["SCRIPT"] = "script";
25
26
  AIMode["FLOW"] = "flow";
26
27
  AIMode["NAVIGATOR"] = "navigator";
28
+ AIMode["API"] = "API";
27
29
  AIMode["ASK"] = "ask";
28
30
  })(AIMode || (AIMode = {}));
29
31
  class AIChatManager {
@@ -57,11 +59,13 @@ class AIChatManager {
57
59
  pendingNewCode = $state(undefined);
58
60
  apiTools = $state([]);
59
61
  aiChatInput = $state(null);
62
+ confirmationCallback = $state(undefined);
60
63
  allowedModes = $derived({
61
64
  script: this.scriptEditorOptions !== undefined,
62
65
  flow: this.flowAiChatHelpers !== undefined,
63
66
  navigator: true,
64
- ask: true
67
+ ask: true,
68
+ API: true
65
69
  });
66
70
  open = $derived(chatState.size > 0);
67
71
  checkTokenUsageOverLimit = (messages) => {
@@ -103,8 +107,8 @@ class AIChatManager {
103
107
  loadApiTools = async () => {
104
108
  try {
105
109
  this.apiTools = await loadApiTools();
106
- if (this.mode === AIMode.NAVIGATOR) {
107
- this.tools = [this.changeModeTool, ...navigatorTools, ...this.apiTools];
110
+ if (this.mode === AIMode.API) {
111
+ this.tools = [...this.apiTools];
108
112
  }
109
113
  }
110
114
  catch (err) {
@@ -112,6 +116,20 @@ class AIChatManager {
112
116
  this.apiTools = [];
113
117
  }
114
118
  };
119
+ // Request confirmation from user for a tool call
120
+ requestConfirmation = (toolId) => {
121
+ return new Promise((resolve) => {
122
+ // Store the callback for this specific tool
123
+ this.confirmationCallback = resolve;
124
+ });
125
+ };
126
+ // Handle confirmation response for a specific tool
127
+ handleToolConfirmation = (toolId, confirmed) => {
128
+ if (this.confirmationCallback) {
129
+ this.confirmationCallback(confirmed);
130
+ this.confirmationCallback = undefined;
131
+ }
132
+ };
115
133
  setAiChatInput(aiChatInput) {
116
134
  this.aiChatInput = aiChatInput;
117
135
  }
@@ -137,7 +155,27 @@ class AIChatManager {
137
155
  const lang = this.scriptEditorOptions?.lang ?? 'bun';
138
156
  this.tools = [this.changeModeTool, ...prepareScriptTools(lang, context)];
139
157
  this.helpers = {
140
- getLang: () => lang
158
+ getScriptOptions: () => {
159
+ return {
160
+ code: this.scriptEditorOptions?.code ?? '',
161
+ lang: lang,
162
+ path: this.scriptEditorOptions?.path ?? '',
163
+ args: this.scriptEditorOptions?.args ?? {}
164
+ };
165
+ },
166
+ getLastSuggestedCode: () => {
167
+ const latestMessage = getLatestAssistantMessage(this.displayMessages);
168
+ if (latestMessage) {
169
+ const codeBlocks = extractCodeFromMarkdown(latestMessage);
170
+ if (codeBlocks.length > 0) {
171
+ return codeBlocks[codeBlocks.length - 1];
172
+ }
173
+ }
174
+ return undefined;
175
+ },
176
+ applyCode: (code, applyAll) => {
177
+ this.scriptEditorApplyCode?.(code, applyAll);
178
+ }
141
179
  };
142
180
  if (options?.closeScriptSettings) {
143
181
  const closeComponent = triggerablesByAi['close-script-builder-settings'];
@@ -154,7 +192,7 @@ class AIChatManager {
154
192
  }
155
193
  else if (mode === AIMode.NAVIGATOR) {
156
194
  this.systemMessage = prepareNavigatorSystemMessage();
157
- this.tools = [this.changeModeTool, ...navigatorTools, ...this.apiTools];
195
+ this.tools = [this.changeModeTool, ...navigatorTools];
158
196
  this.helpers = {};
159
197
  }
160
198
  else if (mode === AIMode.ASK) {
@@ -162,6 +200,11 @@ class AIChatManager {
162
200
  this.tools = [...askTools];
163
201
  this.helpers = {};
164
202
  }
203
+ else if (mode === AIMode.API) {
204
+ this.systemMessage = prepareApiSystemMessage();
205
+ this.tools = [...this.apiTools];
206
+ this.helpers = {};
207
+ }
165
208
  }
166
209
  canApplyCode = $derived(this.allowedModes.script && this.mode === AIMode.SCRIPT);
167
210
  changeModeTool = {
@@ -169,14 +212,14 @@ class AIChatManager {
169
212
  type: 'function',
170
213
  function: {
171
214
  name: 'change_mode',
172
- description: 'Change the AI mode to the one specified. Script mode is used to create scripts, and flow mode is used to create flows. Navigator mode is used to navigate the application and help the user find what they are looking for.',
215
+ description: 'Change the AI mode to the one specified. Script mode is used to create scripts. Flow mode is used to create flows. Navigator mode is used to navigate the application and help the user find what they are looking for. API mode is used to make API calls to the Windmill backend.',
173
216
  parameters: {
174
217
  type: 'object',
175
218
  properties: {
176
219
  mode: {
177
220
  type: 'string',
178
221
  description: 'The mode to change to',
179
- enum: ['script', 'flow', 'navigator']
222
+ enum: ['script', 'flow', 'navigator', 'API']
180
223
  },
181
224
  pendingPrompt: {
182
225
  type: 'string',
@@ -189,11 +232,11 @@ class AIChatManager {
189
232
  }
190
233
  },
191
234
  fn: async ({ args, toolId, toolCallbacks }) => {
192
- toolCallbacks.setToolStatus(toolId, 'Switching to ' + args.mode + ' mode...');
235
+ toolCallbacks.setToolStatus(toolId, { content: 'Switching to ' + args.mode + ' mode...' });
193
236
  this.changeMode(args.mode, args.pendingPrompt, {
194
237
  closeScriptSettings: true
195
238
  });
196
- toolCallbacks.setToolStatus(toolId, 'Switched to ' + args.mode + ' mode');
239
+ toolCallbacks.setToolStatus(toolId, { content: 'Switched to ' + args.mode + ' mode' });
197
240
  return 'Mode changed to ' + args.mode;
198
241
  }
199
242
  };
@@ -259,13 +302,18 @@ class AIChatManager {
259
302
  let completion = null;
260
303
  while (true) {
261
304
  const systemMessage = systemMessageOverride ?? this.systemMessage;
262
- const tools = this.tools;
263
305
  const helpers = this.helpers;
306
+ const tools = this.tools;
307
+ for (const tool of tools) {
308
+ if (tool.setSchema) {
309
+ await tool.setSchema(helpers);
310
+ }
311
+ }
264
312
  let pendingPrompt = this.pendingPrompt;
265
313
  let pendingUserMessage = undefined;
266
314
  if (pendingPrompt) {
267
315
  if (this.mode === AIMode.SCRIPT) {
268
- pendingUserMessage = await prepareScriptUserMessage(pendingPrompt, this.scriptEditorOptions?.lang, this.contextManager.getSelectedContext());
316
+ pendingUserMessage = prepareScriptUserMessage(pendingPrompt, this.scriptEditorOptions?.lang, this.contextManager.getSelectedContext());
269
317
  }
270
318
  else if (this.mode === AIMode.FLOW) {
271
319
  pendingUserMessage = prepareFlowUserMessage(pendingPrompt, this.flowAiChatHelpers.getFlowAndSelectedId());
@@ -348,7 +396,6 @@ class AIChatManager {
348
396
  const messageToAdd = await processToolCall({
349
397
  tools,
350
398
  toolCall,
351
- messages,
352
399
  helpers,
353
400
  toolCallbacks: callbacks
354
401
  });
@@ -394,7 +441,7 @@ class AIChatManager {
394
441
  };
395
442
  let reply = '';
396
443
  try {
397
- const userMessage = await prepareScriptUserMessage(instructions, lang, selectedContext, {
444
+ const userMessage = prepareScriptUserMessage(instructions, lang, selectedContext, {
398
445
  isPreprocessor: false
399
446
  });
400
447
  const messages = [userMessage];
@@ -492,13 +539,29 @@ class AIChatManager {
492
539
  }
493
540
  const lang = this.scriptEditorOptions?.lang ?? options.lang ?? 'bun';
494
541
  const isPreprocessor = this.scriptEditorOptions?.path === 'preprocessor' || options.isPreprocessor;
495
- const userMessage = this.mode === AIMode.FLOW
496
- ? prepareFlowUserMessage(oldInstructions, this.flowAiChatHelpers.getFlowAndSelectedId())
497
- : this.mode === AIMode.NAVIGATOR
498
- ? prepareNavigatorUserMessage(oldInstructions)
499
- : await prepareScriptUserMessage(oldInstructions, lang, oldSelectedContext, {
542
+ let userMessage = {
543
+ role: 'user',
544
+ content: ''
545
+ };
546
+ switch (this.mode) {
547
+ case AIMode.FLOW:
548
+ userMessage = prepareFlowUserMessage(oldInstructions, this.flowAiChatHelpers.getFlowAndSelectedId());
549
+ break;
550
+ case AIMode.NAVIGATOR:
551
+ userMessage = prepareNavigatorUserMessage(oldInstructions);
552
+ break;
553
+ case AIMode.ASK:
554
+ userMessage = prepareAskUserMessage(oldInstructions);
555
+ break;
556
+ case AIMode.SCRIPT:
557
+ userMessage = prepareScriptUserMessage(oldInstructions, lang, oldSelectedContext, {
500
558
  isPreprocessor
501
559
  });
560
+ break;
561
+ case AIMode.API:
562
+ userMessage = prepareApiUserMessage(oldInstructions);
563
+ break;
564
+ }
502
565
  this.messages.push(userMessage);
503
566
  await this.historyManager.saveChat(this.displayMessages, this.messages);
504
567
  this.currentReply = '';
@@ -526,18 +589,34 @@ class AIChatManager {
526
589
  }
527
590
  this.currentReply = '';
528
591
  },
529
- setToolStatus: (id, content) => {
592
+ setToolStatus: (id, metadata) => {
530
593
  const existingIdx = this.displayMessages.findIndex((m) => m.role === 'tool' && m.tool_call_id === id);
531
594
  if (existingIdx !== -1) {
532
- this.displayMessages[existingIdx].content = content;
595
+ // Update existing tool message with metadata
596
+ const existing = this.displayMessages[existingIdx];
597
+ if (existing.content.length === 0 && metadata?.error) {
598
+ this.displayMessages[existingIdx].content = metadata.error;
599
+ }
600
+ this.displayMessages[existingIdx] = {
601
+ ...existing,
602
+ ...(metadata || {})
603
+ };
533
604
  }
534
605
  else {
535
- this.displayMessages.push({ role: 'tool', tool_call_id: id, content });
606
+ // Create new tool message with metadata
607
+ const newMessage = {
608
+ role: 'tool',
609
+ tool_call_id: id,
610
+ content: metadata?.content ?? metadata?.error ?? '',
611
+ ...(metadata || {})
612
+ };
613
+ this.displayMessages.push(newMessage);
536
614
  }
537
- }
615
+ },
616
+ requestConfirmation: this.requestConfirmation
538
617
  }
539
618
  };
540
- if (this.mode === AIMode.NAVIGATOR && this.apiTools.length === 0) {
619
+ if (this.mode === AIMode.API && this.apiTools.length === 0) {
541
620
  await this.loadApiTools();
542
621
  }
543
622
  const addedMessages = await this.chatRequest({
@@ -561,6 +640,10 @@ class AIChatManager {
561
640
  }
562
641
  };
563
642
  cancel = () => {
643
+ if (this.confirmationCallback) {
644
+ this.confirmationCallback(false);
645
+ this.confirmationCallback = undefined;
646
+ }
564
647
  this.abortController?.abort();
565
648
  };
566
649
  restartGeneration = (displayMessageIndex, newContent) => {
@@ -598,6 +681,7 @@ class AIChatManager {
598
681
  this.focusInput();
599
682
  };
600
683
  saveAndClear = async () => {
684
+ this.cancel();
601
685
  await this.historyManager.save(this.displayMessages, this.messages);
602
686
  this.displayMessages = [];
603
687
  this.messages = [];
@@ -5,6 +5,7 @@ import { aiChatManager } from './AIChatManager.svelte';
5
5
  import { Button } from '../../common';
6
6
  import { RefreshCwIcon, Undo2Icon } from 'lucide-svelte';
7
7
  import AIChatInput from './AIChatInput.svelte';
8
+ import ToolExecutionDisplay from './ToolExecutionDisplay.svelte';
8
9
  let { message, messageIndex, availableContext, selectedContext = $bindable(), editingMessageIndex = $bindable(null) } = $props();
9
10
  function editMessage() {
10
11
  if (message.role !== 'user' || editingMessageIndex !== null || aiChatManager.loading) {
@@ -60,6 +61,8 @@ function editMessage() {
60
61
  >
61
62
  {#if message.role === 'assistant'}
62
63
  <AssistantMessage {message} />
64
+ {:else if message.role === 'tool'}
65
+ <ToolExecutionDisplay message={message as ToolDisplayMessage} />
63
66
  {:else}
64
67
  {message.content}
65
68
  {/if}
@@ -0,0 +1,84 @@
1
+ <script lang="ts">import { Loader2, Copy, Check } from 'lucide-svelte';
2
+ let { title, content, error, loading, showCopy = true, showWhileLoading = true } = $props();
3
+ let copied = $state(false);
4
+ const hasContent = $derived(content !== undefined && content !== null);
5
+ function formatJson(obj) {
6
+ try {
7
+ if (typeof obj === 'string') {
8
+ try {
9
+ const parsed = JSON.parse(obj);
10
+ return JSON.stringify(parsed, null, 2);
11
+ }
12
+ catch {
13
+ return obj;
14
+ }
15
+ }
16
+ return JSON.stringify(obj, null, 2);
17
+ }
18
+ catch {
19
+ return String(obj);
20
+ }
21
+ }
22
+ async function copyToClipboard() {
23
+ if (!hasContent)
24
+ return;
25
+ try {
26
+ await navigator.clipboard.writeText(formatJson(content));
27
+ copied = true;
28
+ setTimeout(() => (copied = false), 1500);
29
+ }
30
+ catch (err) {
31
+ console.error('Failed to copy:', err);
32
+ }
33
+ }
34
+ </script>
35
+
36
+ {#if showWhileLoading || (!loading && hasContent)}
37
+ <div class="space-y-2">
38
+ <div class="flex items-center justify-between">
39
+ <span class="text-secondary text-2xs font-semibold uppercase tracking-wide">
40
+ {title}:
41
+ </span>
42
+ {#if showCopy && hasContent}
43
+ <button
44
+ class="p-1 rounded hover:bg-surface-secondary text-tertiary hover:text-secondary transition-colors"
45
+ onclick={copyToClipboard}
46
+ title="Copy {title.toLowerCase()}"
47
+ >
48
+ {#if copied}
49
+ <Check class="w-3 h-3 text-green-500" />
50
+ {:else}
51
+ <Copy class="w-3 h-3" />
52
+ {/if}
53
+ </button>
54
+ {/if}
55
+ </div>
56
+
57
+ {#if loading}
58
+ <div
59
+ class="bg-surface-secondary border border-gray-200 dark:border-gray-700 rounded p-3 flex items-center gap-2 text-tertiary"
60
+ >
61
+ <Loader2 class="w-3 h-3 animate-spin" />
62
+ <span class="text-2xs">Executing...</span>
63
+ </div>
64
+ {:else if error}
65
+ <div
66
+ class="bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded p-3 overflow-x-auto max-h-64 overflow-y-auto"
67
+ >
68
+ <pre class="text-2xs text-red-700 dark:text-red-300 whitespace-pre-wrap">{error}</pre>
69
+ </div>
70
+ {:else if hasContent}
71
+ <div
72
+ class="bg-surface-secondary border border-gray-200 dark:border-gray-700 rounded p-3 overflow-x-auto max-h-64 overflow-y-auto"
73
+ >
74
+ <pre class="text-2xs text-primary whitespace-pre-wrap">{formatJson(content)}</pre>
75
+ </div>
76
+ {:else}
77
+ <div
78
+ class="bg-surface-secondary border border-gray-200 dark:border-gray-700 rounded p-3 text-center"
79
+ >
80
+ <span class="text-2xs text-tertiary">No {title.toLowerCase()} yet</span>
81
+ </div>
82
+ {/if}
83
+ </div>
84
+ {/if}
@@ -0,0 +1,11 @@
1
+ interface Props {
2
+ title: string;
3
+ content?: any;
4
+ error?: string;
5
+ loading?: boolean;
6
+ showCopy?: boolean;
7
+ showWhileLoading?: boolean;
8
+ }
9
+ declare const ToolContentDisplay: import("svelte").Component<Props, {}, "">;
10
+ type ToolContentDisplay = ReturnType<typeof ToolContentDisplay>;
11
+ export default ToolContentDisplay;
@@ -0,0 +1,105 @@
1
+ <script lang="ts">import { Loader2, ChevronDown, ChevronRight, XCircle, Play } from 'lucide-svelte';
2
+ import { Button } from '../../common';
3
+ import { aiChatManager } from './AIChatManager.svelte';
4
+ import { twMerge } from 'tailwind-merge';
5
+ import ToolContentDisplay from './ToolContentDisplay.svelte';
6
+ let { message } = $props();
7
+ let isExpanded = $state(message.showDetails || (message.isLoading && message.needsConfirmation));
8
+ const hasParameters = $derived(message.parameters !== undefined && Object.keys(message.parameters).length > 0);
9
+ </script>
10
+
11
+ <div
12
+ class="bg-surface border border-gray-200 dark:border-gray-700 rounded-md overflow-hidden font-mono text-xs"
13
+ >
14
+ <!-- Collapsible Header -->
15
+ <button
16
+ class={twMerge(
17
+ "w-full p-3 bg-surface-secondary hover:bg-surface-hover transition-colors flex items-center justify-between text-left border-b border-gray-200 dark:border-gray-700",
18
+ message.needsConfirmation ? "opacity-80" : ""
19
+ )}
20
+ onclick={() => (isExpanded = !isExpanded)}
21
+ disabled={!message.showDetails}
22
+ >
23
+ <div class="flex items-center gap-2 flex-1">
24
+ {#if message.showDetails}
25
+ {#if isExpanded}
26
+ <ChevronDown class="w-3 h-3 text-secondary" />
27
+ {:else}
28
+ <ChevronRight class="w-3 h-3 text-secondary" />
29
+ {/if}
30
+ {/if}
31
+
32
+ {#if message.isLoading && !message.needsConfirmation}
33
+ <Loader2 class="w-3.5 h-3.5 animate-spin text-blue-500" />
34
+ {:else if message.error}
35
+ <span class="text-red-500">✗</span>
36
+ {:else if !message.isLoading && !message.error}
37
+ <span class="text-green-500">✓</span>
38
+ {/if}
39
+ <span class="text-primary font-medium text-2xs">
40
+ {message.content}
41
+ </span>
42
+ </div>
43
+ </button>
44
+
45
+ <!-- Expanded Content -->
46
+ {#if isExpanded}
47
+ <div class="p-3 bg-surface space-y-3">
48
+ <!-- Parameters Section -->
49
+ <div class={message.needsConfirmation ? "opacity-80" : ""}>
50
+ <ToolContentDisplay title="Parameters" content={message.parameters} />
51
+ </div>
52
+
53
+ <!-- Confirmation Footer -->
54
+ {#if message.needsConfirmation}
55
+ <div
56
+ class={twMerge(
57
+ 'mt-3 pt-3 flex flex-row items-center justify-end gap-2',
58
+ hasParameters ? 'border-t border-gray-200 dark:border-gray-700' : ''
59
+ )}
60
+ >
61
+ <Button
62
+ variant="border"
63
+ color="gray"
64
+ size="xs"
65
+ on:click={() => {
66
+ if (message.tool_call_id) {
67
+ aiChatManager.handleToolConfirmation(message.tool_call_id, false)
68
+ }
69
+ }}
70
+ startIcon={{ icon: XCircle }}
71
+ ></Button>
72
+ <Button
73
+ variant="border"
74
+ color="green"
75
+ size="xs"
76
+ on:click={() => {
77
+ if (message.tool_call_id) {
78
+ aiChatManager.handleToolConfirmation(message.tool_call_id, true)
79
+ }
80
+ }}
81
+ startIcon={{ icon: Play }}
82
+ >
83
+ Run
84
+ </Button>
85
+ </div>
86
+
87
+ <!-- Result Section -->
88
+ {:else}
89
+ <ToolContentDisplay
90
+ title="Logs"
91
+ content={message.logs}
92
+ loading={message.isLoading}
93
+ showWhileLoading={false}
94
+ />
95
+
96
+ <ToolContentDisplay
97
+ title="Result"
98
+ content={message.result}
99
+ error={message.error}
100
+ loading={message.isLoading}
101
+ />
102
+ {/if}
103
+ </div>
104
+ {/if}
105
+ </div>
@@ -0,0 +1,7 @@
1
+ import type { ToolDisplayMessage } from './shared';
2
+ interface Props {
3
+ message: ToolDisplayMessage;
4
+ }
5
+ declare const ToolExecutionDisplay: import("svelte").Component<Props, {}, "">;
6
+ type ToolExecutionDisplay = ReturnType<typeof ToolExecutionDisplay>;
7
+ export default ToolExecutionDisplay;
@@ -0,0 +1,7 @@
1
+ import type { ChatCompletionTool } from 'openai/resources/index.mjs';
2
+ import type { Tool } from '../shared';
3
+ export declare function createApiTools(chatTools: ChatCompletionTool[], endpointMap?: Record<string, {
4
+ method: string;
5
+ path: string;
6
+ }>): Tool<{}>[];
7
+ export declare function loadApiTools(): Promise<Tool<{}>[]>;