windmill-components 1.504.5 → 1.510.1

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 (202) hide show
  1. package/package/ata/index.js +1 -1
  2. package/package/components/AppConnectInner.svelte +161 -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 +7 -4
  10. package/package/components/EditorBar.svelte +2 -2
  11. package/package/components/ErrorOrRecoveryHandler.svelte +73 -67
  12. package/package/components/ErrorOrRecoveryHandler.svelte.d.ts +8 -24
  13. package/package/components/FlowBuilder.svelte +11 -2
  14. package/package/components/FlowJobResult.svelte +12 -17
  15. package/package/components/FlowJobResult.svelte.d.ts +5 -18
  16. package/package/components/FlowPreviewContent.svelte +13 -10
  17. package/package/components/FlowPreviewContent.svelte.d.ts +1 -1
  18. package/package/components/FlowPreviewResult.svelte +14 -6
  19. package/package/components/FlowStatusViewer.svelte +11 -24
  20. package/package/components/FlowStatusViewer.svelte.d.ts +19 -18
  21. package/package/components/FlowStatusViewerInner.svelte +110 -131
  22. package/package/components/FlowStatusViewerInner.svelte.d.ts +20 -18
  23. package/package/components/GitDiffPreview.svelte +55 -0
  24. package/package/components/GitDiffPreview.svelte.d.ts +13 -0
  25. package/package/components/HistoricInputs.svelte +2 -2
  26. package/package/components/InitGitRepoPopover.svelte +410 -0
  27. package/package/components/InitGitRepoPopover.svelte.d.ts +13 -0
  28. package/package/components/InstanceSetting.svelte +21 -9
  29. package/package/components/InstanceSettings.svelte +16 -3
  30. package/package/components/JobLoader.svelte +567 -0
  31. package/package/components/JobLoader.svelte.d.ts +53 -0
  32. package/package/components/JobLogs.svelte +6 -4
  33. package/package/components/JobLogs.svelte.d.ts +5 -18
  34. package/package/components/LightweightResourcePicker.svelte +18 -39
  35. package/package/components/LightweightResourcePicker.svelte.d.ts +6 -22
  36. package/package/components/LogViewer.svelte +35 -41
  37. package/package/components/LogViewer.svelte.d.ts +6 -20
  38. package/package/components/ModulePreviewResultViewer.svelte +3 -1
  39. package/package/components/ModulePreviewResultViewer.svelte.d.ts +1 -0
  40. package/package/components/ModuleTest.svelte +16 -11
  41. package/package/components/PullGitRepoPopover.svelte +355 -0
  42. package/package/components/PullGitRepoPopover.svelte.d.ts +18 -0
  43. package/package/components/S3FilePicker.svelte +5 -3
  44. package/package/components/SavedInputs.svelte +2 -2
  45. package/package/components/ScriptBuilder.svelte +4 -3
  46. package/package/components/ScriptEditor.svelte +34 -31
  47. package/package/components/ScriptEditor.svelte.d.ts +3 -3
  48. package/package/components/ServiceLogsInner.svelte +2 -1
  49. package/package/components/ServiceLogsInner.svelte.d.ts +1 -0
  50. package/package/components/UserSettings.svelte +1 -1
  51. package/package/components/WorkerTagSelect.svelte +32 -3
  52. package/package/components/apps/components/buttons/AppButton.svelte +7 -1
  53. package/package/components/apps/components/buttons/AppButton.svelte.d.ts +1 -0
  54. package/package/components/apps/components/display/AppCustomComponent.svelte +1 -1
  55. package/package/components/apps/components/display/AppDisplayComponentByJobId.svelte +16 -11
  56. package/package/components/apps/components/display/AppJobIdLogComponent.svelte +13 -10
  57. package/package/components/apps/components/display/AppMenu.svelte +5 -0
  58. package/package/components/apps/components/display/dbtable/AppDbExplorer.svelte +3 -3
  59. package/package/components/apps/components/display/dbtable/DeleteRow.svelte +3 -3
  60. package/package/components/apps/components/display/dbtable/InsertRowRunnable.svelte +3 -3
  61. package/package/components/apps/components/display/dbtable/UpdateCell.svelte +3 -3
  62. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +3 -3
  63. package/package/components/apps/components/helpers/RunnableComponent.svelte +65 -54
  64. package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +5 -5
  65. package/package/components/apps/components/inputs/AppUserResource.svelte +26 -8
  66. package/package/components/apps/editor/AppEditorHeader.svelte +11 -5
  67. package/package/components/apps/editor/AppJobsDrawer.svelte +5 -5
  68. package/package/components/apps/editor/RunnableJobPanel.svelte +4 -4
  69. package/package/components/apps/editor/component/components.d.ts +12 -0
  70. package/package/components/apps/editor/component/components.js +19 -7
  71. package/package/components/assets/AssetButtons.svelte +38 -0
  72. package/package/components/assets/AssetButtons.svelte.d.ts +15 -0
  73. package/package/components/assets/AssetsDropdownButton.svelte +60 -72
  74. package/package/components/assets/AssetsDropdownButton.svelte.d.ts +3 -4
  75. package/package/components/assets/AssetsUsageDrawer.svelte +10 -10
  76. package/package/components/assets/JobAssetsViewer.svelte +79 -0
  77. package/package/components/assets/JobAssetsViewer.svelte.d.ts +7 -0
  78. package/package/components/assets/README_DEV.md +0 -0
  79. package/package/components/assets/lib.d.ts +9 -1
  80. package/package/components/assets/lib.js +48 -7
  81. package/package/components/common/fileUpload/FileUpload.svelte +126 -84
  82. package/package/components/common/fileUpload/FileUpload.svelte.d.ts +13 -3
  83. package/package/components/common/fileUpload/S3ArgInput.svelte +111 -0
  84. package/package/components/common/fileUpload/S3ArgInput.svelte.d.ts +21 -0
  85. package/package/components/common/table/ScriptRow.svelte +3 -1
  86. package/package/components/copilot/autocomplete/Autocompletor.js +23 -5
  87. package/package/components/copilot/chat/AIChatDisplay.svelte +8 -0
  88. package/package/components/copilot/chat/AIChatManager.svelte.js +13 -8
  89. package/package/components/copilot/chat/flow/ModuleAcceptReject.svelte +5 -5
  90. package/package/components/copilot/chat/flow/core.d.ts +1 -1
  91. package/package/components/copilot/chat/flow/core.js +2 -38
  92. package/package/components/copilot/chat/navigator/apiTools.d.ts +8 -0
  93. package/package/components/copilot/chat/navigator/apiTools.js +95 -15
  94. package/package/components/copilot/chat/navigator/core.d.ts +1 -1
  95. package/package/components/copilot/chat/navigator/core.js +2 -1
  96. package/package/components/copilot/chat/script/core.d.ts +11 -2
  97. package/package/components/copilot/chat/script/core.js +135 -1
  98. package/package/components/copilot/chat/shared.d.ts +10 -0
  99. package/package/components/copilot/chat/shared.js +56 -0
  100. package/package/components/copilot/lib.d.ts +1 -0
  101. package/package/components/copilot/lib.js +27 -9
  102. package/package/components/custom_ui.d.ts +1 -0
  103. package/package/components/flows/FlowAssetsHandler.svelte +133 -0
  104. package/package/components/flows/FlowAssetsHandler.svelte.d.ts +14 -0
  105. package/package/components/flows/content/FlowModuleComponent.svelte +16 -18
  106. package/package/components/flows/flowStore.d.ts +1 -1
  107. package/package/components/flows/map/FlowModuleSchemaItem.svelte +1 -0
  108. package/package/components/flows/propPicker/OutputPicker.svelte +9 -4
  109. package/package/components/flows/scheduleUtils.js +1 -1
  110. package/package/components/flows/types.d.ts +2 -1
  111. package/package/components/graph/FlowGraphV2.svelte +8 -104
  112. package/package/components/graph/FlowGraphV2.svelte.d.ts +0 -2
  113. package/package/components/graph/graphBuilder.svelte.d.ts +6 -3
  114. package/package/components/graph/graphBuilder.svelte.js +35 -9
  115. package/package/components/graph/renderers/edges/BaseEdge.svelte +2 -5
  116. package/package/components/graph/renderers/edges/BaseEdge.svelte.d.ts +1 -0
  117. package/package/components/graph/renderers/nodes/AssetNode.svelte +23 -20
  118. package/package/components/graph/renderers/nodes/AssetNode.svelte.d.ts +5 -10
  119. package/package/components/graph/renderers/nodes/AssetsOverflowedNode.svelte +1 -1
  120. package/package/components/graph/util.js +1 -1
  121. package/package/components/home/ItemsList.svelte +2 -0
  122. package/package/components/icons/AssetGenericIcon.svelte +0 -3
  123. package/package/components/jobs/JobPreview.svelte +10 -6
  124. package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte +13 -12
  125. package/package/components/runs/BatchReRunOptionsPane.svelte +5 -1
  126. package/package/components/runs/JobPreview.svelte +26 -16
  127. package/package/components/runs/{JobLoader.svelte.d.ts → JobsLoader.svelte.d.ts} +3 -3
  128. package/package/components/runs/NoWorkerWithTagWarning.svelte +2 -2
  129. package/package/components/runs/NoWorkerWithTagWarning.svelte.d.ts +1 -0
  130. package/package/components/runs/RunsFilter.svelte.d.ts +1 -1
  131. package/package/components/schema/AddPropertyFormV2.svelte +42 -33
  132. package/package/components/schema/AddPropertyFormV2.svelte.d.ts +1 -0
  133. package/package/components/schema/AddPropertyV2.svelte +2 -1
  134. package/package/components/schema/AddPropertyV2.svelte.d.ts +1 -0
  135. package/package/components/schema/EditableSchemaWrapper.svelte +3 -1
  136. package/package/components/schema/editable_schema_wrapper.d.ts +3 -0
  137. package/package/components/scriptEditor/LogPanel.svelte +3 -2
  138. package/package/components/script_builder.d.ts +2 -2
  139. package/package/components/settings/CreateToken.svelte +76 -41
  140. package/package/components/settings/CreateToken.svelte.d.ts +1 -1
  141. package/package/components/settings/ScopeSelector.svelte +613 -0
  142. package/package/components/settings/ScopeSelector.svelte.d.ts +8 -0
  143. package/package/components/settings/TokenDisplay.svelte +103 -0
  144. package/package/components/settings/TokenDisplay.svelte.d.ts +10 -0
  145. package/package/components/settings/TokensTable.svelte +70 -349
  146. package/package/components/sidebar/CriticalAlertModal.svelte +3 -0
  147. package/package/components/triggers/DeleteTriggerButton.svelte +1 -1
  148. package/package/components/triggers/TriggerEditorToolbar.svelte +3 -3
  149. package/package/components/triggers/TriggerRetriesAndErrorHandler.svelte +55 -0
  150. package/package/components/triggers/TriggerRetriesAndErrorHandler.svelte.d.ts +13 -0
  151. package/package/components/triggers/TriggersEditor.svelte +45 -3
  152. package/package/components/triggers/TriggersWrapper.svelte +2 -2
  153. package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +43 -2
  154. package/package/components/triggers/gcp/utils.js +9 -1
  155. package/package/components/triggers/http/OpenAPISpecGenerator.svelte +1 -0
  156. package/package/components/triggers/http/RouteEditorInner.svelte +208 -164
  157. package/package/components/triggers/http/RouteEditorInner.svelte.d.ts +6 -2
  158. package/package/components/triggers/http/utils.js +9 -3
  159. package/package/components/triggers/kafka/KafkaTriggerEditorInner.svelte +43 -2
  160. package/package/components/triggers/kafka/utils.js +9 -1
  161. package/package/components/triggers/mqtt/MqttEditorConfigSection.svelte +4 -132
  162. package/package/components/triggers/mqtt/MqttEditorConfigSection.svelte.d.ts +2 -5
  163. package/package/components/triggers/mqtt/MqttTriggerEditorInner.svelte +178 -9
  164. package/package/components/triggers/mqtt/utils.js +9 -1
  165. package/package/components/triggers/nats/NatsTriggerEditorInner.svelte +43 -2
  166. package/package/components/triggers/nats/utils.js +9 -1
  167. package/package/components/triggers/postgres/PostgresTriggerEditorInner.svelte +41 -2
  168. package/package/components/triggers/postgres/utils.js +9 -1
  169. package/package/components/triggers/schedules/ScheduleEditorInner.svelte +34 -88
  170. package/package/components/triggers/sqs/SqsTriggerEditorInner.svelte +43 -2
  171. package/package/components/triggers/sqs/utils.js +9 -1
  172. package/package/components/triggers/utils.js +12 -0
  173. package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +43 -2
  174. package/package/components/triggers/websocket/utils.js +11 -1
  175. package/package/components/workspaceSettings/AISettings.svelte +0 -2
  176. package/package/components/workspaceSettings/FilterList.svelte +56 -0
  177. package/package/components/workspaceSettings/FilterList.svelte.d.ts +8 -0
  178. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte +785 -0
  179. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte.d.ts +18 -0
  180. package/package/gen/core/OpenAPI.js +1 -1
  181. package/package/gen/schemas.gen.d.ts +305 -23
  182. package/package/gen/schemas.gen.js +305 -23
  183. package/package/gen/services.gen.d.ts +33 -1
  184. package/package/gen/services.gen.js +66 -2
  185. package/package/gen/types.gen.d.ts +216 -11
  186. package/package/history.svelte.js +0 -2
  187. package/package/hub.d.ts +1 -0
  188. package/package/hubPaths.json +5 -2
  189. package/package/infer.js +16 -10
  190. package/package/svelte5Utils.svelte.d.ts +1 -0
  191. package/package/svelte5Utils.svelte.js +25 -18
  192. package/package/toast.js +10 -0
  193. package/package/utils.d.ts +3 -2
  194. package/package/utils.js +20 -5
  195. package/package.json +11 -11
  196. package/package/components/ResultJobLoader.svelte +0 -219
  197. package/package/components/ResultJobLoader.svelte.d.ts +0 -52
  198. package/package/components/TestJobLoader.svelte +0 -274
  199. package/package/components/TestJobLoader.svelte.d.ts +0 -43
  200. package/package/components/icons/AssetVarIcon.svelte +0 -31
  201. package/package/components/icons/AssetVarIcon.svelte.d.ts +0 -9
  202. /package/package/components/runs/{JobLoader.svelte → JobsLoader.svelte} +0 -0
@@ -30,9 +30,12 @@ import { HubFlow } from '../../../hub';
30
30
  import RouteBodyTransformerOption from './RouteBodyTransformerOption.svelte';
31
31
  import TestingBadge from '../testingBadge.svelte';
32
32
  import TriggerEditorToolbar from '../TriggerEditorToolbar.svelte';
33
- import { handleConfigChange } from '../utils';
33
+ import { getHandlerType, handleConfigChange } from '../utils';
34
34
  import autosize from '../../../autosize';
35
35
  import { untrack } from 'svelte';
36
+ import Tabs from '../../common/tabs/Tabs.svelte';
37
+ import Tab from '../../common/tabs/Tab.svelte';
38
+ import TriggerRetriesAndErrorHandler from '../TriggerRetriesAndErrorHandler.svelte';
36
39
  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();
37
40
  // Form data state
38
41
  let initialPath = $state('');
@@ -66,6 +69,9 @@ let can_write = $state(true);
66
69
  let extraPerms = $state(undefined);
67
70
  let summary = $state();
68
71
  let routeDescription = $state();
72
+ let error_handler_path = $state();
73
+ let error_handler_args = $state({});
74
+ let retry = $state();
69
75
  // Component references
70
76
  let s3FilePicker = $state(null);
71
77
  let s3Editor = $state(null);
@@ -74,6 +80,8 @@ let variableEditor = $state(null);
74
80
  let drawer = $state(null);
75
81
  let initialConfig = undefined;
76
82
  let deploymentLoading = $state(false);
83
+ let optionTabSelected = $state('request_options');
84
+ let errorHandlerSelected = $state('slack');
77
85
  const isAdmin = $derived($userStore?.is_admin || $userStore?.is_super_admin);
78
86
  const routeConfig = $derived.by(getRouteConfig);
79
87
  const captureConfig = $derived.by(isEditor ? getCaptureConfig : () => ({}));
@@ -182,6 +190,10 @@ export async function openNew(nis_flow, fixedScriptPath_, defaultValues) {
182
190
  wrap_body = defaultValues?.wrap_body ?? false;
183
191
  summary = defaultValues?.summary ?? '';
184
192
  routeDescription = defaultValues?.description ?? '';
193
+ error_handler_path = defaultValues?.error_handler_path ?? undefined;
194
+ error_handler_args = defaultValues?.error_handler_args ?? {};
195
+ retry = defaultValues?.retry ?? undefined;
196
+ errorHandlerSelected = getHandlerType(error_handler_path ?? '');
185
197
  }
186
198
  finally {
187
199
  clearTimeout(loader);
@@ -190,34 +202,38 @@ export async function openNew(nis_flow, fixedScriptPath_, defaultValues) {
190
202
  }
191
203
  }
192
204
  function loadTriggerConfig(cfg) {
193
- script_path = cfg?.script_path;
194
- initialScriptPath = cfg?.script_path;
195
- is_flow = cfg?.is_flow;
196
- path = cfg?.path;
197
- route_path = cfg?.route_path;
205
+ script_path = cfg?.script_path ?? '';
206
+ initialScriptPath = cfg?.script_path ?? '';
207
+ is_flow = cfg?.is_flow ?? false;
208
+ path = cfg?.path ?? '';
209
+ route_path = cfg?.route_path ?? '';
198
210
  http_method = cfg?.http_method ?? 'post';
199
- is_async = cfg?.is_async;
200
- workspaced_route = cfg?.workspaced_route;
201
- wrap_body = cfg?.wrap_body;
202
- raw_string = cfg?.raw_string;
203
- summary = cfg?.summary;
204
- routeDescription = cfg?.description;
211
+ is_async = cfg?.is_async ?? false;
212
+ workspaced_route = cfg?.workspaced_route ?? false;
213
+ wrap_body = cfg?.wrap_body ?? false;
214
+ raw_string = cfg?.raw_string ?? false;
215
+ summary = cfg?.summary ?? '';
216
+ routeDescription = cfg?.description ?? '';
205
217
  authentication_resource_path = cfg?.authentication_resource_path ?? '';
206
218
  if (cfg?.authentication_method === 'custom_script') {
207
219
  authentication_method = 'signature';
208
220
  signature_options_type = 'custom_script';
209
221
  }
210
222
  else {
211
- authentication_method = cfg?.authentication_method;
223
+ authentication_method = cfg?.authentication_method ?? 'none';
212
224
  signature_options_type = 'custom_signature';
213
225
  }
214
226
  if (!isCloudHosted()) {
215
227
  static_asset_config = cfg?.static_asset_config;
216
228
  s3FileUploadRawMode = !!cfg?.static_asset_config;
217
- is_static_website = cfg?.is_static_website;
229
+ is_static_website = cfg?.is_static_website ?? false;
218
230
  }
219
- extraPerms = cfg?.extra_perms;
220
- can_write = canWrite(path, cfg?.extra_perms, $userStore);
231
+ extraPerms = cfg?.extra_perms ?? undefined;
232
+ can_write = canWrite(path, cfg?.extra_perms ?? {}, $userStore);
233
+ error_handler_path = cfg?.error_handler_path;
234
+ error_handler_args = cfg?.error_handler_args ?? {};
235
+ retry = cfg?.retry;
236
+ errorHandlerSelected = getHandlerType(error_handler_path ?? '');
221
237
  }
222
238
  async function loadTrigger(defaultConfig) {
223
239
  if (defaultConfig) {
@@ -271,7 +287,10 @@ function getRouteConfig() {
271
287
  is_static_website,
272
288
  extra_perms: extraPerms,
273
289
  summary,
274
- description: routeDescription
290
+ description: routeDescription,
291
+ error_handler_path,
292
+ error_handler_args,
293
+ retry
275
294
  };
276
295
  return nCfg;
277
296
  }
@@ -413,7 +432,6 @@ $effect(() => {
413
432
  disabled={!can_write}
414
433
  />
415
434
  {/if}
416
- {s3FileUploadRawMode}
417
435
  {#if s3FileUploadRawMode}
418
436
  {#if can_write}
419
437
  <JsonEditor
@@ -515,175 +533,201 @@ $effect(() => {
515
533
  {#if !is_static_website}
516
534
  <Section label="Advanced" collapsable>
517
535
  <div class="flex flex-col gap-4">
518
- {#if !static_asset_config}
519
- <div class="flex flex-row justify-between">
520
- <Label label="Request type" class="w-full">
521
- <svelte:fragment slot="action">
522
- <ToggleButtonGroup
523
- class="w-auto h-full"
524
- selected={is_async ? 'async' : 'sync'}
525
- on:selected={({ detail }) => {
526
- is_async = detail === 'async'
527
- }}
528
- disabled={!can_write || !!static_asset_config}
529
- >
530
- {#snippet children({ item, disabled })}
531
- <ToggleButton
532
- label="Async"
533
- value="async"
534
- tooltip="The returning value is the uuid of the job assigned to execute the job."
535
- {item}
536
- {disabled}
537
- />
538
- <ToggleButton
539
- label="Sync"
540
- value="sync"
541
- tooltip="Triggers the execution, wait for the job to complete and return it as a response."
542
- {item}
543
- {disabled}
544
- />
545
- {/snippet}
546
- </ToggleButtonGroup>
547
- </svelte:fragment>
548
- </Label>
549
- </div>
550
- {/if}
551
- <Label label="Authentication" class="w-full">
552
- <svelte:fragment slot="action">
553
- <ToggleButtonGroup
554
- class="w-auto h-full"
555
- bind:selected={authentication_method}
556
- on:selected={(e) => {
557
- if (e.detail === 'signature' && signature_options_type === 'custom_script') {
558
- raw_string = true
559
- }
560
- }}
561
- disabled={!can_write}
562
- >
563
- {#snippet children({ item, disabled })}
564
- {#each authentication_options as option}
565
- {#if option.value === 'signature'}
566
- <Popover placement="top-end" usePointerDownOutside>
567
- <svelte:fragment slot="trigger">
568
- <ToggleButton
569
- label={option.label}
570
- value={option.value}
571
- tooltip={option.tooltip}
572
- {item}
573
- {disabled}
574
- />
575
- </svelte:fragment>
576
- <svelte:fragment slot="content">
536
+ <div class="min-h-96">
537
+ <Tabs bind:selected={optionTabSelected}>
538
+ <Tab value="request_options">Request Options</Tab>
539
+ <Tab value="error_handler">Error Handler</Tab>
540
+ <Tab value="retries">Retries</Tab>
541
+ </Tabs>
542
+ <div class="mt-4">
543
+ {#if optionTabSelected === 'request_options'}
544
+ <div class="flex flex-col gap-4">
545
+ {#if !static_asset_config}
546
+ <div class="flex flex-row justify-between">
547
+ <Label label="Request type" class="w-full">
548
+ <svelte:fragment slot="action">
577
549
  <ToggleButtonGroup
578
550
  class="w-auto h-full"
579
- bind:selected={signature_options_type}
580
- on:selected={(e) => {
581
- if (e.detail === 'custom_script') {
582
- if (!raw_string) {
583
- raw_string = true
584
- }
585
- }
551
+ selected={is_async ? 'async' : 'sync'}
552
+ on:selected={({ detail }) => {
553
+ is_async = detail === 'async'
586
554
  }}
587
- disabled={!can_write}
555
+ disabled={!can_write || !!static_asset_config}
588
556
  >
589
557
  {#snippet children({ item, disabled })}
590
558
  <ToggleButton
591
- label="Signature validation"
592
- value="custom_signature"
593
- tooltip="Use a predefined or custom signature-based authentication scheme"
559
+ label="Async"
560
+ value="async"
561
+ tooltip="The returning value is the uuid of the job assigned to execute the job."
594
562
  {item}
595
563
  {disabled}
596
564
  />
597
565
  <ToggleButton
598
- label="Custom script"
599
- value="custom_script"
600
- tooltip="Use your own script logic"
566
+ label="Sync"
567
+ value="sync"
568
+ tooltip="Triggers the execution, wait for the job to complete and return it as a response."
601
569
  {item}
602
570
  {disabled}
603
571
  />
604
572
  {/snippet}
605
573
  </ToggleButtonGroup>
606
574
  </svelte:fragment>
607
- </Popover>
608
- {:else}
609
- <ToggleButton
610
- label={option.label}
611
- value={option.value}
612
- tooltip={option.tooltip}
613
- {item}
614
- {disabled}
575
+ </Label>
576
+ </div>
577
+ {/if}
578
+ <Label label="Authentication" class="w-full">
579
+ <svelte:fragment slot="action">
580
+ <ToggleButtonGroup
581
+ class="w-auto h-full"
582
+ bind:selected={authentication_method}
583
+ on:selected={(e) => {
584
+ if (
585
+ e.detail === 'signature' &&
586
+ signature_options_type === 'custom_script'
587
+ ) {
588
+ raw_string = true
589
+ }
590
+ }}
591
+ disabled={!can_write}
592
+ >
593
+ {#snippet children({ item, disabled })}
594
+ {#each authentication_options as option}
595
+ {#if option.value === 'signature'}
596
+ <Popover placement="top-end" usePointerDownOutside>
597
+ <svelte:fragment slot="trigger">
598
+ <ToggleButton
599
+ label={option.label}
600
+ value={option.value}
601
+ tooltip={option.tooltip}
602
+ {item}
603
+ {disabled}
604
+ />
605
+ </svelte:fragment>
606
+ <svelte:fragment slot="content">
607
+ <ToggleButtonGroup
608
+ class="w-auto h-full"
609
+ bind:selected={signature_options_type}
610
+ on:selected={(e) => {
611
+ if (e.detail === 'custom_script') {
612
+ if (!raw_string) {
613
+ raw_string = true
614
+ }
615
+ }
616
+ }}
617
+ disabled={!can_write}
618
+ >
619
+ {#snippet children({ item, disabled })}
620
+ <ToggleButton
621
+ label="Signature validation"
622
+ value="custom_signature"
623
+ tooltip="Use a predefined or custom signature-based authentication scheme"
624
+ {item}
625
+ {disabled}
626
+ />
627
+ <ToggleButton
628
+ label="Custom script"
629
+ value="custom_script"
630
+ tooltip="Use your own script logic"
631
+ {item}
632
+ {disabled}
633
+ />
634
+ {/snippet}
635
+ </ToggleButtonGroup>
636
+ </svelte:fragment>
637
+ </Popover>
638
+ {:else}
639
+ <ToggleButton
640
+ label={option.label}
641
+ value={option.value}
642
+ tooltip={option.tooltip}
643
+ {item}
644
+ {disabled}
645
+ />
646
+ {/if}
647
+ {/each}
648
+ {/snippet}
649
+ </ToggleButtonGroup>
650
+ </svelte:fragment>
651
+ </Label>
652
+
653
+ {#each authentication_options as option}
654
+ {#if option.resource_type && authentication_method === option.value}
655
+ <ResourcePicker
656
+ bind:value={authentication_resource_path}
657
+ resourceType={option.resource_type}
658
+ disabled={!can_write}
615
659
  />
616
660
  {/if}
617
661
  {/each}
618
- {/snippet}
619
- </ToggleButtonGroup>
620
- </svelte:fragment>
621
- </Label>
622
662
 
623
- {#each authentication_options as option}
624
- {#if option.resource_type && authentication_method === option.value}
625
- <ResourcePicker
626
- bind:value={authentication_resource_path}
627
- resourceType={option.resource_type}
628
- disabled={!can_write}
629
- />
630
- {/if}
631
- {/each}
663
+ {#if authentication_method === 'signature'}
664
+ {#if signature_options_type === 'custom_signature'}
665
+ <ResourcePicker
666
+ bind:value={authentication_resource_path}
667
+ resourceType={'signature_auth'}
668
+ disabled={!can_write}
669
+ />
670
+ {:else if signature_options_type === 'custom_script'}
671
+ <p class="text-xs mt-3 mb-1 text-tertiary">
672
+ Pick a secret variable or create one which will be used as a secret key
673
+ for your custom script/flow<Required required={true} /><br />
674
+ </p>
675
+ <div class="flex flex-row gap-2">
676
+ <div class="flex flex-row gap-2 w-full">
677
+ <input
678
+ type="text"
679
+ autocomplete="off"
680
+ bind:value={variable_path}
681
+ readonly
682
+ disabled={true}
683
+ />
684
+ <Button
685
+ title="Add variable"
686
+ on:click={() => variablePicker?.openDrawer()}
687
+ size="xs"
688
+ color="dark"
689
+ disabled={!can_write}
690
+ >
691
+ Pick variable
692
+ </Button>
693
+ </div>
694
+ <Button
695
+ disabled={emptyString(variable_path) || !can_write}
696
+ color="dark"
697
+ size="xs"
698
+ href={itemKind === 'flow'
699
+ ? `/flows/add?${SECRET_KEY_PATH}=${encodeURIComponent(variable_path)}&hub=${
700
+ HubFlow.SIGNATURE_TEMPLATE
701
+ }`
702
+ : `/scripts/add?${SECRET_KEY_PATH}=${encodeURIComponent(
703
+ variable_path
704
+ )}&hub=hub%2F${HUB_SCRIPT_ID}`}
705
+ target="_blank">Create from template</Button
706
+ >
707
+ </div>
708
+ {/if}
709
+ {/if}
632
710
 
633
- {#if authentication_method === 'signature'}
634
- {#if signature_options_type === 'custom_signature'}
635
- <ResourcePicker
636
- bind:value={authentication_resource_path}
637
- resourceType={'signature_auth'}
638
- disabled={!can_write}
639
- />
640
- {:else if signature_options_type === 'custom_script'}
641
- <p class="text-xs mt-3 mb-1 text-tertiary">
642
- Pick a secret variable or create one which will be used as a secret key for your
643
- custom script/flow<Required required={true} /><br />
644
- </p>
645
- <div class="flex flex-row gap-2">
646
- <div class="flex flex-row gap-2 w-full">
647
- <input
648
- type="text"
649
- autocomplete="off"
650
- bind:value={variable_path}
651
- readonly
652
- disabled={true}
653
- />
654
- <Button
655
- title="Add variable"
656
- on:click={() => variablePicker?.openDrawer()}
657
- size="xs"
658
- color="dark"
711
+ <RouteBodyTransformerOption
712
+ bind:raw_string
713
+ bind:wrap_body
659
714
  disabled={!can_write}
660
- >
661
- Pick variable
662
- </Button>
715
+ {testingBadge}
716
+ />
663
717
  </div>
664
- <Button
665
- disabled={emptyString(variable_path) || !can_write}
666
- color="dark"
667
- size="xs"
668
- href={itemKind === 'flow'
669
- ? `/flows/add?${SECRET_KEY_PATH}=${encodeURIComponent(variable_path)}&hub=${
670
- HubFlow.SIGNATURE_TEMPLATE
671
- }`
672
- : `/scripts/add?${SECRET_KEY_PATH}=${encodeURIComponent(
673
- variable_path
674
- )}&hub=hub%2F${HUB_SCRIPT_ID}`}
675
- target="_blank">Create from template</Button
676
- >
677
- </div>
678
- {/if}
679
- {/if}
680
-
681
- <RouteBodyTransformerOption
682
- bind:raw_string
683
- bind:wrap_body
684
- disabled={!can_write}
685
- {testingBadge}
686
- />
718
+ {:else}
719
+ <TriggerRetriesAndErrorHandler
720
+ {optionTabSelected}
721
+ {itemKind}
722
+ {can_write}
723
+ bind:errorHandlerSelected
724
+ bind:error_handler_path
725
+ bind:error_handler_args
726
+ bind:retry
727
+ />
728
+ {/if}
729
+ </div>
730
+ </div>
687
731
  </div>
688
732
  </Section>
689
733
  {/if}
@@ -1,3 +1,4 @@
1
+ import { type HttpTrigger, type NewHttpTrigger } from '../../../gen';
1
2
  declare const RouteEditorInner: import("svelte").Component<{
2
3
  useDrawer?: boolean;
3
4
  hideTarget?: boolean;
@@ -14,8 +15,11 @@ declare const RouteEditorInner: import("svelte").Component<{
14
15
  trigger?: any;
15
16
  customSaveBehavior?: any;
16
17
  }, {
17
- openEdit: (ePath: string, isFlow: boolean, defaultConfig?: Record<string, any>) => Promise<void>;
18
- openNew: (nis_flow: boolean, fixedScriptPath_?: string, defaultValues?: Record<string, any>) => Promise<void>;
18
+ openEdit: (ePath: string, isFlow: boolean, defaultConfig?: Partial<NewHttpTrigger>) => Promise<void>;
19
+ openNew: (nis_flow: boolean, fixedScriptPath_?: string, defaultValues?: Partial<HttpTrigger> & {
20
+ s3FileUploadRawMode?: boolean;
21
+ signature_options_type?: "custom_script" | "custom_signature";
22
+ }) => Promise<void>;
19
23
  }, "">;
20
24
  type RouteEditorInner = ReturnType<typeof RouteEditorInner>;
21
25
  export default RouteEditorInner;
@@ -25,7 +25,7 @@ export async function saveHttpRouteFromCfg(initialPath, routeCfg, edit, workspac
25
25
  is_flow: routeCfg.is_flow,
26
26
  is_async: routeCfg.is_async,
27
27
  authentication_method: routeCfg.authentication_method,
28
- route_path: isAdmin || !edit ? routeCfg.route_path : undefined,
28
+ route_path: routeCfg.route_path,
29
29
  http_method: routeCfg.http_method,
30
30
  is_static_website: routeCfg.is_static_website,
31
31
  static_asset_config: routeCfg.static_asset_config,
@@ -34,14 +34,20 @@ export async function saveHttpRouteFromCfg(initialPath, routeCfg, edit, workspac
34
34
  wrap_body: routeCfg.wrap_body,
35
35
  raw_string: routeCfg.raw_string,
36
36
  description: routeCfg.description,
37
- summary: routeCfg.summary
37
+ summary: routeCfg.summary,
38
+ error_handler_path: routeCfg.error_handler_path,
39
+ error_handler_args: routeCfg.error_handler_path ? routeCfg.error_handler_args : undefined,
40
+ retry: routeCfg.retry
38
41
  };
39
42
  try {
40
43
  if (edit) {
41
44
  await HttpTriggerService.updateHttpTrigger({
42
45
  workspace: workspace,
43
46
  path: initialPath,
44
- requestBody: requestBody
47
+ requestBody: {
48
+ ...requestBody,
49
+ route_path: isAdmin || !edit ? routeCfg.route_path : undefined
50
+ }
45
51
  });
46
52
  sendUserToast(`Route ${routeCfg.path} updated`);
47
53
  }
@@ -14,7 +14,10 @@ import KafkaTriggersConfigSection from './KafkaTriggersConfigSection.svelte';
14
14
  import { untrack } from 'svelte';
15
15
  import TriggerEditorToolbar from '../TriggerEditorToolbar.svelte';
16
16
  import { saveKafkaTriggerFromCfg } 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, isEditor = false, allowDraft = false, trigger = undefined, customLabel, isDeployed = false, cloudDisabled = false, onConfigChange = undefined, onCaptureConfigChange = undefined, onUpdate = undefined, onDelete = undefined, onReset = undefined } = $props();
19
22
  let drawer = $state();
20
23
  let is_flow = $state(false);
@@ -37,6 +40,11 @@ let kafkaCfgValid = $state(false);
37
40
  let kafkaResourcePath = $state('');
38
41
  let kafkaCfg = $state({});
39
42
  let deploymentLoading = $state(false);
43
+ let optionTabSelected = $state('error_handler');
44
+ let errorHandlerSelected = $state('slack');
45
+ let error_handler_path = $state();
46
+ let error_handler_args = $state({});
47
+ let retry = $state();
40
48
  const isValid = $derived(!!kafkaResourcePath &&
41
49
  kafkaCfgValid &&
42
50
  kafkaCfg.topics &&
@@ -101,6 +109,10 @@ export async function openNew(nis_flow, fixedScriptPath_, nDefaultValues) {
101
109
  path = nDefaultValues?.path ?? '';
102
110
  initialPath = '';
103
111
  dirtyPath = false;
112
+ error_handler_path = nDefaultValues?.error_handler_path ?? undefined;
113
+ error_handler_args = nDefaultValues?.error_handler_args ?? {};
114
+ retry = nDefaultValues?.retry ?? undefined;
115
+ errorHandlerSelected = getHandlerType(error_handler_path ?? '');
104
116
  }
105
117
  finally {
106
118
  clearTimeout(loadingTimeout);
@@ -121,6 +133,10 @@ function loadTriggerConfig(cfg) {
121
133
  enabled = cfg?.enabled;
122
134
  extra_perms = cfg?.extra_perms;
123
135
  can_write = canWrite(path, cfg?.extra_perms, $userStore);
136
+ error_handler_path = cfg?.error_handler_path;
137
+ error_handler_args = cfg?.error_handler_args ?? {};
138
+ retry = cfg?.retry;
139
+ errorHandlerSelected = getHandlerType(error_handler_path ?? '');
124
140
  }
125
141
  async function loadTrigger(defaultConfig) {
126
142
  if (defaultConfig) {
@@ -144,7 +160,10 @@ function getSaveCfg() {
144
160
  group_id: kafkaCfg.group_id,
145
161
  topics: kafkaCfg.topics,
146
162
  enabled,
147
- extra_perms: extra_perms
163
+ extra_perms: extra_perms,
164
+ error_handler_path,
165
+ error_handler_args,
166
+ retry
148
167
  };
149
168
  }
150
169
  async function updateTrigger() {
@@ -310,6 +329,28 @@ $effect(() => {
310
329
  {can_write}
311
330
  showTestingBadge={isEditor}
312
331
  />
332
+
333
+ <Section label="Advanced" collapsable>
334
+ <div class="flex flex-col gap-4">
335
+ <div class="min-h-96">
336
+ <Tabs bind:selected={optionTabSelected}>
337
+ <Tab value="error_handler">Error Handler</Tab>
338
+ <Tab value="retries">Retries</Tab>
339
+ </Tabs>
340
+ <div class="mt-4">
341
+ <TriggerRetriesAndErrorHandler
342
+ {optionTabSelected}
343
+ {itemKind}
344
+ {can_write}
345
+ bind:errorHandlerSelected
346
+ bind:error_handler_path
347
+ bind:error_handler_args
348
+ bind:retry
349
+ />
350
+ </div>
351
+ </div>
352
+ </div>
353
+ </Section>
313
354
  </div>
314
355
  {/if}
315
356
  {/snippet}
@@ -2,13 +2,21 @@ import { KafkaTriggerService } from '../../../gen';
2
2
  import { sendUserToast } from '../../../toast';
3
3
  import { get } from 'svelte/store';
4
4
  export async function saveKafkaTriggerFromCfg(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,
8
15
  is_flow: cfg.is_flow,
9
16
  kafka_resource_path: cfg.kafka_resource_path,
10
17
  group_id: cfg.group_id,
11
- topics: cfg.topics
18
+ topics: cfg.topics,
19
+ ...errorHandlerAndRetries
12
20
  };
13
21
  try {
14
22
  if (edit) {