windmill-components 1.677.1 → 1.687.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 (354) hide show
  1. package/package/components/AppConnectInner.svelte +6 -0
  2. package/package/components/CiTestResults.svelte +64 -0
  3. package/package/components/CiTestResults.svelte.d.ts +7 -0
  4. package/package/components/CompareWorkspaces.svelte +626 -418
  5. package/package/components/DBManager.svelte +35 -4
  6. package/package/components/DBManager.svelte.d.ts +2 -0
  7. package/package/components/DBManagerContent.svelte +3 -1
  8. package/package/components/DBManagerContent.svelte.d.ts +3 -0
  9. package/package/components/DBManagerDrawer.svelte +145 -3
  10. package/package/components/DBTableEditor.svelte +14 -4
  11. package/package/components/DatatablePicker.svelte +2 -5
  12. package/package/components/DatatableSchemaDiff.svelte +531 -0
  13. package/package/components/DatatableSchemaDiff.svelte.d.ts +29 -0
  14. package/package/components/DedicatedWorkersSelector.svelte +4 -2
  15. package/package/components/DefaultTagsInner.svelte +42 -2
  16. package/package/components/DeployWorkspaceDrawer.svelte +1 -1
  17. package/package/components/Dev.svelte +20 -3
  18. package/package/components/Editor.svelte +1 -1
  19. package/package/components/EditorBar.svelte +1 -1
  20. package/package/components/EditorBar.svelte.d.ts +1 -1
  21. package/package/components/FlowStatusViewerInner.svelte +269 -220
  22. package/package/components/FlowTimeline.svelte +1 -1
  23. package/package/components/FolderEditor.svelte +189 -4
  24. package/package/components/ForkWorkspaceBanner.svelte +82 -11
  25. package/package/components/GlobalUserOffboardingModal.svelte +293 -0
  26. package/package/components/GlobalUserOffboardingModal.svelte.d.ts +10 -0
  27. package/package/components/InstanceSettings.svelte +22 -3
  28. package/package/components/Login.svelte +22 -10
  29. package/package/components/ModuleTest.svelte +2 -1
  30. package/package/components/NoMainFuncBadge.svelte +1 -1
  31. package/package/components/OffboardItemsBox.svelte +56 -0
  32. package/package/components/OffboardItemsBox.svelte.d.ts +12 -0
  33. package/package/components/OffboardReassignControls.svelte +47 -0
  34. package/package/components/OffboardReassignControls.svelte.d.ts +20 -0
  35. package/package/components/OffboardWorkspaceSection.svelte +110 -0
  36. package/package/components/OffboardWorkspaceSection.svelte.d.ts +24 -0
  37. package/package/components/OnBehalfOfSelector.svelte +21 -3
  38. package/package/components/OnBehalfOfSelector.svelte.d.ts +7 -0
  39. package/package/components/QueueAlerts.svelte +10 -10
  40. package/package/components/ResourcePicker.svelte +2 -2
  41. package/package/components/ScriptBuilder.svelte +52 -11
  42. package/package/components/ScriptEditor.svelte +1 -3
  43. package/package/components/ScriptEditor.svelte.d.ts +1 -1
  44. package/package/components/ShareModal.svelte +236 -98
  45. package/package/components/SuperadminSettingsInner.svelte +362 -315
  46. package/package/components/UserOffboardingModal.svelte +238 -0
  47. package/package/components/UserOffboardingModal.svelte.d.ts +10 -0
  48. package/package/components/WorkspaceDeployLayout.svelte +3 -3
  49. package/package/components/WorkspaceDeployLayout.svelte.d.ts +1 -0
  50. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte +4 -2
  51. package/package/components/apps/editor/settingsPanel/mainInput/RunnableSelector.svelte +12 -0
  52. package/package/components/assets/AssetsDropdownButton.svelte +1 -1
  53. package/package/components/common/confirmationModal/ConfirmationModal.svelte +1 -1
  54. package/package/components/common/table/AppRow.svelte +3 -3
  55. package/package/components/common/table/FlowRow.svelte +3 -3
  56. package/package/components/common/table/RawAppRow.svelte +4 -4
  57. package/package/components/common/table/Row.svelte +6 -2
  58. package/package/components/common/table/ScriptRow.svelte +11 -3
  59. package/package/components/copilot/chat/AIChatManager.svelte.js +2 -2
  60. package/package/components/copilot/chat/anthropic.d.ts +7 -1
  61. package/package/components/copilot/chat/anthropic.js +5 -2
  62. package/package/components/copilot/chat/app/core.js +129 -1
  63. package/package/components/copilot/chat/app/core.test.js +192 -0
  64. package/package/components/copilot/chat/chatLoop.d.ts +3 -0
  65. package/package/components/copilot/chat/chatLoop.js +13 -5
  66. package/package/components/copilot/chat/flow/FlowAIChat.svelte +55 -76
  67. package/package/components/copilot/chat/flow/core.d.ts +13 -3
  68. package/package/components/copilot/chat/flow/core.js +467 -116
  69. package/package/components/copilot/chat/flow/helperUtils.d.ts +19 -0
  70. package/package/components/copilot/chat/flow/helperUtils.js +68 -0
  71. package/package/components/copilot/chat/flow/helperUtils.test.js +116 -0
  72. package/package/components/copilot/chat/flow/inlineScriptsUtils.d.ts +5 -24
  73. package/package/components/copilot/chat/flow/inlineScriptsUtils.js +30 -55
  74. package/package/components/copilot/chat/flow/utils.test.js +59 -0
  75. package/package/components/copilot/chat/openai-responses.d.ts +7 -1
  76. package/package/components/copilot/chat/openai-responses.js +5 -2
  77. package/package/components/copilot/chat/shared.d.ts +1 -2
  78. package/package/components/copilot/chat/shared.js +94 -52
  79. package/package/components/copilot/chat/tokenUsage.d.ts +23 -0
  80. package/package/components/copilot/chat/tokenUsage.js +42 -0
  81. package/package/components/copilot/lib.d.ts +5 -1
  82. package/package/components/copilot/lib.js +21 -5
  83. package/package/components/deploymentRequest/DeploymentRequestPanel.svelte +337 -0
  84. package/package/components/deploymentRequest/DeploymentRequestPanel.svelte.d.ts +15 -0
  85. package/package/components/details/CopyableCodeBlock.svelte +18 -8
  86. package/package/components/details/CopyableCodeBlock.svelte.d.ts +1 -0
  87. package/package/components/flows/FlowAssetsHandler.svelte +19 -21
  88. package/package/components/flows/agentToolTree.d.ts +17 -0
  89. package/package/components/flows/agentToolTree.js +114 -0
  90. package/package/components/flows/agentToolTree.test.d.ts +1 -0
  91. package/package/components/flows/agentToolTree.test.js +86 -0
  92. package/package/components/flows/agentToolUtils.d.ts +0 -5
  93. package/package/components/flows/agentToolUtils.js +0 -49
  94. package/package/components/flows/content/FlowLoop.svelte +7 -4
  95. package/package/components/flows/content/FlowModuleDeleteAfterUse.svelte +15 -7
  96. package/package/components/flows/content/FlowSettings.svelte +29 -0
  97. package/package/components/flows/dfs.d.ts +6 -2
  98. package/package/components/flows/dfs.js +19 -11
  99. package/package/components/flows/flowDeleteController.d.ts +32 -0
  100. package/package/components/flows/flowDeleteController.js +54 -0
  101. package/package/components/flows/flowDeleteController.test.d.ts +1 -0
  102. package/package/components/flows/flowDeleteController.test.js +121 -0
  103. package/package/components/flows/flowDeleteUtils.d.ts +48 -0
  104. package/package/components/flows/flowDeleteUtils.js +150 -0
  105. package/package/components/flows/flowDeleteUtils.test.d.ts +1 -0
  106. package/package/components/flows/flowDeleteUtils.test.js +131 -0
  107. package/package/components/flows/flowDiff.d.ts +2 -47
  108. package/package/components/flows/flowDiff.js +16 -293
  109. package/package/components/flows/flowDiff.testUtils.d.ts +8 -0
  110. package/package/components/flows/flowDiff.testUtils.js +26 -0
  111. package/package/components/flows/flowDiffManager.svelte.js +20 -75
  112. package/package/components/flows/flowDiffManager.svelte.test.js +103 -2
  113. package/package/components/flows/flowExplorer.d.ts +4 -0
  114. package/package/components/flows/flowExplorer.js +7 -30
  115. package/package/components/flows/flowState.d.ts +1 -0
  116. package/package/components/flows/flowStateUtils.svelte.js +6 -1
  117. package/package/components/flows/flowTree.d.ts +91 -0
  118. package/package/components/flows/flowTree.js +326 -0
  119. package/package/components/flows/flowTree.test.d.ts +1 -0
  120. package/package/components/flows/flowTree.test.js +236 -0
  121. package/package/components/flows/map/FlowJobsMenu.svelte +36 -30
  122. package/package/components/flows/map/FlowModuleSchemaItem.svelte +1 -1
  123. package/package/components/flows/map/FlowModuleSchemaMap.svelte +70 -227
  124. package/package/components/flows/map/FlowModuleSchemaMap.svelte.d.ts +0 -2
  125. package/package/components/flows/pickers/PickHubScriptQuick.svelte +2 -2
  126. package/package/components/flows/previousResults.js +13 -41
  127. package/package/components/flows/previousResults.test.d.ts +1 -0
  128. package/package/components/flows/previousResults.test.js +65 -0
  129. package/package/components/flows/propPicker/OutputPicker.svelte +2 -1
  130. package/package/components/flows/propPicker/OutputPickerInner.svelte +41 -4
  131. package/package/components/flows/propPicker/StepHistory.svelte +9 -1
  132. package/package/components/git_sync/GitSyncContext.svelte.js +11 -5
  133. package/package/components/git_sync/GitSyncRepositoryCard.svelte +2 -29
  134. package/package/components/git_sync/PullWorkspaceModal.svelte +6 -7
  135. package/package/components/graph/FlowGraphV2.svelte +2 -2
  136. package/package/components/graph/FlowGraphV2.svelte.d.ts +1 -0
  137. package/package/components/graph/groupedModulesProxy.svelte.d.ts +10 -0
  138. package/package/components/graph/groupedModulesProxy.svelte.js +17 -1
  139. package/package/components/graph/renderers/triggers/TriggersBadge.svelte +5 -2
  140. package/package/components/home/HomeConnectDrawer.svelte +125 -0
  141. package/package/components/home/HomeConnectDrawer.svelte.d.ts +5 -0
  142. package/package/components/icons/GithubIcon.svelte +4 -4
  143. package/package/components/icons/GithubIcon.svelte.d.ts +5 -2
  144. package/package/components/instanceSettings/ExternalJwtTokens.svelte +85 -0
  145. package/package/components/instanceSettings/ExternalJwtTokens.svelte.d.ts +12 -0
  146. package/package/components/instanceSettings/GhesAppSettings.svelte +17 -0
  147. package/package/components/instanceSettings/IndexerMemorySettings.svelte +56 -29
  148. package/package/components/instanceSettings/SecretBackendConfig.svelte +9 -2
  149. package/package/components/instanceSettings.d.ts +1 -0
  150. package/package/components/instanceSettings.js +42 -8
  151. package/package/components/offboarding-utils.d.ts +11 -0
  152. package/package/components/offboarding-utils.js +100 -0
  153. package/package/components/raw_apps/RawAppDataTableDrawer.svelte +1 -1
  154. package/package/components/raw_apps/RawAppEditor.svelte +27 -0
  155. package/package/components/raw_apps/RawAppEditorHeader.svelte +6 -1
  156. package/package/components/raw_apps/RawAppEditorHeader.svelte.d.ts +1 -0
  157. package/package/components/raw_apps/RawAppYamlEditor.svelte +81 -0
  158. package/package/components/raw_apps/RawAppYamlEditor.svelte.d.ts +20 -0
  159. package/package/components/raw_apps/datatableUtils.svelte.js +1 -1
  160. package/package/components/runs/runsFilter.d.ts +1 -1
  161. package/package/components/script_builder.d.ts +1 -1
  162. package/package/components/select/Select.svelte +2 -1
  163. package/package/components/select/Select.svelte.d.ts +1 -0
  164. package/package/components/settings/CreateToken.svelte +113 -64
  165. package/package/components/settings/CreateToken.svelte.d.ts +3 -0
  166. package/package/components/settings/WorkspaceUserSettings.svelte +34 -28
  167. package/package/components/sidebar/SidebarContent.svelte +58 -2
  168. package/package/components/sidebar/WorkspaceMenu.svelte +8 -4
  169. package/package/components/triggers/AddTriggersButton.svelte +11 -0
  170. package/package/components/triggers/PermissionedAsLine.svelte +37 -3
  171. package/package/components/triggers/PermissionedAsLine.svelte.d.ts +6 -0
  172. package/package/components/triggers/TriggersEditor.svelte +5 -1
  173. package/package/components/triggers/TriggersWrapper.svelte +10 -0
  174. package/package/components/triggers/email/EmailTriggerEditorInner.svelte +13 -11
  175. package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +13 -11
  176. package/package/components/triggers/http/RouteEditorConfigSection.svelte +15 -7
  177. package/package/components/triggers/http/RouteEditorInner.svelte +14 -14
  178. package/package/components/triggers/http/RoutesGenerator.svelte +6 -1
  179. package/package/components/triggers/http/RoutesPanel.svelte +1 -1
  180. package/package/components/triggers/http/utils.d.ts +1 -1
  181. package/package/components/triggers/http/utils.js +2 -2
  182. package/package/components/triggers/kafka/KafkaTriggerEditorInner.svelte +13 -11
  183. package/package/components/triggers/mqtt/MqttTriggerEditorInner.svelte +13 -11
  184. package/package/components/triggers/native/NativeTriggerEditor.svelte +3 -0
  185. package/package/components/triggers/native/services/github/GitHubTriggerForm.svelte +118 -0
  186. package/package/components/triggers/native/services/github/GitHubTriggerForm.svelte.d.ts +17 -0
  187. package/package/components/triggers/native/utils.js +14 -0
  188. package/package/components/triggers/nats/NatsTriggerEditor.svelte.d.ts +4 -3
  189. package/package/components/triggers/nats/NatsTriggerEditorInner.svelte +13 -11
  190. package/package/components/triggers/postgres/PostgresTriggerEditor.svelte.d.ts +4 -3
  191. package/package/components/triggers/postgres/PostgresTriggerEditorInner.svelte +13 -11
  192. package/package/components/triggers/schedules/ScheduleEditorInner.svelte +13 -11
  193. package/package/components/triggers/sqs/SqsTriggerEditor.svelte.d.ts +4 -3
  194. package/package/components/triggers/sqs/SqsTriggerEditorInner.svelte +13 -11
  195. package/package/components/triggers/triggers.svelte.js +1 -0
  196. package/package/components/triggers/utils.js +27 -6
  197. package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +13 -11
  198. package/package/components/triggers.d.ts +1 -1
  199. package/package/components/useFolderDefaultPermissionedAs.svelte.d.ts +13 -0
  200. package/package/components/useFolderDefaultPermissionedAs.svelte.js +63 -0
  201. package/package/components/workspaceSettings/CreateWorkspace.svelte +16 -677
  202. package/package/components/workspaceSettings/CreateWorkspaceInner.svelte +604 -0
  203. package/package/components/workspaceSettings/CreateWorkspaceInner.svelte.d.ts +7 -0
  204. package/package/components/workspaceSettings/CustomInstanceDbSelect.svelte +27 -25
  205. package/package/components/workspaceSettings/CustomInstanceDbWizardModal.svelte +46 -8
  206. package/package/components/workspaceSettings/DataTableSettings.svelte +27 -22
  207. package/package/components/workspaceSettings/DucklakeSettings.svelte +1 -1
  208. package/package/components/workspaceSettings/ForkDatatableSection.svelte +228 -0
  209. package/package/components/workspaceSettings/ForkDatatableSection.svelte.d.ts +28 -0
  210. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte +8 -2
  211. package/package/components/workspaceSettings/RulesetEditor.svelte +27 -2
  212. package/package/components/workspaceSettings/VolumeStorageSettings.svelte +1 -1
  213. package/package/components/workspaceSettings/WorkspaceIntegrations.svelte +17 -1
  214. package/package/consts.d.ts +3 -0
  215. package/package/consts.js +10 -0
  216. package/package/gen/core/OpenAPI.js +1 -1
  217. package/package/gen/schemas.gen.d.ts +485 -19
  218. package/package/gen/schemas.gen.js +489 -20
  219. package/package/gen/services.gen.d.ts +229 -2
  220. package/package/gen/services.gen.js +463 -1
  221. package/package/gen/types.gen.d.ts +866 -29
  222. package/package/githubApp.js +5 -1
  223. package/package/hubPaths.json +1 -4
  224. package/package/infer.js +13 -1
  225. package/package/infer.svelte.js +10 -1
  226. package/package/monaco_workers/sqlTypePlugin.worker.d.ts +10 -0
  227. package/package/monaco_workers/sqlTypePlugin.worker.js +39 -0
  228. package/package/script_helpers.d.ts +8 -2
  229. package/package/script_helpers.js +14 -0
  230. package/package/stores.d.ts +4 -0
  231. package/package/stores.js +1 -0
  232. package/package/system_prompts/prompts.d.ts +4 -3
  233. package/package/system_prompts/prompts.js +270 -20
  234. package/package/templates/ci_test_bun.ts.template +19 -0
  235. package/package/templates/ci_test_python.py.template +18 -0
  236. package/package/utils_workspace_deploy.d.ts +8 -8
  237. package/package/utils_workspace_deploy.js +86 -420
  238. package/package.json +3 -3
  239. package/package/components/copilot/chat/__tests__/app/appChat.eval.test.js +0 -153
  240. package/package/components/copilot/chat/__tests__/app/appEvalComparison.d.ts +0 -21
  241. package/package/components/copilot/chat/__tests__/app/appEvalComparison.js +0 -136
  242. package/package/components/copilot/chat/__tests__/app/appEvalHelpers.d.ts +0 -15
  243. package/package/components/copilot/chat/__tests__/app/appEvalHelpers.js +0 -107
  244. package/package/components/copilot/chat/__tests__/app/appEvalRunner.d.ts +0 -50
  245. package/package/components/copilot/chat/__tests__/app/appEvalRunner.js +0 -93
  246. package/package/components/copilot/chat/__tests__/app/appFixtureLoader.d.ts +0 -29
  247. package/package/components/copilot/chat/__tests__/app/appFixtureLoader.js +0 -134
  248. package/package/components/copilot/chat/__tests__/app/appResultsWriter.d.ts +0 -30
  249. package/package/components/copilot/chat/__tests__/app/appResultsWriter.js +0 -197
  250. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/createFolder/main.d.ts +0 -10
  251. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/createFolder/main.js +0 -9
  252. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/createFolder/meta.json +0 -4
  253. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/deleteItem/main.d.ts +0 -6
  254. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/deleteItem/main.js +0 -5
  255. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/deleteItem/meta.json +0 -4
  256. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/listFiles/main.d.ts +0 -12
  257. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/listFiles/main.js +0 -14
  258. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/listFiles/meta.json +0 -4
  259. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/listFolders/main.d.ts +0 -8
  260. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/listFolders/main.js +0 -25
  261. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/listFolders/meta.json +0 -4
  262. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/moveItem/main.d.ts +0 -7
  263. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/moveItem/main.js +0 -5
  264. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/moveItem/meta.json +0 -4
  265. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/renameItem/main.d.ts +0 -8
  266. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/renameItem/main.js +0 -5
  267. package/package/components/copilot/chat/__tests__/app/initial/file_manager/backend/renameItem/meta.json +0 -4
  268. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/Breadcrumb.d.ts +0 -10
  269. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/Breadcrumb.tsx +0 -26
  270. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/FileItem.d.ts +0 -10
  271. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/FileItem.tsx +0 -79
  272. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/FileList.d.ts +0 -10
  273. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/FileList.tsx +0 -46
  274. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/FolderTree.d.ts +0 -10
  275. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/FolderTree.tsx +0 -56
  276. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/Toolbar.d.ts +0 -6
  277. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/components/Toolbar.tsx +0 -59
  278. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/index.d.ts +0 -16
  279. package/package/components/copilot/chat/__tests__/app/initial/file_manager/frontend/index.tsx +0 -119
  280. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/addToCart/main.d.ts +0 -15
  281. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/addToCart/main.js +0 -14
  282. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/addToCart/meta.json +0 -4
  283. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/calculateTotal/main.d.ts +0 -14
  284. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/calculateTotal/main.js +0 -5
  285. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/calculateTotal/meta.json +0 -4
  286. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/getProducts/main.d.ts +0 -6
  287. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/getProducts/main.js +0 -41
  288. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/getProducts/meta.json +0 -4
  289. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/removeFromCart/main.d.ts +0 -15
  290. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/removeFromCart/main.js +0 -3
  291. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/backend/removeFromCart/meta.json +0 -4
  292. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/components/Cart.d.ts +0 -9
  293. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/components/Cart.tsx +0 -51
  294. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/components/ProductCard.d.ts +0 -8
  295. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/components/ProductCard.tsx +0 -27
  296. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/components/ProductList.d.ts +0 -8
  297. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/components/ProductList.tsx +0 -18
  298. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/index.d.ts +0 -12
  299. package/package/components/copilot/chat/__tests__/app/initial/shopping_cart/frontend/index.tsx +0 -81
  300. package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/backend/decrementCounter/main.d.ts +0 -3
  301. package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/backend/decrementCounter/main.js +0 -3
  302. package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/backend/decrementCounter/meta.json +0 -4
  303. package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/backend/incrementCounter/main.d.ts +0 -3
  304. package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/backend/incrementCounter/main.js +0 -3
  305. package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/backend/incrementCounter/meta.json +0 -4
  306. package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/frontend/index.d.ts +0 -2
  307. package/package/components/copilot/chat/__tests__/app/initial/test1_counter_app/frontend/index.tsx +0 -38
  308. package/package/components/copilot/chat/__tests__/app/variants/baseline.d.ts +0 -6
  309. package/package/components/copilot/chat/__tests__/app/variants/baseline.js +0 -10
  310. package/package/components/copilot/chat/__tests__/app/variants/index.d.ts +0 -3
  311. package/package/components/copilot/chat/__tests__/app/variants/index.js +0 -3
  312. package/package/components/copilot/chat/__tests__/app/variants/streamlined.d.ts +0 -6
  313. package/package/components/copilot/chat/__tests__/app/variants/streamlined.js +0 -137
  314. package/package/components/copilot/chat/__tests__/flow/expected/test1.json +0 -134
  315. package/package/components/copilot/chat/__tests__/flow/expected/test2.json +0 -183
  316. package/package/components/copilot/chat/__tests__/flow/expected/test3.json +0 -204
  317. package/package/components/copilot/chat/__tests__/flow/expected/test4.json +0 -175
  318. package/package/components/copilot/chat/__tests__/flow/expected/test5_modify_simple.json +0 -68
  319. package/package/components/copilot/chat/__tests__/flow/expected/test6_modify_medium.json +0 -142
  320. package/package/components/copilot/chat/__tests__/flow/expected/test7_modify_complex.json +0 -136
  321. package/package/components/copilot/chat/__tests__/flow/flowChat.eval.test.js +0 -294
  322. package/package/components/copilot/chat/__tests__/flow/flowEvalComparison.d.ts +0 -17
  323. package/package/components/copilot/chat/__tests__/flow/flowEvalComparison.js +0 -49
  324. package/package/components/copilot/chat/__tests__/flow/flowEvalHelpers.d.ts +0 -12
  325. package/package/components/copilot/chat/__tests__/flow/flowEvalHelpers.js +0 -79
  326. package/package/components/copilot/chat/__tests__/flow/flowEvalRunner.d.ts +0 -50
  327. package/package/components/copilot/chat/__tests__/flow/flowEvalRunner.js +0 -102
  328. package/package/components/copilot/chat/__tests__/flow/initial/test5_initial.json +0 -53
  329. package/package/components/copilot/chat/__tests__/flow/initial/test6_initial.json +0 -68
  330. package/package/components/copilot/chat/__tests__/flow/initial/test7_initial.json +0 -120
  331. package/package/components/copilot/chat/__tests__/flow/variants/baseline.d.ts +0 -6
  332. package/package/components/copilot/chat/__tests__/flow/variants/baseline.js +0 -10
  333. package/package/components/copilot/chat/__tests__/flow/variants/index.d.ts +0 -3
  334. package/package/components/copilot/chat/__tests__/flow/variants/index.js +0 -3
  335. package/package/components/copilot/chat/__tests__/flow/variants/minimal-single-tool.d.ts +0 -15
  336. package/package/components/copilot/chat/__tests__/flow/variants/minimal-single-tool.js +0 -388
  337. package/package/components/copilot/chat/__tests__/shared/baseEvalRunner.d.ts +0 -45
  338. package/package/components/copilot/chat/__tests__/shared/baseEvalRunner.js +0 -121
  339. package/package/components/copilot/chat/__tests__/shared/baseLLMEvaluator.d.ts +0 -28
  340. package/package/components/copilot/chat/__tests__/shared/baseLLMEvaluator.js +0 -96
  341. package/package/components/copilot/chat/__tests__/shared/baseResultsWriter.d.ts +0 -32
  342. package/package/components/copilot/chat/__tests__/shared/baseResultsWriter.js +0 -130
  343. package/package/components/copilot/chat/__tests__/shared/baseVariants.d.ts +0 -45
  344. package/package/components/copilot/chat/__tests__/shared/baseVariants.js +0 -57
  345. package/package/components/copilot/chat/__tests__/shared/index.d.ts +0 -10
  346. package/package/components/copilot/chat/__tests__/shared/index.js +0 -5
  347. package/package/components/copilot/chat/__tests__/shared/types.d.ts +0 -105
  348. package/package/components/copilot/chat/__tests__/shared/types.js +0 -9
  349. package/package/components/copilot/chat/flow/utils.d.ts +0 -14
  350. package/package/components/copilot/chat/flow/utils.js +0 -108
  351. package/package/components/flows/agentToolUtils.test.js +0 -55
  352. /package/package/components/copilot/chat/{__tests__/app/appChat.eval.test.d.ts → app/core.test.d.ts} +0 -0
  353. /package/package/components/copilot/chat/{__tests__/flow/flowChat.eval.test.d.ts → flow/helperUtils.test.d.ts} +0 -0
  354. /package/package/components/{flows/agentToolUtils.test.d.ts → copilot/chat/flow/utils.test.d.ts} +0 -0
@@ -142,6 +142,23 @@ let fieldsDisabled = $derived(disabled || !selfManaged);
142
142
  bind:value={$values['github_enterprise_app'].client_id}
143
143
  />
144
144
  </div>
145
+ <div class="flex flex-col gap-1">
146
+ <label for="ghes_app_owner" class="block text-xs font-semibold text-emphasis mb-1">
147
+ App owner
148
+ </label>
149
+ <TextInput
150
+ inputProps={{
151
+ type: 'text',
152
+ id: 'ghes_app_owner',
153
+ placeholder: 'my-org',
154
+ disabled: fieldsDisabled
155
+ }}
156
+ bind:value={$values['github_enterprise_app'].app_owner}
157
+ />
158
+ <span class="text-2xs text-secondary">
159
+ Organization or user that owns the GitHub App. Required for GHE Cloud (*.ghe.com) domains.
160
+ </span>
161
+ </div>
145
162
  </div>
146
163
 
147
164
  <div class="flex flex-col gap-1">
@@ -7,8 +7,22 @@ import Tooltip from '../Tooltip.svelte';
7
7
  import IntegerInput from '../IntegerInput.svelte';
8
8
  import InputError from '../InputError.svelte';
9
9
  import Label from '../Label.svelte';
10
+ import Toggle from '../Toggle.svelte';
10
11
  import { Loader2, RefreshCw } from 'lucide-svelte';
11
12
  let { values, disabled = false, errors = {} } = $props();
13
+ let isTimeWindowCapped = $derived($values['indexer_settings'].max_index_time_window_secs !== 0);
14
+ function setTimeWindowCapped(checked) {
15
+ if (checked) {
16
+ const { max_index_time_window_secs: _, ...rest } = $values['indexer_settings'];
17
+ $values['indexer_settings'] = rest;
18
+ }
19
+ else {
20
+ $values['indexer_settings'] = {
21
+ ...$values['indexer_settings'],
22
+ max_index_time_window_secs: 0
23
+ };
24
+ }
25
+ }
12
26
  let clearJobsIndexModalOpen = $state(false);
13
27
  let clearServiceLogsIndexModalOpen = $state(false);
14
28
  let status = $state(undefined);
@@ -80,36 +94,49 @@ loadStatus();
80
94
  />
81
95
  <InputError error={errors.writer_memory_budget ?? ''} />
82
96
  </div>
83
- <div class="flex flex-col gap-1">
84
- <label for="max_index_time_window_secs" class="block text-xs font-semibold text-emphasis">
85
- Index time window (days)
86
- <Tooltip>
87
- Maximum age of items to include in the index. Jobs and logs older than this window will not
88
- be indexed and will be cleaned up from the index. Set to 0 to disable (index everything
89
- within the retention period).
90
- </Tooltip>
91
- </label>
92
- <IntegerInput
93
- placeholder="7"
94
- id="max_index_time_window_secs"
95
- {disabled}
96
- error={errors.max_index_time_window_secs ?? ''}
97
- value={$values['indexer_settings'].max_index_time_window_secs != null
98
- ? Math.round($values['indexer_settings'].max_index_time_window_secs / 86400)
99
- : undefined}
100
- oninput={(v) => {
101
- if (v == null) {
102
- const { max_index_time_window_secs: _, ...rest } = $values['indexer_settings']
103
- $values['indexer_settings'] = rest
104
- } else {
105
- $values['indexer_settings'] = {
106
- ...$values['indexer_settings'],
107
- max_index_time_window_secs: v * 86400
97
+ <div class="flex flex-col gap-2">
98
+ <div class="flex flex-row items-center gap-2">
99
+ <span class="block text-xs font-semibold text-emphasis">
100
+ Index time window
101
+ <Tooltip>
102
+ Cap the age of items the indexer keeps. Jobs and logs older than this window are not
103
+ indexed and are cleaned up from the index. Disable the cap to index everything within the
104
+ retention period.
105
+ </Tooltip>
106
+ </span>
107
+ <div class="ml-auto">
108
+ <Toggle
109
+ {disabled}
110
+ checked={isTimeWindowCapped}
111
+ on:change={(e) => setTimeWindowCapped(e.detail)}
112
+ options={{ right: 'Cap by time window' }}
113
+ />
114
+ </div>
115
+ </div>
116
+ {#if isTimeWindowCapped}
117
+ <IntegerInput
118
+ placeholder="7"
119
+ id="max_index_time_window_secs"
120
+ {disabled}
121
+ error={errors.max_index_time_window_secs ?? ''}
122
+ value={$values['indexer_settings'].max_index_time_window_secs != null
123
+ ? Math.round($values['indexer_settings'].max_index_time_window_secs / 86400)
124
+ : undefined}
125
+ oninput={(v) => {
126
+ if (v == null) {
127
+ const { max_index_time_window_secs: _, ...rest } = $values['indexer_settings']
128
+ $values['indexer_settings'] = rest
129
+ } else {
130
+ $values['indexer_settings'] = {
131
+ ...$values['indexer_settings'],
132
+ max_index_time_window_secs: v * 86400
133
+ }
108
134
  }
109
- }
110
- }}
111
- />
112
- <InputError error={errors.max_index_time_window_secs ?? ''} />
135
+ }}
136
+ />
137
+ <span class="text-2xs text-tertiary">days (leave blank to use the default of 7 days)</span>
138
+ <InputError error={errors.max_index_time_window_secs ?? ''} />
139
+ {/if}
113
140
  </div>
114
141
  <Label label="Indexer status">
115
142
  {#snippet action()}
@@ -3,6 +3,7 @@ import Password from '../Password.svelte';
3
3
  import { SettingService } from '../../gen';
4
4
  import { sendUserToast } from '../../toast';
5
5
  import TextInput from '../text_input/TextInput.svelte';
6
+ import Toggle from '../Toggle.svelte';
6
7
  import { Database, Lock, Server, ArrowLeft, ArrowRight, Cloud } from 'lucide-svelte';
7
8
  import { enterpriseLicense } from '../../stores';
8
9
  import ToggleButtonGroup from '../common/toggleButton-v2/ToggleButtonGroup.svelte';
@@ -53,7 +54,8 @@ function setBackendType(type) {
53
54
  mount_path: $values['secret_backend']?.mount_path ?? 'windmill',
54
55
  jwt_role: $values['secret_backend']?.jwt_role ?? 'windmill-secrets',
55
56
  namespace: $values['secret_backend']?.namespace ?? null,
56
- token: $values['secret_backend']?.token ?? null
57
+ token: $values['secret_backend']?.token ?? null,
58
+ skip_ssl_verify: $values['secret_backend']?.skip_ssl_verify ?? false
57
59
  };
58
60
  }
59
61
  else if (type === 'AzureKeyVault') {
@@ -93,7 +95,8 @@ function getVaultSettings() {
93
95
  mount_path: $values['secret_backend'].mount_path,
94
96
  jwt_role: $values['secret_backend'].jwt_role,
95
97
  namespace: $values['secret_backend'].namespace || undefined,
96
- token: $values['secret_backend'].token || undefined
98
+ token: $values['secret_backend'].token || undefined,
99
+ skip_ssl_verify: $values['secret_backend'].skip_ssl_verify || undefined
97
100
  };
98
101
  }
99
102
  async function testVaultConnection() {
@@ -402,6 +405,10 @@ vault write auth/jwt/role/windmill-secrets \
402
405
  <span class="text-2xs text-secondary">Vault Enterprise namespace</span>
403
406
  <TextInput inputProps={{ type: 'text', id: 'vault_namespace', placeholder: 'admin/my-namespace', disabled }} bind:value={$values['secret_backend'].namespace} />
404
407
  </div>
408
+ <div class="flex flex-col gap-1">
409
+ <Toggle id="vault_skip_ssl_verify" {disabled} bind:checked={$values['secret_backend'].skip_ssl_verify} size="xs" options={{ right: 'Skip TLS certificate verification' }} />
410
+ <span class="text-2xs text-secondary">Disables TLS verification when connecting to Vault. Only enable for self-signed certificates in development.</span>
411
+ </div>
405
412
  </div>
406
413
  <div class="flex flex-col gap-4 pt-4 border-t">
407
414
  <Button unifiedSize="md" variant="accent" onclick={testVaultConnection} disabled={disabled || !isVaultConfigValid() || testingConnection} loading={testingConnection} startIcon={{ icon: Server }}>Test Connection</Button>
@@ -25,6 +25,7 @@ export interface Setting {
25
25
  hiddenInEe?: boolean;
26
26
  hideInQuickSetup?: boolean;
27
27
  requiresReloadOnChange?: boolean;
28
+ triggersRestart?: boolean;
28
29
  isValid?: (value: any) => boolean;
29
30
  validate?: (value: any) => Record<string, string>;
30
31
  error?: string;
@@ -13,6 +13,7 @@ export const OTEL_TRACING_PROXY_LANGUAGES = [
13
13
  'ruby'
14
14
  ];
15
15
  const positiveNumber = z.number().positive('Must be a positive number');
16
+ const nonNegativeNumber = z.number().nonnegative('Must be zero or a positive number');
16
17
  const indexerSettingsSchema = z
17
18
  .object({
18
19
  writer_memory_budget: positiveNumber.optional(),
@@ -21,7 +22,7 @@ const indexerSettingsSchema = z
21
22
  max_indexed_job_log_size: positiveNumber.optional(),
22
23
  commit_log_max_batch_size: positiveNumber.optional(),
23
24
  refresh_log_index_period: positiveNumber.optional(),
24
- max_index_time_window_secs: positiveNumber.optional()
25
+ max_index_time_window_secs: nonNegativeNumber.optional()
25
26
  })
26
27
  .passthrough();
27
28
  function validateIndexerSettings(v) {
@@ -55,7 +56,8 @@ export const scimSamlSetting = [
55
56
  fieldType: 'textarea',
56
57
  placeholder: 'https://dev-2578259.okta.com/app/exkaell8gidiiUWrg5d7/sso/saml/metadata ',
57
58
  storage: 'setting',
58
- ee_only: ''
59
+ ee_only: '',
60
+ triggersRestart: true
59
61
  }
60
62
  ];
61
63
  export const settings = {
@@ -81,6 +83,7 @@ export const settings = {
81
83
  fieldType: 'text',
82
84
  placeholder: 'mail.windmill.com',
83
85
  storage: 'setting',
86
+ triggersRestart: true,
84
87
  error: 'Must be a valid domain',
85
88
  isValid: (value) => value == undefined ||
86
89
  value === '' ||
@@ -93,7 +96,8 @@ export const settings = {
93
96
  key: 'request_size_limit_mb',
94
97
  fieldType: 'number',
95
98
  placeholder: '50',
96
- storage: 'setting'
99
+ storage: 'setting',
100
+ triggersRestart: true
97
101
  },
98
102
  {
99
103
  label: 'License key',
@@ -290,7 +294,15 @@ export const settings = {
290
294
  ee_only: ''
291
295
  }
292
296
  ],
293
- 'Auth/OAuth/SAML': [],
297
+ 'Auth/OAuth/SAML': [
298
+ {
299
+ label: 'Disable password login',
300
+ description: 'Hide the email/password form on the login page and reject password login requests. Use when you only want OAuth/SAML logins.',
301
+ key: 'disable_password_login',
302
+ fieldType: 'boolean',
303
+ storage: 'setting'
304
+ }
305
+ ],
294
306
  'DB Health': [],
295
307
  Registries: [
296
308
  {
@@ -544,7 +556,8 @@ export const settings = {
544
556
  key: 'otel',
545
557
  fieldType: 'otel',
546
558
  storage: 'setting',
547
- ee_only: ''
559
+ ee_only: '',
560
+ triggersRestart: true
548
561
  },
549
562
  {
550
563
  label: 'HTTP Request Tracing',
@@ -553,6 +566,7 @@ export const settings = {
553
566
  fieldType: 'otel_tracing_proxy',
554
567
  storage: 'setting',
555
568
  ee_only: 'HTTP Request Tracing is an EE feature',
569
+ triggersRestart: true,
556
570
  defaultValue: () => ({ enabled: false, enabled_languages: [...OTEL_TRACING_PROXY_LANGUAGES] })
557
571
  },
558
572
  {
@@ -561,7 +575,8 @@ export const settings = {
561
575
  key: 'expose_metrics',
562
576
  fieldType: 'boolean',
563
577
  storage: 'setting',
564
- ee_only: ''
578
+ ee_only: '',
579
+ triggersRestart: true
565
580
  }
566
581
  ],
567
582
  Indexer: [
@@ -621,6 +636,17 @@ export const settings = {
621
636
  !value.endsWith('/') &&
622
637
  !value.endsWith(' '))
623
638
  }
639
+ ],
640
+ LSP: [
641
+ {
642
+ label: 'Ruff config (ruff.toml)',
643
+ description: 'Shared ruff.toml applied to the Python editor linter across the whole instance. The LSP container fetches this every minute and writes it next to edited files. See <a href="https://docs.astral.sh/ruff/configuration/">ruff docs</a>',
644
+ key: 'ruff_config',
645
+ fieldType: 'codearea',
646
+ codeAreaLang: 'toml',
647
+ placeholder: 'line-length = 100\n\n[lint]\nselect = ["E", "F", "I"]\nignore = ["E501"]',
648
+ storage: 'setting'
649
+ }
624
650
  ]
625
651
  };
626
652
  export const settingsKeys = Object.keys(settings);
@@ -780,6 +806,12 @@ export const instanceSettingsNavigationGroups = [
780
806
  label: 'WebSocket',
781
807
  aiId: 'instance-settings-websocket',
782
808
  aiDescription: 'WebSocket connectivity test and URL override'
809
+ },
810
+ {
811
+ id: 'lsp',
812
+ label: 'LSP',
813
+ aiId: 'instance-settings-lsp',
814
+ aiDescription: 'Language server protocol settings (ruff config, editor linting)'
783
815
  }
784
816
  ]
785
817
  }
@@ -803,7 +835,8 @@ export const tabToCategoryMap = {
803
835
  private_hub: 'Private Hub',
804
836
  github_enterprise_app: 'GitHub App',
805
837
  websocket: 'WebSocket',
806
- db_health: 'DB Health'
838
+ db_health: 'DB Health',
839
+ lsp: 'LSP'
807
840
  };
808
841
  export const tabToAuthSubTab = {
809
842
  sso: 'sso',
@@ -834,7 +867,8 @@ export const categoryToTabMap = {
834
867
  'Private Hub': 'private_hub',
835
868
  'GitHub App': 'github_enterprise_app',
836
869
  WebSocket: 'websocket',
837
- 'DB Health': 'db_health'
870
+ 'DB Health': 'db_health',
871
+ LSP: 'lsp'
838
872
  };
839
873
  /**
840
874
  * Extract the label portion from a uFuzzy marked/highlighted string.
@@ -0,0 +1,11 @@
1
+ import type { OffboardAffectedPaths } from '../gen';
2
+ export declare function pl(n: number, singular: string): string;
3
+ export declare function countPaths(p: OffboardAffectedPaths | undefined | null): number;
4
+ export declare function flattenPaths(p: OffboardAffectedPaths | undefined | null): Array<{
5
+ kind: string;
6
+ path: string;
7
+ }>;
8
+ export declare function triggerLabel(triggerType: string): string;
9
+ export declare function kindLabel(kind: string): string;
10
+ export declare function itemHref(kind: string, path: string): string | undefined;
11
+ export declare function downloadCsv(rows: string[][], filename: string): void;
@@ -0,0 +1,100 @@
1
+ export function pl(n, singular) {
2
+ return `${n} ${singular}${n === 1 ? '' : 's'}`;
3
+ }
4
+ function triggerCount(triggers) {
5
+ if (!triggers)
6
+ return 0;
7
+ return Object.values(triggers).reduce((s, arr) => s + arr.length, 0);
8
+ }
9
+ export function countPaths(p) {
10
+ if (!p)
11
+ return 0;
12
+ return ((p.scripts?.length ?? 0) +
13
+ (p.flows?.length ?? 0) +
14
+ (p.apps?.length ?? 0) +
15
+ (p.resources?.length ?? 0) +
16
+ (p.variables?.length ?? 0) +
17
+ (p.schedules?.length ?? 0) +
18
+ triggerCount(p.triggers));
19
+ }
20
+ const TRIGGER_TABLE_TO_ROUTE = {
21
+ http_trigger: 'routes',
22
+ websocket_trigger: 'websocket_triggers',
23
+ kafka_trigger: 'kafka_triggers',
24
+ postgres_trigger: 'postgres_triggers',
25
+ mqtt_trigger: 'mqtt_triggers',
26
+ nats_trigger: 'nats_triggers',
27
+ sqs_trigger: 'sqs_triggers',
28
+ gcp_trigger: 'gcp_triggers',
29
+ email_trigger: 'email_triggers'
30
+ };
31
+ const TRIGGER_TABLE_TO_LABEL = {
32
+ http_trigger: 'http trigger',
33
+ websocket_trigger: 'websocket trigger',
34
+ kafka_trigger: 'kafka trigger',
35
+ postgres_trigger: 'postgres trigger',
36
+ mqtt_trigger: 'mqtt trigger',
37
+ nats_trigger: 'nats trigger',
38
+ sqs_trigger: 'sqs trigger',
39
+ gcp_trigger: 'gcp trigger',
40
+ email_trigger: 'email trigger'
41
+ };
42
+ export function flattenPaths(p) {
43
+ if (!p)
44
+ return [];
45
+ const result = [];
46
+ for (const [kind, list] of Object.entries(p)) {
47
+ if (kind === 'triggers' && list && typeof list === 'object' && !Array.isArray(list)) {
48
+ for (const [triggerType, paths] of Object.entries(list)) {
49
+ for (const path of paths)
50
+ result.push({ kind: triggerType, path });
51
+ }
52
+ }
53
+ else if (Array.isArray(list)) {
54
+ for (const path of list)
55
+ result.push({ kind, path });
56
+ }
57
+ }
58
+ return result;
59
+ }
60
+ export function triggerLabel(triggerType) {
61
+ return TRIGGER_TABLE_TO_LABEL[triggerType] ?? triggerType;
62
+ }
63
+ export function kindLabel(kind) {
64
+ if (TRIGGER_TABLE_TO_LABEL[kind])
65
+ return TRIGGER_TABLE_TO_LABEL[kind];
66
+ // "scripts" -> "script", "flows" -> "flow", etc.
67
+ return kind.replace(/s$/, '');
68
+ }
69
+ export function itemHref(kind, path) {
70
+ switch (kind) {
71
+ case 'scripts':
72
+ return `/scripts/get/${path}`;
73
+ case 'flows':
74
+ return `/flows/get/${path}`;
75
+ case 'apps':
76
+ return `/apps/get/${path}`;
77
+ case 'resources':
78
+ return `/resources#/resource/${path}`;
79
+ case 'variables':
80
+ return `/variables#${path}`;
81
+ case 'schedules':
82
+ return `/schedules#${path}`;
83
+ default: {
84
+ const route = TRIGGER_TABLE_TO_ROUTE[kind];
85
+ if (route)
86
+ return `/${route}#${path}`;
87
+ return undefined;
88
+ }
89
+ }
90
+ }
91
+ export function downloadCsv(rows, filename) {
92
+ const csv = rows.map((r) => r.map((c) => `"${c.replace(/"/g, '""')}"`).join(',')).join('\n');
93
+ const blob = new Blob([csv], { type: 'text/csv' });
94
+ const url = URL.createObjectURL(blob);
95
+ const a = document.createElement('a');
96
+ a.href = url;
97
+ a.download = filename;
98
+ a.click();
99
+ URL.revokeObjectURL(url);
100
+ }
@@ -26,7 +26,7 @@ const datatables = resource([], async () => {
26
26
  if (!$workspaceStore)
27
27
  return [];
28
28
  try {
29
- return await WorkspaceService.listDataTables({ workspace: $workspaceStore });
29
+ return (await WorkspaceService.listDataTables({ workspace: $workspaceStore })).map((d) => d.name);
30
30
  }
31
31
  catch (e) {
32
32
  console.error('Failed to load datatables:', e);
@@ -1,6 +1,7 @@
1
1
  <script lang="ts">import { Pane, Splitpanes } from 'svelte-splitpanes';
2
2
  import RawAppInlineScriptsPanel from './RawAppInlineScriptsPanel.svelte';
3
3
  import RawAppEditorHeader from './RawAppEditorHeader.svelte';
4
+ import RawAppYamlEditor, {} from './RawAppYamlEditor.svelte';
4
5
  import { WorkspaceService } from '../../gen';
5
6
  import DiffDrawer from '../DiffDrawer.svelte';
6
7
  import { encodeState } from '../../utils';
@@ -47,7 +48,23 @@ function saveFrontendDraft() {
47
48
  }, 500);
48
49
  }
49
50
  let iframe = $state(undefined);
51
+ let yamlEditorDrawer = $state(undefined);
50
52
  let sidebarPanelSize = $state(15);
53
+ function handleYamlApply(update) {
54
+ if (update.summary !== undefined) {
55
+ summary = update.summary;
56
+ }
57
+ if (update.files !== undefined) {
58
+ files = update.files;
59
+ }
60
+ if (update.runnables !== undefined) {
61
+ runnables = update.runnables;
62
+ }
63
+ if (update.data !== undefined) {
64
+ data = update.data;
65
+ }
66
+ historyManager.manualSnapshot(files ?? {}, runnables, summary, data, true);
67
+ }
51
68
  let jobs = $state([]);
52
69
  let jobsById = $state({});
53
70
  // Helper function to convert internal Runnable to BackendRunnable format
@@ -694,6 +711,16 @@ function handleKeydown(e) {
694
711
  canRedo={historyManager.canRedo}
695
712
  onUndo={handleUndo}
696
713
  onRedo={handleRedo}
714
+ onOpenYamlEditor={() => yamlEditorDrawer?.openDrawer()}
715
+ />
716
+
717
+ <RawAppYamlEditor
718
+ bind:drawer={yamlEditorDrawer}
719
+ {summary}
720
+ {files}
721
+ {runnables}
722
+ {data}
723
+ onApply={handleYamlApply}
697
724
  />
698
725
 
699
726
  <Splitpanes id="o2" class="grow min-h-0">
@@ -27,7 +27,7 @@ import { AIBtnClasses } from '../copilot/chat/AIButtonStyle';
27
27
  import { isRuleActive } from '../../workspaceProtectionRules.svelte';
28
28
  import { buildForkEditUrl } from '../../utils/editInFork';
29
29
  import { isCloudHosted } from '../../cloud';
30
- let { summary = $bindable(), policy = $bindable(), diffDrawer = undefined, savedApp = $bindable(undefined), version = $bindable(undefined), newApp, newPath = '', appPath, runnables, data, files, jobs = $bindable(), jobsById = $bindable(), getBundle, canUndo = false, canRedo = false, onUndo = undefined, onRedo = undefined } = $props();
30
+ let { summary = $bindable(), policy = $bindable(), diffDrawer = undefined, savedApp = $bindable(undefined), version = $bindable(undefined), newApp, newPath = '', appPath, runnables, data, files, jobs = $bindable(), jobsById = $bindable(), getBundle, canUndo = false, canRedo = false, onUndo = undefined, onRedo = undefined, onOpenYamlEditor = undefined } = $props();
31
31
  let newEditedPath = $state('');
32
32
  let deployedValue = $state(undefined); // Value to diff against
33
33
  let deployedBy = $state(undefined); // Author
@@ -451,6 +451,11 @@ let moreItems = [
451
451
  appExport?.open(app);
452
452
  }
453
453
  },
454
+ {
455
+ displayName: 'Edit in YAML',
456
+ icon: FileJson,
457
+ action: () => onOpenYamlEditor?.()
458
+ },
454
459
  {
455
460
  displayName: 'Publish to Hub',
456
461
  icon: Globe,
@@ -33,6 +33,7 @@ interface Props {
33
33
  canRedo?: boolean;
34
34
  onUndo?: () => void;
35
35
  onRedo?: () => void;
36
+ onOpenYamlEditor?: () => void;
36
37
  }
37
38
  interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
38
39
  new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
@@ -0,0 +1,81 @@
1
+ <script lang="ts">import Drawer from '../common/drawer/Drawer.svelte';
2
+ import DrawerContent from '../common/drawer/DrawerContent.svelte';
3
+ import YAML from 'yaml';
4
+ import { Button } from '../common';
5
+ import { sendUserToast } from '../../toast';
6
+ import { Loader2 } from 'lucide-svelte';
7
+ let { drawer = $bindable(), summary, files, runnables, data, onApply } = $props();
8
+ let code = $state('');
9
+ let initialCode = $state('');
10
+ let editor = $state(undefined);
11
+ let hasChanges = $derived(code !== initialCode);
12
+ function reload() {
13
+ const snapshot = {
14
+ summary,
15
+ files: files ?? {},
16
+ runnables,
17
+ data
18
+ };
19
+ code = YAML.stringify(snapshot);
20
+ initialCode = code;
21
+ editor?.setCode(code);
22
+ }
23
+ function isPlainObject(value) {
24
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
25
+ }
26
+ function apply() {
27
+ try {
28
+ const parsed = YAML.parse(code);
29
+ if (!isPlainObject(parsed)) {
30
+ throw new Error('Top-level YAML must be a mapping');
31
+ }
32
+ const update = {};
33
+ if (typeof parsed.summary === 'string') {
34
+ update.summary = parsed.summary;
35
+ }
36
+ if (isPlainObject(parsed.files)) {
37
+ update.files = parsed.files;
38
+ }
39
+ if (isPlainObject(parsed.runnables)) {
40
+ update.runnables = parsed.runnables;
41
+ }
42
+ if (isPlainObject(parsed.data)) {
43
+ update.data = parsed.data;
44
+ }
45
+ onApply(update);
46
+ initialCode = code;
47
+ sendUserToast('Changes applied');
48
+ }
49
+ catch (e) {
50
+ sendUserToast('Error parsing yaml: ' + e, true);
51
+ }
52
+ }
53
+ let editorHeight = $state(0);
54
+ </script>
55
+
56
+ <Drawer on:open={reload} bind:this={drawer} size="800px">
57
+ <DrawerContent title="Raw app YAML" on:close={() => drawer?.toggleDrawer()}>
58
+ {#snippet actions()}
59
+ <Button variant="default" unifiedSize="md" disabled={!hasChanges} on:click={reload}
60
+ >Reset code</Button
61
+ >
62
+ <Button variant="accent" unifiedSize="md" disabled={!hasChanges} on:click={apply}
63
+ >Apply changes</Button
64
+ >
65
+ {/snippet}
66
+
67
+ {#await import('../SimpleEditor.svelte')}
68
+ <Loader2 class="animate-spin" />
69
+ {:then Module}
70
+ <div class="h-full w-full overflow-hidden" bind:clientHeight={editorHeight}>
71
+ <Module.default
72
+ bind:this={editor}
73
+ autoHeight
74
+ minHeight={editorHeight}
75
+ bind:code
76
+ lang="yaml"
77
+ />
78
+ </div>
79
+ {/await}
80
+ </DrawerContent>
81
+ </Drawer>
@@ -0,0 +1,20 @@
1
+ import Drawer from '../common/drawer/Drawer.svelte';
2
+ import type { Runnable } from './utils';
3
+ import type { RawAppData } from './dataTableRefUtils';
4
+ export type RawAppYamlUpdate = {
5
+ summary?: string;
6
+ files?: Record<string, string>;
7
+ runnables?: Record<string, Runnable>;
8
+ data?: RawAppData;
9
+ };
10
+ interface Props {
11
+ drawer?: Drawer | undefined;
12
+ summary: string;
13
+ files: Record<string, string> | undefined;
14
+ runnables: Record<string, Runnable>;
15
+ data: RawAppData;
16
+ onApply: (update: RawAppYamlUpdate) => void;
17
+ }
18
+ declare const RawAppYamlEditor: import("svelte").Component<Props, {}, "drawer">;
19
+ type RawAppYamlEditor = ReturnType<typeof RawAppYamlEditor>;
20
+ export default RawAppYamlEditor;
@@ -13,7 +13,7 @@ export function createDatatablesResource(getWorkspace) {
13
13
  if (!workspace)
14
14
  return [];
15
15
  try {
16
- return await WorkspaceService.listDataTables({ workspace });
16
+ return (await WorkspaceService.listDataTables({ workspace })).map((d) => d.name);
17
17
  }
18
18
  catch (e) {
19
19
  console.error('Failed to load datatables:', e);
@@ -178,7 +178,7 @@ export declare function buildRunsFilterSearchbarSchema({ paths, usernames, folde
178
178
  label: string;
179
179
  icon: typeof Zap;
180
180
  options: {
181
- label: "Google" | "Schedule" | "HTTP" | "WebSocket" | "Postgres" | "Kafka" | "NATS" | "MQTT" | "SQS" | "GCP Pub/Sub" | "Email" | "Webhook" | "Default Email";
181
+ label: "Google" | "GitHub" | "Schedule" | "HTTP" | "WebSocket" | "Postgres" | "Kafka" | "NATS" | "MQTT" | "SQS" | "GCP Pub/Sub" | "Email" | "Webhook" | "Default Email";
182
182
  value: JobTriggerKind;
183
183
  }[];
184
184
  allowNegative: true;
@@ -13,7 +13,7 @@ export interface ScriptBuilderProps {
13
13
  disableAi?: boolean;
14
14
  fullyLoaded?: boolean;
15
15
  initialPath?: string;
16
- template?: 'docker' | 'bunnative' | 'claudesandbox' | 'wac_python' | 'wac_typescript' | 'script';
16
+ template?: 'docker' | 'bunnative' | 'claudesandbox' | 'wac_python' | 'wac_typescript' | 'ci_test_bun' | 'ci_test_python' | 'script';
17
17
  initialArgs?: Record<string, any>;
18
18
  lockedLanguage?: boolean;
19
19
  showMeta?: boolean;