windmill-components 1.511.0 → 1.522.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 (236) hide show
  1. package/package/components/AppConnectInner.svelte.d.ts +1 -1
  2. package/package/components/ArgInput.svelte +56 -18
  3. package/package/components/ArgInput.svelte.d.ts +2 -10
  4. package/package/components/AssignableTagsInner.svelte +5 -0
  5. package/package/components/AuthSettings.svelte +4 -2
  6. package/package/components/AuthSettings.svelte.d.ts +1 -0
  7. package/package/components/DBManagerDrawer.svelte +154 -151
  8. package/package/components/DBManagerDrawer.svelte.d.ts +2 -2
  9. package/package/components/DBTable.svelte +3 -3
  10. package/package/components/DBTable.svelte.d.ts +1 -0
  11. package/package/components/DBTableEditor.svelte +7 -7
  12. package/package/components/DBTableEditor.svelte.d.ts +1 -1
  13. package/package/components/DeployWorkspace.svelte +1 -1
  14. package/package/components/DisplayResult.svelte +34 -8
  15. package/package/components/DisplayResult.svelte.d.ts +4 -1
  16. package/package/components/DynSelect.svelte +58 -34
  17. package/package/components/DynSelect.svelte.d.ts +3 -11
  18. package/package/components/EditableSchemaForm.svelte +126 -6
  19. package/package/components/EditableSchemaForm.svelte.d.ts +5 -1
  20. package/package/components/Editor.svelte +1 -1
  21. package/package/components/EditorBar.svelte +82 -4
  22. package/package/components/ErrorOrRecoveryHandler.svelte +76 -8
  23. package/package/components/ErrorOrRecoveryHandler.svelte.d.ts +2 -1
  24. package/package/components/ExploreAssetButton.svelte +14 -4
  25. package/package/components/ExploreAssetButton.svelte.d.ts +1 -0
  26. package/package/components/FlowJobResult.svelte +3 -3
  27. package/package/components/FlowJobResult.svelte.d.ts +1 -0
  28. package/package/components/FlowPreviewContent.svelte +9 -0
  29. package/package/components/FlowPreviewContent.svelte.d.ts +3 -0
  30. package/package/components/FlowPreviewResult.svelte +4 -1
  31. package/package/components/FlowPreviewResult.svelte.d.ts +1 -0
  32. package/package/components/FlowStatusViewer.svelte +2 -1
  33. package/package/components/FlowStatusViewer.svelte.d.ts +3 -0
  34. package/package/components/FlowStatusViewerInner.svelte +23 -3
  35. package/package/components/FlowStatusViewerInner.svelte.d.ts +10 -1
  36. package/package/components/FolderEditor.svelte +1 -1
  37. package/package/components/GitDiffPreview.svelte +14 -18
  38. package/package/components/GitDiffPreview.svelte.d.ts +2 -8
  39. package/package/components/GitHubAppIntegration.svelte +3 -1
  40. package/package/components/IdEditorInput.svelte +25 -22
  41. package/package/components/IdEditorInput.svelte.d.ts +11 -23
  42. package/package/components/InstanceSetting.svelte +7 -2
  43. package/package/components/InstanceSettings.svelte +1 -0
  44. package/package/components/JobLoader.svelte +48 -5
  45. package/package/components/JobLoader.svelte.d.ts +7 -2
  46. package/package/components/Login.svelte +8 -2
  47. package/package/components/MemoryFootprintViewer.svelte +1 -1
  48. package/package/components/ModulePreviewResultViewer.svelte +2 -2
  49. package/package/components/MoveDrawer.svelte.d.ts +2 -2
  50. package/package/components/NextcloudSetting.svelte +84 -0
  51. package/package/components/NextcloudSetting.svelte.d.ts +7 -0
  52. package/package/components/ObjectResourceInput.svelte +3 -2
  53. package/package/components/ObjectResourceInput.svelte.d.ts +1 -0
  54. package/package/components/ParqetCsvTableRenderer.svelte +1 -1
  55. package/package/components/ResourceEditor.svelte +1 -1
  56. package/package/components/ResourcePicker.svelte +8 -1
  57. package/package/components/ResourcePicker.svelte.d.ts +1 -0
  58. package/package/components/ResultStreamDisplay.svelte +5 -0
  59. package/package/components/ResultStreamDisplay.svelte.d.ts +5 -0
  60. package/package/components/RunForm.svelte +9 -1
  61. package/package/components/SchemaForm.svelte +2 -2
  62. package/package/components/SchemaForm.svelte.d.ts +2 -10
  63. package/package/components/ScriptBuilder.svelte +13 -8
  64. package/package/components/ScriptBuilder.svelte.d.ts +1 -1
  65. package/package/components/ScriptEditor.svelte.d.ts +1 -1
  66. package/package/components/ScriptWrapper.svelte +1 -1
  67. package/package/components/ShareModal.svelte.d.ts +1 -1
  68. package/package/components/SimpleAgTable.svelte +2 -0
  69. package/package/components/SimpleAgTable.svelte.d.ts +2 -0
  70. package/package/components/SqlRepl.svelte +21 -7
  71. package/package/components/SqlRepl.svelte.d.ts +2 -2
  72. package/package/components/StringTypeNarrowing.svelte.d.ts +1 -1
  73. package/package/components/WorkerTagSelect.svelte +70 -1
  74. package/package/components/apps/components/display/AppDisplayComponent.svelte +13 -1
  75. package/package/components/apps/components/display/AppText.svelte +2 -2
  76. package/package/components/apps/components/display/dbtable/AppDbExplorer.svelte +8 -1
  77. package/package/components/apps/components/display/dbtable/InsertRow.svelte +5 -4
  78. package/package/components/apps/components/display/dbtable/queries/count.js +11 -1
  79. package/package/components/apps/components/display/dbtable/queries/createTable.d.ts +1 -1
  80. package/package/components/apps/components/display/dbtable/queries/createTable.js +3 -3
  81. package/package/components/apps/components/display/dbtable/queries/delete.js +7 -0
  82. package/package/components/apps/components/display/dbtable/queries/insert.js +2 -0
  83. package/package/components/apps/components/display/dbtable/queries/select.js +14 -0
  84. package/package/components/apps/components/display/dbtable/queries/update.js +7 -0
  85. package/package/components/apps/components/display/dbtable/utils.d.ts +6 -5
  86. package/package/components/apps/components/display/dbtable/utils.js +52 -28
  87. package/package/components/apps/components/display/table/AppAggridExplorerTable.svelte +1 -1
  88. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte +1 -0
  89. package/package/components/apps/components/display/table/AppAggridInfiniteTable.svelte.d.ts +1 -0
  90. package/package/components/apps/components/display/table/AppAggridTable.svelte +5 -4
  91. package/package/components/apps/components/display/table/AppAggridTable.svelte.d.ts +1 -0
  92. package/package/components/apps/components/display/table/utils.js +7 -4
  93. package/package/components/apps/components/helpers/HiddenComponent.svelte +2 -2
  94. package/package/components/apps/components/helpers/RunnableComponent.svelte +4 -1
  95. package/package/components/apps/components/helpers/RunnableComponent.svelte.d.ts +2 -1
  96. package/package/components/apps/components/inputs/AppS3FileInput.svelte +2 -2
  97. package/package/components/apps/components/layout/AppDecisionTree.svelte +1 -1
  98. package/package/components/apps/components/layout/AppStepper.svelte +1 -1
  99. package/package/components/apps/components/layout/AppTabs.svelte +1 -1
  100. package/package/components/apps/editor/AppEditorHeader.svelte +13 -2
  101. package/package/components/apps/editor/GridViewer.svelte +1 -0
  102. package/package/components/apps/editor/RunnableJobPanelInner.svelte +2 -1
  103. package/package/components/apps/editor/contextPanel/components/IdEditor.svelte +7 -7
  104. package/package/components/apps/editor/contextPanel/components/IdEditor.svelte.d.ts +7 -19
  105. package/package/components/apps/editor/contextPanel/components/OutputHeader.svelte +8 -12
  106. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditor.svelte.d.ts +1 -1
  107. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptEditorDrawer.svelte.d.ts +1 -1
  108. package/package/components/apps/editor/inlineScriptsPanel/InlineScriptRunnableByPath.svelte.d.ts +1 -1
  109. package/package/components/apps/editor/settingsPanel/DecisionTreeGraphEditor.svelte +3 -3
  110. package/package/components/apps/editor/settingsPanel/decisionTree/DecisionTreePreview.svelte +1 -3
  111. package/package/components/assets/AssetsDropdownButton.svelte +1 -1
  112. package/package/components/assets/JobAssetsViewer.svelte +2 -2
  113. package/package/components/assets/lib.js +4 -0
  114. package/package/components/auditLogs/AuditLogsFilters.svelte +7 -9
  115. package/package/components/common/button/Button.svelte +4 -3
  116. package/package/components/common/button/Button.svelte.d.ts +1 -0
  117. package/package/components/common/confirmationModal/ConfirmationModal.svelte +6 -5
  118. package/package/components/common/confirmationModal/ConfirmationModal.svelte.d.ts +6 -11
  119. package/package/components/common/confirmationModal/asyncConfirmationModal.svelte.d.ts +26 -0
  120. package/package/components/common/confirmationModal/asyncConfirmationModal.svelte.js +50 -0
  121. package/package/components/common/modal/Modal.svelte +2 -5
  122. package/package/components/common/tabs/TabsV2.svelte +2 -1
  123. package/package/components/common/tabs/TabsV2.svelte.d.ts +1 -0
  124. package/package/components/copilot/chat/AIChatManager.svelte.js +61 -7
  125. package/package/components/copilot/chat/ContextTextarea.svelte +1 -1
  126. package/package/components/copilot/chat/script/core.js +28 -29
  127. package/package/components/copilot/chat/shared.d.ts +1 -1
  128. package/package/components/copilot/chat/shared.js +8 -2
  129. package/package/components/custom_ui.d.ts +3 -0
  130. package/package/components/dbOps.d.ts +20 -8
  131. package/package/components/dbOps.js +85 -40
  132. package/package/components/details/DetailPageHeader.svelte +0 -2
  133. package/package/components/flows/content/FlowInput.svelte +5 -0
  134. package/package/components/flows/content/FlowModuleComponent.svelte +1 -0
  135. package/package/components/flows/content/FlowModuleScript.svelte +0 -1
  136. package/package/components/flows/idUtils.js +2 -1
  137. package/package/components/flows/map/FlowModuleSchemaItem.svelte +3 -3
  138. package/package/components/flows/map/FlowModuleSchemaMap.svelte +5 -0
  139. package/package/components/flows/map/InsertModuleButton.svelte +4 -1
  140. package/package/components/flows/propPicker/OutputBadge.svelte +5 -1
  141. package/package/components/flows/propPicker/OutputPickerInner.svelte +9 -5
  142. package/package/components/flows/propPicker/OutputPickerInner.svelte.d.ts +6 -2
  143. package/package/components/flows/propPicker/StepHistory.svelte +4 -1
  144. package/package/components/git_sync/DetectionFlow.svelte +202 -0
  145. package/package/components/git_sync/DetectionFlow.svelte.d.ts +6 -0
  146. package/package/components/git_sync/GitSyncContext.svelte.d.ts +82 -0
  147. package/package/components/git_sync/GitSyncContext.svelte.js +461 -0
  148. package/package/components/git_sync/GitSyncModalManager.svelte +99 -0
  149. package/package/components/git_sync/GitSyncModalManager.svelte.d.ts +18 -0
  150. package/package/components/git_sync/GitSyncRepositoryCard.svelte +339 -0
  151. package/package/components/git_sync/GitSyncRepositoryCard.svelte.d.ts +6 -0
  152. package/package/components/git_sync/GitSyncRepositoryList.svelte +17 -0
  153. package/package/components/git_sync/GitSyncRepositoryList.svelte.d.ts +18 -0
  154. package/package/components/git_sync/GitSyncSection.svelte +89 -0
  155. package/package/components/git_sync/GitSyncSection.svelte.d.ts +3 -0
  156. package/package/components/git_sync/GitSyncSuccessModal.svelte +58 -0
  157. package/package/components/git_sync/GitSyncSuccessModal.svelte.d.ts +7 -0
  158. package/package/components/git_sync/PullWorkspaceModal.svelte +575 -0
  159. package/package/components/git_sync/PullWorkspaceModal.svelte.d.ts +15 -0
  160. package/package/components/git_sync/PushWorkspaceModal.svelte +320 -0
  161. package/package/components/git_sync/PushWorkspaceModal.svelte.d.ts +12 -0
  162. package/package/components/graph/FlowGraphV2.svelte +5 -1
  163. package/package/components/graph/graphBuilder.svelte.js +1 -1
  164. package/package/components/graph/renderers/nodes/AssetNode.svelte +4 -4
  165. package/package/components/icons/AssetDucklakeIcon.svelte +28 -0
  166. package/package/components/icons/AssetDucklakeIcon.svelte.d.ts +9 -0
  167. package/package/components/icons/AssetGenericIcon.svelte +3 -0
  168. package/package/components/icons/DucklakeIcon.svelte +18 -0
  169. package/package/components/icons/DucklakeIcon.svelte.d.ts +6 -0
  170. package/package/components/instanceSettings.js +11 -3
  171. package/package/components/runs/JobPreview.svelte +2 -2
  172. package/package/components/runs/NoWorkerWithTagWarning.svelte +3 -3
  173. package/package/components/runs/RunsFilter.svelte.d.ts +1 -1
  174. package/package/components/schema/FlowPropertyEditor.svelte +3 -2
  175. package/package/components/schema/FlowPropertyEditor.svelte.d.ts +1 -1
  176. package/package/components/schema/PropertyEditor.svelte +0 -2
  177. package/package/components/schema/PropertyEditor.svelte.d.ts +1 -1
  178. package/package/components/schema/SchemaFormDND.svelte +2 -1
  179. package/package/components/schema/SchemaFormDND.svelte.d.ts +2 -0
  180. package/package/components/scriptEditor/LogPanel.svelte +5 -3
  181. package/package/components/scriptEditor/LogPanel.svelte.d.ts +5 -1
  182. package/package/components/select/Select.svelte +7 -4
  183. package/package/components/select/Select.svelte.d.ts +5 -0
  184. package/package/components/select/SelectDropdown.svelte +2 -1
  185. package/package/components/select/SelectDropdown.svelte.d.ts +3 -0
  186. package/package/components/sidebar/changelogs.js +5 -0
  187. package/package/components/table/AutoDataTable.svelte +6 -4
  188. package/package/components/table/AutoDataTable.svelte.d.ts +1 -0
  189. package/package/components/table/DataTable.svelte +12 -10
  190. package/package/components/table/DataTable.svelte.d.ts +1 -0
  191. package/package/components/triggers/TriggerRetriesAndErrorHandler.svelte.d.ts +2 -2
  192. package/package/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte +1 -1
  193. package/package/components/triggers/gcp/GcpTriggerEditorConfigSection.svelte.d.ts +2 -1
  194. package/package/components/triggers/gcp/GcpTriggerEditorInner.svelte +50 -11
  195. package/package/components/triggers/gcp/utils.js +1 -0
  196. package/package/components/triggers/http/utils.js +1 -1
  197. package/package/components/triggers/kafka/utils.js +1 -1
  198. package/package/components/triggers/mqtt/utils.js +1 -1
  199. package/package/components/triggers/nats/utils.js +1 -1
  200. package/package/components/triggers/postgres/utils.js +1 -1
  201. package/package/components/triggers/sqs/utils.js +1 -1
  202. package/package/components/triggers/utils.js +2 -1
  203. package/package/components/triggers/webhook/WebhooksConfigSection.svelte +24 -26
  204. package/package/components/triggers/webhook/WebhooksPanel.svelte +1 -15
  205. package/package/components/triggers/websocket/utils.js +1 -1
  206. package/package/components/workspaceSettings/AISettings.svelte +52 -36
  207. package/package/components/workspaceSettings/DucklakeSettings.svelte +321 -0
  208. package/package/components/workspaceSettings/DucklakeSettings.svelte.d.ts +23 -0
  209. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte +122 -499
  210. package/package/components/workspaceSettings/GitSyncFilterSettings.svelte.d.ts +8 -10
  211. package/package/consts.js +2 -1
  212. package/package/gen/core/OpenAPI.js +1 -1
  213. package/package/gen/schemas.gen.d.ts +33 -24
  214. package/package/gen/schemas.gen.js +36 -27
  215. package/package/gen/services.gen.d.ts +19 -1
  216. package/package/gen/services.gen.js +38 -0
  217. package/package/gen/types.gen.d.ts +103 -9
  218. package/package/git-sync.d.ts +36 -0
  219. package/package/git-sync.js +1 -0
  220. package/package/hub.d.ts +1 -0
  221. package/package/hubPaths.json +5 -2
  222. package/package/infer.js +3 -2
  223. package/package/script_helpers.d.ts +2 -2
  224. package/package/script_helpers.js +29 -11
  225. package/package/services/JobManager.d.ts +28 -0
  226. package/package/services/JobManager.js +114 -0
  227. package/package/stores.d.ts +1 -1
  228. package/package/utils.d.ts +18 -1
  229. package/package/utils.js +55 -2
  230. package/package.json +13 -12
  231. package/package/components/InitGitRepoPopover.svelte +0 -410
  232. package/package/components/InitGitRepoPopover.svelte.d.ts +0 -13
  233. package/package/components/PullGitRepoPopover.svelte +0 -355
  234. package/package/components/PullGitRepoPopover.svelte.d.ts +0 -18
  235. package/package/inferArgSig.d.ts +0 -35
  236. package/package/inferArgSig.js +0 -191
@@ -0,0 +1,461 @@
1
+ import { getContext, setContext } from 'svelte';
2
+ import { JobService, WorkspaceService } from '../../gen';
3
+ import { jobManager } from '../../services/JobManager';
4
+ import hubPaths from '../../hubPaths.json';
5
+ const GIT_SYNC_CONTEXT_KEY = Symbol('git-sync-context');
6
+ // Context implementation
7
+ export function createGitSyncContext(workspace) {
8
+ const repositories = $state([]);
9
+ const initialRepositories = $state([]);
10
+ const gitSyncTestJobs = $state([]);
11
+ let loading = $state(false);
12
+ const activeModals = $state({ push: null, pull: null, success: null });
13
+ // Legacy workspace-level settings state
14
+ const legacyWorkspaceIncludePath = $state([]);
15
+ const legacyWorkspaceIncludeType = $state([]);
16
+ // Derived state for legacy detection
17
+ const hasWorkspaceLevelSettings = $derived(legacyWorkspaceIncludePath.length > 0 || legacyWorkspaceIncludeType.length > 0);
18
+ // Watch for changes to git repository paths and reset detection state
19
+ $effect(() => {
20
+ repositories.forEach((repo) => {
21
+ if (repo.isUnsavedConnection) {
22
+ const currentPath = repo.git_repo_resource_path;
23
+ if (repo._trackedPath && repo._trackedPath !== currentPath && repo.detectionState && repo.detectionState !== 'idle') {
24
+ _resetRepoDetectionState(repo);
25
+ }
26
+ repo._trackedPath = currentPath;
27
+ }
28
+ });
29
+ });
30
+ const getValidationStates = () => {
31
+ return repositories.map((repo, idx) => ({
32
+ isValid: validateRepository(repo, idx),
33
+ isDuplicate: checkDuplicate(repo, idx),
34
+ hasChanges: checkChanges(repo, idx)
35
+ }));
36
+ };
37
+ const getHasAnyChanges = () => {
38
+ const validationStates = getValidationStates();
39
+ // Check if any individual repositories have changes
40
+ const individualChanges = validationStates.some(v => v.hasChanges);
41
+ // Check if any legacy repos were imported
42
+ const anyLegacyImported = repositories.some(r => r.legacyImported);
43
+ // Check if the set of repositories has changed (added/removed repos)
44
+ const repositorySetChanged = (() => {
45
+ if (loading) {
46
+ return false;
47
+ }
48
+ if (!initialRepositories || initialRepositories.length === 0) {
49
+ return repositories.filter((_, i) => validationStates[i]?.isValid).length > 0;
50
+ }
51
+ const initialValidPaths = new Set(initialRepositories
52
+ .filter(r => r.git_repo_resource_path && r.git_repo_resource_path.trim() !== '')
53
+ .map(r => r.git_repo_resource_path));
54
+ const currentValidPaths = new Set(repositories
55
+ .filter((_, i) => validationStates[i]?.isValid)
56
+ .map(r => r.git_repo_resource_path));
57
+ // Check if sets are different (repos added or removed)
58
+ return initialValidPaths.size !== currentValidPaths.size ||
59
+ [...initialValidPaths].some(path => !currentValidPaths.has(path)) ||
60
+ [...currentValidPaths].some(path => !initialValidPaths.has(path));
61
+ })();
62
+ return individualChanges || anyLegacyImported || repositorySetChanged;
63
+ };
64
+ const getAllRepositoriesValid = () => getValidationStates().every(v => v.isValid);
65
+ const getHasUnsavedConnections = () => repositories.some(repo => repo.isUnsavedConnection);
66
+ function validateRepository(repo, idx) {
67
+ if (!repo.git_repo_resource_path)
68
+ return false;
69
+ return !checkDuplicate(repo, idx);
70
+ }
71
+ function checkDuplicate(repo, idx) {
72
+ if (!repo.git_repo_resource_path)
73
+ return false;
74
+ const firstIdx = repositories.findIndex(r => r.git_repo_resource_path === repo.git_repo_resource_path);
75
+ return firstIdx !== -1 && firstIdx < idx;
76
+ }
77
+ function checkChanges(repo, idx) {
78
+ const initial = initialRepositories[idx];
79
+ if (!initial)
80
+ return true;
81
+ // Legacy repositories always have "changes" because they need migration
82
+ if (repo.legacyImported)
83
+ return true;
84
+ return JSON.stringify(serializeRepository(repo)) !== JSON.stringify(serializeRepository(initial));
85
+ }
86
+ function serializeRepository(repo) {
87
+ return {
88
+ git_repo_resource_path: repo.git_repo_resource_path,
89
+ script_path: repo.script_path,
90
+ use_individual_branch: repo.use_individual_branch,
91
+ group_by_folder: repo.group_by_folder,
92
+ settings: repo.settings,
93
+ exclude_types_override: repo.exclude_types_override
94
+ };
95
+ }
96
+ function addRepository() {
97
+ repositories.push({
98
+ git_repo_resource_path: '',
99
+ script_path: hubPaths.gitSync,
100
+ use_individual_branch: false,
101
+ group_by_folder: false,
102
+ settings: {
103
+ include_path: ['f/**'],
104
+ exclude_path: [],
105
+ extra_include_path: [],
106
+ include_type: ['script', 'flow', 'app', 'folder']
107
+ },
108
+ exclude_types_override: [],
109
+ legacyImported: false,
110
+ isUnsavedConnection: true,
111
+ collapsed: false
112
+ });
113
+ gitSyncTestJobs.push({
114
+ jobId: '',
115
+ status: undefined
116
+ });
117
+ }
118
+ async function removeRepository(idx) {
119
+ const repo = repositories[idx];
120
+ if (!repo)
121
+ return;
122
+ // Check if this repository exists in the initial (saved) state
123
+ const existsInInitialState = initialRepositories.some(initialRepo => initialRepo.git_repo_resource_path === repo.git_repo_resource_path);
124
+ // Only call backend API if repository exists in the saved state
125
+ if (existsInInitialState) {
126
+ await WorkspaceService.deleteGitSyncRepository({
127
+ workspace,
128
+ requestBody: {
129
+ git_repo_resource_path: `$res:${repo.git_repo_resource_path}`
130
+ }
131
+ });
132
+ // Update initial state to remove the deleted repository
133
+ const initialIdx = initialRepositories.findIndex(initialRepo => initialRepo.git_repo_resource_path === repo.git_repo_resource_path);
134
+ if (initialIdx !== -1) {
135
+ initialRepositories.splice(initialIdx, 1);
136
+ }
137
+ }
138
+ // Remove from local state
139
+ repositories.splice(idx, 1);
140
+ gitSyncTestJobs.splice(idx, 1);
141
+ }
142
+ function getRepository(idx) {
143
+ return repositories[idx];
144
+ }
145
+ function showPushModal(idx) {
146
+ const repo = repositories[idx];
147
+ if (repo) {
148
+ activeModals.push = { idx, repo, open: true };
149
+ }
150
+ }
151
+ function showPullModal(idx, settingsOnly = false) {
152
+ const repo = repositories[idx];
153
+ if (repo) {
154
+ activeModals.pull = { idx, repo, open: true, settingsOnly };
155
+ }
156
+ }
157
+ function closeModal(type) {
158
+ if (activeModals[type]) {
159
+ activeModals[type].open = false;
160
+ }
161
+ setTimeout(() => {
162
+ activeModals[type] = null;
163
+ }, 200);
164
+ }
165
+ function closePushModal() {
166
+ closeModal('push');
167
+ }
168
+ function closePullModal() {
169
+ closeModal('pull');
170
+ }
171
+ function showSuccessModal(savedWithoutInit) {
172
+ activeModals.success = { open: true, savedWithoutInit };
173
+ }
174
+ function closeSuccessModal() {
175
+ closeModal('success');
176
+ }
177
+ function getValidation(idx) {
178
+ const states = getValidationStates();
179
+ return states[idx] || { isValid: false, isDuplicate: false, hasChanges: false };
180
+ }
181
+ async function detectRepository(idx) {
182
+ const repo = repositories[idx];
183
+ if (!repo || !repo.git_repo_resource_path) {
184
+ throw new Error('Repository not found or no resource path');
185
+ }
186
+ repo.detectionState = 'loading';
187
+ repo.detectionError = undefined;
188
+ repo.detectionJobId = undefined;
189
+ repo.detectionJobStatus = undefined;
190
+ try {
191
+ const jobId = await JobService.runScriptByPath({
192
+ workspace,
193
+ path: hubPaths.gitInitRepo,
194
+ requestBody: {
195
+ workspace_id: workspace,
196
+ repo_url_resource_path: repo.git_repo_resource_path,
197
+ dry_run: true,
198
+ pull: false,
199
+ only_wmill_yaml: true,
200
+ settings_json: JSON.stringify(repo.settings),
201
+ use_promotion_overrides: repo.use_individual_branch
202
+ },
203
+ skipPreprocessor: true
204
+ });
205
+ repo.detectionJobId = jobId;
206
+ repo.detectionJobStatus = 'running';
207
+ // Use JobManager for polling - result will be the actual job response
208
+ await jobManager.runWithProgress(() => Promise.resolve(jobId), {
209
+ workspace,
210
+ timeout: 30000,
211
+ timeoutMessage: 'Detection job timed out after 30s',
212
+ onProgress: (status) => {
213
+ repo.detectionJobStatus = status.status;
214
+ // Process successful detection result
215
+ if (status.status === 'success' && status.result) {
216
+ const response = status.result;
217
+ if (response.isInitialSetup) {
218
+ repo.detectionState = 'no-wmill';
219
+ }
220
+ else {
221
+ repo.detectionState = 'has-wmill';
222
+ // Apply extracted settings from the git repository
223
+ if (response.local) {
224
+ repo.extractedSettings = response.local;
225
+ // Auto-apply the extracted settings
226
+ repo.settings = {
227
+ ...response.local,
228
+ exclude_path: response.local.exclude_path || [],
229
+ extra_include_path: response.local.extra_include_path || []
230
+ };
231
+ }
232
+ }
233
+ }
234
+ else if (status.status === 'failure') {
235
+ repo.detectionState = 'error';
236
+ repo.detectionError = status.error || 'Detection failed';
237
+ }
238
+ }
239
+ });
240
+ }
241
+ catch (error) {
242
+ repo.detectionState = 'error';
243
+ repo.detectionError = error?.message || error?.toString() || 'Failed to detect repository';
244
+ repo.detectionJobStatus = 'failure';
245
+ }
246
+ }
247
+ // Settings management
248
+ async function loadSettings() {
249
+ loading = true;
250
+ try {
251
+ const settings = await WorkspaceService.getSettings({ workspace });
252
+ if (settings.git_sync !== undefined && settings.git_sync !== null) {
253
+ // Detect workspace-level legacy settings (outside repositories)
254
+ const workspaceLegacyIncludePath = settings.git_sync?.include_path ?? [];
255
+ const workspaceLegacyIncludeTypeRaw = settings.git_sync?.include_type ?? [];
256
+ const workspaceLegacyIncludeType = [...workspaceLegacyIncludeTypeRaw];
257
+ // Update legacy workspace state
258
+ legacyWorkspaceIncludePath.splice(0, legacyWorkspaceIncludePath.length, ...workspaceLegacyIncludePath);
259
+ legacyWorkspaceIncludeType.splice(0, legacyWorkspaceIncludeType.length, ...workspaceLegacyIncludeType);
260
+ if (settings.git_sync.repositories) {
261
+ repositories.splice(0, repositories.length, ...settings.git_sync.repositories.map(repo => {
262
+ // Check if this is a legacy repo (no nested settings object)
263
+ const isRepoLegacy = !repo.settings;
264
+ const repoExcludeTypesOverride = repo.exclude_types_override ?? [];
265
+ // Determine default types - use workspace legacy or fallback
266
+ const defaultTypes = workspaceLegacyIncludeType.length > 0
267
+ ? [...workspaceLegacyIncludeType]
268
+ : ['script', 'flow', 'app', 'folder'];
269
+ let repoSettings;
270
+ if (isRepoLegacy) {
271
+ // Legacy repo: inherit from workspace-level settings and apply exclude_types_override
272
+ const inheritedIncludeType = repo.settings?.include_type ?? [...defaultTypes];
273
+ const effectiveIncludeType = repoExcludeTypesOverride.length > 0
274
+ ? inheritedIncludeType.filter(type => !repoExcludeTypesOverride.includes(type))
275
+ : inheritedIncludeType;
276
+ repoSettings = {
277
+ include_path: repo.settings?.include_path ?? [...workspaceLegacyIncludePath],
278
+ exclude_path: repo.settings?.exclude_path ?? [],
279
+ extra_include_path: repo.settings?.extra_include_path ?? [],
280
+ include_type: effectiveIncludeType
281
+ };
282
+ }
283
+ else {
284
+ // New format: use repo's own settings
285
+ repoSettings = {
286
+ include_path: repo.settings?.include_path ?? ['f/**'],
287
+ exclude_path: repo.settings?.exclude_path ?? [],
288
+ extra_include_path: repo.settings?.extra_include_path ?? [],
289
+ include_type: repo.settings?.include_type ?? ['script', 'flow', 'app']
290
+ };
291
+ }
292
+ return {
293
+ ...repo,
294
+ git_repo_resource_path: repo.git_repo_resource_path.replace('$res:', ''),
295
+ settings: repoSettings,
296
+ exclude_types_override: repoExcludeTypesOverride,
297
+ // Mark legacy repos for UI handling
298
+ legacyImported: isRepoLegacy
299
+ };
300
+ }));
301
+ }
302
+ }
303
+ // Store initial state for change tracking
304
+ initialRepositories.splice(0, initialRepositories.length, ...repositories.map(repo => ({ ...repo })));
305
+ }
306
+ finally {
307
+ loading = false;
308
+ }
309
+ }
310
+ // Migration utility for legacy repositories
311
+ function migrateLegacyRepository(repo) {
312
+ if (!repo.legacyImported) {
313
+ return repo; // Already migrated or not legacy
314
+ }
315
+ // Create migrated repository - exclude_types_override should already be applied in settings.include_type
316
+ // from the loadSettings logic, so we just need to clear the override and mark as migrated
317
+ return {
318
+ ...repo,
319
+ exclude_types_override: [], // Clear the override since it's now integrated into include_type
320
+ legacyImported: false // Mark as migrated
321
+ };
322
+ }
323
+ async function saveRepository(idx, savedWithoutInit = false) {
324
+ const repo = repositories[idx];
325
+ if (!repo || !validateRepository(repo, idx)) {
326
+ throw new Error('Cannot save invalid repository');
327
+ }
328
+ // Migrate legacy repository if needed
329
+ const repoToSave = repo.legacyImported ? migrateLegacyRepository(repo) : repo;
330
+ // Use the new individual repository API instead of saving all repositories
331
+ await WorkspaceService.editGitSyncRepository({
332
+ workspace,
333
+ requestBody: {
334
+ git_repo_resource_path: `$res:${repoToSave.git_repo_resource_path}`,
335
+ repository: {
336
+ git_repo_resource_path: `$res:${repoToSave.git_repo_resource_path}`,
337
+ script_path: repoToSave.script_path,
338
+ use_individual_branch: repoToSave.use_individual_branch,
339
+ group_by_folder: repoToSave.group_by_folder,
340
+ settings: repoToSave.settings,
341
+ exclude_types_override: repoToSave.exclude_types_override
342
+ }
343
+ }
344
+ });
345
+ // Update local state with migrated repository
346
+ repositories[idx] = repoToSave;
347
+ initialRepositories[idx] = { ...repoToSave };
348
+ // Update local state
349
+ if (repoToSave.isUnsavedConnection) {
350
+ repoToSave.isUnsavedConnection = false;
351
+ repoToSave.detectionState = undefined;
352
+ repoToSave.extractedSettings = undefined;
353
+ // Show success modal for new connections
354
+ showSuccessModal(savedWithoutInit);
355
+ }
356
+ }
357
+ // Helper functions for original functionality
358
+ function revertRepository(idx) {
359
+ const initial = initialRepositories[idx];
360
+ if (initial) {
361
+ repositories[idx] = JSON.parse(JSON.stringify(initial));
362
+ }
363
+ }
364
+ // Reset detection state for a repository
365
+ function resetDetectionState(idx) {
366
+ const repo = repositories[idx];
367
+ if (!repo || !repo.isUnsavedConnection)
368
+ return;
369
+ _resetRepoDetectionState(repo);
370
+ }
371
+ // Helper function to reset detection state on a repository object
372
+ function _resetRepoDetectionState(repo) {
373
+ repo.detectionState = 'idle';
374
+ repo.extractedSettings = undefined;
375
+ repo.detectionError = undefined;
376
+ repo.detectionJobId = undefined;
377
+ repo.detectionJobStatus = undefined;
378
+ }
379
+ async function runTestJob(idx) {
380
+ const repo = repositories[idx];
381
+ if (!repo?.git_repo_resource_path || !repo?.script_path) {
382
+ return;
383
+ }
384
+ try {
385
+ const jobId = await JobService.runScriptByPath({
386
+ workspace,
387
+ path: hubPaths.gitSyncTest,
388
+ requestBody: {
389
+ repo_url_resource_path: repo.git_repo_resource_path
390
+ },
391
+ skipPreprocessor: true
392
+ });
393
+ gitSyncTestJobs[idx] = {
394
+ jobId: jobId,
395
+ status: 'running'
396
+ };
397
+ // Use JobManager for polling
398
+ await jobManager.runWithProgress(() => Promise.resolve(jobId), {
399
+ workspace,
400
+ timeout: 5000,
401
+ timeoutMessage: 'Git sync test job timed out after 5s',
402
+ onProgress: (status) => {
403
+ gitSyncTestJobs[idx].status = status.status === 'success' ? 'success' :
404
+ status.status === 'failure' ? 'failure' : 'running';
405
+ }
406
+ });
407
+ // If we get here, the job completed successfully
408
+ gitSyncTestJobs[idx].status = 'success';
409
+ }
410
+ catch (error) {
411
+ gitSyncTestJobs[idx].status = 'failure';
412
+ }
413
+ }
414
+ // Return context object
415
+ return {
416
+ // State (read-only access)
417
+ get repositories() { return repositories; },
418
+ get loading() { return loading; },
419
+ get activeModals() { return activeModals; },
420
+ get gitSyncTestJobs() { return gitSyncTestJobs; },
421
+ get initialRepositories() { return initialRepositories; },
422
+ get legacyWorkspaceIncludePath() { return legacyWorkspaceIncludePath; },
423
+ get legacyWorkspaceIncludeType() { return legacyWorkspaceIncludeType; },
424
+ // Computed states - use getter functions that compute on access
425
+ get validationStates() { return getValidationStates(); },
426
+ get hasAnyChanges() { return getHasAnyChanges(); },
427
+ get allRepositoriesValid() { return getAllRepositoriesValid(); },
428
+ get hasUnsavedConnections() { return getHasUnsavedConnections(); },
429
+ get hasWorkspaceLevelSettings() { return hasWorkspaceLevelSettings; },
430
+ // Methods
431
+ addRepository,
432
+ removeRepository,
433
+ getRepository,
434
+ getValidation,
435
+ revertRepository,
436
+ runTestJob,
437
+ resetDetectionState,
438
+ detectRepository,
439
+ migrateLegacyRepository,
440
+ showPushModal,
441
+ showPullModal,
442
+ closePushModal,
443
+ closePullModal,
444
+ showSuccessModal,
445
+ closeSuccessModal,
446
+ loadSettings,
447
+ saveRepository,
448
+ };
449
+ }
450
+ export function setGitSyncContext(workspace) {
451
+ const context = createGitSyncContext(workspace);
452
+ setContext(GIT_SYNC_CONTEXT_KEY, context);
453
+ return context;
454
+ }
455
+ export function getGitSyncContext() {
456
+ const context = getContext(GIT_SYNC_CONTEXT_KEY);
457
+ if (!context) {
458
+ throw new Error('Git sync context not found. Make sure to call setGitSyncContext first.');
459
+ }
460
+ return context;
461
+ }
@@ -0,0 +1,99 @@
1
+ <script lang="ts">import { getGitSyncContext } from './GitSyncContext.svelte';
2
+ import PushWorkspaceModal from './PushWorkspaceModal.svelte';
3
+ import PullWorkspaceModal from './PullWorkspaceModal.svelte';
4
+ import GitSyncSuccessModal from './GitSyncSuccessModal.svelte';
5
+ import { sendUserToast } from '../../toast';
6
+ const gitSyncContext = getGitSyncContext();
7
+ function handlePushSuccess() {
8
+ const pushModal = gitSyncContext.activeModals.push;
9
+ if (!pushModal)
10
+ return;
11
+ const { idx, repo } = pushModal;
12
+ // If this was a repository initialization, auto-save the connection
13
+ if (repo.isUnsavedConnection && repo.detectionState === 'no-wmill') {
14
+ gitSyncContext.saveRepository(idx).then(() => {
15
+ sendUserToast('Repository initialized and connection saved successfully');
16
+ }).catch((error) => {
17
+ sendUserToast('Repository initialized but failed to save connection: ' + error.message, true);
18
+ });
19
+ }
20
+ else {
21
+ sendUserToast('Successfully pushed to git repository');
22
+ }
23
+ gitSyncContext.closePushModal();
24
+ }
25
+ function handlePullSuccess() {
26
+ sendUserToast('Successfully pulled from git repository');
27
+ gitSyncContext.closePullModal();
28
+ }
29
+ function handleFilterUpdate(idx, filters) {
30
+ // Update the repository settings in the context
31
+ const repo = gitSyncContext.getRepository(idx);
32
+ if (repo) {
33
+ repo.settings = filters;
34
+ }
35
+ }
36
+ function handleSettingsSaved() {
37
+ // Update initial state to reflect that current state has been saved externally
38
+ gitSyncContext.initialRepositories.splice(0, gitSyncContext.initialRepositories.length, ...gitSyncContext.repositories.map(repo => ({ ...repo })));
39
+ sendUserToast('Settings applied successfully');
40
+ }
41
+ async function handleSaveWithoutInit(idx) {
42
+ try {
43
+ await gitSyncContext.saveRepository(idx, true);
44
+ sendUserToast('Connection saved successfully without initializing repository');
45
+ gitSyncContext.closePushModal();
46
+ }
47
+ catch (error) {
48
+ sendUserToast('Failed to save connection: ' + error.message, true);
49
+ }
50
+ }
51
+ </script>
52
+
53
+ <!-- Push Modal -->
54
+ {#if gitSyncContext.activeModals.push}
55
+ {@const { idx, repo } = gitSyncContext.activeModals.push}
56
+ {@const isNewConnection = repo.isUnsavedConnection && repo.detectionState === 'no-wmill'}
57
+ <PushWorkspaceModal
58
+ bind:open={gitSyncContext.activeModals.push.open}
59
+ gitRepoResourcePath={repo.git_repo_resource_path}
60
+ uiState={{
61
+ include_path: repo.settings.include_path,
62
+ exclude_path: repo.settings.exclude_path,
63
+ extra_include_path: repo.settings.extra_include_path,
64
+ include_type: repo.settings.include_type
65
+ }}
66
+ isNewConnection={isNewConnection}
67
+ onSuccess={handlePushSuccess}
68
+ onSaveWithoutInit={isNewConnection ? () => handleSaveWithoutInit(idx) : undefined}
69
+ />
70
+ {/if}
71
+
72
+ <!-- Pull Modal -->
73
+ {#if gitSyncContext.activeModals.pull}
74
+ {@const { idx, repo, settingsOnly } = gitSyncContext.activeModals.pull}
75
+ <PullWorkspaceModal
76
+ bind:open={gitSyncContext.activeModals.pull.open}
77
+ gitRepoResourcePath={repo.git_repo_resource_path}
78
+ repoIndex={idx}
79
+ currentGitSyncSettings={gitSyncContext}
80
+ uiState={{
81
+ include_path: repo.settings.include_path,
82
+ exclude_path: repo.settings.exclude_path,
83
+ extra_include_path: repo.settings.extra_include_path,
84
+ include_type: repo.settings.include_type
85
+ }}
86
+ onFilterUpdate={(filters) => handleFilterUpdate(idx, filters)}
87
+ onSettingsSaved={handleSettingsSaved}
88
+ onSuccess={handlePullSuccess}
89
+ {settingsOnly}
90
+ />
91
+ {/if}
92
+
93
+ <!-- Success Modal -->
94
+ {#if gitSyncContext.activeModals.success}
95
+ <GitSyncSuccessModal
96
+ bind:open={gitSyncContext.activeModals.success.open}
97
+ savedWithoutInit={gitSyncContext.activeModals.success.savedWithoutInit}
98
+ />
99
+ {/if}
@@ -0,0 +1,18 @@
1
+ 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> {
2
+ new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
3
+ $$bindings?: Bindings;
4
+ } & Exports;
5
+ (internal: unknown, props: {
6
+ $$events?: Events;
7
+ $$slots?: Slots;
8
+ }): Exports & {
9
+ $set?: any;
10
+ $on?: any;
11
+ };
12
+ z_$$bindings?: Bindings;
13
+ }
14
+ declare const GitSyncModalManager: $$__sveltets_2_IsomorphicComponent<Record<string, never>, {
15
+ [evt: string]: CustomEvent<any>;
16
+ }, {}, {}, string>;
17
+ type GitSyncModalManager = InstanceType<typeof GitSyncModalManager>;
18
+ export default GitSyncModalManager;