@fullstackhouse/open-mercato-data-sync-durable 0.1.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 (175) hide show
  1. package/README.md +86 -0
  2. package/dist/engine/durable-run.js +130 -0
  3. package/dist/engine/durable-run.js.map +7 -0
  4. package/dist/index.js +5 -0
  5. package/dist/index.js.map +7 -0
  6. package/dist/kinds/data-sync-run.js +57 -0
  7. package/dist/kinds/data-sync-run.js.map +7 -0
  8. package/dist/mirror-version.js +5 -0
  9. package/dist/mirror-version.js.map +7 -0
  10. package/dist/mirror.manifest.json +65 -0
  11. package/dist/modules/data_sync/acl.js +8 -0
  12. package/dist/modules/data_sync/acl.js.map +7 -0
  13. package/dist/modules/data_sync/api/mappings/[id]/route.js +17 -0
  14. package/dist/modules/data_sync/api/mappings/[id]/route.js.map +7 -0
  15. package/dist/modules/data_sync/api/mappings/route.js +15 -0
  16. package/dist/modules/data_sync/api/mappings/route.js.map +7 -0
  17. package/dist/modules/data_sync/api/options.js +13 -0
  18. package/dist/modules/data_sync/api/options.js.map +7 -0
  19. package/dist/modules/data_sync/api/run.js +59 -0
  20. package/dist/modules/data_sync/api/run.js.map +7 -0
  21. package/dist/modules/data_sync/api/runs/[id]/cancel.js +13 -0
  22. package/dist/modules/data_sync/api/runs/[id]/cancel.js.map +7 -0
  23. package/dist/modules/data_sync/api/runs/[id]/retry.js +13 -0
  24. package/dist/modules/data_sync/api/runs/[id]/retry.js.map +7 -0
  25. package/dist/modules/data_sync/api/runs/[id]/route.js +13 -0
  26. package/dist/modules/data_sync/api/runs/[id]/route.js.map +7 -0
  27. package/dist/modules/data_sync/api/runs.js +13 -0
  28. package/dist/modules/data_sync/api/runs.js.map +7 -0
  29. package/dist/modules/data_sync/api/schedules/[id]/route.js +17 -0
  30. package/dist/modules/data_sync/api/schedules/[id]/route.js.map +7 -0
  31. package/dist/modules/data_sync/api/schedules/route.js +15 -0
  32. package/dist/modules/data_sync/api/schedules/route.js.map +7 -0
  33. package/dist/modules/data_sync/api/schedules/serialize.js +6 -0
  34. package/dist/modules/data_sync/api/schedules/serialize.js.map +7 -0
  35. package/dist/modules/data_sync/api/validate.js +13 -0
  36. package/dist/modules/data_sync/api/validate.js.map +7 -0
  37. package/dist/modules/data_sync/backend/data-sync/page.js +7 -0
  38. package/dist/modules/data_sync/backend/data-sync/page.js.map +7 -0
  39. package/dist/modules/data_sync/backend/data-sync/page.meta.js +6 -0
  40. package/dist/modules/data_sync/backend/data-sync/page.meta.js.map +7 -0
  41. package/dist/modules/data_sync/backend/data-sync/runs/[id]/page.js +7 -0
  42. package/dist/modules/data_sync/backend/data-sync/runs/[id]/page.js.map +7 -0
  43. package/dist/modules/data_sync/backend/data-sync/runs/[id]/page.meta.js +6 -0
  44. package/dist/modules/data_sync/backend/data-sync/runs/[id]/page.meta.js.map +7 -0
  45. package/dist/modules/data_sync/components/IntegrationScheduleTab.js +9 -0
  46. package/dist/modules/data_sync/components/IntegrationScheduleTab.js.map +7 -0
  47. package/dist/modules/data_sync/components/RunParameterFields.js +13 -0
  48. package/dist/modules/data_sync/components/RunParameterFields.js.map +7 -0
  49. package/dist/modules/data_sync/data/entities.js +9 -0
  50. package/dist/modules/data_sync/data/entities.js.map +7 -0
  51. package/dist/modules/data_sync/data/validators.js +12 -0
  52. package/dist/modules/data_sync/data/validators.js.map +7 -0
  53. package/dist/modules/data_sync/di.js +33 -0
  54. package/dist/modules/data_sync/di.js.map +7 -0
  55. package/dist/modules/data_sync/events.js +9 -0
  56. package/dist/modules/data_sync/events.js.map +7 -0
  57. package/dist/modules/data_sync/extension-points.js +8 -0
  58. package/dist/modules/data_sync/extension-points.js.map +7 -0
  59. package/dist/modules/data_sync/i18n/de.json +135 -0
  60. package/dist/modules/data_sync/i18n/en.json +135 -0
  61. package/dist/modules/data_sync/i18n/es.json +135 -0
  62. package/dist/modules/data_sync/i18n/ko.json +135 -0
  63. package/dist/modules/data_sync/i18n/pl.json +135 -0
  64. package/dist/modules/data_sync/index.js +6 -0
  65. package/dist/modules/data_sync/index.js.map +7 -0
  66. package/dist/modules/data_sync/lib/abandoned-run.js +6 -0
  67. package/dist/modules/data_sync/lib/abandoned-run.js.map +7 -0
  68. package/dist/modules/data_sync/lib/adapter-registry.js +10 -0
  69. package/dist/modules/data_sync/lib/adapter-registry.js.map +7 -0
  70. package/dist/modules/data_sync/lib/adapter.js +2 -0
  71. package/dist/modules/data_sync/lib/adapter.js.map +7 -0
  72. package/dist/modules/data_sync/lib/adopt-on-delivery.js +35 -0
  73. package/dist/modules/data_sync/lib/adopt-on-delivery.js.map +7 -0
  74. package/dist/modules/data_sync/lib/batch-stream.js +6 -0
  75. package/dist/modules/data_sync/lib/batch-stream.js.map +7 -0
  76. package/dist/modules/data_sync/lib/id-mapping.js +6 -0
  77. package/dist/modules/data_sync/lib/id-mapping.js.map +7 -0
  78. package/dist/modules/data_sync/lib/queue-policy.js +11 -0
  79. package/dist/modules/data_sync/lib/queue-policy.js.map +7 -0
  80. package/dist/modules/data_sync/lib/queue.js +6 -0
  81. package/dist/modules/data_sync/lib/queue.js.map +7 -0
  82. package/dist/modules/data_sync/lib/run-parameters.js +8 -0
  83. package/dist/modules/data_sync/lib/run-parameters.js.map +7 -0
  84. package/dist/modules/data_sync/lib/start-cursor.js +8 -0
  85. package/dist/modules/data_sync/lib/start-cursor.js.map +7 -0
  86. package/dist/modules/data_sync/lib/start-run.js +51 -0
  87. package/dist/modules/data_sync/lib/start-run.js.map +7 -0
  88. package/dist/modules/data_sync/lib/sync-engine.js +6 -0
  89. package/dist/modules/data_sync/lib/sync-engine.js.map +7 -0
  90. package/dist/modules/data_sync/lib/sync-run-service.js +7 -0
  91. package/dist/modules/data_sync/lib/sync-run-service.js.map +7 -0
  92. package/dist/modules/data_sync/lib/sync-schedule-service.js +6 -0
  93. package/dist/modules/data_sync/lib/sync-schedule-service.js.map +7 -0
  94. package/dist/modules/data_sync/lib/syncRunStatus.js +9 -0
  95. package/dist/modules/data_sync/lib/syncRunStatus.js.map +7 -0
  96. package/dist/modules/data_sync/lib/version-guard.js +14 -0
  97. package/dist/modules/data_sync/lib/version-guard.js.map +7 -0
  98. package/dist/modules/data_sync/migrations/Migration20260304113737.js +6 -0
  99. package/dist/modules/data_sync/migrations/Migration20260304113737.js.map +7 -0
  100. package/dist/modules/data_sync/migrations/Migration20260810120000.js +6 -0
  101. package/dist/modules/data_sync/migrations/Migration20260810120000.js.map +7 -0
  102. package/dist/modules/data_sync/setup.js +8 -0
  103. package/dist/modules/data_sync/setup.js.map +7 -0
  104. package/dist/modules/data_sync/workers/sync-export.js +19 -0
  105. package/dist/modules/data_sync/workers/sync-export.js.map +7 -0
  106. package/dist/modules/data_sync/workers/sync-import.js +19 -0
  107. package/dist/modules/data_sync/workers/sync-import.js.map +7 -0
  108. package/dist/modules/data_sync/workers/sync-scheduled.js +8 -0
  109. package/dist/modules/data_sync/workers/sync-scheduled.js.map +7 -0
  110. package/generated/entities/sync_cursor/index.ts +8 -0
  111. package/generated/entities/sync_mapping/index.ts +8 -0
  112. package/generated/entities/sync_run/index.ts +22 -0
  113. package/generated/entities/sync_schedule/index.ts +16 -0
  114. package/generated/entities.ids.generated.ts +13 -0
  115. package/package.json +135 -0
  116. package/src/compat/mirror-shape.test.ts +106 -0
  117. package/src/compat/seams.test.ts +97 -0
  118. package/src/engine/durable-run.ts +231 -0
  119. package/src/index.ts +4 -0
  120. package/src/kinds/data-sync-run.ts +104 -0
  121. package/src/mirror-version.ts +3 -0
  122. package/src/mirror.manifest.json +65 -0
  123. package/src/modules/data_sync/__integration__/TC-DSD-001.spec.ts +80 -0
  124. package/src/modules/data_sync/acl.ts +5 -0
  125. package/src/modules/data_sync/api/mappings/[id]/route.ts +12 -0
  126. package/src/modules/data_sync/api/mappings/route.ts +11 -0
  127. package/src/modules/data_sync/api/options.ts +10 -0
  128. package/src/modules/data_sync/api/run.ts +103 -0
  129. package/src/modules/data_sync/api/runs/[id]/cancel.ts +10 -0
  130. package/src/modules/data_sync/api/runs/[id]/retry.ts +10 -0
  131. package/src/modules/data_sync/api/runs/[id]/route.ts +10 -0
  132. package/src/modules/data_sync/api/runs.ts +10 -0
  133. package/src/modules/data_sync/api/schedules/[id]/route.ts +12 -0
  134. package/src/modules/data_sync/api/schedules/route.ts +11 -0
  135. package/src/modules/data_sync/api/schedules/serialize.ts +4 -0
  136. package/src/modules/data_sync/api/validate.ts +10 -0
  137. package/src/modules/data_sync/backend/data-sync/page.meta.ts +4 -0
  138. package/src/modules/data_sync/backend/data-sync/page.tsx +5 -0
  139. package/src/modules/data_sync/backend/data-sync/runs/[id]/page.meta.ts +4 -0
  140. package/src/modules/data_sync/backend/data-sync/runs/[id]/page.tsx +5 -0
  141. package/src/modules/data_sync/components/IntegrationScheduleTab.tsx +6 -0
  142. package/src/modules/data_sync/components/RunParameterFields.tsx +5 -0
  143. package/src/modules/data_sync/data/entities.ts +4 -0
  144. package/src/modules/data_sync/data/validators.ts +4 -0
  145. package/src/modules/data_sync/di.ts +57 -0
  146. package/src/modules/data_sync/events.ts +5 -0
  147. package/src/modules/data_sync/extension-points.ts +5 -0
  148. package/src/modules/data_sync/i18n/de.json +135 -0
  149. package/src/modules/data_sync/i18n/en.json +135 -0
  150. package/src/modules/data_sync/i18n/es.json +135 -0
  151. package/src/modules/data_sync/i18n/ko.json +135 -0
  152. package/src/modules/data_sync/i18n/pl.json +135 -0
  153. package/src/modules/data_sync/index.ts +4 -0
  154. package/src/modules/data_sync/lib/adapter-registry.ts +4 -0
  155. package/src/modules/data_sync/lib/adapter.ts +3 -0
  156. package/src/modules/data_sync/lib/adopt-on-delivery.ts +69 -0
  157. package/src/modules/data_sync/lib/batch-stream.ts +4 -0
  158. package/src/modules/data_sync/lib/id-mapping.ts +4 -0
  159. package/src/modules/data_sync/lib/queue-policy.ts +4 -0
  160. package/src/modules/data_sync/lib/queue.ts +4 -0
  161. package/src/modules/data_sync/lib/run-parameters.ts +4 -0
  162. package/src/modules/data_sync/lib/start-cursor.ts +4 -0
  163. package/src/modules/data_sync/lib/start-run.ts +106 -0
  164. package/src/modules/data_sync/lib/sync-engine.ts +4 -0
  165. package/src/modules/data_sync/lib/sync-run-service.ts +4 -0
  166. package/src/modules/data_sync/lib/sync-schedule-service.ts +4 -0
  167. package/src/modules/data_sync/lib/syncRunStatus.ts +4 -0
  168. package/src/modules/data_sync/lib/version-guard.ts +27 -0
  169. package/src/modules/data_sync/migrations/.snapshot-open-mercato.json +1013 -0
  170. package/src/modules/data_sync/migrations/Migration20260304113737.ts +4 -0
  171. package/src/modules/data_sync/migrations/Migration20260810120000.ts +4 -0
  172. package/src/modules/data_sync/setup.ts +5 -0
  173. package/src/modules/data_sync/workers/sync-export.ts +20 -0
  174. package/src/modules/data_sync/workers/sync-import.ts +20 -0
  175. package/src/modules/data_sync/workers/sync-scheduled.ts +5 -0
@@ -0,0 +1,135 @@
1
+ {
2
+ "data_sync.dashboard.actions.view": "Zobacz",
3
+ "data_sync.dashboard.columns.created": "Utworzone",
4
+ "data_sync.dashboard.columns.createdAt": "Rozpoczęto",
5
+ "data_sync.dashboard.columns.direction": "Kierunek",
6
+ "data_sync.dashboard.columns.entityType": "Typ encji",
7
+ "data_sync.dashboard.columns.failed": "Nieudane",
8
+ "data_sync.dashboard.columns.integration": "Integracja",
9
+ "data_sync.dashboard.columns.status": "Status",
10
+ "data_sync.dashboard.columns.updated": "Zaktualizowane",
11
+ "data_sync.dashboard.direction.export": "Eksport",
12
+ "data_sync.dashboard.direction.import": "Import",
13
+ "data_sync.dashboard.filters.allDirections": "Wszystkie kierunki",
14
+ "data_sync.dashboard.filters.allStatuses": "Wszystkie statusy",
15
+ "data_sync.dashboard.filters.status": "Status",
16
+ "data_sync.dashboard.loadError": "Nie udało się załadować przebiegów",
17
+ "data_sync.dashboard.noRuns": "Brak przebiegów synchronizacji",
18
+ "data_sync.dashboard.schedule.cron": "Cron",
19
+ "data_sync.dashboard.schedule.cronHelp": "Przykład: `0 * * * *` uruchamia zadanie na początku każdej godziny.",
20
+ "data_sync.dashboard.schedule.cronValue": "Wyrażenie cron",
21
+ "data_sync.dashboard.schedule.delete": "Usuń harmonogram",
22
+ "data_sync.dashboard.schedule.deleteError": "Nie udało się usunąć harmonogramu cyklicznego",
23
+ "data_sync.dashboard.schedule.deleteSuccess": "Usunięto harmonogram cykliczny",
24
+ "data_sync.dashboard.schedule.deleting": "Usuwanie...",
25
+ "data_sync.dashboard.schedule.description": "Zapisz powtarzalny harmonogram dla wybranej integracji, encji i kierunku bez opuszczania tego pulpitu.",
26
+ "data_sync.dashboard.schedule.enabled": "Harmonogram włączony",
27
+ "data_sync.dashboard.schedule.enabledHelp": "Wstrzymaj zadanie cykliczne bez usuwania definicji harmonogramu.",
28
+ "data_sync.dashboard.schedule.error": "Nie udało się zapisać harmonogramu cyklicznego",
29
+ "data_sync.dashboard.schedule.fullSync": "Uruchamiaj zaplanowane zadania jako pełną synchronizację",
30
+ "data_sync.dashboard.schedule.fullSyncHelp": "Gdy opcja jest włączona, każdy cykliczny przebieg zaczyna się od początku zamiast od zapisanego kursora.",
31
+ "data_sync.dashboard.schedule.interval": "Interwał",
32
+ "data_sync.dashboard.schedule.intervalHelp": "Przykład: `1h`, `6h` lub `24h` dla powtarzalnych interwałów.",
33
+ "data_sync.dashboard.schedule.intervalValue": "Interwał",
34
+ "data_sync.dashboard.schedule.invalidValue": "Podaj wartość harmonogramu przed zapisaniem.",
35
+ "data_sync.dashboard.schedule.lastRun": "Ostatni zaplanowany przebieg: {value}",
36
+ "data_sync.dashboard.schedule.neverRun": "Zapisano, ale żadne zaplanowane wykonanie jeszcze się nie zakończyło.",
37
+ "data_sync.dashboard.schedule.none": "Dla tego celu nie zapisano jeszcze harmonogramu cyklicznego.",
38
+ "data_sync.dashboard.schedule.save": "Zapisz harmonogram cykliczny",
39
+ "data_sync.dashboard.schedule.saving": "Zapisywanie...",
40
+ "data_sync.dashboard.schedule.status.disabled": "Harmonogram cykliczny wstrzymany",
41
+ "data_sync.dashboard.schedule.status.enabled": "Harmonogram cykliczny aktywny",
42
+ "data_sync.dashboard.schedule.status.none": "Brak harmonogramu cyklicznego",
43
+ "data_sync.dashboard.schedule.status.shortDisabled": "Wstrzymany",
44
+ "data_sync.dashboard.schedule.status.shortEnabled": "Zaplanowany",
45
+ "data_sync.dashboard.schedule.status.shortNone": "Tylko jednorazowo",
46
+ "data_sync.dashboard.schedule.success": "Zapisano harmonogram cykliczny",
47
+ "data_sync.dashboard.schedule.timezone": "Strefa czasowa",
48
+ "data_sync.dashboard.schedule.title": "Harmonogram cykliczny",
49
+ "data_sync.dashboard.schedule.type": "Typ harmonogramu",
50
+ "data_sync.dashboard.searchPlaceholder": "Szukaj po integracji, typie encji, statusie lub ID przebiegu",
51
+ "data_sync.dashboard.start.batchSize": "Rozmiar partii",
52
+ "data_sync.dashboard.start.description": "Wybierz cel synchronizacji, uruchom przebieg doraźny albo zapisz harmonogram cykliczny dla tej samej encji i kierunku z poziomu tej strony.",
53
+ "data_sync.dashboard.start.error": "Nie udało się uruchomić przebiegu synchronizacji",
54
+ "data_sync.dashboard.start.eyebrow": "Uruchom raz lub ustaw cyklicznie",
55
+ "data_sync.dashboard.start.fullSync": "Uruchom jako pełną synchronizację",
56
+ "data_sync.dashboard.start.fullSyncHelp": "Zignoruj zapisany kursor i przetwórz w tym przebiegu całe źródło od nowa.",
57
+ "data_sync.dashboard.start.invalidBatchSize": "Rozmiar partii musi mieścić się w zakresie od 1 do 1000.",
58
+ "data_sync.dashboard.start.parameters": "Parametry uruchomienia",
59
+ "data_sync.dashboard.start.parametersHelp": "Opcjonalne wartości akceptowane przez tę integrację dla ręcznego uruchomienia.",
60
+ "data_sync.dashboard.start.providerManaged": "Ta integracja uruchamia synchronizacje z własnego przepływu konfiguracji. Otwórz ustawienia integracji, aby kontynuować.",
61
+ "data_sync.dashboard.start.runNowDescription": "Użyj tej opcji dla najbliższej natychmiastowej synchronizacji. Rozmiar partii i tryb pełnej synchronizacji dotyczą wyłącznie tego ręcznego przebiegu.",
62
+ "data_sync.dashboard.start.runNowFootnote": "Ręczne przebiegi od razu pokazują postęp, a po uruchomieniu przenoszą na stronę szczegółów przebiegu.",
63
+ "data_sync.dashboard.start.runNowTitle": "Uruchom teraz jednorazowo",
64
+ "data_sync.dashboard.start.status.credentialsMissing": "Brak poświadczeń",
65
+ "data_sync.dashboard.start.status.credentialsReady": "Poświadczenia gotowe",
66
+ "data_sync.dashboard.start.status.disabled": "Integracja wyłączona",
67
+ "data_sync.dashboard.start.status.enabled": "Integracja włączona",
68
+ "data_sync.dashboard.start.submit": "Uruchom synchronizację",
69
+ "data_sync.dashboard.start.success": "Uruchomiono przebieg synchronizacji",
70
+ "data_sync.dashboard.start.title": "Uruchom lub zaplanuj synchronizację",
71
+ "data_sync.dashboard.status.cancelled": "Anulowany",
72
+ "data_sync.dashboard.status.completed": "Zakończony",
73
+ "data_sync.dashboard.status.failed": "Nieudany",
74
+ "data_sync.dashboard.status.paused": "Wstrzymany",
75
+ "data_sync.dashboard.status.pending": "Oczekujący",
76
+ "data_sync.dashboard.status.running": "W toku",
77
+ "data_sync.dashboard.title": "Przebiegi synchronizacji",
78
+ "data_sync.integrationTab.columns.actions": "Akcje",
79
+ "data_sync.integrationTab.columns.lastRun": "Ostatni przebieg",
80
+ "data_sync.integrationTab.columns.value": "Wartość",
81
+ "data_sync.integrationTab.credentialsMissing": "Skonfiguruj poświadczenia przed uruchomieniem synchronizacji.",
82
+ "data_sync.integrationTab.credentialsMissingNotice": "Wciąż brakuje poświadczeń. Możesz najpierw zapisać harmonogramy, ale ręczne i zaplanowane przebiegi będą kończyć się błędem, dopóki poświadczenia nie zostaną skonfigurowane.",
83
+ "data_sync.integrationTab.description": "Uruchamiaj jednorazowe synchronizacje albo zapisuj harmonogramy cykliczne dla każdej obsługiwanej encji bezpośrednio ze strony szczegółów integracji.",
84
+ "data_sync.integrationTab.empty": "Ten dostawca nie udostępnia jeszcze żadnych encji, które można zaplanować do synchronizacji.",
85
+ "data_sync.integrationTab.fullSyncShort": "Pełna",
86
+ "data_sync.integrationTab.integrationDisabled": "Włącz integrację przed uruchomieniem synchronizacji.",
87
+ "data_sync.integrationTab.integrationDisabledNotice": "Integracja jest wyłączona. Możesz teraz zapisać harmonogramy, ale przebiegi pozostaną zablokowane do czasu włączenia integracji.",
88
+ "data_sync.integrationTab.loadError": "Nie udało się załadować harmonogramów synchronizacji.",
89
+ "data_sync.integrationTab.notAvailable": "Ta integracja nie jest zarejestrowana jako dostawca synchronizacji danych.",
90
+ "data_sync.integrationTab.parametersRequired": "Ten przebieg wymaga parametrów. Uruchom go z panelu Data Sync.",
91
+ "data_sync.integrationTab.providerManaged": "Uruchom tę integrację z jej przepływu konfiguracji dostawcy.",
92
+ "data_sync.integrationTab.providerManagedNotice": "Ten dostawca wymaga własnego przepływu konfiguracji, zanim będzie można uruchomić synchronizację. Użyj karty dostawcy na tej stronie zamiast ogólnych harmonogramów.",
93
+ "data_sync.integrationTab.refresh": "Odśwież",
94
+ "data_sync.integrationTab.runError": "Nie udało się uruchomić synchronizacji.",
95
+ "data_sync.integrationTab.runNowHelp": "Opcja Uruchom teraz korzysta z pola pełnej synchronizacji z tego samego wiersza i od razu rozpoczyna śledzenie postępu w Synchronizacji danych.",
96
+ "data_sync.integrationTab.runNowTitle": "Ręczne przebiegi",
97
+ "data_sync.integrationTab.runStarted": "Uruchomiono przebieg synchronizacji.",
98
+ "data_sync.integrationTab.start": "Uruchom teraz",
99
+ "data_sync.integrationTab.starting": "Uruchamianie...",
100
+ "data_sync.integrationTab.title": "Harmonogramy synchronizacji",
101
+ "data_sync.nav.title": "Synchronizacja danych",
102
+ "data_sync.runParameters.errors.max": "Pole {label} może wynosić najwyżej {max}.",
103
+ "data_sync.runParameters.errors.min": "Pole {label} musi wynosić co najmniej {min}.",
104
+ "data_sync.runParameters.errors.required": "Pole {label} jest wymagane.",
105
+ "data_sync.runParameters.errors.select": "Pole {label} musi mieć jedną z wartości: {options}.",
106
+ "data_sync.runParameters.errors.type": "Pole {label} musi mieć typ {type}.",
107
+ "data_sync.runs.detail.back": "Powrót do przebiegów",
108
+ "data_sync.runs.detail.cancel": "Anuluj",
109
+ "data_sync.runs.detail.cancelError": "Nie udało się anulować przebiegu",
110
+ "data_sync.runs.detail.cancelSuccess": "Przebieg anulowany",
111
+ "data_sync.runs.detail.counters.created": "Utworzone",
112
+ "data_sync.runs.detail.counters.failed": "Nieudane",
113
+ "data_sync.runs.detail.counters.skipped": "Pominięte",
114
+ "data_sync.runs.detail.counters.updated": "Zaktualizowane",
115
+ "data_sync.runs.detail.error": "Błąd",
116
+ "data_sync.runs.detail.loadError": "Nie udało się załadować przebiegu",
117
+ "data_sync.runs.detail.logs": "Logi operacji",
118
+ "data_sync.runs.detail.logs.level": "Poziom",
119
+ "data_sync.runs.detail.logs.message": "Wiadomość",
120
+ "data_sync.runs.detail.logs.time": "Czas",
121
+ "data_sync.runs.detail.noLogs": "Brak wpisów w logach",
122
+ "data_sync.runs.detail.notFound": "Nie znaleziono przebiegu synchronizacji.",
123
+ "data_sync.runs.detail.parameters": "Parametry uruchomienia",
124
+ "data_sync.runs.detail.progress": "Postęp",
125
+ "data_sync.runs.detail.progress.batches": "{count} partii",
126
+ "data_sync.runs.detail.progress.eta": "Pozostało {eta}",
127
+ "data_sync.runs.detail.progress.itemsProcessed": "{count} elementów przetworzonych",
128
+ "data_sync.runs.detail.progress.itemsProcessedTotal": "{processed} / {total} elementów przetworzonych",
129
+ "data_sync.runs.detail.progress.percent": "{percent}% ukończono",
130
+ "data_sync.runs.detail.retry": "Ponów",
131
+ "data_sync.runs.detail.retryError": "Nie udało się ponowić przebiegu",
132
+ "data_sync.runs.detail.retryParametersStale": "Zapisane parametry uruchomienia nie są już poprawne dla tej integracji. Uruchom nowe zadanie z pulpitu Data Sync.",
133
+ "data_sync.runs.detail.retrySuccess": "Przebieg ponowiony",
134
+ "data_sync.runs.detail.title": "Przebieg synchronizacji"
135
+ }
@@ -0,0 +1,4 @@
1
+ // GENERATED by scripts/gen-mirror.mjs from @open-mercato/core@0.7.0 (index.ts). Do not edit.
2
+ // This package mirrors core's data_sync module file-for-file; see docs/adr/0006-drop-in-data-sync.md.
3
+ export * from '@open-mercato/core/modules/data_sync/index'
4
+ export { metadata } from '@open-mercato/core/modules/data_sync/index'
@@ -0,0 +1,4 @@
1
+ // GENERATED by scripts/gen-mirror.mjs from @open-mercato/core@0.7.0 (lib/adapter-registry.ts). Do not edit.
2
+ // This package mirrors core's data_sync module file-for-file; see docs/adr/0006-drop-in-data-sync.md.
3
+ export * from '@open-mercato/core/modules/data_sync/lib/adapter-registry'
4
+ export { getAllDataSyncAdapters, getDataSyncAdapter, registerDataSyncAdapter, resolveAdapterForIntegration, resolveProviderKey } from '@open-mercato/core/modules/data_sync/lib/adapter-registry'
@@ -0,0 +1,3 @@
1
+ // GENERATED by scripts/gen-mirror.mjs from @open-mercato/core@0.7.0 (lib/adapter.ts). Do not edit.
2
+ // This package mirrors core's data_sync module file-for-file; see docs/adr/0006-drop-in-data-sync.md.
3
+ export * from '@open-mercato/core/modules/data_sync/lib/adapter'
@@ -0,0 +1,69 @@
1
+ // What happens when a run arrives on core's queue rather than through the durable start path.
2
+ //
3
+ // `sync_excel`, `sync_akeneo`'s first import, the scheduler, and anything else that imports
4
+ // core's `startDataSyncRun` directly still enqueue a plain queue message. Core's own worker is
5
+ // no longer registered — ours has its id — so without this those runs would simply never start.
6
+ //
7
+ // Rather than running them non-durably, the delivery is *adopted*: a durable job is created for
8
+ // the run it names and the queue message ends there. The run then gets the same lease, the same
9
+ // resumable slices and the same repair loop as one started durably. A caller that never heard
10
+ // of this package gets the guarantees anyway.
11
+
12
+ import type { JobContext, QueuedJob } from '@open-mercato/queue'
13
+ import type { DurableWorkService } from '@fullstackhouse/open-mercato-durable-work'
14
+ import { createLogger } from '@open-mercato/shared/lib/logger'
15
+
16
+ import { EXPORT_KIND, IMPORT_KIND, syncIdempotencyKey, syncLockKey } from '../../../kinds/data-sync-run'
17
+
18
+ const logger = createLogger('data_sync').child({ component: 'adopt-on-delivery' })
19
+
20
+ type SyncJobPayload = {
21
+ runId: string
22
+ batchSize: number
23
+ scope: { organizationId: string; tenantId: string; userId?: string | null }
24
+ }
25
+
26
+ type HandlerContext = JobContext & { resolve: <T = unknown>(name: string) => T }
27
+
28
+ type RunRow = {
29
+ id: string
30
+ integrationId: string
31
+ entityType: string
32
+ direction: string
33
+ status: string
34
+ }
35
+
36
+ export function adoptOnDelivery(direction: 'import' | 'export') {
37
+ return async function handle(job: QueuedJob<SyncJobPayload>, ctx: HandlerContext): Promise<void> {
38
+ const { runId, batchSize, scope } = job.payload
39
+ const durable = ctx.resolve<DurableWorkService>('durableWorkService')
40
+ const runService = ctx.resolve<{ getRun(id: string, scope: unknown): Promise<RunRow | null> }>('dataSyncRunService')
41
+
42
+ const run = await runService.getRun(runId, scope)
43
+ if (!run) {
44
+ logger.warn('Ignoring a delivery for a run that no longer exists', { runId })
45
+ return
46
+ }
47
+ if (run.status === 'completed' || run.status === 'failed' || run.status === 'cancelled') {
48
+ logger.warn('Ignoring a delivery for a run that already finished', { runId, status: run.status })
49
+ return
50
+ }
51
+
52
+ // Idempotent by the run id, so a redelivery of the same queue message adopts once. The
53
+ // lock key is the same one the durable start path uses, so a run that is already being
54
+ // driven refuses this rather than being driven twice.
55
+ await durable.startAndEnqueue(
56
+ {
57
+ kind: direction === 'import' ? IMPORT_KIND : EXPORT_KIND,
58
+ input: { runId, batchSize: batchSize ?? 100, direction },
59
+ lockKey: syncLockKey(run.integrationId, run.entityType, run.direction),
60
+ idempotencyKey: syncIdempotencyKey(runId),
61
+ subject: { type: 'data_sync.run', id: runId },
62
+ createdBy: scope.userId ?? null,
63
+ },
64
+ { tenantId: scope.tenantId, organizationId: scope.organizationId },
65
+ )
66
+
67
+ logger.info('Adopted a core-path sync run as durable work', { runId, direction })
68
+ }
69
+ }
@@ -0,0 +1,4 @@
1
+ // GENERATED by scripts/gen-mirror.mjs from @open-mercato/core@0.7.0 (lib/batch-stream.ts). Do not edit.
2
+ // This package mirrors core's data_sync module file-for-file; see docs/adr/0006-drop-in-data-sync.md.
3
+ export * from '@open-mercato/core/modules/data_sync/lib/batch-stream'
4
+ export { forEachBatch } from '@open-mercato/core/modules/data_sync/lib/batch-stream'
@@ -0,0 +1,4 @@
1
+ // GENERATED by scripts/gen-mirror.mjs from @open-mercato/core@0.7.0 (lib/id-mapping.ts). Do not edit.
2
+ // This package mirrors core's data_sync module file-for-file; see docs/adr/0006-drop-in-data-sync.md.
3
+ export * from '@open-mercato/core/modules/data_sync/lib/id-mapping'
4
+ export { createExternalIdMappingService } from '@open-mercato/core/modules/data_sync/lib/id-mapping'
@@ -0,0 +1,4 @@
1
+ // GENERATED by scripts/gen-mirror.mjs from @open-mercato/core@0.7.0 (lib/queue-policy.ts). Do not edit.
2
+ // This package mirrors core's data_sync module file-for-file; see docs/adr/0006-drop-in-data-sync.md.
3
+ export * from '@open-mercato/core/modules/data_sync/lib/queue-policy'
4
+ export { DATA_SYNC_EXPORT_QUEUE, DATA_SYNC_IMPORT_QUEUE, DATA_SYNC_LOCK_DURATION_MS, DATA_SYNC_MAX_STALLED_COUNT, DATA_SYNC_QUEUE_ATTEMPTS, DATA_SYNC_RESUMABLE_QUEUES } from '@open-mercato/core/modules/data_sync/lib/queue-policy'
@@ -0,0 +1,4 @@
1
+ // GENERATED by scripts/gen-mirror.mjs from @open-mercato/core@0.7.0 (lib/queue.ts). Do not edit.
2
+ // This package mirrors core's data_sync module file-for-file; see docs/adr/0006-drop-in-data-sync.md.
3
+ export * from '@open-mercato/core/modules/data_sync/lib/queue'
4
+ export { getSyncQueue } from '@open-mercato/core/modules/data_sync/lib/queue'
@@ -0,0 +1,4 @@
1
+ // GENERATED by scripts/gen-mirror.mjs from @open-mercato/core@0.7.0 (lib/run-parameters.ts). Do not edit.
2
+ // This package mirrors core's data_sync module file-for-file; see docs/adr/0006-drop-in-data-sync.md.
3
+ export * from '@open-mercato/core/modules/data_sync/lib/run-parameters'
4
+ export { getApplicableRunParameters, isReservedRunParameterKey, normalizeRunParameters } from '@open-mercato/core/modules/data_sync/lib/run-parameters'
@@ -0,0 +1,4 @@
1
+ // GENERATED by scripts/gen-mirror.mjs from @open-mercato/core@0.7.0 (lib/start-cursor.ts). Do not edit.
2
+ // This package mirrors core's data_sync module file-for-file; see docs/adr/0006-drop-in-data-sync.md.
3
+ export * from '@open-mercato/core/modules/data_sync/lib/start-cursor'
4
+ export { persistsSharedCursor, resolveAdapterForIntegration, resolveStartCursor } from '@open-mercato/core/modules/data_sync/lib/start-cursor'
@@ -0,0 +1,106 @@
1
+ // The durable start path.
2
+ //
3
+ // Same signature and same return shape as core's `startDataSyncRun`, so every caller — the run
4
+ // route, `sync_excel`, `sync_akeneo`'s first import — keeps working untouched. What changes is
5
+ // what gets created: a durable job instead of a queue message, in the same transaction as the
6
+ // run row where the transport allows it.
7
+
8
+ import type { DurableWorkService } from '@fullstackhouse/open-mercato-durable-work'
9
+
10
+ import { IMPORT_KIND, EXPORT_KIND, syncIdempotencyKey, syncLockKey } from '../../../kinds/data-sync-run'
11
+
12
+ export type {
13
+ DataSyncStartScope,
14
+ StartDataSyncRunInput,
15
+ } from '@open-mercato/core/modules/data_sync/lib/start-run'
16
+
17
+ type StartScope = { organizationId: string; tenantId: string; userId?: string | null }
18
+
19
+ type StartInput = {
20
+ integrationId: string
21
+ entityType: string
22
+ direction: 'import' | 'export'
23
+ cursor?: string | null
24
+ triggeredBy?: string | null
25
+ batchSize?: number
26
+ parameters?: Record<string, unknown> | null
27
+ createProgressJob?: boolean
28
+ progressJob?: {
29
+ jobType?: string
30
+ name?: string
31
+ description?: string
32
+ cancellable?: boolean
33
+ meta?: Record<string, unknown>
34
+ }
35
+ }
36
+
37
+ type ProgressServiceLike = {
38
+ createJob(input: Record<string, unknown>, ctx: Record<string, unknown>): Promise<{ id: string }>
39
+ }
40
+
41
+ type SyncRunServiceLike = {
42
+ createRun(input: Record<string, unknown>, scope: Record<string, unknown>): Promise<{ id: string }>
43
+ }
44
+
45
+ export async function startDataSyncRun(params: {
46
+ syncRunService: SyncRunServiceLike
47
+ progressService: ProgressServiceLike
48
+ durableWorkService: DurableWorkService
49
+ scope: StartScope
50
+ input: StartInput
51
+ }) {
52
+ const { syncRunService, progressService, durableWorkService, scope, input } = params
53
+
54
+ // Always created, never optional as it is in core.
55
+ //
56
+ // Core consults the progress row's cancellation flag once per batch, and that check is what
57
+ // gives a slice its hand-back point. A run without a progress job has no batch boundary to
58
+ // stop at, so it could only be interrupted between whole runs — which for a multi-day
59
+ // backfill is the same as not being interruptible. See docs/adr/0004.
60
+ const progressJob = await progressService.createJob(
61
+ {
62
+ jobType: input.progressJob?.jobType ?? `data_sync:${input.direction}`,
63
+ name: input.progressJob?.name ?? `Data sync ${input.integrationId} — ${input.entityType}`,
64
+ description: input.progressJob?.description ?? `${input.entityType} ${input.direction}`,
65
+ cancellable: true,
66
+ meta: {
67
+ integrationId: input.integrationId,
68
+ entityType: input.entityType,
69
+ direction: input.direction,
70
+ ...(input.progressJob?.meta ?? {}),
71
+ },
72
+ },
73
+ { tenantId: scope.tenantId, organizationId: scope.organizationId, userId: scope.userId },
74
+ )
75
+
76
+ const run = await syncRunService.createRun(
77
+ {
78
+ integrationId: input.integrationId,
79
+ entityType: input.entityType,
80
+ direction: input.direction,
81
+ cursor: input.cursor ?? null,
82
+ triggeredBy: input.triggeredBy ?? scope.userId ?? null,
83
+ parameters: input.parameters ?? null,
84
+ progressJobId: progressJob.id,
85
+ },
86
+ { organizationId: scope.organizationId, tenantId: scope.tenantId },
87
+ )
88
+
89
+ await durableWorkService.startAndEnqueue(
90
+ {
91
+ kind: input.direction === 'import' ? IMPORT_KIND : EXPORT_KIND,
92
+ input: { runId: run.id, batchSize: input.batchSize ?? 100, direction: input.direction },
93
+ // One live run per integration, entity and direction. Two imports of the same entity
94
+ // would interleave over a single cursor and silently lose rows.
95
+ lockKey: syncLockKey(input.integrationId, input.entityType, input.direction),
96
+ // Makes a retried start return the job that already exists instead of a second one.
97
+ idempotencyKey: syncIdempotencyKey(run.id),
98
+ subject: { type: 'data_sync.run', id: run.id },
99
+ progressJobId: progressJob.id,
100
+ createdBy: scope.userId ?? null,
101
+ },
102
+ { tenantId: scope.tenantId, organizationId: scope.organizationId },
103
+ )
104
+
105
+ return { run, progressJob }
106
+ }
@@ -0,0 +1,4 @@
1
+ // GENERATED by scripts/gen-mirror.mjs from @open-mercato/core@0.7.0 (lib/sync-engine.ts). Do not edit.
2
+ // This package mirrors core's data_sync module file-for-file; see docs/adr/0006-drop-in-data-sync.md.
3
+ export * from '@open-mercato/core/modules/data_sync/lib/sync-engine'
4
+ export { createSyncEngine } from '@open-mercato/core/modules/data_sync/lib/sync-engine'
@@ -0,0 +1,4 @@
1
+ // GENERATED by scripts/gen-mirror.mjs from @open-mercato/core@0.7.0 (lib/sync-run-service.ts). Do not edit.
2
+ // This package mirrors core's data_sync module file-for-file; see docs/adr/0006-drop-in-data-sync.md.
3
+ export * from '@open-mercato/core/modules/data_sync/lib/sync-run-service'
4
+ export { SyncRunOwnershipConflictError, createSyncRunService } from '@open-mercato/core/modules/data_sync/lib/sync-run-service'
@@ -0,0 +1,4 @@
1
+ // GENERATED by scripts/gen-mirror.mjs from @open-mercato/core@0.7.0 (lib/sync-schedule-service.ts). Do not edit.
2
+ // This package mirrors core's data_sync module file-for-file; see docs/adr/0006-drop-in-data-sync.md.
3
+ export * from '@open-mercato/core/modules/data_sync/lib/sync-schedule-service'
4
+ export { createSyncScheduleService } from '@open-mercato/core/modules/data_sync/lib/sync-schedule-service'
@@ -0,0 +1,4 @@
1
+ // GENERATED by scripts/gen-mirror.mjs from @open-mercato/core@0.7.0 (lib/syncRunStatus.ts). Do not edit.
2
+ // This package mirrors core's data_sync module file-for-file; see docs/adr/0006-drop-in-data-sync.md.
3
+ export * from '@open-mercato/core/modules/data_sync/lib/syncRunStatus'
4
+ export { getSyncRunStatusVariant, getSyncSummaryVariant, syncRunStatusVariants, syncSummaryVariants } from '@open-mercato/core/modules/data_sync/lib/syncRunStatus'
@@ -0,0 +1,27 @@
1
+ // What happens if core's engine stops behaving the way the adopter decorates it.
2
+ //
3
+ // An earlier version of this compared version strings by walking up from `require.resolve` to
4
+ // find core's manifest. That was wrong twice over: bundlers cannot statically resolve a
5
+ // computed `require`, so it broke the app build outright — and a version string is not the
6
+ // thing worth checking. The install-time guard is the peer range (`>=0.7.0 <0.8.0`), which the
7
+ // package manager enforces; the build-time guard is `gen:mirror --check` and the seam probe in
8
+ // `src/compat`, which read core's actual source.
9
+ //
10
+ // What is left for runtime is the case none of those catch: core still installs, still builds,
11
+ // still passes the probes, but a decorated method has stopped doing what the adopter relies on.
12
+ // The signature of that is specific enough to detect, and detecting it matters, because the
13
+ // failure it produces is silent — a run that reports success while its domain row says
14
+ // something else.
15
+
16
+ /** Thrown when core finalized a run itself instead of letting the adopter record it. */
17
+ export class SeamBrokenError extends Error {
18
+ readonly durableErrorClass = 'terminal' as const
19
+ constructor(readonly runId: string, detail: string) {
20
+ super(
21
+ `@fullstackhouse/open-mercato-data-sync-durable could not take over run ${runId}: ${detail}. ` +
22
+ `This package decorates @open-mercato/core's data_sync engine and one of the contracts it relies on has changed. ` +
23
+ `Install the package line matching the installed core minor, or report the change — see docs/adr/0004.`,
24
+ )
25
+ this.name = 'SeamBrokenError'
26
+ }
27
+ }