windmill-components 1.531.1 → 1.537.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 (153) hide show
  1. package/package/components/ArgInput.svelte +69 -19
  2. package/package/components/Auth0Setting.svelte +8 -3
  3. package/package/components/Dev.svelte +5 -4
  4. package/package/components/DiffDrawer.svelte +2 -2
  5. package/package/components/DiffEditor.svelte +34 -37
  6. package/package/components/DiffEditor.svelte.d.ts +23 -39
  7. package/package/components/EditableSchemaForm.svelte +67 -67
  8. package/package/components/EditableSchemaForm.svelte.d.ts +3 -3
  9. package/package/components/Editor.svelte +32 -11
  10. package/package/components/Editor.svelte.d.ts +6 -0
  11. package/package/components/EditorBar.svelte +2 -2
  12. package/package/components/EditorBar.svelte.d.ts +1 -0
  13. package/package/components/FieldHeader.svelte +1 -1
  14. package/package/components/FlowBuilder.svelte +7 -4
  15. package/package/components/FlowPreviewContent.svelte +3 -3
  16. package/package/components/FlowStatusViewer.svelte +28 -0
  17. package/package/components/FlowStatusViewerInner.svelte +72 -20
  18. package/package/components/FlowStatusViewerInner.svelte.d.ts +7 -0
  19. package/package/components/ModulePreview.svelte +2 -1
  20. package/package/components/ModulePreview.svelte.d.ts +1 -0
  21. package/package/components/ModulePreviewForm.svelte +72 -65
  22. package/package/components/ModulePreviewResultViewer.svelte +13 -18
  23. package/package/components/ModuleTest.svelte +10 -6
  24. package/package/components/ModuleTest.svelte.d.ts +1 -0
  25. package/package/components/OktaSetting.svelte +8 -3
  26. package/package/components/Portal.svelte +11 -7
  27. package/package/components/Portal.svelte.d.ts +19 -39
  28. package/package/components/ResourceEditor.svelte +4 -0
  29. package/package/components/RunForm.svelte +2 -2
  30. package/package/components/RunForm.svelte.d.ts +1 -1
  31. package/package/components/RunFormAdvancedPopup.svelte +13 -1
  32. package/package/components/SchemaForm.svelte +1 -2
  33. package/package/components/ScriptBuilder.svelte +1 -1
  34. package/package/components/ScriptEditor.svelte +22 -7
  35. package/package/components/SimpleEditor.svelte +0 -1
  36. package/package/components/StringTypeNarrowing.svelte.d.ts +1 -1
  37. package/package/components/apps/components/layout/AppModal.svelte +2 -2
  38. package/package/components/apps/editor/component/ComponentNavigation.svelte +3 -2
  39. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte +1 -1
  40. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte +0 -1
  41. package/package/components/apps/editor/settingsPanel/ArrayStaticInputEditor.svelte +3 -1
  42. package/package/components/apps/editor/settingsPanel/GridCondition.svelte +3 -1
  43. package/package/components/apps/editor/settingsPanel/GridNavbar.svelte +3 -1
  44. package/package/components/apps/editor/settingsPanel/GridTab.svelte +3 -1
  45. package/package/components/apps/editor/settingsPanel/OneOfInputSpecsEditor.svelte +55 -53
  46. package/package/components/apps/editor/settingsPanel/TableActions.svelte +3 -1
  47. package/package/components/common/button/model.d.ts +1 -1
  48. package/package/components/common/drawer/Disposable.svelte +51 -30
  49. package/package/components/common/drawer/Disposable.svelte.d.ts +12 -44
  50. package/package/components/common/drawer/Drawer.svelte +15 -11
  51. package/package/components/copilot/FlowInlineScriptAIButton.svelte +4 -2
  52. package/package/components/copilot/FlowInlineScriptAIButton.svelte.d.ts +4 -1
  53. package/package/components/copilot/MetadataGen.svelte +14 -3
  54. package/package/components/copilot/autocomplete/Autocompletor.js +0 -2
  55. package/package/components/copilot/chat/AIChat.svelte +2 -4
  56. package/package/components/copilot/chat/AIChatInput.svelte +3 -3
  57. package/package/components/copilot/chat/AIChatManager.svelte.js +24 -12
  58. package/package/components/copilot/chat/AvailableContextList.svelte +243 -26
  59. package/package/components/copilot/chat/AvailableContextList.svelte.d.ts +2 -1
  60. package/package/components/copilot/chat/ContextElementBadge.svelte +31 -15
  61. package/package/components/copilot/chat/ContextElementBadge.svelte.d.ts +5 -20
  62. package/package/components/copilot/chat/ContextManager.svelte.d.ts +15 -2
  63. package/package/components/copilot/chat/ContextManager.svelte.js +134 -24
  64. package/package/components/copilot/chat/ContextTextarea.svelte +22 -49
  65. package/package/components/copilot/chat/ToolContentDisplay.svelte +10 -1
  66. package/package/components/copilot/chat/ToolExecutionDisplay.svelte +3 -3
  67. package/package/components/copilot/chat/context.d.ts +19 -1
  68. package/package/components/copilot/chat/context.js +1 -0
  69. package/package/components/copilot/chat/flow/FlowAIChat.svelte +109 -7
  70. package/package/components/copilot/chat/flow/core.d.ts +13 -1
  71. package/package/components/copilot/chat/flow/core.js +171 -19
  72. package/package/components/copilot/chat/flow/uiIntents.d.ts +8 -0
  73. package/package/components/copilot/chat/flow/uiIntents.js +5 -0
  74. package/package/components/copilot/chat/flow/useUiIntent.d.ts +5 -0
  75. package/package/components/copilot/chat/flow/useUiIntent.js +12 -0
  76. package/package/components/copilot/chat/monaco-adapter.d.ts +22 -4
  77. package/package/components/copilot/chat/monaco-adapter.js +55 -16
  78. package/package/components/copilot/chat/script/core.d.ts +2 -2
  79. package/package/components/copilot/chat/script/core.js +54 -124
  80. package/package/components/copilot/chat/shared.d.ts +14 -2
  81. package/package/components/copilot/chat/shared.js +170 -7
  82. package/package/components/copilot/lib.js +12 -7
  83. package/package/components/copilot/shared.d.ts +1 -1
  84. package/package/components/copilot/shared.js +16 -10
  85. package/package/components/flows/FlowEditor.svelte +15 -1
  86. package/package/components/flows/FlowEditor.svelte.d.ts +1 -0
  87. package/package/components/flows/FlowModuleIcon.svelte +39 -0
  88. package/package/components/flows/FlowModuleIcon.svelte.d.ts +10 -0
  89. package/package/components/flows/common/FlowCardHeader.svelte +4 -1
  90. package/package/components/flows/content/FlowBranchesAllWrapper.svelte +6 -0
  91. package/package/components/flows/content/FlowBranchesOneWrapper.svelte +6 -0
  92. package/package/components/flows/content/FlowEditorPanel.svelte +2 -1
  93. package/package/components/flows/content/FlowEditorPanel.svelte.d.ts +1 -0
  94. package/package/components/flows/content/FlowInput.svelte +31 -34
  95. package/package/components/flows/content/FlowInput.svelte.d.ts +1 -0
  96. package/package/components/flows/content/FlowLoop.svelte +7 -0
  97. package/package/components/flows/content/FlowModuleComponent.svelte +39 -44
  98. package/package/components/flows/content/FlowModuleScript.svelte +1 -1
  99. package/package/components/flows/content/FlowModuleSuspend.svelte +16 -18
  100. package/package/components/flows/content/FlowWhileLoop.svelte +6 -0
  101. package/package/components/flows/content/ScriptEditorDrawer.svelte +9 -11
  102. package/package/components/flows/dfs.d.ts +1 -1
  103. package/package/components/flows/dfs.js +6 -6
  104. package/package/components/flows/flowInfers.js +7 -7
  105. package/package/components/flows/flowStateUtils.svelte.js +1 -2
  106. package/package/components/flows/map/FlowModuleSchemaItem.svelte +12 -26
  107. package/package/components/flows/map/MapItem.svelte +12 -39
  108. package/package/components/flows/map/VirtualItem.svelte +1 -1
  109. package/package/components/flows/pickers/TopLevelNode.svelte +1 -1
  110. package/package/components/flows/propPicker/InputPickerInner.svelte +5 -5
  111. package/package/components/flows/propPicker/OutputPickerInner.svelte +143 -118
  112. package/package/components/flows/propPicker/OutputPickerInner.svelte.d.ts +7 -16
  113. package/package/components/flows/{testSteps.svelte.d.ts → stepsInputArgs.svelte.d.ts} +2 -1
  114. package/package/components/flows/{testSteps.svelte.js → stepsInputArgs.svelte.js} +15 -3
  115. package/package/components/flows/types.d.ts +16 -3
  116. package/package/components/flows/utils.js +3 -0
  117. package/package/components/graph/FlowGraphV2.svelte +1 -1
  118. package/package/components/graph/renderers/nodes/AIToolNode.svelte +4 -4
  119. package/package/components/graph/renderers/nodes/NewAIToolNode.svelte +71 -54
  120. package/package/components/propertyPicker/ObjectViewer.svelte +11 -3
  121. package/package/components/raw_apps/RawAppInlineScriptEditor.svelte +1 -1
  122. package/package/components/schema/AddPropertyV2.svelte +2 -7
  123. package/package/components/schema/AddPropertyV2.svelte.d.ts +3 -20
  124. package/package/components/schema/EditableSchemaDrawer.svelte +109 -115
  125. package/package/components/schema/EditableSchemaDrawer.svelte.d.ts +2 -1
  126. package/package/components/schema/EditableSchemaSdkWrapper.svelte +16 -3
  127. package/package/components/schema/EditableSchemaSdkWrapper.svelte.d.ts +4 -1
  128. package/package/components/schema/EditableSchemaWrapper.svelte +3 -10
  129. package/package/components/schema/FlowPropertyEditor.svelte +83 -57
  130. package/package/components/schema/FlowPropertyEditor.svelte.d.ts +1 -1
  131. package/package/components/schema/PropertyEditor.svelte.d.ts +1 -1
  132. package/package/components/schema/SchemaFormDND.svelte +11 -10
  133. package/package/components/schema/SchemaFormDND.svelte.d.ts +3 -2
  134. package/package/components/schema/editable_schema_wrapper.d.ts +0 -3
  135. package/package/components/schema/jsonSchemaResource.svelte.d.ts +2 -0
  136. package/package/components/schema/jsonSchemaResource.svelte.js +40 -0
  137. package/package/components/settings/PremiumInfo.svelte +7 -2
  138. package/package/components/triggers/CaptureWrapper.svelte +2 -13
  139. package/package/components/triggers/CaptureWrapper.svelte.d.ts +1 -1
  140. package/package/components/triggers/TriggersWrapper.svelte +1 -0
  141. package/package/components/triggers/http/RouteEditorInner.svelte +1 -1
  142. package/package/components/triggers/nats/NatsTriggerEditorInner.svelte +23 -20
  143. package/package/components/triggers/nats/NatsTriggersConfigSection.svelte +15 -27
  144. package/package/components/triggers/nats/NatsTriggersConfigSection.svelte.d.ts +7 -5
  145. package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +16 -16
  146. package/package/hubPaths.json +3 -1
  147. package/package/script_helpers.d.ts +2 -2
  148. package/package/script_helpers.js +2 -0
  149. package/package/stores.d.ts +1 -0
  150. package/package/stores.js +8 -1
  151. package/package/utils.d.ts +1 -1
  152. package/package.json +14 -14
  153. package/package/components/ModulePreviewResultViewer.svelte.d.ts +0 -28
@@ -13,8 +13,10 @@ import ToggleButton from '../common/toggleButton-v2/ToggleButton.svelte';
13
13
  import Button from '../common/button/Button.svelte';
14
14
  import { Pen, Plus, Trash2 } from 'lucide-svelte';
15
15
  import Popover from '../meltComponents/Popover.svelte';
16
- let { format = $bindable(undefined), contentEncoding = undefined, type = undefined, oneOf = $bindable(undefined), required = false, pattern = undefined, password = undefined, variableEditor = undefined, itemPicker = undefined, nullable = $bindable(undefined), disabled = $bindable(undefined), defaultValue = $bindable(undefined), propsNames = [], showExpr = $bindable(undefined), extra = {}, customErrorMessage = undefined, itemsType = undefined, properties = $bindable(undefined), order = $bindable(undefined), requiredProperty = $bindable(undefined), displayWebhookWarning = true } = $props();
17
- let oneOfSelected = $state(undefined);
16
+ import ResourcePicker from '../ResourcePicker.svelte';
17
+ import Tooltip from '../Tooltip.svelte';
18
+ let { format = $bindable(undefined), contentEncoding = undefined, type = undefined, oneOf = $bindable(undefined), required = false, pattern = undefined, password = undefined, variableEditor = undefined, itemPicker = undefined, nullable = $bindable(undefined), disabled = $bindable(undefined), defaultValue = $bindable(undefined), propsNames = [], showExpr = $bindable(undefined), extra = {}, customErrorMessage = undefined, itemsType = undefined, properties = $bindable(undefined), order = $bindable(undefined), requiredProperty = $bindable(undefined), displayWebhookWarning = true, onDrawerClose = undefined } = $props();
19
+ let oneOfSelected = $state(oneOf?.[0]?.title);
18
20
  const dispatch = createEventDispatcher();
19
21
  function getResourceTypesFromFormat(format) {
20
22
  if (format?.startsWith('resource-')) {
@@ -56,8 +58,15 @@ function renameVariant(name, selected) {
56
58
  variantName = '';
57
59
  }
58
60
  }
59
- let initialObjectSelected = $state(Object.keys(properties ?? {}).length == 0 ? 'resource' : 'custom-object');
61
+ let initialObjectSelected = $state(format === 'json-schema'
62
+ ? 'json-schema'
63
+ : format?.startsWith('jsonschema-')
64
+ ? 'custom-object'
65
+ : Object.keys(properties ?? {}).length == 0
66
+ ? 'resource'
67
+ : 'custom-object');
60
68
  let isDynSelect = $derived(format?.startsWith('dynselect-') ?? false);
69
+ let customObjectSelected = $state(format?.startsWith('jsonschema-') ? 'json-schema-resource' : 'editor');
61
70
  </script>
62
71
 
63
72
  <div class="flex flex-col gap-2">
@@ -180,81 +189,98 @@ let isDynSelect = $derived(format?.startsWith('dynselect-') ?? false);
180
189
  {#if oneOfSelected && oneOf}
181
190
  {@const idx = oneOf.findIndex((obj) => obj.title === oneOfSelected)}
182
191
  <EditableSchemaDrawer
183
- bind:schema={
184
- () => {
185
- if (oneOf?.[idx]) {
186
- let properties = Object.fromEntries(
187
- Object.entries(oneOf[idx].properties ?? {}).filter(
188
- ([k]) => k !== 'label' && k !== 'kind'
189
- )
190
- )
191
- return {
192
- ...oneOf[idx],
193
- properties: properties,
194
- order: Object.keys(properties),
195
- required: oneOf[idx].required ?? []
196
- }
197
- }
198
- },
199
- (v) => {
200
- if (oneOf?.[idx]) {
201
- const tagKey = oneOf?.find((o) => Object.keys(o.properties ?? {}).includes('kind'))
202
- ? 'kind'
203
- : 'label'
204
- oneOf[idx] = {
205
- ...(v ?? {}),
206
- type: 'object',
207
- properties: {
208
- ...(v?.properties ?? {}),
209
- [tagKey]: {
210
- type: 'string',
211
- enum: [v?.title ?? '']
212
- }
213
- }
214
- }
215
- }
216
- }
217
- }
218
- on:change={() => {
219
- dispatch('schemaChange')
192
+ onClose={() => {
193
+ onDrawerClose?.()
220
194
  }}
195
+ bind:schema={oneOf[idx]}
196
+ hiddenArgs={[
197
+ oneOf?.find((o) => Object.keys(o.properties ?? {}).includes('kind')) ? 'kind' : 'label'
198
+ ]}
221
199
  />
222
200
  {/if}
223
201
  {:else if type === 'object' && format !== 'resource-s3_object' && !isDynSelect}
224
202
  <Tabs
225
203
  bind:selected={initialObjectSelected}
226
204
  on:selected={(e) => {
227
- if (e.detail === 'custom-object') {
205
+ if (e.detail === 'json-schema') {
206
+ format = 'json-schema'
207
+ } else {
228
208
  format = ''
229
209
  }
230
210
  }}
231
211
  >
232
212
  <Tab value="resource">Resource</Tab>
233
213
  <Tab value="custom-object">Custom Object</Tab>
214
+ <Tab value="json-schema">
215
+ JSON Schema
216
+ <Tooltip>
217
+ This displays a JSON schema editor, useful when a JSON schema input is expected.
218
+ </Tooltip>
219
+ </Tab>
234
220
  {#snippet content()}
235
221
  <div class="pt-2">
236
222
  <TabContent value="custom-object">
237
- <EditableSchemaDrawer
238
- bind:schema={
239
- () => {
240
- return {
241
- properties: properties,
242
- order: order,
243
- required: requiredProperty
223
+ <ToggleButtonGroup
224
+ bind:selected={customObjectSelected}
225
+ class="mb-2"
226
+ on:selected={(e) => {
227
+ if (e.detail === 'editor') {
228
+ format = undefined
229
+ } else {
230
+ properties = undefined
231
+ order = undefined
232
+ requiredProperty = undefined
233
+ }
234
+ }}
235
+ >
236
+ {#snippet children({ item })}
237
+ <ToggleButton value="editor" label="Editor" {item} />
238
+ <ToggleButton
239
+ value="json-schema-resource"
240
+ label="JSON Schema Resource"
241
+ {item}
242
+ tooltip="Select a JSON schema resource to specify the object's properties"
243
+ showTooltipIcon
244
+ />
245
+ {/snippet}
246
+ </ToggleButtonGroup>
247
+ {#if customObjectSelected === 'editor'}
248
+ <EditableSchemaDrawer
249
+ bind:schema={
250
+ () => {
251
+ return {
252
+ properties: properties,
253
+ order: order,
254
+ required: requiredProperty
255
+ }
256
+ },
257
+ (v) => {
258
+ properties = v.properties
259
+ order = v.order
260
+ requiredProperty = v.required
244
261
  }
245
- },
246
- (v) => {
247
- properties = v.properties
248
- order = v.order
249
- requiredProperty = v.required
250
- dispatch('schemaChange')
251
262
  }
252
- }
253
- />
263
+ />
264
+ {:else if customObjectSelected === 'json-schema-resource'}
265
+ <ResourcePicker
266
+ resourceType="json_schema"
267
+ bind:value={
268
+ () => {
269
+ if (format?.startsWith('jsonschema-')) {
270
+ return format.substring('jsonschema-'.length)
271
+ }
272
+ return undefined
273
+ },
274
+ (v) => {
275
+ format = 'jsonschema-' + v
276
+ }
277
+ }
278
+ />
279
+ {/if}
254
280
  </TabContent>
255
281
 
256
282
  <TabContent value="resource">
257
- <ObjectTypeNarrowing on:change={() => dispatch('schemaChange')} bind:format />
283
+ <ObjectTypeNarrowing bind:format />
258
284
  </TabContent>
259
285
  </div>
260
286
  {/snippet}
@@ -28,6 +28,7 @@ interface Props {
28
28
  order?: string[] | undefined;
29
29
  requiredProperty?: string[] | undefined;
30
30
  displayWebhookWarning?: boolean;
31
+ onDrawerClose?: () => void;
31
32
  }
32
33
  interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
33
34
  new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
@@ -43,7 +44,6 @@ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> =
43
44
  z_$$bindings?: Bindings;
44
45
  }
45
46
  declare const FlowPropertyEditor: $$__sveltets_2_IsomorphicComponent<Props, {
46
- schemaChange: CustomEvent<any>;
47
47
  requiredChange: CustomEvent<any>;
48
48
  } & {
49
49
  [evt: string]: CustomEvent<any>;
@@ -46,6 +46,6 @@ declare const PropertyEditor: $$__sveltets_2_IsomorphicComponent<Props, {
46
46
  [evt: string]: CustomEvent<any>;
47
47
  }, {}, {
48
48
  focus: () => void;
49
- }, "description" | "title" | "properties" | "placeholder" | "pattern" | "extra" | "oneOf" | "format" | "order" | "enum_" | "contentEncoding" | "itemsType" | "customErrorMessage">;
49
+ }, "description" | "title" | "properties" | "placeholder" | "pattern" | "extra" | "oneOf" | "format" | "order" | "enum_" | "contentEncoding" | "customErrorMessage" | "itemsType">;
50
50
  type PropertyEditor = InstanceType<typeof PropertyEditor>;
51
51
  export default PropertyEditor;
@@ -3,7 +3,8 @@ import { dragHandle } from '@windmill-labs/svelte-dnd-action';
3
3
  import SchemaForm from '../SchemaForm.svelte';
4
4
  import { GripVertical } from 'lucide-svelte';
5
5
  import { deepEqual } from 'fast-equals';
6
- let { dndType = undefined, schema = $bindable(), args = $bindable(undefined), prettifyHeader = false, onlyMaskPassword = false, disablePortal = false, disabled = false, hiddenArgs = [], nestedParent = undefined, disableDnd = false, shouldDispatchChanges = false, helperScript = undefined, diff = {}, nestedClasses = '', isValid = $bindable(true), noVariablePicker = false } = $props();
6
+ import { generateRandomString } from '../../utils';
7
+ let { schema = $bindable(), args = $bindable(undefined), prettifyHeader = false, onlyMaskPassword = false, disablePortal = false, disabled = false, hiddenArgs = [], nestedParent = undefined, disableDnd = false, shouldDispatchChanges = false, helperScript = undefined, diff = {}, nestedClasses = '', isValid = $bindable(true), noVariablePicker = false, className = '', dndType = generateRandomString() } = $props();
7
8
  $effect.pre(() => {
8
9
  if (args == undefined) {
9
10
  args = {};
@@ -12,9 +13,9 @@ $effect.pre(() => {
12
13
  const dispatch = createEventDispatcher();
13
14
  const flipDurationMs = 200;
14
15
  let items = $state(computeItems());
15
- let dragDisabled = $state(true);
16
+ let dragDisabledState = $state(true);
16
17
  function computeItems() {
17
- return ((schema?.order ?? Object.keys(schema?.properties ?? {}) ?? []).map((key) => ({
18
+ return (($state.snapshot(schema?.order) ?? Object.keys(schema?.properties ?? {}) ?? []).map((key) => ({
18
19
  id: key,
19
20
  value: key
20
21
  })) ?? []);
@@ -26,20 +27,19 @@ function updateItems() {
26
27
  }
27
28
  }
28
29
  function handleConsider(e) {
29
- dragDisabled = false;
30
+ dragDisabledState = false;
30
31
  const { items: newItems } = e.detail;
31
- items = newItems;
32
+ items = $state.snapshot(newItems);
32
33
  }
33
34
  function handleFinalize(e) {
34
35
  const { items: newItems } = e.detail;
35
- dragDisabled = true;
36
- items = newItems;
36
+ dragDisabledState = true;
37
+ items = $state.snapshot(newItems);
37
38
  const newOrder = items.map((item) => item.value);
38
- // console.log('handleFinalize', newOrder, e.detail)
39
39
  dispatch('reorder', newOrder);
40
40
  }
41
41
  $effect(() => {
42
- schema && dragDisabled && untrack(() => updateItems());
42
+ schema && dragDisabledState && untrack(() => updateItems());
43
43
  });
44
44
  </script>
45
45
 
@@ -67,6 +67,7 @@ $effect(() => {
67
67
  {disablePortal}
68
68
  {disabled}
69
69
  {helperScript}
70
+ {className}
70
71
  bind:schema
71
72
  dndConfig={disableDnd
72
73
  ? undefined
@@ -74,7 +75,7 @@ $effect(() => {
74
75
  items,
75
76
  flipDurationMs,
76
77
  dropTargetStyle: {},
77
- type: dndType ?? 'top-level'
78
+ type: dndType
78
79
  }}
79
80
  {items}
80
81
  {diff}
@@ -1,8 +1,7 @@
1
1
  import type { Schema } from '../../common';
2
2
  import type { SchemaDiff } from './schemaUtils.svelte';
3
- import type { DynamicSelect } from '../../utils';
3
+ import { type DynamicSelect } from '../../utils';
4
4
  interface Props {
5
- dndType?: string | undefined;
6
5
  schema: Schema;
7
6
  args?: Record<string, any>;
8
7
  prettifyHeader?: boolean;
@@ -21,6 +20,8 @@ interface Props {
21
20
  isValid?: boolean;
22
21
  noVariablePicker?: boolean;
23
22
  helperScript?: DynamicSelect.HelperScript;
23
+ className?: string;
24
+ dndType?: string;
24
25
  }
25
26
  interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
26
27
  new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
@@ -8,7 +8,4 @@ export type EditableSchemaWrapperProps = {
8
8
  customUi?: {
9
9
  noAddPopover?: boolean;
10
10
  };
11
- onSchemaChange?: ({ schema }: {
12
- schema: Schema;
13
- }) => void;
14
11
  };
@@ -0,0 +1,2 @@
1
+ export declare function getJsonSchemaFromResource(path: string, workspace: string): Promise<any>;
2
+ export declare function clearJsonSchemaResourceCache(path: string, workspace: string): Promise<void>;
@@ -0,0 +1,40 @@
1
+ import { z } from 'zod';
2
+ import { AppService } from '../../gen';
3
+ import { sendUserToast } from '../../utils';
4
+ let loadedJsonSchemaResources = $state({});
5
+ const jsonSchemaResourceSchema = z.object({
6
+ schema: z.record(z.string(), z.any())
7
+ });
8
+ export async function getJsonSchemaFromResource(path, workspace) {
9
+ if (loadedJsonSchemaResources[workspace]?.[path]) {
10
+ return loadedJsonSchemaResources[workspace][path];
11
+ }
12
+ try {
13
+ const resourceValue = await AppService.getPublicResource({
14
+ path,
15
+ workspace
16
+ });
17
+ const parsedResource = jsonSchemaResourceSchema.safeParse(resourceValue);
18
+ if (parsedResource.success) {
19
+ const workspaceResources = loadedJsonSchemaResources[workspace];
20
+ if (!workspaceResources) {
21
+ loadedJsonSchemaResources[workspace] = {};
22
+ }
23
+ loadedJsonSchemaResources[workspace][path] = parsedResource.data.schema;
24
+ return parsedResource.data.schema;
25
+ }
26
+ else {
27
+ console.error('Invalid JSON schema resource:', parsedResource.error);
28
+ sendUserToast('Invalid JSON schema resource: ' + parsedResource.error, true);
29
+ }
30
+ }
31
+ catch (err) {
32
+ console.error(err);
33
+ sendUserToast('Could not load JSON schema resource: ' + err, true);
34
+ }
35
+ }
36
+ export async function clearJsonSchemaResourceCache(path, workspace) {
37
+ if (loadedJsonSchemaResources[workspace]?.[path]) {
38
+ delete loadedJsonSchemaResources[workspace][path];
39
+ }
40
+ }
@@ -126,8 +126,13 @@ $: estimatedSeats && updateExecs();
126
126
  </div>
127
127
  {#if premiumInfo?.status === 'past_due'}
128
128
  <p class="text-red-500 text-base">
129
- Your last invoice is unpaid. Please update your payment method in the customer portal to
130
- prevent account downgrade and the interruption of your job executions.
129
+ {#if premiumInfo.max_tolerated_executions === undefined || premiumInfo.usage > premiumInfo.max_tolerated_executions}
130
+ Your last invoice is unpaid, you cannot run any more jobs. Please update your payment
131
+ method in the customer portal to continue running jobs.
132
+ {:else}
133
+ Your last invoice is unpaid. Please update your payment method in the customer portal to
134
+ prevent the interruption of your job executions.
135
+ {/if}
131
136
  </p>
132
137
  {/if}
133
138
  </div>
@@ -1,7 +1,7 @@
1
1
  <script lang="ts">import { workspaceStore } from '../../stores';
2
2
  import { CaptureService } from '../../gen';
3
3
  import { onDestroy, untrack } from 'svelte';
4
- import { isObject, sendUserToast, sleep } from '../../utils';
4
+ import { sendUserToast, sleep } from '../../utils';
5
5
  import RouteCapture from './http/RouteCapture.svelte';
6
6
  import WebhooksCapture from './webhook/WebhooksCapture.svelte';
7
7
  import EmailTriggerCaptures from '../details/EmailTriggerCaptures.svelte';
@@ -12,7 +12,7 @@ import NatsCapture from './nats/NatsCapture.svelte';
12
12
  import MqttCapture from './mqtt/MqttCapture.svelte';
13
13
  import SqsCapture from './sqs/SqsCapture.svelte';
14
14
  import GcpCapture from './gcp/GcpCapture.svelte';
15
- let { isFlow, path, hasPreprocessor, canHavePreprocessor, captureType = 'webhook', data = {}, connectionInfo = $bindable(undefined), args = $bindable({}), isValid = false, triggerDeployed = false } = $props();
15
+ let { isFlow, path, hasPreprocessor, canHavePreprocessor, captureType = 'webhook', data = {}, connectionInfo = $bindable(undefined), args = {}, isValid = false, triggerDeployed = false } = $props();
16
16
  let captureLoading = $state(false);
17
17
  let captureActive = $state(false);
18
18
  let captureConfigs = $state({});
@@ -64,7 +64,6 @@ async function getCaptureConfigs() {
64
64
  }
65
65
  return captureConfigs;
66
66
  }
67
- getCaptureConfigs().then((captureConfigs) => setDefaultArgs(captureConfigs));
68
67
  async function capture() {
69
68
  let i = 0;
70
69
  captureActive = true;
@@ -82,16 +81,6 @@ async function capture() {
82
81
  await sleep(1000);
83
82
  }
84
83
  }
85
- function setDefaultArgs(captureConfigs) {
86
- if (captureType in captureConfigs) {
87
- const triggerConfig = captureConfigs[captureType].trigger_config;
88
- args = isObject(triggerConfig) ? triggerConfig : {};
89
- }
90
- else {
91
- args = {};
92
- }
93
- ready = true;
94
- }
95
84
  onDestroy(() => {
96
85
  captureActive = false;
97
86
  });
@@ -37,6 +37,6 @@ declare const CaptureWrapper: $$__sveltets_2_IsomorphicComponent<Props, {
37
37
  handleCapture: (e: CustomEvent<{
38
38
  disableOnly?: boolean;
39
39
  }>) => Promise<void>;
40
- }, "args" | "connectionInfo">;
40
+ }, "connectionInfo">;
41
41
  type CaptureWrapper = InstanceType<typeof CaptureWrapper>;
42
42
  export default CaptureWrapper;
@@ -43,6 +43,7 @@ let { selectedTrigger, isFlow = false, initialPath, fakeInitialPath, currentPath
43
43
  scopes={isFlow ? [`jobs:run:flows:${currentPath}`] : [`jobs:run:scripts:${currentPath}`]}
44
44
  path={initialPath || fakeInitialPath}
45
45
  {isFlow}
46
+ {hash}
46
47
  on:email-domain
47
48
  />
48
49
  {:else if selectedTrigger.type === 'schedule'}
@@ -527,7 +527,7 @@ $effect(() => {
527
527
  {can_write}
528
528
  bind:static_asset_config
529
529
  showTestingBadge={isEditor}
530
- isDraftOnly={trigger?.isDraft}
530
+ isDraftOnly={trigger ? trigger.isDraft : false}
531
531
  />
532
532
 
533
533
  {#if !is_static_website}
@@ -36,11 +36,11 @@ let drawerLoading = $state(true);
36
36
  let showLoading = $state(false);
37
37
  let defaultValues = $state(undefined);
38
38
  let natsResourcePath = $state('');
39
- let subjects = $state(['']);
40
- let useJetstream = $state(false);
41
- let streamName = $state('');
42
- let consumerName = $state('');
43
39
  let initialConfig = undefined;
40
+ let natsCfg = $state({
41
+ subjects: [],
42
+ use_jetstream: false
43
+ });
44
44
  let deploymentLoading = $state(false);
45
45
  let isValid = $state(false);
46
46
  let optionTabSelected = $state('error_handler');
@@ -90,10 +90,13 @@ export async function openNew(nis_flow, fixedScriptPath_, nDefaultValues) {
90
90
  edit = false;
91
91
  itemKind = nis_flow ? 'flow' : 'script';
92
92
  natsResourcePath = nDefaultValues?.nats_resource_path ?? '';
93
- subjects = nDefaultValues?.subjects ?? [''];
94
- useJetstream = nDefaultValues?.use_jetstream ?? false;
95
- streamName = useJetstream ? (nDefaultValues?.stream_name ?? '') : undefined;
96
- consumerName = useJetstream ? (nDefaultValues?.consumer_name ?? '') : undefined;
93
+ const useJetstream = nDefaultValues?.use_jetstream ?? false;
94
+ natsCfg = {
95
+ subjects: nDefaultValues?.subjects ?? [''],
96
+ use_jetstream: useJetstream,
97
+ stream_name: useJetstream ? (nDefaultValues?.stream_name ?? '') : undefined,
98
+ consumer_name: useJetstream ? (nDefaultValues?.consumer_name ?? '') : undefined
99
+ };
97
100
  initialScriptPath = '';
98
101
  fixedScriptPath = fixedScriptPath_ ?? '';
99
102
  script_path = fixedScriptPath;
@@ -119,10 +122,13 @@ async function loadTriggerConfig(cfg) {
119
122
  is_flow = cfg?.is_flow;
120
123
  path = cfg?.path;
121
124
  natsResourcePath = cfg?.nats_resource_path;
122
- streamName = cfg?.stream_name;
123
- consumerName = cfg?.consumer_name;
124
- subjects = cfg?.subjects || [''];
125
- useJetstream = cfg?.use_jetstream || false;
125
+ const useJetstream = cfg?.use_jetstream || false;
126
+ natsCfg = {
127
+ subjects: cfg?.subjects || [''],
128
+ use_jetstream: useJetstream,
129
+ stream_name: useJetstream ? cfg?.stream_name || '' : undefined,
130
+ consumer_name: useJetstream ? cfg?.consumer_name || '' : undefined
131
+ };
126
132
  enabled = cfg?.enabled;
127
133
  can_write = canWrite(cfg?.path, cfg?.extra_perms, $userStore);
128
134
  error_handler_path = cfg?.error_handler_path;
@@ -150,10 +156,10 @@ function getSaveCfg() {
150
156
  is_flow,
151
157
  enabled,
152
158
  nats_resource_path: natsResourcePath,
153
- stream_name: streamName,
154
- consumer_name: consumerName,
155
- subjects,
156
- use_jetstream: useJetstream,
159
+ stream_name: natsCfg.stream_name,
160
+ consumer_name: natsCfg.consumer_name,
161
+ subjects: natsCfg.subjects,
162
+ use_jetstream: natsCfg.use_jetstream,
157
163
  error_handler_path,
158
164
  error_handler_args,
159
165
  retry
@@ -325,10 +331,7 @@ $effect(() => {
325
331
  <NatsTriggersConfigSection
326
332
  {path}
327
333
  bind:natsResourcePath
328
- bind:subjects
329
- bind:useJetstream
330
- bind:streamName
331
- bind:consumerName
334
+ bind:natsCfg
332
335
  on:valid-config={({ detail }) => {
333
336
  isValid = detail
334
337
  }}
@@ -5,11 +5,11 @@ import ResourcePicker from '../../ResourcePicker.svelte';
5
5
  import SchemaForm from '../../SchemaForm.svelte';
6
6
  import TestTriggerConnection from '../TestTriggerConnection.svelte';
7
7
  import TestingBadge from '../testingBadge.svelte';
8
- import { createEventDispatcher } from 'svelte';
8
+ import { createEventDispatcher, untrack } from 'svelte';
9
9
  const dispatch = createEventDispatcher();
10
- let { defaultValues = undefined, headless = false, natsResourcePath = $bindable(), subjects = $bindable(), useJetstream = $bindable(), streamName = $bindable(), consumerName = $bindable(), path, can_write = true, showTestingBadge = false } = $props();
10
+ let { defaultValues = undefined, headless = false, natsResourcePath = $bindable(), natsCfg = $bindable(), path, can_write = true, showTestingBadge = false } = $props();
11
11
  let otherArgsValid = $state(false);
12
- let globalError = $derived(!useJetstream && subjects && subjects.length > 1
12
+ let globalError = $derived(!natsCfg.use_jetstream && natsCfg.subjects && natsCfg.subjects.length > 1
13
13
  ? 'Only one subject is supported if not using JetStream.'
14
14
  : '');
15
15
  let isConnectionValid = $derived(!!natsResourcePath);
@@ -55,37 +55,25 @@ const argsSchema = {
55
55
  $effect(() => {
56
56
  const valid = isConnectionValid &&
57
57
  otherArgsValid &&
58
- !!subjects &&
59
- subjects.length > 0 &&
60
- subjects.every((b) => /^[a-zA-Z0-9-_.*>]+$/.test(b)) &&
58
+ !!natsCfg.subjects &&
59
+ natsCfg.subjects.length > 0 &&
60
+ natsCfg.subjects.every((b) => /^[a-zA-Z0-9-_.*>]+$/.test(b)) &&
61
61
  globalError === '';
62
62
  dispatch('valid-config', valid);
63
63
  });
64
64
  function setStreamAndConsumerNames() {
65
- if (!streamName) {
66
- streamName = `windmill_stream-${$workspaceStore}-${path.replaceAll('/', '__')}`;
65
+ if (!natsCfg.stream_name) {
66
+ natsCfg.stream_name = `windmill_stream-${$workspaceStore}-${path.replaceAll('/', '__')}`;
67
67
  }
68
- if (!consumerName) {
69
- consumerName = `windmill_consumer-${$workspaceStore}-${path.replaceAll('/', '__')}`;
68
+ if (!natsCfg.consumer_name) {
69
+ natsCfg.consumer_name = `windmill_consumer-${$workspaceStore}-${path.replaceAll('/', '__')}`;
70
70
  }
71
71
  }
72
- function setNewArgs(args) {
73
- subjects = args.subjects;
74
- useJetstream = args.use_jetstream;
75
- streamName = args.stream_name;
76
- consumerName = args.consumer_name;
77
- if (args.use_jetstream) {
78
- setStreamAndConsumerNames();
72
+ $effect(() => {
73
+ if (natsCfg.use_jetstream) {
74
+ untrack(() => setStreamAndConsumerNames());
79
75
  }
80
- }
81
- function getNatsArgsCfg() {
82
- return {
83
- subjects,
84
- use_jetstream: useJetstream,
85
- stream_name: streamName,
86
- consumer_name: consumerName
87
- };
88
- }
76
+ });
89
77
  </script>
90
78
 
91
79
  <div>
@@ -121,7 +109,7 @@ function getNatsArgsCfg() {
121
109
  <Subsection headless={true}>
122
110
  <SchemaForm
123
111
  schema={argsSchema}
124
- bind:args={getNatsArgsCfg, (args) => setNewArgs(args)}
112
+ bind:args={natsCfg}
125
113
  bind:isValid={otherArgsValid}
126
114
  lightHeader={true}
127
115
  disabled={!can_write}
@@ -2,10 +2,12 @@ interface Props {
2
2
  defaultValues?: Record<string, any> | undefined;
3
3
  headless?: boolean;
4
4
  natsResourcePath: string;
5
- subjects: string[];
6
- useJetstream: boolean;
7
- streamName: string;
8
- consumerName: string;
5
+ natsCfg: {
6
+ subjects: string[];
7
+ use_jetstream: boolean;
8
+ stream_name?: string;
9
+ consumer_name?: string;
10
+ };
9
11
  path: string;
10
12
  can_write?: boolean;
11
13
  showTestingBadge?: boolean;
@@ -27,6 +29,6 @@ declare const NatsTriggersConfigSection: $$__sveltets_2_IsomorphicComponent<Prop
27
29
  'valid-config': CustomEvent<any>;
28
30
  } & {
29
31
  [evt: string]: CustomEvent<any>;
30
- }, {}, {}, "subjects" | "natsResourcePath" | "useJetstream" | "streamName" | "consumerName">;
32
+ }, {}, {}, "natsResourcePath" | "natsCfg">;
31
33
  type NatsTriggersConfigSection = InstanceType<typeof NatsTriggersConfigSection>;
32
34
  export default NatsTriggersConfigSection;
@@ -331,8 +331,8 @@ $effect(() => {
331
331
  </Label>
332
332
  </div>
333
333
 
334
- {#if !hideTarget}
335
- <Section label="Runnable" class="flex flex-col gap-4">
334
+ <Section label={hideTarget ? 'Runnable options' : 'Runnable'} class="flex flex-col gap-4">
335
+ {#if !hideTarget}
336
336
  <div>
337
337
  <p class="text-xs mb-1 text-tertiary">
338
338
  Pick a script or flow to be triggered<Required required={true} />
@@ -363,21 +363,21 @@ $effect(() => {
363
363
  {/if}
364
364
  </div>
365
365
  </div>
366
+ {/if}
366
367
 
367
- <Toggle
368
- checked={can_return_message}
369
- on:change={() => {
370
- can_return_message = !can_return_message
371
- }}
372
- options={{
373
- right: 'Send runnable result',
374
- rightTooltip:
375
- 'Whether the runnable result should be sent as a message to the websocket server when not null.'
376
- }}
377
- disabled={!can_write}
378
- />
379
- </Section>
380
- {/if}
368
+ <Toggle
369
+ checked={can_return_message}
370
+ on:change={() => {
371
+ can_return_message = !can_return_message
372
+ }}
373
+ options={{
374
+ right: 'Send runnable result',
375
+ rightTooltip:
376
+ 'Whether the runnable result should be sent as a message to the websocket server when not null.'
377
+ }}
378
+ disabled={!can_write}
379
+ />
380
+ </Section>
381
381
 
382
382
  <WebsocketEditorConfigSection
383
383
  bind:url