windmill-components 1.537.1 → 1.542.4

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 (273) hide show
  1. package/package/components/AIProviderPicker.svelte +181 -0
  2. package/package/components/AIProviderPicker.svelte.d.ts +15 -0
  3. package/package/components/ArgInfo.svelte +2 -2
  4. package/package/components/ArgInput.svelte +35 -9
  5. package/package/components/ArgInput.svelte.d.ts +3 -3
  6. package/package/components/AssignableTagsInner.svelte +89 -3
  7. package/package/components/ConcurrentJobsChart.svelte +36 -48
  8. package/package/components/ConcurrentJobsChart.svelte.d.ts +8 -20
  9. package/package/components/CustomPopover.svelte.d.ts +1 -1
  10. package/package/components/DropdownSelect.svelte +26 -0
  11. package/package/components/DropdownSelect.svelte.d.ts +11 -0
  12. package/package/components/DropdownV2Inner.svelte +1 -1
  13. package/package/components/{DynSelect.svelte → DynamicInput.svelte} +47 -15
  14. package/package/components/DynamicInput.svelte.d.ts +11 -0
  15. package/package/components/EditableSchemaForm.svelte +119 -95
  16. package/package/components/EditableSchemaForm.svelte.d.ts +4 -4
  17. package/package/components/Editor.svelte +86 -93
  18. package/package/components/Editor.svelte.d.ts +4 -3
  19. package/package/components/EditorBar.svelte +2 -5
  20. package/package/components/FlowBuilder.svelte +3 -3
  21. package/package/components/FlowLogRow.svelte +64 -0
  22. package/package/components/FlowLogRow.svelte.d.ts +15 -0
  23. package/package/components/FlowLogViewer.svelte +406 -373
  24. package/package/components/FlowLogViewer.svelte.d.ts +5 -1
  25. package/package/components/FlowLogViewerWrapper.svelte +44 -1
  26. package/package/components/FlowLoopIterationPreview.svelte.d.ts +1 -1
  27. package/package/components/FlowPreviewContent.svelte.d.ts +1 -1
  28. package/package/components/FlowStatusViewerInner.svelte +34 -3
  29. package/package/components/FolderPicker.svelte +1 -1
  30. package/package/components/InputTransformForm.svelte +20 -10
  31. package/package/components/JobArgs.svelte +1 -1
  32. package/package/components/JobLoader.svelte.d.ts +1 -1
  33. package/package/components/JobStatus.svelte +2 -0
  34. package/package/components/LogSnippetViewer.svelte +3 -3
  35. package/package/components/LogSnippetViewer.svelte.d.ts +1 -1
  36. package/package/components/LogViewer.svelte +87 -71
  37. package/package/components/LogViewer.svelte.d.ts +1 -0
  38. package/package/components/Path.svelte +7 -1
  39. package/package/components/Path.svelte.d.ts +1 -1
  40. package/package/components/PrefixedInput.svelte +120 -0
  41. package/package/components/PrefixedInput.svelte.d.ts +8 -0
  42. package/package/components/QueuePosition.svelte +81 -0
  43. package/package/components/QueuePosition.svelte.d.ts +8 -0
  44. package/package/components/ResourceNarrowing.svelte +13 -0
  45. package/package/components/ResourceNarrowing.svelte.d.ts +6 -0
  46. package/package/components/ResourceTypePicker.svelte +49 -74
  47. package/package/components/RunChart.svelte +74 -89
  48. package/package/components/RunChart.svelte.d.ts +10 -22
  49. package/package/components/S3FilePicker.svelte +1 -1
  50. package/package/components/SchemaForm.svelte.d.ts +2 -2
  51. package/package/components/ScriptBuilder.svelte +2 -1
  52. package/package/components/ScriptEditor.svelte +4 -3
  53. package/package/components/ScriptEditor.svelte.d.ts +2 -1
  54. package/package/components/ServiceLogsInner.svelte +1 -1
  55. package/package/components/ShareModal.svelte.d.ts +1 -1
  56. package/package/components/SimpleEditor.svelte +4 -67
  57. package/package/components/StringTypeNarrowing.svelte +5 -10
  58. package/package/components/TemplateEditor.svelte +2 -16
  59. package/package/components/TimeAgo.svelte +1 -1
  60. package/package/components/TimeAgo.svelte.d.ts +1 -0
  61. package/package/components/Toggle.svelte +2 -1
  62. package/package/components/Toggle.svelte.d.ts +2 -1
  63. package/package/components/WorkerRepl.svelte +1 -1
  64. package/package/components/apps/components/display/AppNavbarItem.svelte +2 -1
  65. package/package/components/apps/components/display/table/AppAggridTable.svelte +44 -48
  66. package/package/components/apps/components/display/table/SyncColumnDefs.svelte +101 -19
  67. package/package/components/apps/components/display/table/SyncColumnDefs.svelte.d.ts +5 -2
  68. package/package/components/apps/components/display/table/utils.js +36 -5
  69. package/package/components/apps/components/inputs/currency/CurrencyInput.svelte +10 -5
  70. package/package/components/apps/editor/AppEditor.svelte +4 -3
  71. package/package/components/apps/editor/AppEditorHeader.svelte +0 -1
  72. package/package/components/apps/editor/GridViewer.svelte.d.ts +11 -4
  73. package/package/components/apps/editor/SettingsPanel.svelte +2 -2
  74. package/package/components/apps/editor/componentsPanel/ListItem.svelte +2 -2
  75. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte.d.ts +1 -1
  76. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditorDrawer.svelte.d.ts +1 -1
  77. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte.d.ts +1 -1
  78. package/package/components/apps/editor/settingsPanel/ArrayStaticInputEditor.svelte +26 -3
  79. package/package/components/apps/editor/settingsPanel/InputsSpecEditor.svelte +1 -1
  80. package/package/components/apps/editor/settingsPanel/inputEditor/StaticInputEditor.svelte +13 -5
  81. package/package/components/apps/svelte-grid/Grid.svelte.d.ts +30 -11
  82. package/package/components/assets/JobAssetsViewer.svelte +28 -24
  83. package/package/components/auditLogs/AuditLogsTable.svelte +2 -6
  84. package/package/components/chartjs-wrappers/Chart.svelte.d.ts +14 -7
  85. package/package/components/common/OnChange.svelte.d.ts +11 -4
  86. package/package/components/common/badge/Badge.svelte +9 -2
  87. package/package/components/common/badge/Badge.svelte.d.ts +2 -1
  88. package/package/components/common/calendarPicker/CalendarPicker.svelte +5 -1
  89. package/package/components/common/calendarPicker/CalendarPicker.svelte.d.ts +5 -4
  90. package/package/components/common/drawer/Disposable.svelte +9 -11
  91. package/package/components/common/drawer/Drawer.svelte +3 -4
  92. package/package/components/common/drawer/Drawer.svelte.d.ts +1 -0
  93. package/package/components/common/menu/MenuItem.svelte.d.ts +2 -2
  94. package/package/components/common/modal/Modal.svelte.d.ts +1 -1
  95. package/package/components/common/tabs/TabContent.svelte +2 -7
  96. package/package/components/common/tabs/TabContent.svelte.d.ts +5 -27
  97. package/package/components/common/toggleButton-v2/ToggleButtonGroup.svelte +9 -3
  98. package/package/components/common/toggleButton-v2/ToggleButtonGroup.svelte.d.ts +1 -0
  99. package/package/components/common/toggleButton-v2/ToggleButtonMore.svelte +8 -4
  100. package/package/components/common/toggleButton-v2/ToggleButtonMore.svelte.d.ts +1 -0
  101. package/package/components/copilot/MetadataGen.svelte +1 -1
  102. package/package/components/copilot/chat/AIChatManager.svelte.js +24 -102
  103. package/package/components/copilot/chat/AssistantMessage.svelte +0 -4
  104. package/package/components/copilot/chat/anthropic.d.ts +15 -0
  105. package/package/components/copilot/chat/anthropic.js +208 -0
  106. package/package/components/copilot/chat/api/apiTools.d.ts +2 -2
  107. package/package/components/copilot/chat/api/apiTools.js +10 -7
  108. package/package/components/copilot/chat/api/core.d.ts +1 -1
  109. package/package/components/copilot/chat/api/core.js +7 -2
  110. package/package/components/copilot/chat/ask/core.d.ts +1 -1
  111. package/package/components/copilot/chat/ask/core.js +7 -2
  112. package/package/components/copilot/chat/flow/core.d.ts +1 -1
  113. package/package/components/copilot/chat/flow/core.js +14 -4
  114. package/package/components/copilot/chat/monaco-adapter.d.ts +6 -5
  115. package/package/components/copilot/chat/navigator/core.d.ts +1 -1
  116. package/package/components/copilot/chat/navigator/core.js +7 -2
  117. package/package/components/copilot/chat/script/CodeDisplay.svelte +10 -111
  118. package/package/components/copilot/chat/script/core.d.ts +5 -4
  119. package/package/components/copilot/chat/script/core.js +131 -19
  120. package/package/components/copilot/chat/shared.d.ts +7 -7
  121. package/package/components/copilot/lib.d.ts +29 -8
  122. package/package/components/copilot/lib.js +199 -24
  123. package/package/components/flows/content/FlowInput.svelte +5 -5
  124. package/package/components/flows/content/FlowModuleComponent.svelte +5 -2
  125. package/package/components/flows/content/FlowModuleEarlyStop.svelte +47 -17
  126. package/package/components/flows/content/FlowModuleSleep.svelte +4 -1
  127. package/package/components/flows/content/FlowModuleSuspend.svelte +0 -1
  128. package/package/components/flows/content/FlowModuleTimeout.svelte +50 -10
  129. package/package/components/flows/content/FlowModuleTimeout.svelte.d.ts +1 -0
  130. package/package/components/flows/content/FlowRetries.svelte +108 -3
  131. package/package/components/flows/content/FlowRetries.svelte.d.ts +3 -2
  132. package/package/components/flows/flowInfers.js +8 -35
  133. package/package/components/flows/flowStore.d.ts +45 -1
  134. package/package/components/flows/flowStore.js +1 -1
  135. package/package/components/flows/map/FlowJobsMenu.svelte +3 -3
  136. package/package/components/flows/map/FlowModuleSchemaItem.svelte +61 -54
  137. package/package/components/flows/map/FlowModuleSchemaItem.svelte.d.ts +1 -1
  138. package/package/components/flows/map/FlowModuleSchemaItemViewer.svelte +1 -1
  139. package/package/components/flows/map/InsertModuleButton.svelte +1 -0
  140. package/package/components/flows/map/InsertModuleInner.svelte +12 -15
  141. package/package/components/flows/map/InsertModuleInner.svelte.d.ts +10 -9
  142. package/package/components/flows/propPicker/OutputPickerInner.svelte.d.ts +1 -1
  143. package/package/components/git_sync/DetectionFlow.svelte +15 -17
  144. package/package/components/git_sync/GitSyncContext.svelte.js +1 -1
  145. package/package/components/git_sync/GitSyncRepositoryCard.svelte +0 -1
  146. package/package/components/graph/graphBuilder.svelte.d.ts +5 -1
  147. package/package/components/graph/renderers/edges/BaseEdge.svelte +9 -1
  148. package/package/components/graph/renderers/edges/BaseEdge.svelte.d.ts +4 -1
  149. package/package/components/graph/renderers/nodes/BranchAllStart.svelte +2 -3
  150. package/package/components/graph/renderers/nodes/BranchOneStart.svelte +2 -3
  151. package/package/components/graph/renderers/triggers/TriggerButton.svelte.d.ts +1 -1
  152. package/package/components/graph/renderers/triggers/TriggersBadge.svelte +3 -1
  153. package/package/components/graph/renderers/triggers/TriggersWrapper.svelte +34 -24
  154. package/package/components/graph/renderers/triggers/TriggersWrapper.svelte.d.ts +1 -2
  155. package/package/components/home/ItemsList.svelte +17 -13
  156. package/package/components/home/TreeView.svelte +21 -27
  157. package/package/components/home/TreeView.svelte.d.ts +2 -29
  158. package/package/components/home/TreeViewRoot.svelte +11 -23
  159. package/package/components/home/TreeViewRoot.svelte.d.ts +15 -13
  160. package/package/components/icons/GitIcon.svelte +10 -2
  161. package/package/components/icons/GitIcon.svelte.d.ts +1 -0
  162. package/package/components/meltComponents/MeltButton.svelte.d.ts +1 -1
  163. package/package/components/meltComponents/Popover.svelte +23 -3
  164. package/package/components/meltComponents/Popover.svelte.d.ts +2 -1
  165. package/package/components/monacoLanguagesOptions.d.ts +3 -0
  166. package/package/components/monacoLanguagesOptions.js +109 -0
  167. package/package/components/propertyPicker/ObjectViewer.svelte +7 -2
  168. package/package/components/propertyPicker/PropPicker.svelte +1 -1
  169. package/package/components/propertyPicker/utils.js +14 -7
  170. package/package/components/runs/JobRunsPreview.svelte +212 -177
  171. package/package/components/runs/JobsLoader.svelte +2 -2
  172. package/package/components/runs/JobsLoader.svelte.d.ts +1 -1
  173. package/package/components/runs/NoWorkerWithTagWarning.svelte +18 -5
  174. package/package/components/runs/RunBadges.svelte +100 -0
  175. package/package/components/runs/RunBadges.svelte.d.ts +12 -0
  176. package/package/components/runs/RunLabels.svelte +86 -0
  177. package/package/components/runs/RunLabels.svelte.d.ts +10 -0
  178. package/package/components/runs/RunOption.svelte +20 -0
  179. package/package/components/runs/RunOption.svelte.d.ts +10 -0
  180. package/package/components/runs/RunRow.svelte +239 -151
  181. package/package/components/runs/RunRow.svelte.d.ts +12 -9
  182. package/package/components/runs/RunsBatchActionsDropdown.svelte +13 -17
  183. package/package/components/runs/RunsBatchActionsDropdown.svelte.d.ts +5 -18
  184. package/package/components/runs/RunsFilter.svelte +369 -243
  185. package/package/components/runs/RunsFilter.svelte.d.ts +2 -0
  186. package/package/components/runs/RunsQueue.svelte +96 -25
  187. package/package/components/runs/RunsQueue.svelte.d.ts +7 -21
  188. package/package/components/runs/RunsTable.svelte +62 -71
  189. package/package/components/runs/RunsTable.svelte.d.ts +2 -1
  190. package/package/components/runs/runs-grid.css +95 -0
  191. package/package/components/schema/EditableSchemaDrawer.svelte +12 -12
  192. package/package/components/schema/FlowPropertyEditor.svelte +197 -206
  193. package/package/components/schema/PropertyEditor.svelte +33 -35
  194. package/package/components/schema/SchemaFormDND.svelte.d.ts +2 -2
  195. package/package/components/search/GlobalSearchModal.svelte +8 -1
  196. package/package/components/select/DraggableTags.svelte.d.ts +17 -7
  197. package/package/components/select/MultiSelect.svelte.d.ts +21 -11
  198. package/package/components/select/Select.svelte +2 -1
  199. package/package/components/select/Select.svelte.d.ts +25 -13
  200. package/package/components/select/SelectDropdown.svelte.d.ts +14 -7
  201. package/package/components/settings/TokenDisplay.svelte +1 -1
  202. package/package/components/sidebar/OperatorMenu.svelte +5 -0
  203. package/package/components/sidebar/SidebarContent.svelte +48 -2
  204. package/package/components/sidebar/WorkspaceMenu.svelte +116 -17
  205. package/package/components/toast.js +6 -3
  206. package/package/components/triggers/AddTriggersButton.svelte +7 -6
  207. package/package/components/triggers/CaptureWrapper.svelte +19 -3
  208. package/package/components/triggers/TriggerLabel.svelte +8 -0
  209. package/package/components/triggers/TriggerTokens.svelte +1 -1
  210. package/package/components/triggers/TriggersEditor.svelte +9 -5
  211. package/package/components/triggers/TriggersTable.svelte +2 -2
  212. package/package/components/triggers/TriggersWrapper.svelte +16 -5
  213. package/package/components/triggers/TriggersWrapper.svelte.d.ts +3 -19
  214. package/package/components/{details/EmailTriggerCaptures.svelte → triggers/email/DefaultEmailCapture.svelte} +5 -5
  215. package/package/components/{details/EmailTriggerCaptures.svelte.d.ts → triggers/email/DefaultEmailCapture.svelte.d.ts} +4 -4
  216. package/package/components/{details/EmailTriggerConfigSection.svelte → triggers/email/DefaultEmailConfigSection.svelte} +24 -14
  217. package/package/components/triggers/email/DefaultEmailConfigSection.svelte.d.ts +13 -0
  218. package/package/components/triggers/email/DefaultEmailPanel.svelte +71 -0
  219. package/package/components/triggers/email/DefaultEmailPanel.svelte.d.ts +11 -0
  220. package/package/components/triggers/email/EmailCapture.svelte +39 -0
  221. package/package/components/triggers/email/EmailCapture.svelte.d.ts +43 -0
  222. package/package/components/triggers/email/EmailTriggerEditor.svelte +20 -0
  223. package/package/components/triggers/email/EmailTriggerEditor.svelte.d.ts +11 -0
  224. package/package/components/triggers/email/EmailTriggerEditorConfigSection.svelte +133 -0
  225. package/package/components/triggers/email/EmailTriggerEditorConfigSection.svelte.d.ts +14 -0
  226. package/package/components/triggers/email/EmailTriggerEditorInner.svelte +335 -0
  227. package/package/components/triggers/email/EmailTriggerEditorInner.svelte.d.ts +22 -0
  228. package/package/components/triggers/email/EmailTriggerPanel.svelte +61 -0
  229. package/package/components/triggers/email/EmailTriggerPanel.svelte.d.ts +14 -0
  230. package/package/components/triggers/email/utils.d.ts +4 -0
  231. package/package/components/triggers/email/utils.js +52 -0
  232. package/package/components/triggers/http/RouteEditorConfigSection.svelte +1 -1
  233. package/package/components/triggers/http/utils.js +1 -1
  234. package/package/components/triggers/triggers.svelte.d.ts +1 -0
  235. package/package/components/triggers/triggers.svelte.js +24 -2
  236. package/package/components/triggers/utils.js +19 -5
  237. package/package/components/triggers.d.ts +1 -1
  238. package/package/components/triggers.js +2 -0
  239. package/package/components/wizards/AgGridWizard.svelte +85 -80
  240. package/package/components/workspaceSettings/AISettings.svelte +74 -22
  241. package/package/components/workspaceSettings/AISettings.svelte.d.ts +2 -1
  242. package/package/components/workspaceSettings/CreateWorkspace.svelte +395 -0
  243. package/package/components/workspaceSettings/CreateWorkspace.svelte.d.ts +6 -0
  244. package/package/components/workspaceSettings/DucklakeSettings.svelte +3 -1
  245. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte +1 -1
  246. package/package/components/workspaceSettings/StorageSettings.svelte +69 -48
  247. package/package/gen/core/OpenAPI.js +1 -1
  248. package/package/gen/schemas.gen.d.ts +142 -3
  249. package/package/gen/schemas.gen.js +144 -3
  250. package/package/gen/services.gen.d.ts +129 -1
  251. package/package/gen/services.gen.js +267 -1
  252. package/package/gen/types.gen.d.ts +434 -8
  253. package/package/hubPaths.json +4 -2
  254. package/package/infer.js +1 -1
  255. package/package/keyboardChain.d.ts +5 -0
  256. package/package/keyboardChain.js +40 -0
  257. package/package/services/JobManager.js +2 -2
  258. package/package/stores.d.ts +3 -1
  259. package/package/stores.js +8 -5
  260. package/package/utils/workspaceHierarchy.d.ts +27 -0
  261. package/package/utils/workspaceHierarchy.js +101 -0
  262. package/package/utils.d.ts +6 -3
  263. package/package/utils.js +30 -15
  264. package/package/workspace_settings.js +2 -3
  265. package/package.json +9 -11
  266. package/package/components/DynSelect.svelte.d.ts +0 -11
  267. package/package/components/ObjectTypeNarrowing.svelte +0 -18
  268. package/package/components/ObjectTypeNarrowing.svelte.d.ts +0 -22
  269. package/package/components/details/DetailPageTriggerPanel.svelte +0 -121
  270. package/package/components/details/DetailPageTriggerPanel.svelte.d.ts +0 -20
  271. package/package/components/details/EmailTriggerConfigSection.svelte.d.ts +0 -12
  272. package/package/components/details/EmailTriggerPanel.svelte +0 -76
  273. package/package/components/details/EmailTriggerPanel.svelte.d.ts +0 -26
@@ -0,0 +1,208 @@
1
+ import { OpenAI } from 'openai';
2
+ import { getProviderAndCompletionConfig, workspaceAIClients } from '../lib';
3
+ import { processToolCall } from './shared';
4
+ export async function getAnthropicCompletion(messages, abortController, tools) {
5
+ const { provider, config } = getProviderAndCompletionConfig({ messages, stream: true });
6
+ const { system, messages: anthropicMessages } = convertOpenAIToAnthropicMessages(messages);
7
+ const anthropicTools = convertOpenAIToolsToAnthropic(tools);
8
+ const anthropicClient = workspaceAIClients.getAnthropicClient();
9
+ const anthropicParams = {
10
+ model: config.model,
11
+ max_tokens: config.max_tokens,
12
+ messages: anthropicMessages,
13
+ ...(system && { system }),
14
+ ...(anthropicTools && { tools: anthropicTools }),
15
+ ...(typeof config.temperature === 'number' && { temperature: config.temperature })
16
+ };
17
+ const stream = anthropicClient.messages.stream(anthropicParams, {
18
+ signal: abortController.signal,
19
+ headers: {
20
+ 'X-Provider': provider,
21
+ 'anthropic-version': '2023-06-01',
22
+ 'X-Anthropic-SDK': 'true'
23
+ }
24
+ });
25
+ return stream;
26
+ }
27
+ export async function parseAnthropicCompletion(completion, callbacks, messages, addedMessages, tools, helpers) {
28
+ let toolCallsToProcess = [];
29
+ let error = null;
30
+ // Handle text streaming
31
+ completion.on('text', (textDelta, _textSnapshot) => {
32
+ callbacks.onNewToken(textDelta);
33
+ });
34
+ completion.on('message', (message) => {
35
+ for (const block of message.content) {
36
+ if (block.type === 'text') {
37
+ const text = block.text;
38
+ const assistantMessage = { role: 'assistant', content: text };
39
+ messages.push(assistantMessage);
40
+ addedMessages.push(assistantMessage);
41
+ callbacks.onMessageEnd();
42
+ }
43
+ else if (block.type === 'tool_use') {
44
+ // Convert Anthropic tool calls to OpenAI format for compatibility
45
+ toolCallsToProcess.push({
46
+ id: block.id,
47
+ type: 'function',
48
+ function: {
49
+ name: block.name,
50
+ arguments: JSON.stringify(block.input)
51
+ }
52
+ });
53
+ // Preprocess tool if it has a preAction
54
+ const tool = tools.find((t) => t.def.function.name === block.name);
55
+ if (tool && tool.preAction) {
56
+ tool.preAction({ toolCallbacks: callbacks, toolId: block.id });
57
+ }
58
+ }
59
+ }
60
+ });
61
+ // Handle errors
62
+ completion.on('error', (e) => {
63
+ console.error('Anthropic stream error:', e);
64
+ error = e;
65
+ });
66
+ // Wait for completion
67
+ await completion.done();
68
+ callbacks.onMessageEnd();
69
+ if (error) {
70
+ throw error;
71
+ }
72
+ // Process tool calls if any
73
+ if (toolCallsToProcess.length > 0) {
74
+ const assistantWithTools = {
75
+ role: 'assistant',
76
+ tool_calls: toolCallsToProcess
77
+ };
78
+ messages.push(assistantWithTools);
79
+ addedMessages.push(assistantWithTools);
80
+ // Process each tool call
81
+ for (const toolCall of toolCallsToProcess) {
82
+ const messageToAdd = await processToolCall({
83
+ tools,
84
+ toolCall,
85
+ helpers,
86
+ toolCallbacks: callbacks
87
+ });
88
+ messages.push(messageToAdd);
89
+ addedMessages.push(messageToAdd);
90
+ }
91
+ return true; // Continue the conversation loop
92
+ }
93
+ return false; // End the conversation
94
+ }
95
+ export function convertOpenAIToAnthropicMessages(messages) {
96
+ let system;
97
+ const anthropicMessages = [];
98
+ for (const message of messages) {
99
+ if (message.role === 'system') {
100
+ const systemText = typeof message.content === 'string' ? message.content : JSON.stringify(message.content);
101
+ // Convert system to array format with cache_control for caching
102
+ system = [
103
+ {
104
+ type: 'text',
105
+ text: systemText,
106
+ cache_control: { type: 'ephemeral' }
107
+ }
108
+ ];
109
+ continue;
110
+ }
111
+ if (message.role === 'user') {
112
+ anthropicMessages.push({
113
+ role: 'user',
114
+ content: typeof message.content === 'string' ? message.content : JSON.stringify(message.content)
115
+ });
116
+ }
117
+ else if (message.role === 'assistant') {
118
+ const content = [];
119
+ if (message.content) {
120
+ content.push({
121
+ type: 'text',
122
+ text: typeof message.content === 'string' ? message.content : JSON.stringify(message.content)
123
+ });
124
+ }
125
+ if (message.tool_calls) {
126
+ for (const toolCall of message.tool_calls) {
127
+ if (toolCall.type !== 'function')
128
+ continue;
129
+ let input = {};
130
+ try {
131
+ input = JSON.parse(toolCall.function.arguments || '{}');
132
+ }
133
+ catch (e) {
134
+ console.error('Failed to parse tool call arguments', e);
135
+ }
136
+ content.push({
137
+ type: 'tool_use',
138
+ id: toolCall.id,
139
+ name: toolCall.function.name,
140
+ input
141
+ });
142
+ }
143
+ }
144
+ if (content.length > 0) {
145
+ anthropicMessages.push({
146
+ role: 'assistant',
147
+ content: content.length === 1 && content[0].type === 'text' ? content[0].text : content
148
+ });
149
+ }
150
+ }
151
+ else if (message.role === 'tool') {
152
+ // Tool results must be in user messages in Anthropic format
153
+ anthropicMessages.push({
154
+ role: 'user',
155
+ content: [
156
+ {
157
+ type: 'tool_result',
158
+ tool_use_id: message.tool_call_id,
159
+ content: typeof message.content === 'string'
160
+ ? message.content
161
+ : JSON.stringify(message.content)
162
+ }
163
+ ]
164
+ });
165
+ }
166
+ }
167
+ // Add cache_control to the last message content blocks
168
+ if (anthropicMessages.length > 0) {
169
+ const lastMessage = anthropicMessages[anthropicMessages.length - 1];
170
+ if (Array.isArray(lastMessage.content)) {
171
+ // Add cache_control to the last content block
172
+ if (lastMessage.content.length > 0) {
173
+ const lastBlock = lastMessage.content[lastMessage.content.length - 1];
174
+ if (lastBlock.type === 'text') {
175
+ lastBlock.cache_control = { type: 'ephemeral' };
176
+ }
177
+ }
178
+ }
179
+ else if (typeof lastMessage.content === 'string') {
180
+ // Convert string content to array format with cache_control
181
+ lastMessage.content = [
182
+ {
183
+ type: 'text',
184
+ text: lastMessage.content,
185
+ cache_control: { type: 'ephemeral' }
186
+ }
187
+ ];
188
+ }
189
+ }
190
+ return { system, messages: anthropicMessages };
191
+ }
192
+ export function convertOpenAIToolsToAnthropic(tools) {
193
+ if (!tools || tools.length === 0)
194
+ return undefined;
195
+ const anthropicTools = tools.map((tool) => ({
196
+ name: tool.function.name,
197
+ description: tool.function.description,
198
+ input_schema: (tool.function.parameters || {
199
+ type: 'object',
200
+ properties: {}
201
+ })
202
+ }));
203
+ // Add cache_control to the last tool to cache all tool definitions
204
+ if (anthropicTools.length > 0) {
205
+ anthropicTools[anthropicTools.length - 1].cache_control = { type: 'ephemeral' };
206
+ }
207
+ return anthropicTools;
208
+ }
@@ -1,6 +1,6 @@
1
- import type { ChatCompletionTool } from 'openai/resources/index.mjs';
1
+ import type { ChatCompletionFunctionTool } from 'openai/resources/index.mjs';
2
2
  import type { Tool } from '../shared';
3
- export declare function createApiTools(chatTools: ChatCompletionTool[], endpointMap?: Record<string, {
3
+ export declare function createApiTools(chatTools: ChatCompletionFunctionTool[], endpointMap?: Record<string, {
4
4
  method: string;
5
5
  path: string;
6
6
  }>): Tool<{}>[];
@@ -15,7 +15,8 @@ function buildApiCallTool(endpointTool) {
15
15
  if (key === 'workspace')
16
16
  continue;
17
17
  parameters.properties[key] = schema;
18
- if (Array.isArray(endpointTool.path_params_schema.required) && endpointTool.path_params_schema.required.includes(key)) {
18
+ if (Array.isArray(endpointTool.path_params_schema.required) &&
19
+ endpointTool.path_params_schema.required.includes(key)) {
19
20
  parameters.required.push(key);
20
21
  }
21
22
  }
@@ -24,7 +25,8 @@ function buildApiCallTool(endpointTool) {
24
25
  if (endpointTool.query_params_schema?.properties) {
25
26
  for (const [key, schema] of Object.entries(endpointTool.query_params_schema.properties)) {
26
27
  parameters.properties[key] = schema;
27
- if (Array.isArray(endpointTool.query_params_schema.required) && endpointTool.query_params_schema.required.includes(key)) {
28
+ if (Array.isArray(endpointTool.query_params_schema.required) &&
29
+ endpointTool.query_params_schema.required.includes(key)) {
28
30
  parameters.required.push(key);
29
31
  }
30
32
  }
@@ -38,7 +40,8 @@ function buildApiCallTool(endpointTool) {
38
40
  properties: endpointTool.body_schema.properties,
39
41
  required: endpointTool.body_schema.required || []
40
42
  };
41
- if (Array.isArray(endpointTool.body_schema.required) && endpointTool.body_schema.required.length > 0) {
43
+ if (Array.isArray(endpointTool.body_schema.required) &&
44
+ endpointTool.body_schema.required.length > 0) {
42
45
  parameters.required.push('body');
43
46
  }
44
47
  }
@@ -114,7 +117,7 @@ export function createApiTools(chatTools, endpointMap = {}) {
114
117
  url += `?${searchParams.toString()}`;
115
118
  }
116
119
  toolCallbacks.setToolStatus(toolId, {
117
- content: `Calling ${toolName}...`,
120
+ content: `Calling ${toolName}...`
118
121
  });
119
122
  const fetchOptions = {
120
123
  method: endpoint.method
@@ -141,7 +144,7 @@ export function createApiTools(chatTools, endpointMap = {}) {
141
144
  });
142
145
  toolCallbacks.setToolStatus(toolId, {
143
146
  content: `Call to ${toolName} completed`,
144
- result: jsonResult,
147
+ result: jsonResult
145
148
  });
146
149
  return jsonResult;
147
150
  }
@@ -155,7 +158,7 @@ export function createApiTools(chatTools, endpointMap = {}) {
155
158
  toolCallbacks.setToolStatus(toolId, {
156
159
  content: `Call to ${toolName} failed`,
157
160
  result: jsonResult,
158
- error: `HTTP ${response.status}: ${text}`,
161
+ error: `HTTP ${response.status}: ${text}`
159
162
  });
160
163
  return jsonResult;
161
164
  }
@@ -164,7 +167,7 @@ export function createApiTools(chatTools, endpointMap = {}) {
164
167
  const errorMessage = `Error calling API: ${error instanceof Error ? error.message : String(error)}`;
165
168
  toolCallbacks.setToolStatus(toolId, {
166
169
  content: `Call to ${toolName} failed`,
167
- error: errorMessage,
170
+ error: errorMessage
168
171
  });
169
172
  console.error(`Error calling API:`, error);
170
173
  return errorMessage;
@@ -3,5 +3,5 @@ import type { Tool } from '../shared';
3
3
  export declare const CHAT_SYSTEM_PROMPT: (username: string) => string;
4
4
  export declare function getApiTools(): Promise<Tool<{}>[]>;
5
5
  export declare const apiTools: Tool<{}>[];
6
- export declare function prepareApiSystemMessage(): ChatCompletionSystemMessageParam;
6
+ export declare function prepareApiSystemMessage(customPrompt?: string): ChatCompletionSystemMessageParam;
7
7
  export declare function prepareApiUserMessage(instructions: string): ChatCompletionUserMessageParam;
@@ -47,10 +47,15 @@ export async function getApiTools() {
47
47
  return apiToolsCache;
48
48
  }
49
49
  export const apiTools = [getDocumentationTool];
50
- export function prepareApiSystemMessage() {
50
+ export function prepareApiSystemMessage(customPrompt) {
51
+ let content = CHAT_SYSTEM_PROMPT(get(userStore)?.username ?? '');
52
+ // If there's a custom prompt, append it to the system prompt
53
+ if (customPrompt?.trim()) {
54
+ content = `${content}\n\nUSER GIVEN INSTRUCTIONS:\n${customPrompt.trim()}`;
55
+ }
51
56
  return {
52
57
  role: 'system',
53
- content: CHAT_SYSTEM_PROMPT(get(userStore)?.username ?? '')
58
+ content
54
59
  };
55
60
  }
56
61
  export function prepareApiUserMessage(instructions) {
@@ -2,5 +2,5 @@ import type { ChatCompletionSystemMessageParam, ChatCompletionUserMessageParam }
2
2
  import type { Tool } from '../shared';
3
3
  export declare const CHAT_SYSTEM_PROMPT = "\nYou are Windmill's intelligent assistant, designed to answer questions about its functionality. It is your only purpose to help the user in the context of the windmill application.\nWindmill is an open-source developer platform for building internal tools, API integrations, background jobs, workflows, and user interfaces. It offers a unified system where scripts are automatically turned into sharable UIs and can be composed into flows or embedded in custom applications.\n\nYou have access to these tools:\n1. Get documentation for user requests (get_documentation)\n\nINSTRUCTIONS:\n- When user asks about something, use the get_documentation tool to retrieve accurate information about how to fulfill the user's request.\n- Complete your response with precisions about how it works based on the documentation. Also drop a link to the relevant documentation if possible.\n- If the user asks about something that you are unsure about, say that you are not sure about the answer and suggest to ask the question to the windmill team.\n\nGENERAL PRINCIPLES:\n- Be concise but thorough\n- Maintain a friendly, professional tone\n- If you encounter an error or can't complete a request, explain why and suggest alternatives\n";
4
4
  export declare const askTools: Tool<{}>[];
5
- export declare function prepareAskSystemMessage(): ChatCompletionSystemMessageParam;
5
+ export declare function prepareAskSystemMessage(customPrompt?: string): ChatCompletionSystemMessageParam;
6
6
  export declare function prepareAskUserMessage(instructions: string): ChatCompletionUserMessageParam;
@@ -17,10 +17,15 @@ GENERAL PRINCIPLES:
17
17
  - If you encounter an error or can't complete a request, explain why and suggest alternatives
18
18
  `;
19
19
  export const askTools = [getDocumentationTool];
20
- export function prepareAskSystemMessage() {
20
+ export function prepareAskSystemMessage(customPrompt) {
21
+ let content = CHAT_SYSTEM_PROMPT;
22
+ // If there's a custom prompt, append it to the system prompt
23
+ if (customPrompt?.trim()) {
24
+ content = `${content}\n\nUSER GIVEN INSTRUCTIONS:\n${customPrompt.trim()}`;
25
+ }
21
26
  return {
22
27
  role: 'system',
23
- content: CHAT_SYSTEM_PROMPT
28
+ content
24
29
  };
25
30
  }
26
31
  export function prepareAskUserMessage(instructions) {
@@ -138,7 +138,7 @@ declare const insertLocationSchema: z.ZodUnion<[z.ZodObject<{
138
138
  }>]>;
139
139
  type InsertLocation = z.infer<typeof insertLocationSchema>;
140
140
  export declare const flowTools: Tool<FlowAIChatHelpers>[];
141
- export declare function prepareFlowSystemMessage(): ChatCompletionSystemMessageParam;
141
+ export declare function prepareFlowSystemMessage(customPrompt?: string): ChatCompletionSystemMessageParam;
142
142
  export declare function prepareFlowUserMessage(instructions: string, flowAndSelectedId?: {
143
143
  flow: ExtendedOpenFlow;
144
144
  selectedId: string;
@@ -425,7 +425,10 @@ export const flowTools = [
425
425
  }
426
426
  },
427
427
  {
428
- def: setForLoopOptionsToolDef,
428
+ def: {
429
+ ...setForLoopOptionsToolDef,
430
+ function: { ...setForLoopOptionsToolDef.function, strict: false }
431
+ },
429
432
  fn: async ({ args, helpers, toolId, toolCallbacks }) => {
430
433
  const parsedArgs = setForLoopOptionsSchema.parse(args);
431
434
  await helpers.setForLoopOptions(parsedArgs.id, {
@@ -442,7 +445,10 @@ export const flowTools = [
442
445
  }
443
446
  },
444
447
  {
445
- def: setModuleControlOptionsToolDef,
448
+ def: {
449
+ ...setModuleControlOptionsToolDef,
450
+ function: { ...setModuleControlOptionsToolDef.function, strict: false }
451
+ },
446
452
  fn: async ({ args, helpers, toolId, toolCallbacks }) => {
447
453
  const parsedArgs = setModuleControlOptionsSchema.parse(args);
448
454
  await helpers.setModuleControlOptions(parsedArgs.id, {
@@ -636,8 +642,8 @@ export const flowTools = [
636
642
  showDetails: true
637
643
  }
638
644
  ];
639
- export function prepareFlowSystemMessage() {
640
- const content = `You are a helpful assistant that creates and edits workflows on the Windmill platform. You're provided with a bunch of tools to help you edit the flow.
645
+ export function prepareFlowSystemMessage(customPrompt) {
646
+ let content = `You are a helpful assistant that creates and edits workflows on the Windmill platform. You're provided with a bunch of tools to help you edit the flow.
641
647
  Follow the user instructions carefully.
642
648
  Go step by step, and explain what you're doing as you're doing it.
643
649
  DO NOT wait for user confirmation before performing an action. Only do it if the user explicitly asks you to wait in their initial instructions.
@@ -762,6 +768,10 @@ On Windmill, credentials and configuration are stored in resources. Resource typ
762
768
  If the user needs a resource as flow input, you should set the property type in the schema to "object" as well as add a key called "format" and set it to "resource-nameofresourcetype" (e.g. "resource-stripe").
763
769
  If the user wants a specific resource as step input, you should set the step value to a static string in the following format: "$res:path/to/resource".
764
770
  `;
771
+ // If there's a custom prompt, append it to the system prompt
772
+ if (customPrompt?.trim()) {
773
+ content = `${content}\n\nUSER GIVEN INSTRUCTIONS:\n${customPrompt.trim()}`;
774
+ }
765
775
  return {
766
776
  role: 'system',
767
777
  content
@@ -5,6 +5,11 @@ type ExcludeVariant<T, K extends keyof T, V> = T extends Record<K, V> ? never :
5
5
  type VisualChangeWithDiffIndex = ExcludeVariant<VisualChange, 'type', 'added_inline'> & {
6
6
  diffIndex: number;
7
7
  };
8
+ export interface ReviewChangesOpts {
9
+ applyAll?: boolean;
10
+ mode?: 'apply' | 'revert';
11
+ onFinishedReview?: () => void;
12
+ }
8
13
  export declare class AIChatEditorHandler {
9
14
  editor: meditor.IStandaloneCodeEditor;
10
15
  viewZoneIds: string[];
@@ -41,10 +46,6 @@ export declare class AIChatEditorHandler {
41
46
  groupIndex: number;
42
47
  }): void;
43
48
  private calculateVisualChanges;
44
- reviewChanges(targetCode: string, opts?: {
45
- applyAll?: boolean;
46
- mode?: 'apply' | 'revert';
47
- onFinishedReview?: () => void;
48
- }): Promise<void>;
49
+ reviewChanges(targetCode: string, opts?: ReviewChangesOpts): Promise<void>;
49
50
  }
50
51
  export {};
@@ -3,5 +3,5 @@ import type { Tool } from '../shared';
3
3
  export declare const CHAT_SYSTEM_PROMPT = "\nYou are Windmill's intelligent assistant, designed to help users navigate the application and answer questions about its functionality. It is your only purpose to help the user in the context of the windmill application.\nWindmill is an open-source developer platform for building internal tools, API integrations, background jobs, workflows, and user interfaces. It offers a unified system where scripts are automatically turned into sharable UIs and can be composed into flows or embedded in custom applications.\n\nYou have access to these tools:\n1. View current buttons and inputs on the page (get_triggerable_components)\n2. Execute buttons and inputs (trigger_component) \n3. Get documentation for user requests (get_documentation)\n4. Change the AI mode to the one specified (change_mode)\n\nINSTRUCTIONS:\n- When users ask about application features or concepts, first use get_documentation internally to retrieve accurate information about how to fulfill the user's request.\n- Then immediately use the available tools to guide the user through the application. Do not wait for the user's confirmation before taking action.\n- If you detect a confirmation modal that needs user confirmation, stop the navigation and let the user know that the action is pending confirmation.\n- Use get_triggerable_components to understand available options, and then trigger the components using trigger_component. Then wait a moment before rescanning the current page, and then continue with the next step. Do this 5 times max.\n- Make sure you navigated as far as possible before responding to the user. Always use get_triggerable_components one last time to make sure you didn't miss anything.\n- If you are not able to fulfill the user's request after 5 attempts, redirect the user to the documentation.\n- If you are asked to fill a form or act on an input, input the existing json object and change the fields the user asked you to change. Take into account the prompt_for_ai field of the schema to know what and how to do changes. Then tell the user that you have updated the form, and ask him to review the changes before running the script or flow.\n- For form inputs where format starts with \"resource-\" and is not \"resource-obj\", fetch the available resources using get_available_resources, and then use the resource_path prefixed with \"$res:\" to fill the input.\n- If you are not sure about an input, set the ones you are sure about, and then ask the user for the value of the input you are not sure about.\n- If the user asks you to make an API call, switch to API mode with the change_mode tool before using the new tools you'll have access to to make the API call.\n\nGENERAL PRINCIPLES:\n- Be concise but thorough\n- Focus on taking action and completing the user's goals\n- Maintain a friendly, professional tone\n- If you encounter an error or can't complete a request, explain why and suggest alternatives\n- When asked about a specific script, flow or app, first check components directly related to the mentioned entity, before checking the other components.\n- When you do not find what you are looking for on the current page, go to the home page by looking for the \"Home\" component, then scan the components again.\n\nIMPORTANT CONSIDERATIONS:\n- The user might have changed the page in the middle of the conversation, so make sure you rescan the page on each user request instead of just responding that you cannot find what the user is asking for.\n- If you navigate to a script creation page, consider this:\n - The page opens with the settings drawer open. After doing the changes mentioned by the user, close the settings drawer.\n - Then if the user has described what he wanted the script to do, switch to script mode with the change_mode tool, and use the new tools you'll have access to to edit the script.\n- If you navigate to a flow creation page, consider this:\n - If the user has described what he wanted the flow to do, switch to flow mode with the change_mode tool before using the new tools you'll have access to to edit the flow.\n\nAlways use the provided tools purposefully and appropriately to achieve the user's goals.\nYour actions only allow you to navigate the application through the provided tools.\nWhen you complete the user's request, do not say \"I created...\" or \"I updated...\" or \"I deleted...\", but rather complete your response with precisions about how it works based on the documentation. Also drop a link to the relevant documentation if possible.\n\nExample of good behavior:\n- User: \"How can I set my AI providers?\"\n- You: <call get_documentation and fetch relevant documentation>\n- You: <call get_triggerable_components to find relevant components>\n- You: <trigger the components>\n- You: \"<precisions about the request based on the documentation>\"\n";
4
4
  export declare const getDocumentationTool: Tool<{}>;
5
5
  export declare const navigatorTools: Tool<{}>[];
6
- export declare function prepareNavigatorSystemMessage(): ChatCompletionSystemMessageParam;
6
+ export declare function prepareNavigatorSystemMessage(customPrompt?: string): ChatCompletionSystemMessageParam;
7
7
  export declare function prepareNavigatorUserMessage(instructions: string): ChatCompletionUserMessageParam;
@@ -319,10 +319,15 @@ export const navigatorTools = [
319
319
  getCurrentPageNameTool,
320
320
  getAvailableResourcesTool
321
321
  ];
322
- export function prepareNavigatorSystemMessage() {
322
+ export function prepareNavigatorSystemMessage(customPrompt) {
323
+ let content = CHAT_SYSTEM_PROMPT;
324
+ // If there's a custom prompt, append it to the system prompt
325
+ if (customPrompt?.trim()) {
326
+ content = `${content}\n\nUSER GIVEN INSTRUCTIONS:\n${customPrompt.trim()}`;
327
+ }
323
328
  return {
324
329
  role: 'system',
325
- content: CHAT_SYSTEM_PROMPT
330
+ content
326
331
  };
327
332
  }
328
333
  export function prepareNavigatorUserMessage(instructions) {
@@ -1,17 +1,7 @@
1
- <script lang="ts">import { Button } from '../../../common';
2
- import { getAstNode } from 'svelte-exmarkdown';
3
- import { editor as meditor } from 'monaco-editor';
4
- import { getContext, untrack } from 'svelte';
5
- import { Loader2 } from 'lucide-svelte';
6
- import { initializeVscode } from '../../../vscode';
1
+ <script lang="ts">import { getAstNode } from 'svelte-exmarkdown';
7
2
  import HighlightCode from '../../../HighlightCode.svelte';
8
3
  import { csharp, go, graphql, javascript, php, python, rust, shell, sql, typescript, yaml } from 'svelte-highlight/languages';
9
- import { scriptLangToEditorLang } from '../../../../scripts';
10
- import { aiChatManager } from '../AIChatManager.svelte';
11
4
  const astNode = getAstNode();
12
- const { message } = getContext('AssistantMessageContext');
13
- let codeContext = $derived(message.role === 'assistant' &&
14
- message.contextElements?.find((e) => e.type === 'code'));
15
5
  function getSmartLang(lang) {
16
6
  switch (lang) {
17
7
  case 'python':
@@ -69,106 +59,15 @@ const SMART_LANG_TO_HIGHLIGHT_LANG = {
69
59
  };
70
60
  let code = $derived(astNode.current.children?.[0]?.children?.[0]?.value);
71
61
  let language = $derived(astNode.current.children?.[0]?.properties?.class?.split('-')[1]);
72
- let loading = $state(true);
73
- $effect(() => {
74
- // we only want to trigger when astNode offset is updated not currentReply, otherwise as there is some delay on the offset update, loading would be set to false too early
75
- const completeReply = untrack(() => aiChatManager.currentReply);
76
- if (!aiChatManager.loading ||
77
- completeReply.length > (astNode.current.position?.end.offset ?? 0)) {
78
- loading = false;
79
- }
80
- });
81
- let diffEl = $state();
82
- let diffEditor = $state();
83
- async function setDiffEditor(diffEl) {
84
- if (!codeContext) {
85
- return;
86
- }
87
- await initializeVscode();
88
- diffEditor = meditor.createDiffEditor(diffEl, {
89
- automaticLayout: true,
90
- renderSideBySide: false,
91
- hideUnchangedRegions: {
92
- enabled: true
93
- },
94
- originalEditable: false,
95
- readOnly: true,
96
- renderGutterMenu: false,
97
- renderOverviewRuler: false,
98
- scrollBeyondLastLine: false,
99
- overviewRulerLanes: 0,
100
- lineNumbersMinChars: 0,
101
- lightbulb: {
102
- enabled: meditor.ShowLightbulbIconMode.Off
103
- },
104
- scrollbar: {
105
- alwaysConsumeMouseWheel: false
106
- }
107
- });
108
- diffEditor.setModel({
109
- original: meditor.createModel(codeContext.content, scriptLangToEditorLang(codeContext.lang)),
110
- modified: meditor.createModel(code ?? '', language ? getSmartLang(language) : undefined)
111
- });
112
- const originalEditor = diffEditor.getOriginalEditor();
113
- const modifiedEditor = diffEditor.getModifiedEditor();
114
- originalEditor.onDidContentSizeChange((e) => {
115
- diffEl.style.height = `${e.contentHeight}px`;
116
- });
117
- modifiedEditor.onDidContentSizeChange((e) => {
118
- diffEl.style.height = `${e.contentHeight}px`;
119
- });
120
- updateModifiedModel(code ?? '');
121
- }
122
- function updateModifiedModel(code) {
123
- const modified = diffEditor?.getModifiedEditor();
124
- if (!modified)
125
- return;
126
- const modifiedModel = modified.getModel();
127
- if (modifiedModel) {
128
- modifiedModel.setValue(code ?? '');
129
- }
130
- }
131
- $effect(() => updateModifiedModel(code ?? ''));
132
- $effect(() => {
133
- diffEl &&
134
- language &&
135
- codeContext &&
136
- getSmartLang(codeContext.lang) === getSmartLang(language) &&
137
- untrack(() => diffEl && setDiffEditor(diffEl));
138
- });
139
62
  </script>
140
63
 
141
- <div class="flex flex-col gap-0.5 rounded-lg relative not-prose">
142
- {#if aiChatManager.canApplyCode && code !== aiChatManager.scriptEditorOptions?.code}
143
- <div class="flex justify-end items-end">
144
- <Button
145
- color="dark"
146
- size="xs2"
147
- on:click={() => {
148
- aiChatManager.scriptEditorApplyCode?.(code ?? '')
149
- }}
150
- >
151
- {aiChatManager.pendingNewCode ? 'Accept all' : 'Apply'}
152
- </Button>
153
- </div>
154
- {/if}
155
-
156
- <div
157
- class="relative w-full border border-gray-300 dark:border-gray-600 rounded-lg overflow-hidden"
158
- >
159
- {#if aiChatManager.mode !== 'navigator' && loading && !code}
160
- <div class="flex flex-row gap-1 p-2 items-center justify-center">
161
- <Loader2 class="w-4 h-4 animate-spin" /> Generating code...
162
- </div>
163
- {:else if !loading && codeContext && getSmartLang(codeContext.lang) === getSmartLang(language as string)}
164
- <div bind:this={diffEl} class="w-full h-full"></div>
165
- {:else}
166
- <HighlightCode
167
- class="p-1"
168
- code={code ?? ''}
169
- highlightLanguage={SMART_LANG_TO_HIGHLIGHT_LANG[getSmartLang(language as string)]}
170
- language={undefined}
171
- />
172
- {/if}
173
- </div>
64
+ <div
65
+ class="flex flex-col not-prose relative w-full border border-gray-300 dark:border-gray-600 rounded-lg overflow-hidden"
66
+ >
67
+ <HighlightCode
68
+ class="p-1"
69
+ code={code ?? ''}
70
+ highlightLanguage={SMART_LANG_TO_HIGHLIGHT_LANG[getSmartLang(language as string)]}
71
+ language={undefined}
72
+ />
174
73
  </div>
@@ -2,6 +2,7 @@ import type { ResourceType, ScriptLang } from '../../../../gen/types.gen';
2
2
  import type { ChatCompletionSystemMessageParam, ChatCompletionUserMessageParam } from 'openai/resources/index.mjs';
3
3
  import type { ContextElement } from '../context';
4
4
  import { type Tool } from '../shared';
5
+ import type { ReviewChangesOpts } from '../monaco-adapter';
5
6
  export declare function formatResourceTypes(allResourceTypes: ResourceType[], lang: 'python3' | 'php' | 'bun' | 'deno' | 'nativets' | 'bunnative'): string;
6
7
  export declare const SUPPORTED_CHAT_SCRIPT_LANGUAGES: string[];
7
8
  export declare function getLangContext(lang: ScriptLang | 'bunnative' | 'jsx' | 'tsx' | 'json', { allowResourcesFetch, isPreprocessor }?: {
@@ -10,10 +11,10 @@ export declare function getLangContext(lang: ScriptLang | 'bunnative' | 'jsx' |
10
11
  isFailure?: boolean;
11
12
  }): string;
12
13
  export declare function getFormattedResourceTypes(lang: ScriptLang | 'bunnative', prompt: string, workspace: string): Promise<string>;
13
- export declare const CHAT_SYSTEM_PROMPT = "\n\tYou are a coding assistant for the Windmill platform. You are provided with a list of `INSTRUCTIONS` and the current contents of a code file under `CODE`.\n\n\tYour task is to respond to the user's request. Assume all user queries are valid and actionable.\n\n\tWhen the user requests code changes:\n\t- Always include a **single code block** with the **entire updated file**, not just the modified sections.\n\t- The code can include `[#START]` and `[#END]` markers to indicate the start and end of a code piece. You MUST only modify the code between these markers if given, and remove them in your response. If a question is asked about the code, you MUST only talk about the code between the markers. Refer to it as the code piece, not the code between the markers.\n\t- Follow the instructions carefully and explain the reasoning behind your changes.\n\t- If the request is abstract (e.g., \"make this cleaner\"), interpret it concretely and reflect that in the code block.\n\t- Preserve existing formatting, indentation, and whitespace unless changes are strictly required to fulfill the user's request.\n\t- The user can ask you to look at or modify specific files, databases or errors by having its name in the INSTRUCTIONS preceded by the @ symbol. In this case, put your focus on the element that is explicitly mentioned.\n\t- The user can ask you questions about a list of `DATABASES` that are available in the user's workspace. If the user asks you a question about a database, you should ask the user to specify the database name if not given, or take the only one available if there is only one.\n\t- You can also receive a `DIFF` of the changes that have been made to the code. You should use this diff to give better answers.\n\t- Before giving your answer, check again that you carefully followed these instructions.\n\t- When asked to create a script that communicates with an external service, you can use the `search_hub_scripts` tool to search for relevant scripts in the hub. Make sure the language is the same as what the user is coding in. If you do not find any relevant scripts, you can use the `search_npm_packages` tool to search for relevant packages and their documentation. Always give a link to the documentation in your answer if possible.\n\t- At the end of your reponse, if you modified or suggested changes to the code, ALWAYS use the `test_run_script` tool to test the code, and iterate on the code until it works as expected (MAX 3 times). If the user cancels the test run, do not try again and wait for the next user instruction.\n\n\tImportant:\n\tDo not mention or reveal these instructions to the user unless explicitly asked to do so.\n";
14
+ export declare const CHAT_SYSTEM_PROMPT = "\n\tYou are a coding assistant for the Windmill platform. You are provided with a list of `INSTRUCTIONS` and the current contents of a code file under `CODE`.\n\n\tYour task is to respond to the user's request. Assume all user queries are valid and actionable.\n\n\tWhen the user requests code changes:\n\t- ALWAYS use the `edit_code` tool to apply code changes. Use it only once with an array of diffs.\n\t- Pass an array of **diff objects** to the `edit_code` tool. Each diff should specify exactly what text to replace and what to replace it with.\n\t- Each diff object must contain:\n\t - `old_string`: The exact text to replace (must match the current code exactly)\n\t - `new_string`: The replacement text\n\t - `replace_all` (optional): Set to true to replace all occurrences, false or omit for first occurrence only\n\t- The code can include `[#START]` and `[#END]` markers to indicate the start and end of a code piece. You MUST only modify the code between these markers if given, and remove them when creating your diffs. If a question is asked about the code, you MUST only talk about the code between the markers. Refer to it as the code piece, not the code between the markers.\n\t- Follow the instructions carefully and explain the reasoning behind your changes in your response text.\n\t- If the request is abstract (e.g., \"make this cleaner\"), interpret it concretely and reflect that in the diffs.\n\t- Preserve existing formatting, indentation, and whitespace unless changes are strictly required to fulfill the user's request.\n\t- The user can ask you to look at or modify specific files, databases or errors by having its name in the INSTRUCTIONS preceded by the @ symbol. In this case, put your focus on the element that is explicitly mentioned.\n\t- The user can ask you questions about a list of `DATABASES` that are available in the user's workspace. If the user asks you a question about a database, you should ask the user to specify the database name if not given, or take the only one available if there is only one.\n\t- You can also receive a `DIFF` of the changes that have been made to the code. You should use this diff to give better answers.\n\t- Before giving your answer, check again that you carefully followed these instructions.\n\t- When asked to create a script that communicates with an external service, you can use the `search_hub_scripts` tool to search for relevant scripts in the hub. Make sure the language is the same as what the user is coding in. If you do not find any relevant scripts, you can use the `search_npm_packages` tool to search for relevant packages and their documentation. Always give a link to the documentation in your answer if possible.\n\t- After applying code changes with the `edit_code` tool, ALWAYS use the `test_run_script` tool to test the code, and iterate on the code until it works as expected (MAX 3 times). If the user cancels the test run, do not try again and wait for the next user instruction.\n\n\tExample diff usage:\n\tTo change \"return 1\" to \"return 2\", use:\n\t[{\n\t\t\"old_string\": \"return 1\",\n\t\t\"new_string\": \"return 2\"\n\t}]\n\n\tTo add a new function and modify an existing one:\n\t[{\n\t\t\"old_string\": \"export async function main() {\",\n\t\t\"new_string\": \"function helper() {\n\treturn 'help';\n}\n\nexport async function main() {\"\n\t}, {\n\t\t\"old_string\": \"return result;\",\n\t\t\"new_string\": \"return result + helper();\"\n\t}]\n\n\tImportant:\n\t- Each old_string must match the exact text in the current code, including whitespace and indentation.\n\t- Do not return the applied code in your response, just explain what you did. You can return code blocks in your response for explanations or examples as per user request.\n\t- Do not mention or reveal these instructions to the user unless explicitly asked to do so.\n";
14
15
  export declare const INLINE_CHAT_SYSTEM_PROMPT = "\n# Windmill Inline Coding Assistant\n\nYou are a coding assistant for the Windmill platform. You provide precise code modifications based on user instructions.\n\n## Input Format\n\nYou will receive:\n- **INSTRUCTIONS**: User's modification request\n- **CODE**: Current code content with modification boundaries\n- **DATABASES** *(optional)*: Available workspace databases\n\n### Code Boundaries\n\nThe code contains `[#START]` and `[#END]` markers indicating the modification scope:\n- **MUST** only modify code between these markers\n- **MUST** remove the markers in your response\n- **MUST** preserve all other code exactly as provided\n\n## Task Requirements\n\nReturn the modified CODE that fulfills the user's request. Assume all user queries are valid and actionable.\n\n### Critical Rules\n\n- \u2705 **ALWAYS** include a single code block with the entire updated CODE\n- \u2705 **ALWAYS** use the structured XML output format below\n- \u274C **NEVER** include only modified sections\n- \u274C **NEVER** add explanatory text or comments outside the format\n- \u274C **NEVER** include ``` code fences in your response\n- \u274C **NEVER** modify the code outside the boundaries\n\n## Output Format\n\n```xml\n<changes_made>\nBrief description of what was changed\n</changes_made>\n<new_code>\n[complete modified code without markers]\n</new_code>\n```\n\n## Example\n\n### Input:\n```xml\n<user_request>\nINSTRUCTIONS:\nReturn 2 instead of 1\n\nCODE:\nimport * as wmill from \"windmill-client\"\n\nfunction test() {\n\treturn \"hello\"\n}\n\n[#START]\nexport async function main() {\n\treturn 1;\n}\n[#END]\n</user_request>\n```\n\n### Expected Output:\n```xml\n<changes_made>\nChanged return value from 1 to 2 in main function\n</changes_made>\n<new_code>\nimport * as wmill from \"windmill-client\"\n\nfunction test() {\n\treturn \"hello\"\n}\n\nexport async function main() {\n\treturn 2;\n}\n</new_code>\n```\n";
15
16
  export declare const CHAT_USER_PROMPT = "\nINSTRUCTIONS:\n{instructions}\n\nWINDMILL LANGUAGE CONTEXT:\n{lang_context}\n\n";
16
- export declare function prepareScriptSystemMessage(): ChatCompletionSystemMessageParam;
17
+ export declare function prepareScriptSystemMessage(customPrompt?: string): ChatCompletionSystemMessageParam;
17
18
  export declare function prepareScriptTools(language: ScriptLang | 'bunnative', context: ContextElement[]): Tool<ScriptChatHelpers>[];
18
19
  export declare function prepareScriptUserMessage(instructions: string, language: ScriptLang | 'bunnative', selectedContext: ContextElement[], options?: {
19
20
  isPreprocessor?: boolean;
@@ -26,8 +27,7 @@ export interface ScriptChatHelpers {
26
27
  path: string;
27
28
  args: Record<string, any>;
28
29
  };
29
- getLastSuggestedCode: () => string | undefined;
30
- applyCode: (code: string, applyAll?: boolean) => void;
30
+ applyCode: (code: string, opts?: ReviewChangesOpts) => Promise<void>;
31
31
  }
32
32
  export declare const resourceTypeTool: Tool<ScriptChatHelpers>;
33
33
  export declare function createDbSchemaTool<T>(): Tool<T>;
@@ -41,4 +41,5 @@ export declare function fetchNpmPackageTypes(packageName: string, version?: stri
41
41
  types: string;
42
42
  error?: string;
43
43
  }>;
44
+ export declare const editCodeTool: Tool<ScriptChatHelpers>;
44
45
  export declare const testRunScriptTool: Tool<ScriptChatHelpers>;