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
@@ -11,22 +11,23 @@ import { twMerge } from 'tailwind-merge';
11
11
  import FlowPropertyEditor from './schema/FlowPropertyEditor.svelte';
12
12
  import PropertyEditor from './schema/PropertyEditor.svelte';
13
13
  import SimpleEditor from './SimpleEditor.svelte';
14
- import { createEventDispatcher, tick, untrack } from 'svelte';
14
+ import { createEventDispatcher, untrack } from 'svelte';
15
15
  import ToggleButton from './common/toggleButton-v2/ToggleButton.svelte';
16
16
  import ToggleButtonGroup from './common/toggleButton-v2/ToggleButtonGroup.svelte';
17
17
  import Label from './Label.svelte';
18
18
  import { sendUserToast } from '../toast';
19
19
  import Toggle from './Toggle.svelte';
20
- import { DynamicSelect, emptyString } from '../utils';
20
+ import { DynamicSelect, emptyString, generateRandomString, readFieldsRecursively } from '../utils';
21
21
  import Popover from './meltComponents/Popover.svelte';
22
22
  import SchemaFormDnd from './schema/SchemaFormDND.svelte';
23
23
  import { deepEqual } from 'fast-equals';
24
24
  import { tweened } from 'svelte/motion';
25
25
  import Section from './Section.svelte';
26
26
  import Editor from './Editor.svelte';
27
+ import AddPropertyV2 from './schema/AddPropertyV2.svelte';
27
28
  // export let openEditTab: () => void = () => {}
28
29
  const dispatch = createEventDispatcher();
29
- let { schema = $bindable(), hiddenArgs = [], args = $bindable(undefined), shouldHideNoInputs = false, noVariablePicker = false, flexWrap = false, uiOnly = false, isFlowInput = false, noPreview = false, jsonEnabled = true, isAppInput = false, displayWebhookWarning = false, onlyMaskPassword = false, dndType = undefined, editTab, previewSchema = undefined, editPanelInitialSize = undefined, editPanelSize = $bindable(0), diff = {}, disableDnd = false, shouldDispatchChanges = false, isValid = $bindable(true), customUi = undefined, pannelExtraButtonWidth = 0, class: clazz = '', dynSelectCode = $bindable(), dynSelectLang = $bindable(), showDynSelectOpt = false, openEditTab, addProperty, runButton, extraTab } = $props();
30
+ let { schema = $bindable(), hiddenArgs = [], args = $bindable(undefined), shouldHideNoInputs = false, noVariablePicker = false, flexWrap = false, uiOnly = false, isFlowInput = false, noPreview = false, jsonEnabled = true, isAppInput = false, displayWebhookWarning = false, onlyMaskPassword = false, editTab, previewSchema = undefined, editPanelInitialSize = undefined, editPanelSize = $bindable(0), diff = {}, disableDnd = false, shouldDispatchChanges = false, isValid = $bindable(true), customUi = undefined, pannelExtraButtonWidth = 0, class: clazz = '', dynSelectCode = $bindable(), dynSelectLang = $bindable(), showDynSelectOpt = false, addPropertyInEditorTab = false, openEditTab, addProperty, runButton, extraTab, schemaFormClassName = undefined, onChange = undefined } = $props();
30
31
  $effect.pre(() => {
31
32
  if (args == undefined) {
32
33
  args = {};
@@ -38,6 +39,12 @@ $effect.pre(() => {
38
39
  dynSelectCode = schema?.['x-windmill-dyn-select-code'] || '';
39
40
  }
40
41
  });
42
+ $effect(() => {
43
+ if (onChange) {
44
+ readFieldsRecursively(args);
45
+ onChange(args ?? {});
46
+ }
47
+ });
41
48
  $effect(() => {
42
49
  if (schema && dynSelectCode !== undefined && dynSelectLang !== undefined) {
43
50
  if (dynSelectCode && dynSelectCode.trim()) {
@@ -63,9 +70,9 @@ export function setDefaults() {
63
70
  let pickForField;
64
71
  let itemPicker = $state(undefined);
65
72
  let variableEditor = $state(undefined);
66
- let keys = $state(Array.isArray(schema?.order)
73
+ let keys = $state((Array.isArray(schema?.order)
67
74
  ? [...schema.order]
68
- : (Object.keys(schema?.properties ?? {}) ?? Object.keys(schema?.properties ?? {})));
75
+ : (Object.keys(schema?.properties ?? {}) ?? Object.keys(schema?.properties ?? {}))).filter((x) => !hiddenArgs?.includes(x)));
69
76
  function alignOrderWithProperties(schema) {
70
77
  if (schema.order == undefined && !Array.isArray(schema.order)) {
71
78
  schema.order = [];
@@ -91,22 +98,16 @@ function alignOrderWithProperties(schema) {
91
98
  return hasChanged;
92
99
  }
93
100
  function onSchemaChange() {
94
- let editSchema = false;
95
101
  if (alignOrderWithProperties(schema)) {
96
- console.log('alignOrderWithProperties', JSON.stringify(schema, null, 2));
97
- editSchema = true;
102
+ // console.log('alignOrderWithProperties', JSON.stringify(schema, null, 2))
98
103
  }
99
- let lkeys = schema?.order ?? Object.keys(schema?.properties ?? {});
104
+ let lkeys = (schema?.order ?? Object.keys(schema?.properties ?? {})).filter((x) => !hiddenArgs?.includes(x));
100
105
  if (schema?.properties && !deepEqual(lkeys, keys)) {
101
106
  keys = [...lkeys];
102
- editSchema = true;
103
107
  if (opened == undefined) {
104
108
  opened = keys[0];
105
109
  }
106
110
  }
107
- if (editSchema) {
108
- schema = schema;
109
- }
110
111
  }
111
112
  let opened = $state(untrack(() => keys[0]));
112
113
  function computeSelected(property) {
@@ -147,25 +148,25 @@ function renameProperty(oldName, key) {
147
148
  el.value = oldName;
148
149
  }
149
150
  else {
151
+ let newSchema = $state.snapshot(schema);
150
152
  if (args) {
151
153
  args[newName] = args[oldName];
152
154
  delete args[oldName];
153
155
  }
154
- schema.properties[newName] = schema.properties[oldName];
155
- delete schema.properties[oldName];
156
- if (schema.required?.includes(oldName)) {
157
- schema.required = schema.required?.map((x) => (x === oldName ? newName : x));
156
+ newSchema.properties[newName] = newSchema.properties[oldName];
157
+ delete newSchema.properties[oldName];
158
+ if (newSchema.required?.includes(oldName)) {
159
+ newSchema.required = newSchema.required?.map((x) => (x === oldName ? newName : x));
158
160
  }
159
161
  // Replace the old name with the new name in the order array
160
- if (schema.order) {
161
- const index = schema.order.indexOf(oldName);
162
+ if (newSchema.order) {
163
+ const index = newSchema.order.indexOf(oldName);
162
164
  if (index !== -1) {
163
- schema.order[index] = newName;
165
+ newSchema.order[index] = newName;
164
166
  }
165
167
  }
166
168
  opened = newName;
167
- schema = $state.snapshot(schema);
168
- dispatch('change', schema);
169
+ schema = newSchema;
169
170
  sendUserToast('Argument renamed');
170
171
  }
171
172
  }
@@ -246,6 +247,7 @@ function updateDynSelectCode(functionName, lang = 'bun') {
246
247
  const code = generateFn(functionName);
247
248
  dynSelectCode = dynSelectCode ? dynSelectCode.concat(code) : code;
248
249
  }
250
+ let dndType = $state(generateRandomString());
249
251
  </script>
250
252
 
251
253
  <div class="w-full h-full">
@@ -282,15 +284,15 @@ function updateDynSelectCode(functionName, lang = 'bun') {
282
284
  class="min-h-0 overflow-y-auto grow rounded-md {runButton ? 'flex flex-col gap-2' : ''}"
283
285
  >
284
286
  <SchemaFormDnd
285
- nestedClasses={'flex flex-col gap-1'}
287
+ {dndType}
288
+ nestedClasses={'flex flex-col gap-1 ' + (schemaFormClassName ?? '')}
286
289
  bind:schema={
287
290
  () => (previewSchema ? previewSchema : schema),
288
291
  (newSchema) => {
289
292
  schema = newSchema
290
- tick().then(() => dispatch('change', schema))
291
293
  }
292
294
  }
293
- {dndType}
295
+ {hiddenArgs}
294
296
  {disableDnd}
295
297
  {onlyMaskPassword}
296
298
  bind:args
@@ -298,11 +300,16 @@ function updateDynSelectCode(functionName, lang = 'bun') {
298
300
  opened = e.detail
299
301
  }}
300
302
  on:reorder={(e) => {
303
+ let order = e.detail
304
+ let newProperties = {}
305
+ for (let key of order) {
306
+ newProperties[key] = schema.properties[key]
307
+ }
301
308
  schema = {
302
309
  ...schema,
310
+ properties: newProperties,
303
311
  order: e.detail
304
312
  }
305
- tick().then(() => dispatch('change', schema))
306
313
  }}
307
314
  helperScript={{
308
315
  type: 'inline',
@@ -314,9 +321,6 @@ function updateDynSelectCode(functionName, lang = 'bun') {
314
321
  {diff}
315
322
  on:acceptChange
316
323
  on:rejectChange
317
- on:nestedChange={() => {
318
- dispatch('change', schema)
319
- }}
320
324
  {shouldDispatchChanges}
321
325
  bind:isValid
322
326
  noVariablePicker={noVariablePicker || customUi?.disableVariablePicker === true}
@@ -324,8 +328,8 @@ function updateDynSelectCode(functionName, lang = 'bun') {
324
328
 
325
329
  {@render runButton?.()}
326
330
 
327
- <div class="h-full">
328
- {#if dynSelectFunctions.length > 0}
331
+ {#if dynSelectFunctions.length > 0}
332
+ <div class="grow">
329
333
  <Section
330
334
  label="Dynamic select functions"
331
335
  collapsable={true}
@@ -372,8 +376,8 @@ function updateDynSelectCode(functionName, lang = 'bun') {
372
376
  {/key}
373
377
  </div>
374
378
  </Section>
375
- {/if}
376
- </div>
379
+ </div>
380
+ {/if}
377
381
  </div>
378
382
  </div>
379
383
  </Pane>
@@ -390,22 +394,31 @@ function updateDynSelectCode(functionName, lang = 'bun') {
390
394
  {:else}
391
395
  <!-- WIP -->
392
396
  {#if jsonEnabled && customUi?.jsonOnly != true}
393
- <div class="w-full p-3 flex justify-end">
394
- <Toggle
395
- bind:checked={jsonView}
396
- label="JSON View"
397
- size="xs"
398
- options={{
399
- right: 'JSON editor',
400
- rightTooltip:
401
- 'Arguments can be edited either using the wizard, or by editing their JSON Schema.'
402
- }}
403
- lightMode
404
- on:change={() => {
405
- schemaString = JSON.stringify(schema, null, '\t')
406
- editor?.setCode(schemaString)
407
- }}
408
- />
397
+ <div class="w-full p-3 flex gap-4 justify-end items-center">
398
+ {#if addPropertyInEditorTab}
399
+ <AddPropertyV2 bind:schema>
400
+ {#snippet trigger()}
401
+ <Button color="light" size="xs" iconOnly startIcon={{ icon: Plus }} />
402
+ {/snippet}
403
+ </AddPropertyV2>
404
+ {/if}
405
+ <div class="shrink-0">
406
+ <Toggle
407
+ bind:checked={jsonView}
408
+ label="JSON View"
409
+ size="xs"
410
+ options={{
411
+ right: 'JSON editor',
412
+ rightTooltip:
413
+ 'Arguments can be edited either using the wizard, or by editing their JSON Schema.'
414
+ }}
415
+ lightMode
416
+ on:change={() => {
417
+ schemaString = JSON.stringify(schema, null, '\t')
418
+ editor?.setCode(schemaString)
419
+ }}
420
+ />
421
+ </div>
409
422
  </div>
410
423
  {/if}
411
424
 
@@ -498,7 +511,7 @@ function updateDynSelectCode(functionName, lang = 'bun') {
498
511
  </div>
499
512
  {#if opened === argName}
500
513
  <div class="p-4 border-t">
501
- {#if !hiddenArgs.includes(argName) && Object.keys(schema?.properties ?? {}).includes(argName)}
514
+ {#if Object.keys(schema?.properties ?? {}).includes(argName)}
502
515
  {#if typeof args == 'object' && schema?.properties[argName]}
503
516
  <PropertyEditor
504
517
  bind:description={schema.properties[argName].description}
@@ -519,10 +532,6 @@ function updateDynSelectCode(functionName, lang = 'bun') {
519
532
  bind:order={schema.properties[argName].order}
520
533
  {isFlowInput}
521
534
  {isAppInput}
522
- on:change={() => {
523
- schema = $state.snapshot(schema)
524
- dispatch('change', schema)
525
- }}
526
535
  >
527
536
  {#snippet typeeditor()}
528
537
  {#if isFlowInput || isAppInput}
@@ -536,7 +545,6 @@ function updateDynSelectCode(functionName, lang = 'bun') {
536
545
  const isS3 = v == 'S3'
537
546
  const isOneOf = v == 'oneOf'
538
547
  const isDynSelect = v == 'dynselect'
539
-
540
548
  const emptyProperty = {
541
549
  contentEncoding: undefined,
542
550
  enum_: undefined,
@@ -612,13 +620,9 @@ function updateDynSelectCode(functionName, lang = 'bun') {
612
620
  type: v
613
621
  }
614
622
  }
623
+ schema.properties = schema.properties
615
624
  }
616
625
  }
617
- on:selected={(e) => {
618
- schema = schema
619
- dispatch('change', schema)
620
- dispatch('schemaChange')
621
- }}
622
626
  >
623
627
  {#snippet children({ item })}
624
628
  {#each typeOptions as x}
@@ -632,6 +636,9 @@ function updateDynSelectCode(functionName, lang = 'bun') {
632
636
 
633
637
  {#if isFlowInput || isAppInput}
634
638
  <FlowPropertyEditor
639
+ onDrawerClose={() => {
640
+ dndType = generateRandomString()
641
+ }}
635
642
  bind:defaultValue={schema.properties[argName].default}
636
643
  {variableEditor}
637
644
  {itemPicker}
@@ -662,12 +669,6 @@ function updateDynSelectCode(functionName, lang = 'bun') {
662
669
  (x) => x !== argName
663
670
  )
664
671
  }
665
- dispatch('change', schema)
666
- }}
667
- on:schemaChange={(e) => {
668
- schema = $state.snapshot(schema)
669
- dispatch('change', schema)
670
- dispatch('schemaChange')
671
672
  }}
672
673
  />
673
674
  {/if}
@@ -692,7 +693,6 @@ function updateDynSelectCode(functionName, lang = 'bun') {
692
693
  on:change={() => {
693
694
  try {
694
695
  schema = JSON.parse(schemaString)
695
- dispatch('change', schema)
696
696
  error = ''
697
697
  } catch (err) {
698
698
  error = err.message
@@ -16,7 +16,6 @@ interface Props {
16
16
  isAppInput?: boolean;
17
17
  displayWebhookWarning?: boolean;
18
18
  onlyMaskPassword?: boolean;
19
- dndType?: string | undefined;
20
19
  editTab: 'inputEditor' | 'history' | 'savedInputs' | 'json' | 'captures' | 'firstStepInputs' | undefined;
21
20
  previewSchema?: Record<string, any> | undefined;
22
21
  editPanelInitialSize?: number | undefined;
@@ -31,10 +30,13 @@ interface Props {
31
30
  dynSelectCode?: string | undefined;
32
31
  dynSelectLang?: ScriptLang | undefined;
33
32
  showDynSelectOpt?: boolean;
33
+ addPropertyInEditorTab?: boolean;
34
34
  openEditTab?: import('svelte').Snippet;
35
35
  addProperty?: import('svelte').Snippet;
36
36
  runButton?: import('svelte').Snippet;
37
37
  extraTab?: import('svelte').Snippet;
38
+ schemaFormClassName?: string;
39
+ onChange?: (args: Record<string, any>) => void;
38
40
  }
39
41
  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> {
40
42
  new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
@@ -52,9 +54,7 @@ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> =
52
54
  declare const EditableSchemaForm: $$__sveltets_2_IsomorphicComponent<Props, {
53
55
  acceptChange: CustomEvent<any>;
54
56
  rejectChange: CustomEvent<any>;
55
- change: CustomEvent<any>;
56
57
  delete: CustomEvent<any>;
57
- schemaChange: CustomEvent<any>;
58
58
  editPanelSizeChanged: CustomEvent<any>;
59
59
  } & {
60
60
  [evt: string]: CustomEvent<any>;
@@ -107,14 +107,14 @@ import AIChatInlineWidget from './copilot/chat/AIChatInlineWidget.svelte';
107
107
  import { writable } from 'svelte/store';
108
108
  import { formatResourceTypes } from './copilot/chat/script/core';
109
109
  import FakeMonacoPlaceHolder from './FakeMonacoPlaceHolder.svelte';
110
- import { editorPositionMap, readFieldsRecursively } from '../utils';
110
+ import { editorPositionMap } from '../utils';
111
111
  import { extToLang, langToExt } from '../editorLangUtils';
112
112
  import { aiChatManager } from './copilot/chat/AIChatManager.svelte';
113
113
  import { getDbSchemas } from './apps/components/display/dbtable/utils';
114
114
  // import EditorTheme from './EditorTheme.svelte'
115
115
  let divEl = $state(null);
116
116
  let editor = $state(null);
117
- let { code = $bindable(), cmdEnterAction = undefined, formatAction = undefined, automaticLayout = true, websocketAlive = $bindable(), shouldBindKey = true, fixedOverflowWidgets = true, path = undefined, yContent = undefined, awareness = undefined, folding = false, args = undefined, useWebsockets = true, small = false, scriptLang, disabled = false, lineNumbersMinChars = 3, files = {}, extraLib = undefined, changeTimeout = 500, loadAsync = false, key = undefined, class: clazz = undefined } = $props();
117
+ let { code = $bindable(), cmdEnterAction = undefined, formatAction = undefined, automaticLayout = true, websocketAlive = $bindable(), shouldBindKey = true, fixedOverflowWidgets = true, path = undefined, yContent = undefined, awareness = undefined, folding = false, args = undefined, useWebsockets = true, small = false, scriptLang, disabled = false, lineNumbersMinChars = 3, files = {}, extraLib = undefined, changeTimeout = 500, loadAsync = false, key = undefined, class: clazz = undefined, moduleId = undefined } = $props();
118
118
  $effect.pre(() => {
119
119
  if (websocketAlive == undefined) {
120
120
  websocketAlive = {
@@ -406,8 +406,7 @@ function addSqlTypeCompletions() {
406
406
  });
407
407
  }
408
408
  let sqlSchemaCompletor = undefined;
409
- async function updateSchema() {
410
- const newSchemaRes = lang === 'graphql' ? args?.api : args?.database;
409
+ async function updateSchema(newSchemaRes) {
411
410
  if (typeof newSchemaRes === 'string') {
412
411
  const resourcePath = newSchemaRes.replace('$res:', '');
413
412
  dbSchema = $dbSchemas[resourcePath];
@@ -530,7 +529,16 @@ let showInlineAIChat = $state(false);
530
529
  let inlineAIChatSelection = $state(null);
531
530
  let selectedCode = $state('');
532
531
  export function reviewAndApplyCode(code, applyAll = false) {
533
- aiChatEditorHandler?.reviewAndApply(code, applyAll);
532
+ aiChatEditorHandler?.reviewChanges(code, { applyAll, mode: 'apply' });
533
+ }
534
+ export function reviewAppliedCode(originalCode, opts) {
535
+ aiChatEditorHandler?.reviewChanges(originalCode, {
536
+ mode: 'revert',
537
+ onFinishedReview: opts?.onFinishedReview
538
+ });
539
+ }
540
+ export function getAiChatEditorHandler() {
541
+ return aiChatEditorHandler;
534
542
  }
535
543
  function addChatHandler(editor) {
536
544
  try {
@@ -1077,7 +1085,7 @@ async function loadMonaco() {
1077
1085
  (selection.startLineNumber !== selection.endLineNumber ||
1078
1086
  selection.startColumn !== selection.endColumn);
1079
1087
  if (hasSelection && selectedLines) {
1080
- aiChatManager.addSelectedLinesToContext(selectedLines, selection.startLineNumber, selection.endLineNumber);
1088
+ aiChatManager.addSelectedLinesToContext(selectedLines, selection.startLineNumber, selection.endLineNumber, moduleId);
1081
1089
  }
1082
1090
  else {
1083
1091
  aiChatManager.toggleOpen();
@@ -1322,10 +1330,13 @@ $effect(() => {
1322
1330
  ? untrack(() => addSqlTypeCompletions())
1323
1331
  : sqlTypeCompletor?.dispose();
1324
1332
  });
1333
+ let lastArg = undefined;
1325
1334
  $effect(() => {
1326
- console.log('updating schema', lang, $dbSchemas);
1327
- readFieldsRecursively(args);
1328
- lang && $dbSchemas && untrack(() => updateSchema());
1335
+ let newArg = lang === 'graphql' ? args?.api : args?.database;
1336
+ if (newArg !== lastArg) {
1337
+ lastArg = newArg;
1338
+ $dbSchemas && untrack(() => updateSchema(newArg));
1339
+ }
1329
1340
  });
1330
1341
  $effect(() => {
1331
1342
  console.log('updating db schema completions', dbSchema, lang);
@@ -1396,10 +1407,20 @@ $effect(() => {
1396
1407
  {#if $reviewingChanges}
1397
1408
  <GlobalReviewButtons
1398
1409
  onAcceptAll={() => {
1399
- aiChatEditorHandler?.acceptAll()
1410
+ const mode = aiChatEditorHandler?.getReviewMode?.()
1411
+ if (mode === 'revert') {
1412
+ aiChatEditorHandler?.keepAll()
1413
+ } else {
1414
+ aiChatEditorHandler?.acceptAll()
1415
+ }
1400
1416
  }}
1401
1417
  onRejectAll={() => {
1402
- aiChatEditorHandler?.rejectAll()
1418
+ const mode = aiChatEditorHandler?.getReviewMode?.()
1419
+ if (mode === 'revert') {
1420
+ aiChatEditorHandler?.revertAll()
1421
+ } else {
1422
+ aiChatEditorHandler?.rejectAll()
1423
+ }
1403
1424
  }}
1404
1425
  />
1405
1426
  {/if}
@@ -4,6 +4,7 @@ import { type Preview } from '../gen';
4
4
  import type { Text } from 'yjs';
5
5
  import { editor as meditor, type IDisposable } from 'monaco-editor';
6
6
  import { type DepsToGet } from '../ata/index';
7
+ import { AIChatEditorHandler } from './copilot/chat/monaco-adapter';
7
8
  interface Props {
8
9
  code?: string;
9
10
  cmdEnterAction?: (() => void) | undefined;
@@ -31,6 +32,7 @@ interface Props {
31
32
  loadAsync?: boolean;
32
33
  key?: string | undefined;
33
34
  class?: string | undefined;
35
+ moduleId?: string;
34
36
  }
35
37
  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> {
36
38
  new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
@@ -72,6 +74,10 @@ declare const Editor: $$__sveltets_2_IsomorphicComponent<Props, {
72
74
  format: () => Promise<void>;
73
75
  getScriptLang: () => string | undefined;
74
76
  reviewAndApplyCode: (code: string, applyAll?: boolean) => void;
77
+ reviewAppliedCode: (originalCode: string, opts?: {
78
+ onFinishedReview?: () => void;
79
+ }) => void;
80
+ getAiChatEditorHandler: () => AIChatEditorHandler | undefined;
75
81
  reloadWebsocket: () => Promise<void>;
76
82
  fetchPackageDeps: (deps: DepsToGet) => Promise<void>;
77
83
  addAction: (id: string, label: string, callback: (editor: meditor.IStandaloneCodeEditor) => void, keybindings?: number[]) => void;
@@ -31,7 +31,7 @@ import S3FilePicker from './S3FilePicker.svelte';
31
31
  import DucklakeIcon from './icons/DucklakeIcon.svelte';
32
32
  import FlowInlineScriptAiButton from './copilot/FlowInlineScriptAIButton.svelte';
33
33
  import ScriptGen from './copilot/ScriptGen.svelte';
34
- let { lang, editor, websocketAlive, iconOnly = false, validCode = true, kind = 'script', template = 'script', collabMode = false, collabLive = false, collabUsers = [], scriptPath = undefined, diffEditor = undefined, args, noHistory = false, saveToWorkspace = false, customUi = {}, lastDeployedCode = undefined, diffMode = false, showHistoryDrawer = $bindable(false), right, openAiChat = false } = $props();
34
+ let { lang, editor, websocketAlive, iconOnly = false, validCode = true, kind = 'script', template = 'script', collabMode = false, collabLive = false, collabUsers = [], scriptPath = undefined, diffEditor = undefined, args, noHistory = false, saveToWorkspace = false, customUi = {}, lastDeployedCode = undefined, diffMode = false, showHistoryDrawer = $bindable(false), right, openAiChat = false, moduleId = undefined } = $props();
35
35
  let contextualVariablePicker = $state();
36
36
  let variablePicker = $state();
37
37
  let resourcePicker = $state();
@@ -870,7 +870,7 @@ JsonNode ${windmillPathToCamelCaseName(path)} = JsonNode.Parse(await client.GetS
870
870
 
871
871
  {#if customUi?.aiGen != false}
872
872
  {#if openAiChat}
873
- <FlowInlineScriptAiButton />
873
+ <FlowInlineScriptAiButton {moduleId} />
874
874
  {:else}
875
875
  <ScriptGen {editor} {diffEditor} {lang} {iconOnly} {args} />
876
876
  {/if}
@@ -33,6 +33,7 @@ interface Props {
33
33
  showHistoryDrawer?: boolean;
34
34
  right?: import('svelte').Snippet;
35
35
  openAiChat?: boolean;
36
+ moduleId?: string;
36
37
  }
37
38
  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> {
38
39
  new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
@@ -38,7 +38,7 @@ export let simpleTooltipIconClass = '';
38
38
  {/if}
39
39
 
40
40
  {#if displayType}
41
- {#if format && !format.startsWith('resource')}
41
+ {#if format && !format.startsWith('resource') && !format.startsWith('jsonschema-')}
42
42
  <span class="text-xs italic ml-2 text-tertiary dark:text-indigo-400">
43
43
  {format}
44
44
  </span>
@@ -33,7 +33,7 @@ import DeployButton from './DeployButton.svelte';
33
33
  import { deployTriggers, filterDraftTriggers, handleSelectTriggerFromKind } from './triggers/utils';
34
34
  import DraftTriggersConfirmationModal from './common/confirmationModal/DraftTriggersConfirmationModal.svelte';
35
35
  import { Triggers } from './triggers/triggers.svelte';
36
- import { TestSteps } from './flows/testSteps.svelte';
36
+ import { StepsInputArgs } from './flows/stepsInputArgs.svelte';
37
37
  import { aiChatManager } from './copilot/chat/AIChatManager.svelte';
38
38
  import { setStepHistoryLoaderContext, StepHistoryLoader } from './stepHistoryLoader.svelte';
39
39
  import { ModulesTestStates } from './modulesTest.svelte';
@@ -440,7 +440,7 @@ const flowInputEditorStateStore = writable({
440
440
  editPanelSize: 0,
441
441
  payloadData: undefined
442
442
  });
443
- const testSteps = new TestSteps();
443
+ const stepsInputArgs = new StepsInputArgs();
444
444
  function select(selectedId) {
445
445
  selectedIdStore.set(selectedId);
446
446
  }
@@ -458,7 +458,7 @@ setContext('FlowEditorContext', {
458
458
  flowStateStore,
459
459
  flowStore,
460
460
  pathStore,
461
- testSteps,
461
+ stepsInputArgs,
462
462
  saveDraft,
463
463
  initialPathStore,
464
464
  fakeInitialPath,
@@ -909,6 +909,8 @@ const flowHasChanged = $derived(flowPreviewContent?.flowHasChanged());
909
909
  bind:this={flowPreviewButtons}
910
910
  {loading}
911
911
  onRunPreview={() => {
912
+ // Reset manually edited args inputs when running a preview
913
+ stepsInputArgs.resetManuallyEditedArgs()
912
914
  modulesTestStates.hideJobsInGraph()
913
915
  localModuleStates = {}
914
916
  showJobStatus = true
@@ -950,7 +952,7 @@ const flowHasChanged = $derived(flowPreviewContent?.flowHasChanged());
950
952
  {newFlow}
951
953
  on:applyArgs={(ev) => {
952
954
  if (ev.detail.kind === 'preprocessor') {
953
- testSteps.setStepArgs('preprocessor', ev.detail.args ?? {})
955
+ stepsInputArgs.setStepArgs('preprocessor', ev.detail.args ?? {})
954
956
  $selectedIdStore = 'preprocessor'
955
957
  }
956
958
  }}
@@ -998,6 +1000,7 @@ const flowHasChanged = $derived(flowPreviewContent?.flowHasChanged());
998
1000
  delete modulesTestStates.states[id]
999
1001
  }}
1000
1002
  {flowHasChanged}
1003
+ previewOpen={flowPreviewButtons?.getPreviewOpen()}
1001
1004
  />
1002
1005
  {:else}
1003
1006
  <CenteredPage>Loading...</CenteredPage>
@@ -67,7 +67,7 @@ export async function runPreview(args, restartedFrom) {
67
67
  jobId = await runFlowPreview(args, newFlow, $pathStore, restartedFrom);
68
68
  isRunning = true;
69
69
  if (inputSelected) {
70
- savedArgs = previewArgs.val;
70
+ savedArgs = $state.snapshot(previewArgs.val);
71
71
  inputSelected = undefined;
72
72
  }
73
73
  onRunPreview?.();
@@ -92,7 +92,7 @@ function onKeyDown(event) {
92
92
  if (preventEscape) {
93
93
  selectInput(undefined);
94
94
  event.preventDefault();
95
- event.stopPropagation;
95
+ event.stopPropagation();
96
96
  }
97
97
  break;
98
98
  }
@@ -423,7 +423,7 @@ export function flowHasChanged() {
423
423
  schema={flowStore.val.schema}
424
424
  bind:args={previewArgs.val}
425
425
  on:change={() => {
426
- savedArgs = previewArgs.val
426
+ savedArgs = $state.snapshot(previewArgs.val)
427
427
  }}
428
428
  bind:isValid
429
429
  helperScript={flowStore.val.schema?.['x-windmill-dyn-select-code'] &&
@@ -43,6 +43,8 @@ let refreshGlobal = async (moduleId, clear, root) => {
43
43
  let updateGlobalRefresh = (moduleId, updateFn) => {
44
44
  globalRefreshes[moduleId] = [...(globalRefreshes[moduleId] ?? []), updateFn];
45
45
  };
46
+ let storedToolCallJobs = $state({});
47
+ let toolCallIndicesToLoad = $state([]);
46
48
  </script>
47
49
 
48
50
  <FlowStatusViewerInner
@@ -74,4 +76,30 @@ let updateGlobalRefresh = (moduleId, updateFn) => {
74
76
  isNodeSelected={true}
75
77
  {refreshGlobal}
76
78
  {updateGlobalRefresh}
79
+ toolCallStore={{
80
+ getStoredToolCallJob: (storeKey: string) => storedToolCallJobs[storeKey],
81
+ setStoredToolCallJob: (storeKey: string, job: Job) => {
82
+ storedToolCallJobs[storeKey] = job
83
+ },
84
+ getLocalToolCallJobs: (prefix: string) => {
85
+ // we return a map from tool call index to job
86
+ // to do so, we filter the storedToolCallJobs object by the prefix and we make sure what's left in the key is a tool call index: 2 part of format agentModuleId-toolCallIndex
87
+ // and not a further nested tool call index
88
+ return Object.fromEntries(
89
+ Object.entries(storedToolCallJobs)
90
+ .filter(
91
+ ([key]) => key.startsWith(prefix) && key.replace(prefix, '').split('-').length === 2
92
+ )
93
+ .map(([key, job]) => [Number(key.replace(prefix, '').split('-').pop()), job])
94
+ )
95
+ },
96
+ isToolCallToBeLoaded: (storeKey: string) => {
97
+ return toolCallIndicesToLoad.includes(storeKey)
98
+ },
99
+ addToolCallToLoad: (storeKey: string) => {
100
+ if (!toolCallIndicesToLoad.includes(storeKey)) {
101
+ toolCallIndicesToLoad.push(storeKey)
102
+ }
103
+ }
104
+ }}
77
105
  />