windmill-components 1.542.4 → 1.550.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) hide show
  1. package/package/common.d.ts +4 -1
  2. package/package/components/AIAgentLogViewer.svelte +1 -1
  3. package/package/components/ArgEnum.svelte +14 -5
  4. package/package/components/ArgInput.svelte +23 -15
  5. package/package/components/ArgInput.svelte.d.ts +1 -1
  6. package/package/components/ChannelSelector.svelte +92 -18
  7. package/package/components/ChannelSelector.svelte.d.ts +2 -0
  8. package/package/components/ConnectionSection.svelte +12 -1
  9. package/package/components/Dev.svelte +18 -5
  10. package/package/components/Dev.svelte.d.ts +23 -1
  11. package/package/components/DisplayResult.svelte +36 -23
  12. package/package/components/DropdownV2.svelte +8 -2
  13. package/package/components/DropdownV2.svelte.d.ts +1 -0
  14. package/package/components/DynamicInput.svelte +10 -10
  15. package/package/components/EditableSchemaForm.svelte +21 -7
  16. package/package/components/EditorSettings.svelte +11 -9
  17. package/package/components/ErrorOrRecoveryHandler.svelte +14 -20
  18. package/package/components/FlowHistoryJobPicker.svelte +3 -0
  19. package/package/components/FlowHistoryJobPicker.svelte.d.ts +1 -0
  20. package/package/components/FlowJobResult.svelte +5 -5
  21. package/package/components/FlowLogRow.svelte +2 -2
  22. package/package/components/FlowLogViewer.svelte +228 -57
  23. package/package/components/FlowLogViewer.svelte.d.ts +16 -5
  24. package/package/components/FlowLogViewerWrapper.svelte +56 -3
  25. package/package/components/FlowLogViewerWrapper.svelte.d.ts +4 -3
  26. package/package/components/FlowLoopIterationPreview.svelte +4 -4
  27. package/package/components/FlowMetadata.svelte +3 -4
  28. package/package/components/FlowMetadata.svelte.d.ts +4 -18
  29. package/package/components/FlowPreviewContent.svelte +9 -3
  30. package/package/components/FlowPreviewContent.svelte.d.ts +1 -1
  31. package/package/components/FlowStatusViewer.svelte +62 -59
  32. package/package/components/FlowStatusViewer.svelte.d.ts +2 -2
  33. package/package/components/FlowStatusViewerInner.svelte +186 -94
  34. package/package/components/FlowStatusViewerInner.svelte.d.ts +10 -3
  35. package/package/components/FlowTimeline.svelte +110 -131
  36. package/package/components/FlowTimeline.svelte.d.ts +13 -4
  37. package/package/components/FlowTimelineBar.svelte +227 -0
  38. package/package/components/FlowTimelineBar.svelte.d.ts +24 -0
  39. package/package/components/InputTransformForm.svelte +119 -3
  40. package/package/components/InputTransformForm.svelte.d.ts +3 -0
  41. package/package/components/InputTransformSchemaForm.svelte +5 -1
  42. package/package/components/InputTransformSchemaForm.svelte.d.ts +2 -0
  43. package/package/components/InstanceSetting.svelte +17 -42
  44. package/package/components/InstanceSettings.svelte +12 -21
  45. package/package/components/JobArgs.svelte +15 -16
  46. package/package/components/JobArgs.svelte.d.ts +4 -18
  47. package/package/components/JobLoader.svelte +23 -42
  48. package/package/components/JobLoader.svelte.d.ts +2 -0
  49. package/package/components/JobStatus.svelte +1 -1
  50. package/package/components/JobStatus.svelte.d.ts +4 -18
  51. package/package/components/ModulePreviewResultViewer.svelte +1 -7
  52. package/package/components/NextcloudSetting.svelte +6 -1
  53. package/package/components/Password.svelte +7 -11
  54. package/package/components/Password.svelte.d.ts +5 -20
  55. package/package/components/PasswordArgInput.svelte +35 -15
  56. package/package/components/PasswordArgInput.svelte.d.ts +4 -18
  57. package/package/components/QueuePosition.svelte +6 -2
  58. package/package/components/RunForm.svelte +5 -14
  59. package/package/components/S3ArrayHelperButton.svelte +12 -0
  60. package/package/components/S3ArrayHelperButton.svelte.d.ts +8 -0
  61. package/package/components/ScriptEditor.svelte +5 -6
  62. package/package/components/StringTypeNarrowing.svelte +39 -24
  63. package/package/components/StringTypeNarrowing.svelte.d.ts +1 -1
  64. package/package/components/TeamSelector.svelte +83 -37
  65. package/package/components/TeamSelector.svelte.d.ts +0 -1
  66. package/package/components/apps/components/buttons/AppButton.svelte +11 -1
  67. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +13 -4
  68. package/package/components/apps/components/display/table/SyncColumnDefs.svelte +2 -2
  69. package/package/components/apps/components/display/table/utils.js +1 -1
  70. package/package/components/apps/components/helpers/RefreshButton.svelte +5 -1
  71. package/package/components/apps/components/helpers/RunnableComponent.svelte +0 -2
  72. package/package/components/apps/components/helpers/RunnableWrapper.svelte.d.ts +1 -0
  73. package/package/components/apps/components/layout/AppTabs.svelte +116 -71
  74. package/package/components/apps/components/layout/AppTabs.svelte.d.ts +1 -0
  75. package/package/components/apps/editor/component/ComponentInner.svelte +1 -0
  76. package/package/components/apps/editor/component/components.d.ts +16 -1
  77. package/package/components/apps/editor/component/components.js +22 -2
  78. package/package/components/apps/editor/settingsPanel/ComponentPanel.svelte +2 -0
  79. package/package/components/apps/editor/settingsPanel/GridTab.svelte +19 -1
  80. package/package/components/apps/editor/settingsPanel/GridTab.svelte.d.ts +3 -1
  81. package/package/components/apps/editor/settingsPanel/GridTabHidden.svelte +52 -0
  82. package/package/components/apps/editor/settingsPanel/GridTabHidden.svelte.d.ts +9 -0
  83. package/package/components/auditLogs/AuditLogsFilters.svelte +6 -0
  84. package/package/components/auditLogs/AuditLogsTable.svelte +17 -7
  85. package/package/components/auditLogs/AuditLogsTable.svelte.d.ts +1 -0
  86. package/package/components/common/CloseButton.svelte +2 -2
  87. package/package/components/common/CloseButton.svelte.d.ts +1 -0
  88. package/package/components/common/layout/List.svelte +3 -7
  89. package/package/components/common/layout/List.svelte.d.ts +7 -29
  90. package/package/components/common/popup/PopupV2.svelte +8 -25
  91. package/package/components/common/popup/PopupV2.svelte.d.ts +4 -2
  92. package/package/components/common/table/ScriptRow.svelte +22 -2
  93. package/package/components/copilot/FlowCopilotInputsModal.svelte +26 -23
  94. package/package/components/copilot/chat/AIChatManager.svelte.js +3 -2
  95. package/package/components/copilot/chat/ProviderModelSelector.svelte +1 -1
  96. package/package/components/copilot/chat/flow/FlowAIChat.svelte +4 -2
  97. package/package/components/copilot/chat/script/core.d.ts +4 -4
  98. package/package/components/copilot/chat/script/core.js +93 -34
  99. package/package/components/copilot/lib.d.ts +1 -0
  100. package/package/components/copilot/lib.js +6 -3
  101. package/package/components/custom_ui.d.ts +2 -0
  102. package/package/components/flows/FlowProgressBar.svelte +16 -16
  103. package/package/components/flows/FlowProgressBar.svelte.d.ts +7 -22
  104. package/package/components/flows/content/FlowInputsQuick.svelte +3 -2
  105. package/package/components/flows/content/FlowInputsQuick.svelte.d.ts +1 -0
  106. package/package/components/flows/content/FlowModuleComponent.svelte +24 -1
  107. package/package/components/flows/flowInfers.js +34 -8
  108. package/package/components/flows/flowStore.d.ts +4 -1
  109. package/package/components/flows/map/FlowJobsMenu.svelte +3 -3
  110. package/package/components/flows/map/FlowJobsMenu.svelte.d.ts +1 -1
  111. package/package/components/flows/map/InsertModuleButton.svelte +4 -14
  112. package/package/components/flows/map/InsertModuleButton.svelte.d.ts +0 -1
  113. package/package/components/flows/map/InsertModuleInner.svelte +17 -20
  114. package/package/components/flows/map/MapItem.svelte +1 -1
  115. package/package/components/flows/pickers/PickHubScriptQuick.svelte +38 -52
  116. package/package/components/flows/pickers/PickHubScriptQuick.svelte.d.ts +1 -0
  117. package/package/components/flows/pickers/WorkspaceScriptPickerQuick.svelte +27 -15
  118. package/package/components/flows/pickers/WorkspaceScriptPickerQuick.svelte.d.ts +1 -0
  119. package/package/components/flows/propPicker/OutputPicker.svelte +2 -0
  120. package/package/components/git_sync/DetectionFlow.svelte +33 -44
  121. package/package/components/git_sync/DetectionFlow.svelte.d.ts +1 -0
  122. package/package/components/git_sync/GitSyncContext.svelte.d.ts +22 -0
  123. package/package/components/git_sync/GitSyncContext.svelte.js +145 -5
  124. package/package/components/git_sync/GitSyncModeDisplay.svelte +14 -0
  125. package/package/components/git_sync/GitSyncModeDisplay.svelte.d.ts +9 -0
  126. package/package/components/git_sync/GitSyncRepositoryCard.svelte +365 -253
  127. package/package/components/git_sync/GitSyncRepositoryCard.svelte.d.ts +10 -1
  128. package/package/components/git_sync/GitSyncSection.svelte +134 -14
  129. package/package/components/git_sync/PullWorkspaceModal.svelte +24 -32
  130. package/package/components/git_sync/PushWorkspaceModal.svelte +24 -32
  131. package/package/components/graph/model.d.ts +5 -5
  132. package/package/components/graph/renderers/edges/EmptyEdge.svelte +3 -10
  133. package/package/components/graph/renderers/edges/EmptyEdge.svelte.d.ts +4 -18
  134. package/package/components/graph/renderers/nodes/AIToolNode.svelte +2 -2
  135. package/package/components/graph/renderers/nodes/NewAIToolNode.svelte +5 -10
  136. package/package/components/home/ItemsList.svelte +1 -1
  137. package/package/components/jobs/JobProgressBar.svelte +27 -21
  138. package/package/components/jobs/JobProgressBar.svelte.d.ts +9 -24
  139. package/package/components/meltComponents/MenuSingleItem.svelte +3 -8
  140. package/package/components/meltComponents/MenuSingleItem.svelte.d.ts +0 -3
  141. package/package/components/meltComponents/Popover.svelte +3 -2
  142. package/package/components/meltComponents/Popover.svelte.d.ts +1 -0
  143. package/package/components/meltComponents/Tooltip.svelte +1 -1
  144. package/package/components/progressBar/ProgressBar.svelte +39 -53
  145. package/package/components/progressBar/ProgressBar.svelte.d.ts +11 -26
  146. package/package/components/runs/JobsLoader.svelte +1 -1
  147. package/package/components/runs/NoWorkerWithTagWarning.svelte +3 -3
  148. package/package/components/runs/NoWorkerWithTagWarning.svelte.d.ts +1 -1
  149. package/package/components/schema/AddPropertyV2.svelte +7 -4
  150. package/package/components/schema/PropertyEditor.svelte.d.ts +1 -1
  151. package/package/components/select/MultiSelect.svelte +2 -2
  152. package/package/components/select/MultiSelect.svelte.d.ts +1 -0
  153. package/package/components/settings/WorkspaceUserSettings.svelte +92 -1
  154. package/package/components/sidebar/MenuLink.svelte +2 -1
  155. package/package/components/sidebar/MenuLink.svelte.d.ts +1 -0
  156. package/package/components/sidebar/SidebarContent.svelte +27 -27
  157. package/package/components/table/Cell.svelte +7 -14
  158. package/package/components/table/Cell.svelte.d.ts +13 -35
  159. package/package/components/triggers/AddTriggersButton.svelte +1 -0
  160. package/package/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte +1 -1
  161. package/package/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte.d.ts +2 -1
  162. package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +28 -5
  163. package/package/components/triggers/gcp/utils.js +1 -0
  164. package/package/components/triggers/schedules/ScheduleEditorInner.svelte +1 -0
  165. package/package/components/triggers/webhook/WebhooksConfigSection.svelte +143 -63
  166. package/package/components/triggers/websocket/WebsocketTriggerEditorInner.svelte +22 -0
  167. package/package/components/triggers/websocket/utils.js +1 -0
  168. package/package/components/workspaceSettings/AISettings.svelte +8 -2
  169. package/package/components/workspaceSettings/AISettings.svelte.d.ts +2 -1
  170. package/package/components/workspaceSettings/ModelTokenLimits.svelte +165 -0
  171. package/package/components/workspaceSettings/ModelTokenLimits.svelte.d.ts +8 -0
  172. package/package/components/workspaceSettings/StorageSettings.svelte +123 -51
  173. package/package/gen/core/OpenAPI.js +1 -1
  174. package/package/gen/schemas.gen.d.ts +141 -16
  175. package/package/gen/schemas.gen.js +144 -16
  176. package/package/gen/services.gen.d.ts +62 -42
  177. package/package/gen/services.gen.js +131 -82
  178. package/package/gen/types.gen.d.ts +218 -144
  179. package/package/hubPaths.json +2 -1
  180. package/package/services/JobManager.js +10 -7
  181. package/package/stores.d.ts +1 -0
  182. package/package/stores.js +6 -3
  183. package/package/timelineCompute.svelte.d.ts +21 -0
  184. package/package/timelineCompute.svelte.js +113 -0
  185. package/package/utils.d.ts +15 -8
  186. package/package/utils.js +62 -12
  187. package/package/workspace_settings.d.ts +13 -8
  188. package/package/workspace_settings.js +46 -11
  189. package/package.json +2 -2
@@ -1,5 +1,14 @@
1
+ import type { GitSyncRepository } from './GitSyncContext.svelte';
1
2
  type $$ComponentProps = {
2
- idx: number;
3
+ idx?: number | null;
4
+ isSecondary?: boolean;
5
+ isLegacy?: boolean;
6
+ variant?: 'primary-sync' | 'primary-promotion' | 'secondary' | 'legacy' | 'standard';
7
+ mode?: 'sync' | 'promotion' | null;
8
+ repository?: GitSyncRepository | null;
9
+ onAdd?: (() => void) | null;
10
+ isCollapsible?: boolean;
11
+ showEmptyState?: boolean;
3
12
  };
4
13
  declare const GitSyncRepositoryCard: import("svelte").Component<$$ComponentProps, {}, "">;
5
14
  type GitSyncRepositoryCard = ReturnType<typeof GitSyncRepositoryCard>;
@@ -1,8 +1,8 @@
1
- <script lang="ts">import { Plus, ExternalLink } from 'lucide-svelte';
1
+ <script lang="ts">import { ExternalLink, ChevronDown, ChevronRight, Plus } from 'lucide-svelte';
2
2
  import { Button, Alert } from '../common';
3
3
  import Description from '../Description.svelte';
4
4
  import { setGitSyncContext } from './GitSyncContext.svelte';
5
- import GitSyncRepositoryList from './GitSyncRepositoryList.svelte';
5
+ import GitSyncRepositoryCard from './GitSyncRepositoryCard.svelte';
6
6
  import GitSyncModalManager from './GitSyncModalManager.svelte';
7
7
  import { enterpriseLicense, workspaceStore } from '../../stores';
8
8
  import { sendUserToast } from '../../toast';
@@ -23,6 +23,16 @@ $effect(() => {
23
23
  });
24
24
  }
25
25
  });
26
+ // Derived state for repository categorization
27
+ const primarySync = $derived(gitSyncContext?.getPrimarySyncRepository() || null);
28
+ const primaryPromotion = $derived(gitSyncContext?.getPrimaryPromotionRepository() || null);
29
+ const secondarySync = $derived(gitSyncContext?.getSecondarySyncRepositories() || []);
30
+ const legacyPromotion = $derived(gitSyncContext?.getLegacyPromotionRepositories() || []);
31
+ // State for collapsible sections
32
+ let secondarySyncExpanded = $state(false);
33
+ let legacyPromotionExpanded = $state(false);
34
+ // Check if any secondary repositories are unsaved
35
+ const hasUnsavedSecondary = $derived(secondarySync.some(s => s.repo.isUnsavedConnection));
26
36
  </script>
27
37
 
28
38
  {#if !gitSyncContext}
@@ -68,19 +78,129 @@ $effect(() => {
68
78
  </div>
69
79
  <div class="pt-2"></div>
70
80
 
71
- <!-- Repository list -->
72
- <GitSyncRepositoryList />
81
+ <!-- Primary Sync Repository -->
82
+ <div class="space-y-4">
83
+ <GitSyncRepositoryCard
84
+ variant="primary-sync"
85
+ mode="sync"
86
+ idx={primarySync?.idx ?? null}
87
+ repository={primarySync?.repo ?? null}
88
+ onAdd={() => gitSyncContext.addSyncRepository()}
89
+ isCollapsible={false}
90
+ showEmptyState={primarySync?.repo === null}
91
+ />
73
92
 
74
- <!-- Add repository button -->
75
- <div class="flex mt-5 mb-5">
76
- <Button
77
- startIcon={{ icon: Plus }}
78
- color="dark"
79
- variant="border"
80
- onclick={() => gitSyncContext.addRepository()}
81
- >
82
- Add connection
83
- </Button>
93
+ <!-- Secondary Sync Repositories -->
94
+ {#if primarySync && !primarySync.repo?.isUnsavedConnection}
95
+ {#if secondarySync.length > 0 || secondarySyncExpanded}
96
+ <div class="mt-4">
97
+ <button
98
+ class="flex items-center gap-2 text-sm text-secondary hover:text-primary transition-colors"
99
+ onclick={() => (secondarySyncExpanded = !secondarySyncExpanded)}
100
+ >
101
+ {#if secondarySyncExpanded}
102
+ <ChevronDown size={16} />
103
+ {:else}
104
+ <ChevronRight size={16} />
105
+ {/if}
106
+ Secondary sync repositories ({secondarySync.length})
107
+ </button>
108
+
109
+ {#if secondarySyncExpanded}
110
+ <div class="mt-3 space-y-3">
111
+ {#if secondarySync.length === 0}
112
+ <div class="text-sm text-secondary italic">
113
+ No secondary sync repositories configured
114
+ </div>
115
+ {:else}
116
+ {#each secondarySync as { repo, idx } (repo.git_repo_resource_path)}
117
+ <div class="pl-4">
118
+ <GitSyncRepositoryCard
119
+ variant="secondary"
120
+ {idx}
121
+ isSecondary={true}
122
+ />
123
+ </div>
124
+ {/each}
125
+ {/if}
126
+
127
+ {#if !hasUnsavedSecondary}
128
+ <div class="pl-4">
129
+ <Button
130
+ size="xs"
131
+ color="light"
132
+ variant="border"
133
+ startIcon={{ icon: Plus }}
134
+ onclick={() => gitSyncContext.addSyncRepository()}
135
+ >
136
+ Add secondary sync
137
+ </Button>
138
+ </div>
139
+ {/if}
140
+ </div>
141
+ {/if}
142
+ </div>
143
+ {:else}
144
+ <!-- Collapsed state when no secondary repos exist -->
145
+ {#if !hasUnsavedSecondary}
146
+ <div class="mt-2">
147
+ <button
148
+ class="text-xs text-tertiary hover:text-secondary transition-colors"
149
+ onclick={() => {
150
+ secondarySyncExpanded = true
151
+ gitSyncContext.addSyncRepository()
152
+ }}
153
+ >
154
+ + Add secondary sync repository
155
+ </button>
156
+ </div>
157
+ {/if}
158
+ {/if}
159
+ {/if}
160
+
161
+ <!-- Primary Promotion Repository -->
162
+ <div class="mt-6">
163
+ <GitSyncRepositoryCard
164
+ variant="primary-promotion"
165
+ mode="promotion"
166
+ idx={primaryPromotion?.idx ?? null}
167
+ repository={primaryPromotion?.repo ?? null}
168
+ onAdd={() => gitSyncContext.addPromotionRepository()}
169
+ isCollapsible={false}
170
+ showEmptyState={primaryPromotion?.repo === null}
171
+ />
172
+ </div>
173
+
174
+ <!-- Legacy promotion repositories (backwards compatibility) -->
175
+ {#if legacyPromotion.length > 0}
176
+ <Alert type="warning" title="Multiple promotion repositories detected">
177
+ Multiple promotion repositories are no longer supported. Please reduce to a single promotion repository.
178
+ Only deletion is allowed for the additional repositories below.
179
+ </Alert>
180
+ <div class="mt-4">
181
+ <button
182
+ class="flex items-center gap-2 text-sm text-secondary hover:text-primary transition-colors"
183
+ onclick={() => (legacyPromotionExpanded = !legacyPromotionExpanded)}
184
+ >
185
+ {#if legacyPromotionExpanded}
186
+ <ChevronDown size={16} />
187
+ {:else}
188
+ <ChevronRight size={16} />
189
+ {/if}
190
+ Legacy promotion repositories ({legacyPromotion.length})
191
+ </button>
192
+
193
+ {#if legacyPromotionExpanded}
194
+ <div class="space-y-3 mt-3">
195
+ {#each legacyPromotion as { repo, idx } (repo.git_repo_resource_path)}
196
+ <div class="pl-4">
197
+ <GitSyncRepositoryCard {idx} variant="legacy" isLegacy={true} />
198
+ </div>
199
+ {/each}
200
+ </div>
201
+ {/if}
202
+ </div>
203
+ {/if}
84
204
  </div>
85
205
 
86
206
  <!-- Modals -->
@@ -6,7 +6,7 @@ import { JobService } from '../../gen';
6
6
  import { workspaceStore } from '../../stores';
7
7
  import { sendUserToast } from '../../toast';
8
8
  import hubPaths from '../../hubPaths.json';
9
- import { tryEvery } from '../../utils';
9
+ import { jobManager } from '../../services/JobManager';
10
10
  let { open = $bindable(false), gitRepoResourcePath, uiState, repoIndex, currentGitSyncSettings, onFilterUpdate, onSettingsSaved, onSuccess, settingsOnly = false } = $props();
11
11
  // Job state
12
12
  let previewJobId = $state(null);
@@ -131,42 +131,37 @@ async function executeJob(isDryRun, settingsOnly = false) {
131
131
  applyJobId = jobId;
132
132
  applyJobStatus = 'running';
133
133
  }
134
- let jobSuccess = false;
135
- let result = {};
136
- await tryEvery({
137
- tryCode: async () => {
138
- const testResult = await JobService.getCompletedJob({ workspace, id: jobId });
139
- jobSuccess = !!testResult.success;
140
- if (jobSuccess) {
141
- const jobResult = await JobService.getCompletedJobResult({ workspace, id: jobId });
142
- result = jobResult;
134
+ // Use JobManager instead of tryEvery
135
+ const result = await jobManager.runWithProgress(() => Promise.resolve(jobId), {
136
+ workspace,
137
+ timeout: 60000,
138
+ timeoutMessage: `${isPreview ? 'Preview' : 'Apply'} job timed out after 60s`,
139
+ onProgress: (status) => {
140
+ if (isPreview) {
141
+ previewJobStatus = status.status;
142
+ }
143
+ else {
144
+ applyJobStatus = status.status;
143
145
  }
144
- },
145
- timeoutCode: async () => {
146
- try {
147
- await JobService.cancelQueuedJob({
148
- workspace,
149
- id: jobId,
150
- requestBody: { reason: `${isPreview ? 'Preview' : 'Apply'} job timed out after 60s` }
151
- });
146
+ // Handle failure status
147
+ if (status.status === 'failure') {
148
+ if (isPreview) {
149
+ previewError = status.error || 'Preview failed';
150
+ }
151
+ else {
152
+ applyError = status.error || 'Pull failed';
153
+ }
152
154
  }
153
- catch (err) { }
154
- },
155
- interval: 500,
156
- timeout: 60000
155
+ }
157
156
  });
157
+ // Handle successful result
158
158
  if (isPreview) {
159
- previewJobStatus = jobSuccess ? 'success' : 'failure';
160
- if (jobSuccess) {
159
+ if (previewJobStatus === 'success') {
161
160
  previewResult = result;
162
161
  }
163
- else {
164
- previewError = 'Preview failed';
165
- }
166
162
  }
167
163
  else {
168
- applyJobStatus = jobSuccess ? 'success' : 'failure';
169
- if (jobSuccess) {
164
+ if (applyJobStatus === 'success') {
170
165
  const settingsData = result?.local;
171
166
  const hasSettingsChanges = settingsData && onFilterUpdate;
172
167
  if (hasSettingsChanges) {
@@ -175,9 +170,6 @@ async function executeJob(isDryRun, settingsOnly = false) {
175
170
  }
176
171
  onSuccess?.();
177
172
  }
178
- else {
179
- applyError = 'Pull failed';
180
- }
181
173
  }
182
174
  }
183
175
  catch (e) {
@@ -5,7 +5,7 @@ import GitDiffPreview from '../GitDiffPreview.svelte';
5
5
  import { JobService } from '../../gen';
6
6
  import { workspaceStore } from '../../stores';
7
7
  import hubPaths from '../../hubPaths.json';
8
- import { tryEvery } from '../../utils';
8
+ import { jobManager } from '../../services/JobManager';
9
9
  let { open = $bindable(false), gitRepoResourcePath, uiState, onSuccess, isNewConnection = false, onSaveWithoutInit } = $props();
10
10
  // Job state
11
11
  let previewJobId = $state(null);
@@ -76,47 +76,39 @@ async function executeJob(isDryRun) {
76
76
  applyJobId = jobId;
77
77
  applyJobStatus = 'running';
78
78
  }
79
- let jobSuccess = false;
80
- let result = {};
81
- await tryEvery({
82
- tryCode: async () => {
83
- const testResult = await JobService.getCompletedJob({ workspace, id: jobId });
84
- jobSuccess = !!testResult.success;
85
- if (jobSuccess) {
86
- const jobResult = await JobService.getCompletedJobResult({ workspace, id: jobId });
87
- result = jobResult;
79
+ // Use JobManager instead of tryEvery
80
+ const result = await jobManager.runWithProgress(() => Promise.resolve(jobId), {
81
+ workspace,
82
+ timeout: 60000,
83
+ timeoutMessage: `${isPreview ? 'Preview' : 'Apply'} job timed out after 60s`,
84
+ onProgress: (status) => {
85
+ if (isPreview) {
86
+ previewJobStatus = status.status;
87
+ }
88
+ else {
89
+ applyJobStatus = status.status;
88
90
  }
89
- },
90
- timeoutCode: async () => {
91
- try {
92
- await JobService.cancelQueuedJob({
93
- workspace,
94
- id: jobId,
95
- requestBody: { reason: `${isPreview ? 'Preview' : 'Apply'} job timed out after 60s` }
96
- });
91
+ // Handle failure status
92
+ if (status.status === 'failure') {
93
+ if (isPreview) {
94
+ previewError = status.error || 'Preview failed';
95
+ }
96
+ else {
97
+ applyError = status.error || 'Push failed';
98
+ }
97
99
  }
98
- catch (err) { }
99
- },
100
- interval: 500,
101
- timeout: 60000
100
+ }
102
101
  });
102
+ // Handle successful result
103
103
  if (isPreview) {
104
- previewJobStatus = jobSuccess ? 'success' : 'failure';
105
- if (jobSuccess) {
104
+ if (previewJobStatus === 'success') {
106
105
  previewResult = result;
107
106
  }
108
- else {
109
- previewError = 'Preview failed';
110
- }
111
107
  }
112
108
  else {
113
- applyJobStatus = jobSuccess ? 'success' : 'failure';
114
- if (jobSuccess) {
109
+ if (applyJobStatus === 'success') {
115
110
  onSuccess?.();
116
111
  }
117
- else {
118
- applyError = 'Push failed';
119
- }
120
112
  }
121
113
  }
122
114
  catch (e) {
@@ -24,12 +24,8 @@ export type DurationStatus = {
24
24
  duration_ms?: number;
25
25
  }>;
26
26
  };
27
- export type GlobalIterationBounds = {
28
- iteration_from?: number;
29
- iteration_total?: number;
30
- };
31
27
  export type FlowStatusViewerContext = {
32
- flowStateStore?: FlowState;
28
+ flowState?: FlowState;
33
29
  retryStatus: StateStore<Record<string, number | undefined>>;
34
30
  suspendStatus: StateStore<Record<string, {
35
31
  nb: number;
@@ -56,6 +52,10 @@ export type GraphModuleState = {
56
52
  selectedForloopIndex?: number;
57
53
  selectedForLoopSetManually?: boolean;
58
54
  flow_jobs_success?: (boolean | undefined)[];
55
+ flow_jobs_duration?: {
56
+ started_at?: (string | undefined)[];
57
+ duration_ms?: (number | undefined)[];
58
+ };
59
59
  flow_jobs?: string[];
60
60
  iteration_total?: number;
61
61
  retries?: number;
@@ -1,16 +1,9 @@
1
1
  <script lang="ts">import { getBezierPath, BaseEdge } from '@xyflow/svelte';
2
2
  import { getContext } from 'svelte';
3
3
  import { twMerge } from 'tailwind-merge';
4
- export let sourceX;
5
- export let sourceY;
6
- export let sourcePosition;
7
- export let targetX;
8
- export let targetY;
9
- export let targetPosition;
10
- export let markerEnd = undefined;
11
- export let data = {};
4
+ let { sourceX, sourceY, sourcePosition, targetX, targetY, targetPosition, markerEnd = undefined, data = {} } = $props();
12
5
  const { useDataflow } = getContext('FlowGraphContext');
13
- $: [edgePath] = getBezierPath({
6
+ let [edgePath] = $derived(getBezierPath({
14
7
  sourceX,
15
8
  sourceY,
16
9
  sourcePosition,
@@ -18,7 +11,7 @@ $: [edgePath] = getBezierPath({
18
11
  targetY,
19
12
  targetPosition,
20
13
  curvature: 0.25
21
- });
14
+ }));
22
15
  </script>
23
16
 
24
17
  <BaseEdge
@@ -1,18 +1,5 @@
1
1
  import { type Position } from '@xyflow/svelte';
2
- 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> {
3
- new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
4
- $$bindings?: Bindings;
5
- } & Exports;
6
- (internal: unknown, props: Props & {
7
- $$events?: Events;
8
- $$slots?: Slots;
9
- }): Exports & {
10
- $set?: any;
11
- $on?: any;
12
- };
13
- z_$$bindings?: Bindings;
14
- }
15
- declare const EmptyEdge: $$__sveltets_2_IsomorphicComponent<{
2
+ interface Props {
16
3
  sourceX: number;
17
4
  sourceY: number;
18
5
  sourcePosition: Position;
@@ -23,8 +10,7 @@ declare const EmptyEdge: $$__sveltets_2_IsomorphicComponent<{
23
10
  data?: {
24
11
  class?: string;
25
12
  };
26
- }, {
27
- [evt: string]: CustomEvent<any>;
28
- }, {}, {}, string>;
29
- type EmptyEdge = InstanceType<typeof EmptyEdge>;
13
+ }
14
+ declare const EmptyEdge: import("svelte").Component<Props, {}, "">;
15
+ type EmptyEdge = ReturnType<typeof EmptyEdge>;
30
16
  export default EmptyEdge;
@@ -138,8 +138,9 @@ export function computeAIToolNodes(nodes, eventHandlers, insertable, flowModuleS
138
138
  });
139
139
  }
140
140
  }
141
- const sortedNewNodes = clone(nodes)
141
+ const sortedNewNodes = nodes
142
142
  .filter((n) => n.type !== 'asset')
143
+ .map((n) => ({ id: n.id, position: $state.snapshot(n.position) }))
143
144
  .sort((a, b) => a.position.y - b.position.y);
144
145
  let currentYOffset = 0;
145
146
  let prevYPos = NaN;
@@ -176,7 +177,6 @@ export function computeAIToolNodes(nodes, eventHandlers, insertable, flowModuleS
176
177
  import { MessageCircle, Play, Wrench, X } from 'lucide-svelte';
177
178
  import { twMerge } from 'tailwind-merge';
178
179
  import { getContext } from 'svelte';
179
- import { clone } from '../../../../utils';
180
180
  import { getStateColor, getStateHoverColor } from '../../util';
181
181
  import { deepEqual } from 'fast-equals';
182
182
  let hover = $state(false);
@@ -1,5 +1,4 @@
1
- <script lang="ts">import { preventDefault, stopPropagation } from 'svelte/legacy';
2
- import { twMerge } from 'tailwind-merge';
1
+ <script lang="ts">import { twMerge } from 'tailwind-merge';
3
2
  import {} from '../../graphBuilder.svelte';
4
3
  import InsertModuleInner from '../../../flows/map/InsertModuleInner.svelte';
5
4
  import { Cross } from 'lucide-svelte';
@@ -14,11 +13,12 @@ let floatingConfig = {
14
13
  middleware: [offset(8), flip()],
15
14
  autoUpdate: true
16
15
  };
16
+ let open = $state(false);
17
17
  </script>
18
18
 
19
19
  <!-- svelte-ignore a11y_no_static_element_interactions -->
20
- <PopupV2 {floatingConfig} target="#flow-editor">
21
- {#snippet button({ pointerdown, pointerup })}
20
+ <PopupV2 bind:open {floatingConfig} target="#flow-editor">
21
+ {#snippet button()}
22
22
  <button
23
23
  title={`Add 'tool'
24
24
  }`}
@@ -26,12 +26,7 @@ let floatingConfig = {
26
26
  class={twMerge(
27
27
  '!w-full h-6 flex items-center justify-center !outline-[1px] outline dark:outline-gray-500 outline-gray-300 text-secondary bg-surface focus:outline-none hover:bg-surface-hover rounded'
28
28
  )}
29
- onpointerdown={stopPropagation(
30
- preventDefault(() => {
31
- pointerdown()
32
- })
33
- )}
34
- onpointerup={pointerup}
29
+ onpointerdown={() => (open = !open)}
35
30
  >
36
31
  <div class="flex flex-row items-center gap-1 font-medium text-2xs">
37
32
  <Cross size={12} />
@@ -449,7 +449,7 @@ $effect(() => {
449
449
  />
450
450
  {:else}
451
451
  <div class="border rounded-md">
452
- {#each (items ?? []).slice(0, nbDisplayed) as item (item.type + '/' + item.path)}
452
+ {#each (items ?? []).slice(0, nbDisplayed) as item (item.type + '/' + item.path + (item.hash ? '/' + item.hash : ''))}
453
453
  <Item
454
454
  {item}
455
455
  on:scriptChanged={() => loadScripts(includeWithoutMain)}
@@ -1,20 +1,14 @@
1
1
  <script lang="ts">import {} from '../../gen';
2
2
  import ProgressBar from '../progressBar/ProgressBar.svelte';
3
- export let job = undefined;
4
- export let compact = false;
5
- /// Progress of currently running job
6
- export let scriptProgress = undefined;
7
- // Removes `Step 1` and replaces it with `Running`
8
- export let hideStepTitle = false;
9
- let error = undefined;
10
- let index = 0;
11
- let subIndex = 0;
12
- let subLength = 100;
13
- let length = 1;
3
+ let { job = undefined, compact = false, scriptProgress = undefined, hideStepTitle = false, class: className = '' } = $props();
4
+ let error = $state(undefined);
5
+ let index = $state(0);
6
+ let subIndex = $state(0);
7
+ let subLength = $state(100);
8
+ let length = $state(1);
14
9
  let nextInProgress = false;
15
- $: if (job)
16
- updateJobProgress(job);
17
- $: subIndex = scriptProgress ?? 0;
10
+ let progressBar = $state(undefined);
11
+ let lastJobId = $state();
18
12
  function updateJobProgress(job) {
19
13
  if (!job['running'] && !job['success']) {
20
14
  error = 0;
@@ -24,11 +18,10 @@ function updateJobProgress(job) {
24
18
  }
25
19
  // Anything that is success automatically gets 100% progress
26
20
  if (job['success'] && scriptProgress)
27
- index = 1, subLength = 0, subIndex = 0, scriptProgress = 100;
21
+ ((index = 1), (subLength = 0), (subIndex = 0), (scriptProgress = 100));
28
22
  }
29
- let resetP;
30
23
  export function reset() {
31
- resetP?.();
24
+ progressBar?.resetP();
32
25
  error = undefined;
33
26
  subIndex = 0;
34
27
  subLength = 100;
@@ -36,17 +29,30 @@ export function reset() {
36
29
  index = 0;
37
30
  scriptProgress = undefined;
38
31
  }
32
+ $effect(() => {
33
+ if (lastJobId && job && job.id !== lastJobId) {
34
+ lastJobId = job.id;
35
+ reset();
36
+ }
37
+ });
38
+ $effect(() => {
39
+ if (job)
40
+ updateJobProgress(job);
41
+ });
42
+ $effect(() => {
43
+ subIndex = scriptProgress ?? 0;
44
+ });
39
45
  </script>
40
46
 
41
47
  <ProgressBar
42
- bind:resetP
48
+ bind:this={progressBar}
43
49
  {length}
44
50
  {index}
45
51
  {nextInProgress}
46
52
  {subLength}
47
53
  {subIndex}
48
54
  {error}
49
- class={$$props.class}
50
- bind:compact
51
- bind:hideStepTitle
55
+ class={className}
56
+ {compact}
57
+ {hideStepTitle}
52
58
  />
@@ -1,28 +1,13 @@
1
1
  import { type Job } from '../../gen';
2
- 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> {
3
- new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
4
- $$bindings?: Bindings;
5
- } & Exports;
6
- (internal: unknown, props: Props & {
7
- $$events?: Events;
8
- $$slots?: Slots;
9
- }): Exports & {
10
- $set?: any;
11
- $on?: any;
12
- };
13
- z_$$bindings?: Bindings;
14
- }
15
- declare const JobProgressBar: $$__sveltets_2_IsomorphicComponent<{
16
- [x: string]: any;
2
+ interface Props {
17
3
  job?: Job | undefined;
18
- compact?: boolean | undefined;
19
- scriptProgress?: number | undefined | undefined;
20
- hideStepTitle?: boolean | undefined;
21
- reset?: (() => void) | undefined;
22
- }, {
23
- [evt: string]: CustomEvent<any>;
24
- }, {}, {
4
+ compact?: boolean;
5
+ scriptProgress?: number | undefined;
6
+ hideStepTitle?: boolean;
7
+ class?: string;
8
+ }
9
+ declare const JobProgressBar: import("svelte").Component<Props, {
25
10
  reset: () => void;
26
- }, string>;
27
- type JobProgressBar = InstanceType<typeof JobProgressBar>;
11
+ }, "">;
12
+ type JobProgressBar = ReturnType<typeof JobProgressBar>;
28
13
  export default JobProgressBar;
@@ -1,12 +1,7 @@
1
- <script lang="ts">import { melt } from '@melt-ui/svelte';
2
- let { createMenu, triggr, children } = $props();
3
- const menu = createMenu();
4
- const { elements: { trigger, item, menu: menuElement } } = menu;
1
+ <script lang="ts">"use strict";
2
+ let { children } = $props();
5
3
  </script>
6
4
 
7
5
  <div class="hover:z-50 flex w-full h-8">
8
- {@render triggr?.({ trigger })}
9
- <div {...$menuElement} use:$menuElement.action>
10
- {@render children?.({ item })}
11
- </div>
6
+ {@render children?.({})}
12
7
  </div>
@@ -1,7 +1,4 @@
1
- import { type MenubarBuilders } from '@melt-ui/svelte';
2
1
  interface Props {
3
- createMenu: MenubarBuilders['createMenu'];
4
- triggr?: import('svelte').Snippet<[any]>;
5
2
  children?: import('svelte').Snippet<[any]>;
6
3
  }
7
4
  declare const MenuSingleItem: import("svelte").Component<Props, {}, "">;