windmill-components 1.537.1 → 1.542.5

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 (275) hide show
  1. package/package/components/AIProviderPicker.svelte +181 -0
  2. package/package/components/AIProviderPicker.svelte.d.ts +15 -0
  3. package/package/components/ArgInfo.svelte +2 -2
  4. package/package/components/ArgInput.svelte +35 -9
  5. package/package/components/ArgInput.svelte.d.ts +3 -3
  6. package/package/components/AssignableTagsInner.svelte +89 -3
  7. package/package/components/ConcurrentJobsChart.svelte +36 -48
  8. package/package/components/ConcurrentJobsChart.svelte.d.ts +8 -20
  9. package/package/components/CustomPopover.svelte.d.ts +1 -1
  10. package/package/components/DropdownSelect.svelte +26 -0
  11. package/package/components/DropdownSelect.svelte.d.ts +11 -0
  12. package/package/components/DropdownV2Inner.svelte +1 -1
  13. package/package/components/{DynSelect.svelte → DynamicInput.svelte} +47 -15
  14. package/package/components/DynamicInput.svelte.d.ts +11 -0
  15. package/package/components/EditableSchemaForm.svelte +119 -95
  16. package/package/components/EditableSchemaForm.svelte.d.ts +4 -4
  17. package/package/components/Editor.svelte +86 -93
  18. package/package/components/Editor.svelte.d.ts +4 -3
  19. package/package/components/EditorBar.svelte +2 -5
  20. package/package/components/EditorSettings.svelte +11 -9
  21. package/package/components/FlowBuilder.svelte +3 -3
  22. package/package/components/FlowLogRow.svelte +64 -0
  23. package/package/components/FlowLogRow.svelte.d.ts +15 -0
  24. package/package/components/FlowLogViewer.svelte +406 -373
  25. package/package/components/FlowLogViewer.svelte.d.ts +5 -1
  26. package/package/components/FlowLogViewerWrapper.svelte +44 -1
  27. package/package/components/FlowLoopIterationPreview.svelte.d.ts +1 -1
  28. package/package/components/FlowPreviewContent.svelte.d.ts +1 -1
  29. package/package/components/FlowStatusViewerInner.svelte +34 -3
  30. package/package/components/FolderPicker.svelte +1 -1
  31. package/package/components/InputTransformForm.svelte +20 -10
  32. package/package/components/JobArgs.svelte +1 -1
  33. package/package/components/JobLoader.svelte.d.ts +1 -1
  34. package/package/components/JobStatus.svelte +2 -0
  35. package/package/components/LogSnippetViewer.svelte +3 -3
  36. package/package/components/LogSnippetViewer.svelte.d.ts +1 -1
  37. package/package/components/LogViewer.svelte +87 -71
  38. package/package/components/LogViewer.svelte.d.ts +1 -0
  39. package/package/components/Path.svelte +7 -1
  40. package/package/components/Path.svelte.d.ts +1 -1
  41. package/package/components/PrefixedInput.svelte +120 -0
  42. package/package/components/PrefixedInput.svelte.d.ts +8 -0
  43. package/package/components/QueuePosition.svelte +81 -0
  44. package/package/components/QueuePosition.svelte.d.ts +8 -0
  45. package/package/components/ResourceNarrowing.svelte +13 -0
  46. package/package/components/ResourceNarrowing.svelte.d.ts +6 -0
  47. package/package/components/ResourceTypePicker.svelte +49 -74
  48. package/package/components/RunChart.svelte +74 -89
  49. package/package/components/RunChart.svelte.d.ts +10 -22
  50. package/package/components/S3FilePicker.svelte +1 -1
  51. package/package/components/SchemaForm.svelte.d.ts +2 -2
  52. package/package/components/ScriptBuilder.svelte +2 -1
  53. package/package/components/ScriptEditor.svelte +4 -3
  54. package/package/components/ScriptEditor.svelte.d.ts +2 -1
  55. package/package/components/ServiceLogsInner.svelte +1 -1
  56. package/package/components/ShareModal.svelte.d.ts +1 -1
  57. package/package/components/SimpleEditor.svelte +4 -67
  58. package/package/components/StringTypeNarrowing.svelte +5 -10
  59. package/package/components/TemplateEditor.svelte +2 -16
  60. package/package/components/TimeAgo.svelte +1 -1
  61. package/package/components/TimeAgo.svelte.d.ts +1 -0
  62. package/package/components/Toggle.svelte +2 -1
  63. package/package/components/Toggle.svelte.d.ts +2 -1
  64. package/package/components/WorkerRepl.svelte +1 -1
  65. package/package/components/apps/components/display/AppNavbarItem.svelte +2 -1
  66. package/package/components/apps/components/display/table/AppAggridTable.svelte +44 -48
  67. package/package/components/apps/components/display/table/SyncColumnDefs.svelte +101 -19
  68. package/package/components/apps/components/display/table/SyncColumnDefs.svelte.d.ts +5 -2
  69. package/package/components/apps/components/display/table/utils.js +36 -5
  70. package/package/components/apps/components/inputs/currency/CurrencyInput.svelte +10 -5
  71. package/package/components/apps/editor/AppEditor.svelte +4 -3
  72. package/package/components/apps/editor/AppEditorHeader.svelte +0 -1
  73. package/package/components/apps/editor/GridViewer.svelte.d.ts +11 -4
  74. package/package/components/apps/editor/SettingsPanel.svelte +2 -2
  75. package/package/components/apps/editor/componentsPanel/ListItem.svelte +2 -2
  76. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte.d.ts +1 -1
  77. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditorDrawer.svelte.d.ts +1 -1
  78. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte.d.ts +1 -1
  79. package/package/components/apps/editor/settingsPanel/ArrayStaticInputEditor.svelte +26 -3
  80. package/package/components/apps/editor/settingsPanel/InputsSpecEditor.svelte +1 -1
  81. package/package/components/apps/editor/settingsPanel/inputEditor/StaticInputEditor.svelte +13 -5
  82. package/package/components/apps/svelte-grid/Grid.svelte.d.ts +30 -11
  83. package/package/components/assets/JobAssetsViewer.svelte +28 -24
  84. package/package/components/auditLogs/AuditLogsTable.svelte +2 -6
  85. package/package/components/chartjs-wrappers/Chart.svelte.d.ts +14 -7
  86. package/package/components/common/OnChange.svelte.d.ts +11 -4
  87. package/package/components/common/badge/Badge.svelte +9 -2
  88. package/package/components/common/badge/Badge.svelte.d.ts +2 -1
  89. package/package/components/common/calendarPicker/CalendarPicker.svelte +5 -1
  90. package/package/components/common/calendarPicker/CalendarPicker.svelte.d.ts +5 -4
  91. package/package/components/common/drawer/Disposable.svelte +9 -11
  92. package/package/components/common/drawer/Drawer.svelte +3 -4
  93. package/package/components/common/drawer/Drawer.svelte.d.ts +1 -0
  94. package/package/components/common/menu/MenuItem.svelte.d.ts +2 -2
  95. package/package/components/common/modal/Modal.svelte.d.ts +1 -1
  96. package/package/components/common/tabs/TabContent.svelte +2 -7
  97. package/package/components/common/tabs/TabContent.svelte.d.ts +5 -27
  98. package/package/components/common/toggleButton-v2/ToggleButtonGroup.svelte +9 -3
  99. package/package/components/common/toggleButton-v2/ToggleButtonGroup.svelte.d.ts +1 -0
  100. package/package/components/common/toggleButton-v2/ToggleButtonMore.svelte +8 -4
  101. package/package/components/common/toggleButton-v2/ToggleButtonMore.svelte.d.ts +1 -0
  102. package/package/components/copilot/MetadataGen.svelte +1 -1
  103. package/package/components/copilot/chat/AIChatManager.svelte.js +24 -102
  104. package/package/components/copilot/chat/AssistantMessage.svelte +0 -4
  105. package/package/components/copilot/chat/anthropic.d.ts +15 -0
  106. package/package/components/copilot/chat/anthropic.js +208 -0
  107. package/package/components/copilot/chat/api/apiTools.d.ts +2 -2
  108. package/package/components/copilot/chat/api/apiTools.js +10 -7
  109. package/package/components/copilot/chat/api/core.d.ts +1 -1
  110. package/package/components/copilot/chat/api/core.js +7 -2
  111. package/package/components/copilot/chat/ask/core.d.ts +1 -1
  112. package/package/components/copilot/chat/ask/core.js +7 -2
  113. package/package/components/copilot/chat/flow/core.d.ts +1 -1
  114. package/package/components/copilot/chat/flow/core.js +14 -4
  115. package/package/components/copilot/chat/monaco-adapter.d.ts +6 -5
  116. package/package/components/copilot/chat/navigator/core.d.ts +1 -1
  117. package/package/components/copilot/chat/navigator/core.js +7 -2
  118. package/package/components/copilot/chat/script/CodeDisplay.svelte +10 -111
  119. package/package/components/copilot/chat/script/core.d.ts +5 -4
  120. package/package/components/copilot/chat/script/core.js +131 -19
  121. package/package/components/copilot/chat/shared.d.ts +7 -7
  122. package/package/components/copilot/lib.d.ts +29 -8
  123. package/package/components/copilot/lib.js +199 -24
  124. package/package/components/custom_ui.d.ts +1 -0
  125. package/package/components/flows/content/FlowInput.svelte +5 -5
  126. package/package/components/flows/content/FlowModuleComponent.svelte +5 -2
  127. package/package/components/flows/content/FlowModuleEarlyStop.svelte +47 -17
  128. package/package/components/flows/content/FlowModuleSleep.svelte +4 -1
  129. package/package/components/flows/content/FlowModuleSuspend.svelte +0 -1
  130. package/package/components/flows/content/FlowModuleTimeout.svelte +50 -10
  131. package/package/components/flows/content/FlowModuleTimeout.svelte.d.ts +1 -0
  132. package/package/components/flows/content/FlowRetries.svelte +108 -3
  133. package/package/components/flows/content/FlowRetries.svelte.d.ts +3 -2
  134. package/package/components/flows/flowInfers.js +8 -35
  135. package/package/components/flows/flowStore.d.ts +45 -1
  136. package/package/components/flows/flowStore.js +1 -1
  137. package/package/components/flows/map/FlowJobsMenu.svelte +3 -3
  138. package/package/components/flows/map/FlowModuleSchemaItem.svelte +61 -54
  139. package/package/components/flows/map/FlowModuleSchemaItem.svelte.d.ts +1 -1
  140. package/package/components/flows/map/FlowModuleSchemaItemViewer.svelte +1 -1
  141. package/package/components/flows/map/InsertModuleButton.svelte +1 -0
  142. package/package/components/flows/map/InsertModuleInner.svelte +12 -15
  143. package/package/components/flows/map/InsertModuleInner.svelte.d.ts +10 -9
  144. package/package/components/flows/propPicker/OutputPickerInner.svelte.d.ts +1 -1
  145. package/package/components/git_sync/DetectionFlow.svelte +15 -17
  146. package/package/components/git_sync/GitSyncContext.svelte.js +1 -1
  147. package/package/components/git_sync/GitSyncRepositoryCard.svelte +0 -1
  148. package/package/components/graph/graphBuilder.svelte.d.ts +5 -1
  149. package/package/components/graph/renderers/edges/BaseEdge.svelte +9 -1
  150. package/package/components/graph/renderers/edges/BaseEdge.svelte.d.ts +4 -1
  151. package/package/components/graph/renderers/nodes/BranchAllStart.svelte +2 -3
  152. package/package/components/graph/renderers/nodes/BranchOneStart.svelte +2 -3
  153. package/package/components/graph/renderers/triggers/TriggerButton.svelte.d.ts +1 -1
  154. package/package/components/graph/renderers/triggers/TriggersBadge.svelte +3 -1
  155. package/package/components/graph/renderers/triggers/TriggersWrapper.svelte +34 -24
  156. package/package/components/graph/renderers/triggers/TriggersWrapper.svelte.d.ts +1 -2
  157. package/package/components/home/ItemsList.svelte +17 -13
  158. package/package/components/home/TreeView.svelte +21 -27
  159. package/package/components/home/TreeView.svelte.d.ts +2 -29
  160. package/package/components/home/TreeViewRoot.svelte +11 -23
  161. package/package/components/home/TreeViewRoot.svelte.d.ts +15 -13
  162. package/package/components/icons/GitIcon.svelte +10 -2
  163. package/package/components/icons/GitIcon.svelte.d.ts +1 -0
  164. package/package/components/meltComponents/MeltButton.svelte.d.ts +1 -1
  165. package/package/components/meltComponents/Popover.svelte +23 -3
  166. package/package/components/meltComponents/Popover.svelte.d.ts +2 -1
  167. package/package/components/monacoLanguagesOptions.d.ts +3 -0
  168. package/package/components/monacoLanguagesOptions.js +109 -0
  169. package/package/components/propertyPicker/ObjectViewer.svelte +7 -2
  170. package/package/components/propertyPicker/PropPicker.svelte +1 -1
  171. package/package/components/propertyPicker/utils.js +14 -7
  172. package/package/components/runs/JobRunsPreview.svelte +212 -177
  173. package/package/components/runs/JobsLoader.svelte +2 -2
  174. package/package/components/runs/JobsLoader.svelte.d.ts +1 -1
  175. package/package/components/runs/NoWorkerWithTagWarning.svelte +18 -5
  176. package/package/components/runs/RunBadges.svelte +100 -0
  177. package/package/components/runs/RunBadges.svelte.d.ts +12 -0
  178. package/package/components/runs/RunLabels.svelte +86 -0
  179. package/package/components/runs/RunLabels.svelte.d.ts +10 -0
  180. package/package/components/runs/RunOption.svelte +20 -0
  181. package/package/components/runs/RunOption.svelte.d.ts +10 -0
  182. package/package/components/runs/RunRow.svelte +239 -151
  183. package/package/components/runs/RunRow.svelte.d.ts +12 -9
  184. package/package/components/runs/RunsBatchActionsDropdown.svelte +13 -17
  185. package/package/components/runs/RunsBatchActionsDropdown.svelte.d.ts +5 -18
  186. package/package/components/runs/RunsFilter.svelte +369 -243
  187. package/package/components/runs/RunsFilter.svelte.d.ts +2 -0
  188. package/package/components/runs/RunsQueue.svelte +96 -25
  189. package/package/components/runs/RunsQueue.svelte.d.ts +7 -21
  190. package/package/components/runs/RunsTable.svelte +62 -71
  191. package/package/components/runs/RunsTable.svelte.d.ts +2 -1
  192. package/package/components/runs/runs-grid.css +95 -0
  193. package/package/components/schema/EditableSchemaDrawer.svelte +12 -12
  194. package/package/components/schema/FlowPropertyEditor.svelte +197 -206
  195. package/package/components/schema/PropertyEditor.svelte +33 -35
  196. package/package/components/schema/SchemaFormDND.svelte.d.ts +2 -2
  197. package/package/components/search/GlobalSearchModal.svelte +8 -1
  198. package/package/components/select/DraggableTags.svelte.d.ts +17 -7
  199. package/package/components/select/MultiSelect.svelte.d.ts +21 -11
  200. package/package/components/select/Select.svelte +2 -1
  201. package/package/components/select/Select.svelte.d.ts +25 -13
  202. package/package/components/select/SelectDropdown.svelte.d.ts +14 -7
  203. package/package/components/settings/TokenDisplay.svelte +1 -1
  204. package/package/components/sidebar/OperatorMenu.svelte +5 -0
  205. package/package/components/sidebar/SidebarContent.svelte +48 -2
  206. package/package/components/sidebar/WorkspaceMenu.svelte +116 -17
  207. package/package/components/toast.js +6 -3
  208. package/package/components/triggers/AddTriggersButton.svelte +7 -6
  209. package/package/components/triggers/CaptureWrapper.svelte +19 -3
  210. package/package/components/triggers/TriggerLabel.svelte +8 -0
  211. package/package/components/triggers/TriggerTokens.svelte +1 -1
  212. package/package/components/triggers/TriggersEditor.svelte +9 -5
  213. package/package/components/triggers/TriggersTable.svelte +2 -2
  214. package/package/components/triggers/TriggersWrapper.svelte +16 -5
  215. package/package/components/triggers/TriggersWrapper.svelte.d.ts +3 -19
  216. package/package/components/{details/EmailTriggerCaptures.svelte → triggers/email/DefaultEmailCapture.svelte} +5 -5
  217. package/package/components/{details/EmailTriggerCaptures.svelte.d.ts → triggers/email/DefaultEmailCapture.svelte.d.ts} +4 -4
  218. package/package/components/{details/EmailTriggerConfigSection.svelte → triggers/email/DefaultEmailConfigSection.svelte} +24 -14
  219. package/package/components/triggers/email/DefaultEmailConfigSection.svelte.d.ts +13 -0
  220. package/package/components/triggers/email/DefaultEmailPanel.svelte +71 -0
  221. package/package/components/triggers/email/DefaultEmailPanel.svelte.d.ts +11 -0
  222. package/package/components/triggers/email/EmailCapture.svelte +39 -0
  223. package/package/components/triggers/email/EmailCapture.svelte.d.ts +43 -0
  224. package/package/components/triggers/email/EmailTriggerEditor.svelte +20 -0
  225. package/package/components/triggers/email/EmailTriggerEditor.svelte.d.ts +11 -0
  226. package/package/components/triggers/email/EmailTriggerEditorConfigSection.svelte +133 -0
  227. package/package/components/triggers/email/EmailTriggerEditorConfigSection.svelte.d.ts +14 -0
  228. package/package/components/triggers/email/EmailTriggerEditorInner.svelte +335 -0
  229. package/package/components/triggers/email/EmailTriggerEditorInner.svelte.d.ts +22 -0
  230. package/package/components/triggers/email/EmailTriggerPanel.svelte +61 -0
  231. package/package/components/triggers/email/EmailTriggerPanel.svelte.d.ts +14 -0
  232. package/package/components/triggers/email/utils.d.ts +4 -0
  233. package/package/components/triggers/email/utils.js +52 -0
  234. package/package/components/triggers/http/RouteEditorConfigSection.svelte +1 -1
  235. package/package/components/triggers/http/utils.js +1 -1
  236. package/package/components/triggers/triggers.svelte.d.ts +1 -0
  237. package/package/components/triggers/triggers.svelte.js +24 -2
  238. package/package/components/triggers/utils.js +19 -5
  239. package/package/components/triggers.d.ts +1 -1
  240. package/package/components/triggers.js +2 -0
  241. package/package/components/wizards/AgGridWizard.svelte +85 -80
  242. package/package/components/workspaceSettings/AISettings.svelte +74 -22
  243. package/package/components/workspaceSettings/AISettings.svelte.d.ts +2 -1
  244. package/package/components/workspaceSettings/CreateWorkspace.svelte +395 -0
  245. package/package/components/workspaceSettings/CreateWorkspace.svelte.d.ts +6 -0
  246. package/package/components/workspaceSettings/DucklakeSettings.svelte +3 -1
  247. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte +1 -1
  248. package/package/components/workspaceSettings/StorageSettings.svelte +69 -48
  249. package/package/gen/core/OpenAPI.js +1 -1
  250. package/package/gen/schemas.gen.d.ts +142 -3
  251. package/package/gen/schemas.gen.js +144 -3
  252. package/package/gen/services.gen.d.ts +129 -1
  253. package/package/gen/services.gen.js +267 -1
  254. package/package/gen/types.gen.d.ts +434 -8
  255. package/package/hubPaths.json +4 -2
  256. package/package/infer.js +1 -1
  257. package/package/keyboardChain.d.ts +5 -0
  258. package/package/keyboardChain.js +40 -0
  259. package/package/services/JobManager.js +2 -2
  260. package/package/stores.d.ts +3 -1
  261. package/package/stores.js +8 -5
  262. package/package/utils/workspaceHierarchy.d.ts +27 -0
  263. package/package/utils/workspaceHierarchy.js +101 -0
  264. package/package/utils.d.ts +6 -3
  265. package/package/utils.js +30 -15
  266. package/package/workspace_settings.js +2 -3
  267. package/package.json +9 -11
  268. package/package/components/DynSelect.svelte.d.ts +0 -11
  269. package/package/components/ObjectTypeNarrowing.svelte +0 -18
  270. package/package/components/ObjectTypeNarrowing.svelte.d.ts +0 -22
  271. package/package/components/details/DetailPageTriggerPanel.svelte +0 -121
  272. package/package/components/details/DetailPageTriggerPanel.svelte.d.ts +0 -20
  273. package/package/components/details/EmailTriggerConfigSection.svelte.d.ts +0 -12
  274. package/package/components/details/EmailTriggerPanel.svelte +0 -76
  275. package/package/components/details/EmailTriggerPanel.svelte.d.ts +0 -26
@@ -0,0 +1,335 @@
1
+ <script lang="ts">import { Button } from '../../common';
2
+ import Drawer from '../../common/drawer/Drawer.svelte';
3
+ import DrawerContent from '../../common/drawer/DrawerContent.svelte';
4
+ import Path from '../../Path.svelte';
5
+ import Required from '../../Required.svelte';
6
+ import ScriptPicker from '../../ScriptPicker.svelte';
7
+ import { EmailTriggerService } from '../../../gen';
8
+ import { usedTriggerKinds, userStore, workspaceStore } from '../../../stores';
9
+ import { canWrite, emptyString, sendUserToast } from '../../../utils';
10
+ import Section from '../../Section.svelte';
11
+ import { Loader2 } from 'lucide-svelte';
12
+ import Label from '../../Label.svelte';
13
+ import EmailTriggerEditorConfigSection from './EmailTriggerEditorConfigSection.svelte';
14
+ import TriggerEditorToolbar from '../TriggerEditorToolbar.svelte';
15
+ import { getHandlerType, handleConfigChange } from '../utils';
16
+ import { untrack } from 'svelte';
17
+ import Tabs from '../../common/tabs/Tabs.svelte';
18
+ import Tab from '../../common/tabs/Tab.svelte';
19
+ import TriggerRetriesAndErrorHandler from '../TriggerRetriesAndErrorHandler.svelte';
20
+ import { saveEmailTriggerFromCfg } from './utils';
21
+ let { useDrawer = true, hideTarget = false, description = undefined, isEditor = false, customLabel = undefined, allowDraft = false, isDeployed = false, onConfigChange = undefined, onCaptureConfigChange = undefined, onUpdate = undefined, onDelete = undefined, onReset = undefined, trigger = undefined, customSaveBehavior = undefined } = $props();
22
+ // Form data state
23
+ let initialPath = $state('');
24
+ let edit = $state(true);
25
+ let itemKind = $state('script');
26
+ let is_flow = $state(false);
27
+ let script_path = $state('');
28
+ let initialScriptPath = $state('');
29
+ let fixedScriptPath = $state('');
30
+ let path = $state('');
31
+ let pathError = $state('');
32
+ let isValid = $state(false);
33
+ let dirtyLocalPart = $state(false);
34
+ let dirtyPath = $state(false);
35
+ let local_part = $state('');
36
+ let workspaced_local_part = $state(false);
37
+ let drawerLoading = $state(true);
38
+ let showLoader = $state(false);
39
+ let can_write = $state(true);
40
+ let extraPerms = $state(undefined);
41
+ let error_handler_path = $state();
42
+ let error_handler_args = $state({});
43
+ let retry = $state();
44
+ // Component references
45
+ let drawer = $state(undefined);
46
+ let initialConfig = undefined;
47
+ let deploymentLoading = $state(false);
48
+ let optionTabSelected = $state('error_handler');
49
+ let errorHandlerSelected = $state('slack');
50
+ const isAdmin = $derived($userStore?.is_admin || $userStore?.is_super_admin);
51
+ const routeConfig = $derived.by(getEmailTriggerConfig);
52
+ const captureConfig = $derived.by(isEditor ? getCaptureConfig : () => ({}));
53
+ const saveDisabled = $derived(drawerLoading || !can_write || pathError != '' || !isValid || emptyString(script_path));
54
+ $effect(() => {
55
+ is_flow = itemKind === 'flow';
56
+ });
57
+ export async function openEdit(ePath, isFlow, defaultConfig) {
58
+ drawerLoading = true;
59
+ let loader = setTimeout(() => {
60
+ showLoader = true;
61
+ }, 100); // if loading takes less than 100ms, we don't show the loader
62
+ try {
63
+ drawer?.openDrawer();
64
+ initialPath = ePath;
65
+ path = ePath;
66
+ itemKind = isFlow ? 'flow' : 'script';
67
+ edit = true;
68
+ dirtyPath = false;
69
+ dirtyLocalPart = false;
70
+ await loadTrigger(defaultConfig);
71
+ }
72
+ catch (err) {
73
+ sendUserToast(`Could not load email trigger: ${err}`, true);
74
+ }
75
+ finally {
76
+ if (!defaultConfig) {
77
+ // If the email trigger is loaded from the backend, we to set the initial config
78
+ initialConfig = structuredClone($state.snapshot(getEmailTriggerConfig()));
79
+ }
80
+ clearTimeout(loader);
81
+ drawerLoading = false;
82
+ showLoader = false;
83
+ }
84
+ }
85
+ export async function openNew(nis_flow, fixedScriptPath_, defaultValues) {
86
+ drawerLoading = true;
87
+ let loader = setTimeout(() => {
88
+ showLoader = true;
89
+ }, 100); // if loading takes less than 100ms, we don't show the loader
90
+ try {
91
+ drawer?.openDrawer();
92
+ is_flow = defaultValues?.is_flow ?? nis_flow;
93
+ edit = false;
94
+ itemKind = nis_flow ? 'flow' : 'script';
95
+ local_part = defaultValues?.local_part ?? '';
96
+ dirtyLocalPart = false;
97
+ initialScriptPath = '';
98
+ fixedScriptPath = fixedScriptPath_ ?? '';
99
+ script_path = fixedScriptPath;
100
+ path = defaultValues?.path ?? '';
101
+ initialPath = '';
102
+ dirtyPath = false;
103
+ workspaced_local_part = defaultValues?.workspaced_local_part ?? false;
104
+ error_handler_path = defaultValues?.error_handler_path ?? undefined;
105
+ error_handler_args = defaultValues?.error_handler_args ?? {};
106
+ retry = defaultValues?.retry ?? undefined;
107
+ errorHandlerSelected = getHandlerType(error_handler_path ?? '');
108
+ }
109
+ finally {
110
+ clearTimeout(loader);
111
+ drawerLoading = false;
112
+ showLoader = false;
113
+ }
114
+ }
115
+ function loadTriggerConfig(cfg) {
116
+ script_path = cfg?.script_path ?? '';
117
+ initialScriptPath = cfg?.script_path ?? '';
118
+ is_flow = cfg?.is_flow ?? false;
119
+ path = cfg?.path ?? '';
120
+ local_part = cfg?.local_part ?? '';
121
+ workspaced_local_part = cfg?.workspaced_local_part ?? false;
122
+ extraPerms = cfg?.extra_perms ?? undefined;
123
+ can_write = canWrite(path, cfg?.extra_perms ?? {}, $userStore);
124
+ error_handler_path = cfg?.error_handler_path;
125
+ error_handler_args = cfg?.error_handler_args ?? {};
126
+ retry = cfg?.retry;
127
+ errorHandlerSelected = getHandlerType(error_handler_path ?? '');
128
+ }
129
+ async function loadTrigger(defaultConfig) {
130
+ if (defaultConfig) {
131
+ loadTriggerConfig(defaultConfig);
132
+ return;
133
+ }
134
+ else {
135
+ const s = await EmailTriggerService.getEmailTrigger({
136
+ workspace: $workspaceStore,
137
+ path: initialPath
138
+ });
139
+ loadTriggerConfig(s);
140
+ }
141
+ }
142
+ async function triggerScript() {
143
+ if (customSaveBehavior) {
144
+ customSaveBehavior(routeConfig);
145
+ drawer?.closeDrawer();
146
+ }
147
+ else {
148
+ deploymentLoading = true;
149
+ const saveCfg = routeConfig;
150
+ const isSaved = await saveEmailTriggerFromCfg(initialPath, saveCfg, edit, $workspaceStore, !!$userStore?.is_admin || !!$userStore?.is_super_admin, usedTriggerKinds);
151
+ if (isSaved) {
152
+ onUpdate(saveCfg.path);
153
+ drawer?.closeDrawer();
154
+ }
155
+ deploymentLoading = false;
156
+ }
157
+ }
158
+ function getEmailTriggerConfig() {
159
+ const nCfg = {
160
+ script_path,
161
+ is_flow,
162
+ path,
163
+ local_part,
164
+ workspaced_local_part,
165
+ extra_perms: extraPerms,
166
+ error_handler_path,
167
+ error_handler_args,
168
+ retry
169
+ };
170
+ return nCfg;
171
+ }
172
+ // Update config for captures
173
+ function getCaptureConfig() {
174
+ const newCaptureConfig = {
175
+ local_part: routeConfig.local_part,
176
+ path: routeConfig.path
177
+ };
178
+ //
179
+ return newCaptureConfig;
180
+ }
181
+ $effect(() => {
182
+ const args = [captureConfig, isValid];
183
+ untrack(() => onCaptureConfigChange?.(...args));
184
+ });
185
+ $effect(() => {
186
+ if (!drawerLoading) {
187
+ handleConfigChange(routeConfig, initialConfig, saveDisabled, edit, onConfigChange);
188
+ }
189
+ });
190
+ </script>
191
+
192
+ {#snippet config()}
193
+ {#if drawerLoading}
194
+ {#if showLoader}
195
+ <Loader2 class="animate-spin" />
196
+ {/if}
197
+ {:else}
198
+ <div class="flex flex-col gap-12">
199
+ <Section label="Metadata">
200
+ <div class="flex flex-col gap-2">
201
+ <Label label="Path">
202
+ <Path
203
+ bind:dirty={dirtyPath}
204
+ bind:error={pathError}
205
+ bind:path
206
+ {initialPath}
207
+ checkInitialPathExistence={!edit}
208
+ namePlaceholder="email_trigger"
209
+ kind="email_trigger"
210
+ hideUser
211
+ disableEditing={!can_write}
212
+ />
213
+ </Label>
214
+ </div>
215
+ </Section>
216
+
217
+ {#if !hideTarget}
218
+ <Section label="Target">
219
+ <p class="text-xs mt-3 mb-1 text-tertiary">
220
+ Pick a script or flow to be triggered<Required required={true} />
221
+ </p>
222
+ <div class="flex flex-col gap-2">
223
+ <div class="flex flex-row mb-2">
224
+ <ScriptPicker
225
+ disabled={fixedScriptPath != '' || !can_write}
226
+ initialPath={fixedScriptPath || initialScriptPath}
227
+ kinds={['script']}
228
+ allowFlow={true}
229
+ bind:itemKind
230
+ bind:scriptPath={script_path}
231
+ allowRefresh={can_write}
232
+ allowEdit={!$userStore?.operator}
233
+ clearable
234
+ />
235
+
236
+ {#if emptyString(script_path)}
237
+ <Button
238
+ btnClasses="ml-4 mt-2"
239
+ color="dark"
240
+ size="xs"
241
+ href={itemKind === 'flow' ? '/flows/add?hub=72' : '/scripts/add?hub=hub%2F19813'}
242
+ target="_blank">Create from template</Button
243
+ >
244
+ {/if}
245
+ </div>
246
+ </div>
247
+ </Section>
248
+ {/if}
249
+
250
+ <EmailTriggerEditorConfigSection
251
+ initialTriggerPath={initialPath}
252
+ bind:local_part
253
+ bind:isValid
254
+ bind:workspaced_local_part
255
+ bind:dirtyLocalPart
256
+ {can_write}
257
+ showTestingBadge={isEditor}
258
+ isDraftOnly={trigger ? trigger.isDraft : false}
259
+ />
260
+
261
+ <Section label="Advanced" collapsable>
262
+ <div class="flex flex-col gap-4">
263
+ <div class="min-h-96">
264
+ <Tabs bind:selected={optionTabSelected}>
265
+ <Tab value="error_handler">Error Handler</Tab>
266
+ <Tab value="retries">Retries</Tab>
267
+ </Tabs>
268
+ <div class="mt-4">
269
+ <TriggerRetriesAndErrorHandler
270
+ {optionTabSelected}
271
+ {itemKind}
272
+ {can_write}
273
+ bind:errorHandlerSelected
274
+ bind:error_handler_path
275
+ bind:error_handler_args
276
+ bind:retry
277
+ />
278
+ </div>
279
+ </div>
280
+ </div>
281
+ </Section>
282
+ </div>
283
+ {/if}
284
+ {/snippet}
285
+
286
+ {#snippet saveButton()}
287
+ {#if !drawerLoading}
288
+ <TriggerEditorToolbar
289
+ {trigger}
290
+ permissions={drawerLoading || !can_write ? 'none' : can_write && isAdmin ? 'create' : 'write'}
291
+ {saveDisabled}
292
+ enabled={undefined}
293
+ {allowDraft}
294
+ {edit}
295
+ isLoading={deploymentLoading}
296
+ onUpdate={triggerScript}
297
+ {onReset}
298
+ {onDelete}
299
+ {isDeployed}
300
+ />
301
+ {/if}
302
+ {/snippet}
303
+
304
+ {#if useDrawer}
305
+ <Drawer size="700px" bind:this={drawer}>
306
+ <DrawerContent
307
+ title={edit
308
+ ? can_write
309
+ ? `Edit email trigger ${initialPath}`
310
+ : `Email trigger ${initialPath}`
311
+ : 'New email trigger'}
312
+ on:close={() => drawer?.closeDrawer()}
313
+ >
314
+ {#snippet actions()}
315
+ {@render saveButton()}
316
+ {/snippet}
317
+ {@render config()}
318
+ </DrawerContent>
319
+ </Drawer>
320
+ {:else}
321
+ <Section label={!customLabel ? 'Email trigger' : ''} headerClass="grow min-w-0 h-[30px]">
322
+ {#snippet header()}
323
+ {#if customLabel}
324
+ {@render customLabel()}
325
+ {/if}
326
+ {/snippet}
327
+ {#snippet action()}
328
+ {@render saveButton()}
329
+ {/snippet}
330
+ {#if description}
331
+ {@render description()}
332
+ {/if}
333
+ {@render config()}
334
+ </Section>
335
+ {/if}
@@ -0,0 +1,22 @@
1
+ import { type EmailTrigger, type NewEmailTrigger } from '../../../gen';
2
+ declare const EmailTriggerEditorInner: import("svelte").Component<{
3
+ useDrawer?: boolean;
4
+ hideTarget?: boolean;
5
+ description?: any;
6
+ isEditor?: boolean;
7
+ customLabel?: any;
8
+ allowDraft?: boolean;
9
+ isDeployed?: boolean;
10
+ onConfigChange?: any;
11
+ onCaptureConfigChange?: any;
12
+ onUpdate?: any;
13
+ onDelete?: any;
14
+ onReset?: any;
15
+ trigger?: any;
16
+ customSaveBehavior?: any;
17
+ }, {
18
+ openEdit: (ePath: string, isFlow: boolean, defaultConfig?: Partial<NewEmailTrigger>) => Promise<void>;
19
+ openNew: (nis_flow: boolean, fixedScriptPath_?: string, defaultValues?: Partial<EmailTrigger>) => Promise<void>;
20
+ }, "">;
21
+ type EmailTriggerEditorInner = ReturnType<typeof EmailTriggerEditorInner>;
22
+ export default EmailTriggerEditorInner;
@@ -0,0 +1,61 @@
1
+ <script lang="ts">import EmailTriggerEditorInner from './EmailTriggerEditorInner.svelte';
2
+ import Description from '../../Description.svelte';
3
+ import { enterpriseLicense, userStore } from '../../../stores';
4
+ import { Alert } from '../../common';
5
+ import { onMount } from 'svelte';
6
+ import { getEmailDomain } from './utils';
7
+ let emailTriggerEditor = $state(null);
8
+ let { selectedTrigger, isFlow, path, defaultValues = undefined, isEditor = false, customLabel, onEmailDomain, ...restProps } = $props();
9
+ async function openEmailTriggerEditor(isFlow, isDraft) {
10
+ if (isDraft) {
11
+ emailTriggerEditor?.openNew(isFlow, path, defaultValues);
12
+ }
13
+ else {
14
+ emailTriggerEditor?.openEdit(selectedTrigger.path ?? '', isFlow, defaultValues);
15
+ }
16
+ }
17
+ onMount(() => {
18
+ if (emailTriggerEditor) {
19
+ openEmailTriggerEditor(isFlow, selectedTrigger.isDraft ?? false);
20
+ }
21
+ });
22
+ let emailDomain = $state(null);
23
+ getEmailDomain().then((domain) => {
24
+ emailDomain = domain;
25
+ });
26
+ $effect(() => {
27
+ if (emailDomain) {
28
+ onEmailDomain(emailDomain);
29
+ }
30
+ });
31
+ </script>
32
+
33
+ <EmailTriggerEditorInner
34
+ useDrawer={false}
35
+ bind:this={emailTriggerEditor}
36
+ hideTarget
37
+ {isEditor}
38
+ {customLabel}
39
+ trigger={selectedTrigger}
40
+ allowDraft
41
+ {...restProps}
42
+ >
43
+ {#snippet description()}
44
+ <div class="flex flex-col gap-2 pb-4">
45
+ <Description link="https://www.windmill.dev/docs/advanced/email_triggers">
46
+ Email triggers execute scripts and flows when emails are sent to specific addresses. Each
47
+ trigger can be configured with a specific local part.
48
+ </Description>
49
+
50
+ {#if !$userStore?.is_admin && !$userStore?.is_super_admin && selectedTrigger.isDraft}
51
+ <Alert title="Only workspace admins can create email triggers" type="info" size="xs" />
52
+ {/if}
53
+
54
+ {#if !$enterpriseLicense}
55
+ <Alert title="Community Edition limitations" type="warning" size="xs">
56
+ Email triggers on Windmill Community Edition are limited to 100 emails per day.
57
+ </Alert>
58
+ {/if}
59
+ </div>
60
+ {/snippet}
61
+ </EmailTriggerEditorInner>
@@ -0,0 +1,14 @@
1
+ import { type Snippet } from 'svelte';
2
+ import type { Trigger } from '../utils';
3
+ interface Props {
4
+ selectedTrigger: Trigger;
5
+ isFlow: boolean;
6
+ path: string;
7
+ defaultValues?: Record<string, any>;
8
+ isEditor?: boolean;
9
+ customLabel: Snippet;
10
+ onEmailDomain: (domain: string) => void;
11
+ }
12
+ declare const EmailTriggerPanel: import("svelte").Component<Props, {}, "">;
13
+ type EmailTriggerPanel = ReturnType<typeof EmailTriggerPanel>;
14
+ export default EmailTriggerPanel;
@@ -0,0 +1,4 @@
1
+ import type { Writable } from 'svelte/store';
2
+ export declare function getEmailAddress(local_part: string | undefined, workspaced_local_part: boolean, workspace_id: string, emailDomain: string): string;
3
+ export declare function saveEmailTriggerFromCfg(initialPath: string, routeCfg: Record<string, any>, edit: boolean, workspace: string, isAdmin: boolean, usedTriggerKinds: Writable<string[]>): Promise<boolean>;
4
+ export declare function getEmailDomain(): Promise<string>;
@@ -0,0 +1,52 @@
1
+ import { isCloudHosted } from '../../../cloud';
2
+ import { EmailTriggerService, SettingService } from '../../../gen';
3
+ import { sendUserToast } from '../../../toast';
4
+ import { get } from 'svelte/store';
5
+ export function getEmailAddress(local_part, workspaced_local_part, workspace_id, emailDomain) {
6
+ return `${isCloudHosted() || workspaced_local_part ? workspace_id + '-' : ''}${local_part ?? ''}@${emailDomain}`;
7
+ }
8
+ export async function saveEmailTriggerFromCfg(initialPath, routeCfg, edit, workspace, isAdmin, usedTriggerKinds) {
9
+ const requestBody = {
10
+ path: routeCfg.path,
11
+ script_path: routeCfg.script_path,
12
+ local_part: routeCfg.local_part,
13
+ is_flow: routeCfg.is_flow,
14
+ workspaced_local_part: routeCfg.workspaced_local_part,
15
+ error_handler_path: routeCfg.error_handler_path,
16
+ error_handler_args: routeCfg.error_handler_path ? routeCfg.error_handler_args : undefined,
17
+ retry: routeCfg.retry
18
+ };
19
+ try {
20
+ if (edit) {
21
+ await EmailTriggerService.updateEmailTrigger({
22
+ workspace: workspace,
23
+ path: initialPath,
24
+ requestBody: {
25
+ ...requestBody,
26
+ local_part: isAdmin || !edit ? routeCfg.local_part : undefined
27
+ }
28
+ });
29
+ sendUserToast(`Route ${routeCfg.path} updated`);
30
+ }
31
+ else {
32
+ await EmailTriggerService.createEmailTrigger({
33
+ workspace: workspace,
34
+ requestBody: requestBody
35
+ });
36
+ sendUserToast(`Route ${routeCfg.path} created`);
37
+ }
38
+ if (!get(usedTriggerKinds).includes('email')) {
39
+ usedTriggerKinds.update((t) => [...t, 'email']);
40
+ }
41
+ return true;
42
+ }
43
+ catch (error) {
44
+ sendUserToast(error.body || error.message, true);
45
+ return false;
46
+ }
47
+ }
48
+ export async function getEmailDomain() {
49
+ return ((await SettingService.getGlobal({
50
+ key: 'email_domain'
51
+ })) ?? 'mail.test.com');
52
+ }
@@ -126,7 +126,7 @@ let userCanEditConfig = $derived(userIsAdmin || isDraftOnly); // User can edit c
126
126
  <Toggle
127
127
  size="sm"
128
128
  checked={workspaced_route}
129
- disabled={!can_write}
129
+ disabled={!can_write || !userCanEditConfig}
130
130
  on:change={() => {
131
131
  workspaced_route = !workspaced_route
132
132
  dirtyRoutePath = true
@@ -37,7 +37,7 @@ export async function saveHttpRouteFromCfg(initialPath, routeCfg, edit, workspac
37
37
  summary: routeCfg.summary,
38
38
  error_handler_path: routeCfg.error_handler_path,
39
39
  error_handler_args: routeCfg.error_handler_path ? routeCfg.error_handler_args : undefined,
40
- retry: routeCfg.retry,
40
+ retry: routeCfg.retry
41
41
  };
42
42
  try {
43
43
  if (edit) {
@@ -27,5 +27,6 @@ export declare class Triggers {
27
27
  fetchSqsTriggers(triggersCountStore: Writable<TriggersCount | undefined>, workspaceId: string | undefined, path: string, isFlow: boolean, user?: UserExt | undefined): Promise<void>;
28
28
  fetchGcpTriggers(triggersCountStore: Writable<TriggersCount | undefined>, workspaceId: string | undefined, path: string, isFlow: boolean, user?: UserExt | undefined): Promise<void>;
29
29
  fetchHttpTriggers(triggersCountStore: Writable<TriggersCount | undefined>, workspaceId: string | undefined, path: string, isFlow: boolean, user?: UserExt | undefined): Promise<void>;
30
+ fetchEmailTriggers(triggersCountStore: Writable<TriggersCount | undefined>, workspaceId: string | undefined, path: string, isFlow: boolean, user?: UserExt | undefined): Promise<void>;
30
31
  fetchTriggers(triggersCountStore: Writable<TriggersCount | undefined>, workspaceId: string | undefined, path: string, isFlow: boolean, primarySchedule?: ScheduleTrigger | undefined | false, user?: UserExt | undefined): Promise<void>;
31
32
  }
@@ -1,4 +1,4 @@
1
- import { KafkaTriggerService, MqttTriggerService, NatsTriggerService, PostgresTriggerService, ScheduleService, SqsTriggerService, WebsocketTriggerService, HttpTriggerService, GcpTriggerService } from '../../gen';
1
+ import { KafkaTriggerService, MqttTriggerService, NatsTriggerService, PostgresTriggerService, ScheduleService, SqsTriggerService, WebsocketTriggerService, HttpTriggerService, GcpTriggerService, EmailTriggerService } from '../../gen';
2
2
  import { getLightConfig, sortTriggers, updateTriggersCount } from './utils';
3
3
  import { canWrite, formatCron, generateRandomString } from '../../utils';
4
4
  export class Triggers {
@@ -316,6 +316,27 @@ export class Triggers {
316
316
  console.error('Failed to fetch HTTP triggers:', error);
317
317
  }
318
318
  }
319
+ async fetchEmailTriggers(triggersCountStore, workspaceId, path, isFlow, user = undefined) {
320
+ if (!workspaceId)
321
+ return;
322
+ try {
323
+ const emailTriggers = await EmailTriggerService.listEmailTriggers({
324
+ workspace: workspaceId,
325
+ path,
326
+ isFlow
327
+ });
328
+ const emailCount = this.updateTriggers(emailTriggers, 'email', user);
329
+ triggersCountStore.update((triggersCount) => {
330
+ return {
331
+ ...(triggersCount ?? {}),
332
+ email_count: emailCount
333
+ };
334
+ });
335
+ }
336
+ catch (error) {
337
+ console.error('Failed to fetch email triggers:', error);
338
+ }
339
+ }
319
340
  async fetchTriggers(triggersCountStore, workspaceId, path, isFlow, primarySchedule = undefined, user = undefined) {
320
341
  if (!workspaceId)
321
342
  return;
@@ -329,7 +350,8 @@ export class Triggers {
329
350
  this.fetchNatsTriggers(triggersCountStore, workspaceId, path, isFlow, user),
330
351
  this.fetchMqttTriggers(triggersCountStore, workspaceId, path, isFlow, user),
331
352
  this.fetchSqsTriggers(triggersCountStore, workspaceId, path, isFlow, user),
332
- this.fetchGcpTriggers(triggersCountStore, workspaceId, path, isFlow, user)
353
+ this.fetchGcpTriggers(triggersCountStore, workspaceId, path, isFlow, user),
354
+ this.fetchEmailTriggers(triggersCountStore, workspaceId, path, isFlow, user)
333
355
  ]);
334
356
  }
335
357
  }
@@ -16,6 +16,7 @@ import { saveNatsTriggerFromCfg } from './nats/utils';
16
16
  import { saveMqttTriggerFromCfg } from './mqtt/utils';
17
17
  import { saveGcpTriggerFromCfg } from './gcp/utils';
18
18
  import { emptyString } from '../../utils';
19
+ import { saveEmailTriggerFromCfg } from './email/utils';
19
20
  export const CLOUD_DISABLED_TRIGGER_TYPES = [
20
21
  'nats',
21
22
  'kafka',
@@ -29,6 +30,7 @@ export const CLOUD_DISABLED_TRIGGER_TYPES = [
29
30
  export const triggerIconMap = {
30
31
  webhook: Webhook,
31
32
  email: Mail,
33
+ default_email: Mail,
32
34
  schedule: Calendar,
33
35
  http: Route,
34
36
  websocket: Unplug,
@@ -52,6 +54,7 @@ export function triggerTypeToCaptureKind(triggerType) {
52
54
  const capturableTriggerTypes = [
53
55
  'webhook',
54
56
  'email',
57
+ 'default_email',
55
58
  'http',
56
59
  'websocket',
57
60
  'postgres',
@@ -71,7 +74,7 @@ export function updateTriggersCount(triggersCountStore, type, action, primaryCfg
71
74
  // Map trigger types to their corresponding count property names
72
75
  const countPropertyMap = {
73
76
  webhook: undefined,
74
- email: undefined,
77
+ default_email: undefined,
75
78
  schedule: 'schedule_count',
76
79
  http: 'http_routes_count',
77
80
  websocket: 'websocket_count',
@@ -81,6 +84,7 @@ export function updateTriggersCount(triggersCountStore, type, action, primaryCfg
81
84
  mqtt: 'mqtt_count',
82
85
  sqs: 'sqs_count',
83
86
  gcp: 'gcp_count',
87
+ email: 'email_count',
84
88
  poll: undefined,
85
89
  cli: undefined
86
90
  };
@@ -126,6 +130,8 @@ export function triggerKindToTriggerType(kind) {
126
130
  return 'webhook';
127
131
  case 'emails':
128
132
  return 'email';
133
+ case 'default_emails':
134
+ return 'default_email';
129
135
  case 'schedules':
130
136
  return 'schedule';
131
137
  case 'routes':
@@ -164,7 +170,7 @@ export async function deployTriggers(triggersToDeploy, workspaceId, isAdmin, use
164
170
  // Map of trigger types to their save functions
165
171
  const triggerSaveFunctions = {
166
172
  webhook: undefined,
167
- email: undefined,
173
+ default_email: undefined,
168
174
  schedule: (trigger) => {
169
175
  if (trigger.isPrimary && initialPath) {
170
176
  trigger.draftConfig = {
@@ -183,6 +189,7 @@ export async function deployTriggers(triggersToDeploy, workspaceId, isAdmin, use
183
189
  mqtt: (trigger) => saveMqttTriggerFromCfg(trigger.path ?? trigger.draftConfig?.path ?? '', trigger.draftConfig ?? {}, !trigger.isDraft, workspaceId, usedTriggerKinds),
184
190
  sqs: (trigger) => saveSqsTriggerFromCfg(trigger.path ?? trigger.draftConfig?.path ?? '', trigger.draftConfig ?? {}, !trigger.isDraft, workspaceId, usedTriggerKinds),
185
191
  gcp: (trigger) => saveGcpTriggerFromCfg(trigger.path ?? trigger.draftConfig?.path ?? '', trigger.draftConfig ?? {}, !trigger.isDraft, workspaceId, usedTriggerKinds),
192
+ email: (trigger) => saveEmailTriggerFromCfg(trigger.path ?? trigger.draftConfig?.path ?? '', trigger.draftConfig ?? {}, !trigger.isDraft, workspaceId, isAdmin, usedTriggerKinds),
186
193
  poll: undefined,
187
194
  cli: undefined
188
195
  };
@@ -262,6 +269,9 @@ export function getLightConfig(triggerType, trigger) {
262
269
  else if (triggerType === 'gcp') {
263
270
  return { gcp_resource_path: trigger.gcp_resource_path, topic: trigger.topic };
264
271
  }
272
+ else if (triggerType === 'email') {
273
+ return { local_part: trigger.local_part };
274
+ }
265
275
  else {
266
276
  return undefined;
267
277
  }
@@ -272,7 +282,7 @@ export function getTriggerLabel(trigger) {
272
282
  if (type === 'webhook') {
273
283
  return 'Webhook';
274
284
  }
275
- else if (type === 'email') {
285
+ else if (type === 'default_email') {
276
286
  return 'Email';
277
287
  }
278
288
  else if (type === 'cli') {
@@ -303,6 +313,9 @@ export function getTriggerLabel(trigger) {
303
313
  else if (type === 'websocket' && config?.url) {
304
314
  return `${config?.url}`;
305
315
  }
316
+ else if (type === 'email' && config?.local_part) {
317
+ return `${config?.local_part}`;
318
+ }
306
319
  else if (isDraft && draftConfig?.path) {
307
320
  return `${draftConfig?.path}`;
308
321
  }
@@ -317,7 +330,7 @@ export function sortTriggers(triggers) {
317
330
  const triggerTypeOrder = [
318
331
  'webhook',
319
332
  'cli',
320
- 'email',
333
+ 'default_email',
321
334
  'poll',
322
335
  'schedule',
323
336
  'http',
@@ -327,7 +340,8 @@ export function sortTriggers(triggers) {
327
340
  'nats',
328
341
  'mqtt',
329
342
  'sqs',
330
- 'gcp'
343
+ 'gcp',
344
+ 'email'
331
345
  ];
332
346
  return triggers.sort((a, b) => {
333
347
  // Draft triggers always come last
@@ -16,5 +16,5 @@ export type TriggerContext = {
16
16
  triggersState: Triggers;
17
17
  };
18
18
  export declare function setScheduledPollSchedule(triggersState: Triggers, triggersCount: Writable<TriggersCount | undefined>): void;
19
- export type TriggerKind = 'webhooks' | 'emails' | 'schedules' | 'cli' | 'routes' | 'websockets' | 'scheduledPoll' | 'kafka' | 'nats' | 'postgres' | 'mqtt' | 'sqs' | 'gcp';
19
+ export type TriggerKind = 'webhooks' | 'emails' | 'default_emails' | 'schedules' | 'cli' | 'routes' | 'websockets' | 'scheduledPoll' | 'kafka' | 'nats' | 'postgres' | 'mqtt' | 'sqs' | 'gcp';
20
20
  export declare function captureTriggerKindToTriggerKind(kind: CaptureTriggerKind): TriggerKind;