windmill-components 1.596.1 → 1.613.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (416) hide show
  1. package/dist/sharedUtils/assets/tokens/colorTokensConfig.d.ts +2 -0
  2. package/dist/sharedUtils/base.d.ts +1 -0
  3. package/dist/sharedUtils/cloud.d.ts +1 -0
  4. package/dist/sharedUtils/common.d.ts +111 -0
  5. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/count.d.ts +5 -0
  6. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/delete.d.ts +5 -0
  7. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/insert.d.ts +5 -0
  8. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/select.d.ts +13 -0
  9. package/dist/sharedUtils/components/apps/components/display/dbtable/queries/update.d.ts +11 -0
  10. package/dist/sharedUtils/components/apps/components/display/dbtable/utils.d.ts +95 -0
  11. package/dist/sharedUtils/components/apps/editor/appPolicy.d.ts +6 -0
  12. package/dist/sharedUtils/components/apps/editor/appUtilsCore.d.ts +7 -0
  13. package/dist/sharedUtils/components/apps/editor/appUtilsS3.d.ts +33 -0
  14. package/dist/sharedUtils/components/apps/editor/commonAppUtils.d.ts +10 -0
  15. package/dist/sharedUtils/components/apps/editor/component/components.d.ts +5371 -0
  16. package/dist/sharedUtils/components/apps/editor/component/default-codes.d.ts +3 -0
  17. package/dist/sharedUtils/components/apps/editor/component/index.d.ts +3 -0
  18. package/dist/sharedUtils/components/apps/editor/component/sets.d.ts +7 -0
  19. package/dist/sharedUtils/components/apps/editor/componentsPanel/componentDefaultProps.d.ts +3 -0
  20. package/dist/sharedUtils/components/apps/gridUtils.d.ts +14 -0
  21. package/dist/sharedUtils/components/apps/inputType.d.ts +178 -0
  22. package/dist/sharedUtils/components/apps/rx.d.ts +29 -0
  23. package/dist/sharedUtils/components/apps/sharedTypes.d.ts +21 -0
  24. package/dist/sharedUtils/components/apps/types.d.ts +274 -0
  25. package/dist/sharedUtils/components/assets/lib.d.ts +25 -0
  26. package/dist/sharedUtils/components/common/alert/model.d.ts +2 -0
  27. package/dist/sharedUtils/components/common/badge/model.d.ts +8 -0
  28. package/dist/sharedUtils/components/common/button/model.d.ts +45 -0
  29. package/dist/sharedUtils/components/common/fileInput/model.d.ts +1 -0
  30. package/dist/sharedUtils/components/common/index.d.ts +24 -0
  31. package/dist/sharedUtils/components/common/skeleton/model.d.ts +21 -0
  32. package/dist/sharedUtils/components/dbTypes.d.ts +14 -0
  33. package/dist/sharedUtils/components/diff_drawer.d.ts +26 -0
  34. package/dist/sharedUtils/components/ducklake.d.ts +1 -0
  35. package/dist/sharedUtils/components/flows/scheduleUtils.d.ts +7 -0
  36. package/dist/sharedUtils/components/icons/index.d.ts +101 -0
  37. package/dist/sharedUtils/components/random_positive_adjetive.d.ts +1 -0
  38. package/dist/sharedUtils/components/raw_apps/rawAppPolicy.d.ts +10 -0
  39. package/dist/sharedUtils/components/raw_apps/utils.d.ts +15 -0
  40. package/dist/sharedUtils/components/triggers/email/utils.d.ts +4 -0
  41. package/dist/sharedUtils/components/triggers/gcp/utils.d.ts +2 -0
  42. package/dist/sharedUtils/components/triggers/http/utils.d.ts +11 -0
  43. package/dist/sharedUtils/components/triggers/kafka/utils.d.ts +2 -0
  44. package/dist/sharedUtils/components/triggers/mqtt/utils.d.ts +2 -0
  45. package/dist/sharedUtils/components/triggers/nats/utils.d.ts +2 -0
  46. package/dist/sharedUtils/components/triggers/postgres/utils.d.ts +8 -0
  47. package/dist/sharedUtils/components/triggers/sqs/utils.d.ts +2 -0
  48. package/dist/sharedUtils/components/triggers/triggers.svelte.d.ts +32 -0
  49. package/dist/sharedUtils/components/triggers/utils.d.ts +80 -0
  50. package/dist/sharedUtils/components/triggers/websocket/utils.d.ts +2 -0
  51. package/dist/sharedUtils/components/triggers.d.ts +20 -0
  52. package/dist/sharedUtils/gen/core/ApiError.d.ts +10 -0
  53. package/dist/sharedUtils/gen/core/ApiRequestOptions.d.ts +13 -0
  54. package/dist/sharedUtils/gen/core/ApiResult.d.ts +7 -0
  55. package/dist/sharedUtils/gen/core/CancelablePromise.d.ts +26 -0
  56. package/dist/sharedUtils/gen/core/OpenAPI.d.ts +27 -0
  57. package/dist/sharedUtils/gen/core/request.d.ts +29 -0
  58. package/dist/sharedUtils/gen/index.d.ts +6 -0
  59. package/dist/sharedUtils/gen/schemas.gen.d.ts +7036 -0
  60. package/dist/sharedUtils/gen/services.gen.d.ts +6047 -0
  61. package/dist/sharedUtils/gen/types.gen.d.ts +21881 -0
  62. package/dist/sharedUtils/history.svelte.d.ts +9 -0
  63. package/dist/sharedUtils/hub.d.ts +49 -0
  64. package/dist/sharedUtils/jsr.json +6 -0
  65. package/dist/sharedUtils/lib.d.ts +5 -0
  66. package/dist/sharedUtils/lib.es.js +1588 -0
  67. package/dist/sharedUtils/package.json +12 -0
  68. package/dist/sharedUtils/schema.d.ts +3 -0
  69. package/dist/sharedUtils/stores.d.ts +97 -0
  70. package/dist/sharedUtils/svelte5Utils.svelte.d.ts +80 -0
  71. package/dist/sharedUtils/toast.d.ts +8 -0
  72. package/dist/sharedUtils/utils.d.ts +265 -0
  73. package/package/assets/tokens/tokens.json +11 -1
  74. package/package/ata/apis.js +78 -5
  75. package/package/components/AddUser.svelte +1 -1
  76. package/package/components/CenteredModal.svelte +32 -24
  77. package/package/components/CenteredModal.svelte.d.ts +7 -27
  78. package/package/components/CenteredPage.svelte +5 -2
  79. package/package/components/CenteredPage.svelte.d.ts +2 -0
  80. package/package/components/ConcurrentJobsChart.svelte +3 -2
  81. package/package/components/ConcurrentJobsChart.svelte.d.ts +2 -2
  82. package/package/components/CustomPopover.svelte +20 -23
  83. package/package/components/CustomPopover.svelte.d.ts +14 -39
  84. package/package/components/DBManager.svelte +105 -17
  85. package/package/components/DBManager.svelte.d.ts +2 -1
  86. package/package/components/DBManagerContent.svelte +4 -3
  87. package/package/components/DBManagerContent.svelte.d.ts +1 -1
  88. package/package/components/DBTableEditor.svelte +210 -171
  89. package/package/components/DBTableEditor.svelte.d.ts +22 -3
  90. package/package/components/Description.svelte +3 -2
  91. package/package/components/Dev.svelte +36 -2
  92. package/package/components/DiffDrawer.svelte +8 -29
  93. package/package/components/DiffEditor.svelte +32 -2
  94. package/package/components/DisplayResult.svelte +32 -24
  95. package/package/components/Editor.svelte +70 -16
  96. package/package/components/Editor.svelte.d.ts +3 -0
  97. package/package/components/EditorBar.svelte +1 -1
  98. package/package/components/FakeMonacoPlaceHolder.svelte +1 -1
  99. package/package/components/FlowBuilder.svelte +17 -11
  100. package/package/components/FlowDiffViewer.svelte +37 -0
  101. package/package/components/FlowDiffViewer.svelte.d.ts +7 -0
  102. package/package/components/FlowPreviewContent.svelte +3 -2
  103. package/package/components/FlowPreviewResult.svelte +0 -4
  104. package/package/components/FlowStatusViewerInner.svelte +50 -33
  105. package/package/components/FlowStatusViewerInner.svelte.d.ts +1 -1
  106. package/package/components/FlowStatusWaitingForEvents.svelte +27 -23
  107. package/package/components/FlowStatusWaitingForEvents.svelte.d.ts +4 -18
  108. package/package/components/FlowViewer.svelte +103 -2
  109. package/package/components/FlowViewer.svelte.d.ts +9 -3
  110. package/package/components/ForkWorkspaceBanner.svelte +16 -13
  111. package/package/components/GraphqlSchemaViewer.svelte +8 -1
  112. package/package/components/HistoricInputs.svelte +25 -27
  113. package/package/components/HistoricInputs.svelte.d.ts +2 -2
  114. package/package/components/InstanceSetting.svelte +38 -0
  115. package/package/components/InviteUser.svelte +16 -42
  116. package/package/components/InviteUser.svelte.d.ts +4 -18
  117. package/package/components/JobOtelTraces.svelte +287 -0
  118. package/package/components/JobOtelTraces.svelte.d.ts +6 -0
  119. package/package/components/JsonInputs.svelte +6 -8
  120. package/package/components/JsonInputs.svelte.d.ts +7 -8
  121. package/package/components/LogViewer.svelte +91 -33
  122. package/package/components/Login.svelte +21 -0
  123. package/package/components/ManualPopover.svelte +5 -6
  124. package/package/components/ManualPopover.svelte.d.ts +9 -35
  125. package/package/components/MemoryFootprintViewer.svelte +2 -6
  126. package/package/components/ModulePreview.svelte +23 -21
  127. package/package/components/ModulePreview.svelte.d.ts +1 -0
  128. package/package/components/Path.svelte +2 -2
  129. package/package/components/Path.svelte.d.ts +1 -1
  130. package/package/components/ResourcePicker.svelte +3 -0
  131. package/package/components/ResourcePicker.svelte.d.ts +1 -0
  132. package/package/components/RunButton.svelte +5 -15
  133. package/package/components/RunButton.svelte.d.ts +7 -19
  134. package/package/components/RunChart.svelte +8 -4
  135. package/package/components/RunChart.svelte.d.ts +2 -2
  136. package/package/components/RunFormAdvancedPopup.svelte +1 -1
  137. package/package/components/RunsPage.svelte +169 -539
  138. package/package/components/RunsPage.svelte.d.ts +5 -5
  139. package/package/components/S3FilePicker.svelte +7 -11
  140. package/package/components/S3FilePickerInner.svelte +2 -3
  141. package/package/components/S3FilePickerInner.svelte.d.ts +2 -2
  142. package/package/components/SchemaForm.svelte +26 -19
  143. package/package/components/SchemaFormWithArgPicker.svelte +4 -3
  144. package/package/components/ScriptBuilder.svelte +1 -1
  145. package/package/components/ScriptEditor.svelte +575 -101
  146. package/package/components/Section.svelte +3 -1
  147. package/package/components/ServiceLogsInner.svelte +4 -4
  148. package/package/components/SimpleEditor.svelte +46 -2
  149. package/package/components/SuperadminSettingsInner.svelte +1 -1
  150. package/package/components/TemplateEditor.svelte +54 -29
  151. package/package/components/TemplateEditor.svelte.d.ts +13 -102
  152. package/package/components/UserSettings.svelte +1 -1
  153. package/package/components/WorkerTagPicker.svelte +1 -1
  154. package/package/components/WorkerTagSelect.svelte +5 -2
  155. package/package/components/WorkspaceTutorials.svelte +5 -0
  156. package/package/components/apps/components/buttons/AppButton.svelte +21 -6
  157. package/package/components/apps/components/buttons/AppForm.svelte +2 -1
  158. package/package/components/apps/components/buttons/AppFormButton.svelte +2 -1
  159. package/package/components/apps/components/display/dbtable/AppDbExplorer.svelte +0 -4
  160. package/package/components/apps/components/display/dbtable/metadata.js +69 -30
  161. package/package/components/apps/components/display/dbtable/queries/alterTable.d.ts +46 -0
  162. package/package/components/apps/components/display/dbtable/queries/alterTable.js +314 -0
  163. package/package/components/apps/components/display/dbtable/queries/alterTable.test.d.ts +1 -0
  164. package/package/components/apps/components/display/dbtable/queries/alterTable.test.js +867 -0
  165. package/package/components/apps/components/display/dbtable/queries/createTable.d.ts +2 -24
  166. package/package/components/apps/components/display/dbtable/queries/createTable.js +11 -25
  167. package/package/components/apps/components/display/dbtable/queries/dbQueriesUtils.d.ts +9 -0
  168. package/package/components/apps/components/display/dbtable/queries/dbQueriesUtils.js +45 -0
  169. package/package/components/apps/components/display/dbtable/queries/relationalKeys.d.ts +47 -0
  170. package/package/components/apps/components/display/dbtable/queries/relationalKeys.js +402 -0
  171. package/package/components/apps/components/display/dbtable/queries/select.d.ts +2 -0
  172. package/package/components/apps/components/display/dbtable/queries/select.js +37 -6
  173. package/package/components/apps/components/display/dbtable/tableEditor.d.ts +35 -0
  174. package/package/components/apps/components/display/dbtable/tableEditor.js +49 -0
  175. package/package/components/apps/components/display/dbtable/utils.d.ts +10 -1
  176. package/package/components/apps/components/display/dbtable/utils.js +52 -20
  177. package/package/components/apps/components/helpers/HiddenComponent.svelte +1 -1
  178. package/package/components/apps/components/helpers/InputValue.svelte +1 -1
  179. package/package/components/apps/components/helpers/ResolveConfig.svelte +1 -1
  180. package/package/components/apps/components/helpers/RunnableComponent.svelte +3 -2
  181. package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +1 -1
  182. package/package/components/apps/components/helpers/RunnableWrapper.svelte +2 -2
  183. package/package/components/apps/editor/AppEditorHeader.svelte +8 -1
  184. package/package/components/apps/editor/AppEditorHeaderDeploy.svelte +32 -29
  185. package/package/components/apps/editor/AppEditorHeaderDeploy.svelte.d.ts +2 -2
  186. package/package/components/apps/editor/AppEditorHeaderDeployInitialDraft.svelte +4 -4
  187. package/package/components/apps/editor/AppEditorHeaderDeployInitialDraft.svelte.d.ts +3 -3
  188. package/package/components/apps/editor/PublicApp.svelte +49 -30
  189. package/package/components/apps/editor/PublicApp.svelte.d.ts +1 -0
  190. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte +77 -7
  191. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte.d.ts +2 -2
  192. package/package/components/apps/editor/inlineScriptsPanel/utils.d.ts +2 -2
  193. package/package/components/apps/editor/inlineScriptsPanel/utils.js +10 -1
  194. package/package/components/apps/inputType.d.ts +6 -1
  195. package/package/components/auditLogs/AuditLogsFilters.svelte +9 -17
  196. package/package/components/auditLogs/AuditLogsFilters.svelte.d.ts +1 -1
  197. package/package/components/common/button/model.js +1 -1
  198. package/package/components/common/calendarPicker/CalendarPicker.svelte.d.ts +1 -1
  199. package/package/components/common/languageIcons/TypeScript.svelte +5 -3
  200. package/package/components/common/languageIcons/TypeScript.svelte.d.ts +1 -0
  201. package/package/components/common/modal/Modal.svelte +3 -3
  202. package/package/components/copilot/autocomplete/Autocompletor.js +3 -2
  203. package/package/components/copilot/chat/AIButtonStyle.d.ts +1 -1
  204. package/package/components/copilot/chat/AIButtonStyle.js +2 -1
  205. package/package/components/copilot/chat/AIChat.svelte +3 -1
  206. package/package/components/copilot/chat/AIChatDisplay.svelte +89 -4
  207. package/package/components/copilot/chat/AIChatInput.svelte +275 -0
  208. package/package/components/copilot/chat/AIChatManager.svelte.js +107 -1
  209. package/package/components/copilot/chat/AiChatLayout.svelte +15 -30
  210. package/package/components/copilot/chat/AppAvailableContextList.svelte +263 -0
  211. package/package/components/copilot/chat/AppAvailableContextList.svelte.d.ts +13 -0
  212. package/package/components/copilot/chat/ContextElementBadge.svelte +44 -0
  213. package/package/components/copilot/chat/DatatableCreationPolicy.svelte +32 -33
  214. package/package/components/copilot/chat/ProviderModelSelector.svelte +1 -1
  215. package/package/components/copilot/chat/__tests__/app/appEvalHelpers.js +3 -0
  216. package/package/components/copilot/chat/__tests__/flow/flowEvalHelpers.js +4 -0
  217. package/package/components/copilot/chat/app/core.d.ts +56 -15
  218. package/package/components/copilot/chat/app/core.js +141 -22
  219. package/package/components/copilot/chat/context.d.ts +59 -2
  220. package/package/components/copilot/chat/context.js +6 -2
  221. package/package/components/copilot/chat/flow/FlowAIChat.svelte +22 -0
  222. package/package/components/copilot/chat/flow/core.d.ts +3 -1
  223. package/package/components/copilot/chat/flow/core.js +29 -2
  224. package/package/components/copilot/chat/flow/openFlow.json +1 -1
  225. package/package/components/copilot/chat/flow/openFlowZod.d.ts +1 -0
  226. package/package/components/copilot/chat/flow/openFlowZod.js +14 -2
  227. package/package/components/copilot/chat/script/core.d.ts +4 -1
  228. package/package/components/copilot/chat/script/core.js +38 -2
  229. package/package/components/copilot/chat/shared.d.ts +10 -0
  230. package/package/components/copilot/chat/shared.js +24 -0
  231. package/package/components/copilot/lib.d.ts +1 -1
  232. package/package/components/custom_ui.d.ts +2 -0
  233. package/package/components/dbOps.d.ts +18 -4
  234. package/package/components/dbOps.js +25 -3
  235. package/package/components/debug/DebugConsole.svelte +277 -0
  236. package/package/components/debug/DebugConsole.svelte.d.ts +13 -0
  237. package/package/components/debug/DebugPanel.svelte +97 -0
  238. package/package/components/debug/DebugPanel.svelte.d.ts +11 -0
  239. package/package/components/debug/DebugToolbar.svelte +148 -0
  240. package/package/components/debug/DebugToolbar.svelte.d.ts +17 -0
  241. package/package/components/debug/DebugVariableViewer.svelte +115 -0
  242. package/package/components/debug/DebugVariableViewer.svelte.d.ts +11 -0
  243. package/package/components/debug/MonacoDebugger.svelte +384 -0
  244. package/package/components/debug/MonacoDebugger.svelte.d.ts +15 -0
  245. package/package/components/debug/dapClient.d.ts +192 -0
  246. package/package/components/debug/dapClient.js +426 -0
  247. package/package/components/debug/debugUtils.d.ts +30 -0
  248. package/package/components/debug/debugUtils.js +131 -0
  249. package/package/components/debug/index.d.ts +75 -0
  250. package/package/components/debug/index.js +82 -0
  251. package/package/components/flows/CreateActionsApp.svelte +6 -4
  252. package/package/components/flows/DebounceLimit.svelte.d.ts +1 -1
  253. package/package/components/flows/FlowHistoryInner.svelte +15 -4
  254. package/package/components/flows/content/AgentToolWrapper.svelte +1 -1
  255. package/package/components/flows/content/FlowEditorDrawer.svelte +124 -0
  256. package/package/components/flows/content/FlowEditorDrawer.svelte.d.ts +22 -0
  257. package/package/components/flows/content/FlowInput.svelte +211 -37
  258. package/package/components/flows/content/FlowModuleComponent.svelte +553 -67
  259. package/package/components/flows/content/FlowModuleEarlyStop.svelte +8 -10
  260. package/package/components/flows/content/FlowModuleHeader.svelte +7 -4
  261. package/package/components/flows/content/FlowModuleWorkerTagSelect.svelte +1 -1
  262. package/package/components/flows/content/McpOAuthConnect.svelte +217 -0
  263. package/package/components/flows/content/McpOAuthConnect.svelte.d.ts +7 -0
  264. package/package/components/flows/content/McpToolEditor.svelte +50 -37
  265. package/package/components/flows/content/McpToolEditor.svelte.d.ts +0 -1
  266. package/package/components/flows/conversations/FlowChat.svelte +16 -2
  267. package/package/components/flows/conversations/FlowChat.svelte.d.ts +2 -1
  268. package/package/components/flows/conversations/FlowChatInterface.svelte +103 -6
  269. package/package/components/flows/conversations/FlowChatInterface.svelte.d.ts +2 -0
  270. package/package/components/flows/conversations/FlowChatManager.svelte.js +53 -21
  271. package/package/components/flows/header/FlowImportExportMenu.svelte +1 -1
  272. package/package/components/flows/propPicker/PropPickerWrapper.svelte +3 -1
  273. package/package/components/flows/types.d.ts +2 -0
  274. package/package/components/git_sync/GitSyncRepositoryCard.svelte +16 -8
  275. package/package/components/home/ItemsList.svelte +5 -5
  276. package/package/components/home/TutorialBanner.svelte +34 -18
  277. package/package/components/icons/CssIcon.svelte +20 -0
  278. package/package/components/icons/CssIcon.svelte.d.ts +7 -25
  279. package/package/components/icons/HtmlIcon.svelte +20 -0
  280. package/package/components/icons/HtmlIcon.svelte.d.ts +8 -0
  281. package/package/components/icons/JavaScriptIcon.svelte +10 -2
  282. package/package/components/icons/JavaScriptIcon.svelte.d.ts +1 -0
  283. package/package/components/icons/JsonIcon.svelte +8 -2
  284. package/package/components/icons/JsonIcon.svelte.d.ts +1 -0
  285. package/package/components/icons/LessIcon.svelte +16 -0
  286. package/package/components/icons/LessIcon.svelte.d.ts +8 -0
  287. package/package/components/icons/MarkdownIcon.svelte +20 -0
  288. package/package/components/icons/MarkdownIcon.svelte.d.ts +8 -0
  289. package/package/components/icons/ReactIcon.svelte +10 -2
  290. package/package/components/icons/ReactIcon.svelte.d.ts +1 -0
  291. package/package/components/icons/SassIcon.svelte +28 -0
  292. package/package/components/icons/SassIcon.svelte.d.ts +8 -0
  293. package/package/components/icons/SvelteIcon.svelte +10 -2
  294. package/package/components/icons/SvelteIcon.svelte.d.ts +1 -0
  295. package/package/components/icons/VueIcon.svelte +10 -2
  296. package/package/components/icons/VueIcon.svelte.d.ts +1 -0
  297. package/package/components/icons/YamlIcon.svelte +20 -0
  298. package/package/components/icons/YamlIcon.svelte.d.ts +8 -0
  299. package/package/components/instanceSettings/SecretBackendConfig.svelte +514 -0
  300. package/package/components/instanceSettings/SecretBackendConfig.svelte.d.ts +8 -0
  301. package/package/components/instanceSettings.d.ts +2 -1
  302. package/package/components/instanceSettings.js +32 -1
  303. package/package/components/jobs/JobPreview.svelte +46 -39
  304. package/package/components/jobs/JobPreview.svelte.d.ts +1 -0
  305. package/package/components/monacoLanguagesOptions.js +16 -15
  306. package/package/components/propertyPicker/PropPicker.svelte +16 -2
  307. package/package/components/propertyPicker/PropPicker.svelte.d.ts +2 -0
  308. package/package/components/raw_apps/DefaultDatabaseSelector.svelte +9 -5
  309. package/package/components/raw_apps/FileEditorIcon.svelte +12 -7
  310. package/package/components/raw_apps/FileEditorIcon.svelte.d.ts +2 -0
  311. package/package/components/raw_apps/FileTreeNode.svelte +119 -83
  312. package/package/components/raw_apps/RawAppBackgroundRunner.svelte +88 -8
  313. package/package/components/raw_apps/RawAppDataTableList.svelte +12 -9
  314. package/package/components/raw_apps/RawAppEditor.svelte +218 -68
  315. package/package/components/raw_apps/RawAppEditorHeader.svelte +33 -16
  316. package/package/components/raw_apps/RawAppHistoryList.svelte +264 -80
  317. package/package/components/raw_apps/RawAppHistoryList.svelte.d.ts +1 -0
  318. package/package/components/raw_apps/RawAppHistoryManager.svelte.d.ts +15 -1
  319. package/package/components/raw_apps/RawAppHistoryManager.svelte.js +46 -12
  320. package/package/components/raw_apps/RawAppInlineScriptEditor.svelte +549 -47
  321. package/package/components/raw_apps/RawAppInlineScriptEditor.svelte.d.ts +31 -5
  322. package/package/components/raw_apps/RawAppInlineScriptPanelList.svelte +25 -18
  323. package/package/components/raw_apps/RawAppInlineScriptPanelList.svelte.d.ts +1 -0
  324. package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte +141 -10
  325. package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte.d.ts +8 -0
  326. package/package/components/raw_apps/RawAppInlineScriptsPanel.svelte +2 -1
  327. package/package/components/raw_apps/RawAppInlineScriptsPanel.svelte.d.ts +9 -1
  328. package/package/components/raw_apps/RawAppInputsSpecEditor.svelte +47 -3
  329. package/package/components/raw_apps/RawAppInputsSpecEditor.svelte.d.ts +2 -2
  330. package/package/components/raw_apps/RawAppModules.svelte +13 -7
  331. package/package/components/raw_apps/RawAppPreview.svelte +48 -6
  332. package/package/components/raw_apps/RawAppSidebar.svelte +194 -125
  333. package/package/components/raw_apps/RawAppSidebar.svelte.d.ts +1 -0
  334. package/package/components/raw_apps/RunnableRow.svelte +41 -0
  335. package/package/components/raw_apps/RunnableRow.svelte.d.ts +11 -0
  336. package/package/components/raw_apps/utils.d.ts +1 -1
  337. package/package/components/raw_apps/utils.js +76 -18
  338. package/package/components/runs/ManuelDatePicker.svelte +3 -3
  339. package/package/components/runs/ManuelDatePicker.svelte.d.ts +3 -3
  340. package/package/components/runs/NoWorkerWithTagWarning.svelte +5 -1
  341. package/package/components/runs/RunsFilter.svelte +75 -63
  342. package/package/components/runs/RunsFilter.svelte.d.ts +35 -4
  343. package/package/components/runs/RunsQueue.svelte.d.ts +1 -1
  344. package/package/components/runs/RunsTable.svelte +1 -1
  345. package/package/components/runs/RunsTable.svelte.d.ts +1 -1
  346. package/package/components/runs/useJobsLoader.svelte.d.ts +34 -0
  347. package/package/components/runs/useJobsLoader.svelte.js +507 -0
  348. package/package/components/scriptEditor/LogPanel.svelte +17 -2
  349. package/package/components/scriptEditor/LogPanel.svelte.d.ts +2 -0
  350. package/package/components/select/SelectDropdown.svelte +2 -2
  351. package/package/components/settings/AIPromptsModal.svelte +88 -0
  352. package/package/components/settings/AIPromptsModal.svelte.d.ts +11 -0
  353. package/package/components/settings/ChangeWorkspaceColor.svelte +4 -3
  354. package/package/components/settings/ChangeWorkspaceId.svelte +14 -10
  355. package/package/components/settings/ChangeWorkspaceName.svelte +7 -6
  356. package/package/components/settings/CreateToken.svelte +1 -1
  357. package/package/components/settings/UserAIPromptsSettings.svelte +56 -15
  358. package/package/components/settings/WorkspaceOperatorSettings.svelte +68 -85
  359. package/package/components/settings/WorkspaceUserSettings.svelte +531 -406
  360. package/package/components/sidebar/MenuButton.svelte +46 -24
  361. package/package/components/sidebar/MenuButton.svelte.d.ts +2 -0
  362. package/package/components/sidebar/MultiplayerMenu.svelte +3 -3
  363. package/package/components/sidebar/OperatorMenu.svelte +62 -87
  364. package/package/components/sidebar/SidebarContent.svelte +7 -2
  365. package/package/components/sidebar/WorkspaceMenu.svelte +35 -85
  366. package/package/components/sqlTypeService.js +4 -3
  367. package/package/components/table/DataTable.svelte +3 -2
  368. package/package/components/table/DataTable.svelte.d.ts +1 -0
  369. package/package/components/text_input/TextInput.svelte +3 -0
  370. package/package/components/text_input/TextInput.svelte.d.ts +2 -0
  371. package/package/components/tutorials/FlowBuilderLiveTutorial.svelte +6 -35
  372. package/package/components/tutorials/RunsTutorial.svelte +399 -0
  373. package/package/components/{schema/SchemaPicker.svelte.d.ts → tutorials/RunsTutorial.svelte.d.ts} +11 -12
  374. package/package/components/tutorials/TroubleshootFlowTutorial.svelte +5 -20
  375. package/package/components/tutorials/utils.d.ts +16 -0
  376. package/package/components/tutorials/utils.js +96 -0
  377. package/package/components/tutorials/workspace/WorkspaceOnboardingOperatorTutorial.svelte +133 -0
  378. package/package/components/{SavedInputs.svelte.d.ts → tutorials/workspace/WorkspaceOnboardingOperatorTutorial.svelte.d.ts} +8 -11
  379. package/package/components/vscode.js +6 -6
  380. package/package/components/workspace/WorkspaceCard.svelte +184 -0
  381. package/package/components/workspace/WorkspaceCard.svelte.d.ts +24 -0
  382. package/package/components/workspace/WorkspaceIcon.svelte +21 -0
  383. package/package/components/workspace/WorkspaceIcon.svelte.d.ts +9 -0
  384. package/package/components/workspace/WorkspaceTreeView.svelte +331 -0
  385. package/package/components/workspace/WorkspaceTreeView.svelte.d.ts +15 -0
  386. package/package/components/workspaceSettings/AISettings.svelte +146 -108
  387. package/package/components/workspaceSettings/CreateWorkspace.svelte +25 -11
  388. package/package/components/workspaceSettings/DucklakeSettings.svelte +46 -23
  389. package/package/components/workspaceSettings/DucklakeSettings.svelte.d.ts +2 -1
  390. package/package/components/workspaceSettings/ModelTokenLimits.svelte +14 -18
  391. package/package/components/workspaceSettings/StorageSettings.svelte +280 -241
  392. package/package/components/workspaceSettings/StorageSettings.svelte.d.ts +1 -0
  393. package/package/consts.js +4 -1
  394. package/package/gen/core/OpenAPI.js +1 -1
  395. package/package/gen/schemas.gen.d.ts +126 -0
  396. package/package/gen/schemas.gen.js +126 -0
  397. package/package/gen/services.gen.d.ts +151 -2
  398. package/package/gen/services.gen.js +301 -4
  399. package/package/gen/types.gen.d.ts +584 -2
  400. package/package/hubPaths.json +3 -2
  401. package/package/infer.js +2 -0
  402. package/package/monaco_workers/graphql.worker.bundle.js +121 -121
  403. package/package/rawAppWmillTs.d.ts +11 -0
  404. package/package/rawAppWmillTs.js +38 -1
  405. package/package/svelte5Utils.svelte.d.ts +9 -0
  406. package/package/svelte5Utils.svelte.js +51 -1
  407. package/package/tutorialUtils.js +0 -4
  408. package/package/tutorials/config.js +31 -3
  409. package/package/tutorials/roleUtils.d.ts +1 -1
  410. package/package/tutorials/roleUtils.js +6 -2
  411. package/package/utils.js +159 -1
  412. package/package.json +16 -17
  413. package/package/components/SavedInputs.svelte +0 -416
  414. package/package/components/runs/JobsLoader.svelte +0 -468
  415. package/package/components/runs/JobsLoader.svelte.d.ts +0 -49
  416. package/package/components/schema/SchemaPicker.svelte +0 -92
@@ -0,0 +1,331 @@
1
+ <script lang="ts">import { Building2 } from 'lucide-svelte';
2
+ import { SvelteMap } from 'svelte/reactivity';
3
+ import WorkspaceCard from './WorkspaceCard.svelte';
4
+ import SearchItems from '../SearchItems.svelte';
5
+ let { workspaces, onEnterWorkspace, onUnarchive, searchFilter = $bindable(''), onExpandCollapseAll = $bindable(), allExpanded = $bindable(false), hasForks = $bindable(false) } = $props();
6
+ // State for manually toggled expansion status
7
+ let manualExpansionStates = $state({});
8
+ let filteredWorkspaces = $state();
9
+ // Keyboard navigation state
10
+ let selectedWorkspaceId = $state(null);
11
+ let isKeyboardNavigation = $state(false);
12
+ let scrollContainer;
13
+ // Computed expansion states that include auto-expansion for search results
14
+ let expansionStates = $derived.by(() => {
15
+ if (!searchFilter || !filteredWorkspaces || !workspaces) {
16
+ return manualExpansionStates;
17
+ }
18
+ const matchedWorkspaceIds = new Set(filteredWorkspaces.map((w) => w.id));
19
+ const autoExpanded = {};
20
+ // Build children map for descendant checking
21
+ const childrenMap = new Map();
22
+ workspaces.forEach((workspace) => {
23
+ if (workspace.parent_workspace_id) {
24
+ if (!childrenMap.has(workspace.parent_workspace_id)) {
25
+ childrenMap.set(workspace.parent_workspace_id, []);
26
+ }
27
+ childrenMap.get(workspace.parent_workspace_id).push(workspace.id);
28
+ }
29
+ });
30
+ // Function to check if workspace has matching descendants (not itself)
31
+ function hasMatchingDescendant(workspaceId) {
32
+ const children = childrenMap.get(workspaceId) || [];
33
+ return children.some((childId) => matchedWorkspaceIds.has(childId) || hasMatchingDescendant(childId));
34
+ }
35
+ // Auto-expand workspaces only if they have matching descendants
36
+ // (not if the workspace itself matches - user can manually expand to see children)
37
+ workspaces.forEach((workspace) => {
38
+ if (hasMatchingDescendant(workspace.id)) {
39
+ autoExpanded[workspace.id] = true;
40
+ }
41
+ });
42
+ // Combine manual and auto-expanded states
43
+ return { ...manualExpansionStates, ...autoExpanded };
44
+ });
45
+ // Build nested hierarchy correctly - always use full workspace list for hierarchy
46
+ let rootWorkspaces = $derived.by(() => {
47
+ if (!workspaces)
48
+ return [];
49
+ // Create a map of children for each parent workspace using ALL workspaces
50
+ const childrenMap = new SvelteMap();
51
+ // Build children mapping - this correctly handles nested relationships
52
+ workspaces.forEach((workspace) => {
53
+ if (workspace.parent_workspace_id) {
54
+ if (!childrenMap.has(workspace.parent_workspace_id)) {
55
+ childrenMap.set(workspace.parent_workspace_id, []);
56
+ }
57
+ // Find marked version from filtered results if available
58
+ const filteredWorkspace = filteredWorkspaces?.find((fw) => fw.id === workspace.id);
59
+ const extendedWorkspace = {
60
+ ...workspace,
61
+ marked: filteredWorkspace?.marked
62
+ };
63
+ childrenMap.get(workspace.parent_workspace_id).push(extendedWorkspace);
64
+ }
65
+ });
66
+ // Get IDs of workspaces that match the search
67
+ const matchedWorkspaceIds = new Set(filteredWorkspaces?.map((w) => w.id) || []);
68
+ // Function to check if a workspace or its descendants match the search
69
+ function hasMatchingDescendant(workspaceId) {
70
+ if (matchedWorkspaceIds.has(workspaceId))
71
+ return true;
72
+ const children = childrenMap.get(workspaceId) || [];
73
+ return children.some((child) => hasMatchingDescendant(child.id));
74
+ }
75
+ // Recursive function to build full nested hierarchy
76
+ // parentMatched: if true, include all children regardless of search match
77
+ function buildWorkspaceWithChildren(workspace, parentMatched = false) {
78
+ const directChildren = childrenMap.get(workspace.id) || [];
79
+ const thisWorkspaceMatches = matchedWorkspaceIds.has(workspace.id);
80
+ // If this workspace or a parent matches, show all children
81
+ // Otherwise, only show children that match or have matching descendants
82
+ const visibleChildren = searchFilter && !parentMatched && !thisWorkspaceMatches
83
+ ? directChildren.filter((child) => hasMatchingDescendant(child.id))
84
+ : directChildren;
85
+ const childrenWithNestedStructure = visibleChildren.map((child) => buildWorkspaceWithChildren(child, parentMatched || thisWorkspaceMatches));
86
+ // Find marked version from filtered results if available
87
+ const filteredWorkspace = filteredWorkspaces?.find((fw) => fw.id === workspace.id);
88
+ return {
89
+ ...workspace,
90
+ marked: filteredWorkspace?.marked,
91
+ _children: childrenWithNestedStructure
92
+ };
93
+ }
94
+ // Return only root workspaces - filter based on search if active
95
+ const rootCandidates = workspaces.filter((workspace) => !workspace.parent_workspace_id ||
96
+ !workspaces.find((w) => w.id === workspace.parent_workspace_id));
97
+ const visibleRoots = searchFilter
98
+ ? rootCandidates.filter((workspace) => hasMatchingDescendant(workspace.id))
99
+ : rootCandidates;
100
+ return visibleRoots
101
+ .map((workspace) => buildWorkspaceWithChildren(workspace))
102
+ .sort((a, b) => {
103
+ // Admin workspace always goes first
104
+ if (a.id === 'admins')
105
+ return -1;
106
+ if (b.id === 'admins')
107
+ return 1;
108
+ // Then sort alphabetically by name
109
+ return a.name.localeCompare(b.name);
110
+ });
111
+ });
112
+ function handleToggleExpand(workspaceId) {
113
+ const currentState = expansionStates[workspaceId] ?? false;
114
+ manualExpansionStates = { ...manualExpansionStates, [workspaceId]: !currentState };
115
+ }
116
+ // Get IDs of workspaces that have children (can be expanded)
117
+ let workspacesWithChildren = $derived.by(() => {
118
+ if (!workspaces)
119
+ return [];
120
+ const parentIds = new Set(workspaces.filter((w) => w.parent_workspace_id).map((w) => w.parent_workspace_id));
121
+ return workspaces.filter((w) => parentIds.has(w.id)).map((w) => w.id);
122
+ });
123
+ // Check if all expandable workspaces are currently expanded
124
+ let allExpandedInternal = $derived(workspacesWithChildren.length > 0 &&
125
+ workspacesWithChildren.every((id) => expansionStates[id] === true));
126
+ // Sync internal state to bindable props
127
+ $effect(() => {
128
+ allExpanded = allExpandedInternal;
129
+ });
130
+ $effect(() => {
131
+ hasForks = workspacesWithChildren.length > 0;
132
+ });
133
+ export function handleExpandCollapseAll() {
134
+ const newState = !allExpandedInternal;
135
+ const newExpansionStates = {};
136
+ workspacesWithChildren.forEach((id) => {
137
+ newExpansionStates[id] = newState;
138
+ });
139
+ manualExpansionStates = newExpansionStates;
140
+ }
141
+ // Generate flattened navigation order for keyboard navigation
142
+ const flatNavigationOrder = $derived.by(() => {
143
+ const result = [];
144
+ function addWorkspaceAndChildren(workspace) {
145
+ result.push(workspace.id);
146
+ if (workspace._children && expansionStates[workspace.id]) {
147
+ workspace._children.forEach((child) => addWorkspaceAndChildren(child));
148
+ }
149
+ }
150
+ rootWorkspaces.forEach((workspace) => addWorkspaceAndChildren(workspace));
151
+ return result;
152
+ });
153
+ // Keyboard navigation handlers
154
+ function handleKeyDown(event) {
155
+ // Allow navigation keys even when search input has focus
156
+ const navigationKeys = [
157
+ 'ArrowDown',
158
+ 'ArrowUp',
159
+ 'Home',
160
+ 'End',
161
+ 'ArrowLeft',
162
+ 'ArrowRight',
163
+ 'Enter',
164
+ ' ',
165
+ 'Escape'
166
+ ];
167
+ const activeElement = document.activeElement;
168
+ // Skip navigation only if user is typing in textarea or non-search inputs
169
+ if (activeElement?.tagName === 'TEXTAREA' ||
170
+ (activeElement?.tagName === 'INPUT' && !navigationKeys.includes(event.key))) {
171
+ return;
172
+ }
173
+ // Enable keyboard navigation on arrow keys
174
+ if (['ArrowDown', 'ArrowUp', 'Home', 'End', 'ArrowLeft', 'ArrowRight'].includes(event.key)) {
175
+ enableKeyboardNavigation();
176
+ }
177
+ // Only handle navigation if keyboard navigation is active
178
+ if (!isKeyboardNavigation) {
179
+ return;
180
+ }
181
+ if (flatNavigationOrder.length === 0)
182
+ return;
183
+ const currentIndex = selectedWorkspaceId ? flatNavigationOrder.indexOf(selectedWorkspaceId) : -1;
184
+ switch (event.key) {
185
+ case 'ArrowDown': {
186
+ event.preventDefault();
187
+ const nextIndex = currentIndex < flatNavigationOrder.length - 1 ? currentIndex + 1 : 0;
188
+ selectedWorkspaceId = flatNavigationOrder[nextIndex];
189
+ break;
190
+ }
191
+ case 'ArrowUp': {
192
+ event.preventDefault();
193
+ const prevIndex = currentIndex > 0 ? currentIndex - 1 : flatNavigationOrder.length - 1;
194
+ selectedWorkspaceId = flatNavigationOrder[prevIndex];
195
+ break;
196
+ }
197
+ case 'Home': {
198
+ event.preventDefault();
199
+ selectedWorkspaceId = flatNavigationOrder[0];
200
+ break;
201
+ }
202
+ case 'End': {
203
+ event.preventDefault();
204
+ selectedWorkspaceId = flatNavigationOrder[flatNavigationOrder.length - 1];
205
+ break;
206
+ }
207
+ case 'ArrowRight': {
208
+ if (selectedWorkspaceId && workspacesWithChildren.includes(selectedWorkspaceId)) {
209
+ event.preventDefault();
210
+ if (!expansionStates[selectedWorkspaceId]) {
211
+ handleToggleExpand(selectedWorkspaceId);
212
+ }
213
+ }
214
+ break;
215
+ }
216
+ case 'ArrowLeft': {
217
+ if (selectedWorkspaceId && workspacesWithChildren.includes(selectedWorkspaceId)) {
218
+ event.preventDefault();
219
+ if (expansionStates[selectedWorkspaceId]) {
220
+ handleToggleExpand(selectedWorkspaceId);
221
+ }
222
+ }
223
+ break;
224
+ }
225
+ case 'Enter':
226
+ case ' ': {
227
+ if (selectedWorkspaceId) {
228
+ event.preventDefault();
229
+ const workspace = workspaces.find((w) => w.id === selectedWorkspaceId);
230
+ if (workspace && !workspace.disabled) {
231
+ onEnterWorkspace(selectedWorkspaceId);
232
+ }
233
+ }
234
+ break;
235
+ }
236
+ case 'Escape': {
237
+ selectedWorkspaceId = null;
238
+ isKeyboardNavigation = false;
239
+ break;
240
+ }
241
+ }
242
+ }
243
+ // Reset selection when workspaces change or search filter changes
244
+ $effect(() => {
245
+ if (rootWorkspaces.length === 0) {
246
+ selectedWorkspaceId = null;
247
+ }
248
+ else if (selectedWorkspaceId && !flatNavigationOrder.includes(selectedWorkspaceId)) {
249
+ // If currently selected workspace is no longer visible, reset to first visible
250
+ selectedWorkspaceId = flatNavigationOrder[0] || null;
251
+ }
252
+ });
253
+ // Enable keyboard navigation when user starts navigating
254
+ function enableKeyboardNavigation() {
255
+ if (!isKeyboardNavigation && rootWorkspaces.length > 0) {
256
+ isKeyboardNavigation = true;
257
+ if (!selectedWorkspaceId) {
258
+ selectedWorkspaceId = flatNavigationOrder[0] || null;
259
+ }
260
+ }
261
+ }
262
+ // Handle mouse interactions - disable keyboard mode when mouse is used
263
+ function handleMouseEnter(workspaceId) {
264
+ if (isKeyboardNavigation) {
265
+ selectedWorkspaceId = workspaceId;
266
+ }
267
+ }
268
+ function handleMouseClick() {
269
+ isKeyboardNavigation = false;
270
+ selectedWorkspaceId = null;
271
+ }
272
+ // Scroll selected workspace into view
273
+ function scrollToSelectedWorkspace() {
274
+ if (!selectedWorkspaceId || !scrollContainer)
275
+ return;
276
+ // Find the workspace card element by data attribute
277
+ const selectedElement = scrollContainer.querySelector(`[data-workspace-id="${selectedWorkspaceId}"]`);
278
+ if (selectedElement) {
279
+ selectedElement.scrollIntoView({
280
+ behavior: 'smooth',
281
+ block: 'nearest'
282
+ });
283
+ }
284
+ }
285
+ // Auto-scroll when selection changes
286
+ $effect(() => {
287
+ if (selectedWorkspaceId && isKeyboardNavigation) {
288
+ scrollToSelectedWorkspace();
289
+ }
290
+ });
291
+ </script>
292
+
293
+ <svelte:window onkeydown={handleKeyDown} />
294
+
295
+ <!-- Search Items Component for fuzzy search with highlighting -->
296
+ <SearchItems
297
+ filter={searchFilter}
298
+ items={workspaces}
299
+ bind:filteredItems={filteredWorkspaces}
300
+ f={(workspace) => workspace.name + ' (' + workspace.id + ')'}
301
+ />
302
+
303
+ <div class="space-y-4 max-h-[50vh] overflow-auto" bind:this={scrollContainer}>
304
+ <!-- Workspace Tree -->
305
+ <div class="space-y-2">
306
+ {#each rootWorkspaces as workspace (workspace.id)}
307
+ <WorkspaceCard
308
+ {workspace}
309
+ children={workspace._children || []}
310
+ isExpanded={expansionStates[workspace.id] ?? false}
311
+ {expansionStates}
312
+ {onEnterWorkspace}
313
+ {onUnarchive}
314
+ onToggleExpand={handleToggleExpand}
315
+ {selectedWorkspaceId}
316
+ onMouseEnter={handleMouseEnter}
317
+ onMouseClick={handleMouseClick}
318
+ onKeyboardNavigation={enableKeyboardNavigation}
319
+ />
320
+ {/each}
321
+
322
+ {#if rootWorkspaces.length === 0}
323
+ <div class="text-center py-8">
324
+ <Building2 size={48} class="text-secondary mx-auto mb-3" />
325
+ <p class="text-sm text-secondary">
326
+ {searchFilter ? 'No workspaces match your search' : 'No workspaces available'}
327
+ </p>
328
+ </div>
329
+ {/if}
330
+ </div>
331
+ </div>
@@ -0,0 +1,15 @@
1
+ import type { UserWorkspace } from '../../stores';
2
+ interface Props {
3
+ workspaces: UserWorkspace[];
4
+ onEnterWorkspace: (workspaceId: string) => Promise<void>;
5
+ onUnarchive?: (workspaceId: string) => Promise<void>;
6
+ searchFilter?: string;
7
+ onExpandCollapseAll?: () => void;
8
+ allExpanded?: boolean;
9
+ hasForks?: boolean;
10
+ }
11
+ declare const WorkspaceTreeView: import("svelte").Component<Props, {
12
+ handleExpandCollapseAll: () => void;
13
+ }, "allExpanded" | "searchFilter" | "onExpandCollapseAll" | "hasForks">;
14
+ type WorkspaceTreeView = ReturnType<typeof WorkspaceTreeView>;
15
+ export default WorkspaceTreeView;
@@ -7,7 +7,7 @@ import Description from '../Description.svelte';
7
7
  import Label from '../Label.svelte';
8
8
  import ResourcePicker from '../ResourcePicker.svelte';
9
9
  import Toggle from '../Toggle.svelte';
10
- import ArgEnum from '../ArgEnum.svelte';
10
+ import Select from '../select/Select.svelte';
11
11
  import Button from '../common/button/Button.svelte';
12
12
  import MultiSelect from '../select/MultiSelect.svelte';
13
13
  import { safeSelectItems } from '../select/utils.svelte';
@@ -15,10 +15,20 @@ import Badge from '../common/badge/Badge.svelte';
15
15
  import Tooltip from '../Tooltip.svelte';
16
16
  import ModelTokenLimits from './ModelTokenLimits.svelte';
17
17
  import { setCopilotInfo } from '../../aiStore';
18
- import CustomAIPrompts from '../copilot/CustomAIPrompts.svelte';
18
+ import AIPromptsModal from '../settings/AIPromptsModal.svelte';
19
+ import { Save, Settings } from 'lucide-svelte';
20
+ import { slide } from 'svelte/transition';
19
21
  let { aiProviders = $bindable(), codeCompletionModel = $bindable(), defaultModel = $bindable(), customPrompts = $bindable(), maxTokensPerModel = $bindable(), usingOpenaiClientCredentialsOauth = $bindable(), onSave } = $props();
20
22
  let fetchedAiModels = $state(false);
21
23
  let availableAiModels = $state(Object.fromEntries(Object.keys(AI_PROVIDERS).map((provider) => [provider, AI_PROVIDERS[provider].defaultModels])));
24
+ let modalOpen = $state(false);
25
+ let initialPrompts = $state($state.snapshot(customPrompts));
26
+ let hasPromptsChanges = $derived(Array.from(new Set([...Object.keys(customPrompts), ...Object.keys(initialPrompts)])).some((key) => {
27
+ const currentValue = customPrompts[key] || '';
28
+ const initialValue = initialPrompts[key] || '';
29
+ return currentValue !== initialValue;
30
+ }));
31
+ let promptCount = $derived(Object.values(customPrompts).filter((p) => p?.trim().length > 0).length);
22
32
  let selectedAiModels = $derived(Object.values(aiProviders).flatMap((p) => p.models));
23
33
  let modelProviderMap = $derived(Object.fromEntries(Object.entries(aiProviders).flatMap(([provider, config]) => config.models.map((m) => [m, provider]))));
24
34
  $effect(() => {
@@ -46,6 +56,10 @@ $effect(() => {
46
56
  fetchedAiModels = true;
47
57
  })();
48
58
  });
59
+ function resetPrompts() {
60
+ customPrompts = { ...initialPrompts };
61
+ sendUserToast('Reset to last saved state');
62
+ }
49
63
  async function editCopilotConfig() {
50
64
  if (Object.keys(aiProviders ?? {}).length > 0) {
51
65
  const code_completion_model = codeCompletionModel && modelProviderMap[codeCompletionModel]
@@ -78,7 +92,8 @@ async function editCopilotConfig() {
78
92
  });
79
93
  setCopilotInfo({});
80
94
  }
81
- sendUserToast(`Copilot settings updated`);
95
+ sendUserToast(`AI settings updated`);
96
+ initialPrompts = { ...customPrompts }; // Update initial prompts after successful save
82
97
  onSave?.();
83
98
  }
84
99
  async function onAiProviderChange(provider) {
@@ -98,37 +113,36 @@ async function onAiProviderChange(provider) {
98
113
  aiProviders[provider].models = availableAiModels[provider].slice(0, 1);
99
114
  }
100
115
  }
116
+ const autocompleteModels = $derived(selectedAiModels.filter((m) => m.startsWith('codestral-') && !m.startsWith('codestral-embed')));
101
117
  </script>
102
118
 
103
- <div class="flex flex-col gap-4 my-8">
119
+ <div class="flex flex-col gap-4 mt-4">
104
120
  <div class="flex flex-col gap-1">
105
- <div class="text-emphasis text-sm font-semibold"> Windmill AI</div>
121
+ <div class="text-emphasis text-sm font-semibold flex flex-row gap-2 justify-between">
122
+ Windmill AI <Button
123
+ variant="accent"
124
+ unifiedSize="md"
125
+ wrapperClasses="self-start"
126
+ disabled={!Object.values(aiProviders).every((p) => p.resource_path) ||
127
+ (codeCompletionModel != undefined && codeCompletionModel.length === 0) ||
128
+ (Object.keys(aiProviders).length > 0 && !defaultModel)}
129
+ onClick={editCopilotConfig}
130
+ startIcon={{ icon: Save }}
131
+ >
132
+ Save AI settings
133
+ </Button></div
134
+ >
106
135
  <Description link="https://www.windmill.dev/docs/core_concepts/ai_generation">
107
136
  Windmill AI integrates with your favorite AI providers and models.
108
137
  </Description>
109
138
  </div>
110
139
  </div>
111
140
 
112
- <div class="flex flex-row-reverse gap-2 pb-4">
113
- <Button
114
- variant="accent"
115
- size="xl"
116
- wrapperClasses="self-start"
117
- disabled={!Object.values(aiProviders).every((p) => p.resource_path) ||
118
- (codeCompletionModel != undefined && codeCompletionModel.length === 0) ||
119
- (Object.keys(aiProviders).length > 0 && !defaultModel)}
120
- on:click={editCopilotConfig}
121
- >
122
- Save
123
- </Button>
124
- </div>
125
-
126
- <div class="flex flex-col gap-8">
127
- <div class="flex flex-col gap-2">
128
- <p class="font-semibold text-xs text-emphasis">AI Providers</p>
129
- <div class="flex flex-col gap-4">
141
+ <div class="flex flex-col gap-8 mt-4">
142
+ <Label label="AI Providers">
143
+ <div class="flex flex-col gap-4 p-4 rounded-md border bg-surface-tertiary">
130
144
  {#each Object.entries(AI_PROVIDERS) as [provider, details]}
131
- <div class="flex flex-col gap-2">
145
+ <div class="flex flex-col">
132
146
  <div class="flex flex-row gap-2">
133
147
  <Toggle
134
148
  options={{
@@ -186,28 +200,33 @@ async function onAiProviderChange(provider) {
186
200
  </div>
187
201
 
188
202
  {#if aiProviders[provider]}
189
- <div class="mb-4 flex flex-col gap-2">
190
- <div class="flex flex-row gap-1">
191
- <ResourcePicker
192
- selectFirst
193
- resourceType={provider === 'openai' && usingOpenaiClientCredentialsOauth
194
- ? 'openai_client_credentials_oauth'
195
- : provider}
196
- initialValue={aiProviders[provider].resource_path}
197
- bind:value={
198
- () => aiProviders[provider].resource_path || undefined,
199
- (v) => {
200
- aiProviders[provider].resource_path = v ?? ''
201
- onAiProviderChange(provider as AIProvider)
203
+ <div
204
+ class="mb-4 flex flex-col gap-6 border p-4 rounded-md mt-2"
205
+ transition:slide|local={{ duration: 150 }}
206
+ >
207
+ <Label label="Resource">
208
+ <div class="flex flex-row gap-1">
209
+ <ResourcePicker
210
+ selectFirst
211
+ resourceType={provider === 'openai' && usingOpenaiClientCredentialsOauth
212
+ ? 'openai_client_credentials_oauth'
213
+ : provider}
214
+ initialValue={aiProviders[provider].resource_path}
215
+ bind:value={
216
+ () => aiProviders[provider].resource_path || undefined,
217
+ (v) => {
218
+ aiProviders[provider].resource_path = v ?? ''
219
+ onAiProviderChange(provider as AIProvider)
220
+ }
202
221
  }
203
- }
204
- />
205
- <TestAiKey
206
- aiProvider={provider as AIProvider}
207
- resourcePath={aiProviders[provider].resource_path}
208
- model={aiProviders[provider].models[0]}
209
- />
210
- </div>
222
+ />
223
+ <TestAiKey
224
+ aiProvider={provider as AIProvider}
225
+ resourcePath={aiProviders[provider].resource_path}
226
+ model={aiProviders[provider].models[0]}
227
+ />
228
+ </div>
229
+ </Label>
211
230
 
212
231
  <Label label="Enabled models">
213
232
  <MultiSelect
@@ -220,79 +239,98 @@ async function onAiProviderChange(provider) {
220
239
  onCreateItem={(item) =>
221
240
  (aiProviders[provider].models = [...aiProviders[provider].models, item])}
222
241
  />
242
+ <p class="text-2xs text-hint">
243
+ If you don't see the model you want, you can type it manually in the selector.
244
+ </p>
223
245
  </Label>
224
- <p class="text-xs">
225
- If you don't see the model you want, you can type it manually in the selector.
226
- </p>
227
246
  </div>
228
247
  {/if}
229
248
  </div>
230
249
  {/each}
231
250
  </div>
232
- </div>
251
+ </Label>
233
252
 
234
- {#if Object.keys(aiProviders).length > 0}
235
- {@const autocompleteModels = selectedAiModels.filter(
236
- (m) => m.startsWith('codestral-') && !m.startsWith('codestral-embed')
237
- )}
238
- <div class="flex flex-col gap-2">
239
- <p class="font-semibold">Settings</p>
240
- <div class="flex flex-col gap-4">
241
- <Label label="Default chat model">
242
- {#key Object.keys(aiProviders).length}
243
- <ArgEnum
244
- enum_={selectedAiModels}
245
- bind:value={defaultModel}
246
- disabled={false}
247
- autofocus={false}
248
- defaultValue={undefined}
249
- valid={true}
250
- create={false}
251
- />
252
- {/key}
253
- </Label>
253
+ <Label label="Default chat model">
254
+ {#key Object.keys(aiProviders).length}
255
+ <Select
256
+ items={safeSelectItems(selectedAiModels)}
257
+ bind:value={defaultModel}
258
+ disabled={false}
259
+ placeholder="Select a default model"
260
+ size="sm"
261
+ />
262
+ {/key}
263
+ </Label>
254
264
 
255
- <div class="flex flex-col gap-2">
256
- <Toggle
257
- on:change={(e) => {
258
- if (e.detail) {
259
- codeCompletionModel = autocompleteModels[0] ?? ''
260
- } else {
261
- codeCompletionModel = undefined
262
- }
263
- }}
264
- checked={codeCompletionModel != undefined}
265
- disabled={autocompleteModels.length == 0}
266
- options={{
267
- right: 'Code completion (Codestral only)',
268
- rightTooltip:
269
- 'We currently only support Mistral Codestral models for code completion.'
270
- }}
271
- />
265
+ <!-- Code completion group for animation purposes -->
266
+ <div>
267
+ <Label label="Code completion">
268
+ <Toggle
269
+ on:change={(e) => {
270
+ if (e.detail) {
271
+ codeCompletionModel = autocompleteModels[0] ?? ''
272
+ } else {
273
+ codeCompletionModel = undefined
274
+ }
275
+ }}
276
+ checked={codeCompletionModel != undefined}
277
+ disabled={autocompleteModels.length == 0}
278
+ options={{
279
+ right: 'Enable code completion',
280
+ rightTooltip: 'We currently only support Mistral Codestral models for code completion.'
281
+ }}
282
+ />
283
+ </Label>
272
284
 
273
- {#if codeCompletionModel != undefined}
274
- <Label label="Code completion model">
275
- <ArgEnum
276
- enum_={autocompleteModels}
277
- bind:value={codeCompletionModel}
278
- disabled={false}
279
- autofocus={false}
280
- defaultValue={undefined}
281
- valid={true}
282
- create={false}
283
- />
284
- </Label>
285
- {/if}
286
- </div>
285
+ {#if codeCompletionModel != undefined}
286
+ <div transition:slide|local={{ duration: 150 }} class="mt-6">
287
+ <Label label="Code completion model">
288
+ <Select
289
+ items={safeSelectItems(autocompleteModels)}
290
+ bind:value={codeCompletionModel}
291
+ disabled={false}
292
+ placeholder="Select a code completion model"
293
+ size="sm"
294
+ />
295
+ </Label>
287
296
  </div>
288
- </div>
289
- {/if}
297
+ {/if}
298
+ </div>
299
+
300
+ <ModelTokenLimits {aiProviders} bind:maxTokensPerModel />
290
301
 
291
- {#if Object.keys(aiProviders).length > 0}
292
- <ModelTokenLimits {aiProviders} bind:maxTokensPerModel />
293
- {/if}
302
+ <Label label="Custom system prompts">
303
+ <p class="text-xs text-secondary">
304
+ Customize AI behavior with workspace-level system prompts. These apply to all workspace
305
+ members.
306
+ </p>
294
307
 
295
- {#if Object.keys(aiProviders).length > 0}
296
- <CustomAIPrompts bind:customPrompts title="Custom system prompts" />
297
- {/if}
308
+ <div class="flex items-center gap-2 pt-1">
309
+ <Button
310
+ onclick={() => (modalOpen = true)}
311
+ variant="default"
312
+ unifiedSize="sm"
313
+ startIcon={{ icon: Settings }}
314
+ disabled={Object.keys(aiProviders ?? {}).length === 0}
315
+ >
316
+ Configure AI prompts
317
+ </Button>
318
+ {#if promptCount > 0}
319
+ <span class="text-xs text-secondary">({promptCount} configured)</span>
320
+ {/if}
321
+ {#if hasPromptsChanges}
322
+ <Badge color="yellow">Unsaved changes</Badge>
323
+ {/if}
324
+ </div>
325
+ </Label>
326
+
327
+ <div class="py-6"></div>
298
328
  </div>
329
+
330
+ <AIPromptsModal
331
+ bind:open={modalOpen}
332
+ bind:customPrompts
333
+ onReset={resetPrompts}
334
+ hasChanges={hasPromptsChanges}
335
+ isWorkspaceSettings={true}
336
+ />