@open-mercato/core 0.6.8-develop.6998.1.d2bc46c56c → 0.6.8-develop.7000.1.0ae682bad1

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 (636) hide show
  1. package/.turbo/turbo-build.log +2 -2
  2. package/dist/generated/entities/warranty_claim/index.js +105 -0
  3. package/dist/generated/entities/warranty_claim/index.js.map +7 -0
  4. package/dist/generated/entities/warranty_claim_event/index.js +25 -0
  5. package/dist/generated/entities/warranty_claim_event/index.js.map +7 -0
  6. package/dist/generated/entities/warranty_claim_line/index.js +77 -0
  7. package/dist/generated/entities/warranty_claim_line/index.js.map +7 -0
  8. package/dist/generated/entities/warranty_claim_registration/index.js +43 -0
  9. package/dist/generated/entities/warranty_claim_registration/index.js.map +7 -0
  10. package/dist/generated/entities/warranty_claim_sequence/index.js +17 -0
  11. package/dist/generated/entities/warranty_claim_sequence/index.js.map +7 -0
  12. package/dist/generated/entities/warranty_claim_settings/index.js +43 -0
  13. package/dist/generated/entities/warranty_claim_settings/index.js.map +7 -0
  14. package/dist/generated/entities/warranty_claim_sla_signal/index.js +25 -0
  15. package/dist/generated/entities/warranty_claim_sla_signal/index.js.map +7 -0
  16. package/dist/generated/entities/warranty_troubleshooting_guide/index.js +25 -0
  17. package/dist/generated/entities/warranty_troubleshooting_guide/index.js.map +7 -0
  18. package/dist/generated/entities/warranty_vendor_policy/index.js +31 -0
  19. package/dist/generated/entities/warranty_vendor_policy/index.js.map +7 -0
  20. package/dist/generated/entities.ids.generated.js +12 -0
  21. package/dist/generated/entities.ids.generated.js.map +2 -2
  22. package/dist/generated/entity-fields-registry.js +200 -0
  23. package/dist/generated/entity-fields-registry.js.map +2 -2
  24. package/dist/helpers/integration/api.js +3 -2
  25. package/dist/helpers/integration/api.js.map +2 -2
  26. package/dist/helpers/integration/salesFixtures.js +13 -6
  27. package/dist/helpers/integration/salesFixtures.js.map +2 -2
  28. package/dist/modules/attachments/di.js +18 -0
  29. package/dist/modules/attachments/di.js.map +2 -2
  30. package/dist/modules/attachments/fields/attachment.js +186 -26
  31. package/dist/modules/attachments/fields/attachment.js.map +2 -2
  32. package/dist/modules/attachments/lib/scoped-upload-service.js +202 -0
  33. package/dist/modules/attachments/lib/scoped-upload-service.js.map +7 -0
  34. package/dist/modules/attachments/lib/target-access-service.js +39 -0
  35. package/dist/modules/attachments/lib/target-access-service.js.map +7 -0
  36. package/dist/modules/customers/api/companies/route.js +1 -0
  37. package/dist/modules/customers/api/companies/route.js.map +2 -2
  38. package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js +2 -2
  39. package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js.map +2 -2
  40. package/dist/modules/customers/backend/customers/people-v2/[id]/page.js +2 -2
  41. package/dist/modules/customers/backend/customers/people-v2/[id]/page.js.map +2 -2
  42. package/dist/modules/customers/components/detail/assignableStaff.js +6 -69
  43. package/dist/modules/customers/components/detail/assignableStaff.js.map +2 -2
  44. package/dist/modules/customers/lib/assignableStaff.js +76 -0
  45. package/dist/modules/customers/lib/assignableStaff.js.map +7 -0
  46. package/dist/modules/data_sync/lib/batch-stream.js +56 -0
  47. package/dist/modules/data_sync/lib/batch-stream.js.map +7 -0
  48. package/dist/modules/data_sync/lib/sync-engine.js +165 -103
  49. package/dist/modules/data_sync/lib/sync-engine.js.map +2 -2
  50. package/dist/modules/inbox_ops/api/emails/[id]/reprocess/route.js +4 -0
  51. package/dist/modules/inbox_ops/api/emails/[id]/reprocess/route.js.map +2 -2
  52. package/dist/modules/inbox_ops/api/extract/route.js +4 -0
  53. package/dist/modules/inbox_ops/api/extract/route.js.map +2 -2
  54. package/dist/modules/inbox_ops/api/webhook/inbound.js +4 -0
  55. package/dist/modules/inbox_ops/api/webhook/inbound.js.map +2 -2
  56. package/dist/modules/sales/commands/documents.js +8 -8
  57. package/dist/modules/sales/commands/documents.js.map +2 -2
  58. package/dist/modules/warranty_claims/acl.js +75 -0
  59. package/dist/modules/warranty_claims/acl.js.map +7 -0
  60. package/dist/modules/warranty_claims/ai-agents.js +161 -0
  61. package/dist/modules/warranty_claims/ai-agents.js.map +7 -0
  62. package/dist/modules/warranty_claims/ai-tools.js +591 -0
  63. package/dist/modules/warranty_claims/ai-tools.js.map +7 -0
  64. package/dist/modules/warranty_claims/api/ai/assess/route.js +304 -0
  65. package/dist/modules/warranty_claims/api/ai/assess/route.js.map +7 -0
  66. package/dist/modules/warranty_claims/api/ai/draft-reply/route.js +127 -0
  67. package/dist/modules/warranty_claims/api/ai/draft-reply/route.js.map +7 -0
  68. package/dist/modules/warranty_claims/api/ai/suggest/route.js +177 -0
  69. package/dist/modules/warranty_claims/api/ai/suggest/route.js.map +7 -0
  70. package/dist/modules/warranty_claims/api/assign/route.js +124 -0
  71. package/dist/modules/warranty_claims/api/assign/route.js.map +7 -0
  72. package/dist/modules/warranty_claims/api/assignees/route.js +97 -0
  73. package/dist/modules/warranty_claims/api/assignees/route.js.map +7 -0
  74. package/dist/modules/warranty_claims/api/credit-memo/route.js +152 -0
  75. package/dist/modules/warranty_claims/api/credit-memo/route.js.map +7 -0
  76. package/dist/modules/warranty_claims/api/entitlement/route.js +145 -0
  77. package/dist/modules/warranty_claims/api/entitlement/route.js.map +7 -0
  78. package/dist/modules/warranty_claims/api/events/route.js +199 -0
  79. package/dist/modules/warranty_claims/api/events/route.js.map +7 -0
  80. package/dist/modules/warranty_claims/api/external/claims/route.js +446 -0
  81. package/dist/modules/warranty_claims/api/external/claims/route.js.map +7 -0
  82. package/dist/modules/warranty_claims/api/lines/route.js +258 -0
  83. package/dist/modules/warranty_claims/api/lines/route.js.map +7 -0
  84. package/dist/modules/warranty_claims/api/openapi.js +27 -0
  85. package/dist/modules/warranty_claims/api/openapi.js.map +7 -0
  86. package/dist/modules/warranty_claims/api/portal/attachments/route.js +490 -0
  87. package/dist/modules/warranty_claims/api/portal/attachments/route.js.map +7 -0
  88. package/dist/modules/warranty_claims/api/portal/claims/[id]/route.js +178 -0
  89. package/dist/modules/warranty_claims/api/portal/claims/[id]/route.js.map +7 -0
  90. package/dist/modules/warranty_claims/api/portal/claims/[id]/shared.js +101 -0
  91. package/dist/modules/warranty_claims/api/portal/claims/[id]/shared.js.map +7 -0
  92. package/dist/modules/warranty_claims/api/portal/claims/[id]/submit/route.js +78 -0
  93. package/dist/modules/warranty_claims/api/portal/claims/[id]/submit/route.js.map +7 -0
  94. package/dist/modules/warranty_claims/api/portal/claims/[id]/withdraw/route.js +81 -0
  95. package/dist/modules/warranty_claims/api/portal/claims/[id]/withdraw/route.js.map +7 -0
  96. package/dist/modules/warranty_claims/api/portal/claims/route.js +462 -0
  97. package/dist/modules/warranty_claims/api/portal/claims/route.js.map +7 -0
  98. package/dist/modules/warranty_claims/api/portal/events/route.js +228 -0
  99. package/dist/modules/warranty_claims/api/portal/events/route.js.map +7 -0
  100. package/dist/modules/warranty_claims/api/portal/options/route.js +91 -0
  101. package/dist/modules/warranty_claims/api/portal/options/route.js.map +7 -0
  102. package/dist/modules/warranty_claims/api/portal/orders/lines/route.js +172 -0
  103. package/dist/modules/warranty_claims/api/portal/orders/lines/route.js.map +7 -0
  104. package/dist/modules/warranty_claims/api/portal/orders/route.js +151 -0
  105. package/dist/modules/warranty_claims/api/portal/orders/route.js.map +7 -0
  106. package/dist/modules/warranty_claims/api/portal/troubleshooting/route.js +121 -0
  107. package/dist/modules/warranty_claims/api/portal/troubleshooting/route.js.map +7 -0
  108. package/dist/modules/warranty_claims/api/receiving/route.js +176 -0
  109. package/dist/modules/warranty_claims/api/receiving/route.js.map +7 -0
  110. package/dist/modules/warranty_claims/api/registrations/route.js +382 -0
  111. package/dist/modules/warranty_claims/api/registrations/route.js.map +7 -0
  112. package/dist/modules/warranty_claims/api/replacement-order/route.js +150 -0
  113. package/dist/modules/warranty_claims/api/replacement-order/route.js.map +7 -0
  114. package/dist/modules/warranty_claims/api/return-label/route.js +235 -0
  115. package/dist/modules/warranty_claims/api/return-label/route.js.map +7 -0
  116. package/dist/modules/warranty_claims/api/risk/route.js +101 -0
  117. package/dist/modules/warranty_claims/api/risk/route.js.map +7 -0
  118. package/dist/modules/warranty_claims/api/route.js +482 -0
  119. package/dist/modules/warranty_claims/api/route.js.map +7 -0
  120. package/dist/modules/warranty_claims/api/sales-return/route.js +151 -0
  121. package/dist/modules/warranty_claims/api/sales-return/route.js.map +7 -0
  122. package/dist/modules/warranty_claims/api/settings-general/route.js +195 -0
  123. package/dist/modules/warranty_claims/api/settings-general/route.js.map +7 -0
  124. package/dist/modules/warranty_claims/api/stats/route.js +199 -0
  125. package/dist/modules/warranty_claims/api/stats/route.js.map +7 -0
  126. package/dist/modules/warranty_claims/api/submit/route.js +120 -0
  127. package/dist/modules/warranty_claims/api/submit/route.js.map +7 -0
  128. package/dist/modules/warranty_claims/api/transition/route.js +126 -0
  129. package/dist/modules/warranty_claims/api/transition/route.js.map +7 -0
  130. package/dist/modules/warranty_claims/api/troubleshooting-guides/route.js +261 -0
  131. package/dist/modules/warranty_claims/api/troubleshooting-guides/route.js.map +7 -0
  132. package/dist/modules/warranty_claims/api/vendor-policies/route.js +311 -0
  133. package/dist/modules/warranty_claims/api/vendor-policies/route.js.map +7 -0
  134. package/dist/modules/warranty_claims/api/vendor-recovery/route.js +130 -0
  135. package/dist/modules/warranty_claims/api/vendor-recovery/route.js.map +7 -0
  136. package/dist/modules/warranty_claims/api/vendor-recovery-suggestions/route.js +153 -0
  137. package/dist/modules/warranty_claims/api/vendor-recovery-suggestions/route.js.map +7 -0
  138. package/dist/modules/warranty_claims/backend/components/AiAssessButtons.js +268 -0
  139. package/dist/modules/warranty_claims/backend/components/AiAssessButtons.js.map +7 -0
  140. package/dist/modules/warranty_claims/backend/components/ClaimStageProgress.js +54 -0
  141. package/dist/modules/warranty_claims/backend/components/ClaimStageProgress.js.map +7 -0
  142. package/dist/modules/warranty_claims/backend/components/ClaimStatusBadge.js +87 -0
  143. package/dist/modules/warranty_claims/backend/components/ClaimStatusBadge.js.map +7 -0
  144. package/dist/modules/warranty_claims/backend/components/ClaimsKpiStrip.js +120 -0
  145. package/dist/modules/warranty_claims/backend/components/ClaimsKpiStrip.js.map +7 -0
  146. package/dist/modules/warranty_claims/backend/components/EntitlementLookupBadge.js +135 -0
  147. package/dist/modules/warranty_claims/backend/components/EntitlementLookupBadge.js.map +7 -0
  148. package/dist/modules/warranty_claims/backend/components/ReceivingPanel.js +218 -0
  149. package/dist/modules/warranty_claims/backend/components/ReceivingPanel.js.map +7 -0
  150. package/dist/modules/warranty_claims/backend/components/ReturnLabelPanel.js +231 -0
  151. package/dist/modules/warranty_claims/backend/components/ReturnLabelPanel.js.map +7 -0
  152. package/dist/modules/warranty_claims/backend/components/TroubleshootingWalker.js +82 -0
  153. package/dist/modules/warranty_claims/backend/components/TroubleshootingWalker.js.map +7 -0
  154. package/dist/modules/warranty_claims/backend/components/VendorRecoverySuggestionsPanel.js +136 -0
  155. package/dist/modules/warranty_claims/backend/components/VendorRecoverySuggestionsPanel.js.map +7 -0
  156. package/dist/modules/warranty_claims/backend/components/WarrantyWorkspace.js +41 -0
  157. package/dist/modules/warranty_claims/backend/components/WarrantyWorkspace.js.map +7 -0
  158. package/dist/modules/warranty_claims/backend/components/claimReasonOptions.js +45 -0
  159. package/dist/modules/warranty_claims/backend/components/claimReasonOptions.js.map +7 -0
  160. package/dist/modules/warranty_claims/backend/components/claimSla.js +92 -0
  161. package/dist/modules/warranty_claims/backend/components/claimSla.js.map +7 -0
  162. package/dist/modules/warranty_claims/backend/components/orderLookup.js +81 -0
  163. package/dist/modules/warranty_claims/backend/components/orderLookup.js.map +7 -0
  164. package/dist/modules/warranty_claims/backend/components/productLookup.js +317 -0
  165. package/dist/modules/warranty_claims/backend/components/productLookup.js.map +7 -0
  166. package/dist/modules/warranty_claims/backend/components/useUserDisplayNames.js +61 -0
  167. package/dist/modules/warranty_claims/backend/components/useUserDisplayNames.js.map +7 -0
  168. package/dist/modules/warranty_claims/backend/page.js +1088 -0
  169. package/dist/modules/warranty_claims/backend/page.js.map +7 -0
  170. package/dist/modules/warranty_claims/backend/page.meta.js +16 -0
  171. package/dist/modules/warranty_claims/backend/page.meta.js.map +7 -0
  172. package/dist/modules/warranty_claims/backend/warranty_claims/[id]/edit/page.js +427 -0
  173. package/dist/modules/warranty_claims/backend/warranty_claims/[id]/edit/page.js.map +7 -0
  174. package/dist/modules/warranty_claims/backend/warranty_claims/[id]/edit/page.meta.js +16 -0
  175. package/dist/modules/warranty_claims/backend/warranty_claims/[id]/edit/page.meta.js.map +7 -0
  176. package/dist/modules/warranty_claims/backend/warranty_claims/[id]/page.js +2101 -0
  177. package/dist/modules/warranty_claims/backend/warranty_claims/[id]/page.js.map +7 -0
  178. package/dist/modules/warranty_claims/backend/warranty_claims/[id]/page.meta.js +16 -0
  179. package/dist/modules/warranty_claims/backend/warranty_claims/[id]/page.meta.js.map +7 -0
  180. package/dist/modules/warranty_claims/backend/warranty_claims/create/page.js +1249 -0
  181. package/dist/modules/warranty_claims/backend/warranty_claims/create/page.js.map +7 -0
  182. package/dist/modules/warranty_claims/backend/warranty_claims/create/page.meta.js +16 -0
  183. package/dist/modules/warranty_claims/backend/warranty_claims/create/page.meta.js.map +7 -0
  184. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/[id]/edit/page.js +110 -0
  185. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/[id]/edit/page.js.map +7 -0
  186. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/[id]/edit/page.meta.js +17 -0
  187. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/[id]/edit/page.meta.js.map +7 -0
  188. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/create/page.js +49 -0
  189. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/create/page.js.map +7 -0
  190. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/create/page.meta.js +17 -0
  191. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/create/page.meta.js.map +7 -0
  192. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/page.js +485 -0
  193. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/page.js.map +7 -0
  194. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/page.meta.js +19 -0
  195. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/page.meta.js.map +7 -0
  196. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/registrationForm.js +253 -0
  197. package/dist/modules/warranty_claims/backend/warranty_claims/registrations/registrationForm.js.map +7 -0
  198. package/dist/modules/warranty_claims/backend/warranty_claims/settings/page.js +1565 -0
  199. package/dist/modules/warranty_claims/backend/warranty_claims/settings/page.js.map +7 -0
  200. package/dist/modules/warranty_claims/backend/warranty_claims/settings/page.meta.js +19 -0
  201. package/dist/modules/warranty_claims/backend/warranty_claims/settings/page.meta.js.map +7 -0
  202. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/TroubleshootingTreeBuilder.js +472 -0
  203. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/TroubleshootingTreeBuilder.js.map +7 -0
  204. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/[id]/edit/page.js +115 -0
  205. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/[id]/edit/page.js.map +7 -0
  206. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/[id]/edit/page.meta.js +19 -0
  207. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/[id]/edit/page.meta.js.map +7 -0
  208. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/create/page.js +54 -0
  209. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/create/page.js.map +7 -0
  210. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/create/page.meta.js +19 -0
  211. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/create/page.meta.js.map +7 -0
  212. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.js +414 -0
  213. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.js.map +7 -0
  214. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.meta.js +21 -0
  215. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.meta.js.map +7 -0
  216. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/troubleshootingGuideForm.js +171 -0
  217. package/dist/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/troubleshootingGuideForm.js.map +7 -0
  218. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/[id]/edit/page.js +111 -0
  219. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/[id]/edit/page.js.map +7 -0
  220. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/[id]/edit/page.meta.js +19 -0
  221. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/[id]/edit/page.meta.js.map +7 -0
  222. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/create/page.js +48 -0
  223. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/create/page.js.map +7 -0
  224. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/create/page.meta.js +19 -0
  225. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/create/page.meta.js.map +7 -0
  226. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.js +429 -0
  227. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.js.map +7 -0
  228. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.meta.js +21 -0
  229. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.meta.js.map +7 -0
  230. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/vendorPolicyForm.js +182 -0
  231. package/dist/modules/warranty_claims/backend/warranty_claims/vendor-policies/vendorPolicyForm.js.map +7 -0
  232. package/dist/modules/warranty_claims/ce.js +48 -0
  233. package/dist/modules/warranty_claims/ce.js.map +7 -0
  234. package/dist/modules/warranty_claims/commands/claim-lines.js +911 -0
  235. package/dist/modules/warranty_claims/commands/claim-lines.js.map +7 -0
  236. package/dist/modules/warranty_claims/commands/claims.js +2577 -0
  237. package/dist/modules/warranty_claims/commands/claims.js.map +7 -0
  238. package/dist/modules/warranty_claims/commands/index.js +4 -0
  239. package/dist/modules/warranty_claims/commands/index.js.map +7 -0
  240. package/dist/modules/warranty_claims/commands/settings.js +169 -0
  241. package/dist/modules/warranty_claims/commands/settings.js.map +7 -0
  242. package/dist/modules/warranty_claims/commands/shared.js +162 -0
  243. package/dist/modules/warranty_claims/commands/shared.js.map +7 -0
  244. package/dist/modules/warranty_claims/data/constants.js +35 -0
  245. package/dist/modules/warranty_claims/data/constants.js.map +7 -0
  246. package/dist/modules/warranty_claims/data/enrichers.js +97 -0
  247. package/dist/modules/warranty_claims/data/enrichers.js.map +7 -0
  248. package/dist/modules/warranty_claims/data/entities.js +731 -0
  249. package/dist/modules/warranty_claims/data/entities.js.map +7 -0
  250. package/dist/modules/warranty_claims/data/validators.js +488 -0
  251. package/dist/modules/warranty_claims/data/validators.js.map +7 -0
  252. package/dist/modules/warranty_claims/di.js +29 -0
  253. package/dist/modules/warranty_claims/di.js.map +7 -0
  254. package/dist/modules/warranty_claims/encryption.js +28 -0
  255. package/dist/modules/warranty_claims/encryption.js.map +7 -0
  256. package/dist/modules/warranty_claims/events.js +81 -0
  257. package/dist/modules/warranty_claims/events.js.map +7 -0
  258. package/dist/modules/warranty_claims/extension-points.js +19 -0
  259. package/dist/modules/warranty_claims/extension-points.js.map +7 -0
  260. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/[id]/page.js +825 -0
  261. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/[id]/page.js.map +7 -0
  262. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/[id]/page.meta.js +11 -0
  263. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/[id]/page.meta.js.map +7 -0
  264. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/new/page.js +1139 -0
  265. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/new/page.js.map +7 -0
  266. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/new/page.meta.js +11 -0
  267. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/new/page.meta.js.map +7 -0
  268. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.js +253 -0
  269. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.js.map +7 -0
  270. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.meta.js +18 -0
  271. package/dist/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.meta.js.map +7 -0
  272. package/dist/modules/warranty_claims/index.js +15 -0
  273. package/dist/modules/warranty_claims/index.js.map +7 -0
  274. package/dist/modules/warranty_claims/lib/aiAssist.js +496 -0
  275. package/dist/modules/warranty_claims/lib/aiAssist.js.map +7 -0
  276. package/dist/modules/warranty_claims/lib/apiIdsFilter.js +11 -0
  277. package/dist/modules/warranty_claims/lib/apiIdsFilter.js.map +7 -0
  278. package/dist/modules/warranty_claims/lib/assigneeNames.js +153 -0
  279. package/dist/modules/warranty_claims/lib/assigneeNames.js.map +7 -0
  280. package/dist/modules/warranty_claims/lib/attachmentVisibility.js +9 -0
  281. package/dist/modules/warranty_claims/lib/attachmentVisibility.js.map +7 -0
  282. package/dist/modules/warranty_claims/lib/bulkFeedback.js +8 -0
  283. package/dist/modules/warranty_claims/lib/bulkFeedback.js.map +7 -0
  284. package/dist/modules/warranty_claims/lib/businessHours.js +250 -0
  285. package/dist/modules/warranty_claims/lib/businessHours.js.map +7 -0
  286. package/dist/modules/warranty_claims/lib/businessHoursForm.js +146 -0
  287. package/dist/modules/warranty_claims/lib/businessHoursForm.js.map +7 -0
  288. package/dist/modules/warranty_claims/lib/claimTypeConfig.js +39 -0
  289. package/dist/modules/warranty_claims/lib/claimTypeConfig.js.map +7 -0
  290. package/dist/modules/warranty_claims/lib/decryptionSafety.js +17 -0
  291. package/dist/modules/warranty_claims/lib/decryptionSafety.js.map +7 -0
  292. package/dist/modules/warranty_claims/lib/deskFilters.js +88 -0
  293. package/dist/modules/warranty_claims/lib/deskFilters.js.map +7 -0
  294. package/dist/modules/warranty_claims/lib/dictionaries.js +157 -0
  295. package/dist/modules/warranty_claims/lib/dictionaries.js.map +7 -0
  296. package/dist/modules/warranty_claims/lib/dictionaryLabels.js +12 -0
  297. package/dist/modules/warranty_claims/lib/dictionaryLabels.js.map +7 -0
  298. package/dist/modules/warranty_claims/lib/emailIntake.js +87 -0
  299. package/dist/modules/warranty_claims/lib/emailIntake.js.map +7 -0
  300. package/dist/modules/warranty_claims/lib/escalation.js +58 -0
  301. package/dist/modules/warranty_claims/lib/escalation.js.map +7 -0
  302. package/dist/modules/warranty_claims/lib/externalIntake.js +233 -0
  303. package/dist/modules/warranty_claims/lib/externalIntake.js.map +7 -0
  304. package/dist/modules/warranty_claims/lib/grading.js +21 -0
  305. package/dist/modules/warranty_claims/lib/grading.js.map +7 -0
  306. package/dist/modules/warranty_claims/lib/listSegments.js +18 -0
  307. package/dist/modules/warranty_claims/lib/listSegments.js.map +7 -0
  308. package/dist/modules/warranty_claims/lib/orderOwnership.js +25 -0
  309. package/dist/modules/warranty_claims/lib/orderOwnership.js.map +7 -0
  310. package/dist/modules/warranty_claims/lib/portalAttachmentUpload.js +11 -0
  311. package/dist/modules/warranty_claims/lib/portalAttachmentUpload.js.map +7 -0
  312. package/dist/modules/warranty_claims/lib/portalAttachmentValidation.js +108 -0
  313. package/dist/modules/warranty_claims/lib/portalAttachmentValidation.js.map +7 -0
  314. package/dist/modules/warranty_claims/lib/portalClaimAccess.js +26 -0
  315. package/dist/modules/warranty_claims/lib/portalClaimAccess.js.map +7 -0
  316. package/dist/modules/warranty_claims/lib/quantity.js +19 -0
  317. package/dist/modules/warranty_claims/lib/quantity.js.map +7 -0
  318. package/dist/modules/warranty_claims/lib/risk.js +204 -0
  319. package/dist/modules/warranty_claims/lib/risk.js.map +7 -0
  320. package/dist/modules/warranty_claims/lib/settings.js +55 -0
  321. package/dist/modules/warranty_claims/lib/settings.js.map +7 -0
  322. package/dist/modules/warranty_claims/lib/stateMachine.js +88 -0
  323. package/dist/modules/warranty_claims/lib/stateMachine.js.map +7 -0
  324. package/dist/modules/warranty_claims/lib/timelineFilters.js +16 -0
  325. package/dist/modules/warranty_claims/lib/timelineFilters.js.map +7 -0
  326. package/dist/modules/warranty_claims/lib/triage.js +241 -0
  327. package/dist/modules/warranty_claims/lib/triage.js.map +7 -0
  328. package/dist/modules/warranty_claims/lib/troubleshooting.js +111 -0
  329. package/dist/modules/warranty_claims/lib/troubleshooting.js.map +7 -0
  330. package/dist/modules/warranty_claims/lib/tryResolve.js +11 -0
  331. package/dist/modules/warranty_claims/lib/tryResolve.js.map +7 -0
  332. package/dist/modules/warranty_claims/lib/vendorPolicyRecovery.js +101 -0
  333. package/dist/modules/warranty_claims/lib/vendorPolicyRecovery.js.map +7 -0
  334. package/dist/modules/warranty_claims/lib/warrantyPreview.js +18 -0
  335. package/dist/modules/warranty_claims/lib/warrantyPreview.js.map +7 -0
  336. package/dist/modules/warranty_claims/migrations/Migration20260703191537_warranty_claims.js +32 -0
  337. package/dist/modules/warranty_claims/migrations/Migration20260703191537_warranty_claims.js.map +7 -0
  338. package/dist/modules/warranty_claims/migrations/Migration20260704115605_warranty_claims.js +16 -0
  339. package/dist/modules/warranty_claims/migrations/Migration20260704115605_warranty_claims.js.map +7 -0
  340. package/dist/modules/warranty_claims/migrations/Migration20260704230000_warranty_claims.js +17 -0
  341. package/dist/modules/warranty_claims/migrations/Migration20260704230000_warranty_claims.js.map +7 -0
  342. package/dist/modules/warranty_claims/migrations/Migration20260705121601_warranty_claims.js +29 -0
  343. package/dist/modules/warranty_claims/migrations/Migration20260705121601_warranty_claims.js.map +7 -0
  344. package/dist/modules/warranty_claims/migrations/Migration20260709120000_warranty_claims.js +25 -0
  345. package/dist/modules/warranty_claims/migrations/Migration20260709120000_warranty_claims.js.map +7 -0
  346. package/dist/modules/warranty_claims/migrations/Migration20260710023607_warranty_claims.js +13 -0
  347. package/dist/modules/warranty_claims/migrations/Migration20260710023607_warranty_claims.js.map +7 -0
  348. package/dist/modules/warranty_claims/migrations/Migration20260716203936_warranty_claims.js +15 -0
  349. package/dist/modules/warranty_claims/migrations/Migration20260716203936_warranty_claims.js.map +7 -0
  350. package/dist/modules/warranty_claims/migrations/Migration20260717150000_warranty_claims.js +13 -0
  351. package/dist/modules/warranty_claims/migrations/Migration20260717150000_warranty_claims.js.map +7 -0
  352. package/dist/modules/warranty_claims/migrations/Migration20260719120000_warranty_claims.js +13 -0
  353. package/dist/modules/warranty_claims/migrations/Migration20260719120000_warranty_claims.js.map +7 -0
  354. package/dist/modules/warranty_claims/migrations/Migration20260813103053_warranty_claims.js +12 -0
  355. package/dist/modules/warranty_claims/migrations/Migration20260813103053_warranty_claims.js.map +7 -0
  356. package/dist/modules/warranty_claims/notifications.client.js +67 -0
  357. package/dist/modules/warranty_claims/notifications.client.js.map +7 -0
  358. package/dist/modules/warranty_claims/notifications.js +103 -0
  359. package/dist/modules/warranty_claims/notifications.js.map +7 -0
  360. package/dist/modules/warranty_claims/search.js +174 -0
  361. package/dist/modules/warranty_claims/search.js.map +7 -0
  362. package/dist/modules/warranty_claims/services/adjudicationEvaluator.js +202 -0
  363. package/dist/modules/warranty_claims/services/adjudicationEvaluator.js.map +7 -0
  364. package/dist/modules/warranty_claims/services/claimNumberGenerator.js +58 -0
  365. package/dist/modules/warranty_claims/services/claimNumberGenerator.js.map +7 -0
  366. package/dist/modules/warranty_claims/services/entitlementResolver.js +69 -0
  367. package/dist/modules/warranty_claims/services/entitlementResolver.js.map +7 -0
  368. package/dist/modules/warranty_claims/services/returnLabelProvider.js +14 -0
  369. package/dist/modules/warranty_claims/services/returnLabelProvider.js.map +7 -0
  370. package/dist/modules/warranty_claims/setup.js +121 -0
  371. package/dist/modules/warranty_claims/setup.js.map +7 -0
  372. package/dist/modules/warranty_claims/subscribers/auto-vendor-recovery.js +119 -0
  373. package/dist/modules/warranty_claims/subscribers/auto-vendor-recovery.js.map +7 -0
  374. package/dist/modules/warranty_claims/subscribers/claim-assigned-notification.js +47 -0
  375. package/dist/modules/warranty_claims/subscribers/claim-assigned-notification.js.map +7 -0
  376. package/dist/modules/warranty_claims/subscribers/claim-customer-reply-notification.js +60 -0
  377. package/dist/modules/warranty_claims/subscribers/claim-customer-reply-notification.js.map +7 -0
  378. package/dist/modules/warranty_claims/subscribers/claim-status-notification.js +83 -0
  379. package/dist/modules/warranty_claims/subscribers/claim-status-notification.js.map +7 -0
  380. package/dist/modules/warranty_claims/subscribers/claim-submitted-notification.js +46 -0
  381. package/dist/modules/warranty_claims/subscribers/claim-submitted-notification.js.map +7 -0
  382. package/dist/modules/warranty_claims/subscribers/email-to-claim.js +135 -0
  383. package/dist/modules/warranty_claims/subscribers/email-to-claim.js.map +7 -0
  384. package/dist/modules/warranty_claims/subscribers/return-shipment-tracking.js +164 -0
  385. package/dist/modules/warranty_claims/subscribers/return-shipment-tracking.js.map +7 -0
  386. package/dist/modules/warranty_claims/subscribers/vendor-recovery-reconciliation-undo.js +24 -0
  387. package/dist/modules/warranty_claims/subscribers/vendor-recovery-reconciliation-undo.js.map +7 -0
  388. package/dist/modules/warranty_claims/subscribers/vendor-recovery-reconciliation.js +26 -0
  389. package/dist/modules/warranty_claims/subscribers/vendor-recovery-reconciliation.js.map +7 -0
  390. package/dist/modules/warranty_claims/widgets/dashboard/claims-queue/config.js +15 -0
  391. package/dist/modules/warranty_claims/widgets/dashboard/claims-queue/config.js.map +7 -0
  392. package/dist/modules/warranty_claims/widgets/dashboard/claims-queue/widget.client.js +197 -0
  393. package/dist/modules/warranty_claims/widgets/dashboard/claims-queue/widget.client.js.map +7 -0
  394. package/dist/modules/warranty_claims/widgets/dashboard/claims-queue/widget.js +28 -0
  395. package/dist/modules/warranty_claims/widgets/dashboard/claims-queue/widget.js.map +7 -0
  396. package/dist/modules/warranty_claims/widgets/injection/claims-ai-trigger/widget.client.js +418 -0
  397. package/dist/modules/warranty_claims/widgets/injection/claims-ai-trigger/widget.client.js.map +7 -0
  398. package/dist/modules/warranty_claims/widgets/injection/claims-ai-trigger/widget.js +18 -0
  399. package/dist/modules/warranty_claims/widgets/injection/claims-ai-trigger/widget.js.map +7 -0
  400. package/dist/modules/warranty_claims/widgets/injection/customer-claims-tab/widget.js +17 -0
  401. package/dist/modules/warranty_claims/widgets/injection/customer-claims-tab/widget.js.map +7 -0
  402. package/dist/modules/warranty_claims/widgets/injection/customer-claims-tab.js +146 -0
  403. package/dist/modules/warranty_claims/widgets/injection/customer-claims-tab.js.map +7 -0
  404. package/dist/modules/warranty_claims/widgets/injection/order-claims-tab/widget.js +17 -0
  405. package/dist/modules/warranty_claims/widgets/injection/order-claims-tab/widget.js.map +7 -0
  406. package/dist/modules/warranty_claims/widgets/injection/order-claims-tab.js +147 -0
  407. package/dist/modules/warranty_claims/widgets/injection/order-claims-tab.js.map +7 -0
  408. package/dist/modules/warranty_claims/widgets/injection-table.js +38 -0
  409. package/dist/modules/warranty_claims/widgets/injection-table.js.map +7 -0
  410. package/dist/modules/warranty_claims/widgets/notifications/WarrantyClaimNotificationRenderer.js +223 -0
  411. package/dist/modules/warranty_claims/widgets/notifications/WarrantyClaimNotificationRenderer.js.map +7 -0
  412. package/dist/modules/warranty_claims/widgets/notifications/index.js +5 -0
  413. package/dist/modules/warranty_claims/widgets/notifications/index.js.map +7 -0
  414. package/dist/modules/warranty_claims/workers/sla-escalation-sweep.js +334 -0
  415. package/dist/modules/warranty_claims/workers/sla-escalation-sweep.js.map +7 -0
  416. package/generated/entities/warranty_claim/index.ts +51 -0
  417. package/generated/entities/warranty_claim_event/index.ts +11 -0
  418. package/generated/entities/warranty_claim_line/index.ts +37 -0
  419. package/generated/entities/warranty_claim_registration/index.ts +20 -0
  420. package/generated/entities/warranty_claim_sequence/index.ts +7 -0
  421. package/generated/entities/warranty_claim_settings/index.ts +20 -0
  422. package/generated/entities/warranty_claim_sla_signal/index.ts +11 -0
  423. package/generated/entities/warranty_troubleshooting_guide/index.ts +11 -0
  424. package/generated/entities/warranty_vendor_policy/index.ts +14 -0
  425. package/generated/entities.ids.generated.ts +12 -0
  426. package/generated/entity-fields-registry.ts +200 -0
  427. package/package.json +7 -7
  428. package/src/helpers/integration/api.ts +10 -3
  429. package/src/helpers/integration/salesFixtures.ts +17 -7
  430. package/src/modules/attachments/di.ts +30 -1
  431. package/src/modules/attachments/fields/attachment.tsx +215 -23
  432. package/src/modules/attachments/i18n/de.json +5 -0
  433. package/src/modules/attachments/i18n/en.json +5 -0
  434. package/src/modules/attachments/i18n/es.json +5 -0
  435. package/src/modules/attachments/i18n/ko.json +5 -0
  436. package/src/modules/attachments/i18n/pl.json +5 -0
  437. package/src/modules/attachments/lib/scoped-upload-service.ts +257 -0
  438. package/src/modules/attachments/lib/target-access-service.ts +57 -0
  439. package/src/modules/customers/api/companies/route.ts +1 -0
  440. package/src/modules/customers/backend/customers/companies-v2/[id]/page.tsx +4 -2
  441. package/src/modules/customers/backend/customers/people-v2/[id]/page.tsx +4 -2
  442. package/src/modules/customers/components/detail/assignableStaff.ts +14 -177
  443. package/src/modules/customers/lib/assignableStaff.ts +177 -0
  444. package/src/modules/data_sync/AGENTS.md +3 -0
  445. package/src/modules/data_sync/lib/batch-stream.ts +117 -0
  446. package/src/modules/data_sync/lib/sync-engine.ts +190 -115
  447. package/src/modules/inbox_ops/api/emails/[id]/reprocess/route.ts +4 -0
  448. package/src/modules/inbox_ops/api/extract/route.ts +4 -0
  449. package/src/modules/inbox_ops/api/webhook/inbound.ts +4 -0
  450. package/src/modules/sales/commands/documents.ts +16 -8
  451. package/src/modules/warranty_claims/AGENTS.md +49 -0
  452. package/src/modules/warranty_claims/acl.ts +71 -0
  453. package/src/modules/warranty_claims/ai-agents.ts +189 -0
  454. package/src/modules/warranty_claims/ai-tools.ts +711 -0
  455. package/src/modules/warranty_claims/api/ai/assess/route.ts +371 -0
  456. package/src/modules/warranty_claims/api/ai/draft-reply/route.ts +149 -0
  457. package/src/modules/warranty_claims/api/ai/suggest/route.ts +190 -0
  458. package/src/modules/warranty_claims/api/assign/route.ts +142 -0
  459. package/src/modules/warranty_claims/api/assignees/route.ts +102 -0
  460. package/src/modules/warranty_claims/api/credit-memo/route.ts +191 -0
  461. package/src/modules/warranty_claims/api/entitlement/route.ts +224 -0
  462. package/src/modules/warranty_claims/api/events/route.ts +226 -0
  463. package/src/modules/warranty_claims/api/external/claims/route.ts +528 -0
  464. package/src/modules/warranty_claims/api/lines/route.ts +275 -0
  465. package/src/modules/warranty_claims/api/openapi.ts +28 -0
  466. package/src/modules/warranty_claims/api/portal/attachments/route.ts +547 -0
  467. package/src/modules/warranty_claims/api/portal/claims/[id]/route.ts +195 -0
  468. package/src/modules/warranty_claims/api/portal/claims/[id]/shared.ts +125 -0
  469. package/src/modules/warranty_claims/api/portal/claims/[id]/submit/route.ts +82 -0
  470. package/src/modules/warranty_claims/api/portal/claims/[id]/withdraw/route.ts +87 -0
  471. package/src/modules/warranty_claims/api/portal/claims/route.ts +579 -0
  472. package/src/modules/warranty_claims/api/portal/events/route.ts +260 -0
  473. package/src/modules/warranty_claims/api/portal/options/route.ts +113 -0
  474. package/src/modules/warranty_claims/api/portal/orders/lines/route.ts +258 -0
  475. package/src/modules/warranty_claims/api/portal/orders/route.ts +206 -0
  476. package/src/modules/warranty_claims/api/portal/troubleshooting/route.ts +151 -0
  477. package/src/modules/warranty_claims/api/receiving/route.ts +215 -0
  478. package/src/modules/warranty_claims/api/registrations/route.ts +417 -0
  479. package/src/modules/warranty_claims/api/replacement-order/route.ts +188 -0
  480. package/src/modules/warranty_claims/api/return-label/route.ts +291 -0
  481. package/src/modules/warranty_claims/api/risk/route.ts +112 -0
  482. package/src/modules/warranty_claims/api/route.ts +543 -0
  483. package/src/modules/warranty_claims/api/sales-return/route.ts +183 -0
  484. package/src/modules/warranty_claims/api/settings-general/route.ts +230 -0
  485. package/src/modules/warranty_claims/api/stats/route.ts +306 -0
  486. package/src/modules/warranty_claims/api/submit/route.ts +146 -0
  487. package/src/modules/warranty_claims/api/transition/route.ts +144 -0
  488. package/src/modules/warranty_claims/api/troubleshooting-guides/route.ts +295 -0
  489. package/src/modules/warranty_claims/api/vendor-policies/route.ts +351 -0
  490. package/src/modules/warranty_claims/api/vendor-recovery/route.ts +148 -0
  491. package/src/modules/warranty_claims/api/vendor-recovery-suggestions/route.ts +167 -0
  492. package/src/modules/warranty_claims/backend/components/AiAssessButtons.tsx +389 -0
  493. package/src/modules/warranty_claims/backend/components/ClaimStageProgress.tsx +65 -0
  494. package/src/modules/warranty_claims/backend/components/ClaimStatusBadge.tsx +137 -0
  495. package/src/modules/warranty_claims/backend/components/ClaimsKpiStrip.tsx +169 -0
  496. package/src/modules/warranty_claims/backend/components/EntitlementLookupBadge.tsx +203 -0
  497. package/src/modules/warranty_claims/backend/components/ReceivingPanel.tsx +300 -0
  498. package/src/modules/warranty_claims/backend/components/ReturnLabelPanel.tsx +292 -0
  499. package/src/modules/warranty_claims/backend/components/TroubleshootingWalker.tsx +125 -0
  500. package/src/modules/warranty_claims/backend/components/VendorRecoverySuggestionsPanel.tsx +217 -0
  501. package/src/modules/warranty_claims/backend/components/WarrantyWorkspace.tsx +66 -0
  502. package/src/modules/warranty_claims/backend/components/claimReasonOptions.ts +57 -0
  503. package/src/modules/warranty_claims/backend/components/claimSla.tsx +127 -0
  504. package/src/modules/warranty_claims/backend/components/orderLookup.ts +109 -0
  505. package/src/modules/warranty_claims/backend/components/productLookup.tsx +433 -0
  506. package/src/modules/warranty_claims/backend/components/useUserDisplayNames.ts +66 -0
  507. package/src/modules/warranty_claims/backend/page.meta.ts +12 -0
  508. package/src/modules/warranty_claims/backend/page.tsx +1302 -0
  509. package/src/modules/warranty_claims/backend/warranty_claims/[id]/edit/page.meta.ts +12 -0
  510. package/src/modules/warranty_claims/backend/warranty_claims/[id]/edit/page.tsx +531 -0
  511. package/src/modules/warranty_claims/backend/warranty_claims/[id]/page.meta.ts +12 -0
  512. package/src/modules/warranty_claims/backend/warranty_claims/[id]/page.tsx +2599 -0
  513. package/src/modules/warranty_claims/backend/warranty_claims/create/page.meta.ts +12 -0
  514. package/src/modules/warranty_claims/backend/warranty_claims/create/page.tsx +1533 -0
  515. package/src/modules/warranty_claims/backend/warranty_claims/registrations/[id]/edit/page.meta.ts +13 -0
  516. package/src/modules/warranty_claims/backend/warranty_claims/registrations/[id]/edit/page.tsx +136 -0
  517. package/src/modules/warranty_claims/backend/warranty_claims/registrations/create/page.meta.ts +13 -0
  518. package/src/modules/warranty_claims/backend/warranty_claims/registrations/create/page.tsx +52 -0
  519. package/src/modules/warranty_claims/backend/warranty_claims/registrations/page.meta.ts +15 -0
  520. package/src/modules/warranty_claims/backend/warranty_claims/registrations/page.tsx +555 -0
  521. package/src/modules/warranty_claims/backend/warranty_claims/registrations/registrationForm.tsx +295 -0
  522. package/src/modules/warranty_claims/backend/warranty_claims/settings/page.meta.ts +15 -0
  523. package/src/modules/warranty_claims/backend/warranty_claims/settings/page.tsx +1903 -0
  524. package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/TroubleshootingTreeBuilder.tsx +550 -0
  525. package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/[id]/edit/page.meta.ts +15 -0
  526. package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/[id]/edit/page.tsx +141 -0
  527. package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/create/page.meta.ts +15 -0
  528. package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/create/page.tsx +57 -0
  529. package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.meta.ts +17 -0
  530. package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/page.tsx +477 -0
  531. package/src/modules/warranty_claims/backend/warranty_claims/troubleshooting-guides/troubleshootingGuideForm.tsx +214 -0
  532. package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/[id]/edit/page.meta.ts +15 -0
  533. package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/[id]/edit/page.tsx +137 -0
  534. package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/create/page.meta.ts +15 -0
  535. package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/create/page.tsx +51 -0
  536. package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.meta.ts +17 -0
  537. package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/page.tsx +506 -0
  538. package/src/modules/warranty_claims/backend/warranty_claims/vendor-policies/vendorPolicyForm.tsx +220 -0
  539. package/src/modules/warranty_claims/ce.ts +44 -0
  540. package/src/modules/warranty_claims/commands/claim-lines.ts +1082 -0
  541. package/src/modules/warranty_claims/commands/claims.ts +3364 -0
  542. package/src/modules/warranty_claims/commands/index.ts +3 -0
  543. package/src/modules/warranty_claims/commands/settings.ts +198 -0
  544. package/src/modules/warranty_claims/commands/shared.ts +212 -0
  545. package/src/modules/warranty_claims/data/constants.ts +37 -0
  546. package/src/modules/warranty_claims/data/enrichers.ts +165 -0
  547. package/src/modules/warranty_claims/data/entities.ts +663 -0
  548. package/src/modules/warranty_claims/data/validators.ts +634 -0
  549. package/src/modules/warranty_claims/di.ts +34 -0
  550. package/src/modules/warranty_claims/encryption.ts +26 -0
  551. package/src/modules/warranty_claims/events.ts +81 -0
  552. package/src/modules/warranty_claims/extension-points.ts +16 -0
  553. package/src/modules/warranty_claims/frontend/[orgSlug]/portal/claims/[id]/page.meta.ts +9 -0
  554. package/src/modules/warranty_claims/frontend/[orgSlug]/portal/claims/[id]/page.tsx +1037 -0
  555. package/src/modules/warranty_claims/frontend/[orgSlug]/portal/claims/new/page.meta.ts +9 -0
  556. package/src/modules/warranty_claims/frontend/[orgSlug]/portal/claims/new/page.tsx +1409 -0
  557. package/src/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.meta.ts +16 -0
  558. package/src/modules/warranty_claims/frontend/[orgSlug]/portal/claims/page.tsx +304 -0
  559. package/src/modules/warranty_claims/i18n/de.json +1270 -0
  560. package/src/modules/warranty_claims/i18n/en.json +1270 -0
  561. package/src/modules/warranty_claims/i18n/es.json +1270 -0
  562. package/src/modules/warranty_claims/i18n/ko.json +1270 -0
  563. package/src/modules/warranty_claims/i18n/pl.json +1270 -0
  564. package/src/modules/warranty_claims/index.ts +13 -0
  565. package/src/modules/warranty_claims/lib/aiAssist.ts +677 -0
  566. package/src/modules/warranty_claims/lib/apiIdsFilter.ts +12 -0
  567. package/src/modules/warranty_claims/lib/assigneeNames.ts +184 -0
  568. package/src/modules/warranty_claims/lib/attachmentVisibility.ts +5 -0
  569. package/src/modules/warranty_claims/lib/bulkFeedback.ts +6 -0
  570. package/src/modules/warranty_claims/lib/businessHours.ts +333 -0
  571. package/src/modules/warranty_claims/lib/businessHoursForm.ts +206 -0
  572. package/src/modules/warranty_claims/lib/claimTypeConfig.ts +49 -0
  573. package/src/modules/warranty_claims/lib/decryptionSafety.ts +19 -0
  574. package/src/modules/warranty_claims/lib/deskFilters.ts +131 -0
  575. package/src/modules/warranty_claims/lib/dictionaries.ts +212 -0
  576. package/src/modules/warranty_claims/lib/dictionaryLabels.ts +16 -0
  577. package/src/modules/warranty_claims/lib/emailIntake.ts +123 -0
  578. package/src/modules/warranty_claims/lib/escalation.ts +83 -0
  579. package/src/modules/warranty_claims/lib/externalIntake.ts +362 -0
  580. package/src/modules/warranty_claims/lib/grading.ts +23 -0
  581. package/src/modules/warranty_claims/lib/listSegments.ts +19 -0
  582. package/src/modules/warranty_claims/lib/orderOwnership.ts +58 -0
  583. package/src/modules/warranty_claims/lib/portalAttachmentUpload.ts +11 -0
  584. package/src/modules/warranty_claims/lib/portalAttachmentValidation.ts +115 -0
  585. package/src/modules/warranty_claims/lib/portalClaimAccess.ts +37 -0
  586. package/src/modules/warranty_claims/lib/quantity.ts +15 -0
  587. package/src/modules/warranty_claims/lib/risk.ts +371 -0
  588. package/src/modules/warranty_claims/lib/settings.ts +76 -0
  589. package/src/modules/warranty_claims/lib/stateMachine.ts +130 -0
  590. package/src/modules/warranty_claims/lib/timelineFilters.ts +22 -0
  591. package/src/modules/warranty_claims/lib/triage.ts +366 -0
  592. package/src/modules/warranty_claims/lib/troubleshooting.ts +157 -0
  593. package/src/modules/warranty_claims/lib/tryResolve.ts +7 -0
  594. package/src/modules/warranty_claims/lib/vendorPolicyRecovery.ts +182 -0
  595. package/src/modules/warranty_claims/lib/warrantyPreview.ts +20 -0
  596. package/src/modules/warranty_claims/migrations/.snapshot-open-mercato.json +3525 -0
  597. package/src/modules/warranty_claims/migrations/Migration20260703191537_warranty_claims.ts +38 -0
  598. package/src/modules/warranty_claims/migrations/Migration20260704115605_warranty_claims.ts +17 -0
  599. package/src/modules/warranty_claims/migrations/Migration20260704230000_warranty_claims.ts +17 -0
  600. package/src/modules/warranty_claims/migrations/Migration20260705121601_warranty_claims.ts +37 -0
  601. package/src/modules/warranty_claims/migrations/Migration20260709120000_warranty_claims.ts +25 -0
  602. package/src/modules/warranty_claims/migrations/Migration20260710023607_warranty_claims.ts +13 -0
  603. package/src/modules/warranty_claims/migrations/Migration20260716203936_warranty_claims.ts +15 -0
  604. package/src/modules/warranty_claims/migrations/Migration20260717150000_warranty_claims.ts +13 -0
  605. package/src/modules/warranty_claims/migrations/Migration20260719120000_warranty_claims.ts +13 -0
  606. package/src/modules/warranty_claims/migrations/Migration20260813103053_warranty_claims.ts +11 -0
  607. package/src/modules/warranty_claims/notifications.client.ts +78 -0
  608. package/src/modules/warranty_claims/notifications.ts +101 -0
  609. package/src/modules/warranty_claims/search.ts +199 -0
  610. package/src/modules/warranty_claims/services/adjudicationEvaluator.ts +344 -0
  611. package/src/modules/warranty_claims/services/claimNumberGenerator.ts +69 -0
  612. package/src/modules/warranty_claims/services/entitlementResolver.ts +102 -0
  613. package/src/modules/warranty_claims/services/returnLabelProvider.ts +30 -0
  614. package/src/modules/warranty_claims/setup.ts +154 -0
  615. package/src/modules/warranty_claims/subscribers/auto-vendor-recovery.ts +140 -0
  616. package/src/modules/warranty_claims/subscribers/claim-assigned-notification.ts +54 -0
  617. package/src/modules/warranty_claims/subscribers/claim-customer-reply-notification.ts +68 -0
  618. package/src/modules/warranty_claims/subscribers/claim-status-notification.ts +100 -0
  619. package/src/modules/warranty_claims/subscribers/claim-submitted-notification.ts +53 -0
  620. package/src/modules/warranty_claims/subscribers/email-to-claim.ts +175 -0
  621. package/src/modules/warranty_claims/subscribers/return-shipment-tracking.ts +226 -0
  622. package/src/modules/warranty_claims/subscribers/vendor-recovery-reconciliation-undo.ts +28 -0
  623. package/src/modules/warranty_claims/subscribers/vendor-recovery-reconciliation.ts +31 -0
  624. package/src/modules/warranty_claims/widgets/dashboard/claims-queue/config.ts +15 -0
  625. package/src/modules/warranty_claims/widgets/dashboard/claims-queue/widget.client.tsx +237 -0
  626. package/src/modules/warranty_claims/widgets/dashboard/claims-queue/widget.ts +27 -0
  627. package/src/modules/warranty_claims/widgets/injection/claims-ai-trigger/widget.client.tsx +527 -0
  628. package/src/modules/warranty_claims/widgets/injection/claims-ai-trigger/widget.ts +37 -0
  629. package/src/modules/warranty_claims/widgets/injection/customer-claims-tab/widget.ts +21 -0
  630. package/src/modules/warranty_claims/widgets/injection/customer-claims-tab.tsx +210 -0
  631. package/src/modules/warranty_claims/widgets/injection/order-claims-tab/widget.ts +21 -0
  632. package/src/modules/warranty_claims/widgets/injection/order-claims-tab.tsx +210 -0
  633. package/src/modules/warranty_claims/widgets/injection-table.ts +36 -0
  634. package/src/modules/warranty_claims/widgets/notifications/WarrantyClaimNotificationRenderer.tsx +253 -0
  635. package/src/modules/warranty_claims/widgets/notifications/index.ts +1 -0
  636. package/src/modules/warranty_claims/workers/sla-escalation-sweep.ts +450 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/modules/customers/components/detail/assignableStaff.ts"],
4
- "sourcesContent": ["import { readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport type { FilterOption } from '@open-mercato/shared/lib/query/advanced-filter'\n\nexport type AssignableStaffMember = {\n teamMemberId: string\n userId: string\n displayName: string\n email: string | null\n teamName: string | null\n}\n\ntype AssignableStaffResponse = {\n items?: Array<Record<string, unknown>>\n total?: number\n page?: number\n pageSize?: number\n}\n\nexport type AssignableStaffMembersPage = {\n items: AssignableStaffMember[]\n /**\n * How many rows the server served for this page, before the dedupe below.\n * \"Load more\" guards must measure this rather than `items.length`: a deduped\n * length shorter than the served page reads as a short page and terminates\n * the sequence early, stranding the rest of the roster.\n */\n servedCount: number\n total: number\n page: number\n pageSize: number\n}\n\n// The assignable-staff roster is owned by the optional, ejectable `staff` module.\n// When that module is disabled, its `/api/staff/team-members/assignable` endpoint is\n// absent and the request resolves to 404. Customers UI (deals / people / companies\n// owner filters, role-assignment dialogs) is core and always enabled, so it must not\n// break in that case \u2014 a missing staff module simply means there is no roster to\n// offer. Treat the 404 as an empty page and let any other failure propagate.\nfunction isAssignableEndpointMissing(error: unknown): boolean {\n return (\n typeof error === 'object' &&\n error !== null &&\n (error as { status?: unknown }).status === 404\n )\n}\n\nexport async function fetchAssignableStaffMembersPage(\n query: string,\n options?: { page?: number; pageSize?: number; signal?: AbortSignal },\n): Promise<AssignableStaffMembersPage> {\n const page = options?.page ?? 1\n const pageSize = options?.pageSize ?? 24\n const params = new URLSearchParams()\n params.set('page', String(page))\n params.set('pageSize', String(pageSize))\n const normalizedQuery = query.trim()\n if (normalizedQuery.length > 0) {\n params.set('search', normalizedQuery)\n }\n\n let data: AssignableStaffResponse\n try {\n data = await readApiResultOrThrow<AssignableStaffResponse>(\n `/api/staff/team-members/assignable?${params.toString()}`,\n options?.signal ? { signal: options.signal } : undefined,\n )\n } catch (error) {\n if (isAssignableEndpointMissing(error)) {\n return { items: [], servedCount: 0, total: 0, page, pageSize }\n }\n throw error\n }\n\n const rawItems = Array.isArray(data?.items) ? data.items : []\n const deduped = new Map<string, AssignableStaffMember>()\n\n for (const item of rawItems) {\n const userId =\n typeof item?.userId === 'string'\n ? item.userId\n : typeof item?.user_id === 'string'\n ? item.user_id\n : null\n if (!userId || deduped.has(userId)) continue\n\n const user =\n item?.user && typeof item.user === 'object'\n ? (item.user as Record<string, unknown>)\n : null\n const team =\n item?.team && typeof item.team === 'object'\n ? (item.team as Record<string, unknown>)\n : null\n\n const displayName =\n typeof item?.displayName === 'string' && item.displayName.trim().length > 0\n ? item.displayName.trim()\n : typeof item?.display_name === 'string' && item.display_name.trim().length > 0\n ? item.display_name.trim()\n : null\n const email =\n user && typeof user.email === 'string' && user.email.trim().length > 0\n ? user.email.trim()\n : typeof item?.email === 'string' && item.email.trim().length > 0\n ? item.email.trim()\n : null\n const teamName =\n typeof item?.teamName === 'string' && item.teamName.trim().length > 0\n ? item.teamName.trim()\n : typeof item?.team_name === 'string' && item.team_name.trim().length > 0\n ? item.team_name.trim()\n : team && typeof team.name === 'string' && team.name.trim().length > 0\n ? team.name.trim()\n : null\n const teamMemberId =\n typeof item?.teamMemberId === 'string'\n ? item.teamMemberId\n : typeof item?.team_member_id === 'string'\n ? item.team_member_id\n : typeof item?.id === 'string'\n ? item.id\n : userId\n\n deduped.set(userId, {\n teamMemberId,\n userId,\n displayName: displayName ?? email ?? userId,\n email,\n teamName,\n })\n }\n\n return {\n items: Array.from(deduped.values()),\n servedCount: rawItems.length,\n total:\n typeof data?.total === 'number' && Number.isFinite(data.total)\n ? data.total\n : deduped.size,\n page:\n typeof data?.page === 'number' && Number.isFinite(data.page)\n ? data.page\n : page,\n pageSize:\n typeof data?.pageSize === 'number' && Number.isFinite(data.pageSize)\n ? data.pageSize\n : pageSize,\n }\n}\n\nexport async function fetchAssignableStaffMembers(\n query: string,\n options?: { pageSize?: number; signal?: AbortSignal },\n): Promise<AssignableStaffMember[]> {\n const result = await fetchAssignableStaffMembersPage(query, options)\n return result.items\n}\n\nexport function mapAssignableStaffToFilterOptions(items: AssignableStaffMember[]): FilterOption[] {\n return items.map((item) => ({\n value: item.userId,\n label: item.email && item.email !== item.displayName\n ? `${item.displayName} (${item.email})`\n : item.displayName,\n tone: 'neutral',\n }))\n}\n\nexport function ensureCurrentUserFilterOption(\n options: FilterOption[],\n currentUserId: string,\n fallbackLabel: string,\n): FilterOption[] {\n const trimmed = currentUserId.trim()\n if (!trimmed || options.some((option) => option.value === trimmed)) return options\n return [{ value: trimmed, label: fallbackLabel, tone: 'neutral' }, ...options]\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * @deprecated Import from `@open-mercato/core/modules/customers/lib/assignableStaff` instead.\n * This path is a compatibility bridge kept for one minor version after 0.6.7; it will be\n * removed in 0.7.0. The implementation moved to `../../lib/assignableStaff` so non-component\n * callers (API routes, commands) can use it without importing from a `components/` path.\n */\nexport {\n fetchAssignableStaffMembersPage,\n fetchAssignableStaffMembers,\n mapAssignableStaffToFilterOptions,\n ensureCurrentUserFilterOption,\n type AssignableStaffMember,\n type AssignableStaffMembersPage,\n} from '../../lib/assignableStaff'\n"],
5
+ "mappings": "AAMA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,76 @@
1
+ import { readApiResultOrThrow } from "@open-mercato/ui/backend/utils/apiCall";
2
+ function isAssignableEndpointMissing(error) {
3
+ return typeof error === "object" && error !== null && error.status === 404;
4
+ }
5
+ async function fetchAssignableStaffMembersPage(query, options) {
6
+ const page = options?.page ?? 1;
7
+ const pageSize = options?.pageSize ?? 24;
8
+ const params = new URLSearchParams();
9
+ params.set("page", String(page));
10
+ params.set("pageSize", String(pageSize));
11
+ const normalizedQuery = query.trim();
12
+ if (normalizedQuery.length > 0) {
13
+ params.set("search", normalizedQuery);
14
+ }
15
+ let data;
16
+ try {
17
+ data = await readApiResultOrThrow(
18
+ `/api/staff/team-members/assignable?${params.toString()}`,
19
+ options?.signal ? { signal: options.signal } : void 0
20
+ );
21
+ } catch (error) {
22
+ if (isAssignableEndpointMissing(error)) {
23
+ return { items: [], servedCount: 0, total: 0, page, pageSize };
24
+ }
25
+ throw error;
26
+ }
27
+ const rawItems = Array.isArray(data?.items) ? data.items : [];
28
+ const deduped = /* @__PURE__ */ new Map();
29
+ for (const item of rawItems) {
30
+ const userId = typeof item?.userId === "string" ? item.userId : typeof item?.user_id === "string" ? item.user_id : null;
31
+ if (!userId || deduped.has(userId)) continue;
32
+ const user = item?.user && typeof item.user === "object" ? item.user : null;
33
+ const team = item?.team && typeof item.team === "object" ? item.team : null;
34
+ const displayName = typeof item?.displayName === "string" && item.displayName.trim().length > 0 ? item.displayName.trim() : typeof item?.display_name === "string" && item.display_name.trim().length > 0 ? item.display_name.trim() : null;
35
+ const email = user && typeof user.email === "string" && user.email.trim().length > 0 ? user.email.trim() : typeof item?.email === "string" && item.email.trim().length > 0 ? item.email.trim() : null;
36
+ const teamName = typeof item?.teamName === "string" && item.teamName.trim().length > 0 ? item.teamName.trim() : typeof item?.team_name === "string" && item.team_name.trim().length > 0 ? item.team_name.trim() : team && typeof team.name === "string" && team.name.trim().length > 0 ? team.name.trim() : null;
37
+ const teamMemberId = typeof item?.teamMemberId === "string" ? item.teamMemberId : typeof item?.team_member_id === "string" ? item.team_member_id : typeof item?.id === "string" ? item.id : userId;
38
+ deduped.set(userId, {
39
+ teamMemberId,
40
+ userId,
41
+ displayName: displayName ?? email ?? userId,
42
+ email,
43
+ teamName
44
+ });
45
+ }
46
+ return {
47
+ items: Array.from(deduped.values()),
48
+ servedCount: rawItems.length,
49
+ total: typeof data?.total === "number" && Number.isFinite(data.total) ? data.total : deduped.size,
50
+ page: typeof data?.page === "number" && Number.isFinite(data.page) ? data.page : page,
51
+ pageSize: typeof data?.pageSize === "number" && Number.isFinite(data.pageSize) ? data.pageSize : pageSize
52
+ };
53
+ }
54
+ async function fetchAssignableStaffMembers(query, options) {
55
+ const result = await fetchAssignableStaffMembersPage(query, options);
56
+ return result.items;
57
+ }
58
+ function mapAssignableStaffToFilterOptions(items) {
59
+ return items.map((item) => ({
60
+ value: item.userId,
61
+ label: item.email && item.email !== item.displayName ? `${item.displayName} (${item.email})` : item.displayName,
62
+ tone: "neutral"
63
+ }));
64
+ }
65
+ function ensureCurrentUserFilterOption(options, currentUserId, fallbackLabel) {
66
+ const trimmed = currentUserId.trim();
67
+ if (!trimmed || options.some((option) => option.value === trimmed)) return options;
68
+ return [{ value: trimmed, label: fallbackLabel, tone: "neutral" }, ...options];
69
+ }
70
+ export {
71
+ ensureCurrentUserFilterOption,
72
+ fetchAssignableStaffMembers,
73
+ fetchAssignableStaffMembersPage,
74
+ mapAssignableStaffToFilterOptions
75
+ };
76
+ //# sourceMappingURL=assignableStaff.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/customers/lib/assignableStaff.ts"],
4
+ "sourcesContent": ["import { readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport type { FilterOption } from '@open-mercato/shared/lib/query/advanced-filter'\n\nexport type AssignableStaffMember = {\n teamMemberId: string\n userId: string\n displayName: string\n email: string | null\n teamName: string | null\n}\n\ntype AssignableStaffResponse = {\n items?: Array<Record<string, unknown>>\n total?: number\n page?: number\n pageSize?: number\n}\n\nexport type AssignableStaffMembersPage = {\n items: AssignableStaffMember[]\n /**\n * How many rows the server served for this page, before the dedupe below.\n * \"Load more\" guards must measure this rather than `items.length`: a deduped\n * length shorter than the served page reads as a short page and terminates\n * the sequence early, stranding the rest of the roster.\n */\n servedCount: number\n total: number\n page: number\n pageSize: number\n}\n\n// The assignable-staff roster is owned by the optional, ejectable `staff` module.\n// When that module is disabled, its `/api/staff/team-members/assignable` endpoint is\n// absent and the request resolves to 404. Customers UI (deals / people / companies\n// owner filters, role-assignment dialogs) is core and always enabled, so it must not\n// break in that case \u2014 a missing staff module simply means there is no roster to\n// offer. Treat the 404 as an empty page and let any other failure propagate.\nfunction isAssignableEndpointMissing(error: unknown): boolean {\n return (\n typeof error === 'object' &&\n error !== null &&\n (error as { status?: unknown }).status === 404\n )\n}\n\nexport async function fetchAssignableStaffMembersPage(\n query: string,\n options?: { page?: number; pageSize?: number; signal?: AbortSignal },\n): Promise<AssignableStaffMembersPage> {\n const page = options?.page ?? 1\n const pageSize = options?.pageSize ?? 24\n const params = new URLSearchParams()\n params.set('page', String(page))\n params.set('pageSize', String(pageSize))\n const normalizedQuery = query.trim()\n if (normalizedQuery.length > 0) {\n params.set('search', normalizedQuery)\n }\n\n let data: AssignableStaffResponse\n try {\n data = await readApiResultOrThrow<AssignableStaffResponse>(\n `/api/staff/team-members/assignable?${params.toString()}`,\n options?.signal ? { signal: options.signal } : undefined,\n )\n } catch (error) {\n if (isAssignableEndpointMissing(error)) {\n return { items: [], servedCount: 0, total: 0, page, pageSize }\n }\n throw error\n }\n\n const rawItems = Array.isArray(data?.items) ? data.items : []\n const deduped = new Map<string, AssignableStaffMember>()\n\n for (const item of rawItems) {\n const userId =\n typeof item?.userId === 'string'\n ? item.userId\n : typeof item?.user_id === 'string'\n ? item.user_id\n : null\n if (!userId || deduped.has(userId)) continue\n\n const user =\n item?.user && typeof item.user === 'object'\n ? (item.user as Record<string, unknown>)\n : null\n const team =\n item?.team && typeof item.team === 'object'\n ? (item.team as Record<string, unknown>)\n : null\n\n const displayName =\n typeof item?.displayName === 'string' && item.displayName.trim().length > 0\n ? item.displayName.trim()\n : typeof item?.display_name === 'string' && item.display_name.trim().length > 0\n ? item.display_name.trim()\n : null\n const email =\n user && typeof user.email === 'string' && user.email.trim().length > 0\n ? user.email.trim()\n : typeof item?.email === 'string' && item.email.trim().length > 0\n ? item.email.trim()\n : null\n const teamName =\n typeof item?.teamName === 'string' && item.teamName.trim().length > 0\n ? item.teamName.trim()\n : typeof item?.team_name === 'string' && item.team_name.trim().length > 0\n ? item.team_name.trim()\n : team && typeof team.name === 'string' && team.name.trim().length > 0\n ? team.name.trim()\n : null\n const teamMemberId =\n typeof item?.teamMemberId === 'string'\n ? item.teamMemberId\n : typeof item?.team_member_id === 'string'\n ? item.team_member_id\n : typeof item?.id === 'string'\n ? item.id\n : userId\n\n deduped.set(userId, {\n teamMemberId,\n userId,\n displayName: displayName ?? email ?? userId,\n email,\n teamName,\n })\n }\n\n return {\n items: Array.from(deduped.values()),\n servedCount: rawItems.length,\n total:\n typeof data?.total === 'number' && Number.isFinite(data.total)\n ? data.total\n : deduped.size,\n page:\n typeof data?.page === 'number' && Number.isFinite(data.page)\n ? data.page\n : page,\n pageSize:\n typeof data?.pageSize === 'number' && Number.isFinite(data.pageSize)\n ? data.pageSize\n : pageSize,\n }\n}\n\nexport async function fetchAssignableStaffMembers(\n query: string,\n options?: { pageSize?: number; signal?: AbortSignal },\n): Promise<AssignableStaffMember[]> {\n const result = await fetchAssignableStaffMembersPage(query, options)\n return result.items\n}\n\nexport function mapAssignableStaffToFilterOptions(items: AssignableStaffMember[]): FilterOption[] {\n return items.map((item) => ({\n value: item.userId,\n label: item.email && item.email !== item.displayName\n ? `${item.displayName} (${item.email})`\n : item.displayName,\n tone: 'neutral',\n }))\n}\n\nexport function ensureCurrentUserFilterOption(\n options: FilterOption[],\n currentUserId: string,\n fallbackLabel: string,\n): FilterOption[] {\n const trimmed = currentUserId.trim()\n if (!trimmed || options.some((option) => option.value === trimmed)) return options\n return [{ value: trimmed, label: fallbackLabel, tone: 'neutral' }, ...options]\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,56 @@
1
+ import { createLogger } from "@open-mercato/shared/lib/logger";
2
+ import {
3
+ withTelemetrySpan
4
+ } from "@open-mercato/shared/lib/telemetry/runtime";
5
+ const logger = createLogger("data_sync").child({ component: "batch-stream" });
6
+ async function closeQuietly(iterator) {
7
+ if (!iterator.return) return;
8
+ try {
9
+ await iterator.return();
10
+ } catch (error) {
11
+ logger.warn("Data sync adapter stream did not close cleanly", { err: error });
12
+ }
13
+ }
14
+ async function forEachBatch(stream, options, handle) {
15
+ const iterator = stream[Symbol.asyncIterator]();
16
+ for (; ; ) {
17
+ let readThrew = false;
18
+ let outcome;
19
+ try {
20
+ outcome = await withTelemetrySpan(
21
+ options.spanName,
22
+ async (span) => {
23
+ let next;
24
+ try {
25
+ next = await iterator.next();
26
+ } catch (error) {
27
+ readThrew = true;
28
+ throw error;
29
+ }
30
+ if (next.done) {
31
+ span.updateName?.(options.drainSpanName);
32
+ return "exhausted";
33
+ }
34
+ return handle(next.value, span);
35
+ },
36
+ {
37
+ root: true,
38
+ attributes: options.attributes,
39
+ links: options.linkTo ? [options.linkTo] : void 0
40
+ }
41
+ );
42
+ } catch (error) {
43
+ if (!readThrew) await closeQuietly(iterator);
44
+ throw error;
45
+ }
46
+ if (outcome === "exhausted") return "completed";
47
+ if (outcome === "stop") {
48
+ await iterator.return?.();
49
+ return "stopped";
50
+ }
51
+ }
52
+ }
53
+ export {
54
+ forEachBatch
55
+ };
56
+ //# sourceMappingURL=batch-stream.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/data_sync/lib/batch-stream.ts"],
4
+ "sourcesContent": ["import { createLogger } from '@open-mercato/shared/lib/logger'\nimport {\n withTelemetrySpan,\n type TelemetrySpan,\n type TelemetrySpanAttributes,\n type TelemetryTraceCarrier,\n} from '@open-mercato/shared/lib/telemetry/runtime'\n\nconst logger = createLogger('data_sync').child({ component: 'batch-stream' })\n\n/** What the handler wants the stream to do next. */\nexport type BatchOutcome = 'continue' | 'stop'\n\n/** Why the stream ended: the adapter ran out of batches, or a handler stopped it. */\nexport type BatchStreamResult = 'completed' | 'stopped'\n\nexport type BatchStreamOptions = {\n spanName: string\n /**\n * Name for the read that turns out to have drained the stream. That read is\n * real adapter work \u2014 it can be a full remote page fetch that comes back\n * empty \u2014 so it stays traced, but it is not a batch: leaving it under\n * `spanName` would report one batch more than the run actually processed and\n * feed an unlabelled, counter-less sample into every batch latency panel.\n */\n drainSpanName: string\n /** Run-level attributes repeated on every batch span (run id, entity type, scope). */\n attributes?: TelemetrySpanAttributes\n /** The run's trace, so a rooted batch still points back at what triggered it. */\n linkTo?: TelemetryTraceCarrier\n}\n\n/**\n * Close the stream while an error is already in flight. That error is the one\n * worth propagating, so a secondary cleanup failure is logged rather than\n * allowed to mask it \u2014 which is what `for await` does on a body throw.\n */\nasync function closeQuietly(iterator: AsyncIterator<unknown>): Promise<void> {\n if (!iterator.return) return\n try {\n await iterator.return()\n } catch (error) {\n logger.warn('Data sync adapter stream did not close cleanly', { err: error })\n }\n}\n\n/**\n * Drive `stream` one batch at a time, running the adapter's read AND `handle`'s\n * bookkeeping for that batch inside a single ROOT span linked back to the run.\n *\n * Rooting per batch is the whole point. A sync run can last days, so leaving its\n * spans nested under the request that triggered it puts the entire run behind\n * one sampling decision \u2014 below ratio 1.0 a run can emit nothing at all, and at\n * 1.0 it becomes a single unrenderable trace. A batch is the unit the slowness\n * analysis actually reasons about, so it gets its own trace and its own\n * decision.\n *\n * The iterator is driven explicitly instead of with `for await` so the span can\n * wrap `next()`, which is where an adapter generator does its real work \u2014 it\n * reads, transforms and upserts before it ever yields. A stream is only known to\n * be drained once that read returns `done`, so the last span per run starts\n * under `spanName` and is renamed to `drainSpanName`: a run over N batches emits\n * N spans named `spanName` and exactly one named `drainSpanName`.\n *\n * Closing follows the language's own `IteratorClose` rules exactly, so adapter\n * cleanup behaves as it did under `for await`:\n *\n * - **exhausted** \u2014 the iterator already completed itself; no `return()` call.\n * - **stopped early** \u2014 `return()` is called and a failure to close *is* the\n * result, the same as breaking out of `for await`.\n * - **`handle` threw** \u2014 `return()` is called, but its failure is swallowed so\n * the handler's error still wins.\n * - **`next()` threw** \u2014 the iterator is already closed; no `return()` call.\n */\nexport async function forEachBatch<TBatch>(\n stream: AsyncIterable<TBatch>,\n options: BatchStreamOptions,\n handle: (batch: TBatch, span: TelemetrySpan) => Promise<BatchOutcome>,\n): Promise<BatchStreamResult> {\n const iterator = stream[Symbol.asyncIterator]()\n for (;;) {\n let readThrew = false\n let outcome: BatchOutcome | 'exhausted'\n try {\n outcome = await withTelemetrySpan(\n options.spanName,\n async (span): Promise<BatchOutcome | 'exhausted'> => {\n let next: IteratorResult<TBatch>\n try {\n next = await iterator.next()\n } catch (error) {\n readThrew = true\n throw error\n }\n if (next.done) {\n span.updateName?.(options.drainSpanName)\n return 'exhausted'\n }\n return handle(next.value, span)\n },\n {\n root: true,\n attributes: options.attributes,\n links: options.linkTo ? [options.linkTo] : undefined,\n },\n )\n } catch (error) {\n if (!readThrew) await closeQuietly(iterator)\n throw error\n }\n if (outcome === 'exhausted') return 'completed'\n if (outcome === 'stop') {\n await iterator.return?.()\n return 'stopped'\n }\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,oBAAoB;AAC7B;AAAA,EACE;AAAA,OAIK;AAEP,MAAM,SAAS,aAAa,WAAW,EAAE,MAAM,EAAE,WAAW,eAAe,CAAC;AA6B5E,eAAe,aAAa,UAAiD;AAC3E,MAAI,CAAC,SAAS,OAAQ;AACtB,MAAI;AACF,UAAM,SAAS,OAAO;AAAA,EACxB,SAAS,OAAO;AACd,WAAO,KAAK,kDAAkD,EAAE,KAAK,MAAM,CAAC;AAAA,EAC9E;AACF;AA8BA,eAAsB,aACpB,QACA,SACA,QAC4B;AAC5B,QAAM,WAAW,OAAO,OAAO,aAAa,EAAE;AAC9C,aAAS;AACP,QAAI,YAAY;AAChB,QAAI;AACJ,QAAI;AACF,gBAAU,MAAM;AAAA,QACd,QAAQ;AAAA,QACR,OAAO,SAA8C;AACnD,cAAI;AACJ,cAAI;AACF,mBAAO,MAAM,SAAS,KAAK;AAAA,UAC7B,SAAS,OAAO;AACd,wBAAY;AACZ,kBAAM;AAAA,UACR;AACA,cAAI,KAAK,MAAM;AACb,iBAAK,aAAa,QAAQ,aAAa;AACvC,mBAAO;AAAA,UACT;AACA,iBAAO,OAAO,KAAK,OAAO,IAAI;AAAA,QAChC;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,YAAY,QAAQ;AAAA,UACpB,OAAO,QAAQ,SAAS,CAAC,QAAQ,MAAM,IAAI;AAAA,QAC7C;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,UAAI,CAAC,UAAW,OAAM,aAAa,QAAQ;AAC3C,YAAM;AAAA,IACR;AACA,QAAI,YAAY,YAAa,QAAO;AACpC,QAAI,YAAY,QAAQ;AACtB,YAAM,SAAS,SAAS;AACxB,aAAO;AAAA,IACT;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -3,8 +3,23 @@ import { refreshCoverageSnapshot } from "../../query_index/lib/coverage.js";
3
3
  import { emitDataSyncEvent } from "../events.js";
4
4
  import { getDataSyncAdapter, resolveProviderKey } from "./adapter-registry.js";
5
5
  import { SyncRunOwnershipConflictError } from "./sync-run-service.js";
6
+ import { forEachBatch } from "./batch-stream.js";
6
7
  import { createLogger } from "@open-mercato/shared/lib/logger";
8
+ import {
9
+ captureTelemetryTrace
10
+ } from "@open-mercato/shared/lib/telemetry/runtime";
7
11
  const logger = createLogger("data_sync").child({ component: "sync-engine" });
12
+ function runSpanAttributes(run, providerKey, scope) {
13
+ return {
14
+ "data_sync.run_id": run.id,
15
+ "data_sync.integration_id": run.integrationId,
16
+ "data_sync.provider_key": providerKey,
17
+ "data_sync.entity_type": run.entityType,
18
+ "data_sync.direction": run.direction,
19
+ "om.tenant_id": scope.tenantId,
20
+ "om.organization_id": scope.organizationId
21
+ };
22
+ }
8
23
  function applyImportCounters(batch) {
9
24
  let createdCount = 0;
10
25
  let updatedCount = 0;
@@ -409,60 +424,84 @@ function createSyncEngine(deps) {
409
424
  let processedCount = await seedProcessedCount(run.progressJobId, scope);
410
425
  let totalCount = null;
411
426
  let committedBatches = activeRun.batchesCompleted ?? 0;
427
+ const runTrace = captureTelemetryTrace();
428
+ const spanAttributes = runSpanAttributes(run, providerKey, scope);
412
429
  try {
413
- for await (const batch of withHeartbeat(
414
- adapter.streamImport({
415
- entityType: run.entityType,
416
- cursor: run.cursor ?? void 0,
417
- batchSize,
418
- credentials,
419
- mapping,
420
- scope: { organizationId: scope.organizationId, tenantId: scope.tenantId },
421
- runId: run.id,
422
- parameters: run.parameters ?? {}
423
- }),
424
- makeHeartbeatTick(run.progressJobId, scope),
425
- HEARTBEAT_TICK_MS
426
- )) {
427
- if (run.progressJobId && await progressService.isCancellationRequested(run.progressJobId, scope.tenantId, scope.organizationId)) {
428
- await finalizeRun(run.id, "cancelled", scope, void 0, operationalTelemetry);
429
- return;
430
- }
431
- const delta = applyImportCounters(batch);
432
- const processedBatchCount = batch.processedCount ?? batch.items.length;
433
- processedCount += processedBatchCount;
434
- totalCount = batch.totalEstimate ?? totalCount;
435
- await syncRunService.commitBatchProgress(
436
- run.id,
437
- {
438
- ...delta,
439
- batchesCompleted: 1
440
- },
441
- batch.cursor,
442
- scope,
443
- { expectedBatchesCompleted: committedBatches, persistSharedCursor }
444
- );
445
- committedBatches += 1;
446
- await updateProgress(run.progressJobId, processedCount, totalCount, scope);
447
- await refreshCoverageSnapshots(batch.refreshCoverageEntityTypes, scope);
448
- await logImportItemFailures(run.id, run.integrationId, batch.items, scope);
449
- await writeOperationalLog({
450
- integrationId: run.integrationId,
451
- runId: run.id,
452
- level: "info",
453
- message: batch.message?.trim().length ? batch.message.trim() : `Processed import batch ${batch.batchIndex}`,
454
- scope,
455
- enabled: operationalTelemetry,
456
- payload: {
457
- operationalStatus: "running",
458
- summary: `Processed ${processedCount}${totalCount ? ` of ${totalCount}` : ""} rows so far.`,
459
- processedCount,
460
- batchSize: batch.items.length,
461
- processedBatchCount,
462
- cursor: batch.cursor
430
+ const streamResult = await forEachBatch(
431
+ withHeartbeat(
432
+ adapter.streamImport({
433
+ entityType: run.entityType,
434
+ cursor: run.cursor ?? void 0,
435
+ batchSize,
436
+ credentials,
437
+ mapping,
438
+ scope: { organizationId: scope.organizationId, tenantId: scope.tenantId },
439
+ runId: run.id,
440
+ parameters: run.parameters ?? {}
441
+ }),
442
+ makeHeartbeatTick(run.progressJobId, scope),
443
+ HEARTBEAT_TICK_MS
444
+ ),
445
+ {
446
+ spanName: "data_sync.import.batch",
447
+ drainSpanName: "data_sync.import.drain",
448
+ attributes: spanAttributes,
449
+ linkTo: runTrace
450
+ },
451
+ async (batch, span) => {
452
+ span.setAttributes({
453
+ "data_sync.batch_index": batch.batchIndex,
454
+ "data_sync.batch_size": batch.items.length
455
+ });
456
+ if (run.progressJobId && await progressService.isCancellationRequested(run.progressJobId, scope.tenantId, scope.organizationId)) {
457
+ await finalizeRun(run.id, "cancelled", scope, void 0, operationalTelemetry);
458
+ return "stop";
463
459
  }
464
- });
465
- }
460
+ const delta = applyImportCounters(batch);
461
+ const processedBatchCount = batch.processedCount ?? batch.items.length;
462
+ processedCount += processedBatchCount;
463
+ totalCount = batch.totalEstimate ?? totalCount;
464
+ span.setAttributes({
465
+ "data_sync.processed_count": processedBatchCount,
466
+ "data_sync.created_count": delta.createdCount,
467
+ "data_sync.updated_count": delta.updatedCount,
468
+ "data_sync.skipped_count": delta.skippedCount,
469
+ "data_sync.failed_count": delta.failedCount
470
+ });
471
+ await syncRunService.commitBatchProgress(
472
+ run.id,
473
+ {
474
+ ...delta,
475
+ batchesCompleted: 1
476
+ },
477
+ batch.cursor,
478
+ scope,
479
+ { expectedBatchesCompleted: committedBatches, persistSharedCursor }
480
+ );
481
+ committedBatches += 1;
482
+ await updateProgress(run.progressJobId, processedCount, totalCount, scope);
483
+ await refreshCoverageSnapshots(batch.refreshCoverageEntityTypes, scope);
484
+ await logImportItemFailures(run.id, run.integrationId, batch.items, scope);
485
+ await writeOperationalLog({
486
+ integrationId: run.integrationId,
487
+ runId: run.id,
488
+ level: "info",
489
+ message: batch.message?.trim().length ? batch.message.trim() : `Processed import batch ${batch.batchIndex}`,
490
+ scope,
491
+ enabled: operationalTelemetry,
492
+ payload: {
493
+ operationalStatus: "running",
494
+ summary: `Processed ${processedCount}${totalCount ? ` of ${totalCount}` : ""} rows so far.`,
495
+ processedCount,
496
+ batchSize: batch.items.length,
497
+ processedBatchCount,
498
+ cursor: batch.cursor
499
+ }
500
+ });
501
+ return "continue";
502
+ }
503
+ );
504
+ if (streamResult === "stopped") return;
466
505
  } catch (error) {
467
506
  if (error instanceof SyncRunOwnershipConflictError) {
468
507
  logger.warn("Yielding import run to a concurrent worker that already advanced it", {
@@ -557,59 +596,82 @@ function createSyncEngine(deps) {
557
596
  const mapping = await resolveMapping(adapter, run.entityType, scope);
558
597
  let processedCount = await seedProcessedCount(run.progressJobId, scope);
559
598
  let committedBatches = activeRun.batchesCompleted ?? 0;
599
+ const runTrace = captureTelemetryTrace();
600
+ const spanAttributes = runSpanAttributes(run, providerKey, scope);
560
601
  try {
561
- for await (const batch of withHeartbeat(
562
- adapter.streamExport({
563
- entityType: run.entityType,
564
- cursor: run.cursor ?? void 0,
565
- batchSize,
566
- credentials,
567
- mapping,
568
- scope: { organizationId: scope.organizationId, tenantId: scope.tenantId },
569
- runId: run.id,
570
- parameters: run.parameters ?? {}
571
- }),
572
- makeHeartbeatTick(run.progressJobId, scope),
573
- HEARTBEAT_TICK_MS
574
- )) {
575
- if (run.progressJobId && await progressService.isCancellationRequested(run.progressJobId, scope.tenantId, scope.organizationId)) {
576
- await finalizeRun(run.id, "cancelled", scope, void 0, operationalTelemetry);
577
- return;
578
- }
579
- const delta = applyExportCounters(batch);
580
- processedCount += delta.processedCount;
581
- await syncRunService.commitBatchProgress(
582
- run.id,
583
- {
584
- createdCount: 0,
585
- updatedCount: delta.updatedCount,
586
- skippedCount: delta.skippedCount,
587
- failedCount: delta.failedCount,
588
- batchesCompleted: 1
589
- },
590
- batch.cursor,
591
- scope,
592
- { expectedBatchesCompleted: committedBatches, persistSharedCursor }
593
- );
594
- committedBatches += 1;
595
- await updateProgress(run.progressJobId, processedCount, null, scope);
596
- await logExportItemFailures(run.id, run.integrationId, batch.results, scope);
597
- await writeOperationalLog({
598
- integrationId: run.integrationId,
599
- runId: run.id,
600
- level: "info",
601
- message: `Processed export batch ${batch.batchIndex}`,
602
- scope,
603
- enabled: operationalTelemetry,
604
- payload: {
605
- operationalStatus: "running",
606
- summary: `Processed ${processedCount} export items so far.`,
607
- processedCount,
608
- batchSize: batch.results.length,
609
- cursor: batch.cursor
602
+ const streamResult = await forEachBatch(
603
+ withHeartbeat(
604
+ adapter.streamExport({
605
+ entityType: run.entityType,
606
+ cursor: run.cursor ?? void 0,
607
+ batchSize,
608
+ credentials,
609
+ mapping,
610
+ scope: { organizationId: scope.organizationId, tenantId: scope.tenantId },
611
+ runId: run.id,
612
+ parameters: run.parameters ?? {}
613
+ }),
614
+ makeHeartbeatTick(run.progressJobId, scope),
615
+ HEARTBEAT_TICK_MS
616
+ ),
617
+ {
618
+ spanName: "data_sync.export.batch",
619
+ drainSpanName: "data_sync.export.drain",
620
+ attributes: spanAttributes,
621
+ linkTo: runTrace
622
+ },
623
+ async (batch, span) => {
624
+ span.setAttributes({
625
+ "data_sync.batch_index": batch.batchIndex,
626
+ "data_sync.batch_size": batch.results.length
627
+ });
628
+ if (run.progressJobId && await progressService.isCancellationRequested(run.progressJobId, scope.tenantId, scope.organizationId)) {
629
+ await finalizeRun(run.id, "cancelled", scope, void 0, operationalTelemetry);
630
+ return "stop";
610
631
  }
611
- });
612
- }
632
+ const delta = applyExportCounters(batch);
633
+ processedCount += delta.processedCount;
634
+ span.setAttributes({
635
+ "data_sync.processed_count": delta.processedCount,
636
+ "data_sync.updated_count": delta.updatedCount,
637
+ "data_sync.skipped_count": delta.skippedCount,
638
+ "data_sync.failed_count": delta.failedCount
639
+ });
640
+ await syncRunService.commitBatchProgress(
641
+ run.id,
642
+ {
643
+ createdCount: 0,
644
+ updatedCount: delta.updatedCount,
645
+ skippedCount: delta.skippedCount,
646
+ failedCount: delta.failedCount,
647
+ batchesCompleted: 1
648
+ },
649
+ batch.cursor,
650
+ scope,
651
+ { expectedBatchesCompleted: committedBatches, persistSharedCursor }
652
+ );
653
+ committedBatches += 1;
654
+ await updateProgress(run.progressJobId, processedCount, null, scope);
655
+ await logExportItemFailures(run.id, run.integrationId, batch.results, scope);
656
+ await writeOperationalLog({
657
+ integrationId: run.integrationId,
658
+ runId: run.id,
659
+ level: "info",
660
+ message: `Processed export batch ${batch.batchIndex}`,
661
+ scope,
662
+ enabled: operationalTelemetry,
663
+ payload: {
664
+ operationalStatus: "running",
665
+ summary: `Processed ${processedCount} export items so far.`,
666
+ processedCount,
667
+ batchSize: batch.results.length,
668
+ cursor: batch.cursor
669
+ }
670
+ });
671
+ return "continue";
672
+ }
673
+ );
674
+ if (streamResult === "stopped") return;
613
675
  } catch (error) {
614
676
  if (error instanceof SyncRunOwnershipConflictError) {
615
677
  logger.warn("Yielding export run to a concurrent worker that already advanced it", {