windmill-components 1.542.4 → 1.550.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 (189) hide show
  1. package/package/common.d.ts +4 -1
  2. package/package/components/AIAgentLogViewer.svelte +1 -1
  3. package/package/components/ArgEnum.svelte +14 -5
  4. package/package/components/ArgInput.svelte +23 -15
  5. package/package/components/ArgInput.svelte.d.ts +1 -1
  6. package/package/components/ChannelSelector.svelte +92 -18
  7. package/package/components/ChannelSelector.svelte.d.ts +2 -0
  8. package/package/components/ConnectionSection.svelte +12 -1
  9. package/package/components/Dev.svelte +18 -5
  10. package/package/components/Dev.svelte.d.ts +23 -1
  11. package/package/components/DisplayResult.svelte +36 -23
  12. package/package/components/DropdownV2.svelte +8 -2
  13. package/package/components/DropdownV2.svelte.d.ts +1 -0
  14. package/package/components/DynamicInput.svelte +10 -10
  15. package/package/components/EditableSchemaForm.svelte +21 -7
  16. package/package/components/EditorSettings.svelte +11 -9
  17. package/package/components/ErrorOrRecoveryHandler.svelte +14 -20
  18. package/package/components/FlowHistoryJobPicker.svelte +3 -0
  19. package/package/components/FlowHistoryJobPicker.svelte.d.ts +1 -0
  20. package/package/components/FlowJobResult.svelte +5 -5
  21. package/package/components/FlowLogRow.svelte +2 -2
  22. package/package/components/FlowLogViewer.svelte +228 -57
  23. package/package/components/FlowLogViewer.svelte.d.ts +16 -5
  24. package/package/components/FlowLogViewerWrapper.svelte +56 -3
  25. package/package/components/FlowLogViewerWrapper.svelte.d.ts +4 -3
  26. package/package/components/FlowLoopIterationPreview.svelte +4 -4
  27. package/package/components/FlowMetadata.svelte +3 -4
  28. package/package/components/FlowMetadata.svelte.d.ts +4 -18
  29. package/package/components/FlowPreviewContent.svelte +9 -3
  30. package/package/components/FlowPreviewContent.svelte.d.ts +1 -1
  31. package/package/components/FlowStatusViewer.svelte +62 -59
  32. package/package/components/FlowStatusViewer.svelte.d.ts +2 -2
  33. package/package/components/FlowStatusViewerInner.svelte +186 -94
  34. package/package/components/FlowStatusViewerInner.svelte.d.ts +10 -3
  35. package/package/components/FlowTimeline.svelte +110 -131
  36. package/package/components/FlowTimeline.svelte.d.ts +13 -4
  37. package/package/components/FlowTimelineBar.svelte +227 -0
  38. package/package/components/FlowTimelineBar.svelte.d.ts +24 -0
  39. package/package/components/InputTransformForm.svelte +119 -3
  40. package/package/components/InputTransformForm.svelte.d.ts +3 -0
  41. package/package/components/InputTransformSchemaForm.svelte +5 -1
  42. package/package/components/InputTransformSchemaForm.svelte.d.ts +2 -0
  43. package/package/components/InstanceSetting.svelte +17 -42
  44. package/package/components/InstanceSettings.svelte +12 -21
  45. package/package/components/JobArgs.svelte +15 -16
  46. package/package/components/JobArgs.svelte.d.ts +4 -18
  47. package/package/components/JobLoader.svelte +23 -42
  48. package/package/components/JobLoader.svelte.d.ts +2 -0
  49. package/package/components/JobStatus.svelte +1 -1
  50. package/package/components/JobStatus.svelte.d.ts +4 -18
  51. package/package/components/ModulePreviewResultViewer.svelte +1 -7
  52. package/package/components/NextcloudSetting.svelte +6 -1
  53. package/package/components/Password.svelte +7 -11
  54. package/package/components/Password.svelte.d.ts +5 -20
  55. package/package/components/PasswordArgInput.svelte +35 -15
  56. package/package/components/PasswordArgInput.svelte.d.ts +4 -18
  57. package/package/components/QueuePosition.svelte +6 -2
  58. package/package/components/RunForm.svelte +5 -14
  59. package/package/components/S3ArrayHelperButton.svelte +12 -0
  60. package/package/components/S3ArrayHelperButton.svelte.d.ts +8 -0
  61. package/package/components/ScriptEditor.svelte +5 -6
  62. package/package/components/StringTypeNarrowing.svelte +39 -24
  63. package/package/components/StringTypeNarrowing.svelte.d.ts +1 -1
  64. package/package/components/TeamSelector.svelte +83 -37
  65. package/package/components/TeamSelector.svelte.d.ts +0 -1
  66. package/package/components/apps/components/buttons/AppButton.svelte +11 -1
  67. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +13 -4
  68. package/package/components/apps/components/display/table/SyncColumnDefs.svelte +2 -2
  69. package/package/components/apps/components/display/table/utils.js +1 -1
  70. package/package/components/apps/components/helpers/RefreshButton.svelte +5 -1
  71. package/package/components/apps/components/helpers/RunnableComponent.svelte +0 -2
  72. package/package/components/apps/components/helpers/RunnableWrapper.svelte.d.ts +1 -0
  73. package/package/components/apps/components/layout/AppTabs.svelte +116 -71
  74. package/package/components/apps/components/layout/AppTabs.svelte.d.ts +1 -0
  75. package/package/components/apps/editor/component/ComponentInner.svelte +1 -0
  76. package/package/components/apps/editor/component/components.d.ts +16 -1
  77. package/package/components/apps/editor/component/components.js +22 -2
  78. package/package/components/apps/editor/settingsPanel/ComponentPanel.svelte +2 -0
  79. package/package/components/apps/editor/settingsPanel/GridTab.svelte +19 -1
  80. package/package/components/apps/editor/settingsPanel/GridTab.svelte.d.ts +3 -1
  81. package/package/components/apps/editor/settingsPanel/GridTabHidden.svelte +52 -0
  82. package/package/components/apps/editor/settingsPanel/GridTabHidden.svelte.d.ts +9 -0
  83. package/package/components/auditLogs/AuditLogsFilters.svelte +6 -0
  84. package/package/components/auditLogs/AuditLogsTable.svelte +17 -7
  85. package/package/components/auditLogs/AuditLogsTable.svelte.d.ts +1 -0
  86. package/package/components/common/CloseButton.svelte +2 -2
  87. package/package/components/common/CloseButton.svelte.d.ts +1 -0
  88. package/package/components/common/layout/List.svelte +3 -7
  89. package/package/components/common/layout/List.svelte.d.ts +7 -29
  90. package/package/components/common/popup/PopupV2.svelte +8 -25
  91. package/package/components/common/popup/PopupV2.svelte.d.ts +4 -2
  92. package/package/components/common/table/ScriptRow.svelte +22 -2
  93. package/package/components/copilot/FlowCopilotInputsModal.svelte +26 -23
  94. package/package/components/copilot/chat/AIChatManager.svelte.js +3 -2
  95. package/package/components/copilot/chat/ProviderModelSelector.svelte +1 -1
  96. package/package/components/copilot/chat/flow/FlowAIChat.svelte +4 -2
  97. package/package/components/copilot/chat/script/core.d.ts +4 -4
  98. package/package/components/copilot/chat/script/core.js +93 -34
  99. package/package/components/copilot/lib.d.ts +1 -0
  100. package/package/components/copilot/lib.js +6 -3
  101. package/package/components/custom_ui.d.ts +2 -0
  102. package/package/components/flows/FlowProgressBar.svelte +16 -16
  103. package/package/components/flows/FlowProgressBar.svelte.d.ts +7 -22
  104. package/package/components/flows/content/FlowInputsQuick.svelte +3 -2
  105. package/package/components/flows/content/FlowInputsQuick.svelte.d.ts +1 -0
  106. package/package/components/flows/content/FlowModuleComponent.svelte +24 -1
  107. package/package/components/flows/flowInfers.js +34 -8
  108. package/package/components/flows/flowStore.d.ts +4 -1
  109. package/package/components/flows/map/FlowJobsMenu.svelte +3 -3
  110. package/package/components/flows/map/FlowJobsMenu.svelte.d.ts +1 -1
  111. package/package/components/flows/map/InsertModuleButton.svelte +4 -14
  112. package/package/components/flows/map/InsertModuleButton.svelte.d.ts +0 -1
  113. package/package/components/flows/map/InsertModuleInner.svelte +17 -20
  114. package/package/components/flows/map/MapItem.svelte +1 -1
  115. package/package/components/flows/pickers/PickHubScriptQuick.svelte +38 -52
  116. package/package/components/flows/pickers/PickHubScriptQuick.svelte.d.ts +1 -0
  117. package/package/components/flows/pickers/WorkspaceScriptPickerQuick.svelte +27 -15
  118. package/package/components/flows/pickers/WorkspaceScriptPickerQuick.svelte.d.ts +1 -0
  119. package/package/components/flows/propPicker/OutputPicker.svelte +2 -0
  120. package/package/components/git_sync/DetectionFlow.svelte +33 -44
  121. package/package/components/git_sync/DetectionFlow.svelte.d.ts +1 -0
  122. package/package/components/git_sync/GitSyncContext.svelte.d.ts +22 -0
  123. package/package/components/git_sync/GitSyncContext.svelte.js +145 -5
  124. package/package/components/git_sync/GitSyncModeDisplay.svelte +14 -0
  125. package/package/components/git_sync/GitSyncModeDisplay.svelte.d.ts +9 -0
  126. package/package/components/git_sync/GitSyncRepositoryCard.svelte +365 -253
  127. package/package/components/git_sync/GitSyncRepositoryCard.svelte.d.ts +10 -1
  128. package/package/components/git_sync/GitSyncSection.svelte +134 -14
  129. package/package/components/git_sync/PullWorkspaceModal.svelte +24 -32
  130. package/package/components/git_sync/PushWorkspaceModal.svelte +24 -32
  131. package/package/components/graph/model.d.ts +5 -5
  132. package/package/components/graph/renderers/edges/EmptyEdge.svelte +3 -10
  133. package/package/components/graph/renderers/edges/EmptyEdge.svelte.d.ts +4 -18
  134. package/package/components/graph/renderers/nodes/AIToolNode.svelte +2 -2
  135. package/package/components/graph/renderers/nodes/NewAIToolNode.svelte +5 -10
  136. package/package/components/home/ItemsList.svelte +1 -1
  137. package/package/components/jobs/JobProgressBar.svelte +27 -21
  138. package/package/components/jobs/JobProgressBar.svelte.d.ts +9 -24
  139. package/package/components/meltComponents/MenuSingleItem.svelte +3 -8
  140. package/package/components/meltComponents/MenuSingleItem.svelte.d.ts +0 -3
  141. package/package/components/meltComponents/Popover.svelte +3 -2
  142. package/package/components/meltComponents/Popover.svelte.d.ts +1 -0
  143. package/package/components/meltComponents/Tooltip.svelte +1 -1
  144. package/package/components/progressBar/ProgressBar.svelte +39 -53
  145. package/package/components/progressBar/ProgressBar.svelte.d.ts +11 -26
  146. package/package/components/runs/JobsLoader.svelte +1 -1
  147. package/package/components/runs/NoWorkerWithTagWarning.svelte +3 -3
  148. package/package/components/runs/NoWorkerWithTagWarning.svelte.d.ts +1 -1
  149. package/package/components/schema/AddPropertyV2.svelte +7 -4
  150. package/package/components/schema/PropertyEditor.svelte.d.ts +1 -1
  151. package/package/components/select/MultiSelect.svelte +2 -2
  152. package/package/components/select/MultiSelect.svelte.d.ts +1 -0
  153. package/package/components/settings/WorkspaceUserSettings.svelte +92 -1
  154. package/package/components/sidebar/MenuLink.svelte +2 -1
  155. package/package/components/sidebar/MenuLink.svelte.d.ts +1 -0
  156. package/package/components/sidebar/SidebarContent.svelte +27 -27
  157. package/package/components/table/Cell.svelte +7 -14
  158. package/package/components/table/Cell.svelte.d.ts +13 -35
  159. package/package/components/triggers/AddTriggersButton.svelte +1 -0
  160. package/package/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte +1 -1
  161. package/package/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte.d.ts +2 -1
  162. package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +28 -5
  163. package/package/components/triggers/gcp/utils.js +1 -0
  164. package/package/components/triggers/schedules/ScheduleEditorInner.svelte +1 -0
  165. package/package/components/triggers/webhook/WebhooksConfigSection.svelte +143 -63
  166. package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +22 -0
  167. package/package/components/triggers/websocket/utils.js +1 -0
  168. package/package/components/workspaceSettings/AISettings.svelte +8 -2
  169. package/package/components/workspaceSettings/AISettings.svelte.d.ts +2 -1
  170. package/package/components/workspaceSettings/ModelTokenLimits.svelte +165 -0
  171. package/package/components/workspaceSettings/ModelTokenLimits.svelte.d.ts +8 -0
  172. package/package/components/workspaceSettings/StorageSettings.svelte +123 -51
  173. package/package/gen/core/OpenAPI.js +1 -1
  174. package/package/gen/schemas.gen.d.ts +141 -16
  175. package/package/gen/schemas.gen.js +144 -16
  176. package/package/gen/services.gen.d.ts +62 -42
  177. package/package/gen/services.gen.js +131 -82
  178. package/package/gen/types.gen.d.ts +218 -144
  179. package/package/hubPaths.json +2 -1
  180. package/package/services/JobManager.js +10 -7
  181. package/package/stores.d.ts +1 -0
  182. package/package/stores.js +6 -3
  183. package/package/timelineCompute.svelte.d.ts +21 -0
  184. package/package/timelineCompute.svelte.js +113 -0
  185. package/package/utils.d.ts +15 -8
  186. package/package/utils.js +62 -12
  187. package/package/workspace_settings.d.ts +13 -8
  188. package/package/workspace_settings.js +46 -11
  189. package/package.json +2 -2
@@ -88,6 +88,7 @@ export function close() {
88
88
  {/snippet}
89
89
 
90
90
  <DropdownV2
91
+ enableFlyTransition
91
92
  bind:this={dropdown}
92
93
  items={addTriggerItems}
93
94
  {placement}
@@ -57,7 +57,7 @@ async function loadAllSubscriptionFromGooglePubSubTopic() {
57
57
  loadingSubscription = false;
58
58
  }
59
59
  }
60
- let { can_write = false, headless = false, isValid = $bindable(false), gcp_resource_path = $bindable(''), subscription_id = $bindable(''), topic_id = $bindable(''), delivery_type = $bindable('pull'), delivery_config = $bindable(), subscription_mode = $bindable('create_update'), base_endpoint = $bindable(getBaseUrl()), auto_acknowledge_msg = $bindable(true), path = '', showTestingBadge = false, cloud_subscription_id = $bindable(''), create_update_subscription_id = $bindable('') } = $props();
60
+ let { can_write = false, headless = false, isValid = $bindable(false), gcp_resource_path = $bindable(''), subscription_id = $bindable(''), topic_id = $bindable(''), delivery_type = $bindable('pull'), delivery_config = $bindable(), subscription_mode = $bindable('create_update'), base_endpoint = $bindable(getBaseUrl()), auto_acknowledge_msg = $bindable(true), ack_deadline = $bindable(), path = '', showTestingBadge = false, cloud_subscription_id = $bindable(''), create_update_subscription_id = $bindable('') } = $props();
61
61
  if (gcp_resource_path) {
62
62
  loadAllPubSubTopicsFromProject();
63
63
  }
@@ -15,7 +15,8 @@ interface Props {
15
15
  cloud_subscription_id?: string;
16
16
  create_update_subscription_id?: string;
17
17
  auto_acknowledge_msg: boolean;
18
+ ack_deadline?: number;
18
19
  }
19
- declare const GcpTriggerEditorConfigSection: import("svelte").Component<Props, {}, "base_endpoint" | "gcp_resource_path" | "topic_id" | "subscription_id" | "delivery_type" | "subscription_mode" | "delivery_config" | "auto_acknowledge_msg" | "isValid" | "cloud_subscription_id" | "create_update_subscription_id">;
20
+ declare const GcpTriggerEditorConfigSection: import("svelte").Component<Props, {}, "base_endpoint" | "gcp_resource_path" | "topic_id" | "subscription_id" | "delivery_type" | "subscription_mode" | "delivery_config" | "auto_acknowledge_msg" | "ack_deadline" | "isValid" | "cloud_subscription_id" | "create_update_subscription_id">;
20
21
  type GcpTriggerEditorConfigSection = ReturnType<typeof GcpTriggerEditorConfigSection>;
21
22
  export default GcpTriggerEditorConfigSection;
@@ -46,6 +46,7 @@ let initialConfig = undefined;
46
46
  let deploymentLoading = $state(false);
47
47
  let base_endpoint = $derived(`${window.location.origin}${base}`);
48
48
  let auto_acknowledge_msg = $state(true);
49
+ let ack_deadline = $state();
49
50
  let optionTabSelected = $state('error_handler');
50
51
  let errorHandlerSelected = $state('slack');
51
52
  let error_handler_path = $state();
@@ -99,6 +100,7 @@ export async function openNew(nis_flow, fixedScriptPath_, defaultValues) {
99
100
  error_handler_args = defaultValues?.error_handler_args ?? {};
100
101
  retry = defaultValues?.retry ?? undefined;
101
102
  auto_acknowledge_msg = defaultValues?.auto_acknowledge_msg ?? true;
103
+ ack_deadline = defaultValues?.ack_deadline;
102
104
  errorHandlerSelected = getHandlerType(error_handler_path ?? '');
103
105
  }
104
106
  finally {
@@ -140,6 +142,7 @@ async function loadTriggerConfig(cfg) {
140
142
  error_handler_args = cfg?.error_handler_args ?? {};
141
143
  retry = cfg?.retry;
142
144
  auto_acknowledge_msg = cfg?.auto_acknowledge_msg ?? true;
145
+ ack_deadline = cfg?.ack_deadline;
143
146
  errorHandlerSelected = getHandlerType(error_handler_path ?? '');
144
147
  }
145
148
  async function updateTrigger() {
@@ -171,7 +174,8 @@ function getGcpConfig() {
171
174
  error_handler_path,
172
175
  error_handler_args,
173
176
  retry,
174
- auto_acknowledge_msg
177
+ auto_acknowledge_msg,
178
+ ack_deadline
175
179
  };
176
180
  }
177
181
  function getGcpCaptureConfig() {
@@ -183,6 +187,7 @@ function getGcpCaptureConfig() {
183
187
  delivery_config,
184
188
  base_endpoint,
185
189
  auto_acknowledge_msg,
190
+ ack_deadline,
186
191
  topic_id,
187
192
  path
188
193
  };
@@ -337,6 +342,7 @@ $effect(() => {
337
342
  bind:topic_id
338
343
  bind:subscription_mode
339
344
  bind:auto_acknowledge_msg
345
+ bind:ack_deadline
340
346
  {path}
341
347
  cloud_subscription_id={subscription_id}
342
348
  create_update_subscription_id={subscription_id}
@@ -376,11 +382,28 @@ $effect(() => {
376
382
  </div>
377
383
  {/if}
378
384
  </Subsection>
379
- {:else}
380
- <div class="flex items-center justify-center h-32 text-tertiary">
381
- No settings available for push delivery type
382
- </div>
383
385
  {/if}
386
+ <Subsection
387
+ label="Acknowledgment deadline"
388
+ tooltip="Time in seconds within which the message must be acknowledged. If not provided, defaults to the subscription's acknowledgment deadline (600 seconds). Range: 10-600 seconds."
389
+ >
390
+ <div class="mt-2">
391
+ <input
392
+ type="number"
393
+ bind:value={ack_deadline}
394
+ disabled={!can_write}
395
+ min="10"
396
+ max="600"
397
+ step="1"
398
+ placeholder="600"
399
+ class="w-full px-3 py-2 text-sm border border-gray-200 dark:border-gray-700 rounded-md bg-surface text-primary focus:ring-2 focus:ring-blue-500 focus:border-blue-500 disabled:opacity-50 disabled:cursor-not-allowed"
400
+ />
401
+ </div>
402
+ <div class="mt-2 text-xs text-secondary">
403
+ Leave empty to use subscription default (600 seconds). This affects how long
404
+ messages remain in flight before being redelivered.
405
+ </div>
406
+ </Subsection>
384
407
  </div>
385
408
  {:else}
386
409
  <TriggerRetriesAndErrorHandler
@@ -23,6 +23,7 @@ export async function saveGcpTriggerFromCfg(initialPath, cfg, edit, workspace, u
23
23
  enabled: cfg.enabled,
24
24
  is_flow: cfg.is_flow,
25
25
  auto_acknowledge_msg: cfg.auto_acknowledge_msg,
26
+ ack_deadline: cfg.ack_deadline,
26
27
  ...errorHandlerAndRetries
27
28
  };
28
29
  if (edit) {
@@ -809,6 +809,7 @@ $effect(() => {
809
809
  {:then Module}
810
810
  <Module.default
811
811
  showReset
812
+ onlyMaskPassword
812
813
  disabled={!can_write}
813
814
  schema={$state.snapshot(schema)}
814
815
  bind:isValid
@@ -5,7 +5,7 @@ import ToggleButton from '../../common/toggleButton-v2/ToggleButton.svelte';
5
5
  import { DEFAULT_WEBHOOK_TYPE, SCRIPT_VIEW_SHOW_EXAMPLE_CURL, SCRIPT_VIEW_SHOW_CREATE_TOKEN_BUTTON } from '../../../consts';
6
6
  import bash from 'svelte-highlight/languages/bash';
7
7
  import { Tabs, Tab, TabContent, Button } from '../../common';
8
- import { ArrowDownRight, ArrowUpRight, Clipboard } from 'lucide-svelte';
8
+ import { ArrowDownRight, ArrowUpRight, Clipboard, RssIcon } from 'lucide-svelte';
9
9
  import { Highlight } from 'svelte-highlight';
10
10
  import { typescript } from 'svelte-highlight/languages';
11
11
  import ClipboardPanel from '../../details/ClipboardPanel.svelte';
@@ -20,12 +20,18 @@ let { isFlow = false, path = '', hash = undefined, token = $bindable(''), runnab
20
20
  let webhooks = $derived(isFlow ? computeFlowWebhooks(path) : computeScriptWebhooks(hash, path));
21
21
  let selectedTab = $state('rest');
22
22
  let userSettings = $state();
23
- let webhookType = $state(DEFAULT_WEBHOOK_TYPE);
24
- let requestType = $state(isFlow ? 'path' : 'path');
23
+ let requestType = $state(DEFAULT_WEBHOOK_TYPE);
24
+ let callMethod = $state('post');
25
+ let runnableId = $state('path');
25
26
  let tokenType = $state('headers');
26
27
  $effect(() => {
27
- if (webhookType === 'async' && requestType === 'get_path') {
28
- requestType = hash ? 'hash' : 'path';
28
+ if (requestType === 'async' && (callMethod === 'get' || callMethod === 'sse')) {
29
+ callMethod = 'post';
30
+ }
31
+ });
32
+ $effect(() => {
33
+ if (callMethod === 'sse' && tokenType === 'headers') {
34
+ tokenType = 'query';
29
35
  }
30
36
  });
31
37
  let cleanedRunnableArgs = $derived.by(() => {
@@ -34,25 +40,37 @@ let cleanedRunnableArgs = $derived.by(() => {
34
40
  ? Object.fromEntries(Object.entries(runnableArgs).filter(([key]) => key !== 'wm_trigger'))
35
41
  : runnableArgs;
36
42
  });
37
- let url = $derived(webhooks[webhookType][requestType] +
43
+ let url = $derived(webhooks[requestType][callMethod][runnableId] +
38
44
  (tokenType === 'query'
39
- ? `?token=${token}${requestType === 'get_path'
45
+ ? `?token=${token}${callMethod === 'get' || callMethod === 'sse'
40
46
  ? `&payload=${encodeURIComponent(btoa(JSON.stringify(cleanedRunnableArgs ?? {})))}`
41
47
  : ''}`
42
- : `${requestType === 'get_path'
48
+ : `${callMethod === 'get'
43
49
  ? `?payload=${encodeURIComponent(btoa(JSON.stringify(cleanedRunnableArgs ?? {})))}`
44
50
  : ''}`));
45
51
  function computeScriptWebhooks(hash, path) {
46
52
  let webhookBase = `${location.origin}${base}/api/w/${$workspaceStore}/jobs`;
47
53
  return {
48
54
  async: {
49
- hash: `${webhookBase}/run/h/${hash}`,
50
- path: `${webhookBase}/run/p/${path}`
55
+ get: {},
56
+ post: {
57
+ hash: `${webhookBase}/run/h/${hash}`,
58
+ path: `${webhookBase}/run/p/${path}`
59
+ },
60
+ sse: {}
51
61
  },
52
62
  sync: {
53
- hash: `${webhookBase}/run_wait_result/h/${hash}`,
54
- path: `${webhookBase}/run_wait_result/p/${path}`,
55
- get_path: `${webhookBase}/run_wait_result/p/${path}`
63
+ get: {
64
+ path: `${webhookBase}/run_wait_result/p/${path}`
65
+ },
66
+ post: {
67
+ hash: `${webhookBase}/run_wait_result/h/${hash}`,
68
+ path: `${webhookBase}/run_wait_result/p/${path}`
69
+ },
70
+ sse: {
71
+ hash: `${webhookBase}/run_and_stream/h/${hash}`,
72
+ path: `${webhookBase}/run_and_stream/p/${path}`
73
+ }
56
74
  }
57
75
  };
58
76
  }
@@ -60,19 +78,31 @@ function computeFlowWebhooks(path) {
60
78
  let webhooksBase = `${location.origin}${base}/api/w/${$workspaceStore}/jobs`;
61
79
  let urlAsync = `${webhooksBase}/run/f/${path}`;
62
80
  let urlSync = `${webhooksBase}/run_wait_result/f/${path}`;
81
+ let urlStream = `${webhooksBase}/run_and_stream/f/${path}`;
63
82
  return {
64
83
  async: {
65
- path: urlAsync
84
+ get: {},
85
+ post: {
86
+ path: urlAsync
87
+ },
88
+ sse: {}
66
89
  },
67
90
  sync: {
68
- path: urlSync,
69
- get_path: urlSync
91
+ get: {
92
+ path: urlSync
93
+ },
94
+ post: {
95
+ path: urlSync
96
+ },
97
+ sse: {
98
+ path: urlStream
99
+ }
70
100
  }
71
101
  };
72
102
  }
73
103
  function headers() {
74
104
  const headers = {};
75
- if (requestType != 'get_path') {
105
+ if (callMethod === 'post') {
76
106
  headers['Content-Type'] = 'application/json';
77
107
  }
78
108
  if (tokenType === 'headers') {
@@ -81,7 +111,34 @@ function headers() {
81
111
  return headers;
82
112
  }
83
113
  function fetchCode() {
84
- if (webhookType === 'sync') {
114
+ if (callMethod === 'sse') {
115
+ return `
116
+ import { EventSource } from "eventsource";
117
+
118
+ export async function main() {
119
+ const endpoint = \`${url}\`;
120
+
121
+ return new Promise((resolve, reject) => {
122
+ const eventSource = new EventSource(endpoint);
123
+
124
+ eventSource.onmessage = (event) => {
125
+ const data = JSON.parse(event.data);
126
+ console.log(data);
127
+ if (data.completed) {
128
+ eventSource.close();
129
+ resolve();
130
+ }
131
+ };
132
+
133
+ eventSource.onerror = (error) => {
134
+ console.error('EventSource error:', error);
135
+ eventSource.close();
136
+ reject(error);
137
+ };
138
+ });
139
+ }`;
140
+ }
141
+ if (requestType === 'sync') {
85
142
  return `
86
143
  export async function main() {
87
144
  const jobTriggerResponse = await triggerJob();
@@ -90,39 +147,40 @@ export async function main() {
90
147
  }
91
148
 
92
149
  async function triggerJob() {
93
- ${requestType === 'get_path'
150
+ ${callMethod === 'get'
94
151
  ? '// Payload is a base64 encoded string of the arguments'
95
152
  : `const body = JSON.stringify(${JSON.stringify(cleanedRunnableArgs ?? {}, null, 2).replaceAll('\n', '\n\t')});`}
96
153
  const endpoint = \`${url}\`;
97
154
 
98
155
  return await fetch(endpoint, {
99
- method: '${requestType === 'get_path' ? 'GET' : 'POST'}',
100
- headers: ${JSON.stringify(headers(), null, 2).replaceAll('\n', '\n\t\t')}${requestType === 'get_path' ? '' : `,\n\t\tbody`}
156
+ method: '${callMethod === 'get' ? 'GET' : 'POST'}',
157
+ headers: ${JSON.stringify(headers(), null, 2).replaceAll('\n', '\n\t\t')}${callMethod === 'get' ? '' : `,\n\t\tbody`}
101
158
  });
102
159
  }`;
103
160
  }
104
- // Main function
105
- let mainFunction = `
161
+ else {
162
+ // Main function
163
+ let mainFunction = `
106
164
  export async function main() {
107
165
  const jobTriggerResponse = await triggerJob();
108
166
  const UUID = await jobTriggerResponse.text();
109
167
  const jobCompletionData = await waitForJobCompletion(UUID);
110
168
  return jobCompletionData;
111
169
  }`;
112
- // triggerJob function
113
- let triggerJobFunction = `
170
+ // triggerJob function
171
+ let triggerJobFunction = `
114
172
  async function triggerJob() {
115
173
  const body = JSON.stringify(${JSON.stringify(cleanedRunnableArgs ?? {}, null, 2).replaceAll('\n', '\n\t')});
116
174
  const endpoint = \`${url}\`;
117
175
 
118
176
  return await fetch(endpoint, {
119
- method: '${requestType === 'get_path' ? 'GET' : 'POST'}',
177
+ method: '${callMethod === 'get' ? 'GET' : 'POST'}',
120
178
  headers: ${JSON.stringify(headers(), null, 2).replaceAll('\n', '\n\t\t')},
121
179
  body
122
180
  });
123
181
  }`;
124
- // waitForJobCompletion function
125
- let waitForJobCompletionFunction = `
182
+ // waitForJobCompletion function
183
+ let waitForJobCompletionFunction = `
126
184
  function waitForJobCompletion(UUID) {
127
185
  return new Promise(async (resolve, reject) => {
128
186
  try {
@@ -148,16 +206,17 @@ function waitForJobCompletion(UUID) {
148
206
  }
149
207
  });
150
208
  }`;
151
- // Combine and return
152
- return `${mainFunction}\n\n${triggerJobFunction}\n\n${waitForJobCompletionFunction}`;
209
+ // Combine and return
210
+ return `${mainFunction}\n\n${triggerJobFunction}\n\n${waitForJobCompletionFunction}`;
211
+ }
153
212
  }
154
213
  function curlCode() {
155
214
  return `TOKEN='${token}'
156
- ${requestType !== 'get_path' ? `BODY='${JSON.stringify(cleanedRunnableArgs ?? {})}'` : ''}
215
+ ${callMethod !== 'get' ? `BODY='${JSON.stringify(cleanedRunnableArgs ?? {})}'` : ''}
157
216
  URL='${url}'
158
- ${webhookType === 'sync' ? 'RESULT' : 'UUID'}=$(curl -s ${requestType != 'get_path' ? "-H 'Content-Type: application/json'" : ''} ${tokenType === 'headers' ? `-H "Authorization: Bearer $TOKEN"` : ''} -X ${requestType === 'get_path' ? 'GET' : 'POST'} ${requestType !== 'get_path' ? `-d "$BODY" ` : ''}$URL)
217
+ ${requestType === 'sync' ? 'RESULT' : 'UUID'}=$(curl -s ${callMethod != 'get' ? "-H 'Content-Type: application/json'" : ''} ${tokenType === 'headers' ? `-H "Authorization: Bearer $TOKEN"` : ''} -X ${callMethod === 'get' ? 'GET' : 'POST'} ${callMethod !== 'get' ? `-d "$BODY" ` : ''}$URL)
159
218
 
160
- ${webhookType === 'sync'
219
+ ${requestType === 'sync'
161
220
  ? 'echo -E $RESULT | jq'
162
221
  : `
163
222
  URL="${location.origin}/api/w/${$workspaceStore}/jobs_u/completed/get_result_maybe/$UUID"
@@ -213,7 +272,7 @@ done`}`;
213
272
  <div class="flex flex-col gap-2">
214
273
  <div class="flex flex-row justify-between">
215
274
  <div class="text-sm font-normal text-secondary flex flex-row items-center">Request type</div>
216
- <ToggleButtonGroup class="h-[30px] w-auto" bind:selected={webhookType}>
275
+ <ToggleButtonGroup class="h-[30px] w-auto" bind:selected={requestType}>
217
276
  {#snippet children({ item })}
218
277
  <ToggleButton
219
278
  label="Async"
@@ -232,44 +291,63 @@ done`}`;
232
291
  </div>
233
292
  <div class="flex flex-row justify-between">
234
293
  <div class="text-sm font-normal text-secondary flex flex-row items-center">Call method</div>
235
- <ToggleButtonGroup class="h-[30px] w-auto" bind:selected={requestType}>
294
+ <ToggleButtonGroup class="h-[30px] w-auto" bind:selected={callMethod}>
236
295
  {#snippet children({ item })}
237
296
  <ToggleButton
238
- label="POST by path"
239
- value="path"
240
- icon={ArrowUpRight}
297
+ label="POST"
298
+ icon={ArrowDownRight}
299
+ selectedColor="#14b8a6"
300
+ value="post"
241
301
  {item}
302
+ />
303
+ <ToggleButton
304
+ label="GET"
305
+ icon={ArrowUpRight}
242
306
  selectedColor="#fb923c"
307
+ value="get"
308
+ {item}
309
+ disabled={requestType !== 'sync'}
243
310
  />
244
- {#if !isFlow}
245
- <ToggleButton
246
- label="POST by hash"
247
- value="hash"
248
- icon={ArrowUpRight}
249
- selectedColor="#fb923c"
250
- disabled={!hash}
251
- {item}
252
- />
253
- {/if}
254
-
255
311
  <ToggleButton
256
- label="GET by path"
257
- value="get_path"
258
- icon={ArrowDownRight}
259
- disabled={webhookType !== 'sync'}
312
+ label="SSE"
313
+ value="sse"
314
+ icon={RssIcon}
315
+ selectedColor="#3B82F6"
316
+ disabled={requestType !== 'sync'}
317
+ tooltip={'Returns an SSE stream. ' +
318
+ (isFlow
319
+ ? 'Only useful if the last step of the flow returns a stream.'
320
+ : 'Only useful if the script returns a stream.')}
260
321
  {item}
261
- selectedColor="#14b8a6"
262
322
  />
263
323
  {/snippet}
264
324
  </ToggleButtonGroup>
265
325
  </div>
326
+ {#if !isFlow}
327
+ <div class="flex flex-row justify-between">
328
+ <div class="text-sm font-normal text-secondary flex flex-row items-center">
329
+ Reference type
330
+ </div>
331
+ <ToggleButtonGroup class="h-[30px] w-auto" bind:selected={runnableId}>
332
+ {#snippet children({ item })}
333
+ <ToggleButton label="Path" value="path" {item} />
334
+ <ToggleButton label="Hash" value="hash" disabled={!hash} {item} />
335
+ {/snippet}
336
+ </ToggleButtonGroup>
337
+ </div>
338
+ {/if}
266
339
  <div class="flex flex-row justify-between">
267
340
  <div class="text-sm font-normal text-secondary flex flex-row items-center"
268
341
  >Token configuration</div
269
342
  >
270
343
  <ToggleButtonGroup class="h-[30px] w-auto" bind:selected={tokenType}>
271
344
  {#snippet children({ item })}
272
- <ToggleButton label="Token in Headers" value="headers" {item} />
345
+ <ToggleButton
346
+ label="Token in Headers"
347
+ value="headers"
348
+ {item}
349
+ disabled={callMethod === 'sse'}
350
+ />
273
351
  <ToggleButton label="Token in Query" value="query" {item} />
274
352
  {/snippet}
275
353
  </ToggleButtonGroup>
@@ -281,10 +359,12 @@ done`}`;
281
359
  <div>
282
360
  <Tabs bind:selected={selectedTab}>
283
361
  <Tab value="rest" size="xs">REST</Tab>
284
- {#if SCRIPT_VIEW_SHOW_EXAMPLE_CURL}
362
+ {#if SCRIPT_VIEW_SHOW_EXAMPLE_CURL && callMethod !== 'sse'}
285
363
  <Tab value="curl" size="xs">Curl</Tab>
286
364
  {/if}
287
- <Tab value="fetch" size="xs">Fetch</Tab>
365
+ <Tab value="fetch" size="xs">
366
+ {callMethod === 'sse' ? 'Event Source' : 'Fetch'}
367
+ </Tab>
288
368
 
289
369
  {#snippet content()}
290
370
  {#key token}
@@ -294,12 +374,12 @@ done`}`;
294
374
  <ClipboardPanel content={url} />
295
375
  </Label>
296
376
 
297
- {#if requestType !== 'get_path'}
377
+ {#if callMethod !== 'get'}
298
378
  <Label label="Body">
299
379
  <ClipboardPanel content={JSON.stringify(cleanedRunnableArgs ?? {}, null, 2)} />
300
380
  </Label>
301
381
  {/if}
302
- {#key requestType}
382
+ {#key callMethod}
303
383
  {#key tokenType}
304
384
  <Label label="Headers">
305
385
  <ClipboardPanel content={JSON.stringify(headers(), null, 2)} />
@@ -311,8 +391,8 @@ done`}`;
311
391
  <TabContent value="curl" class="flex flex-col flex-1 h-full">
312
392
  <div class="relative">
313
393
  {#key runnableArgs}
314
- {#key requestType}
315
- {#key webhookType}
394
+ {#key callMethod}
395
+ {#key requestType}
316
396
  {#key tokenType}
317
397
  <div
318
398
  class="flex flex-row flex-1 h-full border p-2 rounded-md overflow-auto relative"
@@ -332,8 +412,8 @@ done`}`;
332
412
  </TabContent>
333
413
  <TabContent value="fetch">
334
414
  {#key runnableArgs}
335
- {#key requestType}
336
- {#key webhookType}
415
+ {#key callMethod}
416
+ {#key requestType}
337
417
  {#key tokenType}
338
418
  {#key token}
339
419
  <div
@@ -39,6 +39,7 @@ let filters = $state([]);
39
39
  let initial_messages = $state([]);
40
40
  let url_runnable_args = $state({});
41
41
  let can_return_message = $state(false);
42
+ let can_return_error_result = $state(false);
42
43
  let dirtyPath = $state(false);
43
44
  let can_write = $state(true);
44
45
  let drawerLoading = $state(true);
@@ -70,6 +71,11 @@ const saveDisabled = $derived.by(() => {
70
71
  $effect(() => {
71
72
  is_flow = itemKind === 'flow';
72
73
  });
74
+ $effect(() => {
75
+ if (!can_return_message) {
76
+ can_return_error_result = false;
77
+ }
78
+ });
73
79
  export async function openEdit(ePath, isFlow, defaultConfig) {
74
80
  let loadingTimeout = setTimeout(() => {
75
81
  showLoading = true;
@@ -118,6 +124,7 @@ export async function openNew(nis_flow, fixedScriptPath_, defaultValues) {
118
124
  url_runnable_args = defaultValues?.url_runnable_args ?? {};
119
125
  dirtyPath = false;
120
126
  can_return_message = false;
127
+ can_return_error_result = false;
121
128
  error_handler_path = defaultValues?.error_handler_path ?? undefined;
122
129
  error_handler_args = defaultValues?.error_handler_args ?? {};
123
130
  retry = defaultValues?.retry ?? undefined;
@@ -140,6 +147,7 @@ function loadTriggerConfig(cfg) {
140
147
  initial_messages = cfg?.initial_messages ?? [];
141
148
  url_runnable_args = cfg?.url_runnable_args;
142
149
  can_return_message = cfg?.can_return_message;
150
+ can_return_error_result = cfg?.can_return_error_result;
143
151
  can_write = canWrite(path, cfg?.extra_perms, $userStore);
144
152
  error_handler_path = cfg?.error_handler_path;
145
153
  error_handler_args = cfg?.error_handler_args ?? {};
@@ -157,6 +165,7 @@ function getSaveCfg() {
157
165
  initial_messages,
158
166
  url_runnable_args,
159
167
  can_return_message,
168
+ can_return_error_result,
160
169
  enabled,
161
170
  error_handler_path,
162
171
  error_handler_args,
@@ -377,6 +386,19 @@ $effect(() => {
377
386
  }}
378
387
  disabled={!can_write}
379
388
  />
389
+
390
+ <Toggle
391
+ checked={can_return_error_result}
392
+ on:change={() => {
393
+ can_return_error_result = !can_return_error_result
394
+ }}
395
+ options={{
396
+ right: 'Send result on error',
397
+ rightTooltip:
398
+ 'Allows the runnable result to be sent as a message to the WebSocket server if the result is a non-null error.'
399
+ }}
400
+ disabled={!can_write || !can_return_message}
401
+ />
380
402
  </Section>
381
403
 
382
404
  <WebsocketEditorConfigSection
@@ -20,6 +20,7 @@ export async function saveWebsocketTriggerFromCfg(initialPath, triggerCfg, edit,
20
20
  initial_messages: triggerCfg.initial_messages,
21
21
  url_runnable_args: triggerCfg.url_runnable_args,
22
22
  can_return_message: triggerCfg.can_return_message,
23
+ can_return_error_result: triggerCfg.can_return_error_result,
23
24
  ...errorHandlerAndRetries
24
25
  };
25
26
  try {
@@ -17,8 +17,9 @@ import { AIMode } from '../copilot/chat/AIChatManager.svelte';
17
17
  import ToggleButtonGroup from '../common/toggleButton-v2/ToggleButtonGroup.svelte';
18
18
  import ToggleButton from '../common/toggleButton-v2/ToggleButton.svelte';
19
19
  import autosize from '../../autosize';
20
+ import ModelTokenLimits from './ModelTokenLimits.svelte';
20
21
  const MAX_CUSTOM_PROMPT_LENGTH = 5000;
21
- let { aiProviders = $bindable(), codeCompletionModel = $bindable(), defaultModel = $bindable(), customPrompts = $bindable(), usingOpenaiClientCredentialsOauth = $bindable() } = $props();
22
+ let { aiProviders = $bindable(), codeCompletionModel = $bindable(), defaultModel = $bindable(), customPrompts = $bindable(), maxTokensPerModel = $bindable(), usingOpenaiClientCredentialsOauth = $bindable() } = $props();
22
23
  let fetchedAiModels = $state(false);
23
24
  let availableAiModels = $state(Object.fromEntries(Object.keys(AI_PROVIDERS).map((provider) => [provider, AI_PROVIDERS[provider].defaultModels])));
24
25
  // Custom system prompt settings
@@ -66,7 +67,8 @@ async function editCopilotConfig() {
66
67
  providers: aiProviders,
67
68
  code_completion_model,
68
69
  default_model,
69
- custom_prompts: Object.keys(custom_prompts).length > 0 ? custom_prompts : undefined
70
+ custom_prompts: Object.keys(custom_prompts).length > 0 ? custom_prompts : undefined,
71
+ max_tokens_per_model: Object.keys(maxTokensPerModel).length > 0 ? maxTokensPerModel : undefined
70
72
  };
71
73
  await WorkspaceService.editCopilotConfig({
72
74
  workspace: $workspaceStore,
@@ -276,6 +278,10 @@ async function onAiProviderChange(provider) {
276
278
  </div>
277
279
  {/if}
278
280
 
281
+ {#if Object.keys(aiProviders).length > 0}
282
+ <ModelTokenLimits {aiProviders} bind:maxTokensPerModel />
283
+ {/if}
284
+
279
285
  {#if Object.keys(aiProviders).length > 0}
280
286
  <div class="flex flex-col gap-2">
281
287
  <p class="font-semibold">Custom system prompts</p>
@@ -4,8 +4,9 @@ type $$ComponentProps = {
4
4
  codeCompletionModel: string | undefined;
5
5
  defaultModel: string | undefined;
6
6
  customPrompts: Record<string, string>;
7
+ maxTokensPerModel: Record<string, number>;
7
8
  usingOpenaiClientCredentialsOauth: boolean;
8
9
  };
9
- declare const AiSettings: import("svelte").Component<$$ComponentProps, {}, "codeCompletionModel" | "defaultModel" | "aiProviders" | "customPrompts" | "usingOpenaiClientCredentialsOauth">;
10
+ declare const AiSettings: import("svelte").Component<$$ComponentProps, {}, "codeCompletionModel" | "defaultModel" | "aiProviders" | "maxTokensPerModel" | "customPrompts" | "usingOpenaiClientCredentialsOauth">;
10
11
  type AiSettings = ReturnType<typeof AiSettings>;
11
12
  export default AiSettings;