windmill-components 1.504.6 → 1.511.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 (233) hide show
  1. package/package/ata/index.js +1 -1
  2. package/package/components/AppConnectInner.svelte +184 -29
  3. package/package/components/ArgInput.svelte +33 -103
  4. package/package/components/AuthSettings.svelte +45 -1
  5. package/package/components/Dev.svelte +31 -24
  6. package/package/components/DisplayResult.svelte +53 -26
  7. package/package/components/DisplayResult.svelte.d.ts +1 -1
  8. package/package/components/DynSelect.svelte +3 -3
  9. package/package/components/Editor.svelte +115 -88
  10. package/package/components/Editor.svelte.d.ts +30 -55
  11. package/package/components/EditorBar.svelte +2 -2
  12. package/package/components/ErrorOrRecoveryHandler.svelte +73 -67
  13. package/package/components/ErrorOrRecoveryHandler.svelte.d.ts +8 -24
  14. package/package/components/FlowBuilder.svelte +11 -2
  15. package/package/components/FlowJobResult.svelte +12 -17
  16. package/package/components/FlowJobResult.svelte.d.ts +5 -18
  17. package/package/components/FlowPreviewContent.svelte +13 -10
  18. package/package/components/FlowPreviewContent.svelte.d.ts +1 -1
  19. package/package/components/FlowPreviewResult.svelte +14 -6
  20. package/package/components/FlowStatusViewer.svelte +11 -24
  21. package/package/components/FlowStatusViewer.svelte.d.ts +19 -18
  22. package/package/components/FlowStatusViewerInner.svelte +110 -131
  23. package/package/components/FlowStatusViewerInner.svelte.d.ts +20 -18
  24. package/package/components/GitDiffPreview.svelte +55 -0
  25. package/package/components/GitDiffPreview.svelte.d.ts +13 -0
  26. package/package/components/HistoricInputs.svelte +2 -2
  27. package/package/components/HttpAgentWorkerDrawer.svelte +1 -1
  28. package/package/components/InitGitRepoPopover.svelte +410 -0
  29. package/package/components/InitGitRepoPopover.svelte.d.ts +13 -0
  30. package/package/components/InstanceSetting.svelte +21 -9
  31. package/package/components/InstanceSettings.svelte +16 -3
  32. package/package/components/JobLoader.svelte +567 -0
  33. package/package/components/JobLoader.svelte.d.ts +53 -0
  34. package/package/components/JobLogs.svelte +6 -4
  35. package/package/components/JobLogs.svelte.d.ts +5 -18
  36. package/package/components/JsonEditor.svelte +11 -11
  37. package/package/components/JsonEditor.svelte.d.ts +14 -56
  38. package/package/components/Label.svelte +6 -11
  39. package/package/components/Label.svelte.d.ts +14 -39
  40. package/package/components/LightweightResourcePicker.svelte +18 -39
  41. package/package/components/LightweightResourcePicker.svelte.d.ts +6 -22
  42. package/package/components/LogViewer.svelte +35 -41
  43. package/package/components/LogViewer.svelte.d.ts +6 -20
  44. package/package/components/ModulePreviewResultViewer.svelte +3 -1
  45. package/package/components/ModulePreviewResultViewer.svelte.d.ts +1 -0
  46. package/package/components/ModuleTest.svelte +16 -11
  47. package/package/components/NumberTypeNarrowing.svelte +13 -16
  48. package/package/components/NumberTypeNarrowing.svelte.d.ts +4 -18
  49. package/package/components/PullGitRepoPopover.svelte +355 -0
  50. package/package/components/PullGitRepoPopover.svelte.d.ts +18 -0
  51. package/package/components/ResourceTypePicker.svelte +20 -17
  52. package/package/components/ResourceTypePicker.svelte.d.ts +7 -6
  53. package/package/components/S3FilePicker.svelte +5 -3
  54. package/package/components/SavedInputs.svelte +2 -2
  55. package/package/components/ScriptBuilder.svelte +4 -3
  56. package/package/components/ScriptEditor.svelte +34 -31
  57. package/package/components/ScriptEditor.svelte.d.ts +3 -3
  58. package/package/components/Section.svelte +7 -20
  59. package/package/components/Section.svelte.d.ts +20 -47
  60. package/package/components/ServiceLogsInner.svelte +2 -1
  61. package/package/components/ServiceLogsInner.svelte.d.ts +1 -0
  62. package/package/components/SimpleEditor.svelte +4 -4
  63. package/package/components/SimpleEditor.svelte.d.ts +1 -0
  64. package/package/components/SqlRepl.svelte +0 -1
  65. package/package/components/Subsection.svelte +10 -12
  66. package/package/components/Subsection.svelte.d.ts +15 -39
  67. package/package/components/UserSettings.svelte +1 -1
  68. package/package/components/WorkerGroup.svelte +260 -165
  69. package/package/components/WorkerGroup.svelte.d.ts +2 -0
  70. package/package/components/WorkerTagPicker.svelte +3 -3
  71. package/package/components/WorkerTagSelect.svelte +33 -4
  72. package/package/components/apps/components/buttons/AppButton.svelte +7 -1
  73. package/package/components/apps/components/buttons/AppButton.svelte.d.ts +1 -0
  74. package/package/components/apps/components/display/AppCustomComponent.svelte +1 -1
  75. package/package/components/apps/components/display/AppDisplayComponentByJobId.svelte +16 -11
  76. package/package/components/apps/components/display/AppJobIdLogComponent.svelte +13 -10
  77. package/package/components/apps/components/display/AppMenu.svelte +5 -0
  78. package/package/components/apps/components/display/dbtable/AppDbExplorer.svelte +3 -3
  79. package/package/components/apps/components/display/dbtable/DeleteRow.svelte +3 -3
  80. package/package/components/apps/components/display/dbtable/InsertRowRunnable.svelte +3 -3
  81. package/package/components/apps/components/display/dbtable/UpdateCell.svelte +3 -3
  82. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +3 -3
  83. package/package/components/apps/components/helpers/RunnableComponent.svelte +65 -54
  84. package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +5 -5
  85. package/package/components/apps/components/inputs/AppUserResource.svelte +26 -8
  86. package/package/components/apps/editor/AppEditorHeader.svelte +11 -5
  87. package/package/components/apps/editor/AppJobsDrawer.svelte +5 -5
  88. package/package/components/apps/editor/RunnableJobPanel.svelte +4 -4
  89. package/package/components/apps/editor/component/components.d.ts +12 -0
  90. package/package/components/apps/editor/component/components.js +19 -7
  91. package/package/components/assets/AssetButtons.svelte +38 -0
  92. package/package/components/assets/AssetButtons.svelte.d.ts +15 -0
  93. package/package/components/assets/AssetsDropdownButton.svelte +60 -72
  94. package/package/components/assets/AssetsDropdownButton.svelte.d.ts +3 -4
  95. package/package/components/assets/AssetsUsageDrawer.svelte +10 -10
  96. package/package/components/assets/JobAssetsViewer.svelte +79 -0
  97. package/package/components/assets/JobAssetsViewer.svelte.d.ts +7 -0
  98. package/package/components/assets/README_DEV.md +0 -0
  99. package/package/components/assets/lib.d.ts +9 -1
  100. package/package/components/assets/lib.js +48 -7
  101. package/package/components/common/fileUpload/FileUpload.svelte +126 -84
  102. package/package/components/common/fileUpload/FileUpload.svelte.d.ts +13 -3
  103. package/package/components/common/fileUpload/S3ArgInput.svelte +111 -0
  104. package/package/components/common/fileUpload/S3ArgInput.svelte.d.ts +21 -0
  105. package/package/components/common/table/ScriptRow.svelte +3 -1
  106. package/package/components/copilot/AIFormSettings.svelte +3 -4
  107. package/package/components/copilot/AIFormSettings.svelte.d.ts +5 -19
  108. package/package/components/copilot/autocomplete/Autocompletor.d.ts +3 -1
  109. package/package/components/copilot/autocomplete/Autocompletor.js +269 -35
  110. package/package/components/copilot/autocomplete/request.d.ts +3 -0
  111. package/package/components/copilot/autocomplete/request.js +15 -7
  112. package/package/components/copilot/chat/AIChatDisplay.svelte +8 -0
  113. package/package/components/copilot/chat/AIChatManager.svelte.js +13 -8
  114. package/package/components/copilot/chat/flow/ModuleAcceptReject.svelte +5 -5
  115. package/package/components/copilot/chat/flow/core.d.ts +1 -1
  116. package/package/components/copilot/chat/flow/core.js +2 -38
  117. package/package/components/copilot/chat/navigator/apiTools.d.ts +8 -0
  118. package/package/components/copilot/chat/navigator/apiTools.js +95 -15
  119. package/package/components/copilot/chat/navigator/core.d.ts +1 -1
  120. package/package/components/copilot/chat/navigator/core.js +2 -1
  121. package/package/components/copilot/chat/script/core.d.ts +11 -2
  122. package/package/components/copilot/chat/script/core.js +165 -23
  123. package/package/components/copilot/chat/shared.d.ts +10 -0
  124. package/package/components/copilot/chat/shared.js +56 -0
  125. package/package/components/copilot/lib.d.ts +1 -0
  126. package/package/components/copilot/lib.js +30 -9
  127. package/package/components/custom_ui.d.ts +1 -0
  128. package/package/components/flows/FlowAssetsHandler.svelte +133 -0
  129. package/package/components/flows/FlowAssetsHandler.svelte.d.ts +14 -0
  130. package/package/components/flows/content/FlowModuleCache.svelte +4 -4
  131. package/package/components/flows/content/FlowModuleCache.svelte.d.ts +4 -18
  132. package/package/components/flows/content/FlowModuleComponent.svelte +16 -19
  133. package/package/components/flows/content/FlowModuleDeleteAfterUse.svelte +3 -4
  134. package/package/components/flows/content/FlowModuleDeleteAfterUse.svelte.d.ts +4 -18
  135. package/package/components/flows/content/FlowModuleSleep.svelte +6 -7
  136. package/package/components/flows/content/FlowModuleSleep.svelte.d.ts +4 -18
  137. package/package/components/flows/content/FlowModuleSuspend.svelte +19 -17
  138. package/package/components/flows/content/FlowModuleSuspend.svelte.d.ts +4 -18
  139. package/package/components/flows/content/FlowModuleTimeout.svelte +4 -4
  140. package/package/components/flows/content/FlowModuleTimeout.svelte.d.ts +4 -18
  141. package/package/components/flows/flowStore.d.ts +1 -1
  142. package/package/components/flows/map/FlowModuleSchemaItem.svelte +1 -0
  143. package/package/components/flows/propPicker/OutputPicker.svelte +9 -4
  144. package/package/components/flows/scheduleUtils.js +1 -1
  145. package/package/components/flows/types.d.ts +2 -1
  146. package/package/components/graph/FlowGraphV2.svelte +8 -104
  147. package/package/components/graph/FlowGraphV2.svelte.d.ts +0 -2
  148. package/package/components/graph/graphBuilder.svelte.d.ts +6 -3
  149. package/package/components/graph/graphBuilder.svelte.js +35 -9
  150. package/package/components/graph/renderers/edges/BaseEdge.svelte +2 -5
  151. package/package/components/graph/renderers/edges/BaseEdge.svelte.d.ts +1 -0
  152. package/package/components/graph/renderers/nodes/AssetNode.svelte +23 -20
  153. package/package/components/graph/renderers/nodes/AssetNode.svelte.d.ts +5 -10
  154. package/package/components/graph/renderers/nodes/AssetsOverflowedNode.svelte +1 -1
  155. package/package/components/graph/util.js +1 -1
  156. package/package/components/home/ItemsList.svelte +2 -0
  157. package/package/components/icons/AssetGenericIcon.svelte +0 -3
  158. package/package/components/jobs/JobPreview.svelte +10 -6
  159. package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte +13 -12
  160. package/package/components/runs/BatchReRunOptionsPane.svelte +5 -1
  161. package/package/components/runs/JobPreview.svelte +26 -16
  162. package/package/components/runs/{JobLoader.svelte.d.ts → JobsLoader.svelte.d.ts} +3 -3
  163. package/package/components/runs/NoWorkerWithTagWarning.svelte +2 -2
  164. package/package/components/runs/NoWorkerWithTagWarning.svelte.d.ts +1 -0
  165. package/package/components/runs/RunsFilter.svelte.d.ts +1 -1
  166. package/package/components/scriptEditor/LogPanel.svelte +3 -2
  167. package/package/components/script_builder.d.ts +2 -2
  168. package/package/components/settings/CreateToken.svelte +76 -41
  169. package/package/components/settings/CreateToken.svelte.d.ts +1 -1
  170. package/package/components/settings/ScopeSelector.svelte +613 -0
  171. package/package/components/settings/ScopeSelector.svelte.d.ts +8 -0
  172. package/package/components/settings/TokenDisplay.svelte +103 -0
  173. package/package/components/settings/TokenDisplay.svelte.d.ts +10 -0
  174. package/package/components/settings/TokensTable.svelte +70 -349
  175. package/package/components/sidebar/CriticalAlertModal.svelte +3 -0
  176. package/package/components/triggers/DeleteTriggerButton.svelte +1 -1
  177. package/package/components/triggers/TriggerEditorToolbar.svelte +3 -3
  178. package/package/components/triggers/TriggerRetriesAndErrorHandler.svelte +55 -0
  179. package/package/components/triggers/TriggerRetriesAndErrorHandler.svelte.d.ts +13 -0
  180. package/package/components/triggers/TriggersEditor.svelte +45 -3
  181. package/package/components/triggers/TriggersWrapper.svelte +2 -2
  182. package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +47 -6
  183. package/package/components/triggers/gcp/utils.js +9 -1
  184. package/package/components/triggers/http/OpenAPISpecGenerator.svelte +3 -2
  185. package/package/components/triggers/http/RouteEditorConfigSection.svelte +26 -23
  186. package/package/components/triggers/http/RouteEditorConfigSection.svelte.d.ts +5 -19
  187. package/package/components/triggers/http/RouteEditorInner.svelte +219 -175
  188. package/package/components/triggers/http/RouteEditorInner.svelte.d.ts +6 -2
  189. package/package/components/triggers/http/utils.js +9 -3
  190. package/package/components/triggers/kafka/KafkaTriggerEditorInner.svelte +47 -6
  191. package/package/components/triggers/kafka/utils.js +9 -1
  192. package/package/components/triggers/mqtt/MqttEditorConfigSection.svelte +4 -132
  193. package/package/components/triggers/mqtt/MqttEditorConfigSection.svelte.d.ts +2 -5
  194. package/package/components/triggers/mqtt/MqttTriggerEditorInner.svelte +182 -13
  195. package/package/components/triggers/mqtt/utils.js +9 -1
  196. package/package/components/triggers/nats/NatsTriggerEditorInner.svelte +47 -6
  197. package/package/components/triggers/nats/utils.js +9 -1
  198. package/package/components/triggers/postgres/PostgresTriggerEditorInner.svelte +41 -2
  199. package/package/components/triggers/postgres/utils.js +9 -1
  200. package/package/components/triggers/schedules/ScheduleEditorInner.svelte +38 -92
  201. package/package/components/triggers/sqs/SqsTriggerEditorInner.svelte +47 -6
  202. package/package/components/triggers/sqs/utils.js +9 -1
  203. package/package/components/triggers/utils.js +12 -0
  204. package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +47 -6
  205. package/package/components/triggers/websocket/utils.js +11 -1
  206. package/package/components/workspaceSettings/AISettings.svelte +0 -2
  207. package/package/components/workspaceSettings/FilterList.svelte +56 -0
  208. package/package/components/workspaceSettings/FilterList.svelte.d.ts +8 -0
  209. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte +785 -0
  210. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte.d.ts +18 -0
  211. package/package/gen/core/OpenAPI.js +1 -1
  212. package/package/gen/schemas.gen.d.ts +305 -23
  213. package/package/gen/schemas.gen.js +305 -23
  214. package/package/gen/services.gen.d.ts +33 -1
  215. package/package/gen/services.gen.js +66 -2
  216. package/package/gen/types.gen.d.ts +216 -11
  217. package/package/history.svelte.js +0 -2
  218. package/package/hub.d.ts +1 -0
  219. package/package/hubPaths.json +5 -2
  220. package/package/infer.js +16 -10
  221. package/package/svelte5Utils.svelte.d.ts +1 -0
  222. package/package/svelte5Utils.svelte.js +25 -18
  223. package/package/toast.js +10 -0
  224. package/package/utils.d.ts +3 -2
  225. package/package/utils.js +20 -5
  226. package/package.json +11 -11
  227. package/package/components/ResultJobLoader.svelte +0 -219
  228. package/package/components/ResultJobLoader.svelte.d.ts +0 -52
  229. package/package/components/TestJobLoader.svelte +0 -274
  230. package/package/components/TestJobLoader.svelte.d.ts +0 -43
  231. package/package/components/icons/AssetVarIcon.svelte +0 -31
  232. package/package/components/icons/AssetVarIcon.svelte.d.ts +0 -9
  233. /package/package/components/runs/{JobLoader.svelte → JobsLoader.svelte} +0 -0
@@ -81,6 +81,13 @@ export function invalidRelations(relations, options) {
81
81
  }
82
82
  export async function savePostgresTriggerFromCfg(initialPath, config, edit, workspace, usedTriggerKinds) {
83
83
  try {
84
+ const errorHandlerAndRetries = !config.is_flow
85
+ ? {
86
+ error_handler_path: config.error_handler_path,
87
+ error_handler_args: config.error_handler_path ? config.error_handler_args : undefined,
88
+ retry: config.retry
89
+ }
90
+ : {};
84
91
  const requestBody = {
85
92
  path: config.path,
86
93
  script_path: config.script_path,
@@ -89,7 +96,8 @@ export async function savePostgresTriggerFromCfg(initialPath, config, edit, work
89
96
  replication_slot_name: config.replication_slot_name,
90
97
  publication_name: config.publication_name,
91
98
  publication: config.publication,
92
- enabled: config.enabled
99
+ enabled: config.enabled,
100
+ ...errorHandlerAndRetries
93
101
  };
94
102
  if (edit) {
95
103
  await PostgresTriggerService.updatePostgresTrigger({
@@ -26,7 +26,6 @@ import { runScheduleNow } from '../scheduled/utils';
26
26
  import { handleConfigChange } from '../utils';
27
27
  let { useDrawer = true, hideTarget = false, docDescription = undefined, allowDraft = false, draftSchema = undefined, customLabel = undefined, isDeployed = false, onUpdate = undefined, onConfigChange = undefined, onDelete = undefined, onReset = undefined, trigger = undefined } = $props();
28
28
  let optionTabSelected = $state('error_handler');
29
- let is_flow = $state(false);
30
29
  let initialPath = $state('');
31
30
  let edit = $state(true);
32
31
  let schedule = $state('0 0 12 * *');
@@ -37,19 +36,17 @@ let initialSchedule;
37
36
  let timezone = $state(Intl.DateTimeFormat().resolvedOptions().timeZone);
38
37
  let paused_until = $state(undefined);
39
38
  let itemKind = $state('script');
39
+ let is_flow = $derived.by(() => itemKind === 'flow');
40
40
  let errorHandleritemKind = $state('script');
41
41
  let wsErrorHandlerMuted = $state(false);
42
42
  let errorHandlerPath = $state(undefined);
43
- let errorHandlerCustomInitialPath = $state(undefined);
44
43
  let errorHandlerSelected = $state('slack');
45
44
  let errorHandlerExtraArgs = $state({});
46
45
  let recoveryHandlerPath = $state(undefined);
47
- let recoveryHandlerCustomInitialPath = $state(undefined);
48
46
  let recoveryHandlerSelected = $state('slack');
49
47
  let recoveryHandlerItemKind = $state('script');
50
48
  let recoveryHandlerExtraArgs = $state({});
51
49
  let successHandlerPath = $state(undefined);
52
- let successHandlerCustomInitialPath = $state(undefined);
53
50
  let successHandlerSelected = $state('slack');
54
51
  let successHandlerItemKind = $state('script');
55
52
  let successHandlerExtraArgs = $state({});
@@ -94,9 +91,8 @@ export async function openEdit(ePath, isFlow, defaultCfg) {
94
91
  drawerLoading = true;
95
92
  try {
96
93
  drawer?.openDrawer();
97
- is_flow = isFlow;
98
94
  initialPath = ePath;
99
- itemKind = is_flow ? 'flow' : 'script';
95
+ itemKind = isFlow ? 'flow' : 'script';
100
96
  path = defaultCfg?.path ?? ePath;
101
97
  await loadSchedule(defaultCfg);
102
98
  edit = true;
@@ -116,7 +112,6 @@ async function setScheduleHandler(s) {
116
112
  let splitted = s.on_failure.split('/');
117
113
  errorHandleritemKind = splitted[0];
118
114
  errorHandlerPath = splitted.slice(1)?.join('/');
119
- errorHandlerCustomInitialPath = errorHandlerPath;
120
115
  failedTimes = s.on_failure_times ?? 1;
121
116
  failedExact = s.on_failure_exact ?? false;
122
117
  errorHandlerExtraArgs = s.on_failure_extra_args ?? {};
@@ -125,7 +120,6 @@ async function setScheduleHandler(s) {
125
120
  else {
126
121
  errorHandlerPath = undefined;
127
122
  errorHandleritemKind = 'script';
128
- errorHandlerCustomInitialPath = undefined;
129
123
  errorHandlerExtraArgs = {};
130
124
  failedExact = false;
131
125
  failedTimes = 1;
@@ -135,7 +129,6 @@ async function setScheduleHandler(s) {
135
129
  let splitted = s.on_recovery.split('/');
136
130
  recoveryHandlerItemKind = splitted[0];
137
131
  recoveryHandlerPath = splitted.slice(1)?.join('/');
138
- recoveryHandlerCustomInitialPath = recoveryHandlerPath;
139
132
  recoveredTimes = s.on_recovery_times ?? 1;
140
133
  recoveryHandlerExtraArgs = s.on_recovery_extra_args ?? {};
141
134
  recoveryHandlerSelected = getHandlerType('recovery', recoveryHandlerPath);
@@ -143,7 +136,6 @@ async function setScheduleHandler(s) {
143
136
  else {
144
137
  recoveryHandlerPath = undefined;
145
138
  recoveryHandlerItemKind = 'script';
146
- recoveryHandlerCustomInitialPath = undefined;
147
139
  recoveredTimes = 1;
148
140
  recoveryHandlerSelected = 'slack';
149
141
  recoveryHandlerExtraArgs = {};
@@ -152,14 +144,12 @@ async function setScheduleHandler(s) {
152
144
  let splitted = s.on_success.split('/');
153
145
  successHandlerItemKind = splitted[0];
154
146
  successHandlerPath = splitted.slice(1)?.join('/');
155
- successHandlerCustomInitialPath = successHandlerPath;
156
147
  successHandlerExtraArgs = s.on_success_extra_args ?? {};
157
148
  successHandlerSelected = getHandlerType('success', successHandlerPath);
158
149
  }
159
150
  else {
160
151
  successHandlerPath = undefined;
161
152
  successHandlerItemKind = 'script';
162
- successHandlerCustomInitialPath = undefined;
163
153
  successHandlerSelected = 'slack';
164
154
  successHandlerExtraArgs = {};
165
155
  }
@@ -185,7 +175,6 @@ async function setScheduleHandler(s) {
185
175
  errorHandleritemKind = splitted[0];
186
176
  errorHandlerPath = splitted.slice(1)?.join('/');
187
177
  errorHandlerExtraArgs = defaultErrorHandlerMaybe['errorHandlerExtraArgs'];
188
- errorHandlerCustomInitialPath = errorHandlerPath;
189
178
  errorHandlerSelected = getHandlerType('error', errorHandlerPath);
190
179
  failedTimes = defaultErrorHandlerMaybe['failedTimes'];
191
180
  failedExact = defaultErrorHandlerMaybe['failedExact'];
@@ -195,7 +184,6 @@ async function setScheduleHandler(s) {
195
184
  errorHandlerPath = undefined;
196
185
  errorHandleritemKind = 'script';
197
186
  errorHandlerExtraArgs = {};
198
- errorHandlerCustomInitialPath = undefined;
199
187
  errorHandlerSelected = 'slack';
200
188
  failedTimes = 1;
201
189
  failedExact = false;
@@ -205,7 +193,6 @@ async function setScheduleHandler(s) {
205
193
  recoveryHandlerItemKind = splitted[0];
206
194
  recoveryHandlerPath = splitted.slice(1)?.join('/');
207
195
  recoveryHandlerExtraArgs = defaultRecoveryHandlerMaybe['recoveryHandlerExtraArgs'];
208
- recoveryHandlerCustomInitialPath = recoveryHandlerPath;
209
196
  recoveryHandlerSelected = getHandlerType('recovery', recoveryHandlerPath);
210
197
  recoveredTimes = defaultRecoveryHandlerMaybe['recoveredTimes'];
211
198
  }
@@ -213,7 +200,6 @@ async function setScheduleHandler(s) {
213
200
  recoveryHandlerPath = undefined;
214
201
  recoveryHandlerItemKind = 'script';
215
202
  recoveryHandlerExtraArgs = {};
216
- recoveryHandlerCustomInitialPath = undefined;
217
203
  recoveryHandlerSelected = 'slack';
218
204
  recoveredTimes = 1;
219
205
  }
@@ -222,7 +208,6 @@ async function setScheduleHandler(s) {
222
208
  successHandlerItemKind = splitted[0];
223
209
  successHandlerPath = splitted.slice(1)?.join('/');
224
210
  successHandlerExtraArgs = defaultSuccessHandlerMaybe['successHandlerExtraArgs'];
225
- successHandlerCustomInitialPath = successHandlerPath;
226
211
  successHandlerSelected = getHandlerType('success', successHandlerPath);
227
212
  recoveredTimes = defaultSuccessHandlerMaybe['recoveredTimes'];
228
213
  }
@@ -230,7 +215,6 @@ async function setScheduleHandler(s) {
230
215
  successHandlerPath = undefined;
231
216
  successHandlerItemKind = 'script';
232
217
  successHandlerExtraArgs = {};
233
- successHandlerCustomInitialPath = undefined;
234
218
  successHandlerSelected = 'slack';
235
219
  }
236
220
  }
@@ -254,9 +238,8 @@ export async function openNew(nis_flow, initial_script_path, defaultValues, sche
254
238
  }
255
239
  drawer?.openDrawer();
256
240
  runnable = undefined;
257
- is_flow = s?.is_flow ?? nis_flow;
258
241
  edit = false;
259
- itemKind = is_flow ? 'flow' : 'script';
242
+ itemKind = (s?.is_flow ?? nis_flow) ? 'flow' : 'script';
260
243
  initialScriptPath = initial_script_path ?? '';
261
244
  path = initNewPath
262
245
  ? ''
@@ -287,15 +270,6 @@ export async function openNew(nis_flow, initial_script_path, defaultValues, sche
287
270
  showLoading = false;
288
271
  }
289
272
  }
290
- async function resetRetries() {
291
- if (itemKind === 'flow') {
292
- retry = undefined;
293
- }
294
- }
295
- $effect(() => {
296
- ;
297
- (is_flow = itemKind == 'flow') && resetRetries();
298
- });
299
273
  // set isValid to true when a script/flow without any properties is selected
300
274
  $effect(() => {
301
275
  setDefaultValid(draftSchema ?? runnable?.schema);
@@ -437,7 +411,7 @@ async function loadScheduleCfg(cfg) {
437
411
  description = cfg.description ?? '';
438
412
  script_path = cfg.script_path ?? '';
439
413
  await loadScript(script_path);
440
- is_flow = cfg.is_flow;
414
+ itemKind = cfg.is_flow ? 'flow' : 'script';
441
415
  no_flow_overlap = cfg.no_flow_overlap ?? false;
442
416
  wsErrorHandlerMuted = cfg.ws_error_handler_muted ?? false;
443
417
  retry = cfg.retry;
@@ -445,7 +419,6 @@ async function loadScheduleCfg(cfg) {
445
419
  let splitted = cfg.on_failure.split('/');
446
420
  errorHandleritemKind = splitted[0];
447
421
  errorHandlerPath = splitted.slice(1)?.join('/');
448
- errorHandlerCustomInitialPath = errorHandlerPath;
449
422
  failedTimes = cfg.on_failure_times ?? 1;
450
423
  failedExact = cfg.on_failure_exact ?? false;
451
424
  errorHandlerExtraArgs = cfg.on_failure_extra_args ?? {};
@@ -454,7 +427,6 @@ async function loadScheduleCfg(cfg) {
454
427
  else {
455
428
  errorHandlerPath = undefined;
456
429
  errorHandleritemKind = 'script';
457
- errorHandlerCustomInitialPath = undefined;
458
430
  errorHandlerExtraArgs = {};
459
431
  failedExact = false;
460
432
  failedTimes = 1;
@@ -464,7 +436,6 @@ async function loadScheduleCfg(cfg) {
464
436
  let splitted = cfg.on_recovery.split('/');
465
437
  recoveryHandlerItemKind = splitted[0];
466
438
  recoveryHandlerPath = splitted.slice(1)?.join('/');
467
- recoveryHandlerCustomInitialPath = recoveryHandlerPath;
468
439
  recoveredTimes = cfg.on_recovery_times ?? 1;
469
440
  recoveryHandlerExtraArgs = cfg.on_recovery_extra_args ?? {};
470
441
  recoveryHandlerSelected = getHandlerType('recovery', recoveryHandlerPath ?? '');
@@ -472,7 +443,6 @@ async function loadScheduleCfg(cfg) {
472
443
  else {
473
444
  recoveryHandlerPath = undefined;
474
445
  recoveryHandlerItemKind = 'script';
475
- recoveryHandlerCustomInitialPath = undefined;
476
446
  recoveredTimes = 1;
477
447
  recoveryHandlerSelected = 'slack';
478
448
  recoveryHandlerExtraArgs = {};
@@ -481,14 +451,12 @@ async function loadScheduleCfg(cfg) {
481
451
  let splitted = cfg.on_success.split('/');
482
452
  successHandlerItemKind = splitted[0];
483
453
  successHandlerPath = splitted.slice(1)?.join('/');
484
- successHandlerCustomInitialPath = successHandlerPath;
485
454
  successHandlerExtraArgs = cfg.on_success_extra_args ?? {};
486
455
  successHandlerSelected = getHandlerType('success', successHandlerPath ?? '');
487
456
  }
488
457
  else {
489
458
  successHandlerPath = undefined;
490
459
  successHandlerItemKind = 'script';
491
- successHandlerCustomInitialPath = undefined;
492
460
  successHandlerSelected = 'slack';
493
461
  successHandlerExtraArgs = {};
494
462
  }
@@ -530,18 +498,6 @@ function getHandlerType(isHandler, scriptPath) {
530
498
  }
531
499
  return 'custom';
532
500
  }
533
- function isSlackHandler(isSlackHandler, scriptPath) {
534
- if (isSlackHandler == 'error') {
535
- return (scriptPath.startsWith('hub/') &&
536
- scriptPath.endsWith('/workspace-or-schedule-error-handler-slack'));
537
- }
538
- else if (isSlackHandler == 'recovery') {
539
- return (scriptPath.startsWith('hub/') && scriptPath.endsWith('/schedule-recovery-handler-slack'));
540
- }
541
- else {
542
- return scriptPath.startsWith('hub/') && scriptPath.endsWith('/schedule-success-handler-slack');
543
- }
544
- }
545
501
  let drawer = $state();
546
502
  let pathC = $state();
547
503
  let dirtyPath = $state(false);
@@ -563,27 +519,6 @@ function onVersionChange() {
563
519
  }
564
520
  }
565
521
  function getScheduleCfg() {
566
- let errorHadlerExtraArgsDerived = structuredClone($state.snapshot(errorHandlerExtraArgs));
567
- if (errorHandlerPath !== undefined && isSlackHandler('error', errorHandlerPath)) {
568
- errorHadlerExtraArgsDerived['slack'] = '$res:f/slack_bot/bot_token';
569
- }
570
- else {
571
- errorHadlerExtraArgsDerived['slack'] = undefined;
572
- }
573
- let recoveryHandlerExtraArgsDerived = structuredClone($state.snapshot(recoveryHandlerExtraArgs));
574
- if (recoveryHandlerPath !== undefined && isSlackHandler('recovery', recoveryHandlerPath)) {
575
- recoveryHandlerExtraArgsDerived['slack'] = '$res:f/slack_bot/bot_token';
576
- }
577
- else {
578
- recoveryHandlerExtraArgsDerived['slack'] = undefined;
579
- }
580
- let successHandlerExtraArgsDerived = structuredClone($state.snapshot(successHandlerExtraArgs));
581
- if (successHandlerPath !== undefined && isSlackHandler('success', successHandlerPath)) {
582
- successHandlerExtraArgsDerived['slack'] = '$res:f/slack_bot/bot_token';
583
- }
584
- else {
585
- successHandlerExtraArgsDerived['slack'] = undefined;
586
- }
587
522
  return {
588
523
  path: path,
589
524
  schedule: formatCron(schedule),
@@ -595,16 +530,16 @@ function getScheduleCfg() {
595
530
  on_failure: errorHandlerPath ? `${errorHandleritemKind}/${errorHandlerPath}` : undefined,
596
531
  on_failure_times: failedTimes,
597
532
  on_failure_exact: failedExact,
598
- on_failure_extra_args: errorHandlerPath ? errorHadlerExtraArgsDerived : undefined,
533
+ on_failure_extra_args: errorHandlerPath ? errorHandlerExtraArgs : undefined,
599
534
  on_recovery: recoveryHandlerPath
600
535
  ? `${recoveryHandlerItemKind}/${recoveryHandlerPath}`
601
536
  : undefined,
602
537
  on_recovery_times: recoveredTimes,
603
- on_recovery_extra_args: recoveryHandlerPath ? recoveryHandlerExtraArgsDerived : {},
538
+ on_recovery_extra_args: recoveryHandlerPath ? recoveryHandlerExtraArgs : {},
604
539
  on_success: successHandlerPath
605
540
  ? `${successHandlerItemKind}/${successHandlerPath}`
606
541
  : undefined,
607
- on_success_extra_args: successHandlerPath ? successHandlerExtraArgsDerived : {},
542
+ on_success_extra_args: successHandlerPath ? successHandlerExtraArgs : {},
608
543
  ws_error_handler_muted: wsErrorHandlerMuted,
609
544
  retry: retry,
610
545
  summary: summary != '' ? summary : undefined,
@@ -909,14 +844,14 @@ $effect(() => {
909
844
  {/snippet}
910
845
 
911
846
  {#snippet errorHandler()}
912
- <div class="flex flex-col gap-2">
847
+ <div class="flex flex-col gap-2 min-h-96">
913
848
  {#if !loading}
914
849
  <Tabs bind:selected={optionTabSelected}>
915
850
  <Tab value="error_handler">Error Handler</Tab>
916
851
  <Tab value="recovery_handler">Recovery Handler</Tab>
917
852
  <Tab value="success_handler">Success Handler</Tab>
853
+ <Tab value="retries">Retries</Tab>
918
854
  {#if itemKind === 'script'}
919
- <Tab value="retries">Retries</Tab>
920
855
  <Tab value="tag">Custom tag</Tab>
921
856
  {/if}
922
857
  </Tabs>
@@ -966,19 +901,21 @@ $effect(() => {
966
901
  showScriptHelpText={true}
967
902
  bind:handlerSelected={errorHandlerSelected}
968
903
  bind:handlerPath={errorHandlerPath}
969
- customInitialScriptPath={errorHandlerCustomInitialPath}
970
904
  toggleText="Alert channel on error"
971
- customScriptTemplate="/scripts/add?hub=hub%2F9081%2Fwindmill%2Fschedule_error_handler_template"
905
+ customScriptTemplate="/scripts/add?hub=hub%2F19743%2Fwindmill%2Fschedule_error_handler_template"
972
906
  bind:customHandlerKind={errorHandleritemKind}
973
907
  bind:handlerExtraArgs={errorHandlerExtraArgs}
974
908
  >
975
- <!-- @migration-task: migrate this slot by hand, `custom-tab-tooltip` is an invalid identifier -->
976
- <svelte:fragment slot="custom-tab-tooltip">
909
+ {#snippet customTabTooltip()}
977
910
  <Tooltip>
978
911
  <div class="flex gap-20 items-start mt-3">
979
912
  <div class="text-sm"
980
913
  >The following args will be passed to the error handler:
981
914
  <ul class="mt-1 ml-2">
915
+ <li
916
+ ><b>workspace_id</b>: The ID of the workspace that the schedule belongs to.</li
917
+ >
918
+ <li><b>job_id</b>: The UUID of the job that errored.</li>
982
919
  <li><b>path</b>: The path of the script or flow that failed.</li>
983
920
  <li><b>is_flow</b>: Whether the runnable is a flow.</li>
984
921
  <li><b>schedule_path</b>: The path of the schedule.</li>
@@ -992,7 +929,7 @@ $effect(() => {
992
929
  </div>
993
930
  </div>
994
931
  </Tooltip>
995
- </svelte:fragment>
932
+ {/snippet}
996
933
  </ErrorOrRecoveryHandler>
997
934
  <div class="flex flex-row items-center justify-between">
998
935
  <div class="flex flex-row items-center mt-4 font-semibold text-sm gap-2">
@@ -1057,14 +994,12 @@ $effect(() => {
1057
994
  errorOrRecovery="recovery"
1058
995
  bind:handlerSelected={recoveryHandlerSelected}
1059
996
  bind:handlerPath={recoveryHandlerPath}
1060
- customInitialScriptPath={recoveryHandlerCustomInitialPath}
1061
997
  toggleText="Alert channel when error recovered"
1062
998
  customScriptTemplate="/scripts/add?hub=hub%2F9082%2Fwindmill%2Fschedule_recovery_handler_template"
1063
999
  bind:customHandlerKind={recoveryHandlerItemKind}
1064
1000
  bind:handlerExtraArgs={recoveryHandlerExtraArgs}
1065
1001
  >
1066
- <!-- @migration-task: migrate this slot by hand, `custom-tab-tooltip` is an invalid identifier -->
1067
- <svelte:fragment slot="custom-tab-tooltip">
1002
+ {#snippet customTabTooltip()}
1068
1003
  <Tooltip>
1069
1004
  <div class="flex gap-20 items-start mt-3">
1070
1005
  <div class=" text-sm"
@@ -1089,7 +1024,7 @@ $effect(() => {
1089
1024
  </div>
1090
1025
  </div>
1091
1026
  </Tooltip>
1092
- </svelte:fragment>
1027
+ {/snippet}
1093
1028
  </ErrorOrRecoveryHandler>
1094
1029
  <div class="flex flex-row items-center justify-between">
1095
1030
  <div
@@ -1148,14 +1083,12 @@ $effect(() => {
1148
1083
  errorOrRecovery="success"
1149
1084
  bind:handlerSelected={successHandlerSelected}
1150
1085
  bind:handlerPath={successHandlerPath}
1151
- customInitialScriptPath={successHandlerCustomInitialPath}
1152
1086
  toggleText="Alert channel when successful"
1153
1087
  customScriptTemplate="/scripts/add?hub=hub%2F9071%2Fwindmill%2Fschedule_success_handler_template"
1154
1088
  bind:customHandlerKind={successHandlerItemKind}
1155
1089
  bind:handlerExtraArgs={successHandlerExtraArgs}
1156
1090
  >
1157
- <!-- @migration-task: migrate this slot by hand, `custom-tab-tooltip` is an invalid identifier -->
1158
- <svelte:fragment slot="custom-tab-tooltip">
1091
+ {#snippet customTabTooltip()}
1159
1092
  <Tooltip>
1160
1093
  <div class="flex gap-20 items-start mt-3">
1161
1094
  <div class=" text-sm"
@@ -1170,7 +1103,7 @@ $effect(() => {
1170
1103
  </div>
1171
1104
  </div>
1172
1105
  </Tooltip>
1173
- </svelte:fragment>
1106
+ {/snippet}
1174
1107
  </ErrorOrRecoveryHandler>
1175
1108
  </Section>
1176
1109
  {:else if optionTabSelected === 'retries'}
@@ -1188,7 +1121,20 @@ $effect(() => {
1188
1121
  step in the flow editor.
1189
1122
  </Tooltip>
1190
1123
  {/snippet}
1191
- <FlowRetries bind:flowModuleRetry={retry} disabled={itemKind !== 'script' || disabled} />
1124
+ {#if itemKind !== 'script'}
1125
+ <Alert type="info" title="Only available for scripts" class="mb-2">
1126
+ Error Handler and Retries are only available for scripts. For flows, use the built-in <a
1127
+ href="https://www.windmill.dev/docs/flows/flow_error_handler"
1128
+ target="_blank">error handler</a
1129
+ >
1130
+ and <a href="https://www.windmill.dev/docs/flows/retries" target="_blank">retries</a>.
1131
+ </Alert>
1132
+ {:else}
1133
+ <FlowRetries
1134
+ bind:flowModuleRetry={retry}
1135
+ disabled={itemKind !== 'script' || disabled}
1136
+ />
1137
+ {/if}
1192
1138
  </Section>
1193
1139
  {:else if optionTabSelected === 'tag'}
1194
1140
  <Section
@@ -1224,16 +1170,16 @@ $effect(() => {
1224
1170
  </Drawer>
1225
1171
  {:else}
1226
1172
  <Section label={!customLabel ? 'Schedule' : ''} headerClass="grow min-w-0 h-[30px]">
1227
- <svelte:fragment slot="header">
1173
+ {#snippet header()}
1228
1174
  {#if customLabel}
1229
1175
  {@render customLabel()}
1230
1176
  {/if}
1231
- </svelte:fragment>
1232
- <svelte:fragment slot="action">
1177
+ {/snippet}
1178
+ {#snippet action()}
1233
1179
  <div class="flex flex-row gap-2 items-center">
1234
1180
  {@render saveButton()}
1235
1181
  </div>
1236
- </svelte:fragment>
1182
+ {/snippet}
1237
1183
  {#if docDescription}
1238
1184
  {@render docDescription()}
1239
1185
  {/if}
@@ -14,7 +14,10 @@ import Required from '../../Required.svelte';
14
14
  import { untrack } from 'svelte';
15
15
  import TriggerEditorToolbar from '../TriggerEditorToolbar.svelte';
16
16
  import { saveSqsTriggerFromCfg } from './utils';
17
- import { handleConfigChange } from '../utils';
17
+ import { getHandlerType, handleConfigChange } from '../utils';
18
+ import Tabs from '../../common/tabs/Tabs.svelte';
19
+ import Tab from '../../common/tabs/Tab.svelte';
20
+ import TriggerRetriesAndErrorHandler from '../TriggerRetriesAndErrorHandler.svelte';
18
21
  let { useDrawer = true, description = undefined, hideTarget = false, hideTooltips = false, allowDraft = false, trigger = undefined, isEditor = false, customLabel = undefined, isDeployed = false, cloudDisabled = false, onConfigChange = undefined, onCaptureConfigChange = undefined, onUpdate = undefined, onDelete = undefined, onReset = undefined } = $props();
19
22
  let drawer = $state(undefined);
20
23
  let is_flow = $state(false);
@@ -38,6 +41,11 @@ let aws_auth_resource_type = $state('credentials');
38
41
  let isValid = $state(false);
39
42
  let initialConfig = undefined;
40
43
  let deploymentLoading = $state(false);
44
+ let optionTabSelected = $state('error_handler');
45
+ let errorHandlerSelected = $state('slack');
46
+ let error_handler_path = $state();
47
+ let error_handler_args = $state({});
48
+ let retry = $state();
41
49
  const sqsConfig = $derived.by(getSaveCfg);
42
50
  const captureConfig = $derived.by(getCaptureConfig);
43
51
  const saveDisabled = $derived(pathError != '' || emptyString(script_path) || !isValid || !can_write);
@@ -87,6 +95,10 @@ export async function openNew(nis_flow, fixedScriptPath_, defaultValues) {
87
95
  edit = false;
88
96
  dirtyPath = false;
89
97
  enabled = defaultValues?.enabled ?? false;
98
+ error_handler_path = defaultValues?.error_handler_path ?? undefined;
99
+ error_handler_args = defaultValues?.error_handler_args ?? {};
100
+ retry = defaultValues?.retry ?? undefined;
101
+ errorHandlerSelected = getHandlerType(error_handler_path ?? '');
90
102
  }
91
103
  finally {
92
104
  initialConfig = structuredClone($state.snapshot(getSaveCfg()));
@@ -107,6 +119,10 @@ async function loadTriggerConfig(cfg) {
107
119
  enabled = cfg?.enabled;
108
120
  aws_auth_resource_type = cfg?.aws_auth_resource_type;
109
121
  can_write = canWrite(cfg?.path, cfg?.extra_perms, $userStore);
122
+ error_handler_path = cfg?.error_handler_path;
123
+ error_handler_args = cfg?.error_handler_args ?? {};
124
+ retry = cfg?.retry;
125
+ errorHandlerSelected = getHandlerType(error_handler_path ?? '');
110
126
  }
111
127
  catch (error) {
112
128
  sendUserToast(`Could not load SQS trigger config: ${error.body}`, true);
@@ -139,7 +155,10 @@ function getSaveCfg() {
139
155
  queue_url,
140
156
  message_attributes,
141
157
  aws_auth_resource_type,
142
- enabled
158
+ enabled,
159
+ error_handler_path,
160
+ error_handler_args,
161
+ retry
143
162
  };
144
163
  }
145
164
  async function handleToggleEnabled(nEnabled) {
@@ -201,14 +220,14 @@ $effect(() => {
201
220
  </Drawer>
202
221
  {:else}
203
222
  <Section label={!customLabel ? 'SQS trigger' : ''} headerClass="grow min-w-0 h-[30px]">
204
- <svelte:fragment slot="header">
223
+ {#snippet header()}
205
224
  {#if customLabel}
206
225
  {@render customLabel()}
207
226
  {/if}
208
- </svelte:fragment>
209
- <svelte:fragment slot="action">
227
+ {/snippet}
228
+ {#snippet action()}
210
229
  {@render actionsSnippet()}
211
- </svelte:fragment>
230
+ {/snippet}
212
231
  {@render config()}
213
232
  </Section>
214
233
  {/if}
@@ -313,6 +332,28 @@ $effect(() => {
313
332
  headless={true}
314
333
  showTestingBadge={isEditor}
315
334
  />
335
+
336
+ <Section label="Advanced" collapsable>
337
+ <div class="flex flex-col gap-4">
338
+ <div class="min-h-96">
339
+ <Tabs bind:selected={optionTabSelected}>
340
+ <Tab value="error_handler">Error Handler</Tab>
341
+ <Tab value="retries">Retries</Tab>
342
+ </Tabs>
343
+ <div class="mt-4">
344
+ <TriggerRetriesAndErrorHandler
345
+ {optionTabSelected}
346
+ {itemKind}
347
+ {can_write}
348
+ bind:errorHandlerSelected
349
+ bind:error_handler_path
350
+ bind:error_handler_args
351
+ bind:retry
352
+ />
353
+ </div>
354
+ </div>
355
+ </div>
356
+ </Section>
316
357
  </div>
317
358
  {/if}
318
359
  {/snippet}
@@ -2,6 +2,13 @@ import { SqsTriggerService } from '../../../gen';
2
2
  import { sendUserToast } from '../../../toast';
3
3
  import { get } from 'svelte/store';
4
4
  export async function saveSqsTriggerFromCfg(initialPath, cfg, edit, workspace, usedTriggerKinds) {
5
+ const errorHandlerAndRetries = !cfg.is_flow
6
+ ? {
7
+ error_handler_path: cfg.error_handler_path,
8
+ error_handler_args: cfg.error_handler_path ? cfg.error_handler_args : undefined,
9
+ retry: cfg.retry
10
+ }
11
+ : {};
5
12
  const requestBody = {
6
13
  path: cfg.path,
7
14
  script_path: cfg.script_path,
@@ -10,7 +17,8 @@ export async function saveSqsTriggerFromCfg(initialPath, cfg, edit, workspace, u
10
17
  queue_url: cfg.queue_url,
11
18
  message_attributes: cfg.message_attributes,
12
19
  aws_auth_resource_type: cfg.aws_auth_resource_type,
13
- enabled: cfg.enabled
20
+ enabled: cfg.enabled,
21
+ ...errorHandlerAndRetries
14
22
  };
15
23
  try {
16
24
  if (edit) {
@@ -395,3 +395,15 @@ export function filterDraftTriggers(savedValue, triggersState) {
395
395
  }));
396
396
  return newSavedValue;
397
397
  }
398
+ export function getHandlerType(scriptPath) {
399
+ const handlerMap = {
400
+ teams: '/workspace-or-schedule-error-handler-teams',
401
+ slack: '/workspace-or-schedule-error-handler-slack'
402
+ };
403
+ for (const [type, suffix] of Object.entries(handlerMap)) {
404
+ if (scriptPath.startsWith('hub/') && scriptPath.endsWith(suffix)) {
405
+ return type;
406
+ }
407
+ }
408
+ return 'custom';
409
+ }