windmill-components 1.504.6 → 1.511.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (233) hide show
  1. package/package/ata/index.js +1 -1
  2. package/package/components/AppConnectInner.svelte +184 -29
  3. package/package/components/ArgInput.svelte +33 -103
  4. package/package/components/AuthSettings.svelte +45 -1
  5. package/package/components/Dev.svelte +31 -24
  6. package/package/components/DisplayResult.svelte +53 -26
  7. package/package/components/DisplayResult.svelte.d.ts +1 -1
  8. package/package/components/DynSelect.svelte +3 -3
  9. package/package/components/Editor.svelte +115 -88
  10. package/package/components/Editor.svelte.d.ts +30 -55
  11. package/package/components/EditorBar.svelte +2 -2
  12. package/package/components/ErrorOrRecoveryHandler.svelte +73 -67
  13. package/package/components/ErrorOrRecoveryHandler.svelte.d.ts +8 -24
  14. package/package/components/FlowBuilder.svelte +11 -2
  15. package/package/components/FlowJobResult.svelte +12 -17
  16. package/package/components/FlowJobResult.svelte.d.ts +5 -18
  17. package/package/components/FlowPreviewContent.svelte +13 -10
  18. package/package/components/FlowPreviewContent.svelte.d.ts +1 -1
  19. package/package/components/FlowPreviewResult.svelte +14 -6
  20. package/package/components/FlowStatusViewer.svelte +11 -24
  21. package/package/components/FlowStatusViewer.svelte.d.ts +19 -18
  22. package/package/components/FlowStatusViewerInner.svelte +110 -131
  23. package/package/components/FlowStatusViewerInner.svelte.d.ts +20 -18
  24. package/package/components/GitDiffPreview.svelte +55 -0
  25. package/package/components/GitDiffPreview.svelte.d.ts +13 -0
  26. package/package/components/HistoricInputs.svelte +2 -2
  27. package/package/components/HttpAgentWorkerDrawer.svelte +1 -1
  28. package/package/components/InitGitRepoPopover.svelte +410 -0
  29. package/package/components/InitGitRepoPopover.svelte.d.ts +13 -0
  30. package/package/components/InstanceSetting.svelte +21 -9
  31. package/package/components/InstanceSettings.svelte +16 -3
  32. package/package/components/JobLoader.svelte +567 -0
  33. package/package/components/JobLoader.svelte.d.ts +53 -0
  34. package/package/components/JobLogs.svelte +6 -4
  35. package/package/components/JobLogs.svelte.d.ts +5 -18
  36. package/package/components/JsonEditor.svelte +11 -11
  37. package/package/components/JsonEditor.svelte.d.ts +14 -56
  38. package/package/components/Label.svelte +6 -11
  39. package/package/components/Label.svelte.d.ts +14 -39
  40. package/package/components/LightweightResourcePicker.svelte +18 -39
  41. package/package/components/LightweightResourcePicker.svelte.d.ts +6 -22
  42. package/package/components/LogViewer.svelte +35 -41
  43. package/package/components/LogViewer.svelte.d.ts +6 -20
  44. package/package/components/ModulePreviewResultViewer.svelte +3 -1
  45. package/package/components/ModulePreviewResultViewer.svelte.d.ts +1 -0
  46. package/package/components/ModuleTest.svelte +16 -11
  47. package/package/components/NumberTypeNarrowing.svelte +13 -16
  48. package/package/components/NumberTypeNarrowing.svelte.d.ts +4 -18
  49. package/package/components/PullGitRepoPopover.svelte +355 -0
  50. package/package/components/PullGitRepoPopover.svelte.d.ts +18 -0
  51. package/package/components/ResourceTypePicker.svelte +20 -17
  52. package/package/components/ResourceTypePicker.svelte.d.ts +7 -6
  53. package/package/components/S3FilePicker.svelte +5 -3
  54. package/package/components/SavedInputs.svelte +2 -2
  55. package/package/components/ScriptBuilder.svelte +4 -3
  56. package/package/components/ScriptEditor.svelte +34 -31
  57. package/package/components/ScriptEditor.svelte.d.ts +3 -3
  58. package/package/components/Section.svelte +7 -20
  59. package/package/components/Section.svelte.d.ts +20 -47
  60. package/package/components/ServiceLogsInner.svelte +2 -1
  61. package/package/components/ServiceLogsInner.svelte.d.ts +1 -0
  62. package/package/components/SimpleEditor.svelte +4 -4
  63. package/package/components/SimpleEditor.svelte.d.ts +1 -0
  64. package/package/components/SqlRepl.svelte +0 -1
  65. package/package/components/Subsection.svelte +10 -12
  66. package/package/components/Subsection.svelte.d.ts +15 -39
  67. package/package/components/UserSettings.svelte +1 -1
  68. package/package/components/WorkerGroup.svelte +260 -165
  69. package/package/components/WorkerGroup.svelte.d.ts +2 -0
  70. package/package/components/WorkerTagPicker.svelte +3 -3
  71. package/package/components/WorkerTagSelect.svelte +33 -4
  72. package/package/components/apps/components/buttons/AppButton.svelte +7 -1
  73. package/package/components/apps/components/buttons/AppButton.svelte.d.ts +1 -0
  74. package/package/components/apps/components/display/AppCustomComponent.svelte +1 -1
  75. package/package/components/apps/components/display/AppDisplayComponentByJobId.svelte +16 -11
  76. package/package/components/apps/components/display/AppJobIdLogComponent.svelte +13 -10
  77. package/package/components/apps/components/display/AppMenu.svelte +5 -0
  78. package/package/components/apps/components/display/dbtable/AppDbExplorer.svelte +3 -3
  79. package/package/components/apps/components/display/dbtable/DeleteRow.svelte +3 -3
  80. package/package/components/apps/components/display/dbtable/InsertRowRunnable.svelte +3 -3
  81. package/package/components/apps/components/display/dbtable/UpdateCell.svelte +3 -3
  82. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +3 -3
  83. package/package/components/apps/components/helpers/RunnableComponent.svelte +65 -54
  84. package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +5 -5
  85. package/package/components/apps/components/inputs/AppUserResource.svelte +26 -8
  86. package/package/components/apps/editor/AppEditorHeader.svelte +11 -5
  87. package/package/components/apps/editor/AppJobsDrawer.svelte +5 -5
  88. package/package/components/apps/editor/RunnableJobPanel.svelte +4 -4
  89. package/package/components/apps/editor/component/components.d.ts +12 -0
  90. package/package/components/apps/editor/component/components.js +19 -7
  91. package/package/components/assets/AssetButtons.svelte +38 -0
  92. package/package/components/assets/AssetButtons.svelte.d.ts +15 -0
  93. package/package/components/assets/AssetsDropdownButton.svelte +60 -72
  94. package/package/components/assets/AssetsDropdownButton.svelte.d.ts +3 -4
  95. package/package/components/assets/AssetsUsageDrawer.svelte +10 -10
  96. package/package/components/assets/JobAssetsViewer.svelte +79 -0
  97. package/package/components/assets/JobAssetsViewer.svelte.d.ts +7 -0
  98. package/package/components/assets/README_DEV.md +0 -0
  99. package/package/components/assets/lib.d.ts +9 -1
  100. package/package/components/assets/lib.js +48 -7
  101. package/package/components/common/fileUpload/FileUpload.svelte +126 -84
  102. package/package/components/common/fileUpload/FileUpload.svelte.d.ts +13 -3
  103. package/package/components/common/fileUpload/S3ArgInput.svelte +111 -0
  104. package/package/components/common/fileUpload/S3ArgInput.svelte.d.ts +21 -0
  105. package/package/components/common/table/ScriptRow.svelte +3 -1
  106. package/package/components/copilot/AIFormSettings.svelte +3 -4
  107. package/package/components/copilot/AIFormSettings.svelte.d.ts +5 -19
  108. package/package/components/copilot/autocomplete/Autocompletor.d.ts +3 -1
  109. package/package/components/copilot/autocomplete/Autocompletor.js +269 -35
  110. package/package/components/copilot/autocomplete/request.d.ts +3 -0
  111. package/package/components/copilot/autocomplete/request.js +15 -7
  112. package/package/components/copilot/chat/AIChatDisplay.svelte +8 -0
  113. package/package/components/copilot/chat/AIChatManager.svelte.js +13 -8
  114. package/package/components/copilot/chat/flow/ModuleAcceptReject.svelte +5 -5
  115. package/package/components/copilot/chat/flow/core.d.ts +1 -1
  116. package/package/components/copilot/chat/flow/core.js +2 -38
  117. package/package/components/copilot/chat/navigator/apiTools.d.ts +8 -0
  118. package/package/components/copilot/chat/navigator/apiTools.js +95 -15
  119. package/package/components/copilot/chat/navigator/core.d.ts +1 -1
  120. package/package/components/copilot/chat/navigator/core.js +2 -1
  121. package/package/components/copilot/chat/script/core.d.ts +11 -2
  122. package/package/components/copilot/chat/script/core.js +165 -23
  123. package/package/components/copilot/chat/shared.d.ts +10 -0
  124. package/package/components/copilot/chat/shared.js +56 -0
  125. package/package/components/copilot/lib.d.ts +1 -0
  126. package/package/components/copilot/lib.js +30 -9
  127. package/package/components/custom_ui.d.ts +1 -0
  128. package/package/components/flows/FlowAssetsHandler.svelte +133 -0
  129. package/package/components/flows/FlowAssetsHandler.svelte.d.ts +14 -0
  130. package/package/components/flows/content/FlowModuleCache.svelte +4 -4
  131. package/package/components/flows/content/FlowModuleCache.svelte.d.ts +4 -18
  132. package/package/components/flows/content/FlowModuleComponent.svelte +16 -19
  133. package/package/components/flows/content/FlowModuleDeleteAfterUse.svelte +3 -4
  134. package/package/components/flows/content/FlowModuleDeleteAfterUse.svelte.d.ts +4 -18
  135. package/package/components/flows/content/FlowModuleSleep.svelte +6 -7
  136. package/package/components/flows/content/FlowModuleSleep.svelte.d.ts +4 -18
  137. package/package/components/flows/content/FlowModuleSuspend.svelte +19 -17
  138. package/package/components/flows/content/FlowModuleSuspend.svelte.d.ts +4 -18
  139. package/package/components/flows/content/FlowModuleTimeout.svelte +4 -4
  140. package/package/components/flows/content/FlowModuleTimeout.svelte.d.ts +4 -18
  141. package/package/components/flows/flowStore.d.ts +1 -1
  142. package/package/components/flows/map/FlowModuleSchemaItem.svelte +1 -0
  143. package/package/components/flows/propPicker/OutputPicker.svelte +9 -4
  144. package/package/components/flows/scheduleUtils.js +1 -1
  145. package/package/components/flows/types.d.ts +2 -1
  146. package/package/components/graph/FlowGraphV2.svelte +8 -104
  147. package/package/components/graph/FlowGraphV2.svelte.d.ts +0 -2
  148. package/package/components/graph/graphBuilder.svelte.d.ts +6 -3
  149. package/package/components/graph/graphBuilder.svelte.js +35 -9
  150. package/package/components/graph/renderers/edges/BaseEdge.svelte +2 -5
  151. package/package/components/graph/renderers/edges/BaseEdge.svelte.d.ts +1 -0
  152. package/package/components/graph/renderers/nodes/AssetNode.svelte +23 -20
  153. package/package/components/graph/renderers/nodes/AssetNode.svelte.d.ts +5 -10
  154. package/package/components/graph/renderers/nodes/AssetsOverflowedNode.svelte +1 -1
  155. package/package/components/graph/util.js +1 -1
  156. package/package/components/home/ItemsList.svelte +2 -0
  157. package/package/components/icons/AssetGenericIcon.svelte +0 -3
  158. package/package/components/jobs/JobPreview.svelte +10 -6
  159. package/package/components/raw_apps/RawAppInlineScriptRunnable.svelte +13 -12
  160. package/package/components/runs/BatchReRunOptionsPane.svelte +5 -1
  161. package/package/components/runs/JobPreview.svelte +26 -16
  162. package/package/components/runs/{JobLoader.svelte.d.ts → JobsLoader.svelte.d.ts} +3 -3
  163. package/package/components/runs/NoWorkerWithTagWarning.svelte +2 -2
  164. package/package/components/runs/NoWorkerWithTagWarning.svelte.d.ts +1 -0
  165. package/package/components/runs/RunsFilter.svelte.d.ts +1 -1
  166. package/package/components/scriptEditor/LogPanel.svelte +3 -2
  167. package/package/components/script_builder.d.ts +2 -2
  168. package/package/components/settings/CreateToken.svelte +76 -41
  169. package/package/components/settings/CreateToken.svelte.d.ts +1 -1
  170. package/package/components/settings/ScopeSelector.svelte +613 -0
  171. package/package/components/settings/ScopeSelector.svelte.d.ts +8 -0
  172. package/package/components/settings/TokenDisplay.svelte +103 -0
  173. package/package/components/settings/TokenDisplay.svelte.d.ts +10 -0
  174. package/package/components/settings/TokensTable.svelte +70 -349
  175. package/package/components/sidebar/CriticalAlertModal.svelte +3 -0
  176. package/package/components/triggers/DeleteTriggerButton.svelte +1 -1
  177. package/package/components/triggers/TriggerEditorToolbar.svelte +3 -3
  178. package/package/components/triggers/TriggerRetriesAndErrorHandler.svelte +55 -0
  179. package/package/components/triggers/TriggerRetriesAndErrorHandler.svelte.d.ts +13 -0
  180. package/package/components/triggers/TriggersEditor.svelte +45 -3
  181. package/package/components/triggers/TriggersWrapper.svelte +2 -2
  182. package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +47 -6
  183. package/package/components/triggers/gcp/utils.js +9 -1
  184. package/package/components/triggers/http/OpenAPISpecGenerator.svelte +3 -2
  185. package/package/components/triggers/http/RouteEditorConfigSection.svelte +26 -23
  186. package/package/components/triggers/http/RouteEditorConfigSection.svelte.d.ts +5 -19
  187. package/package/components/triggers/http/RouteEditorInner.svelte +219 -175
  188. package/package/components/triggers/http/RouteEditorInner.svelte.d.ts +6 -2
  189. package/package/components/triggers/http/utils.js +9 -3
  190. package/package/components/triggers/kafka/KafkaTriggerEditorInner.svelte +47 -6
  191. package/package/components/triggers/kafka/utils.js +9 -1
  192. package/package/components/triggers/mqtt/MqttEditorConfigSection.svelte +4 -132
  193. package/package/components/triggers/mqtt/MqttEditorConfigSection.svelte.d.ts +2 -5
  194. package/package/components/triggers/mqtt/MqttTriggerEditorInner.svelte +182 -13
  195. package/package/components/triggers/mqtt/utils.js +9 -1
  196. package/package/components/triggers/nats/NatsTriggerEditorInner.svelte +47 -6
  197. package/package/components/triggers/nats/utils.js +9 -1
  198. package/package/components/triggers/postgres/PostgresTriggerEditorInner.svelte +41 -2
  199. package/package/components/triggers/postgres/utils.js +9 -1
  200. package/package/components/triggers/schedules/ScheduleEditorInner.svelte +38 -92
  201. package/package/components/triggers/sqs/SqsTriggerEditorInner.svelte +47 -6
  202. package/package/components/triggers/sqs/utils.js +9 -1
  203. package/package/components/triggers/utils.js +12 -0
  204. package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +47 -6
  205. package/package/components/triggers/websocket/utils.js +11 -1
  206. package/package/components/workspaceSettings/AISettings.svelte +0 -2
  207. package/package/components/workspaceSettings/FilterList.svelte +56 -0
  208. package/package/components/workspaceSettings/FilterList.svelte.d.ts +8 -0
  209. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte +785 -0
  210. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte.d.ts +18 -0
  211. package/package/gen/core/OpenAPI.js +1 -1
  212. package/package/gen/schemas.gen.d.ts +305 -23
  213. package/package/gen/schemas.gen.js +305 -23
  214. package/package/gen/services.gen.d.ts +33 -1
  215. package/package/gen/services.gen.js +66 -2
  216. package/package/gen/types.gen.d.ts +216 -11
  217. package/package/history.svelte.js +0 -2
  218. package/package/hub.d.ts +1 -0
  219. package/package/hubPaths.json +5 -2
  220. package/package/infer.js +16 -10
  221. package/package/svelte5Utils.svelte.d.ts +1 -0
  222. package/package/svelte5Utils.svelte.js +25 -18
  223. package/package/toast.js +10 -0
  224. package/package/utils.d.ts +3 -2
  225. package/package/utils.js +20 -5
  226. package/package.json +11 -11
  227. package/package/components/ResultJobLoader.svelte +0 -219
  228. package/package/components/ResultJobLoader.svelte.d.ts +0 -52
  229. package/package/components/TestJobLoader.svelte +0 -274
  230. package/package/components/TestJobLoader.svelte.d.ts +0 -43
  231. package/package/components/icons/AssetVarIcon.svelte +0 -31
  232. package/package/components/icons/AssetVarIcon.svelte.d.ts +0 -9
  233. /package/package/components/runs/{JobLoader.svelte → JobsLoader.svelte} +0 -0
@@ -1,27 +1,9 @@
1
1
  <script lang="ts">import { writable } from 'svelte/store';
2
2
  import FlowStatusViewerInner from './FlowStatusViewerInner.svelte';
3
- import { createEventDispatcher, setContext } from 'svelte';
3
+ import { createEventDispatcher, setContext, untrack } from 'svelte';
4
4
  import { isOwner as loadIsOwner } from '../utils';
5
5
  import { userStore, workspaceStore } from '../stores';
6
- export let jobId;
7
- export let initialJob = undefined;
8
- export let workspaceId = undefined;
9
- export let flowStateStore = writable({});
10
- export let selectedJobStep = undefined;
11
- export let hideFlowResult = false;
12
- export let hideTimeline = false;
13
- export let hideDownloadInGraph = false;
14
- export let hideNodeDefinition = false;
15
- export let hideJobId = false;
16
- export let hideDownloadLogs = false;
17
- export let rightColumnSelect = 'timeline';
18
- export let isOwner = false;
19
- export let wideResults = false;
20
- export let localModuleStates = writable({});
21
- export let localDurationStatuses = writable({});
22
- export let job = undefined;
23
- export let render = true;
24
- export let suspendStatus = writable({});
6
+ let { jobId, initialJob = undefined, workspaceId = undefined, flowStateStore = writable({}), selectedJobStep = $bindable(undefined), hideFlowResult = false, hideTimeline = false, hideDownloadInGraph = false, hideNodeDefinition = false, hideJobId = false, hideDownloadLogs = false, rightColumnSelect = $bindable('timeline'), isOwner = $bindable(false), wideResults = false, localModuleStates = $bindable(writable({})), localDurationStatuses = $bindable(writable({})), job = $bindable(undefined), render = true, suspendStatus = $bindable(writable({})) } = $props();
25
7
  let lastJobId = jobId;
26
8
  let retryStatus = writable({});
27
9
  setContext('FlowStatusViewer', {
@@ -45,8 +27,13 @@ async function updateJobId() {
45
27
  }
46
28
  }
47
29
  const dispatch = createEventDispatcher();
48
- let lastScriptPath = undefined;
49
- $: jobId && updateJobId();
30
+ let lastScriptPath = $state(undefined);
31
+ $effect.pre(() => {
32
+ jobId;
33
+ untrack(() => {
34
+ jobId && updateJobId();
35
+ });
36
+ });
50
37
  </script>
51
38
 
52
39
  <FlowStatusViewerInner
@@ -61,8 +48,8 @@ $: jobId && updateJobId();
61
48
  }}
62
49
  globalModuleStates={[]}
63
50
  globalDurationStatuses={[]}
64
- bind:localModuleStates
65
- bind:localDurationStatuses
51
+ {localModuleStates}
52
+ {localDurationStatuses}
66
53
  bind:selectedNode={selectedJobStep}
67
54
  on:start
68
55
  on:done
@@ -2,20 +2,7 @@ import { type Writable } from 'svelte/store';
2
2
  import type { FlowState } from './flows/flowState';
3
3
  import type { DurationStatus, GraphModuleState } from './graph';
4
4
  import type { Job } from '../gen';
5
- 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> {
6
- new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
7
- $$bindings?: Bindings;
8
- } & Exports;
9
- (internal: unknown, props: Props & {
10
- $$events?: Events;
11
- $$slots?: Slots;
12
- }): Exports & {
13
- $set?: any;
14
- $on?: any;
15
- };
16
- z_$$bindings?: Bindings;
17
- }
18
- declare const FlowStatusViewer: $$__sveltets_2_IsomorphicComponent<{
5
+ interface Props {
19
6
  jobId: string;
20
7
  initialJob?: Job | undefined;
21
8
  workspaceId?: string | undefined;
@@ -27,20 +14,34 @@ declare const FlowStatusViewer: $$__sveltets_2_IsomorphicComponent<{
27
14
  hideNodeDefinition?: boolean;
28
15
  hideJobId?: boolean;
29
16
  hideDownloadLogs?: boolean;
30
- rightColumnSelect?: "timeline" | "node_status" | "node_definition" | "user_states";
17
+ rightColumnSelect?: 'timeline' | 'node_status' | 'node_definition' | 'user_states';
31
18
  isOwner?: boolean;
32
19
  wideResults?: boolean;
33
20
  localModuleStates?: Writable<Record<string, GraphModuleState>>;
34
21
  localDurationStatuses?: Writable<Record<string, DurationStatus>>;
35
22
  job?: Job | undefined;
36
23
  render?: boolean;
37
- suspendStatus?: Writable<{}>;
38
- }, {
24
+ suspendStatus?: any;
25
+ }
26
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
27
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
28
+ $$bindings?: Bindings;
29
+ } & Exports;
30
+ (internal: unknown, props: Props & {
31
+ $$events?: Events;
32
+ $$slots?: Slots;
33
+ }): Exports & {
34
+ $set?: any;
35
+ $on?: any;
36
+ };
37
+ z_$$bindings?: Bindings;
38
+ }
39
+ declare const FlowStatusViewer: $$__sveltets_2_IsomorphicComponent<Props, {
39
40
  start: CustomEvent<any>;
40
41
  done: CustomEvent<any>;
41
42
  jobsLoaded: CustomEvent<any>;
42
43
  } & {
43
44
  [evt: string]: CustomEvent<any>;
44
- }, {}, {}, string>;
45
+ }, {}, {}, "job" | "isOwner" | "suspendStatus" | "localDurationStatuses" | "rightColumnSelect" | "localModuleStates" | "selectedJobStep">;
45
46
  type FlowStatusViewer = InstanceType<typeof FlowStatusViewer>;
46
47
  export default FlowStatusViewer;
@@ -1,15 +1,16 @@
1
- <script lang="ts">import { JobService } from '../gen';
1
+ <script lang="ts">import FlowStatusViewerInner from './FlowStatusViewerInner.svelte';
2
+ import { JobService, ResourceService } from '../gen';
2
3
  import { workspaceStore } from '../stores';
3
4
  import { base } from '../base';
4
5
  import FlowJobResult from './FlowJobResult.svelte';
5
6
  import DisplayResult from './DisplayResult.svelte';
6
- import { createEventDispatcher, getContext, tick } from 'svelte';
7
+ import { createEventDispatcher, getContext, setContext, tick, untrack } from 'svelte';
7
8
  import { onDestroy } from 'svelte';
8
9
  import { Badge, Button, Skeleton, Tab } from './common';
9
10
  import Tabs from './common/tabs/Tabs.svelte';
10
11
  import {} from './graph';
11
12
  import ModuleStatus from './ModuleStatus.svelte';
12
- import { isScriptPreview, msToSec, truncateRev } from '../utils';
13
+ import { clone, isScriptPreview, msToSec, readFieldsRecursively, truncateRev } from '../utils';
13
14
  import JobArgs from './JobArgs.svelte';
14
15
  import { ChevronDown, Hourglass } from 'lucide-svelte';
15
16
  import { deepEqual } from 'fast-equals';
@@ -20,60 +21,45 @@ import Alert from './common/alert/Alert.svelte';
20
21
  import FlowGraphViewerStep from './FlowGraphViewerStep.svelte';
21
22
  import FlowGraphV2 from './graph/FlowGraphV2.svelte';
22
23
  import { buildPrefix } from './graph/graphBuilder.svelte';
23
- import { parseAssetFromString } from './assets/lib';
24
+ import { parseInputArgsAssets } from './assets/lib';
24
25
  import FlowPreviewResult from './FlowPreviewResult.svelte';
26
+ import { createState } from '../svelte5Utils.svelte';
27
+ import JobLoader from './JobLoader.svelte';
25
28
  const dispatch = createEventDispatcher();
26
29
  let { flowStateStore, retryStatus, suspendStatus, hideDownloadInGraph, hideTimeline, hideNodeDefinition, hideDownloadLogs, hideJobId } = getContext('FlowStatusViewer');
27
- export let jobId;
28
- export let initialJob = undefined;
29
- export let workspaceId = undefined;
30
- export let flowJobIds = undefined;
31
- //only useful when forloops are optimized and the job doesn't contain the mod id anymore
32
- export let innerModule = undefined;
33
- export let globalRefreshes = {};
34
- export let render = true;
35
- export let isOwner = false;
36
- export let selectedNode = undefined;
37
- export let globalModuleStates;
38
- export let globalDurationStatuses;
39
- export let childFlow = false;
40
- export let isSubflow = false;
41
- export let reducedPolling = false;
42
- export let wideResults = false;
43
- export let hideFlowResult = false;
44
- export let workspace = $workspaceStore;
45
- export let prefix = undefined;
46
- export let subflowParentsGlobalModuleStates = [];
47
- export let subflowParentsDurationStatuses = [];
48
- export let isForloopSelected = false;
49
- export let parentRecursiveRefresh = {};
50
- export let job = undefined;
51
- export let rightColumnSelect = 'timeline';
52
- export let localModuleStates = writable({});
53
- export let localDurationStatuses = writable({});
54
- let recursiveRefresh = {};
55
- $: inputAssets = parseInputAssets(job?.args ?? {});
56
- function parseInputAssets(args) {
57
- const arr = [];
58
- for (const v of Object.values(args)) {
59
- if (typeof v === 'string') {
60
- const asset = parseAssetFromString(v);
61
- if (asset)
62
- arr.push(asset);
63
- }
64
- else if (v && typeof v === 'object' && typeof v['s3'] === 'string') {
65
- const s3 = v['s3'];
66
- const storage = typeof v['storage'] == 'string' ? v['storage'] : undefined;
67
- arr.push({ kind: 's3object', path: `${storage ?? ''}/${s3}` });
30
+ let { jobId, initialJob = undefined, workspaceId = undefined, flowJobIds = undefined, innerModule = undefined, globalRefreshes = $bindable({}), render = true, isOwner = false, selectedNode = $bindable(undefined), globalModuleStates, globalDurationStatuses, childFlow = false, isSubflow = false, reducedPolling = false, wideResults = false, hideFlowResult = false, workspace = $workspaceStore, prefix = undefined, subflowParentsGlobalModuleStates = [], subflowParentsDurationStatuses = [], isForloopSelected = false, parentRecursiveRefresh = $bindable({}), job = $bindable(undefined), rightColumnSelect = $bindable('timeline'), localModuleStates = writable({}), localDurationStatuses = writable({}) } = $props();
31
+ let recursiveRefresh = $state({});
32
+ // Add support for the input args assets shown as an asset node
33
+ const _flowGraphAssetsCtx = getContext('FlowGraphAssetContext');
34
+ let extendedFlowGraphAssetsCtx = $state(createState(clone(_flowGraphAssetsCtx)));
35
+ setContext('FlowGraphAssetContext', extendedFlowGraphAssetsCtx);
36
+ $effect(() => {
37
+ readFieldsRecursively(_flowGraphAssetsCtx);
38
+ job?.args;
39
+ untrack(() => {
40
+ if (extendedFlowGraphAssetsCtx && _flowGraphAssetsCtx) {
41
+ const inputAssets = parseInputArgsAssets(job?.args ?? {});
42
+ const resourceMetadataCache = _flowGraphAssetsCtx.val.resourceMetadataCache;
43
+ for (const asset of inputAssets) {
44
+ if (asset.kind === 'resource' && !(asset.path in resourceMetadataCache)) {
45
+ resourceMetadataCache[asset.path] = undefined;
46
+ ResourceService.getResource({
47
+ workspace: workspace ?? $workspaceStore,
48
+ path: asset.path
49
+ })
50
+ .then((r) => (resourceMetadataCache[asset.path] = r))
51
+ .catch((err) => { });
52
+ }
53
+ }
54
+ extendedFlowGraphAssetsCtx.val = clone(_flowGraphAssetsCtx?.val);
55
+ extendedFlowGraphAssetsCtx.val.additionalAssetsMap['Input'] = inputAssets;
68
56
  }
69
- }
70
- return arr;
71
- }
72
- let jobResults = flowJobIds?.flowJobs?.map((x, id) => `iter #${id + 1} not loaded by frontend yet`) ?? [];
73
- let retry_selected = '';
57
+ });
58
+ });
59
+ let jobResults = $state(flowJobIds?.flowJobs?.map((x, id) => `iter #${id + 1} not loaded by frontend yet`) ?? []);
60
+ let retry_selected = $state('');
74
61
  let timeout = undefined;
75
- let expandedSubflows = {};
76
- $: flowJobIds?.moduleId && onFlowModuleId();
62
+ let expandedSubflows = $state({});
77
63
  let selectedId = writable(selectedNode);
78
64
  function onFlowModuleId() {
79
65
  if (globalRefreshes) {
@@ -247,7 +233,7 @@ function initializeByJob(modId) {
247
233
  }));
248
234
  }
249
235
  }
250
- let innerModules = [];
236
+ let innerModules = $state([]);
251
237
  function updateStatus(status) {
252
238
  innerModules =
253
239
  status?.modules?.concat(status.failure_module.type != 'WaitingForPriorSteps' ? status.failure_module : []) ?? [];
@@ -283,7 +269,8 @@ function updateInnerModules() {
283
269
  JobService.getJob({
284
270
  workspace: workspaceId ?? $workspaceStore ?? '',
285
271
  id: mod.job ?? '',
286
- noLogs: true
272
+ noLogs: true,
273
+ noCode: true
287
274
  })
288
275
  .then((job) => {
289
276
  const newState = {
@@ -300,54 +287,27 @@ function updateInnerModules() {
300
287
  console.error(`Could not load inner module for job ${mod.job}`, e);
301
288
  });
302
289
  }
303
- else if (mod.flow_jobs &&
290
+ else if ((mod.flow_jobs || mod.branch_chosen) &&
304
291
  (mod.type == 'Success' || mod.type == 'Failure') &&
305
292
  !['Success', 'Failure'].includes($localModuleStates?.[mod.id ?? '']?.type)) {
293
+ let branchChosen = mod.branch_chosen
294
+ ? {
295
+ branchChosen: mod.branch_chosen.type == 'default' ? 0 : (mod.branch_chosen.branch ?? 0) + 1
296
+ }
297
+ : {};
306
298
  setModuleState(mod.id ?? '', {
307
- type: mod.type
299
+ type: mod.type,
300
+ ...branchChosen
308
301
  }, true);
309
302
  }
310
303
  else if (isForloopSelected) {
311
304
  setModuleState(mod.id ?? '', {}, true);
312
305
  }
313
- // if (isForloopSelected && mod?.flow_jobs) {
314
- // let states = getTopModuleStates()
315
- // if (states) {
316
- // states[mod.id ?? ''] = $localModuleStates[mod.id ?? '']
317
- // }
318
- // }
319
- if (mod.branch_chosen) {
306
+ if (mod.flow_jobs_success) {
320
307
  setModuleState(mod.id ?? '', {
321
- branchChosen: mod.branch_chosen.type == 'default' ? 0 : (mod.branch_chosen.branch ?? 0) + 1
322
- }, true);
323
- }
324
- /**
325
- * else if (mod.type === 'Failure' || mod.type === 'WaitingForPriorSteps') {
326
- if (job?.type === 'CompletedJob') {
327
- setModuleState('b', {
328
- type: 'Failure',
329
- args: job?.args,
330
- job_id: job?.id,
331
- result: job?.result
332
- })
333
- }
308
+ flow_jobs_success: mod.flow_jobs_success
309
+ });
334
310
  }
335
- */
336
- });
337
- }
338
- }
339
- $: isForloopSelected && globalModuleStates && debounceLoadJobInProgress();
340
- async function getNewJob(jobId, initialJob) {
341
- if (jobId == initialJob?.id &&
342
- initialJob?.id != undefined &&
343
- initialJob?.type === 'CompletedJob') {
344
- return initialJob;
345
- }
346
- else {
347
- return await JobService.getJob({
348
- workspace: workspaceId ?? $workspaceStore ?? '',
349
- id: jobId ?? '',
350
- noLogs: true
351
311
  });
352
312
  }
353
313
  }
@@ -367,9 +327,20 @@ function debounceLoadJobInProgress() {
367
327
  timeout = undefined;
368
328
  }, pollingRate);
369
329
  }
370
- let errorCount = 0;
371
- let notAnonynmous = false;
330
+ let notAnonynmous = $state(false);
372
331
  let started = false;
332
+ let jobLoader = undefined;
333
+ function setJob(newJob, force) {
334
+ if (!deepEqual(job, newJob) || isForloopSelected || force) {
335
+ job = newJob;
336
+ job?.flow_status && updateStatus(job?.flow_status);
337
+ dispatch('jobsLoaded', { job, force: false });
338
+ notAnonynmous = false;
339
+ if (job?.type == 'CompletedJob' && !destroyed) {
340
+ dispatch('done', job);
341
+ }
342
+ }
343
+ }
373
344
  async function loadJobInProgress() {
374
345
  if (!started) {
375
346
  started = true;
@@ -377,31 +348,28 @@ async function loadJobInProgress() {
377
348
  }
378
349
  if (jobId != '00000000-0000-0000-0000-000000000000') {
379
350
  try {
380
- const newJob = await getNewJob(jobId, initialJob);
381
- if (!deepEqual(job, newJob) || isForloopSelected) {
382
- job = newJob;
383
- job?.flow_status && updateStatus(job?.flow_status);
384
- dispatch('jobsLoaded', { job, force: false });
351
+ if (jobId == initialJob?.id &&
352
+ initialJob?.id != undefined &&
353
+ initialJob?.type === 'CompletedJob') {
354
+ setJob(initialJob, false);
355
+ }
356
+ else {
357
+ jobLoader?.watchJob(jobId, {
358
+ change(newJob) {
359
+ setJob(newJob, true);
360
+ }
361
+ });
385
362
  }
386
- errorCount = 0;
387
- notAnonynmous = false;
388
363
  }
389
364
  catch (e) {
390
365
  if (e?.body?.includes('As a non logged in user, you can only see jobs ran by anonymous users')) {
391
366
  notAnonynmous = true;
392
367
  }
393
368
  else {
394
- errorCount += 1;
395
369
  console.error(e);
396
370
  }
397
371
  }
398
372
  }
399
- if (job?.type !== 'CompletedJob' && errorCount < 4 && !destroyed) {
400
- debounceLoadJobInProgress();
401
- }
402
- else {
403
- dispatch('done', job);
404
- }
405
373
  }
406
374
  let destroyed = false;
407
375
  updateRecursiveRefresh(jobId);
@@ -435,16 +403,13 @@ async function updateJobId() {
435
403
  await loadJobInProgress();
436
404
  }
437
405
  }
438
- $: jobId && updateJobId();
439
- $: isListJob = flowJobIds != undefined && Array.isArray(flowJobIds?.flowJobs);
440
406
  function getTopModuleStates() {
441
407
  return get(globalModuleStates?.[globalModuleStates?.length - 1]);
442
408
  }
443
- let forloop_selected = getTopModuleStates()?.[flowJobIds?.moduleId ?? '']?.selectedForloop;
409
+ let forloop_selected = $state(getTopModuleStates()?.[flowJobIds?.moduleId ?? '']?.selectedForloop);
444
410
  let sub = undefined;
445
411
  let timeoutForloopSelectedSub = undefined;
446
412
  let timeoutForloopSelected = undefined;
447
- $: flowJobIds?.moduleId && onModuleIdChange();
448
413
  function onModuleIdChange() {
449
414
  clearTimeout(timeoutForloopSelectedSub);
450
415
  timeoutForloopSelectedSub = setTimeout(() => {
@@ -465,7 +430,6 @@ onDestroy(() => {
465
430
  timeout && clearTimeout(timeout);
466
431
  sub?.();
467
432
  });
468
- $: selected = isListJob ? 'sequence' : 'graph';
469
433
  function isSuccess(arg) {
470
434
  if (arg == undefined) {
471
435
  return undefined;
@@ -653,7 +617,7 @@ function innerJobLoaded(jobLoaded, j, clicked, force) {
653
617
  }
654
618
  }
655
619
  }
656
- let flowTimeline;
620
+ let flowTimeline = $state();
657
621
  function loadPreviousIters(lenToAdd) {
658
622
  let r = $localDurationStatuses[flowJobIds?.moduleId ?? ''];
659
623
  if (r.iteration_from) {
@@ -667,9 +631,9 @@ function loadPreviousIters(lenToAdd) {
667
631
  ];
668
632
  // updateSlicedListJobIds()
669
633
  }
670
- let stepDetail = undefined;
671
- let storedListJobs = {};
672
- let wrapperHeight = 0;
634
+ let stepDetail = $state(undefined);
635
+ let storedListJobs = $state({});
636
+ let wrapperHeight = $state(0);
673
637
  function removeFailureNode(id, parent_module) {
674
638
  if (id?.startsWith('failure-') && parent_module) {
675
639
  ;
@@ -704,9 +668,24 @@ function allModulesForTimeline(modules, expandedSubflows) {
704
668
  }
705
669
  return rec(ids, undefined);
706
670
  }
707
- let subflowsSize = 500;
671
+ let subflowsSize = $state(500);
672
+ $effect(() => {
673
+ flowJobIds?.moduleId && untrack(() => onFlowModuleId());
674
+ });
675
+ $effect(() => {
676
+ isForloopSelected && globalModuleStates && untrack(() => debounceLoadJobInProgress());
677
+ });
678
+ $effect(() => {
679
+ jobId && untrack(() => updateJobId());
680
+ });
681
+ let isListJob = $derived(flowJobIds != undefined && Array.isArray(flowJobIds?.flowJobs));
682
+ $effect(() => {
683
+ flowJobIds?.moduleId && untrack(() => onModuleIdChange());
684
+ });
685
+ let selected = $derived(isListJob ? 'sequence' : 'graph');
708
686
  </script>
709
687
 
688
+ <JobLoader noCode noLogs bind:this={jobLoader} />
710
689
  {#if notAnonynmous}
711
690
  <Alert type="error" title="Required Auth">
712
691
  As a non logged in user, you can only see jobs ran by anonymous users like you
@@ -727,7 +706,7 @@ let subflowsSize = 500;
727
706
  <p class="text-tertiary italic text-xs">
728
707
  For performance reasons, only the last 20 items are shown by default <button
729
708
  class="text-primary underline ml-4"
730
- on:click={() => {
709
+ onclick={() => {
731
710
  loadPreviousIters(lenToAdd)
732
711
  }}
733
712
  >Load {lenToAdd} prior
@@ -736,7 +715,7 @@ let subflowsSize = 500;
736
715
  {sliceFrom}
737
716
  <button
738
717
  class="text-primary underline ml-4"
739
- on:click={() => {
718
+ onclick={() => {
740
719
  loadPreviousIters(allToAdd)
741
720
  }}
742
721
  >Load {allToAdd} prior
@@ -807,7 +786,8 @@ let subflowsSize = 500;
807
786
  storedJob = await JobService.getJob({
808
787
  workspace: workspaceId ?? $workspaceStore ?? '',
809
788
  id: loopJobId,
810
- noLogs: true
789
+ noLogs: true,
790
+ noCode: true
811
791
  })
812
792
  storedListJobs[j] = storedJob
813
793
  }
@@ -829,7 +809,7 @@ let subflowsSize = 500;
829
809
  (innerModule?.type != 'forloopflow' && innerModule?.type != 'whileloopflow')}
830
810
  <!-- <LogId id={loopJobId} /> -->
831
811
  <div class="border p-6" class:hidden={forloop_selected != loopJobId}>
832
- <svelte:self
812
+ <FlowStatusViewerInner
833
813
  {globalRefreshes}
834
814
  parentRecursiveRefresh={recursiveRefresh}
835
815
  {childFlow}
@@ -848,7 +828,7 @@ let subflowsSize = 500;
848
828
  isForloopSelected={forloop_selected == loopJobId &&
849
829
  (innerModule?.type == 'forloopflow' || innerModule?.type == 'whileloopflow')}
850
830
  reducedPolling={reducedPolling ||
851
- (flowJobIds?.flowJobs.length && flowJobIds?.flowJobs.length > 20)}
831
+ (!!flowJobIds?.flowJobs.length && flowJobIds?.flowJobs.length > 20)}
852
832
  {workspaceId}
853
833
  jobId={loopJobId}
854
834
  on:jobsLoaded={(e) => {
@@ -918,7 +898,7 @@ let subflowsSize = 500;
918
898
 
919
899
  <!-- <LogId id={loopJobId} /> -->
920
900
  <div class="border p-6" class:hidden={retry_selected != failedRetry}>
921
- <svelte:self
901
+ <FlowStatusViewerInner
922
902
  {globalRefreshes}
923
903
  parentRecursiveRefresh={recursiveRefresh}
924
904
  {childFlow}
@@ -937,7 +917,7 @@ let subflowsSize = 500;
937
917
  {/if}
938
918
  {#if ['InProgress', 'Success', 'Failure'].includes(mod.type)}
939
919
  {#if job.raw_flow?.modules[i]?.value.type == 'flow'}
940
- <svelte:self
920
+ <FlowStatusViewerInner
941
921
  {globalRefreshes}
942
922
  parentRecursiveRefresh={recursiveRefresh}
943
923
  globalModuleStates={[]}
@@ -955,7 +935,7 @@ let subflowsSize = 500;
955
935
  ]}
956
936
  render={selected == 'sequence' && render}
957
937
  {workspaceId}
958
- jobId={mod.job}
938
+ jobId={mod.job ?? ''}
959
939
  {reducedPolling}
960
940
  isSubflow
961
941
  childFlow
@@ -967,7 +947,7 @@ let subflowsSize = 500;
967
947
  {:else if mod.flow_jobs?.length == 0 && mod.job == '00000000-0000-0000-0000-000000000000'}
968
948
  <div class="text-secondary">no subflow (empty loop?)</div>
969
949
  {:else}
970
- <svelte:self
950
+ <FlowStatusViewerInner
971
951
  {globalRefreshes}
972
952
  parentRecursiveRefresh={recursiveRefresh}
973
953
  {childFlow}
@@ -978,14 +958,14 @@ let subflowsSize = 500;
978
958
  {prefix}
979
959
  {subflowParentsGlobalModuleStates}
980
960
  {subflowParentsDurationStatuses}
981
- jobId={mod.job}
961
+ jobId={mod.job ?? ''}
982
962
  {reducedPolling}
983
963
  innerModule={mod.flow_jobs ? job.raw_flow?.modules[i]?.value : undefined}
984
964
  flowJobIds={mod.flow_jobs
985
965
  ? {
986
- moduleId: mod.id,
966
+ moduleId: mod.id ?? '',
987
967
  flowJobs: mod.flow_jobs,
988
- flowJobsSuccess: mod.flow_jobs_success,
968
+ flowJobsSuccess: mod.flow_jobs_success ?? [],
989
969
  length: mod.iterator?.itered?.length ?? mod.flow_jobs.length,
990
970
  branchall: job?.raw_flow?.modules?.[i]?.value?.type == 'branchall'
991
971
  }
@@ -1033,7 +1013,6 @@ let subflowsSize = 500;
1033
1013
  </div>
1034
1014
 
1035
1015
  <FlowGraphV2
1036
- {inputAssets}
1037
1016
  {selectedId}
1038
1017
  triggerNode={true}
1039
1018
  download={!hideDownloadInGraph}
@@ -1,20 +1,8 @@
1
+ import FlowStatusViewerInner from './FlowStatusViewerInner.svelte';
1
2
  import { type Job, type FlowModuleValue } from '../gen';
2
3
  import { type DurationStatus, type GraphModuleState } from './graph';
3
4
  import { type Writable } from 'svelte/store';
4
- 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> {
5
- new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
6
- $$bindings?: Bindings;
7
- } & Exports;
8
- (internal: unknown, props: Props & {
9
- $$events?: Events;
10
- $$slots?: Slots;
11
- }): Exports & {
12
- $set?: any;
13
- $on?: any;
14
- };
15
- z_$$bindings?: Bindings;
16
- }
17
- declare const FlowStatusViewerInner: $$__sveltets_2_IsomorphicComponent<{
5
+ interface Props {
18
6
  jobId: string;
19
7
  initialJob?: Job | undefined;
20
8
  workspaceId?: string | undefined;
@@ -44,15 +32,29 @@ declare const FlowStatusViewerInner: $$__sveltets_2_IsomorphicComponent<{
44
32
  isForloopSelected?: boolean;
45
33
  parentRecursiveRefresh?: Record<string, (clear: any, root: any) => Promise<void>>;
46
34
  job?: Job | undefined;
47
- rightColumnSelect?: "timeline" | "node_status" | "node_definition" | "user_states";
35
+ rightColumnSelect?: 'timeline' | 'node_status' | 'node_definition' | 'user_states';
48
36
  localModuleStates?: Writable<Record<string, GraphModuleState>>;
49
37
  localDurationStatuses?: Writable<Record<string, DurationStatus>>;
50
- }, {
38
+ }
39
+ 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
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
41
+ $$bindings?: Bindings;
42
+ } & Exports;
43
+ (internal: unknown, props: Props & {
44
+ $$events?: Events;
45
+ $$slots?: Slots;
46
+ }): Exports & {
47
+ $set?: any;
48
+ $on?: any;
49
+ };
50
+ z_$$bindings?: Bindings;
51
+ }
52
+ declare const FlowStatusViewerInner: $$__sveltets_2_IsomorphicComponent<Props, {
51
53
  jobsLoaded: CustomEvent<any>;
52
- start: CustomEvent<any>;
53
54
  done: CustomEvent<any>;
55
+ start: CustomEvent<any>;
54
56
  } & {
55
57
  [evt: string]: CustomEvent<any>;
56
- }, {}, {}, string>;
58
+ }, {}, {}, "job" | "globalRefreshes" | "selectedNode" | "parentRecursiveRefresh" | "rightColumnSelect">;
57
59
  type FlowStatusViewerInner = InstanceType<typeof FlowStatusViewerInner>;
58
60
  export default FlowStatusViewerInner;
@@ -0,0 +1,55 @@
1
+ <script lang="ts">"use strict";
2
+ let { previewResult } = $props();
3
+ </script>
4
+
5
+ <div class="border rounded p-2 text-xs max-h-40 overflow-y-auto bg-surface-secondary">
6
+ <div class="font-semibold text-[11px] mb-1 text-tertiary">Preview of changes:</div>
7
+ {#if !previewResult?.added?.length && !previewResult?.deleted?.length && !previewResult?.modified?.length && !previewResult?.yamlModified}
8
+ <div class="mt-2 text-tertiary">No changes found! The workspace is up to date.</div>
9
+ {:else}
10
+ {#if previewResult?.yamlModified}
11
+ <div class="mt-2">
12
+ <div class="text-yellow-600">Modified:</div>
13
+ <ul class="list-disc list-inside">
14
+ <li>wmill.yaml (Git sync settings)</li>
15
+ </ul>
16
+ </div>
17
+ {/if}
18
+ {#if previewResult?.added?.length}
19
+ <div class="mt-2">
20
+ <div class="text-green-600">Added:</div>
21
+ <ul class="list-disc list-inside">
22
+ {#each previewResult.added as file}
23
+ <li>
24
+ {file}{!file.includes('.') ? ' (dir)' : ''}
25
+ </li>
26
+ {/each}
27
+ </ul>
28
+ </div>
29
+ {/if}
30
+ {#if previewResult?.deleted?.length}
31
+ <div class="mt-2">
32
+ <div class="text-red-600">Deleted:</div>
33
+ <ul class="list-disc list-inside">
34
+ {#each previewResult.deleted as file}
35
+ <li>
36
+ {file}{!file.includes('.') ? ' (dir)' : ''}
37
+ </li>
38
+ {/each}
39
+ </ul>
40
+ </div>
41
+ {/if}
42
+ {#if previewResult?.modified?.length}
43
+ <div class="mt-2">
44
+ <div class="text-yellow-600">Modified:</div>
45
+ <ul class="list-disc list-inside">
46
+ {#each previewResult.modified as file}
47
+ <li>
48
+ {file}{!file.includes('.') ? ' (dir)' : ''}
49
+ </li>
50
+ {/each}
51
+ </ul>
52
+ </div>
53
+ {/if}
54
+ {/if}
55
+ </div>