windmill-components 1.444.2 → 1.447.4

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 (229) hide show
  1. package/package/autosize.js +1 -1
  2. package/package/components/AppConnectInner.svelte +2 -1
  3. package/package/components/ArgInput.svelte +37 -24
  4. package/package/components/CapturesInputs.svelte +16 -0
  5. package/package/components/CapturesInputs.svelte.d.ts +21 -0
  6. package/package/components/Dev.svelte +7 -1
  7. package/package/components/EditableSchemaForm.svelte +369 -290
  8. package/package/components/EditableSchemaForm.svelte.d.ts +12 -2
  9. package/package/components/Editor.svelte +5 -7
  10. package/package/components/FirstStepInputs.svelte +111 -0
  11. package/package/components/FirstStepInputs.svelte.d.ts +17 -0
  12. package/package/components/FlowBuilder.svelte +28 -7
  13. package/package/components/FlowPreviewContent.svelte +72 -1
  14. package/package/components/FlowPreviewContent.svelte.d.ts +1 -0
  15. package/package/components/GfmMarkdown.svelte +93 -2
  16. package/package/components/HighlightCode.svelte +2 -0
  17. package/package/components/HistoricInputs.svelte +193 -0
  18. package/package/components/HistoricInputs.svelte.d.ts +20 -0
  19. package/package/components/InfiniteList.svelte +161 -0
  20. package/package/components/InfiniteList.svelte.d.ts +40 -0
  21. package/package/components/LightweightArgInput.svelte +19 -15
  22. package/package/components/MoveDrawer.svelte +2 -1
  23. package/package/components/Path.svelte +7 -1
  24. package/package/components/Path.svelte.d.ts +1 -1
  25. package/package/components/ResourcePicker.svelte +2 -1
  26. package/package/components/ResourcePicker.svelte.d.ts +1 -0
  27. package/package/components/ResultJobLoader.svelte.d.ts +1 -1
  28. package/package/components/SaveInputsButton.svelte +53 -0
  29. package/package/components/SaveInputsButton.svelte.d.ts +24 -0
  30. package/package/components/SavedInputs.svelte +33 -61
  31. package/package/components/SavedInputsPicker.svelte +264 -0
  32. package/package/components/SavedInputsPicker.svelte.d.ts +20 -0
  33. package/package/components/ScheduleEditorInner.svelte +0 -1
  34. package/package/components/SchemaForm.svelte +22 -3
  35. package/package/components/ScriptBuilder.svelte +595 -562
  36. package/package/components/ScriptEditor.svelte +10 -3
  37. package/package/components/ScriptEditor.svelte.d.ts +5 -2
  38. package/package/components/ScriptSchema.svelte +1 -2
  39. package/package/components/Section.svelte +6 -4
  40. package/package/components/ShareModal.svelte.d.ts +2 -2
  41. package/package/components/SimpleEditor.svelte +39 -7
  42. package/package/components/SimpleEditor.svelte.d.ts +1 -4
  43. package/package/components/StringTypeNarrowing.svelte +3 -1
  44. package/package/components/TestConnection.svelte +5 -0
  45. package/package/components/TestJobLoader.svelte.d.ts +1 -1
  46. package/package/components/WorkerGroup.svelte +2 -1
  47. package/package/components/apps/components/inputs/AppS3FileInput.svelte +1 -0
  48. package/package/components/apps/editor/component/components.d.ts +79 -79
  49. package/package/components/apps/editor/component/default-codes.d.ts +1 -1
  50. package/package/components/apps/editor/component/default-codes.js +10 -10
  51. package/package/components/apps/editor/settingsPanel/inputEditor/StaticInputEditor.svelte +2 -1
  52. package/package/components/apps/inputType.d.ts +2 -2
  53. package/package/components/common/button/Button.svelte +10 -52
  54. package/package/components/common/button/PulseButton.svelte +81 -0
  55. package/package/components/common/button/PulseButton.svelte.d.ts +34 -0
  56. package/package/components/common/button/RoundIconButton.svelte +11 -0
  57. package/package/components/common/button/RoundIconButton.svelte.d.ts +19 -0
  58. package/package/components/common/button/model.d.ts +1 -0
  59. package/package/components/common/button/model.js +47 -0
  60. package/package/components/common/fileUpload/FileUpload.svelte +3 -1
  61. package/package/components/common/fileUpload/FileUpload.svelte.d.ts +1 -0
  62. package/package/components/common/languageIcons/LanguageIcon.svelte +3 -0
  63. package/package/components/common/layout/List.svelte +10 -4
  64. package/package/components/common/layout/List.svelte.d.ts +1 -0
  65. package/package/components/common/tabs/Tab.svelte +14 -1
  66. package/package/components/common/tabs/Tab.svelte.d.ts +1 -0
  67. package/package/components/copilot/ScriptGen.svelte +1 -1
  68. package/package/components/copilot/lib.js +1 -1
  69. package/package/components/copilot/prompts/edit.yaml +1 -1
  70. package/package/components/copilot/prompts/editPrompt.js +1 -1
  71. package/package/components/copilot/prompts/fix.yaml +1 -1
  72. package/package/components/copilot/prompts/fixPrompt.js +1 -1
  73. package/package/components/copilot/prompts/gen.yaml +1 -1
  74. package/package/components/copilot/prompts/genPrompt.js +1 -1
  75. package/package/components/custom_ui.d.ts +1 -0
  76. package/package/components/details/DetailPageDetailPanel.svelte +20 -19
  77. package/package/components/details/DetailPageDetailPanel.svelte.d.ts +4 -1
  78. package/package/components/details/DetailPageLayout.svelte +4 -1
  79. package/package/components/details/DetailPageLayout.svelte.d.ts +3 -0
  80. package/package/components/details/DetailPageTriggerPanel.svelte +84 -63
  81. package/package/components/details/DetailPageTriggerPanel.svelte.d.ts +3 -1
  82. package/package/components/details/EmailTriggerConfigSection.svelte +1 -1
  83. package/package/components/details/EmailTriggerConfigSection.svelte.d.ts +2 -1
  84. package/package/components/details/EmailTriggerPanel.svelte +2 -0
  85. package/package/components/details/EmailTriggerPanel.svelte.d.ts +2 -0
  86. package/package/components/flows/FlowEditor.svelte +8 -2
  87. package/package/components/flows/FlowEditor.svelte.d.ts +1 -0
  88. package/package/components/flows/common/FlowCard.svelte +12 -6
  89. package/package/components/flows/content/DynamicInputHelpBox.svelte +1 -0
  90. package/package/components/flows/content/FlowEditorPanel.svelte +15 -9
  91. package/package/components/flows/content/FlowEditorPanel.svelte.d.ts +1 -0
  92. package/package/components/flows/content/FlowInput.svelte +449 -98
  93. package/package/components/flows/content/FlowInput.svelte.d.ts +2 -0
  94. package/package/components/flows/content/FlowInputEditor.svelte +46 -0
  95. package/package/components/flows/content/FlowInputEditor.svelte.d.ts +25 -0
  96. package/package/components/flows/content/FlowInputsQuick.svelte +1 -1
  97. package/package/components/flows/content/FlowLoop.svelte +192 -194
  98. package/package/components/flows/content/FlowModuleComponent.svelte +372 -382
  99. package/package/components/flows/content/FlowModuleMock.svelte +6 -7
  100. package/package/components/flows/content/FlowPathViewer.svelte +2 -1
  101. package/package/components/flows/content/FlowSettings.svelte +25 -3
  102. package/package/components/flows/content/FlowWhileLoop.svelte +97 -99
  103. package/package/components/flows/flowStore.d.ts +13 -0
  104. package/package/components/flows/flowStore.js +41 -0
  105. package/package/components/flows/header/FlowPreviewButtons.svelte +10 -4
  106. package/package/components/flows/header/FlowPreviewButtons.svelte.d.ts +4 -2
  107. package/package/components/flows/header/FlowYamlEditor.svelte +3 -0
  108. package/package/components/flows/map/FlowModuleSchemaItem.svelte +8 -58
  109. package/package/components/flows/map/FlowModuleSchemaItemViewer.svelte +67 -0
  110. package/package/components/flows/map/FlowModuleSchemaItemViewer.svelte.d.ts +24 -0
  111. package/package/components/flows/map/FlowModuleSchemaMap.svelte +2 -2
  112. package/package/components/flows/pickers/FlowScriptPicker.svelte +1 -1
  113. package/package/components/flows/previousResults.d.ts +1 -1
  114. package/package/components/flows/previousResults.js +7 -2
  115. package/package/components/flows/types.d.ts +7 -0
  116. package/package/components/flows/utils.d.ts +1 -0
  117. package/package/components/flows/utils.js +3 -0
  118. package/package/components/graph/graphBuilder.js +1 -1
  119. package/package/components/graph/renderers/triggers/TriggersBadge.svelte +22 -8
  120. package/package/components/graph/renderers/triggers/TriggersBadge.svelte.d.ts +1 -1
  121. package/package/components/icons/NatsIcon.svelte +19 -0
  122. package/package/components/icons/NatsIcon.svelte.d.ts +18 -0
  123. package/package/components/icons/OracleDBIcon.svelte +15 -0
  124. package/package/components/icons/OracleDBIcon.svelte.d.ts +25 -0
  125. package/package/components/icons/index.d.ts +7 -1
  126. package/package/components/icons/index.js +8 -2
  127. package/package/components/meltComponents/ButtonDropDown.svelte +32 -0
  128. package/package/components/meltComponents/ButtonDropDown.svelte.d.ts +27 -0
  129. package/package/components/meltComponents/Popover.svelte +7 -4
  130. package/package/components/meltComponents/Popover.svelte.d.ts +1 -0
  131. package/package/components/runs/RunsFilter.svelte +2 -2
  132. package/package/components/schema/AddPropertyFormV2.svelte +46 -0
  133. package/package/components/schema/AddPropertyFormV2.svelte.d.ts +18 -0
  134. package/package/components/schema/AddPropertyV2.svelte +151 -0
  135. package/package/components/schema/AddPropertyV2.svelte.d.ts +25 -0
  136. package/package/components/schema/EditableSchemaDrawer.svelte +17 -8
  137. package/package/components/schema/EditableSchemaWrapper.svelte +58 -14
  138. package/package/components/schema/EditableSchemaWrapper.svelte.d.ts +0 -1
  139. package/package/components/schema/FlowPropertyEditor.svelte +8 -3
  140. package/package/components/schema/JobSchemaPicker.svelte +32 -0
  141. package/package/components/schema/JobSchemaPicker.svelte.d.ts +19 -0
  142. package/package/components/schema/PropertyEditor.svelte +9 -1
  143. package/package/components/schema/RunningJobSchemaPicker.svelte +67 -0
  144. package/package/components/schema/RunningJobSchemaPicker.svelte.d.ts +21 -0
  145. package/package/components/schema/SchemaFormDND.svelte +1 -1
  146. package/package/components/schema/SchemaPicker.svelte +92 -0
  147. package/package/components/schema/SchemaPicker.svelte.d.ts +23 -0
  148. package/package/components/schema/SchemaPickerRow.svelte +95 -0
  149. package/package/components/schema/SchemaPickerRow.svelte.d.ts +22 -0
  150. package/package/components/scriptEditor/LogPanel.svelte +1 -1
  151. package/package/components/settings/ChangeWorkspaceColor.svelte +103 -0
  152. package/package/components/settings/ChangeWorkspaceColor.svelte.d.ts +16 -0
  153. package/package/components/settings/ChangeWorkspaceId.svelte +1 -0
  154. package/package/components/settings/ChangeWorkspaceName.svelte +4 -0
  155. package/package/components/sidebar/MenuButton.svelte +5 -2
  156. package/package/components/sidebar/MenuButton.svelte.d.ts +1 -0
  157. package/package/components/sidebar/SidebarContent.svelte +8 -0
  158. package/package/components/sidebar/WorkspaceMenu.svelte +40 -21
  159. package/package/components/table/DataTable.svelte +43 -3
  160. package/package/components/table/DataTable.svelte.d.ts +2 -0
  161. package/package/components/table/Head.svelte +1 -1
  162. package/package/components/table/Row.svelte +11 -1
  163. package/package/components/table/Row.svelte.d.ts +3 -0
  164. package/package/components/table/index.d.ts +3 -0
  165. package/package/components/table/index.js +3 -0
  166. package/package/components/triggers/CaptureButton.svelte +38 -4
  167. package/package/components/triggers/CaptureButton.svelte.d.ts +3 -1
  168. package/package/components/triggers/CaptureIcon.svelte +7 -4
  169. package/package/components/triggers/CaptureIcon.svelte.d.ts +7 -13
  170. package/package/components/triggers/CaptureSection.svelte +50 -17
  171. package/package/components/triggers/CaptureSection.svelte.d.ts +5 -3
  172. package/package/components/triggers/CaptureTable.svelte +239 -186
  173. package/package/components/triggers/CaptureTable.svelte.d.ts +9 -11
  174. package/package/components/triggers/CaptureWrapper.svelte +126 -109
  175. package/package/components/triggers/CaptureWrapper.svelte.d.ts +3 -1
  176. package/package/components/triggers/KafkaTriggerEditorInner.svelte +1 -0
  177. package/package/components/triggers/KafkaTriggersConfigSection.svelte +16 -4
  178. package/package/components/triggers/KafkaTriggersConfigSection.svelte.d.ts +3 -1
  179. package/package/components/triggers/KafkaTriggersPanel.svelte +2 -0
  180. package/package/components/triggers/KafkaTriggersPanel.svelte.d.ts +2 -0
  181. package/package/components/triggers/NatsTriggerEditor.svelte +19 -0
  182. package/package/components/triggers/NatsTriggerEditor.svelte.d.ts +21 -0
  183. package/package/components/triggers/NatsTriggerEditorInner.svelte +239 -0
  184. package/package/components/triggers/NatsTriggerEditorInner.svelte.d.ts +21 -0
  185. package/package/components/triggers/NatsTriggersConfigSection.svelte +276 -0
  186. package/package/components/triggers/NatsTriggersConfigSection.svelte.d.ts +37 -0
  187. package/package/components/triggers/NatsTriggersPanel.svelte +126 -0
  188. package/package/components/triggers/NatsTriggersPanel.svelte.d.ts +26 -0
  189. package/package/components/triggers/RouteEditorConfigSection.svelte +12 -2
  190. package/package/components/triggers/RouteEditorConfigSection.svelte.d.ts +5 -1
  191. package/package/components/triggers/RouteEditorInner.svelte +5 -0
  192. package/package/components/triggers/RoutesPanel.svelte +4 -0
  193. package/package/components/triggers/RoutesPanel.svelte.d.ts +3 -0
  194. package/package/components/triggers/TriggersEditor.svelte +146 -97
  195. package/package/components/triggers/TriggersEditor.svelte.d.ts +2 -0
  196. package/package/components/triggers/TriggersEditorSection.svelte +19 -13
  197. package/package/components/triggers/TriggersEditorSection.svelte.d.ts +3 -0
  198. package/package/components/triggers/TriggersWrapper.svelte +7 -3
  199. package/package/components/triggers/TriggersWrapper.svelte.d.ts +2 -1
  200. package/package/components/triggers/WebhooksConfigSection.svelte +1 -0
  201. package/package/components/triggers/WebhooksConfigSection.svelte.d.ts +2 -1
  202. package/package/components/triggers/WebhooksPanel.svelte +2 -0
  203. package/package/components/triggers/WebhooksPanel.svelte.d.ts +2 -0
  204. package/package/components/triggers/WebsocketEditorConfigSection.svelte +3 -1
  205. package/package/components/triggers/WebsocketEditorConfigSection.svelte.d.ts +2 -1
  206. package/package/components/triggers/WebsocketTriggersPanel.svelte +2 -0
  207. package/package/components/triggers/WebsocketTriggersPanel.svelte.d.ts +2 -0
  208. package/package/components/triggers.d.ts +2 -1
  209. package/package/components/triggers.js +2 -0
  210. package/package/components/vscode.js +12 -8
  211. package/package/consts.d.ts +1 -0
  212. package/package/consts.js +18 -0
  213. package/package/gen/core/OpenAPI.js +1 -1
  214. package/package/gen/schemas.gen.d.ts +207 -13
  215. package/package/gen/schemas.gen.js +207 -13
  216. package/package/gen/services.gen.d.ts +118 -10
  217. package/package/gen/services.gen.js +237 -17
  218. package/package/gen/types.gen.d.ts +400 -40
  219. package/package/hubPaths.json +2 -1
  220. package/package/infer.js +11 -2
  221. package/package/monaco_workers/build_workers.js +39 -37
  222. package/package/monaco_workers/graphql.worker.bundle.js +18371 -36513
  223. package/package/script_helpers.d.ts +5 -2
  224. package/package/script_helpers.js +46 -8
  225. package/package/scripts.js +4 -0
  226. package/package/stores.d.ts +2 -1
  227. package/package/stores.js +2 -1
  228. package/package.json +14 -16
  229. package/package/monaco_workers/graphql.worker.bundle.d.ts +0 -0
@@ -93,15 +93,17 @@ async function loadTriggers() {
93
93
  }
94
94
  const triggerDefaultValuesStore = writable(undefined);
95
95
  const captureOn = writable(undefined);
96
+ const showCaptureHint = writable(undefined);
96
97
  setContext('TriggerContext', {
97
98
  selectedTrigger: selectedTriggerStore,
98
99
  primarySchedule: primaryScheduleStore,
99
100
  triggersCount,
100
101
  simplifiedPoll,
101
102
  defaultValues: triggerDefaultValuesStore,
102
- captureOn: captureOn
103
+ captureOn: captureOn,
104
+ showCaptureHint: showCaptureHint
103
105
  });
104
- const enterpriseLangs = ['bigquery', 'snowflake', 'mssql'];
106
+ const enterpriseLangs = ['bigquery', 'snowflake', 'mssql', 'oracledb'];
105
107
  export function setCode(code) {
106
108
  editor?.setCode(code);
107
109
  }
@@ -294,7 +296,8 @@ async function editScript(stay, parentHash, deploymentMsg) {
294
296
  visible_to_runner_only: script.visible_to_runner_only,
295
297
  no_main_func: script.no_main_func,
296
298
  has_preprocessor: script.has_preprocessor,
297
- deployment_message: deploymentMsg || undefined
299
+ deployment_message: deploymentMsg || undefined,
300
+ on_behalf_of_email: script.on_behalf_of_email
298
301
  }
299
302
  });
300
303
  const scheduleExists = initialPath != '' &&
@@ -430,7 +433,8 @@ async function saveDraft(forceSave = false) {
430
433
  : script.concurrency_key,
431
434
  visible_to_runner_only: script.visible_to_runner_only,
432
435
  no_main_func: script.no_main_func,
433
- has_preprocessor: script.has_preprocessor
436
+ has_preprocessor: script.has_preprocessor,
437
+ on_behalf_of_email: script.on_behalf_of_email
434
438
  }
435
439
  });
436
440
  }
@@ -519,7 +523,9 @@ function langToLanguage(lang) {
519
523
  async function applyArgs(e) {
520
524
  selectedInputTab = e.detail.kind;
521
525
  metadataOpen = false;
522
- args = e.detail.args ?? {};
526
+ if (scriptEditor) {
527
+ scriptEditor.updateArgs(e.detail.args ?? {});
528
+ }
523
529
  }
524
530
  function openTriggers(ev) {
525
531
  metadataOpen = true;
@@ -565,601 +571,628 @@ function addPreprocessor() {
565
571
  >
566
572
  <DrawerContent noPadding title="Settings" on:close={() => (metadataOpen = false)}>
567
573
  <!-- svelte-ignore a11y-autofocus -->
568
- <Tabs bind:selected={selectedTab}>
569
- <Tab value="metadata">Metadata</Tab>
570
- <Tab value="runtime">Runtime</Tab>
571
- <Tab value="ui">
572
- Generated UI
573
- <Tooltip
574
- documentationLink="https://www.windmill.dev/docs/core_concepts/json_schema_and_parsing"
575
- >
576
- The arguments are synced with the main signature but you may refine the parts that
577
- cannot be inferred from the type directly.
578
- </Tooltip>
579
- </Tab>
580
- <Tab value="triggers">
581
- Triggers
582
- <Tooltip documentationLink="https://www.windmill.dev/docs/getting_started/triggers">
583
- Configure how this script will be triggered.
584
- </Tooltip>
585
- </Tab>
586
- <svelte:fragment slot="content">
587
- <div
588
- class={selectedTab === 'ui' ? 'p-0' : 'p-4'}
589
- style={selectedTab === 'ui' ? `height: calc(100% - 32px);` : ''}
590
- >
591
- <TabContent value="metadata">
592
- <div class="flex flex-col gap-8">
593
- <Section label="Metadata">
594
- <svelte:fragment slot="action">
595
- <div class="flex flex-row items-center gap-2">
596
- <ErrorHandlerToggleButton
597
- kind="script"
598
- scriptOrFlowPath={script.path}
599
- bind:errorHandlerMuted={script.ws_error_handler_muted}
600
- iconOnly={false}
601
- />
602
- </div>
603
- </svelte:fragment>
604
- <div class="flex flex-col gap-4">
605
- <Label label="Summary">
606
- <MetadataGen
607
- label="Summary"
608
- bind:content={script.summary}
609
- lang={script.language}
610
- code={script.content}
611
- promptConfigName="summary"
612
- generateOnAppear
613
- on:change={() => {
614
- if (initialPath == '' && script.summary?.length > 0 && !dirtyPath) {
615
- path?.setName(
616
- script.summary
617
- .toLowerCase()
618
- .replace(/[^a-z0-9_]/g, '_')
619
- .replace(/-+/g, '_')
620
- .replace(/^-|-$/g, '')
621
- )
622
- }
623
- }}
624
- elementProps={{
625
- type: 'text',
626
- placeholder: 'Short summary to be displayed when listed'
627
- }}
628
- />
629
- </Label>
630
- <Label label="Path">
631
- <svelte:fragment slot="header">
632
- <Tooltip
633
- documentationLink="https://www.windmill.dev/docs/core_concepts/roles_and_permissions#path"
634
- >
635
- The unique identifier of the script in the workspace that defines
636
- permissions
637
- </Tooltip>
638
- </svelte:fragment>
639
- <Path
640
- bind:this={path}
641
- bind:error={pathError}
642
- bind:path={script.path}
643
- bind:dirty={dirtyPath}
644
- {initialPath}
645
- autofocus={false}
646
- namePlaceholder="script"
647
- kind="script"
648
- />
649
- </Label>
650
- <Label label="Description">
651
- <MetadataGen
652
- bind:content={script.description}
653
- lang={script.language}
654
- code={script.content}
655
- promptConfigName="description"
656
- elementType="textarea"
657
- elementProps={{
658
- placeholder: 'What this script does and how to use it'
659
- }}
660
- />
661
- </Label>
662
- </div>
663
- </Section>
574
+ <div class="flex flex-col h-full">
575
+ <Tabs bind:selected={selectedTab} wrapperClass="flex-none w-full">
576
+ <Tab value="metadata">Metadata</Tab>
577
+ <Tab value="runtime">Runtime</Tab>
578
+ <Tab value="ui">
579
+ Generated UI
580
+ <Tooltip
581
+ documentationLink="https://www.windmill.dev/docs/core_concepts/json_schema_and_parsing"
582
+ >
583
+ The arguments are synced with the main signature but you may refine the parts that
584
+ cannot be inferred from the type directly.
585
+ </Tooltip>
586
+ </Tab>
587
+ <Tab value="triggers">
588
+ Triggers
589
+ <Tooltip documentationLink="https://www.windmill.dev/docs/getting_started/triggers">
590
+ Configure how this script will be triggered.
591
+ </Tooltip>
592
+ </Tab>
664
593
 
665
- <Section label="Language">
666
- <svelte:fragment slot="action"><DefaultScripts /></svelte:fragment>
667
- {#if lockedLanguage}
668
- <div class="text-sm text-tertiary italic mb-2">
669
- As a forked script, the language '{script.language}' cannot be modified.
670
- </div>
671
- {/if}
672
- <div class=" grid grid-cols-3 gap-2">
673
- {#each langs as [label, lang] (lang)}
674
- {@const isPicked =
675
- (lang == script.language && template == 'script') ||
676
- (template == 'bunnative' && lang == 'bunnative') ||
677
- (template == 'docker' && lang == 'docker')}
678
- <Popover
679
- disablePopup={!enterpriseLangs.includes(lang) || !!$enterpriseLicense}
680
- >
681
- <Button
682
- size="sm"
683
- variant="border"
684
- color={isPicked ? 'blue' : 'light'}
685
- btnClasses={isPicked
686
- ? '!border-2 !bg-blue-50/75 dark:!bg-frost-900/75'
687
- : 'm-[1px]'}
688
- on:click={() => {
689
- if (lang == 'docker') {
690
- if (isCloudHosted()) {
691
- sendUserToast(
692
- 'You cannot use Docker scripts on the multi-tenant platform. Use a dedicated instance or self-host windmill instead.',
693
- true,
694
- [
695
- {
696
- label: 'Learn more',
697
- callback: () => {
698
- window.open(
699
- 'https://www.windmill.dev/docs/advanced/docker',
700
- '_blank'
701
- )
702
- }
703
- }
704
- ]
705
- )
706
- return
707
- }
708
- template = 'docker'
709
- } else if (lang == 'bunnative') {
710
- template = 'bunnative'
711
- } else {
712
- template = 'script'
594
+ <svelte:fragment slot="content">
595
+ <div class="min-h-0 grow overflow-y-auto">
596
+ <TabContent value="metadata">
597
+ <div class="flex flex-col gap-8 px-4 py-2">
598
+ <Section label="Metadata">
599
+ <svelte:fragment slot="action">
600
+ <div class="flex flex-row items-center gap-2">
601
+ <ErrorHandlerToggleButton
602
+ kind="script"
603
+ scriptOrFlowPath={script.path}
604
+ bind:errorHandlerMuted={script.ws_error_handler_muted}
605
+ iconOnly={false}
606
+ />
607
+ </div>
608
+ </svelte:fragment>
609
+ <div class="flex flex-col gap-4">
610
+ <Label label="Summary">
611
+ <MetadataGen
612
+ label="Summary"
613
+ bind:content={script.summary}
614
+ lang={script.language}
615
+ code={script.content}
616
+ promptConfigName="summary"
617
+ generateOnAppear
618
+ on:change={() => {
619
+ if (initialPath == '' && script.summary?.length > 0 && !dirtyPath) {
620
+ path?.setName(
621
+ script.summary
622
+ .toLowerCase()
623
+ .replace(/[^a-z0-9_]/g, '_')
624
+ .replace(/-+/g, '_')
625
+ .replace(/^-|-$/g, '')
626
+ )
713
627
  }
714
- let language = langToLanguage(lang)
715
- //
716
- initContent(language, script.kind, template)
717
- script.language = language
718
628
  }}
719
- disabled={lockedLanguage ||
720
- (enterpriseLangs.includes(lang) && !$enterpriseLicense)}
721
- >
722
- <LanguageIcon {lang} />
723
- <span class="ml-2 py-2 truncate">{label}</span>
724
- {#if lang === 'ansible'}
725
- <span class="text-tertiary !text-xs"> BETA </span>
726
- {/if}
727
- </Button>
728
- <svelte:fragment slot="text"
729
- >{label} is only available with an enterprise license</svelte:fragment
730
- >
731
- </Popover>
732
- {/each}
733
- </div>
734
- </Section>
735
-
736
- <Section label="Script kind">
737
- <svelte:fragment slot="header">
738
- <Tooltip
739
- documentationLink="https://www.windmill.dev/docs/script_editor/script_kinds"
740
- >
741
- Tag this script's purpose within flows such that it is available as the
742
- corresponding action.
743
- </Tooltip>
744
- </svelte:fragment>
745
- <ToggleButtonGroup
746
- class="h-10"
747
- selected={script.kind}
748
- on:selected={({ detail }) => {
749
- template = 'script'
750
- script.kind = detail
751
- initContent(script.language, detail, template)
752
- }}
753
- >
754
- {#each scriptKindOptions as { value, title, desc, documentationLink, Icon }}
755
- <ToggleButton
756
- label={title}
757
- {value}
758
- tooltip={desc}
759
- {documentationLink}
760
- icon={Icon}
761
- showTooltipIcon={Boolean(desc)}
762
- />
763
- {/each}
764
- </ToggleButtonGroup>
765
- </Section>
766
- </div>
767
- </TabContent>
768
- <TabContent value="runtime">
769
- <div class="flex flex-col gap-8">
770
- <Section label="Concurrency limits" eeOnly>
771
- <svelte:fragment slot="header">
772
- <Tooltip
773
- documentationLink="https://www.windmill.dev/docs/core_concepts/concurrency_limits"
774
- >
775
- Allowed concurrency within a given timeframe
776
- </Tooltip>
777
- </svelte:fragment>
778
- <div class="flex flex-col gap-4">
779
- <Label label="Max number of executions within the time window">
780
- <div class="flex flex-row gap-2 max-w-sm">
781
- <input
782
- disabled={!$enterpriseLicense}
783
- bind:value={script.concurrent_limit}
784
- type="number"
629
+ elementProps={{
630
+ type: 'text',
631
+ placeholder: 'Short summary to be displayed when listed'
632
+ }}
785
633
  />
786
- <Button
787
- size="sm"
788
- color="light"
789
- on:click={() => {
790
- script.concurrent_limit = undefined
791
- script.concurrency_time_window_s = undefined
792
- script.concurrency_key = undefined
634
+ </Label>
635
+ <Label label="Path">
636
+ <svelte:fragment slot="header">
637
+ <Tooltip
638
+ documentationLink="https://www.windmill.dev/docs/core_concepts/roles_and_permissions#path"
639
+ >
640
+ The unique identifier of the script in the workspace that defines
641
+ permissions
642
+ </Tooltip>
643
+ </svelte:fragment>
644
+ <Path
645
+ bind:this={path}
646
+ bind:error={pathError}
647
+ bind:path={script.path}
648
+ bind:dirty={dirtyPath}
649
+ {initialPath}
650
+ autofocus={false}
651
+ namePlaceholder="script"
652
+ kind="script"
653
+ />
654
+ </Label>
655
+ <Label label="Description">
656
+ <MetadataGen
657
+ bind:content={script.description}
658
+ lang={script.language}
659
+ code={script.content}
660
+ promptConfigName="description"
661
+ elementType="textarea"
662
+ elementProps={{
663
+ placeholder: 'What this script does and how to use it'
793
664
  }}
794
- variant="border">Remove Limits</Button
795
- >
665
+ />
666
+ </Label>
667
+ </div>
668
+ </Section>
669
+
670
+ <Section label="Language">
671
+ <svelte:fragment slot="action"><DefaultScripts /></svelte:fragment>
672
+ {#if lockedLanguage}
673
+ <div class="text-sm text-tertiary italic mb-2">
674
+ As a forked script, the language '{script.language}' cannot be modified.
796
675
  </div>
797
- </Label>
798
- <Label label="Time window in seconds">
799
- <SecondsInput
800
- disabled={!$enterpriseLicense}
801
- bind:seconds={script.concurrency_time_window_s}
802
- />
803
- </Label>
804
- <Label label="Custom concurrency key (optional)">
805
- <svelte:fragment slot="header">
806
- <Tooltip
807
- documentationLink="https://www.windmill.dev/docs/core_concepts/concurrency_limits#custom-concurrency-key"
808
- >
809
- Concurrency keys are global, you can have them be workspace specific using
810
- the variable `$workspace`. You can also use an argument's value using
811
- `$args[name_of_arg]`</Tooltip
812
- >
813
- </svelte:fragment>
814
- <input
815
- disabled={!$enterpriseLicense}
816
- type="text"
817
- autofocus
818
- bind:value={script.concurrency_key}
819
- placeholder={`$workspace/script/${script.path}-$args[foo]`}
820
- />
821
- </Label>
822
- </div>
823
- </Section>
824
- <Section label="Worker group tag (queue)">
825
- <svelte:fragment slot="header">
826
- <Tooltip
827
- documentationLink="https://www.windmill.dev/docs/core_concepts/worker_groups"
828
- >
829
- The script will be executed on a worker configured to listen to this worker
830
- group tag (queue). For instance, you could setup an "highmem", or "gpu" tag.
831
- </Tooltip>
832
- </svelte:fragment>
833
- <WorkerTagPicker bind:tag={script.tag} />
834
- </Section>
835
- <Section label="Cache">
836
- <svelte:fragment slot="header">
837
- <Tooltip
838
- documentationLink="https://www.windmill.dev/docs/core_concepts/caching"
839
- >
840
- Cache the results for each possible inputs
841
- </Tooltip>
842
- </svelte:fragment>
843
- <div class="flex gap-2 shrink flex-col">
844
- <Toggle
845
- size="sm"
846
- checked={Boolean(script.cache_ttl)}
847
- on:change={() => {
848
- if (script.cache_ttl && script.cache_ttl != undefined) {
849
- script.cache_ttl = undefined
850
- } else {
851
- script.cache_ttl = 300
852
- }
853
- }}
854
- options={{
855
- right: 'Cache the results for each possible inputs'
856
- }}
857
- />
858
- <span class="text-secondary text-sm leading-none">
859
- How long to the keep cache valid
860
- </span>
861
- {#if script.cache_ttl}
862
- <SecondsInput bind:seconds={script.cache_ttl} />
863
- {:else}
864
- <SecondsInput disabled />
865
- {/if}
866
- </div>
867
- </Section>
868
- <Section label="Timeout">
869
- <svelte:fragment slot="header">
870
- <Tooltip
871
- documentationLink="https://www.windmill.dev/docs/script_editor/settings#timeout"
872
- >
873
- Add a custom timeout for this script
874
- </Tooltip>
875
- </svelte:fragment>
876
- <div class="flex gap-2 shrink flex-col">
877
- <Toggle
878
- size="sm"
879
- checked={Boolean(script.timeout)}
880
- on:change={() => {
881
- if (script.timeout && script.timeout != undefined) {
882
- script.timeout = undefined
883
- } else {
884
- script.timeout = 300
885
- }
886
- }}
887
- options={{
888
- right: 'Add a custom timeout for this script'
889
- }}
890
- />
891
- <span class="text-secondary text-sm leading-none"> Timeout duration </span>
892
- {#if script.timeout}
893
- <SecondsInput bind:seconds={script.timeout} />
894
- {:else}
895
- <SecondsInput disabled />
896
676
  {/if}
897
- </div>
898
- </Section>
899
- <Section label="Perpetual script">
900
- <svelte:fragment slot="header">
901
- <Tooltip
902
- documentationLink="https://www.windmill.dev/docs/script_editor/perpetual_scripts"
903
- >
904
- Restart the script upon ending unless cancelled
905
- </Tooltip>
906
- </svelte:fragment>
907
- <div class="flex gap-2 shrink flex-col">
908
- <Toggle
909
- size="sm"
910
- checked={Boolean(script.restart_unless_cancelled)}
911
- on:change={() => {
912
- if (script.restart_unless_cancelled) {
913
- script.restart_unless_cancelled = undefined
914
- } else {
915
- script.restart_unless_cancelled = true
916
- }
917
- }}
918
- options={{
919
- right: 'Restart upon ending unless cancelled'
920
- }}
921
- />
922
- </div>
923
- </Section>
924
- <Section label="Dedicated workers" eeOnly>
925
- <Toggle
926
- disabled={!$enterpriseLicense ||
927
- isCloudHosted() ||
928
- (script.language != 'bun' &&
929
- script.language != 'python3' &&
930
- script.language != 'deno')}
931
- size="sm"
932
- checked={Boolean(script.dedicated_worker)}
933
- on:change={() => {
934
- if (script.dedicated_worker) {
935
- script.dedicated_worker = undefined
936
- } else {
937
- script.dedicated_worker = true
938
- }
939
- }}
940
- options={{
941
- right: 'Script is run on dedicated workers'
942
- }}
943
- />
944
- {#if script.dedicated_worker}
945
- <div class="py-2">
946
- <Alert type="info" title="Require dedicated workers">
947
- One worker in a worker group needs to be configured with dedicated worker
948
- set to: <pre>{$workspaceStore}:{script.path}</pre>
949
- </Alert>
677
+ <div class=" grid grid-cols-3 gap-2">
678
+ {#each langs as [label, lang] (lang)}
679
+ {@const isPicked =
680
+ (lang == script.language && template == 'script') ||
681
+ (template == 'bunnative' && lang == 'bunnative') ||
682
+ (template == 'docker' && lang == 'docker')}
683
+ <Popover
684
+ disablePopup={!enterpriseLangs.includes(lang) || !!$enterpriseLicense}
685
+ >
686
+ <Button
687
+ size="sm"
688
+ variant="border"
689
+ color={isPicked ? 'blue' : 'light'}
690
+ btnClasses={isPicked
691
+ ? '!border-2 !bg-blue-50/75 dark:!bg-frost-900/75'
692
+ : 'm-[1px]'}
693
+ on:click={() => {
694
+ if (lang == 'docker') {
695
+ if (isCloudHosted()) {
696
+ sendUserToast(
697
+ 'You cannot use Docker scripts on the multi-tenant platform. Use a dedicated instance or self-host windmill instead.',
698
+ true,
699
+ [
700
+ {
701
+ label: 'Learn more',
702
+ callback: () => {
703
+ window.open(
704
+ 'https://www.windmill.dev/docs/advanced/docker',
705
+ '_blank'
706
+ )
707
+ }
708
+ }
709
+ ]
710
+ )
711
+ return
712
+ }
713
+ template = 'docker'
714
+ } else if (lang == 'bunnative') {
715
+ template = 'bunnative'
716
+ } else {
717
+ template = 'script'
718
+ }
719
+ let language = langToLanguage(lang)
720
+ //
721
+ initContent(language, script.kind, template)
722
+ script.language = language
723
+ }}
724
+ disabled={lockedLanguage ||
725
+ (enterpriseLangs.includes(lang) && !$enterpriseLicense)}
726
+ >
727
+ <LanguageIcon {lang} />
728
+ <span class="ml-2 py-2 truncate">{label}</span>
729
+ {#if lang === 'ansible'}
730
+ <span class="text-tertiary !text-xs"> BETA </span>
731
+ {/if}
732
+ </Button>
733
+ <svelte:fragment slot="text"
734
+ >{label} is only available with an enterprise license</svelte:fragment
735
+ >
736
+ </Popover>
737
+ {/each}
950
738
  </div>
951
- {/if}
952
- <svelte:fragment slot="header">
953
- <Tooltip
954
- documentationLink="https://www.windmill.dev/docs/core_concepts/dedicated_workers"
955
- >
956
- In this mode, the script is meant to be run on dedicated workers that run the
957
- script at native speed. Can reach >1500rps per dedicated worker. Only
958
- available on enterprise edition and for Python3, Deno and Bun. For other
959
- languages, the efficiency is already on par with deidcated workers since they
960
- do not spawn a full runtime</Tooltip
961
- >
962
- </svelte:fragment>
963
- </Section>
964
- <Section label="Delete after use">
965
- <svelte:fragment slot="header">
966
- <Tooltip
967
- documentationLink="https://www.windmill.dev/docs/script_editor/settings#delete-after-use"
968
- >
969
- WARNING: This settings ONLY applies to synchronous webhooks or when the script
970
- is used within a flow. If used individually, this script must be triggered
971
- using a synchronous endpoint to have the desired effect.
972
- <br />
973
- <br />
974
- The logs, arguments and results of the job will be completely deleted from Windmill
975
- once it is complete and the result has been returned.
976
- <br />
977
- <br />
978
- The deletion is irreversible.
979
- {#if !$enterpriseLicense}
980
- <br />
981
- <br />
982
- This option is only available on Windmill Enterprise Edition.
983
- {/if}
984
- </Tooltip>
985
- </svelte:fragment>
986
- <div class="flex gap-2 shrink flex-col">
987
- <Toggle
988
- disabled={!$enterpriseLicense}
989
- size="sm"
990
- checked={Boolean(script.delete_after_use)}
991
- on:change={() => {
992
- if (script.delete_after_use) {
993
- script.delete_after_use = undefined
994
- } else {
995
- script.delete_after_use = true
996
- }
997
- }}
998
- options={{
999
- right: 'Delete logs, arguments and results after use'
1000
- }}
1001
- />
1002
- </div>
1003
- </Section>
1004
- {#if !isCloudHosted()}
1005
- <Section label="High priority script" eeOnly>
1006
- <Toggle
1007
- disabled={!$enterpriseLicense || isCloudHosted()}
1008
- size="sm"
1009
- checked={script.priority !== undefined && script.priority > 0}
1010
- on:change={() => {
1011
- if (script.priority) {
1012
- script.priority = undefined
1013
- } else {
1014
- script.priority = 100
1015
- }
1016
- }}
1017
- options={{
1018
- right: 'Label as high priority'
739
+ </Section>
740
+
741
+ <Section label="Script kind">
742
+ <svelte:fragment slot="header">
743
+ <Tooltip
744
+ documentationLink="https://www.windmill.dev/docs/script_editor/script_kinds"
745
+ >
746
+ Tag this script's purpose within flows such that it is available as the
747
+ corresponding action.
748
+ </Tooltip>
749
+ </svelte:fragment>
750
+ <ToggleButtonGroup
751
+ class="h-10"
752
+ selected={script.kind}
753
+ on:selected={({ detail }) => {
754
+ template = 'script'
755
+ script.kind = detail
756
+ initContent(script.language, detail, template)
1019
757
  }}
1020
758
  >
1021
- <svelte:fragment slot="right">
759
+ {#each scriptKindOptions as { value, title, desc, documentationLink, Icon }}
760
+ <ToggleButton
761
+ label={title}
762
+ {value}
763
+ tooltip={desc}
764
+ {documentationLink}
765
+ icon={Icon}
766
+ showTooltipIcon={Boolean(desc)}
767
+ />
768
+ {/each}
769
+ </ToggleButtonGroup>
770
+ </Section>
771
+ </div>
772
+ </TabContent>
773
+ <TabContent value="runtime">
774
+ <div class="flex flex-col gap-8 px-4 py-2">
775
+ <Section label="Concurrency limits" eeOnly>
776
+ <svelte:fragment slot="header">
777
+ <Tooltip
778
+ documentationLink="https://www.windmill.dev/docs/core_concepts/concurrency_limits"
779
+ >
780
+ Allowed concurrency within a given timeframe
781
+ </Tooltip>
782
+ </svelte:fragment>
783
+ <div class="flex flex-col gap-4">
784
+ <Label label="Max number of executions within the time window">
785
+ <div class="flex flex-row gap-2 max-w-sm">
786
+ <input
787
+ disabled={!$enterpriseLicense}
788
+ bind:value={script.concurrent_limit}
789
+ type="number"
790
+ />
791
+ <Button
792
+ size="sm"
793
+ color="light"
794
+ on:click={() => {
795
+ script.concurrent_limit = undefined
796
+ script.concurrency_time_window_s = undefined
797
+ script.concurrency_key = undefined
798
+ }}
799
+ variant="border">Remove Limits</Button
800
+ >
801
+ </div>
802
+ </Label>
803
+ <Label label="Time window in seconds">
804
+ <SecondsInput
805
+ disabled={!$enterpriseLicense}
806
+ bind:seconds={script.concurrency_time_window_s}
807
+ />
808
+ </Label>
809
+ <Label label="Custom concurrency key (optional)">
810
+ <svelte:fragment slot="header">
811
+ <Tooltip
812
+ documentationLink="https://www.windmill.dev/docs/core_concepts/concurrency_limits#custom-concurrency-key"
813
+ >
814
+ Concurrency keys are global, you can have them be workspace specific
815
+ using the variable `$workspace`. You can also use an argument's value
816
+ using `$args[name_of_arg]`</Tooltip
817
+ >
818
+ </svelte:fragment>
1022
819
  <input
1023
- type="number"
1024
- class="!w-16 ml-4"
1025
- disabled={script.priority === undefined}
1026
- bind:value={script.priority}
1027
- on:focus
1028
- on:change={() => {
1029
- if (script.priority && script.priority > 100) {
1030
- script.priority = 100
1031
- } else if (script.priority && script.priority < 0) {
1032
- script.priority = 0
1033
- }
1034
- }}
820
+ disabled={!$enterpriseLicense}
821
+ type="text"
822
+ autofocus
823
+ bind:value={script.concurrency_key}
824
+ placeholder={`$workspace/script/${script.path}-$args[foo]`}
1035
825
  />
1036
- </svelte:fragment>
1037
- </Toggle>
826
+ </Label>
827
+ </div>
828
+ </Section>
829
+ <Section label="Worker group tag (queue)">
1038
830
  <svelte:fragment slot="header">
1039
- <!-- TODO: Add EE-only badge when we have it -->
1040
831
  <Tooltip
1041
- documentationLink="https://www.windmill.dev/docs/core_concepts/jobs#high-priority-jobs"
832
+ documentationLink="https://www.windmill.dev/docs/core_concepts/worker_groups"
1042
833
  >
1043
- Jobs from script labeled as high priority take precedence over the other
1044
- jobs when in the jobs queue.
1045
- {#if !$enterpriseLicense}This is a feature only available on enterprise
1046
- edition.{/if}
834
+ The script will be executed on a worker configured to listen to this worker
835
+ group tag (queue). For instance, you could setup an "highmem", or "gpu" tag.
1047
836
  </Tooltip>
1048
837
  </svelte:fragment>
838
+ <WorkerTagPicker bind:tag={script.tag} />
1049
839
  </Section>
1050
- {/if}
1051
- <Section label="Runs visibility">
1052
- <svelte:fragment slot="header">
1053
- <Tooltip
1054
- documentationLink="https://www.windmill.dev/docs/core_concepts/monitor_past_and_future_runs#invisible-runs"
1055
- >
1056
- When this option is enabled, manual executions of this script are invisible to
1057
- users other than the user running it, including the owner(s). This setting can
1058
- be overridden when this script is run manually from the advanced menu.
1059
- </Tooltip>
1060
- </svelte:fragment>
1061
- <div class="flex gap-2 shrink flex-col">
840
+ <Section label="Cache">
841
+ <svelte:fragment slot="header">
842
+ <Tooltip
843
+ documentationLink="https://www.windmill.dev/docs/core_concepts/caching"
844
+ >
845
+ Cache the results for each possible inputs
846
+ </Tooltip>
847
+ </svelte:fragment>
848
+ <div class="flex gap-2 shrink flex-col">
849
+ <Toggle
850
+ size="sm"
851
+ checked={Boolean(script.cache_ttl)}
852
+ on:change={() => {
853
+ if (script.cache_ttl && script.cache_ttl != undefined) {
854
+ script.cache_ttl = undefined
855
+ } else {
856
+ script.cache_ttl = 300
857
+ }
858
+ }}
859
+ options={{
860
+ right: 'Cache the results for each possible inputs'
861
+ }}
862
+ />
863
+ <span class="text-secondary text-sm leading-none">
864
+ How long to the keep cache valid
865
+ </span>
866
+ {#if script.cache_ttl}
867
+ <SecondsInput bind:seconds={script.cache_ttl} />
868
+ {:else}
869
+ <SecondsInput disabled />
870
+ {/if}
871
+ </div>
872
+ </Section>
873
+ <Section label="Timeout">
874
+ <svelte:fragment slot="header">
875
+ <Tooltip
876
+ documentationLink="https://www.windmill.dev/docs/script_editor/settings#timeout"
877
+ >
878
+ Add a custom timeout for this script
879
+ </Tooltip>
880
+ </svelte:fragment>
881
+ <div class="flex gap-2 shrink flex-col">
882
+ <Toggle
883
+ size="sm"
884
+ checked={Boolean(script.timeout)}
885
+ on:change={() => {
886
+ if (script.timeout && script.timeout != undefined) {
887
+ script.timeout = undefined
888
+ } else {
889
+ script.timeout = 300
890
+ }
891
+ }}
892
+ options={{
893
+ right: 'Add a custom timeout for this script'
894
+ }}
895
+ />
896
+ <span class="text-secondary text-sm leading-none"> Timeout duration </span>
897
+ {#if script.timeout}
898
+ <SecondsInput bind:seconds={script.timeout} />
899
+ {:else}
900
+ <SecondsInput disabled />
901
+ {/if}
902
+ </div>
903
+ </Section>
904
+ <Section label="Perpetual script">
905
+ <svelte:fragment slot="header">
906
+ <Tooltip
907
+ documentationLink="https://www.windmill.dev/docs/script_editor/perpetual_scripts"
908
+ >
909
+ Restart the script upon ending unless cancelled
910
+ </Tooltip>
911
+ </svelte:fragment>
912
+ <div class="flex gap-2 shrink flex-col">
913
+ <Toggle
914
+ size="sm"
915
+ checked={Boolean(script.restart_unless_cancelled)}
916
+ on:change={() => {
917
+ if (script.restart_unless_cancelled) {
918
+ script.restart_unless_cancelled = undefined
919
+ } else {
920
+ script.restart_unless_cancelled = true
921
+ }
922
+ }}
923
+ options={{
924
+ right: 'Restart upon ending unless cancelled'
925
+ }}
926
+ />
927
+ </div>
928
+ </Section>
929
+ <Section label="Dedicated workers" eeOnly>
1062
930
  <Toggle
931
+ disabled={!$enterpriseLicense ||
932
+ isCloudHosted() ||
933
+ (script.language != 'bun' &&
934
+ script.language != 'python3' &&
935
+ script.language != 'deno')}
1063
936
  size="sm"
1064
- checked={Boolean(script.visible_to_runner_only)}
937
+ checked={Boolean(script.dedicated_worker)}
1065
938
  on:change={() => {
1066
- if (script.visible_to_runner_only) {
1067
- script.visible_to_runner_only = undefined
939
+ if (script.dedicated_worker) {
940
+ script.dedicated_worker = undefined
1068
941
  } else {
1069
- script.visible_to_runner_only = true
942
+ script.dedicated_worker = true
1070
943
  }
1071
944
  }}
1072
945
  options={{
1073
- right: 'Make runs invisible to others'
946
+ right: 'Script is run on dedicated workers'
1074
947
  }}
1075
948
  />
1076
- </div>
1077
- </Section>
1078
- {#if !isCloudHosted()}
1079
- <Section label="Custom env variables">
949
+ {#if script.dedicated_worker}
950
+ <div class="py-2">
951
+ <Alert type="info" title="Require dedicated workers">
952
+ One worker in a worker group needs to be configured with dedicated worker
953
+ set to: <pre>{$workspaceStore}:{script.path}</pre>
954
+ </Alert>
955
+ </div>
956
+ {/if}
957
+ <svelte:fragment slot="header">
958
+ <Tooltip
959
+ documentationLink="https://www.windmill.dev/docs/core_concepts/dedicated_workers"
960
+ >
961
+ In this mode, the script is meant to be run on dedicated workers that run
962
+ the script at native speed. Can reach >1500rps per dedicated worker. Only
963
+ available on enterprise edition and for Python3, Deno and Bun. For other
964
+ languages, the efficiency is already on par with deidcated workers since
965
+ they do not spawn a full runtime</Tooltip
966
+ >
967
+ </svelte:fragment>
968
+ </Section>
969
+ <Section label="Delete after use">
1080
970
  <svelte:fragment slot="header">
1081
971
  <Tooltip
1082
- documentationLink="https://www.windmill.dev/docs/script_editor/custom_environment_variables"
972
+ documentationLink="https://www.windmill.dev/docs/script_editor/settings#delete-after-use"
1083
973
  >
1084
- Additional static custom env variables to pass to the script.
974
+ WARNING: This settings ONLY applies to synchronous webhooks or when the
975
+ script is used within a flow. If used individually, this script must be
976
+ triggered using a synchronous endpoint to have the desired effect.
977
+ <br />
978
+ <br />
979
+ The logs, arguments and results of the job will be completely deleted from Windmill
980
+ once it is complete and the result has been returned.
981
+ <br />
982
+ <br />
983
+ The deletion is irreversible.
984
+ {#if !$enterpriseLicense}
985
+ <br />
986
+ <br />
987
+ This option is only available on Windmill Enterprise Edition.
988
+ {/if}
1085
989
  </Tooltip>
1086
990
  </svelte:fragment>
1087
- {#if script.envs && script.envs.length > 0}
1088
- <Alert type="warning" title="Not passed in previews" size="xs">
1089
- Static envs variables are not passed in preview but solely on deployed
1090
- scripts.
1091
- </Alert>
1092
- {/if}
1093
- <div class="w-full mt-2">
1094
- <span class="text-tertiary text-xs pb-2">Format is: `{'<KEY>=<VALUE>'}`</span>
1095
- {#if Array.isArray(script.envs ?? [])}
1096
- {#each script.envs ?? [] as v, i}
1097
- <div class="flex max-w-md mt-1 w-full items-center relative">
1098
- <input type="text" bind:value={v} placeholder="<KEY>=<VALUE>" />
1099
- <button
1100
- transition:fade|local={{ duration: 50 }}
1101
- class="rounded-full p-1 bg-surface/60 duration-200 hover:bg-gray-200 absolute right-2"
1102
- aria-label="Clear"
1103
- on:click={() => {
1104
- script.envs && script.envs.splice(i, 1)
1105
- script.envs = script.envs
1106
- }}
1107
- >
1108
- <X size={14} />
1109
- </button>
1110
- </div>
1111
- {/each}
1112
- {/if}
991
+ <div class="flex gap-2 shrink flex-col">
992
+ <Toggle
993
+ disabled={!$enterpriseLicense}
994
+ size="sm"
995
+ checked={Boolean(script.delete_after_use)}
996
+ on:change={() => {
997
+ if (script.delete_after_use) {
998
+ script.delete_after_use = undefined
999
+ } else {
1000
+ script.delete_after_use = true
1001
+ }
1002
+ }}
1003
+ options={{
1004
+ right: 'Delete logs, arguments and results after use'
1005
+ }}
1006
+ />
1113
1007
  </div>
1114
- <div class="flex mt-2">
1115
- <Button
1116
- variant="border"
1117
- color="light"
1118
- size="xs"
1119
- on:click={() => {
1120
- if (script.envs == undefined || !Array.isArray(script.envs)) {
1121
- script.envs = []
1008
+ </Section>
1009
+ {#if !isCloudHosted()}
1010
+ <Section label="High priority script" eeOnly>
1011
+ <Toggle
1012
+ disabled={!$enterpriseLicense || isCloudHosted()}
1013
+ size="sm"
1014
+ checked={script.priority !== undefined && script.priority > 0}
1015
+ on:change={() => {
1016
+ if (script.priority) {
1017
+ script.priority = undefined
1018
+ } else {
1019
+ script.priority = 100
1122
1020
  }
1123
- script.envs = script.envs.concat('')
1021
+ }}
1022
+ options={{
1023
+ right: 'Label as high priority'
1124
1024
  }}
1125
1025
  >
1126
- <div class="flex flex-row gap-1">
1127
- <Plus size="16" />
1128
- Add item
1129
- </div>
1130
- </Button>
1026
+ <svelte:fragment slot="right">
1027
+ <input
1028
+ type="number"
1029
+ class="!w-16 ml-4"
1030
+ disabled={script.priority === undefined}
1031
+ bind:value={script.priority}
1032
+ on:focus
1033
+ on:change={() => {
1034
+ if (script.priority && script.priority > 100) {
1035
+ script.priority = 100
1036
+ } else if (script.priority && script.priority < 0) {
1037
+ script.priority = 0
1038
+ }
1039
+ }}
1040
+ />
1041
+ </svelte:fragment>
1042
+ </Toggle>
1043
+ <svelte:fragment slot="header">
1044
+ <!-- TODO: Add EE-only badge when we have it -->
1045
+ <Tooltip
1046
+ documentationLink="https://www.windmill.dev/docs/core_concepts/jobs#high-priority-jobs"
1047
+ >
1048
+ Jobs from script labeled as high priority take precedence over the other
1049
+ jobs when in the jobs queue.
1050
+ {#if !$enterpriseLicense}This is a feature only available on enterprise
1051
+ edition.{/if}
1052
+ </Tooltip>
1053
+ </svelte:fragment>
1054
+ </Section>
1055
+ {/if}
1056
+ <Section label="Runs visibility">
1057
+ <svelte:fragment slot="header">
1058
+ <Tooltip
1059
+ documentationLink="https://www.windmill.dev/docs/core_concepts/monitor_past_and_future_runs#invisible-runs"
1060
+ >
1061
+ When this option is enabled, manual executions of this script are invisible
1062
+ to users other than the user running it, including the owner(s). This
1063
+ setting can be overridden when this script is run manually from the advanced
1064
+ menu.
1065
+ </Tooltip>
1066
+ </svelte:fragment>
1067
+ <div class="flex gap-2 shrink flex-col">
1068
+ <Toggle
1069
+ size="sm"
1070
+ checked={Boolean(script.visible_to_runner_only)}
1071
+ on:change={() => {
1072
+ if (script.visible_to_runner_only) {
1073
+ script.visible_to_runner_only = undefined
1074
+ } else {
1075
+ script.visible_to_runner_only = true
1076
+ }
1077
+ }}
1078
+ options={{
1079
+ right: 'Make runs invisible to others'
1080
+ }}
1081
+ />
1131
1082
  </div>
1132
1083
  </Section>
1133
- {/if}
1134
- </div>
1135
- </TabContent>
1136
- <TabContent value="ui" class="h-full">
1137
- <ScriptSchema bind:schema={script.schema} />
1138
- </TabContent>
1139
- <TabContent value="triggers">
1140
- <TriggersEditor
1141
- on:applyArgs={applyArgs}
1142
- on:addPreprocessor={addPreprocessor}
1143
- on:exitTriggers={() => {
1144
- captureTable?.refreshCaptures()
1145
- }}
1146
- {initialPath}
1147
- schema={script.schema}
1148
- noEditor={true}
1149
- isFlow={false}
1150
- currentPath={script.path}
1151
- hash={script.parent_hash}
1152
- newItem={initialPath == ''}
1153
- canHavePreprocessor={script.language === 'bun' ||
1154
- script.language === 'deno' ||
1155
- script.language === 'python3'}
1156
- {hasPreprocessor}
1157
- />
1158
- <!-- <ScriptSchedules {initialPath} schema={script.schema} schedule={scheduleStore} /> -->
1159
- </TabContent>
1160
- </div>
1161
- </svelte:fragment>
1162
- </Tabs>
1084
+ <Section label="On behalf of last editor">
1085
+ <svelte:fragment slot="header">
1086
+ <Tooltip>
1087
+ When this option is enabled, the script will be run with the permissions of
1088
+ the last editor.
1089
+ </Tooltip>
1090
+ </svelte:fragment>
1091
+ <div class="flex gap-2 shrink flex-col">
1092
+ <Toggle
1093
+ size="sm"
1094
+ checked={Boolean(script.on_behalf_of_email)}
1095
+ on:change={() => {
1096
+ if (script.on_behalf_of_email) {
1097
+ script.on_behalf_of_email = undefined
1098
+ } else {
1099
+ script.on_behalf_of_email = $userStore?.email
1100
+ }
1101
+ }}
1102
+ options={{
1103
+ right: 'Run on behalf of last editor'
1104
+ }}
1105
+ />
1106
+ </div>
1107
+ </Section>
1108
+ {#if !isCloudHosted()}
1109
+ <Section label="Custom env variables">
1110
+ <svelte:fragment slot="header">
1111
+ <Tooltip
1112
+ documentationLink="https://www.windmill.dev/docs/script_editor/custom_environment_variables"
1113
+ >
1114
+ Additional static custom env variables to pass to the script.
1115
+ </Tooltip>
1116
+ </svelte:fragment>
1117
+ {#if script.envs && script.envs.length > 0}
1118
+ <Alert type="warning" title="Not passed in previews" size="xs">
1119
+ Static envs variables are not passed in preview but solely on deployed
1120
+ scripts.
1121
+ </Alert>
1122
+ {/if}
1123
+ <div class="w-full mt-2">
1124
+ <span class="text-tertiary text-xs pb-2"
1125
+ >Format is: `{'<KEY>=<VALUE>'}`</span
1126
+ >
1127
+ {#if Array.isArray(script.envs ?? [])}
1128
+ {#each script.envs ?? [] as v, i}
1129
+ <div class="flex max-w-md mt-1 w-full items-center relative">
1130
+ <input type="text" bind:value={v} placeholder="<KEY>=<VALUE>" />
1131
+ <button
1132
+ transition:fade|local={{ duration: 50 }}
1133
+ class="rounded-full p-1 bg-surface/60 duration-200 hover:bg-gray-200 absolute right-2"
1134
+ aria-label="Clear"
1135
+ on:click={() => {
1136
+ script.envs && script.envs.splice(i, 1)
1137
+ script.envs = script.envs
1138
+ }}
1139
+ >
1140
+ <X size={14} />
1141
+ </button>
1142
+ </div>
1143
+ {/each}
1144
+ {/if}
1145
+ </div>
1146
+ <div class="flex mt-2">
1147
+ <Button
1148
+ variant="border"
1149
+ color="light"
1150
+ size="xs"
1151
+ on:click={() => {
1152
+ if (script.envs == undefined || !Array.isArray(script.envs)) {
1153
+ script.envs = []
1154
+ }
1155
+ script.envs = script.envs.concat('')
1156
+ }}
1157
+ >
1158
+ <div class="flex flex-row gap-1">
1159
+ <Plus size="16" />
1160
+ Add item
1161
+ </div>
1162
+ </Button>
1163
+ </div>
1164
+ </Section>
1165
+ {/if}
1166
+ </div>
1167
+ </TabContent>
1168
+ <TabContent value="ui" class="h-full p-4">
1169
+ <ScriptSchema bind:schema={script.schema} />
1170
+ </TabContent>
1171
+ <TabContent value="triggers">
1172
+ <TriggersEditor
1173
+ on:applyArgs={applyArgs}
1174
+ on:addPreprocessor={addPreprocessor}
1175
+ on:exitTriggers={() => {
1176
+ captureTable?.loadCaptures(true)
1177
+ }}
1178
+ {initialPath}
1179
+ schema={script.schema}
1180
+ noEditor={true}
1181
+ isFlow={false}
1182
+ currentPath={script.path}
1183
+ hash={script.parent_hash}
1184
+ newItem={initialPath == ''}
1185
+ canHavePreprocessor={script.language === 'bun' ||
1186
+ script.language === 'deno' ||
1187
+ script.language === 'python3'}
1188
+ {hasPreprocessor}
1189
+ />
1190
+ <!-- <ScriptSchedules {initialPath} schema={script.schema} schedule={scheduleStore} /> -->
1191
+ </TabContent>
1192
+ </div>
1193
+ </svelte:fragment>
1194
+ </Tabs>
1195
+ </div>
1163
1196
  </DrawerContent>
1164
1197
  </Drawer>
1165
1198