@open-mercato/core 0.6.7 → 0.6.8-develop.6875.1.871a4afc94

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 (1508) hide show
  1. package/.turbo/turbo-build.log +2 -2
  2. package/AGENTS.md +3 -3
  3. package/agentic/standalone-guide.md +13 -0
  4. package/dist/bootstrap.js +16 -1
  5. package/dist/bootstrap.js.map +2 -2
  6. package/dist/generated/entities/attachment_quota_reservation/index.js +33 -0
  7. package/dist/generated/entities/attachment_quota_reservation/index.js.map +7 -0
  8. package/dist/generated/entities/customer_deal_person_link/index.js +2 -0
  9. package/dist/generated/entities/customer_deal_person_link/index.js.map +2 -2
  10. package/dist/generated/entities/customer_user_invitation/index.js +2 -0
  11. package/dist/generated/entities/customer_user_invitation/index.js.map +2 -2
  12. package/dist/generated/entities/gateway_payment_operation/index.js +2 -0
  13. package/dist/generated/entities/gateway_payment_operation/index.js.map +2 -2
  14. package/dist/generated/entities/gateway_transaction/index.js +2 -0
  15. package/dist/generated/entities/gateway_transaction/index.js.map +2 -2
  16. package/dist/generated/entities/organization/index.js +2 -0
  17. package/dist/generated/entities/organization/index.js.map +2 -2
  18. package/dist/generated/entities/resources_resource/index.js +2 -0
  19. package/dist/generated/entities/resources_resource/index.js.map +2 -2
  20. package/dist/generated/entities.ids.generated.js +3 -1
  21. package/dist/generated/entities.ids.generated.js.map +2 -2
  22. package/dist/generated/entity-fields-registry.js +23 -0
  23. package/dist/generated/entity-fields-registry.js.map +2 -2
  24. package/dist/helpers/integration/salesFixtures.js +31 -2
  25. package/dist/helpers/integration/salesFixtures.js.map +2 -2
  26. package/dist/helpers/integration/salesUi.js +5 -0
  27. package/dist/helpers/integration/salesUi.js.map +2 -2
  28. package/dist/modules/api_keys/backend/api-keys/page.js +2 -1
  29. package/dist/modules/api_keys/backend/api-keys/page.js.map +2 -2
  30. package/dist/modules/api_keys/extension-points.js +16 -0
  31. package/dist/modules/api_keys/extension-points.js.map +7 -0
  32. package/dist/modules/attachments/api/route.js +120 -10
  33. package/dist/modules/attachments/api/route.js.map +2 -2
  34. package/dist/modules/attachments/backend/config/attachments/page.js +1 -1
  35. package/dist/modules/attachments/backend/config/attachments/page.js.map +2 -2
  36. package/dist/modules/attachments/data/entities.js +67 -1
  37. package/dist/modules/attachments/data/entities.js.map +2 -2
  38. package/dist/modules/attachments/di.js +7 -1
  39. package/dist/modules/attachments/di.js.map +2 -2
  40. package/dist/modules/attachments/fields/attachment.js +1 -1
  41. package/dist/modules/attachments/fields/attachment.js.map +2 -2
  42. package/dist/modules/attachments/lib/drivers/index.js.map +1 -1
  43. package/dist/modules/attachments/lib/drivers/localDriver.js +19 -6
  44. package/dist/modules/attachments/lib/drivers/localDriver.js.map +2 -2
  45. package/dist/modules/attachments/lib/quota-recovery-queue.js +9 -0
  46. package/dist/modules/attachments/lib/quota-recovery-queue.js.map +7 -0
  47. package/dist/modules/attachments/lib/quota-service.js +224 -0
  48. package/dist/modules/attachments/lib/quota-service.js.map +7 -0
  49. package/dist/modules/attachments/lib/upload-limits.js +33 -0
  50. package/dist/modules/attachments/lib/upload-limits.js.map +2 -2
  51. package/dist/modules/attachments/migrations/Migration20260709234741_attachments.js +13 -0
  52. package/dist/modules/attachments/migrations/Migration20260709234741_attachments.js.map +7 -0
  53. package/dist/modules/attachments/workers/quota-recovery.js +45 -0
  54. package/dist/modules/attachments/workers/quota-recovery.js.map +7 -0
  55. package/dist/modules/audit_logs/api/audit-logs/access/route.js +5 -1
  56. package/dist/modules/audit_logs/api/audit-logs/access/route.js.map +2 -2
  57. package/dist/modules/audit_logs/api/audit-logs/actions/export/route.js +5 -1
  58. package/dist/modules/audit_logs/api/audit-logs/actions/export/route.js.map +2 -2
  59. package/dist/modules/audit_logs/api/audit-logs/actions/route.js +5 -1
  60. package/dist/modules/audit_logs/api/audit-logs/actions/route.js.map +2 -2
  61. package/dist/modules/audit_logs/api/audit-logs/readScope.js +12 -0
  62. package/dist/modules/audit_logs/api/audit-logs/readScope.js.map +7 -0
  63. package/dist/modules/audit_logs/components/AccessLogsTable.js +2 -1
  64. package/dist/modules/audit_logs/components/AccessLogsTable.js.map +2 -2
  65. package/dist/modules/audit_logs/components/AuditLogsActions.js +3 -2
  66. package/dist/modules/audit_logs/components/AuditLogsActions.js.map +2 -2
  67. package/dist/modules/audit_logs/extension-points.js +14 -0
  68. package/dist/modules/audit_logs/extension-points.js.map +7 -0
  69. package/dist/modules/auth/api/admin/nav.js +17 -4
  70. package/dist/modules/auth/api/admin/nav.js.map +2 -2
  71. package/dist/modules/auth/api/profile/route.js +8 -2
  72. package/dist/modules/auth/api/profile/route.js.map +2 -2
  73. package/dist/modules/auth/api/users/route.js +8 -19
  74. package/dist/modules/auth/api/users/route.js.map +2 -2
  75. package/dist/modules/auth/backend/auth/profile/page.js.map +2 -2
  76. package/dist/modules/auth/backend/profile/change-password/page.js.map +2 -2
  77. package/dist/modules/auth/backend/roles/page.js +2 -1
  78. package/dist/modules/auth/backend/roles/page.js.map +2 -2
  79. package/dist/modules/auth/backend/settings/page.js +14 -9
  80. package/dist/modules/auth/backend/settings/page.js.map +2 -2
  81. package/dist/modules/auth/backend/users/page.js +2 -1
  82. package/dist/modules/auth/backend/users/page.js.map +2 -2
  83. package/dist/modules/auth/cli.js +1 -1
  84. package/dist/modules/auth/cli.js.map +2 -2
  85. package/dist/modules/auth/components/UserConsentsPanel.js +9 -9
  86. package/dist/modules/auth/components/UserConsentsPanel.js.map +2 -2
  87. package/dist/modules/auth/extension-points.js +21 -0
  88. package/dist/modules/auth/extension-points.js.map +7 -0
  89. package/dist/modules/auth/frontend/login.js +7 -3
  90. package/dist/modules/auth/frontend/login.js.map +2 -2
  91. package/dist/modules/auth/frontend/reset.js +2 -2
  92. package/dist/modules/auth/frontend/reset.js.map +2 -2
  93. package/dist/modules/auth/lib/backendChrome.js +45 -29
  94. package/dist/modules/auth/lib/backendChrome.js.map +2 -2
  95. package/dist/modules/auth/lib/setup-app.js +17 -2
  96. package/dist/modules/auth/lib/setup-app.js.map +2 -2
  97. package/dist/modules/auth/lib/tenantAccess.js +7 -0
  98. package/dist/modules/auth/lib/tenantAccess.js.map +2 -2
  99. package/dist/modules/auth/services/rbacService.js +29 -44
  100. package/dist/modules/auth/services/rbacService.js.map +2 -2
  101. package/dist/modules/business_rules/api/openmercato-call-options/route.js +85 -0
  102. package/dist/modules/business_rules/api/openmercato-call-options/route.js.map +7 -0
  103. package/dist/modules/business_rules/api/rules/route.js +71 -4
  104. package/dist/modules/business_rules/api/rules/route.js.map +2 -2
  105. package/dist/modules/business_rules/backend/rules/page.js +2 -1
  106. package/dist/modules/business_rules/backend/rules/page.js.map +2 -2
  107. package/dist/modules/business_rules/components/ActionBuilder.js +47 -4
  108. package/dist/modules/business_rules/components/ActionBuilder.js.map +3 -3
  109. package/dist/modules/business_rules/components/ActionRow.js +106 -16
  110. package/dist/modules/business_rules/components/ActionRow.js.map +2 -2
  111. package/dist/modules/business_rules/components/ConditionRow.js +8 -4
  112. package/dist/modules/business_rules/components/ConditionRow.js.map +2 -2
  113. package/dist/modules/business_rules/components/utils/actionValidation.js +6 -0
  114. package/dist/modules/business_rules/components/utils/actionValidation.js.map +2 -2
  115. package/dist/modules/business_rules/events.js +13 -0
  116. package/dist/modules/business_rules/events.js.map +7 -0
  117. package/dist/modules/business_rules/extension-points.js +13 -0
  118. package/dist/modules/business_rules/extension-points.js.map +7 -0
  119. package/dist/modules/business_rules/lib/action-executor.js +148 -0
  120. package/dist/modules/business_rules/lib/action-executor.js.map +2 -2
  121. package/dist/modules/business_rules/lib/openmercato-call-options-types.js +5 -0
  122. package/dist/modules/business_rules/lib/openmercato-call-options-types.js.map +7 -0
  123. package/dist/modules/business_rules/lib/openmercato-call-options.js +231 -0
  124. package/dist/modules/business_rules/lib/openmercato-call-options.js.map +7 -0
  125. package/dist/modules/business_rules/lib/rule-engine.js +5 -1
  126. package/dist/modules/business_rules/lib/rule-engine.js.map +2 -2
  127. package/dist/modules/catalog/backend/catalog/products/[id]/page.js +6 -5
  128. package/dist/modules/catalog/backend/catalog/products/[id]/page.js.map +2 -2
  129. package/dist/modules/catalog/backend/catalog/products/create/page.js +7 -6
  130. package/dist/modules/catalog/backend/catalog/products/create/page.js.map +2 -2
  131. package/dist/modules/catalog/components/PriceKindSettings.js +3 -3
  132. package/dist/modules/catalog/components/PriceKindSettings.js.map +2 -2
  133. package/dist/modules/catalog/components/categories/CategoriesDataTable.js +2 -1
  134. package/dist/modules/catalog/components/categories/CategoriesDataTable.js.map +2 -2
  135. package/dist/modules/catalog/components/products/ProductCategorizeSection.js +3 -3
  136. package/dist/modules/catalog/components/products/ProductCategorizeSection.js.map +2 -2
  137. package/dist/modules/catalog/components/products/ProductMediaManager.js +1 -1
  138. package/dist/modules/catalog/components/products/ProductMediaManager.js.map +2 -2
  139. package/dist/modules/catalog/components/products/ProductsDataTable.js +3 -2
  140. package/dist/modules/catalog/components/products/ProductsDataTable.js.map +2 -2
  141. package/dist/modules/catalog/components/products/VariantBuilder.js +5 -5
  142. package/dist/modules/catalog/components/products/VariantBuilder.js.map +2 -2
  143. package/dist/modules/catalog/events.js +1 -0
  144. package/dist/modules/catalog/events.js.map +2 -2
  145. package/dist/modules/catalog/extension-points.js +27 -0
  146. package/dist/modules/catalog/extension-points.js.map +7 -0
  147. package/dist/modules/catalog/widgets/injection/product-bulk-delete/widget.js +10 -5
  148. package/dist/modules/catalog/widgets/injection/product-bulk-delete/widget.js.map +2 -2
  149. package/dist/modules/catalog/widgets/injection/product-seo/widget.js +1 -1
  150. package/dist/modules/catalog/widgets/injection/product-seo/widget.js.map +2 -2
  151. package/dist/modules/communication_channels/api/post/test-seed/route.js +52 -2
  152. package/dist/modules/communication_channels/api/post/test-seed/route.js.map +2 -2
  153. package/dist/modules/communication_channels/api/post/webhook/[provider]/route.js +11 -1
  154. package/dist/modules/communication_channels/api/post/webhook/[provider]/route.js.map +2 -2
  155. package/dist/modules/communication_channels/api/post/webhooks/gmail/route.js +11 -6
  156. package/dist/modules/communication_channels/api/post/webhooks/gmail/route.js.map +2 -2
  157. package/dist/modules/communication_channels/backend/communication_channels/channels/page.js +2 -1
  158. package/dist/modules/communication_channels/backend/communication_channels/channels/page.js.map +2 -2
  159. package/dist/modules/communication_channels/backend/profile/communication-channels/page.js +8 -7
  160. package/dist/modules/communication_channels/backend/profile/communication-channels/page.js.map +2 -2
  161. package/dist/modules/communication_channels/data/enrichers.js +4 -4
  162. package/dist/modules/communication_channels/data/enrichers.js.map +2 -2
  163. package/dist/modules/communication_channels/extension-points.js +20 -0
  164. package/dist/modules/communication_channels/extension-points.js.map +7 -0
  165. package/dist/modules/communication_channels/lib/access-control.js +2 -2
  166. package/dist/modules/communication_channels/lib/access-control.js.map +2 -2
  167. package/dist/modules/configs/backend/config/system-status/page.js +2 -1
  168. package/dist/modules/configs/backend/config/system-status/page.js.map +2 -2
  169. package/dist/modules/configs/extension-points.js +18 -0
  170. package/dist/modules/configs/extension-points.js.map +7 -0
  171. package/dist/modules/configs/lib/upgrade-actions.js +12 -0
  172. package/dist/modules/configs/lib/upgrade-actions.js.map +2 -2
  173. package/dist/modules/currencies/backend/currencies/page.js +2 -1
  174. package/dist/modules/currencies/backend/currencies/page.js.map +2 -2
  175. package/dist/modules/currencies/backend/exchange-rates/page.js +2 -1
  176. package/dist/modules/currencies/backend/exchange-rates/page.js.map +2 -2
  177. package/dist/modules/currencies/di.js +4 -0
  178. package/dist/modules/currencies/di.js.map +2 -2
  179. package/dist/modules/currencies/extension-points.js +14 -0
  180. package/dist/modules/currencies/extension-points.js.map +7 -0
  181. package/dist/modules/currencies/services/baseCurrencyService.js +42 -0
  182. package/dist/modules/currencies/services/baseCurrencyService.js.map +7 -0
  183. package/dist/modules/customer_accounts/api/admin/users/[id].js +10 -1
  184. package/dist/modules/customer_accounts/api/admin/users/[id].js.map +2 -2
  185. package/dist/modules/customer_accounts/api/admin/users-invite.js +63 -4
  186. package/dist/modules/customer_accounts/api/admin/users-invite.js.map +2 -2
  187. package/dist/modules/customer_accounts/api/invitations/accept.js +1 -2
  188. package/dist/modules/customer_accounts/api/invitations/accept.js.map +2 -2
  189. package/dist/modules/customer_accounts/api/login.js +4 -2
  190. package/dist/modules/customer_accounts/api/login.js.map +2 -2
  191. package/dist/modules/customer_accounts/api/magic-link/verify.js +4 -2
  192. package/dist/modules/customer_accounts/api/magic-link/verify.js.map +2 -2
  193. package/dist/modules/customer_accounts/api/portal/feature-check.js +5 -4
  194. package/dist/modules/customer_accounts/api/portal/feature-check.js.map +2 -2
  195. package/dist/modules/customer_accounts/api/portal/nav.js +6 -4
  196. package/dist/modules/customer_accounts/api/portal/nav.js.map +2 -2
  197. package/dist/modules/customer_accounts/api/portal/profile.js +5 -1
  198. package/dist/modules/customer_accounts/api/portal/profile.js.map +2 -2
  199. package/dist/modules/customer_accounts/api/portal/sessions-refresh.js +3 -3
  200. package/dist/modules/customer_accounts/api/portal/sessions-refresh.js.map +2 -2
  201. package/dist/modules/customer_accounts/api/portal/users-invite.js +22 -2
  202. package/dist/modules/customer_accounts/api/portal/users-invite.js.map +2 -2
  203. package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js +2 -1
  204. package/dist/modules/customer_accounts/backend/customer_accounts/roles/page.js.map +2 -2
  205. package/dist/modules/customer_accounts/backend/customer_accounts/settings/domain/components/Diagnostics.js +2 -2
  206. package/dist/modules/customer_accounts/backend/customer_accounts/settings/domain/components/Diagnostics.js.map +2 -2
  207. package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js +2 -1
  208. package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js.map +2 -2
  209. package/dist/modules/customer_accounts/data/entities.js +3 -0
  210. package/dist/modules/customer_accounts/data/entities.js.map +2 -2
  211. package/dist/modules/customer_accounts/data/validators.js +1 -0
  212. package/dist/modules/customer_accounts/data/validators.js.map +2 -2
  213. package/dist/modules/customer_accounts/emails/CustomerInvitationEmail.js +26 -0
  214. package/dist/modules/customer_accounts/emails/CustomerInvitationEmail.js.map +7 -0
  215. package/dist/modules/customer_accounts/extension-points.js +14 -0
  216. package/dist/modules/customer_accounts/extension-points.js.map +7 -0
  217. package/dist/modules/customer_accounts/lib/customerAuth.js +7 -2
  218. package/dist/modules/customer_accounts/lib/customerAuth.js.map +2 -2
  219. package/dist/modules/customer_accounts/lib/customerAuthServer.js +2 -1
  220. package/dist/modules/customer_accounts/lib/customerAuthServer.js.map +2 -2
  221. package/dist/modules/customer_accounts/lib/customerEntityOwnership.js +29 -3
  222. package/dist/modules/customer_accounts/lib/customerEntityOwnership.js.map +2 -2
  223. package/dist/modules/customer_accounts/lib/customerUrl.js +19 -10
  224. package/dist/modules/customer_accounts/lib/customerUrl.js.map +2 -2
  225. package/dist/modules/customer_accounts/lib/invitationEmail.js +35 -0
  226. package/dist/modules/customer_accounts/lib/invitationEmail.js.map +7 -0
  227. package/dist/modules/customer_accounts/migrations/Migration20260723120000_customer_accounts.js +13 -0
  228. package/dist/modules/customer_accounts/migrations/Migration20260723120000_customer_accounts.js.map +7 -0
  229. package/dist/modules/customer_accounts/services/customerInvitationService.js +32 -2
  230. package/dist/modules/customer_accounts/services/customerInvitationService.js.map +2 -2
  231. package/dist/modules/customer_accounts/services/customerRbacService.js +12 -3
  232. package/dist/modules/customer_accounts/services/customerRbacService.js.map +2 -2
  233. package/dist/modules/customer_accounts/setup.js +6 -0
  234. package/dist/modules/customer_accounts/setup.js.map +2 -2
  235. package/dist/modules/customer_accounts/subscribers/autoLinkCrm.js +47 -7
  236. package/dist/modules/customer_accounts/subscribers/autoLinkCrm.js.map +2 -2
  237. package/dist/modules/customer_accounts/widgets/injection/account-status/widget.client.js +2 -2
  238. package/dist/modules/customer_accounts/widgets/injection/account-status/widget.client.js.map +2 -2
  239. package/dist/modules/customer_accounts/widgets/injection/portal-ai-assistant-trigger/widget.client.js +1 -1
  240. package/dist/modules/customer_accounts/widgets/injection/portal-ai-assistant-trigger/widget.client.js.map +2 -2
  241. package/dist/modules/customer_accounts/widgets/injection-table.js +1 -1
  242. package/dist/modules/customer_accounts/widgets/injection-table.js.map +2 -2
  243. package/dist/modules/customers/analytics.js +4 -1
  244. package/dist/modules/customers/analytics.js.map +2 -2
  245. package/dist/modules/customers/api/companies/[id]/route.js +3 -4
  246. package/dist/modules/customers/api/companies/[id]/route.js.map +2 -2
  247. package/dist/modules/customers/api/deals/[id]/people/route.js +4 -2
  248. package/dist/modules/customers/api/deals/[id]/people/route.js.map +2 -2
  249. package/dist/modules/customers/api/deals/[id]/route.js +7 -3
  250. package/dist/modules/customers/api/deals/[id]/route.js.map +2 -2
  251. package/dist/modules/customers/api/deals/aggregate/route.js +5 -4
  252. package/dist/modules/customers/api/deals/aggregate/route.js.map +2 -2
  253. package/dist/modules/customers/api/deals/summary/route.js +14 -119
  254. package/dist/modules/customers/api/deals/summary/route.js.map +2 -2
  255. package/dist/modules/customers/api/people/[id]/companies/enriched/route.js +3 -2
  256. package/dist/modules/customers/api/people/[id]/companies/enriched/route.js.map +2 -2
  257. package/dist/modules/customers/api/utils.js +21 -24
  258. package/dist/modules/customers/api/utils.js.map +2 -2
  259. package/dist/modules/customers/backend/customers/companies/[id]/page.js +2 -1
  260. package/dist/modules/customers/backend/customers/companies/[id]/page.js.map +2 -2
  261. package/dist/modules/customers/backend/customers/companies/page.js +2 -1
  262. package/dist/modules/customers/backend/customers/companies/page.js.map +2 -2
  263. package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js +16 -5
  264. package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js.map +2 -2
  265. package/dist/modules/customers/backend/customers/deals/[id]/page.js +18 -11
  266. package/dist/modules/customers/backend/customers/deals/[id]/page.js.map +2 -2
  267. package/dist/modules/customers/backend/customers/deals/page.js +2 -1
  268. package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
  269. package/dist/modules/customers/backend/customers/deals/pipeline/components/QuickDealDialog.js +17 -3
  270. package/dist/modules/customers/backend/customers/deals/pipeline/components/QuickDealDialog.js.map +2 -2
  271. package/dist/modules/customers/backend/customers/deals/pipeline/page.js +8 -2
  272. package/dist/modules/customers/backend/customers/deals/pipeline/page.js.map +2 -2
  273. package/dist/modules/customers/backend/customers/people/[id]/page.js +2 -1
  274. package/dist/modules/customers/backend/customers/people/[id]/page.js.map +2 -2
  275. package/dist/modules/customers/backend/customers/people/page.js +2 -1
  276. package/dist/modules/customers/backend/customers/people/page.js.map +2 -2
  277. package/dist/modules/customers/backend/customers/people-v2/[id]/page.js +26 -10
  278. package/dist/modules/customers/backend/customers/people-v2/[id]/page.js.map +2 -2
  279. package/dist/modules/customers/cli.js +28 -11
  280. package/dist/modules/customers/cli.js.map +2 -2
  281. package/dist/modules/customers/commands/deals.js +48 -10
  282. package/dist/modules/customers/commands/deals.js.map +2 -2
  283. package/dist/modules/customers/commands/people.js +2 -0
  284. package/dist/modules/customers/commands/people.js.map +2 -2
  285. package/dist/modules/customers/components/CustomerTodosTable.js +2 -1
  286. package/dist/modules/customers/components/CustomerTodosTable.js.map +2 -2
  287. package/dist/modules/customers/components/calendar/CalendarEventEditor.js +1 -1
  288. package/dist/modules/customers/components/calendar/CalendarEventEditor.js.map +2 -2
  289. package/dist/modules/customers/components/detail/ActiveDealCard.js +2 -1
  290. package/dist/modules/customers/components/detail/ActiveDealCard.js.map +2 -2
  291. package/dist/modules/customers/components/detail/ActivitiesDayStrip.js +2 -3
  292. package/dist/modules/customers/components/detail/ActivitiesDayStrip.js.map +2 -2
  293. package/dist/modules/customers/components/detail/CompanyDetailTabs.js +26 -6
  294. package/dist/modules/customers/components/detail/CompanyDetailTabs.js.map +2 -2
  295. package/dist/modules/customers/components/detail/CompanyKpiBar.js +6 -5
  296. package/dist/modules/customers/components/detail/CompanyKpiBar.js.map +2 -2
  297. package/dist/modules/customers/components/detail/ConfirmDealLostDialog.js +2 -2
  298. package/dist/modules/customers/components/detail/ConfirmDealLostDialog.js.map +2 -2
  299. package/dist/modules/customers/components/detail/DealDetailTabs.js +30 -8
  300. package/dist/modules/customers/components/detail/DealDetailTabs.js.map +2 -2
  301. package/dist/modules/customers/components/detail/DealForm.js +2 -1
  302. package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
  303. package/dist/modules/customers/components/detail/DealsSection.js +1 -1
  304. package/dist/modules/customers/components/detail/DealsSection.js.map +2 -2
  305. package/dist/modules/customers/components/detail/MiniWeekCalendar.js +7 -52
  306. package/dist/modules/customers/components/detail/MiniWeekCalendar.js.map +2 -2
  307. package/dist/modules/customers/components/detail/PersonDetailTabs.js +30 -8
  308. package/dist/modules/customers/components/detail/PersonDetailTabs.js.map +2 -2
  309. package/dist/modules/customers/components/detail/ScheduleActivityDialog.js +231 -216
  310. package/dist/modules/customers/components/detail/ScheduleActivityDialog.js.map +2 -2
  311. package/dist/modules/customers/components/detail/dashboard/helpers.js +4 -3
  312. package/dist/modules/customers/components/detail/dashboard/helpers.js.map +2 -2
  313. package/dist/modules/customers/components/detail/legacyActivities.js +69 -0
  314. package/dist/modules/customers/components/detail/legacyActivities.js.map +7 -0
  315. package/dist/modules/customers/components/formConfig.js +14 -10
  316. package/dist/modules/customers/components/formConfig.js.map +2 -2
  317. package/dist/modules/customers/data/entities.js +8 -0
  318. package/dist/modules/customers/data/entities.js.map +2 -2
  319. package/dist/modules/customers/data/validators.js +5 -2
  320. package/dist/modules/customers/data/validators.js.map +2 -2
  321. package/dist/modules/customers/extension-points.js +42 -0
  322. package/dist/modules/customers/extension-points.js.map +7 -0
  323. package/dist/modules/customers/lib/calendar/format.js +8 -4
  324. package/dist/modules/customers/lib/calendar/format.js.map +2 -2
  325. package/dist/modules/customers/lib/dealStatus.js +38 -0
  326. package/dist/modules/customers/lib/dealStatus.js.map +7 -0
  327. package/dist/modules/customers/lib/dealsSummaryQueries.js +144 -0
  328. package/dist/modules/customers/lib/dealsSummaryQueries.js.map +7 -0
  329. package/dist/modules/customers/lib/optionalBaseCurrency.js +19 -0
  330. package/dist/modules/customers/lib/optionalBaseCurrency.js.map +7 -0
  331. package/dist/modules/customers/lib/visibilityFilter.js +6 -4
  332. package/dist/modules/customers/lib/visibilityFilter.js.map +2 -2
  333. package/dist/modules/customers/migrations/Migration20260723210000_customers.js +15 -0
  334. package/dist/modules/customers/migrations/Migration20260723210000_customers.js.map +7 -0
  335. package/dist/modules/customers/search.js +50 -29
  336. package/dist/modules/customers/search.js.map +2 -2
  337. package/dist/modules/customers/utils/phoneDuplicates.js +1 -2
  338. package/dist/modules/customers/utils/phoneDuplicates.js.map +2 -2
  339. package/dist/modules/dashboards/api/layout/[itemId]/route.js +6 -3
  340. package/dist/modules/dashboards/api/layout/[itemId]/route.js.map +2 -2
  341. package/dist/modules/dashboards/api/layout/route.js +22 -9
  342. package/dist/modules/dashboards/api/layout/route.js.map +2 -2
  343. package/dist/modules/dashboards/api/roles/widgets/route.js +9 -3
  344. package/dist/modules/dashboards/api/roles/widgets/route.js.map +2 -2
  345. package/dist/modules/dashboards/api/users/widgets/route.js +9 -3
  346. package/dist/modules/dashboards/api/users/widgets/route.js.map +2 -2
  347. package/dist/modules/dashboards/api/widgets/catalog.js +6 -3
  348. package/dist/modules/dashboards/api/widgets/catalog.js.map +2 -2
  349. package/dist/modules/dashboards/api/widgets/data/batch/route.js +12 -3
  350. package/dist/modules/dashboards/api/widgets/data/batch/route.js.map +2 -2
  351. package/dist/modules/dashboards/api/widgets/data/route.js +28 -3
  352. package/dist/modules/dashboards/api/widgets/data/route.js.map +2 -2
  353. package/dist/modules/dashboards/api/widgets/data/schema.js +28 -18
  354. package/dist/modules/dashboards/api/widgets/data/schema.js.map +2 -2
  355. package/dist/modules/dashboards/components/UnlabelledAmountNotice.js +33 -0
  356. package/dist/modules/dashboards/components/UnlabelledAmountNotice.js.map +7 -0
  357. package/dist/modules/dashboards/lib/access.js +5 -3
  358. package/dist/modules/dashboards/lib/access.js.map +2 -2
  359. package/dist/modules/dashboards/lib/aggregations.js +113 -46
  360. package/dist/modules/dashboards/lib/aggregations.js.map +2 -2
  361. package/dist/modules/dashboards/lib/exactDecimal.js +69 -0
  362. package/dist/modules/dashboards/lib/exactDecimal.js.map +7 -0
  363. package/dist/modules/dashboards/lib/formatters.js +84 -11
  364. package/dist/modules/dashboards/lib/formatters.js.map +2 -2
  365. package/dist/modules/dashboards/lib/optionalBaseCurrency.js +11 -0
  366. package/dist/modules/dashboards/lib/optionalBaseCurrency.js.map +7 -0
  367. package/dist/modules/dashboards/services/widgetDataService.js +316 -14
  368. package/dist/modules/dashboards/services/widgetDataService.js.map +2 -2
  369. package/dist/modules/dashboards/subscribers/invalidateWidgetDataCache.js +26 -0
  370. package/dist/modules/dashboards/subscribers/invalidateWidgetDataCache.js.map +7 -0
  371. package/dist/modules/dashboards/widgets/dashboard/aov-kpi/widget.client.js +9 -3
  372. package/dist/modules/dashboards/widgets/dashboard/aov-kpi/widget.client.js.map +2 -2
  373. package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/config.js +52 -2
  374. package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/config.js.map +2 -2
  375. package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/widget.client.js +52 -30
  376. package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/widget.client.js.map +2 -2
  377. package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/widget.js +2 -2
  378. package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/widget.js.map +2 -2
  379. package/dist/modules/dashboards/widgets/dashboard/revenue-kpi/widget.client.js +9 -3
  380. package/dist/modules/dashboards/widgets/dashboard/revenue-kpi/widget.client.js.map +2 -2
  381. package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.js +8 -3
  382. package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.js.map +2 -2
  383. package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.js +26 -18
  384. package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.js.map +2 -2
  385. package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.client.js +22 -14
  386. package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.client.js.map +2 -2
  387. package/dist/modules/dashboards/widgets/dashboard/top-products/widget.client.js +10 -4
  388. package/dist/modules/dashboards/widgets/dashboard/top-products/widget.client.js.map +2 -2
  389. package/dist/modules/data_sync/api/mappings/[id]/route.js +22 -9
  390. package/dist/modules/data_sync/api/mappings/[id]/route.js.map +2 -2
  391. package/dist/modules/data_sync/api/mappings/route.js +13 -4
  392. package/dist/modules/data_sync/api/mappings/route.js.map +2 -2
  393. package/dist/modules/data_sync/api/options.js +7 -2
  394. package/dist/modules/data_sync/api/options.js.map +2 -2
  395. package/dist/modules/data_sync/api/run.js +7 -2
  396. package/dist/modules/data_sync/api/run.js.map +2 -2
  397. package/dist/modules/data_sync/api/runs/[id]/cancel.js +8 -3
  398. package/dist/modules/data_sync/api/runs/[id]/cancel.js.map +2 -2
  399. package/dist/modules/data_sync/api/runs/[id]/retry.js +7 -2
  400. package/dist/modules/data_sync/api/runs/[id]/retry.js.map +2 -2
  401. package/dist/modules/data_sync/api/runs/[id]/route.js +8 -3
  402. package/dist/modules/data_sync/api/runs/[id]/route.js.map +2 -2
  403. package/dist/modules/data_sync/api/runs.js +7 -2
  404. package/dist/modules/data_sync/api/runs.js.map +2 -2
  405. package/dist/modules/data_sync/api/schedules/[id]/route.js +19 -6
  406. package/dist/modules/data_sync/api/schedules/[id]/route.js.map +2 -2
  407. package/dist/modules/data_sync/api/schedules/route.js +13 -4
  408. package/dist/modules/data_sync/api/schedules/route.js.map +2 -2
  409. package/dist/modules/data_sync/api/validate.js +9 -4
  410. package/dist/modules/data_sync/api/validate.js.map +2 -2
  411. package/dist/modules/data_sync/backend/data-sync/page.js +5 -4
  412. package/dist/modules/data_sync/backend/data-sync/page.js.map +2 -2
  413. package/dist/modules/data_sync/components/IntegrationScheduleTab.js +5 -5
  414. package/dist/modules/data_sync/components/IntegrationScheduleTab.js.map +2 -2
  415. package/dist/modules/data_sync/extension-points.js +13 -0
  416. package/dist/modules/data_sync/extension-points.js.map +7 -0
  417. package/dist/modules/data_sync/lib/queue-policy.js +15 -0
  418. package/dist/modules/data_sync/lib/queue-policy.js.map +7 -0
  419. package/dist/modules/data_sync/lib/queue.js +16 -1
  420. package/dist/modules/data_sync/lib/queue.js.map +2 -2
  421. package/dist/modules/data_sync/lib/start-run.js +2 -1
  422. package/dist/modules/data_sync/lib/start-run.js.map +2 -2
  423. package/dist/modules/data_sync/lib/sync-engine.js +35 -2
  424. package/dist/modules/data_sync/lib/sync-engine.js.map +2 -2
  425. package/dist/modules/data_sync/lib/sync-run-service.js +70 -2
  426. package/dist/modules/data_sync/lib/sync-run-service.js.map +2 -2
  427. package/dist/modules/data_sync/workers/sync-export.js +9 -2
  428. package/dist/modules/data_sync/workers/sync-export.js.map +2 -2
  429. package/dist/modules/data_sync/workers/sync-import.js +9 -2
  430. package/dist/modules/data_sync/workers/sync-import.js.map +2 -2
  431. package/dist/modules/design_system/acl.js +9 -0
  432. package/dist/modules/design_system/acl.js.map +7 -0
  433. package/dist/modules/design_system/backend/design-system/page.js +11 -0
  434. package/dist/modules/design_system/backend/design-system/page.js.map +7 -0
  435. package/dist/modules/design_system/backend/design-system/page.meta.js +15 -0
  436. package/dist/modules/design_system/backend/design-system/page.meta.js.map +7 -0
  437. package/dist/modules/design_system/gallery/components/CodeSnippet.js +52 -0
  438. package/dist/modules/design_system/gallery/components/CodeSnippet.js.map +7 -0
  439. package/dist/modules/design_system/gallery/components/EntryCard.js +63 -0
  440. package/dist/modules/design_system/gallery/components/EntryCard.js.map +7 -0
  441. package/dist/modules/design_system/gallery/components/GalleryShell.js +163 -0
  442. package/dist/modules/design_system/gallery/components/GalleryShell.js.map +7 -0
  443. package/dist/modules/design_system/gallery/components/VariantPreview.js +9 -0
  444. package/dist/modules/design_system/gallery/components/VariantPreview.js.map +7 -0
  445. package/dist/modules/design_system/gallery/entries/banners.js +186 -0
  446. package/dist/modules/design_system/gallery/entries/banners.js.map +7 -0
  447. package/dist/modules/design_system/gallery/entries/buttons.js +361 -0
  448. package/dist/modules/design_system/gallery/entries/buttons.js.map +7 -0
  449. package/dist/modules/design_system/gallery/entries/charts.js +457 -0
  450. package/dist/modules/design_system/gallery/entries/charts.js.map +7 -0
  451. package/dist/modules/design_system/gallery/entries/dates.js +306 -0
  452. package/dist/modules/design_system/gallery/entries/dates.js.map +7 -0
  453. package/dist/modules/design_system/gallery/entries/detail.js +358 -0
  454. package/dist/modules/design_system/gallery/entries/detail.js.map +7 -0
  455. package/dist/modules/design_system/gallery/entries/display.js +785 -0
  456. package/dist/modules/design_system/gallery/entries/display.js.map +7 -0
  457. package/dist/modules/design_system/gallery/entries/feedback.js +658 -0
  458. package/dist/modules/design_system/gallery/entries/feedback.js.map +7 -0
  459. package/dist/modules/design_system/gallery/entries/filters.js +505 -0
  460. package/dist/modules/design_system/gallery/entries/filters.js.map +7 -0
  461. package/dist/modules/design_system/gallery/entries/foundations.js +453 -0
  462. package/dist/modules/design_system/gallery/entries/foundations.js.map +7 -0
  463. package/dist/modules/design_system/gallery/entries/icons.js +140 -0
  464. package/dist/modules/design_system/gallery/entries/icons.js.map +7 -0
  465. package/dist/modules/design_system/gallery/entries/inputs.js +1217 -0
  466. package/dist/modules/design_system/gallery/entries/inputs.js.map +7 -0
  467. package/dist/modules/design_system/gallery/entries/messages.js +334 -0
  468. package/dist/modules/design_system/gallery/entries/messages.js.map +7 -0
  469. package/dist/modules/design_system/gallery/entries/navigation.js +475 -0
  470. package/dist/modules/design_system/gallery/entries/navigation.js.map +7 -0
  471. package/dist/modules/design_system/gallery/entries/notifications.js +257 -0
  472. package/dist/modules/design_system/gallery/entries/notifications.js.map +7 -0
  473. package/dist/modules/design_system/gallery/entries/overlays.js +576 -0
  474. package/dist/modules/design_system/gallery/entries/overlays.js.map +7 -0
  475. package/dist/modules/design_system/gallery/entries/scaffolding.js +378 -0
  476. package/dist/modules/design_system/gallery/entries/scaffolding.js.map +7 -0
  477. package/dist/modules/design_system/gallery/entries/schedule.js +297 -0
  478. package/dist/modules/design_system/gallery/entries/schedule.js.map +7 -0
  479. package/dist/modules/design_system/gallery/registry.js +139 -0
  480. package/dist/modules/design_system/gallery/registry.js.map +7 -0
  481. package/dist/modules/design_system/gallery/types.js +1 -0
  482. package/dist/modules/design_system/gallery/types.js.map +7 -0
  483. package/dist/modules/design_system/index.js +9 -0
  484. package/dist/modules/design_system/index.js.map +7 -0
  485. package/dist/modules/design_system/setup.js +14 -0
  486. package/dist/modules/design_system/setup.js.map +7 -0
  487. package/dist/modules/dictionaries/api/[dictionaryId]/entries/route.js +34 -12
  488. package/dist/modules/dictionaries/api/[dictionaryId]/entries/route.js.map +2 -2
  489. package/dist/modules/dictionaries/api/openapi.js +15 -2
  490. package/dist/modules/dictionaries/api/openapi.js.map +2 -2
  491. package/dist/modules/dictionaries/components/DictionaryEntrySelect.js +1 -1
  492. package/dist/modules/dictionaries/components/DictionaryEntrySelect.js.map +2 -2
  493. package/dist/modules/dictionaries/components/hooks/useDictionaryEntries.js +30 -29
  494. package/dist/modules/dictionaries/components/hooks/useDictionaryEntries.js.map +2 -2
  495. package/dist/modules/dictionaries/data/validators.js +7 -0
  496. package/dist/modules/dictionaries/data/validators.js.map +2 -2
  497. package/dist/modules/dictionaries/lib/clientEntries.js +4 -3
  498. package/dist/modules/dictionaries/lib/clientEntries.js.map +2 -2
  499. package/dist/modules/dictionaries/lib/fetchAllEntries.js +43 -0
  500. package/dist/modules/dictionaries/lib/fetchAllEntries.js.map +7 -0
  501. package/dist/modules/directory/api/organization-branding/route.js +10 -3
  502. package/dist/modules/directory/api/organization-branding/route.js.map +2 -2
  503. package/dist/modules/directory/api/organization-switcher/route.js +84 -20
  504. package/dist/modules/directory/api/organization-switcher/route.js.map +2 -2
  505. package/dist/modules/directory/api/organizations/route.js +7 -0
  506. package/dist/modules/directory/api/organizations/route.js.map +3 -3
  507. package/dist/modules/directory/api/tenants/route.js +8 -2
  508. package/dist/modules/directory/api/tenants/route.js.map +2 -2
  509. package/dist/modules/directory/backend/directory/branding/page.js +31 -8
  510. package/dist/modules/directory/backend/directory/branding/page.js.map +2 -2
  511. package/dist/modules/directory/backend/directory/organizations/[id]/edit/page.js +7 -16
  512. package/dist/modules/directory/backend/directory/organizations/[id]/edit/page.js.map +2 -2
  513. package/dist/modules/directory/backend/directory/organizations/page.js +2 -1
  514. package/dist/modules/directory/backend/directory/organizations/page.js.map +2 -2
  515. package/dist/modules/directory/backend/directory/tenants/page.js +2 -1
  516. package/dist/modules/directory/backend/directory/tenants/page.js.map +2 -2
  517. package/dist/modules/directory/commands/organizations.js +8 -1
  518. package/dist/modules/directory/commands/organizations.js.map +2 -2
  519. package/dist/modules/directory/commands/tenants.js +6 -0
  520. package/dist/modules/directory/commands/tenants.js.map +2 -2
  521. package/dist/modules/directory/data/entities.js +4 -0
  522. package/dist/modules/directory/data/entities.js.map +2 -2
  523. package/dist/modules/directory/data/validators.js +2 -0
  524. package/dist/modules/directory/data/validators.js.map +2 -2
  525. package/dist/modules/directory/extension-points.js +14 -0
  526. package/dist/modules/directory/extension-points.js.map +7 -0
  527. package/dist/modules/directory/migrations/Migration20260626145500_directory_logo_preserve_aspect_ratio.js +13 -0
  528. package/dist/modules/directory/migrations/Migration20260626145500_directory_logo_preserve_aspect_ratio.js.map +7 -0
  529. package/dist/modules/directory/subscribers/invalidateOrgScopeCache.js +5 -1
  530. package/dist/modules/directory/subscribers/invalidateOrgScopeCache.js.map +2 -2
  531. package/dist/modules/directory/utils/organizationScope.js +11 -3
  532. package/dist/modules/directory/utils/organizationScope.js.map +2 -2
  533. package/dist/modules/entities/api/definitions.js +53 -3
  534. package/dist/modules/entities/api/definitions.js.map +2 -2
  535. package/dist/modules/entities/api/entities.js +21 -2
  536. package/dist/modules/entities/api/entities.js.map +2 -2
  537. package/dist/modules/entities/api/entity-settings.js +59 -9
  538. package/dist/modules/entities/api/entity-settings.js.map +2 -2
  539. package/dist/modules/entities/api/records.js +11 -28
  540. package/dist/modules/entities/api/records.js.map +2 -2
  541. package/dist/modules/entities/api/sidebar-entities.js +34 -12
  542. package/dist/modules/entities/api/sidebar-entities.js.map +2 -2
  543. package/dist/modules/entities/backend/config/settings/page.js +10 -0
  544. package/dist/modules/entities/backend/config/settings/page.js.map +7 -0
  545. package/dist/modules/entities/backend/config/settings/page.meta.js +36 -0
  546. package/dist/modules/entities/backend/config/settings/page.meta.js.map +7 -0
  547. package/dist/modules/entities/backend/entities/user/[entityId]/page.js +1 -1
  548. package/dist/modules/entities/backend/entities/user/[entityId]/page.js.map +2 -2
  549. package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js +23 -4
  550. package/dist/modules/entities/backend/entities/user/[entityId]/records/page.js.map +2 -2
  551. package/dist/modules/entities/backend/entities/user/create/page.js +16 -7
  552. package/dist/modules/entities/backend/entities/user/create/page.js.map +2 -2
  553. package/dist/modules/entities/cli.js +193 -19
  554. package/dist/modules/entities/cli.js.map +2 -2
  555. package/dist/modules/entities/components/EntitySettingsManager.js +136 -0
  556. package/dist/modules/entities/components/EntitySettingsManager.js.map +7 -0
  557. package/dist/modules/entities/components/RecordListRelationCell.js +63 -0
  558. package/dist/modules/entities/components/RecordListRelationCell.js.map +7 -0
  559. package/dist/modules/entities/components/SystemEntitiesTable.js +2 -1
  560. package/dist/modules/entities/components/SystemEntitiesTable.js.map +2 -2
  561. package/dist/modules/entities/components/UserEntitiesTable.js +2 -1
  562. package/dist/modules/entities/components/UserEntitiesTable.js.map +2 -2
  563. package/dist/modules/entities/components/recordListRelationDisplays.js +80 -0
  564. package/dist/modules/entities/components/recordListRelationDisplays.js.map +7 -0
  565. package/dist/modules/entities/extension-points.js +21 -0
  566. package/dist/modules/entities/extension-points.js.map +7 -0
  567. package/dist/modules/entities/lib/entityAcl.js +87 -9
  568. package/dist/modules/entities/lib/entityAcl.js.map +3 -3
  569. package/dist/modules/feature_toggles/components/FeatureGuard.js +3 -2
  570. package/dist/modules/feature_toggles/components/FeatureGuard.js.map +2 -2
  571. package/dist/modules/feature_toggles/components/FeatureToggleOverrideCard.js +1 -1
  572. package/dist/modules/feature_toggles/components/FeatureToggleOverrideCard.js.map +2 -2
  573. package/dist/modules/feature_toggles/components/hooks/staleTime.js +5 -0
  574. package/dist/modules/feature_toggles/components/hooks/staleTime.js.map +7 -0
  575. package/dist/modules/feature_toggles/components/hooks/useFeatureFlagBoolean.js +5 -2
  576. package/dist/modules/feature_toggles/components/hooks/useFeatureFlagBoolean.js.map +2 -2
  577. package/dist/modules/feature_toggles/components/hooks/useFeatureFlagJson.js +5 -2
  578. package/dist/modules/feature_toggles/components/hooks/useFeatureFlagJson.js.map +2 -2
  579. package/dist/modules/feature_toggles/components/hooks/useFeatureFlagNumber.js +5 -2
  580. package/dist/modules/feature_toggles/components/hooks/useFeatureFlagNumber.js.map +2 -2
  581. package/dist/modules/feature_toggles/components/hooks/useFeatureFlagString.js +5 -2
  582. package/dist/modules/feature_toggles/components/hooks/useFeatureFlagString.js.map +2 -2
  583. package/dist/modules/inbox_ops/ai-tools.js +5 -2
  584. package/dist/modules/inbox_ops/ai-tools.js.map +2 -2
  585. package/dist/modules/inbox_ops/api/proposals/[id]/actions/[actionId]/route.js +14 -1
  586. package/dist/modules/inbox_ops/api/proposals/[id]/actions/[actionId]/route.js.map +2 -2
  587. package/dist/modules/inbox_ops/api/proposals/route.js +16 -1
  588. package/dist/modules/inbox_ops/api/proposals/route.js.map +2 -2
  589. package/dist/modules/inbox_ops/api/webhook/inbound.js +14 -10
  590. package/dist/modules/inbox_ops/api/webhook/inbound.js.map +2 -2
  591. package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js +6 -6
  592. package/dist/modules/inbox_ops/backend/inbox-ops/log/page.js.map +2 -2
  593. package/dist/modules/inbox_ops/components/proposals/EditActionDialog.js +25 -20
  594. package/dist/modules/inbox_ops/components/proposals/EditActionDialog.js.map +2 -2
  595. package/dist/modules/inbox_ops/search.js +15 -4
  596. package/dist/modules/inbox_ops/search.js.map +2 -2
  597. package/dist/modules/inbox_ops/subscribers/search-reindex-proposal-created.js +32 -0
  598. package/dist/modules/inbox_ops/subscribers/search-reindex-proposal-created.js.map +7 -0
  599. package/dist/modules/integrations/api/[id]/credentials/route.js +11 -5
  600. package/dist/modules/integrations/api/[id]/credentials/route.js.map +2 -2
  601. package/dist/modules/integrations/api/[id]/health/route.js +6 -3
  602. package/dist/modules/integrations/api/[id]/health/route.js.map +2 -2
  603. package/dist/modules/integrations/api/[id]/route.js +6 -3
  604. package/dist/modules/integrations/api/[id]/route.js.map +2 -2
  605. package/dist/modules/integrations/api/[id]/state/route.js +6 -3
  606. package/dist/modules/integrations/api/[id]/state/route.js.map +2 -2
  607. package/dist/modules/integrations/api/[id]/version/route.js +6 -3
  608. package/dist/modules/integrations/api/[id]/version/route.js.map +2 -2
  609. package/dist/modules/integrations/api/logs/route.js +6 -3
  610. package/dist/modules/integrations/api/logs/route.js.map +2 -2
  611. package/dist/modules/integrations/api/route.js +6 -3
  612. package/dist/modules/integrations/api/route.js.map +2 -2
  613. package/dist/modules/integrations/api/umes-read.js +2 -2
  614. package/dist/modules/integrations/api/umes-read.js.map +2 -2
  615. package/dist/modules/integrations/backend/integrations/[id]/page.js +2 -4
  616. package/dist/modules/integrations/backend/integrations/[id]/page.js.map +2 -2
  617. package/dist/modules/integrations/extension-points.js +30 -0
  618. package/dist/modules/integrations/extension-points.js.map +7 -0
  619. package/dist/modules/integrations/lib/organization-scope.js +2 -9
  620. package/dist/modules/integrations/lib/organization-scope.js.map +2 -2
  621. package/dist/modules/integrations/widgets/injection/external-ids/widget.client.js +0 -5
  622. package/dist/modules/integrations/widgets/injection/external-ids/widget.client.js.map +2 -2
  623. package/dist/modules/integrations/widgets/injection/external-ids/widget.js +14 -0
  624. package/dist/modules/integrations/widgets/injection/external-ids/widget.js.map +7 -0
  625. package/dist/modules/messages/api/[id]/route.js +15 -0
  626. package/dist/modules/messages/api/[id]/route.js.map +2 -2
  627. package/dist/modules/messages/api/route.js +77 -8
  628. package/dist/modules/messages/api/route.js.map +2 -2
  629. package/dist/modules/messages/components/ComposeMessagePageClient.js +2 -1
  630. package/dist/modules/messages/components/ComposeMessagePageClient.js.map +2 -2
  631. package/dist/modules/messages/components/MessageDetailPageClient.js +3 -2
  632. package/dist/modules/messages/components/MessageDetailPageClient.js.map +2 -2
  633. package/dist/modules/messages/components/MessagesInboxPageClient.js +2 -1
  634. package/dist/modules/messages/components/MessagesInboxPageClient.js.map +2 -2
  635. package/dist/modules/messages/components/message-detail/panels/dialogs.js +1 -1
  636. package/dist/modules/messages/components/message-detail/panels/dialogs.js.map +1 -1
  637. package/dist/modules/messages/extension-points.js +16 -0
  638. package/dist/modules/messages/extension-points.js.map +7 -0
  639. package/dist/modules/messages/lib/participantScope.js +15 -0
  640. package/dist/modules/messages/lib/participantScope.js.map +7 -0
  641. package/dist/modules/messages/lib/routeHelpers.js +1 -3
  642. package/dist/modules/messages/lib/routeHelpers.js.map +2 -2
  643. package/dist/modules/messages/lib/searchLookup.js +8 -16
  644. package/dist/modules/messages/lib/searchLookup.js.map +2 -2
  645. package/dist/modules/messages/search.js +10 -5
  646. package/dist/modules/messages/search.js.map +2 -2
  647. package/dist/modules/notifications/api/route.js +83 -4
  648. package/dist/modules/notifications/api/route.js.map +2 -2
  649. package/dist/modules/notifications/api/unread-count/route.js +25 -6
  650. package/dist/modules/notifications/api/unread-count/route.js.map +2 -2
  651. package/dist/modules/notifications/di.js +1 -1
  652. package/dist/modules/notifications/di.js.map +2 -2
  653. package/dist/modules/notifications/events.js +4 -2
  654. package/dist/modules/notifications/events.js.map +2 -2
  655. package/dist/modules/notifications/lib/notificationRecipients.js +6 -7
  656. package/dist/modules/notifications/lib/notificationRecipients.js.map +2 -2
  657. package/dist/modules/notifications/lib/notificationScope.js +26 -0
  658. package/dist/modules/notifications/lib/notificationScope.js.map +7 -0
  659. package/dist/modules/notifications/lib/notificationService.js +48 -4
  660. package/dist/modules/notifications/lib/notificationService.js.map +2 -2
  661. package/dist/modules/notifications/lib/routeHelpers.js +16 -2
  662. package/dist/modules/notifications/lib/routeHelpers.js.map +2 -2
  663. package/dist/modules/payment_gateways/api/capture/route.js +1 -1
  664. package/dist/modules/payment_gateways/api/capture/route.js.map +2 -2
  665. package/dist/modules/payment_gateways/api/sessions/route.js +6 -3
  666. package/dist/modules/payment_gateways/api/sessions/route.js.map +2 -2
  667. package/dist/modules/payment_gateways/api/webhook/[provider]/route.js +11 -1
  668. package/dist/modules/payment_gateways/api/webhook/[provider]/route.js.map +2 -2
  669. package/dist/modules/payment_gateways/backend/payment-gateways/page.js +3 -2
  670. package/dist/modules/payment_gateways/backend/payment-gateways/page.js.map +2 -2
  671. package/dist/modules/payment_gateways/data/entities.js +11 -0
  672. package/dist/modules/payment_gateways/data/entities.js.map +2 -2
  673. package/dist/modules/payment_gateways/di.js +17 -1
  674. package/dist/modules/payment_gateways/di.js.map +2 -2
  675. package/dist/modules/payment_gateways/extension-points.js +19 -0
  676. package/dist/modules/payment_gateways/extension-points.js.map +7 -0
  677. package/dist/modules/payment_gateways/lib/capture-ledger.js +183 -0
  678. package/dist/modules/payment_gateways/lib/capture-ledger.js.map +7 -0
  679. package/dist/modules/payment_gateways/lib/gateway-service.js +93 -14
  680. package/dist/modules/payment_gateways/lib/gateway-service.js.map +2 -2
  681. package/dist/modules/payment_gateways/lib/order-amount-reconciliation.js +58 -0
  682. package/dist/modules/payment_gateways/lib/order-amount-reconciliation.js.map +7 -0
  683. package/dist/modules/payment_gateways/lib/payment-operation-idempotency.js +1 -0
  684. package/dist/modules/payment_gateways/lib/payment-operation-idempotency.js.map +2 -2
  685. package/dist/modules/payment_gateways/lib/session-idempotency.js +33 -0
  686. package/dist/modules/payment_gateways/lib/session-idempotency.js.map +2 -2
  687. package/dist/modules/payment_gateways/migrations/Migration20260725101500_payment_gateways.js +16 -0
  688. package/dist/modules/payment_gateways/migrations/Migration20260725101500_payment_gateways.js.map +7 -0
  689. package/dist/modules/payment_gateways/migrations/Migration20260803103035_payment_gateways.js +18 -0
  690. package/dist/modules/payment_gateways/migrations/Migration20260803103035_payment_gateways.js.map +7 -0
  691. package/dist/modules/payment_gateways/setup.js +47 -0
  692. package/dist/modules/payment_gateways/setup.js.map +2 -2
  693. package/dist/modules/payment_gateways/workers/session-initialization-prune.js +50 -0
  694. package/dist/modules/payment_gateways/workers/session-initialization-prune.js.map +7 -0
  695. package/dist/modules/planner/components/AvailabilityRulesEditor.js +4 -4
  696. package/dist/modules/planner/components/AvailabilityRulesEditor.js.map +2 -2
  697. package/dist/modules/planner/components/unavailabilityReasons.js +3 -3
  698. package/dist/modules/planner/components/unavailabilityReasons.js.map +2 -2
  699. package/dist/modules/portal/extension-points.js +32 -0
  700. package/dist/modules/portal/extension-points.js.map +7 -0
  701. package/dist/modules/portal/frontend/[orgSlug]/portal/dashboard/page.js +3 -3
  702. package/dist/modules/portal/frontend/[orgSlug]/portal/dashboard/page.js.map +2 -2
  703. package/dist/modules/portal/frontend/[orgSlug]/portal/invite/page.js +134 -0
  704. package/dist/modules/portal/frontend/[orgSlug]/portal/invite/page.js.map +7 -0
  705. package/dist/modules/portal/frontend/[orgSlug]/portal/invite/page.meta.js +11 -0
  706. package/dist/modules/portal/frontend/[orgSlug]/portal/invite/page.meta.js.map +7 -0
  707. package/dist/modules/portal/frontend/[orgSlug]/portal/login/page.js +4 -4
  708. package/dist/modules/portal/frontend/[orgSlug]/portal/login/page.js.map +2 -2
  709. package/dist/modules/portal/frontend/[orgSlug]/portal/page.js +3 -3
  710. package/dist/modules/portal/frontend/[orgSlug]/portal/page.js.map +2 -2
  711. package/dist/modules/portal/frontend/[orgSlug]/portal/profile/page.js +3 -3
  712. package/dist/modules/portal/frontend/[orgSlug]/portal/profile/page.js.map +2 -2
  713. package/dist/modules/portal/frontend/[orgSlug]/portal/reset-password/page.js +4 -4
  714. package/dist/modules/portal/frontend/[orgSlug]/portal/reset-password/page.js.map +2 -2
  715. package/dist/modules/portal/frontend/[orgSlug]/portal/signup/page.js +4 -4
  716. package/dist/modules/portal/frontend/[orgSlug]/portal/signup/page.js.map +2 -2
  717. package/dist/modules/portal/frontend/[orgSlug]/portal/verify/page.js +1 -1
  718. package/dist/modules/portal/frontend/[orgSlug]/portal/verify/page.js.map +2 -2
  719. package/dist/modules/portal/lib/navigation.js +7 -0
  720. package/dist/modules/portal/lib/navigation.js.map +7 -0
  721. package/dist/modules/progress/lib/progressService.js +2 -0
  722. package/dist/modules/progress/lib/progressService.js.map +2 -2
  723. package/dist/modules/progress/lib/progressServiceImpl.js +322 -104
  724. package/dist/modules/progress/lib/progressServiceImpl.js.map +2 -2
  725. package/dist/modules/query_index/api/openapi.js +13 -1
  726. package/dist/modules/query_index/api/openapi.js.map +2 -2
  727. package/dist/modules/query_index/api/reindex.js +10 -0
  728. package/dist/modules/query_index/api/reindex.js.map +2 -2
  729. package/dist/modules/query_index/api/status.js +165 -105
  730. package/dist/modules/query_index/api/status.js.map +2 -2
  731. package/dist/modules/query_index/cli.js +125 -1
  732. package/dist/modules/query_index/cli.js.map +2 -2
  733. package/dist/modules/query_index/components/QueryIndexesTable.js +130 -42
  734. package/dist/modules/query_index/components/QueryIndexesTable.js.map +2 -2
  735. package/dist/modules/query_index/data/entities.js +2 -1
  736. package/dist/modules/query_index/data/entities.js.map +2 -2
  737. package/dist/modules/query_index/di.js +3 -0
  738. package/dist/modules/query_index/di.js.map +2 -2
  739. package/dist/modules/query_index/events.js +20 -0
  740. package/dist/modules/query_index/events.js.map +7 -0
  741. package/dist/modules/query_index/extension-points.js +13 -0
  742. package/dist/modules/query_index/extension-points.js.map +7 -0
  743. package/dist/modules/query_index/lib/batch.js +11 -4
  744. package/dist/modules/query_index/lib/batch.js.map +2 -2
  745. package/dist/modules/query_index/lib/coverage.js +21 -9
  746. package/dist/modules/query_index/lib/coverage.js.map +2 -2
  747. package/dist/modules/query_index/lib/document.js +12 -5
  748. package/dist/modules/query_index/lib/document.js.map +2 -2
  749. package/dist/modules/query_index/lib/engine.js +105 -48
  750. package/dist/modules/query_index/lib/engine.js.map +2 -2
  751. package/dist/modules/query_index/lib/indexer.js +95 -19
  752. package/dist/modules/query_index/lib/indexer.js.map +2 -2
  753. package/dist/modules/query_index/lib/reindexer.js +43 -37
  754. package/dist/modules/query_index/lib/reindexer.js.map +2 -2
  755. package/dist/modules/query_index/lib/search-tokens.js +34 -15
  756. package/dist/modules/query_index/lib/search-tokens.js.map +2 -2
  757. package/dist/modules/query_index/lib/subscriber-scope.js +2 -3
  758. package/dist/modules/query_index/lib/subscriber-scope.js.map +2 -2
  759. package/dist/modules/query_index/migrations/Migration20260731105052_query_index.js +17 -0
  760. package/dist/modules/query_index/migrations/Migration20260731105052_query_index.js.map +7 -0
  761. package/dist/modules/query_index/subscribers/coverage_refresh.js +4 -0
  762. package/dist/modules/query_index/subscribers/coverage_refresh.js.map +2 -2
  763. package/dist/modules/query_index/subscribers/delete_one.js +53 -1
  764. package/dist/modules/query_index/subscribers/delete_one.js.map +3 -3
  765. package/dist/modules/query_index/subscribers/upsert_one.js +60 -0
  766. package/dist/modules/query_index/subscribers/upsert_one.js.map +3 -3
  767. package/dist/modules/resources/api/resources.js +2 -0
  768. package/dist/modules/resources/api/resources.js.map +2 -2
  769. package/dist/modules/resources/backend/resources/resource-types/page.js +2 -1
  770. package/dist/modules/resources/backend/resources/resource-types/page.js.map +2 -2
  771. package/dist/modules/resources/backend/resources/resources/[id]/page.js +3 -2
  772. package/dist/modules/resources/backend/resources/resources/[id]/page.js.map +2 -2
  773. package/dist/modules/resources/backend/resources/resources/page.js +2 -1
  774. package/dist/modules/resources/backend/resources/resources/page.js.map +2 -2
  775. package/dist/modules/resources/commands/resources.js +9 -0
  776. package/dist/modules/resources/commands/resources.js.map +2 -2
  777. package/dist/modules/resources/components/detail/dictionaries.js +3 -3
  778. package/dist/modules/resources/components/detail/dictionaries.js.map +2 -2
  779. package/dist/modules/resources/data/entities.js +3 -0
  780. package/dist/modules/resources/data/entities.js.map +2 -2
  781. package/dist/modules/resources/data/validators.js +6 -2
  782. package/dist/modules/resources/data/validators.js.map +2 -2
  783. package/dist/modules/resources/extension-points.js +14 -0
  784. package/dist/modules/resources/extension-points.js.map +7 -0
  785. package/dist/modules/resources/lib/seeds.js +16 -9
  786. package/dist/modules/resources/lib/seeds.js.map +2 -2
  787. package/dist/modules/resources/migrations/Migration20260608231000.js +13 -0
  788. package/dist/modules/resources/migrations/Migration20260608231000.js.map +7 -0
  789. package/dist/modules/sales/analytics.js +7 -3
  790. package/dist/modules/sales/analytics.js.map +2 -2
  791. package/dist/modules/sales/api/document-history/route.js +2 -1
  792. package/dist/modules/sales/api/document-history/route.js.map +2 -2
  793. package/dist/modules/sales/api/documents/factory.js +14 -3
  794. package/dist/modules/sales/api/documents/factory.js.map +2 -2
  795. package/dist/modules/sales/backend/sales/documents/[id]/page.js +11 -3
  796. package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
  797. package/dist/modules/sales/backend/sales/documents/create/page.js +11 -14
  798. package/dist/modules/sales/backend/sales/documents/create/page.js.map +2 -2
  799. package/dist/modules/sales/commands/documents.js +184 -23
  800. package/dist/modules/sales/commands/documents.js.map +2 -2
  801. package/dist/modules/sales/components/documents/ItemsSection.js +31 -11
  802. package/dist/modules/sales/components/documents/ItemsSection.js.map +2 -2
  803. package/dist/modules/sales/components/documents/LineItemDialog.js +12 -5
  804. package/dist/modules/sales/components/documents/LineItemDialog.js.map +2 -2
  805. package/dist/modules/sales/components/documents/SalesDocumentForm.js +48 -2
  806. package/dist/modules/sales/components/documents/SalesDocumentForm.js.map +2 -2
  807. package/dist/modules/sales/components/documents/SalesDocumentsTable.js +4 -1
  808. package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
  809. package/dist/modules/sales/components/documents/SalesOrderDraftLines.js +167 -0
  810. package/dist/modules/sales/components/documents/SalesOrderDraftLines.js.map +7 -0
  811. package/dist/modules/sales/components/useSalesChannelsEnabled.js +2 -35
  812. package/dist/modules/sales/components/useSalesChannelsEnabled.js.map +2 -2
  813. package/dist/modules/sales/data/validators.js +32 -5
  814. package/dist/modules/sales/data/validators.js.map +2 -2
  815. package/dist/modules/sales/di.js +7 -0
  816. package/dist/modules/sales/di.js.map +2 -2
  817. package/dist/modules/sales/events.js +1 -0
  818. package/dist/modules/sales/events.js.map +2 -2
  819. package/dist/modules/sales/extension-points.js +36 -0
  820. package/dist/modules/sales/extension-points.js.map +7 -0
  821. package/dist/modules/sales/lib/historyHelpers.js +69 -1
  822. package/dist/modules/sales/lib/historyHelpers.js.map +2 -2
  823. package/dist/modules/sales/services/paymentOrderTotalResolver.js +52 -0
  824. package/dist/modules/sales/services/paymentOrderTotalResolver.js.map +7 -0
  825. package/dist/modules/sales/widgets/injection/document-history/widget.client.js +51 -2
  826. package/dist/modules/sales/widgets/injection/document-history/widget.client.js.map +2 -2
  827. package/dist/modules/sales/workflows.js +10 -7
  828. package/dist/modules/sales/workflows.js.map +2 -2
  829. package/dist/modules/shipping_carriers/api/webhook/[provider]/route.js +11 -1
  830. package/dist/modules/shipping_carriers/api/webhook/[provider]/route.js.map +2 -2
  831. package/dist/modules/shipping_carriers/lib/shipment-wizard/components/PackageEditor.js +1 -1
  832. package/dist/modules/shipping_carriers/lib/shipment-wizard/components/PackageEditor.js.map +1 -1
  833. package/dist/modules/staff/api/interceptors.js +5 -3
  834. package/dist/modules/staff/api/interceptors.js.map +2 -2
  835. package/dist/modules/staff/api/leave-requests.js +45 -42
  836. package/dist/modules/staff/api/leave-requests.js.map +2 -2
  837. package/dist/modules/staff/components/detail/dictionaries.js +3 -3
  838. package/dist/modules/staff/components/detail/dictionaries.js.map +2 -2
  839. package/dist/modules/sync_excel/api/upload/route.js +15 -2
  840. package/dist/modules/sync_excel/api/upload/route.js.map +2 -2
  841. package/dist/modules/sync_excel/widgets/injection/upload-config/widget.client.js +1 -1
  842. package/dist/modules/sync_excel/widgets/injection/upload-config/widget.client.js.map +2 -2
  843. package/dist/modules/wms/components/backend/ReleaseReservationDialog.js +1 -1
  844. package/dist/modules/wms/components/backend/ReleaseReservationDialog.js.map +1 -1
  845. package/dist/modules/wms/components/backend/WmsConfigurationPage.js +5 -4
  846. package/dist/modules/wms/components/backend/WmsConfigurationPage.js.map +2 -2
  847. package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js +4 -3
  848. package/dist/modules/wms/components/backend/WmsInventoryConsolePage.js.map +2 -2
  849. package/dist/modules/wms/components/backend/WmsLocationDetailPage.js +3 -2
  850. package/dist/modules/wms/components/backend/WmsLocationDetailPage.js.map +2 -2
  851. package/dist/modules/wms/components/backend/WmsLotDetailPage.js +3 -2
  852. package/dist/modules/wms/components/backend/WmsLotDetailPage.js.map +2 -2
  853. package/dist/modules/wms/components/backend/WmsLotsListPage.js +2 -1
  854. package/dist/modules/wms/components/backend/WmsLotsListPage.js.map +2 -2
  855. package/dist/modules/wms/components/backend/WmsSkuDetailPage.js +3 -2
  856. package/dist/modules/wms/components/backend/WmsSkuDetailPage.js.map +2 -2
  857. package/dist/modules/wms/extension-points.js +26 -0
  858. package/dist/modules/wms/extension-points.js.map +7 -0
  859. package/dist/modules/workflows/backend/definitions/[id]/page.js +2 -2
  860. package/dist/modules/workflows/backend/definitions/[id]/page.js.map +2 -2
  861. package/dist/modules/workflows/backend/definitions/create/page.js +1 -1
  862. package/dist/modules/workflows/backend/definitions/create/page.js.map +2 -2
  863. package/dist/modules/workflows/backend/definitions/page.js +3 -2
  864. package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
  865. package/dist/modules/workflows/backend/definitions/visual-editor/page.js +9 -6
  866. package/dist/modules/workflows/backend/definitions/visual-editor/page.js.map +2 -2
  867. package/dist/modules/workflows/backend/instances/page.js +10 -9
  868. package/dist/modules/workflows/backend/instances/page.js.map +2 -2
  869. package/dist/modules/workflows/backend/tasks/page.js +8 -7
  870. package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
  871. package/dist/modules/workflows/components/ActivitiesEditor.js +69 -13
  872. package/dist/modules/workflows/components/ActivitiesEditor.js.map +2 -2
  873. package/dist/modules/workflows/components/BusinessRulesSelector.js +1 -1
  874. package/dist/modules/workflows/components/BusinessRulesSelector.js.map +2 -2
  875. package/dist/modules/workflows/components/DefinitionTriggersEditor.js +3 -3
  876. package/dist/modules/workflows/components/DefinitionTriggersEditor.js.map +2 -2
  877. package/dist/modules/workflows/components/EdgeEditDialogCrudForm.js +1 -2
  878. package/dist/modules/workflows/components/EdgeEditDialogCrudForm.js.map +2 -2
  879. package/dist/modules/workflows/components/NodeEditDialog.js +3 -3
  880. package/dist/modules/workflows/components/NodeEditDialog.js.map +2 -2
  881. package/dist/modules/workflows/components/NodeEditDialogCrudForm.js +4 -5
  882. package/dist/modules/workflows/components/NodeEditDialogCrudForm.js.map +2 -2
  883. package/dist/modules/workflows/components/StepsEditor.js +2 -2
  884. package/dist/modules/workflows/components/StepsEditor.js.map +2 -2
  885. package/dist/modules/workflows/components/TransitionsEditor.js +207 -165
  886. package/dist/modules/workflows/components/TransitionsEditor.js.map +2 -2
  887. package/dist/modules/workflows/components/WorkflowGraphImpl.js +1 -1
  888. package/dist/modules/workflows/components/WorkflowGraphImpl.js.map +2 -2
  889. package/dist/modules/workflows/components/WorkflowLegend.js +1 -1
  890. package/dist/modules/workflows/components/WorkflowLegend.js.map +2 -2
  891. package/dist/modules/workflows/components/WorkflowSelector.js +1 -1
  892. package/dist/modules/workflows/components/WorkflowSelector.js.map +2 -2
  893. package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js +1 -1
  894. package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js.map +2 -2
  895. package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js +2 -2
  896. package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js.map +2 -2
  897. package/dist/modules/workflows/components/fields/MappingArrayEditor.js +1 -1
  898. package/dist/modules/workflows/components/fields/MappingArrayEditor.js.map +2 -2
  899. package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js +1 -1
  900. package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js.map +2 -2
  901. package/dist/modules/workflows/components/fields/WorkflowSelectorField.js +4 -4
  902. package/dist/modules/workflows/components/fields/WorkflowSelectorField.js.map +2 -2
  903. package/dist/modules/workflows/data/validators.js +34 -1
  904. package/dist/modules/workflows/data/validators.js.map +3 -3
  905. package/dist/modules/workflows/events.js +1 -0
  906. package/dist/modules/workflows/events.js.map +2 -2
  907. package/dist/modules/workflows/extension-points.js +15 -0
  908. package/dist/modules/workflows/extension-points.js.map +7 -0
  909. package/dist/modules/workflows/lib/activity-executor.js +59 -14
  910. package/dist/modules/workflows/lib/activity-executor.js.map +2 -2
  911. package/dist/modules/workflows/lib/format-validation-error.js +46 -1
  912. package/dist/modules/workflows/lib/format-validation-error.js.map +2 -2
  913. package/dist/modules/workflows/widgets/injection/order-approval/context-keys.js +10 -0
  914. package/dist/modules/workflows/widgets/injection/order-approval/context-keys.js.map +7 -0
  915. package/dist/modules/workflows/widgets/injection/order-approval/widget.client.js +21 -10
  916. package/dist/modules/workflows/widgets/injection/order-approval/widget.client.js.map +2 -2
  917. package/generated/entities/attachment_quota_reservation/index.ts +15 -0
  918. package/generated/entities/customer_deal_person_link/index.ts +1 -0
  919. package/generated/entities/customer_user_invitation/index.ts +1 -0
  920. package/generated/entities/gateway_payment_operation/index.ts +1 -0
  921. package/generated/entities/gateway_transaction/index.ts +1 -0
  922. package/generated/entities/organization/index.ts +1 -0
  923. package/generated/entities/resources_resource/index.ts +1 -0
  924. package/generated/entities.ids.generated.ts +3 -1
  925. package/generated/entity-fields-registry.ts +23 -0
  926. package/package.json +19 -18
  927. package/src/bootstrap.ts +17 -2
  928. package/src/helpers/integration/salesFixtures.ts +34 -2
  929. package/src/helpers/integration/salesUi.ts +8 -0
  930. package/src/modules/api_keys/backend/api-keys/page.tsx +2 -1
  931. package/src/modules/api_keys/extension-points.ts +13 -0
  932. package/src/modules/api_keys/i18n/ko.json +42 -0
  933. package/src/modules/attachments/api/route.ts +130 -9
  934. package/src/modules/attachments/backend/config/attachments/page.tsx +1 -1
  935. package/src/modules/attachments/data/entities.ts +59 -0
  936. package/src/modules/attachments/di.ts +9 -1
  937. package/src/modules/attachments/fields/attachment.tsx +1 -1
  938. package/src/modules/attachments/i18n/de.json +15 -0
  939. package/src/modules/attachments/i18n/en.json +15 -0
  940. package/src/modules/attachments/i18n/es.json +15 -0
  941. package/src/modules/attachments/i18n/ko.json +175 -0
  942. package/src/modules/attachments/i18n/pl.json +15 -0
  943. package/src/modules/attachments/lib/drivers/index.ts +1 -1
  944. package/src/modules/attachments/lib/drivers/localDriver.ts +23 -8
  945. package/src/modules/attachments/lib/drivers/types.ts +5 -0
  946. package/src/modules/attachments/lib/quota-recovery-queue.ts +16 -0
  947. package/src/modules/attachments/lib/quota-service.ts +442 -0
  948. package/src/modules/attachments/lib/upload-limits.ts +35 -0
  949. package/src/modules/attachments/migrations/.snapshot-open-mercato.json +648 -120
  950. package/src/modules/attachments/migrations/Migration20260709234741_attachments.ts +12 -0
  951. package/src/modules/attachments/workers/quota-recovery.ts +68 -0
  952. package/src/modules/audit_logs/api/audit-logs/access/route.ts +5 -0
  953. package/src/modules/audit_logs/api/audit-logs/actions/export/route.ts +5 -0
  954. package/src/modules/audit_logs/api/audit-logs/actions/route.ts +5 -0
  955. package/src/modules/audit_logs/api/audit-logs/readScope.ts +28 -0
  956. package/src/modules/audit_logs/components/AccessLogsTable.tsx +2 -1
  957. package/src/modules/audit_logs/components/AuditLogsActions.tsx +3 -2
  958. package/src/modules/audit_logs/extension-points.ts +11 -0
  959. package/src/modules/audit_logs/i18n/ko.json +66 -0
  960. package/src/modules/auth/AGENTS.md +12 -8
  961. package/src/modules/auth/api/admin/nav.ts +28 -4
  962. package/src/modules/auth/api/profile/route.ts +8 -2
  963. package/src/modules/auth/api/users/route.ts +8 -28
  964. package/src/modules/auth/backend/auth/profile/page.tsx +1 -0
  965. package/src/modules/auth/backend/profile/change-password/page.tsx +1 -0
  966. package/src/modules/auth/backend/roles/page.tsx +2 -1
  967. package/src/modules/auth/backend/settings/page.tsx +17 -8
  968. package/src/modules/auth/backend/users/page.tsx +2 -1
  969. package/src/modules/auth/cli.ts +1 -1
  970. package/src/modules/auth/components/UserConsentsPanel.tsx +9 -9
  971. package/src/modules/auth/extension-points.ts +18 -0
  972. package/src/modules/auth/frontend/login.tsx +7 -3
  973. package/src/modules/auth/frontend/reset.tsx +2 -2
  974. package/src/modules/auth/i18n/de.json +1 -0
  975. package/src/modules/auth/i18n/en.json +1 -0
  976. package/src/modules/auth/i18n/es.json +1 -0
  977. package/src/modules/auth/i18n/ko.json +255 -0
  978. package/src/modules/auth/i18n/pl.json +1 -0
  979. package/src/modules/auth/lib/backendChrome.tsx +71 -33
  980. package/src/modules/auth/lib/setup-app.ts +21 -2
  981. package/src/modules/auth/lib/tenantAccess.ts +8 -0
  982. package/src/modules/auth/services/rbacService.ts +41 -46
  983. package/src/modules/business_rules/api/openmercato-call-options/route.ts +94 -0
  984. package/src/modules/business_rules/api/rules/route.ts +92 -4
  985. package/src/modules/business_rules/backend/rules/page.tsx +2 -1
  986. package/src/modules/business_rules/components/ActionBuilder.tsx +54 -5
  987. package/src/modules/business_rules/components/ActionRow.tsx +156 -18
  988. package/src/modules/business_rules/components/ConditionRow.tsx +9 -6
  989. package/src/modules/business_rules/components/utils/actionValidation.ts +6 -0
  990. package/src/modules/business_rules/events.ts +10 -0
  991. package/src/modules/business_rules/extension-points.ts +10 -0
  992. package/src/modules/business_rules/i18n/de.json +12 -0
  993. package/src/modules/business_rules/i18n/en.json +12 -0
  994. package/src/modules/business_rules/i18n/es.json +12 -0
  995. package/src/modules/business_rules/i18n/ko.json +396 -0
  996. package/src/modules/business_rules/i18n/pl.json +12 -0
  997. package/src/modules/business_rules/lib/action-executor.ts +198 -0
  998. package/src/modules/business_rules/lib/openmercato-call-options-types.ts +31 -0
  999. package/src/modules/business_rules/lib/openmercato-call-options.ts +297 -0
  1000. package/src/modules/business_rules/lib/rule-engine.ts +4 -0
  1001. package/src/modules/catalog/backend/catalog/products/[id]/page.tsx +6 -5
  1002. package/src/modules/catalog/backend/catalog/products/create/page.tsx +7 -6
  1003. package/src/modules/catalog/components/PriceKindSettings.tsx +3 -3
  1004. package/src/modules/catalog/components/categories/CategoriesDataTable.tsx +2 -1
  1005. package/src/modules/catalog/components/products/ProductCategorizeSection.tsx +3 -3
  1006. package/src/modules/catalog/components/products/ProductMediaManager.tsx +1 -1
  1007. package/src/modules/catalog/components/products/ProductsDataTable.tsx +3 -2
  1008. package/src/modules/catalog/components/products/VariantBuilder.tsx +5 -5
  1009. package/src/modules/catalog/events.ts +1 -0
  1010. package/src/modules/catalog/extension-points.ts +24 -0
  1011. package/src/modules/catalog/i18n/de.json +18 -0
  1012. package/src/modules/catalog/i18n/en.json +18 -0
  1013. package/src/modules/catalog/i18n/es.json +18 -0
  1014. package/src/modules/catalog/i18n/ko.json +723 -0
  1015. package/src/modules/catalog/i18n/pl.json +18 -0
  1016. package/src/modules/catalog/widgets/injection/product-bulk-delete/widget.ts +15 -5
  1017. package/src/modules/catalog/widgets/injection/product-seo/widget.ts +1 -1
  1018. package/src/modules/communication_channels/api/post/test-seed/route.ts +69 -2
  1019. package/src/modules/communication_channels/api/post/webhook/[provider]/route.ts +11 -1
  1020. package/src/modules/communication_channels/api/post/webhooks/gmail/route.ts +17 -11
  1021. package/src/modules/communication_channels/backend/communication_channels/channels/page.tsx +2 -1
  1022. package/src/modules/communication_channels/backend/profile/communication-channels/page.tsx +8 -7
  1023. package/src/modules/communication_channels/data/enrichers.ts +6 -26
  1024. package/src/modules/communication_channels/extension-points.ts +17 -0
  1025. package/src/modules/communication_channels/i18n/de.json +2 -2
  1026. package/src/modules/communication_channels/i18n/en.json +2 -2
  1027. package/src/modules/communication_channels/i18n/es.json +2 -2
  1028. package/src/modules/communication_channels/i18n/ko.json +138 -0
  1029. package/src/modules/communication_channels/i18n/pl.json +2 -2
  1030. package/src/modules/communication_channels/lib/access-control.ts +3 -3
  1031. package/src/modules/configs/backend/config/system-status/page.tsx +2 -1
  1032. package/src/modules/configs/extension-points.ts +15 -0
  1033. package/src/modules/configs/i18n/ko.json +197 -0
  1034. package/src/modules/configs/lib/upgrade-actions.ts +14 -0
  1035. package/src/modules/currencies/backend/currencies/page.tsx +2 -1
  1036. package/src/modules/currencies/backend/exchange-rates/page.tsx +2 -1
  1037. package/src/modules/currencies/di.ts +4 -1
  1038. package/src/modules/currencies/extension-points.ts +11 -0
  1039. package/src/modules/currencies/i18n/de.json +1 -0
  1040. package/src/modules/currencies/i18n/en.json +1 -0
  1041. package/src/modules/currencies/i18n/es.json +1 -0
  1042. package/src/modules/currencies/i18n/ko.json +160 -0
  1043. package/src/modules/currencies/i18n/pl.json +1 -0
  1044. package/src/modules/currencies/services/baseCurrencyService.ts +59 -0
  1045. package/src/modules/customer_accounts/AGENTS.md +3 -3
  1046. package/src/modules/customer_accounts/api/admin/users/[id].ts +16 -1
  1047. package/src/modules/customer_accounts/api/admin/users-invite.ts +81 -3
  1048. package/src/modules/customer_accounts/api/invitations/accept.ts +1 -2
  1049. package/src/modules/customer_accounts/api/login.ts +4 -2
  1050. package/src/modules/customer_accounts/api/magic-link/verify.ts +4 -2
  1051. package/src/modules/customer_accounts/api/portal/feature-check.ts +5 -7
  1052. package/src/modules/customer_accounts/api/portal/nav.ts +5 -3
  1053. package/src/modules/customer_accounts/api/portal/profile.ts +5 -1
  1054. package/src/modules/customer_accounts/api/portal/sessions-refresh.ts +3 -3
  1055. package/src/modules/customer_accounts/api/portal/users-invite.ts +25 -1
  1056. package/src/modules/customer_accounts/backend/customer_accounts/roles/page.tsx +2 -1
  1057. package/src/modules/customer_accounts/backend/customer_accounts/settings/domain/components/Diagnostics.tsx +2 -2
  1058. package/src/modules/customer_accounts/backend/customer_accounts/users/page.tsx +2 -1
  1059. package/src/modules/customer_accounts/data/entities.ts +3 -0
  1060. package/src/modules/customer_accounts/data/validators.ts +1 -0
  1061. package/src/modules/customer_accounts/emails/CustomerInvitationEmail.tsx +45 -0
  1062. package/src/modules/customer_accounts/extension-points.ts +11 -0
  1063. package/src/modules/customer_accounts/i18n/de.json +6 -0
  1064. package/src/modules/customer_accounts/i18n/en.json +6 -0
  1065. package/src/modules/customer_accounts/i18n/es.json +6 -0
  1066. package/src/modules/customer_accounts/i18n/ko.json +354 -0
  1067. package/src/modules/customer_accounts/i18n/pl.json +6 -0
  1068. package/src/modules/customer_accounts/lib/customerAuth.ts +8 -2
  1069. package/src/modules/customer_accounts/lib/customerAuthServer.ts +1 -0
  1070. package/src/modules/customer_accounts/lib/customerEntityOwnership.ts +68 -2
  1071. package/src/modules/customer_accounts/lib/customerUrl.ts +27 -11
  1072. package/src/modules/customer_accounts/lib/invitationEmail.ts +42 -0
  1073. package/src/modules/customer_accounts/migrations/.snapshot-open-mercato.json +16 -0
  1074. package/src/modules/customer_accounts/migrations/Migration20260723120000_customer_accounts.ts +13 -0
  1075. package/src/modules/customer_accounts/services/customerInvitationService.ts +56 -3
  1076. package/src/modules/customer_accounts/services/customerRbacService.ts +16 -3
  1077. package/src/modules/customer_accounts/setup.ts +7 -0
  1078. package/src/modules/customer_accounts/subscribers/autoLinkCrm.ts +75 -8
  1079. package/src/modules/customer_accounts/widgets/injection/account-status/widget.client.tsx +2 -2
  1080. package/src/modules/customer_accounts/widgets/injection/portal-ai-assistant-trigger/widget.client.tsx +1 -3
  1081. package/src/modules/customer_accounts/widgets/injection-table.ts +4 -1
  1082. package/src/modules/customers/analytics.ts +3 -0
  1083. package/src/modules/customers/api/companies/[id]/route.ts +3 -4
  1084. package/src/modules/customers/api/deals/[id]/people/route.ts +3 -0
  1085. package/src/modules/customers/api/deals/[id]/route.ts +10 -2
  1086. package/src/modules/customers/api/deals/aggregate/route.ts +5 -4
  1087. package/src/modules/customers/api/deals/summary/route.ts +15 -162
  1088. package/src/modules/customers/api/people/[id]/companies/enriched/route.ts +3 -2
  1089. package/src/modules/customers/api/utils.ts +25 -37
  1090. package/src/modules/customers/backend/customers/companies/[id]/page.tsx +2 -1
  1091. package/src/modules/customers/backend/customers/companies/page.tsx +2 -1
  1092. package/src/modules/customers/backend/customers/companies-v2/[id]/page.tsx +17 -5
  1093. package/src/modules/customers/backend/customers/deals/[id]/hooks/types.ts +1 -0
  1094. package/src/modules/customers/backend/customers/deals/[id]/page.tsx +19 -12
  1095. package/src/modules/customers/backend/customers/deals/page.tsx +2 -1
  1096. package/src/modules/customers/backend/customers/deals/pipeline/components/QuickDealDialog.tsx +35 -3
  1097. package/src/modules/customers/backend/customers/deals/pipeline/page.tsx +11 -2
  1098. package/src/modules/customers/backend/customers/people/[id]/page.tsx +2 -1
  1099. package/src/modules/customers/backend/customers/people/page.tsx +2 -1
  1100. package/src/modules/customers/backend/customers/people-v2/[id]/page.tsx +29 -10
  1101. package/src/modules/customers/cli.ts +28 -11
  1102. package/src/modules/customers/commands/deals.ts +50 -9
  1103. package/src/modules/customers/commands/people.ts +3 -0
  1104. package/src/modules/customers/components/CustomerTodosTable.tsx +2 -1
  1105. package/src/modules/customers/components/calendar/CalendarEventEditor.tsx +1 -1
  1106. package/src/modules/customers/components/detail/ActiveDealCard.tsx +2 -1
  1107. package/src/modules/customers/components/detail/ActivitiesDayStrip.tsx +2 -3
  1108. package/src/modules/customers/components/detail/CompanyDetailTabs.tsx +30 -7
  1109. package/src/modules/customers/components/detail/CompanyKpiBar.tsx +6 -5
  1110. package/src/modules/customers/components/detail/ConfirmDealLostDialog.tsx +2 -2
  1111. package/src/modules/customers/components/detail/DealDetailTabs.tsx +34 -9
  1112. package/src/modules/customers/components/detail/DealForm.tsx +5 -1
  1113. package/src/modules/customers/components/detail/DealsSection.tsx +1 -1
  1114. package/src/modules/customers/components/detail/MiniWeekCalendar.tsx +8 -57
  1115. package/src/modules/customers/components/detail/PersonDetailTabs.tsx +34 -9
  1116. package/src/modules/customers/components/detail/ScheduleActivityDialog.tsx +29 -14
  1117. package/src/modules/customers/components/detail/dashboard/helpers.ts +4 -3
  1118. package/src/modules/customers/components/detail/legacyActivities.ts +79 -0
  1119. package/src/modules/customers/components/formConfig.tsx +12 -8
  1120. package/src/modules/customers/data/entities.ts +9 -1
  1121. package/src/modules/customers/data/validators.ts +6 -1
  1122. package/src/modules/customers/extension-points.ts +40 -0
  1123. package/src/modules/customers/i18n/de.json +72 -0
  1124. package/src/modules/customers/i18n/en.json +72 -0
  1125. package/src/modules/customers/i18n/es.json +72 -0
  1126. package/src/modules/customers/i18n/ko.json +2855 -0
  1127. package/src/modules/customers/i18n/pl.json +72 -0
  1128. package/src/modules/customers/lib/calendar/format.ts +10 -4
  1129. package/src/modules/customers/lib/dealStatus.ts +48 -0
  1130. package/src/modules/customers/lib/dealsSummaryQueries.ts +211 -0
  1131. package/src/modules/customers/lib/optionalBaseCurrency.ts +34 -0
  1132. package/src/modules/customers/lib/visibilityFilter.ts +7 -5
  1133. package/src/modules/customers/migrations/.snapshot-open-mercato.json +27 -1
  1134. package/src/modules/customers/migrations/Migration20260723210000_customers.ts +15 -0
  1135. package/src/modules/customers/search.ts +59 -27
  1136. package/src/modules/customers/utils/phoneDuplicates.ts +6 -3
  1137. package/src/modules/dashboards/api/layout/[itemId]/route.ts +6 -3
  1138. package/src/modules/dashboards/api/layout/route.ts +22 -9
  1139. package/src/modules/dashboards/api/roles/widgets/route.ts +9 -3
  1140. package/src/modules/dashboards/api/users/widgets/route.ts +9 -3
  1141. package/src/modules/dashboards/api/widgets/catalog.ts +6 -3
  1142. package/src/modules/dashboards/api/widgets/data/batch/route.ts +12 -1
  1143. package/src/modules/dashboards/api/widgets/data/route.ts +29 -1
  1144. package/src/modules/dashboards/api/widgets/data/schema.ts +49 -19
  1145. package/src/modules/dashboards/components/UnlabelledAmountNotice.tsx +43 -0
  1146. package/src/modules/dashboards/i18n/de.json +5 -0
  1147. package/src/modules/dashboards/i18n/en.json +5 -0
  1148. package/src/modules/dashboards/i18n/es.json +5 -0
  1149. package/src/modules/dashboards/i18n/ko.json +118 -0
  1150. package/src/modules/dashboards/i18n/pl.json +5 -0
  1151. package/src/modules/dashboards/lib/access.ts +5 -3
  1152. package/src/modules/dashboards/lib/aggregations.ts +198 -48
  1153. package/src/modules/dashboards/lib/exactDecimal.ts +96 -0
  1154. package/src/modules/dashboards/lib/formatters.ts +137 -12
  1155. package/src/modules/dashboards/lib/optionalBaseCurrency.ts +22 -0
  1156. package/src/modules/dashboards/services/widgetDataService.ts +453 -12
  1157. package/src/modules/dashboards/subscribers/invalidateWidgetDataCache.ts +32 -0
  1158. package/src/modules/dashboards/widgets/dashboard/aov-kpi/widget.client.tsx +9 -3
  1159. package/src/modules/dashboards/widgets/dashboard/pipeline-summary/config.ts +86 -0
  1160. package/src/modules/dashboards/widgets/dashboard/pipeline-summary/widget.client.tsx +42 -21
  1161. package/src/modules/dashboards/widgets/dashboard/pipeline-summary/widget.ts +2 -2
  1162. package/src/modules/dashboards/widgets/dashboard/revenue-kpi/widget.client.tsx +9 -3
  1163. package/src/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.tsx +7 -2
  1164. package/src/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.tsx +25 -15
  1165. package/src/modules/dashboards/widgets/dashboard/top-customers/widget.client.tsx +21 -11
  1166. package/src/modules/dashboards/widgets/dashboard/top-products/widget.client.tsx +9 -3
  1167. package/src/modules/data_sync/AGENTS.md +1 -0
  1168. package/src/modules/data_sync/api/mappings/[id]/route.ts +22 -9
  1169. package/src/modules/data_sync/api/mappings/route.ts +13 -4
  1170. package/src/modules/data_sync/api/options.ts +7 -2
  1171. package/src/modules/data_sync/api/run.ts +7 -2
  1172. package/src/modules/data_sync/api/runs/[id]/cancel.ts +8 -3
  1173. package/src/modules/data_sync/api/runs/[id]/retry.ts +7 -2
  1174. package/src/modules/data_sync/api/runs/[id]/route.ts +8 -3
  1175. package/src/modules/data_sync/api/runs.ts +7 -2
  1176. package/src/modules/data_sync/api/schedules/[id]/route.ts +19 -6
  1177. package/src/modules/data_sync/api/schedules/route.ts +13 -4
  1178. package/src/modules/data_sync/api/validate.ts +9 -4
  1179. package/src/modules/data_sync/backend/data-sync/page.tsx +5 -4
  1180. package/src/modules/data_sync/components/IntegrationScheduleTab.tsx +5 -5
  1181. package/src/modules/data_sync/extension-points.ts +10 -0
  1182. package/src/modules/data_sync/i18n/ko.json +125 -0
  1183. package/src/modules/data_sync/lib/adapter.ts +18 -0
  1184. package/src/modules/data_sync/lib/queue-policy.ts +30 -0
  1185. package/src/modules/data_sync/lib/queue.ts +19 -1
  1186. package/src/modules/data_sync/lib/start-run.ts +2 -1
  1187. package/src/modules/data_sync/lib/sync-engine.ts +46 -0
  1188. package/src/modules/data_sync/lib/sync-run-service.ts +82 -1
  1189. package/src/modules/data_sync/workers/sync-export.ts +8 -1
  1190. package/src/modules/data_sync/workers/sync-import.ts +8 -1
  1191. package/src/modules/design_system/AGENTS.md +34 -0
  1192. package/src/modules/design_system/acl.ts +5 -0
  1193. package/src/modules/design_system/backend/design-system/page.meta.ts +11 -0
  1194. package/src/modules/design_system/backend/design-system/page.tsx +14 -0
  1195. package/src/modules/design_system/gallery/components/CodeSnippet.tsx +55 -0
  1196. package/src/modules/design_system/gallery/components/EntryCard.tsx +95 -0
  1197. package/src/modules/design_system/gallery/components/GalleryShell.tsx +206 -0
  1198. package/src/modules/design_system/gallery/components/VariantPreview.tsx +15 -0
  1199. package/src/modules/design_system/gallery/entries/banners.tsx +226 -0
  1200. package/src/modules/design_system/gallery/entries/buttons.tsx +422 -0
  1201. package/src/modules/design_system/gallery/entries/charts.tsx +518 -0
  1202. package/src/modules/design_system/gallery/entries/dates.tsx +325 -0
  1203. package/src/modules/design_system/gallery/entries/detail.tsx +403 -0
  1204. package/src/modules/design_system/gallery/entries/display.tsx +893 -0
  1205. package/src/modules/design_system/gallery/entries/feedback.tsx +746 -0
  1206. package/src/modules/design_system/gallery/entries/filters.tsx +570 -0
  1207. package/src/modules/design_system/gallery/entries/foundations.tsx +529 -0
  1208. package/src/modules/design_system/gallery/entries/icons.tsx +168 -0
  1209. package/src/modules/design_system/gallery/entries/inputs.tsx +1516 -0
  1210. package/src/modules/design_system/gallery/entries/messages.tsx +339 -0
  1211. package/src/modules/design_system/gallery/entries/navigation.tsx +573 -0
  1212. package/src/modules/design_system/gallery/entries/notifications.tsx +285 -0
  1213. package/src/modules/design_system/gallery/entries/overlays.tsx +677 -0
  1214. package/src/modules/design_system/gallery/entries/scaffolding.tsx +430 -0
  1215. package/src/modules/design_system/gallery/entries/schedule.tsx +307 -0
  1216. package/src/modules/design_system/gallery/registry.ts +152 -0
  1217. package/src/modules/design_system/gallery/types.ts +32 -0
  1218. package/src/modules/design_system/i18n/.hardcoded-allowlist.json +71 -0
  1219. package/src/modules/design_system/i18n/de.json +58 -0
  1220. package/src/modules/design_system/i18n/en.json +58 -0
  1221. package/src/modules/design_system/i18n/es.json +58 -0
  1222. package/src/modules/design_system/i18n/ko.json +58 -0
  1223. package/src/modules/design_system/i18n/pl.json +58 -0
  1224. package/src/modules/design_system/index.ts +7 -0
  1225. package/src/modules/design_system/setup.ts +12 -0
  1226. package/src/modules/dictionaries/api/[dictionaryId]/entries/route.ts +39 -11
  1227. package/src/modules/dictionaries/api/openapi.ts +19 -0
  1228. package/src/modules/dictionaries/components/DictionaryEntrySelect.tsx +1 -1
  1229. package/src/modules/dictionaries/components/hooks/useDictionaryEntries.ts +35 -36
  1230. package/src/modules/dictionaries/data/validators.ts +14 -0
  1231. package/src/modules/dictionaries/i18n/ko.json +130 -0
  1232. package/src/modules/dictionaries/lib/clientEntries.ts +4 -3
  1233. package/src/modules/dictionaries/lib/fetchAllEntries.ts +72 -0
  1234. package/src/modules/directory/api/organization-branding/route.ts +12 -1
  1235. package/src/modules/directory/api/organization-switcher/route.ts +97 -26
  1236. package/src/modules/directory/api/organizations/route.ts +7 -0
  1237. package/src/modules/directory/api/tenants/route.ts +9 -1
  1238. package/src/modules/directory/backend/directory/branding/page.tsx +34 -9
  1239. package/src/modules/directory/backend/directory/organizations/[id]/edit/page.tsx +10 -14
  1240. package/src/modules/directory/backend/directory/organizations/page.tsx +2 -1
  1241. package/src/modules/directory/backend/directory/tenants/page.tsx +2 -1
  1242. package/src/modules/directory/commands/organizations.ts +9 -1
  1243. package/src/modules/directory/commands/tenants.ts +6 -0
  1244. package/src/modules/directory/data/entities.ts +3 -0
  1245. package/src/modules/directory/data/validators.ts +2 -0
  1246. package/src/modules/directory/extension-points.ts +11 -0
  1247. package/src/modules/directory/i18n/de.json +4 -1
  1248. package/src/modules/directory/i18n/en.json +4 -1
  1249. package/src/modules/directory/i18n/es.json +4 -1
  1250. package/src/modules/directory/i18n/ko.json +105 -0
  1251. package/src/modules/directory/i18n/pl.json +4 -1
  1252. package/src/modules/directory/migrations/.snapshot-open-mercato.json +18 -1
  1253. package/src/modules/directory/migrations/Migration20260626145500_directory_logo_preserve_aspect_ratio.ts +13 -0
  1254. package/src/modules/directory/subscribers/invalidateOrgScopeCache.ts +4 -1
  1255. package/src/modules/directory/utils/organizationScope.ts +9 -3
  1256. package/src/modules/entities/api/definitions.ts +55 -3
  1257. package/src/modules/entities/api/entities.ts +30 -2
  1258. package/src/modules/entities/api/entity-settings.ts +66 -22
  1259. package/src/modules/entities/api/records.ts +15 -31
  1260. package/src/modules/entities/api/sidebar-entities.ts +43 -14
  1261. package/src/modules/entities/backend/config/settings/page.meta.ts +34 -0
  1262. package/src/modules/entities/backend/config/settings/page.tsx +12 -0
  1263. package/src/modules/entities/backend/entities/user/[entityId]/page.tsx +1 -1
  1264. package/src/modules/entities/backend/entities/user/[entityId]/records/page.tsx +96 -75
  1265. package/src/modules/entities/backend/entities/user/create/page.tsx +16 -7
  1266. package/src/modules/entities/cli.ts +238 -21
  1267. package/src/modules/entities/components/EntitySettingsManager.tsx +160 -0
  1268. package/src/modules/entities/components/RecordListRelationCell.tsx +90 -0
  1269. package/src/modules/entities/components/SystemEntitiesTable.tsx +2 -1
  1270. package/src/modules/entities/components/UserEntitiesTable.tsx +2 -1
  1271. package/src/modules/entities/components/recordListRelationDisplays.ts +109 -0
  1272. package/src/modules/entities/extension-points.ts +18 -0
  1273. package/src/modules/entities/i18n/de.json +9 -0
  1274. package/src/modules/entities/i18n/en.json +9 -0
  1275. package/src/modules/entities/i18n/es.json +9 -0
  1276. package/src/modules/entities/i18n/ko.json +260 -0
  1277. package/src/modules/entities/i18n/pl.json +9 -0
  1278. package/src/modules/entities/lib/entityAcl.ts +98 -11
  1279. package/src/modules/feature_toggles/components/FeatureGuard.tsx +9 -2
  1280. package/src/modules/feature_toggles/components/FeatureToggleOverrideCard.tsx +1 -1
  1281. package/src/modules/feature_toggles/components/hooks/staleTime.ts +5 -0
  1282. package/src/modules/feature_toggles/components/hooks/useFeatureFlagBoolean.ts +13 -1
  1283. package/src/modules/feature_toggles/components/hooks/useFeatureFlagJson.ts +12 -3
  1284. package/src/modules/feature_toggles/components/hooks/useFeatureFlagNumber.ts +10 -1
  1285. package/src/modules/feature_toggles/components/hooks/useFeatureFlagString.ts +10 -1
  1286. package/src/modules/feature_toggles/i18n/ko.json +96 -0
  1287. package/src/modules/inbox_ops/ai-tools.ts +5 -3
  1288. package/src/modules/inbox_ops/api/proposals/[id]/actions/[actionId]/route.ts +17 -1
  1289. package/src/modules/inbox_ops/api/proposals/route.ts +20 -1
  1290. package/src/modules/inbox_ops/api/webhook/inbound.ts +14 -12
  1291. package/src/modules/inbox_ops/backend/inbox-ops/log/page.tsx +6 -6
  1292. package/src/modules/inbox_ops/components/proposals/EditActionDialog.tsx +24 -19
  1293. package/src/modules/inbox_ops/components/proposals/types.ts +1 -0
  1294. package/src/modules/inbox_ops/i18n/de.json +3 -0
  1295. package/src/modules/inbox_ops/i18n/en.json +3 -0
  1296. package/src/modules/inbox_ops/i18n/es.json +3 -0
  1297. package/src/modules/inbox_ops/i18n/ko.json +196 -0
  1298. package/src/modules/inbox_ops/i18n/pl.json +3 -0
  1299. package/src/modules/inbox_ops/search.ts +20 -4
  1300. package/src/modules/inbox_ops/subscribers/search-reindex-proposal-created.ts +39 -0
  1301. package/src/modules/integrations/api/[id]/credentials/route.ts +11 -5
  1302. package/src/modules/integrations/api/[id]/health/route.ts +6 -3
  1303. package/src/modules/integrations/api/[id]/route.ts +6 -3
  1304. package/src/modules/integrations/api/[id]/state/route.ts +6 -3
  1305. package/src/modules/integrations/api/[id]/version/route.ts +6 -3
  1306. package/src/modules/integrations/api/logs/route.ts +6 -3
  1307. package/src/modules/integrations/api/route.ts +6 -3
  1308. package/src/modules/integrations/api/umes-read.ts +2 -2
  1309. package/src/modules/integrations/backend/integrations/[id]/page.tsx +2 -2
  1310. package/src/modules/integrations/extension-points.ts +27 -0
  1311. package/src/modules/integrations/i18n/ko.json +129 -0
  1312. package/src/modules/integrations/lib/organization-scope.ts +5 -25
  1313. package/src/modules/integrations/widgets/injection/external-ids/widget.client.tsx +0 -5
  1314. package/src/modules/integrations/widgets/injection/external-ids/widget.ts +13 -0
  1315. package/src/modules/messages/api/[id]/route.ts +21 -0
  1316. package/src/modules/messages/api/route.ts +109 -9
  1317. package/src/modules/messages/components/ComposeMessagePageClient.tsx +2 -1
  1318. package/src/modules/messages/components/MessageDetailPageClient.tsx +3 -2
  1319. package/src/modules/messages/components/MessagesInboxPageClient.tsx +2 -1
  1320. package/src/modules/messages/components/message-detail/panels/dialogs.tsx +1 -1
  1321. package/src/modules/messages/extension-points.ts +13 -0
  1322. package/src/modules/messages/i18n/de.json +2 -0
  1323. package/src/modules/messages/i18n/en.json +2 -0
  1324. package/src/modules/messages/i18n/es.json +2 -0
  1325. package/src/modules/messages/i18n/ko.json +263 -0
  1326. package/src/modules/messages/i18n/pl.json +2 -0
  1327. package/src/modules/messages/lib/participantScope.ts +64 -0
  1328. package/src/modules/messages/lib/routeHelpers.ts +4 -6
  1329. package/src/modules/messages/lib/searchLookup.ts +11 -34
  1330. package/src/modules/messages/search.ts +11 -5
  1331. package/src/modules/notifications/api/route.ts +123 -3
  1332. package/src/modules/notifications/api/unread-count/route.ts +42 -5
  1333. package/src/modules/notifications/di.ts +1 -1
  1334. package/src/modules/notifications/events.ts +2 -0
  1335. package/src/modules/notifications/i18n/ko.json +55 -0
  1336. package/src/modules/notifications/lib/notificationRecipients.ts +6 -8
  1337. package/src/modules/notifications/lib/notificationScope.ts +40 -0
  1338. package/src/modules/notifications/lib/notificationService.ts +63 -1
  1339. package/src/modules/notifications/lib/routeHelpers.ts +19 -2
  1340. package/src/modules/payment_gateways/api/capture/route.ts +1 -1
  1341. package/src/modules/payment_gateways/api/sessions/route.ts +6 -3
  1342. package/src/modules/payment_gateways/api/webhook/[provider]/route.ts +13 -1
  1343. package/src/modules/payment_gateways/backend/payment-gateways/page.tsx +3 -2
  1344. package/src/modules/payment_gateways/data/entities.ts +13 -2
  1345. package/src/modules/payment_gateways/di.ts +28 -2
  1346. package/src/modules/payment_gateways/extension-points.ts +16 -0
  1347. package/src/modules/payment_gateways/i18n/de.json +8 -1
  1348. package/src/modules/payment_gateways/i18n/en.json +8 -1
  1349. package/src/modules/payment_gateways/i18n/es.json +8 -1
  1350. package/src/modules/payment_gateways/i18n/ko.json +87 -0
  1351. package/src/modules/payment_gateways/i18n/pl.json +8 -1
  1352. package/src/modules/payment_gateways/lib/capture-ledger.ts +260 -0
  1353. package/src/modules/payment_gateways/lib/gateway-service.ts +114 -18
  1354. package/src/modules/payment_gateways/lib/order-amount-reconciliation.ts +93 -0
  1355. package/src/modules/payment_gateways/lib/payment-operation-idempotency.ts +1 -0
  1356. package/src/modules/payment_gateways/lib/session-idempotency.ts +36 -0
  1357. package/src/modules/payment_gateways/migrations/.snapshot-open-mercato.json +44 -1
  1358. package/src/modules/payment_gateways/migrations/Migration20260725101500_payment_gateways.ts +21 -0
  1359. package/src/modules/payment_gateways/migrations/Migration20260803103035_payment_gateways.ts +17 -0
  1360. package/src/modules/payment_gateways/setup.ts +62 -0
  1361. package/src/modules/payment_gateways/workers/session-initialization-prune.ts +63 -0
  1362. package/src/modules/planner/components/AvailabilityRulesEditor.tsx +4 -4
  1363. package/src/modules/planner/components/unavailabilityReasons.ts +3 -3
  1364. package/src/modules/planner/i18n/ko.json +565 -0
  1365. package/src/modules/portal/extension-points.ts +30 -0
  1366. package/src/modules/portal/frontend/[orgSlug]/portal/dashboard/page.tsx +3 -3
  1367. package/src/modules/portal/frontend/[orgSlug]/portal/invite/page.meta.ts +9 -0
  1368. package/src/modules/portal/frontend/[orgSlug]/portal/invite/page.tsx +164 -0
  1369. package/src/modules/portal/frontend/[orgSlug]/portal/login/page.tsx +4 -4
  1370. package/src/modules/portal/frontend/[orgSlug]/portal/page.tsx +3 -3
  1371. package/src/modules/portal/frontend/[orgSlug]/portal/profile/page.tsx +3 -3
  1372. package/src/modules/portal/frontend/[orgSlug]/portal/reset-password/page.tsx +5 -5
  1373. package/src/modules/portal/frontend/[orgSlug]/portal/signup/page.tsx +4 -4
  1374. package/src/modules/portal/frontend/[orgSlug]/portal/verify/page.tsx +1 -1
  1375. package/src/modules/portal/i18n/de.json +18 -0
  1376. package/src/modules/portal/i18n/en.json +18 -0
  1377. package/src/modules/portal/i18n/es.json +18 -0
  1378. package/src/modules/portal/i18n/ko.json +143 -0
  1379. package/src/modules/portal/i18n/pl.json +18 -0
  1380. package/src/modules/portal/lib/navigation.ts +3 -0
  1381. package/src/modules/progress/AGENTS.md +11 -1
  1382. package/src/modules/progress/i18n/ko.json +20 -0
  1383. package/src/modules/progress/lib/progressService.ts +1 -0
  1384. package/src/modules/progress/lib/progressServiceImpl.ts +385 -117
  1385. package/src/modules/query_index/api/openapi.ts +12 -0
  1386. package/src/modules/query_index/api/reindex.ts +15 -0
  1387. package/src/modules/query_index/api/status.ts +238 -136
  1388. package/src/modules/query_index/cli.ts +180 -1
  1389. package/src/modules/query_index/components/QueryIndexesTable.tsx +194 -47
  1390. package/src/modules/query_index/data/entities.ts +7 -0
  1391. package/src/modules/query_index/di.ts +6 -0
  1392. package/src/modules/query_index/events.ts +17 -0
  1393. package/src/modules/query_index/extension-points.ts +10 -0
  1394. package/src/modules/query_index/i18n/de.json +5 -3
  1395. package/src/modules/query_index/i18n/en.json +5 -3
  1396. package/src/modules/query_index/i18n/es.json +5 -3
  1397. package/src/modules/query_index/i18n/ko.json +69 -0
  1398. package/src/modules/query_index/i18n/pl.json +5 -3
  1399. package/src/modules/query_index/lib/batch.ts +11 -4
  1400. package/src/modules/query_index/lib/coverage.ts +47 -14
  1401. package/src/modules/query_index/lib/document.ts +35 -4
  1402. package/src/modules/query_index/lib/engine.ts +136 -59
  1403. package/src/modules/query_index/lib/indexer.ts +130 -21
  1404. package/src/modules/query_index/lib/reindexer.ts +62 -40
  1405. package/src/modules/query_index/lib/search-tokens.ts +48 -16
  1406. package/src/modules/query_index/lib/subscriber-scope.ts +2 -7
  1407. package/src/modules/query_index/migrations/.snapshot-open-mercato.json +12 -0
  1408. package/src/modules/query_index/migrations/Migration20260731105052_query_index.ts +35 -0
  1409. package/src/modules/query_index/subscribers/coverage_refresh.ts +4 -0
  1410. package/src/modules/query_index/subscribers/delete_one.ts +65 -1
  1411. package/src/modules/query_index/subscribers/upsert_one.ts +68 -1
  1412. package/src/modules/resources/api/resources.ts +2 -0
  1413. package/src/modules/resources/backend/resources/resource-types/page.tsx +2 -1
  1414. package/src/modules/resources/backend/resources/resources/[id]/page.tsx +9 -3
  1415. package/src/modules/resources/backend/resources/resources/page.tsx +2 -1
  1416. package/src/modules/resources/commands/resources.ts +10 -0
  1417. package/src/modules/resources/components/detail/dictionaries.ts +3 -3
  1418. package/src/modules/resources/data/entities.ts +3 -0
  1419. package/src/modules/resources/data/validators.ts +5 -0
  1420. package/src/modules/resources/extension-points.ts +11 -0
  1421. package/src/modules/resources/i18n/ko.json +770 -0
  1422. package/src/modules/resources/lib/seeds.ts +16 -9
  1423. package/src/modules/resources/migrations/.snapshot-open-mercato.json +17 -1
  1424. package/src/modules/resources/migrations/Migration20260608231000.ts +13 -0
  1425. package/src/modules/sales/analytics.ts +4 -0
  1426. package/src/modules/sales/api/document-history/route.ts +1 -0
  1427. package/src/modules/sales/api/documents/factory.ts +28 -3
  1428. package/src/modules/sales/backend/sales/documents/[id]/page.tsx +11 -3
  1429. package/src/modules/sales/backend/sales/documents/create/page.tsx +2 -4
  1430. package/src/modules/sales/commands/documents.ts +298 -31
  1431. package/src/modules/sales/components/documents/ItemsSection.tsx +34 -11
  1432. package/src/modules/sales/components/documents/LineItemDialog.tsx +13 -5
  1433. package/src/modules/sales/components/documents/SalesDocumentForm.tsx +48 -6
  1434. package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +6 -1
  1435. package/src/modules/sales/components/documents/SalesOrderDraftLines.tsx +198 -0
  1436. package/src/modules/sales/components/documents/lineItemTypes.ts +1 -0
  1437. package/src/modules/sales/components/useSalesChannelsEnabled.ts +2 -48
  1438. package/src/modules/sales/data/validators.ts +59 -6
  1439. package/src/modules/sales/di.ts +9 -0
  1440. package/src/modules/sales/events.ts +1 -0
  1441. package/src/modules/sales/extension-points.ts +33 -0
  1442. package/src/modules/sales/i18n/de.json +22 -0
  1443. package/src/modules/sales/i18n/en.json +22 -0
  1444. package/src/modules/sales/i18n/es.json +22 -0
  1445. package/src/modules/sales/i18n/ko.json +1442 -0
  1446. package/src/modules/sales/i18n/pl.json +22 -0
  1447. package/src/modules/sales/lib/historyHelpers.ts +88 -1
  1448. package/src/modules/sales/services/paymentOrderTotalResolver.ts +67 -0
  1449. package/src/modules/sales/widgets/injection/document-history/widget.client.tsx +64 -3
  1450. package/src/modules/sales/workflows.ts +10 -7
  1451. package/src/modules/shipping_carriers/api/webhook/[provider]/route.ts +11 -1
  1452. package/src/modules/shipping_carriers/i18n/ko.json +85 -0
  1453. package/src/modules/shipping_carriers/lib/shipment-wizard/components/PackageEditor.tsx +1 -1
  1454. package/src/modules/staff/api/interceptors.ts +6 -4
  1455. package/src/modules/staff/api/leave-requests.ts +54 -47
  1456. package/src/modules/staff/components/detail/dictionaries.ts +3 -3
  1457. package/src/modules/staff/i18n/ko.json +1162 -0
  1458. package/src/modules/sync_excel/api/upload/route.ts +15 -2
  1459. package/src/modules/sync_excel/i18n/ko.json +107 -0
  1460. package/src/modules/sync_excel/widgets/injection/upload-config/widget.client.tsx +1 -1
  1461. package/src/modules/translations/i18n/ko.json +45 -0
  1462. package/src/modules/wms/components/backend/ReleaseReservationDialog.tsx +1 -1
  1463. package/src/modules/wms/components/backend/WmsConfigurationPage.tsx +5 -4
  1464. package/src/modules/wms/components/backend/WmsInventoryConsolePage.tsx +4 -3
  1465. package/src/modules/wms/components/backend/WmsLocationDetailPage.tsx +3 -2
  1466. package/src/modules/wms/components/backend/WmsLotDetailPage.tsx +3 -2
  1467. package/src/modules/wms/components/backend/WmsLotsListPage.tsx +2 -1
  1468. package/src/modules/wms/components/backend/WmsSkuDetailPage.tsx +3 -2
  1469. package/src/modules/wms/extension-points.ts +23 -0
  1470. package/src/modules/wms/i18n/de.json +2 -0
  1471. package/src/modules/wms/i18n/en.json +2 -0
  1472. package/src/modules/wms/i18n/es.json +2 -0
  1473. package/src/modules/wms/i18n/ko.json +1053 -0
  1474. package/src/modules/wms/i18n/pl.json +2 -0
  1475. package/src/modules/workflows/backend/definitions/[id]/page.tsx +2 -2
  1476. package/src/modules/workflows/backend/definitions/create/page.tsx +1 -1
  1477. package/src/modules/workflows/backend/definitions/page.tsx +3 -2
  1478. package/src/modules/workflows/backend/definitions/visual-editor/page.tsx +16 -7
  1479. package/src/modules/workflows/backend/instances/page.tsx +10 -9
  1480. package/src/modules/workflows/backend/tasks/page.tsx +8 -7
  1481. package/src/modules/workflows/components/ActivitiesEditor.tsx +98 -14
  1482. package/src/modules/workflows/components/BusinessRulesSelector.tsx +1 -1
  1483. package/src/modules/workflows/components/DefinitionTriggersEditor.tsx +3 -3
  1484. package/src/modules/workflows/components/EdgeEditDialogCrudForm.tsx +1 -2
  1485. package/src/modules/workflows/components/NodeEditDialog.tsx +3 -3
  1486. package/src/modules/workflows/components/NodeEditDialogCrudForm.tsx +4 -5
  1487. package/src/modules/workflows/components/StepsEditor.tsx +2 -2
  1488. package/src/modules/workflows/components/TransitionsEditor.tsx +78 -20
  1489. package/src/modules/workflows/components/WorkflowGraphImpl.tsx +1 -1
  1490. package/src/modules/workflows/components/WorkflowLegend.tsx +1 -1
  1491. package/src/modules/workflows/components/WorkflowSelector.tsx +1 -1
  1492. package/src/modules/workflows/components/fields/BusinessRuleConditionsEditor.tsx +1 -1
  1493. package/src/modules/workflows/components/fields/FormFieldArrayEditor.tsx +2 -2
  1494. package/src/modules/workflows/components/fields/MappingArrayEditor.tsx +1 -1
  1495. package/src/modules/workflows/components/fields/StartPreConditionsEditor.tsx +1 -1
  1496. package/src/modules/workflows/components/fields/WorkflowSelectorField.tsx +4 -4
  1497. package/src/modules/workflows/data/validators.ts +52 -1
  1498. package/src/modules/workflows/events.ts +1 -0
  1499. package/src/modules/workflows/extension-points.ts +12 -0
  1500. package/src/modules/workflows/i18n/de.json +3 -0
  1501. package/src/modules/workflows/i18n/en.json +3 -0
  1502. package/src/modules/workflows/i18n/es.json +3 -0
  1503. package/src/modules/workflows/i18n/ko.json +1204 -0
  1504. package/src/modules/workflows/i18n/pl.json +3 -0
  1505. package/src/modules/workflows/lib/activity-executor.ts +99 -20
  1506. package/src/modules/workflows/lib/format-validation-error.ts +60 -0
  1507. package/src/modules/workflows/widgets/injection/order-approval/context-keys.ts +18 -0
  1508. package/src/modules/workflows/widgets/injection/order-approval/widget.client.tsx +27 -11
@@ -1,5 +1,6 @@
1
1
  import { Organization } from "@open-mercato/core/modules/directory/data/entities";
2
2
  import { isAllOrganizationsSelection } from "@open-mercato/core/modules/directory/constants";
3
+ import { getCurrentCacheTenant, runWithCacheTenant } from "@open-mercato/cache";
3
4
  import { parseSelectedOrganizationCookie, parseSelectedTenantCookie } from "./scopeCookies.js";
4
5
  import { createLogger } from "@open-mercato/shared/lib/logger";
5
6
  const logger = createLogger("directory").child({ component: "org-scope-cache" });
@@ -47,11 +48,15 @@ function resolveCacheFromContainer(container) {
47
48
  }
48
49
  return null;
49
50
  }
50
- async function invalidateOrganizationScopeCacheForUser(container, userId) {
51
+ async function invalidateOrganizationScopeCacheForUser(container, userId, tenantId) {
51
52
  const cache = resolveCacheFromContainer(container);
52
53
  if (!cache?.deleteByTags) return;
53
54
  try {
54
- await cache.deleteByTags([buildOrgScopeUserCacheTag(userId)]);
55
+ const cacheTenantId = tenantId === void 0 ? getCurrentCacheTenant() : tenantId;
56
+ await runWithCacheTenant(
57
+ cacheTenantId,
58
+ () => cache.deleteByTags([buildOrgScopeUserCacheTag(userId)])
59
+ );
55
60
  } catch (err) {
56
61
  logger.warn("Cache invalidate user failed", { err });
57
62
  }
@@ -60,7 +65,10 @@ async function invalidateOrganizationScopeCacheForTenant(container, tenantId) {
60
65
  const cache = resolveCacheFromContainer(container);
61
66
  if (!cache?.deleteByTags) return;
62
67
  try {
63
- await cache.deleteByTags([buildOrgScopeTenantCacheTag(tenantId)]);
68
+ await runWithCacheTenant(
69
+ tenantId,
70
+ () => cache.deleteByTags([buildOrgScopeTenantCacheTag(tenantId)])
71
+ );
64
72
  } catch (err) {
65
73
  logger.warn("Cache invalidate tenant failed", { err });
66
74
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/directory/utils/organizationScope.ts"],
4
- "sourcesContent": ["import type { EntityManager } from '@mikro-orm/postgresql'\nimport type { FilterQuery } from '@mikro-orm/core'\nimport type { AwilixContainer } from 'awilix'\nimport { Organization } from '@open-mercato/core/modules/directory/data/entities'\nimport { isAllOrganizationsSelection } from '@open-mercato/core/modules/directory/constants'\nimport type { RbacService } from '@open-mercato/core/modules/auth/services/rbacService'\nimport type { AuthContext } from '@open-mercato/shared/lib/auth/server'\nimport type { CacheStrategy } from '@open-mercato/cache'\nimport { parseSelectedOrganizationCookie, parseSelectedTenantCookie } from './scopeCookies'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\n\nconst logger = createLogger('directory').child({ component: 'org-scope-cache' })\n\nexport { parseSelectedOrganizationCookie, parseSelectedTenantCookie }\n\nexport type OrganizationScope = {\n selectedId: string | null\n filterIds: string[] | null\n allowedIds: string[] | null\n tenantId: string | null\n // True when the caller explicitly selected a concrete organization (cookie /\n // selectedId param) that could not be honored \u2014 it does not exist for the\n // tenant or is not accessible. Reads degrade gracefully (filterIds/selectedId\n // fall back to the caller's accessible orgs), but writes MUST fail loudly on\n // this so a record never lands under an org the caller did not intend. Absent\n // (undefined) means the selection \u2014 if any \u2014 was honored.\n selectionRejected?: boolean\n}\n\n// Phase 4 \u2014 short-TTL cache for resolveOrganizationScopeForRequest.\n// OrganizationScope is a pure function of (userId, tenantId, selectedOrgId,\n// requestedTenant) between membership changes; caching it bypasses 1\n// SELECT on `organizations` per CRUD request. TTL is short (60s default)\n// to keep staleness bounded as a backstop. Tag-based invalidation also fires\n// eagerly: per-user entries are dropped by RbacService.invalidateUserCache\n// (every ACL/role grant change goes through it \u2014 see buildOrgScopeUserCacheTag)\n// and per-tenant entries by the directory.organization.* subscriber plus\n// RbacService.invalidateTenantCache (role-ACL changes).\nconst ORG_SCOPE_CACHE_KEY_PREFIX = 'org-scope'\n// Phase 4 default-off until the same readiness probe (`GET /api/customers/people`)\n// stays green with the cache layer engaged. Set `OM_ORG_SCOPE_CACHE_TTL_MS=60000`\n// (or any positive integer) to opt in once cross-request safety is re-verified.\nconst ORG_SCOPE_DEFAULT_TTL_MS = 0\n\nfunction resolveOrgScopeTtlMs(): number {\n const raw = process.env.OM_ORG_SCOPE_CACHE_TTL_MS\n if (raw === undefined) return ORG_SCOPE_DEFAULT_TTL_MS\n const parsed = Number(raw)\n if (!Number.isFinite(parsed) || parsed < 0) return ORG_SCOPE_DEFAULT_TTL_MS\n return parsed\n}\n\nfunction buildOrgScopeCacheKey(parts: {\n userId: string\n effectiveTenantId: string\n selectedOrgId: string | null\n requestedTenantId: string | null\n}): string {\n const selected = parts.selectedOrgId ?? 'none'\n const requested = parts.requestedTenantId ?? 'none'\n return `${ORG_SCOPE_CACHE_KEY_PREFIX}:${parts.userId}:${parts.effectiveTenantId}:${selected}:${requested}`\n}\n\n// Tag builders are exported so the modules that own the \"this user's scope\n// changed\" / \"this tenant's org tree changed\" signals (auth RBAC invalidation,\n// the directory.organization.* subscriber) can drop the matching cross-request\n// cache entries without re-deriving the tag format. Keeping the format in one\n// place is what lets the TTL be enabled safely (issue #2259).\nexport function buildOrgScopeUserCacheTag(userId: string): string {\n return `${ORG_SCOPE_CACHE_KEY_PREFIX}:user:${userId}`\n}\n\nexport function buildOrgScopeTenantCacheTag(tenantId: string): string {\n return `${ORG_SCOPE_CACHE_KEY_PREFIX}:tenant:${tenantId}`\n}\n\nfunction buildOrgScopeCacheTags(parts: { userId: string; effectiveTenantId: string }): string[] {\n return [\n buildOrgScopeUserCacheTag(parts.userId),\n buildOrgScopeTenantCacheTag(parts.effectiveTenantId),\n ]\n}\n\nfunction isValidCachedScope(value: unknown): value is OrganizationScope {\n if (typeof value !== 'object' || value === null) return false\n const record = value as Partial<OrganizationScope>\n const idOk = (v: unknown) => v === null || typeof v === 'string'\n const arrOk = (v: unknown) => v === null || (Array.isArray(v) && v.every((entry) => typeof entry === 'string'))\n const flagOk = record.selectionRejected === undefined || typeof record.selectionRejected === 'boolean'\n return idOk(record.selectedId) && idOk(record.tenantId) && arrOk(record.filterIds) && arrOk(record.allowedIds) && flagOk\n}\n\nfunction resolveCacheFromContainer(container: AwilixContainer | null | undefined): CacheStrategy | null {\n if (!container) return null\n try {\n const c = container.resolve('cache') as CacheStrategy | undefined\n if (c && typeof c.get === 'function' && typeof c.set === 'function') return c\n } catch {\n return null\n }\n return null\n}\n\nexport async function invalidateOrganizationScopeCacheForUser(\n container: AwilixContainer,\n userId: string,\n): Promise<void> {\n const cache = resolveCacheFromContainer(container)\n if (!cache?.deleteByTags) return\n try {\n await cache.deleteByTags([buildOrgScopeUserCacheTag(userId)])\n } catch (err) {\n logger.warn('Cache invalidate user failed', { err })\n }\n}\n\nexport async function invalidateOrganizationScopeCacheForTenant(\n container: AwilixContainer,\n tenantId: string,\n): Promise<void> {\n const cache = resolveCacheFromContainer(container)\n if (!cache?.deleteByTags) return\n try {\n await cache.deleteByTags([buildOrgScopeTenantCacheTag(tenantId)])\n } catch (err) {\n logger.warn('Cache invalidate tenant failed', { err })\n }\n}\n\n// Issue #2259 \u2014 per-request memoization. resolveOrganizationScopeForRequest\n// runs at least twice per CRUD request: once for the route-level feature check\n// (resolveFeatureCheckContext) and once inside the shared factory's withCtx.\n// Those two call sites use different request-scoped DI containers but are handed\n// the SAME Request instance, so memoizing the resolved scope on a WeakMap keyed\n// by that request collapses the duplicate work \u2014 and the duplicate\n// `organizations` SELECT \u2014 into a single resolution. The inner map is keyed by\n// the same identity tuple as the cross-request cache key, so distinct explicit\n// selectedId/tenant overrides on one request stay independent. There is no\n// staleness risk: the memo lives only for the lifetime of one request and is\n// dropped with the request object by the GC.\nconst orgScopeRequestMemo = new WeakMap<object, Map<string, Promise<OrganizationScope>>>()\n\nfunction getRequestScopeMemo(request: unknown): Map<string, Promise<OrganizationScope>> | null {\n if (!request || (typeof request !== 'object' && typeof request !== 'function')) return null\n const key = request as object\n let memo = orgScopeRequestMemo.get(key)\n if (!memo) {\n memo = new Map<string, Promise<OrganizationScope>>()\n orgScopeRequestMemo.set(key, memo)\n }\n return memo\n}\n\nfunction normalizeOrganizationId(value: unknown): string | null {\n if (typeof value !== 'string') return null\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : null\n}\n\nexport function getSelectedOrganizationFromRequest(req: Request | { cookies?: { get: (name: string) => { value: string } | undefined }; headers?: { get(name: string): string | null } }): string | null {\n const cookieContainer = (req as { cookies?: { get: (name: string) => { value: string } | undefined } }).cookies\n if (cookieContainer && typeof cookieContainer.get === 'function') {\n const val = cookieContainer.get('om_selected_org')?.value\n return val ?? null\n }\n const headerContainer = (req as { headers?: { get(name: string): string | null } }).headers\n const header = typeof headerContainer?.get === 'function' ? headerContainer.get('cookie') : null\n return parseSelectedOrganizationCookie(header)\n}\n\nexport function getSelectedTenantFromRequest(\n req: Request | { cookies?: { get: (name: string) => { value: string } | undefined }; headers?: { get(name: string): string | null } },\n): string | null {\n const cookieContainer = (req as { cookies?: { get: (name: string) => { value: string } | undefined } }).cookies\n if (cookieContainer && typeof cookieContainer.get === 'function') {\n const val = cookieContainer.get('om_selected_tenant')?.value\n return val ?? null\n }\n const headerContainer = (req as { headers?: { get(name: string): string | null } }).headers\n const header = typeof headerContainer?.get === 'function' ? headerContainer.get('cookie') : null\n return parseSelectedTenantCookie(header)\n}\n\nfunction normalizeOrganizationIds(ids: string[]): string[] {\n return Array.from(new Set(\n ids.map((value) => normalizeOrganizationId(value)).filter((value): value is string => {\n if (!value) return false\n if (isAllOrganizationsSelection(value)) return false\n return true\n })\n ))\n}\n\n// Map each organization id to itself plus its persisted descendant ids. Only\n// orgs that exist for the tenant and are not soft-deleted are included, so an\n// unknown/inaccessible id simply has no entry (matching the per-id query that\n// returned an empty set for it).\ntype OrgDescendantMap = Map<string, string[]>\n\n// Issue #2228 \u2014 single round-trip for org-scope resolution. Instead of issuing\n// one `organizations` SELECT per `collectWithDescendants` call (up to 3-4\n// sequential queries per request: accessible set, fallback set, selected set),\n// gather every candidate id up front and fetch their descendant expansions in\n// one `em.find(Organization, { id: $in })`. Expansion then happens in-memory.\nasync function loadOrgDescendantMap(em: EntityManager, tenantId: string, ids: string[]): Promise<OrgDescendantMap> {\n const unique = normalizeOrganizationIds(ids)\n if (!unique.length) return new Map()\n const filter: FilterQuery<Organization> = {\n tenant: tenantId,\n id: { $in: unique },\n deletedAt: null,\n }\n const orgs = await em.find(Organization, filter)\n const map: OrgDescendantMap = new Map()\n for (const org of orgs) {\n const id = String(org.id)\n const expansion = [id]\n if (Array.isArray(org.descendantIds)) {\n for (const desc of org.descendantIds) expansion.push(String(desc))\n }\n map.set(id, expansion)\n }\n return map\n}\n\nfunction expandWithDescendants(map: OrgDescendantMap, ids: string[]): Set<string> {\n const set = new Set<string>()\n for (const value of ids) {\n const id = normalizeOrganizationId(value)\n if (!id || isAllOrganizationsSelection(id)) continue\n const expansion = map.get(id)\n if (!expansion) continue\n for (const entry of expansion) set.add(entry)\n }\n return set\n}\n\nexport async function resolveOrganizationScope({\n em,\n rbac,\n auth,\n selectedId,\n tenantId: tenantIdOverride,\n}: {\n em: EntityManager\n rbac: RbacService\n auth: AuthContext\n selectedId?: string | null\n tenantId?: string | null\n}): Promise<OrganizationScope> {\n if (!auth || !auth.sub) {\n return { selectedId: null, filterIds: null, allowedIds: null, tenantId: null }\n }\n const actorTenantId = typeof auth.tenantId === 'string' && auth.tenantId.trim().length > 0 ? auth.tenantId.trim() : null\n const candidateTenantId = typeof tenantIdOverride === 'string' && tenantIdOverride.trim().length > 0\n ? tenantIdOverride.trim()\n : tenantIdOverride === null\n ? null\n : actorTenantId\n if (!candidateTenantId) {\n return { selectedId: null, filterIds: null, allowedIds: null, tenantId: null }\n }\n const usingOverride = candidateTenantId !== actorTenantId\n const isSuperAdminActor = auth.isSuperAdmin === true\n const tenantId = usingOverride && actorTenantId && !isSuperAdminActor ? actorTenantId : candidateTenantId\n if (!tenantId) {\n return { selectedId: null, filterIds: null, allowedIds: null, tenantId: null }\n }\n const normalizedRequestedSelection = normalizeOrganizationId(selectedId)\n const explicitAllOrgsChoice =\n normalizedRequestedSelection !== null && isAllOrganizationsSelection(normalizedRequestedSelection)\n const normalizedSelectedId = explicitAllOrgsChoice\n ? null\n : normalizedRequestedSelection\n const contextOrgId = actorTenantId && actorTenantId === tenantId ? normalizeOrganizationId(auth.orgId) : null\n const acl = await rbac.loadAcl(auth.sub, { tenantId, organizationId: contextOrgId })\n const aclIsSuperAdmin = acl?.isSuperAdmin === true\n const effectiveSuperAdmin = aclIsSuperAdmin || isSuperAdminActor\n const normalizedAccessible = effectiveSuperAdmin\n ? null\n : Array.isArray(acl?.organizations)\n ? acl.organizations\n .map((value) => normalizeOrganizationId(value))\n .filter((value): value is string => value !== null)\n : null\n const accessibleList = effectiveSuperAdmin\n ? null\n : normalizedAccessible && normalizedAccessible.some((value) => isAllOrganizationsSelection(value))\n ? null\n : normalizedAccessible?.filter((value) => !isAllOrganizationsSelection(value)) ?? null\n\n const accountOrgId = actorTenantId && actorTenantId === tenantId ? normalizeOrganizationId(auth.orgId) : null\n const fallbackOrgId = accountOrgId ?? null\n\n // Every id that could be expanded below \u2014 accessible set, fallback (account)\n // org, and the requested selection \u2014 is known up front, so fetch them all in\n // a single `organizations` query and expand from the in-memory map.\n const candidateIds = [\n ...(accessibleList ?? []),\n ...(fallbackOrgId ? [fallbackOrgId] : []),\n ...(normalizedSelectedId ? [normalizedSelectedId] : []),\n ]\n const orgDescendants = await loadOrgDescendantMap(em, tenantId, candidateIds)\n const loadFallbackSet = (): Set<string> | null =>\n fallbackOrgId ? expandWithDescendants(orgDescendants, [fallbackOrgId]) : null\n\n let allowedSet: Set<string> | null = null\n if (accessibleList === null) {\n allowedSet = null\n } else if (accessibleList.length === 0) {\n allowedSet = new Set()\n } else {\n allowedSet = expandWithDescendants(orgDescendants, accessibleList)\n }\n\n if (allowedSet && allowedSet.size === 0 && fallbackOrgId) {\n const computed = loadFallbackSet()\n if (computed && computed.size > 0) {\n allowedSet = computed\n }\n }\n\n const hasUnrestrictedAccess = effectiveSuperAdmin || (accessibleList === null)\n const noOrgSelection = normalizedSelectedId === null && !explicitAllOrgsChoice\n const widenToAllOrgs =\n (explicitAllOrgsChoice && hasUnrestrictedAccess)\n || (effectiveSuperAdmin && noOrgSelection)\n const initialSelected =\n normalizedSelectedId\n ?? (widenToAllOrgs ? null : accountOrgId ?? null)\n // A selection is only honored when it resolves to a real, non-deleted org for\n // this tenant. `orgDescendants` holds exactly the existing orgs among the\n // candidate ids, so a stale/dead id (e.g. a selected-org cookie or JWT org\n // that no longer resolves after a DB reset) has no entry and is dropped here.\n // Without the existence guard an unrestricted (all-orgs) principal \u2014 whose\n // `allowedSet` is null \u2014 would accept the dead id as `effectiveSelected`, and\n // writes derived from `selectedId` would land under an org the read scope\n // (`filterIds`) never filters to, silently orphaning the record.\n const selectionResolvesToOrg = (id: string): boolean => orgDescendants.has(id)\n let effectiveSelected: string | null = null\n if (initialSelected) {\n if ((allowedSet === null || allowedSet.has(initialSelected)) && selectionResolvesToOrg(initialSelected)) {\n effectiveSelected = initialSelected\n }\n }\n\n let filterSet: Set<string> | null = null\n if (effectiveSelected) {\n filterSet = expandWithDescendants(orgDescendants, [effectiveSelected])\n } else if (allowedSet !== null) {\n filterSet = allowedSet\n } else if (widenToAllOrgs) {\n filterSet = null\n } else if (auth.orgId) {\n filterSet = loadFallbackSet()\n // Keep the write target (`selectedId`) aligned with the read scope\n // (`filterIds`): when an unrestricted principal's requested selection was\n // dropped above, fall the selection back to the account org too so a record\n // created here is always readable back by the same caller.\n if (!effectiveSelected && fallbackOrgId && filterSet && filterSet.size > 0) {\n effectiveSelected = fallbackOrgId\n }\n }\n\n if ((!filterSet || filterSet.size === 0) && fallbackOrgId && !widenToAllOrgs) {\n const computed = loadFallbackSet()\n if (computed && computed.size > 0) {\n filterSet = computed\n if (!effectiveSelected) {\n effectiveSelected = fallbackOrgId\n }\n }\n }\n\n // A concrete organization was explicitly requested (`normalizedSelectedId` is\n // null for both \"no selection\" and the \"all organizations\" token) but the\n // resolver could not honor it \u2014 it was dropped as non-existent/inaccessible\n // and the effective selection fell back to something else. Surface this so the\n // write layer can reject the request instead of silently creating the record\n // under the fallback org. Only set the field when true to keep the scope shape\n // unchanged for the common (honored) case.\n const selectionRejected = normalizedSelectedId !== null && effectiveSelected !== normalizedSelectedId\n\n return {\n selectedId: effectiveSelected,\n filterIds: filterSet ? Array.from(filterSet) : null,\n allowedIds: allowedSet ? Array.from(allowedSet) : null,\n tenantId,\n ...(selectionRejected ? { selectionRejected: true } : {}),\n }\n}\n\nexport async function resolveOrganizationScopeForRequest({\n container,\n auth,\n request,\n selectedId,\n tenantId: tenantOverride,\n}: {\n container: AwilixContainer\n auth: AuthContext | null | undefined\n request?: Request | { cookies?: { get: (name: string) => { value: string } | undefined }; headers?: { get(name: string): string | null } }\n selectedId?: string | null\n tenantId?: string | null\n}): Promise<OrganizationScope> {\n if (!auth || !auth.sub) {\n return { selectedId: null, filterIds: null, allowedIds: null, tenantId: null }\n }\n\n let em: EntityManager | null = null\n let rbac: RbacService | null = null\n try { em = container.resolve<EntityManager>('em') } catch { em = null }\n try { rbac = container.resolve<RbacService>('rbacService') } catch { rbac = null }\n const normalizeString = (value: unknown): string | null => {\n if (typeof value === 'string' && value.trim().length > 0) return value.trim()\n return null\n }\n if (!em || !rbac) {\n const fallbackSelected = normalizeOrganizationId(selectedId ?? auth.orgId ?? null)\n return {\n selectedId: fallbackSelected,\n filterIds: fallbackSelected ? [fallbackSelected] : null,\n allowedIds: fallbackSelected ? [fallbackSelected] : null,\n tenantId: normalizeString(auth.tenantId),\n }\n }\n\n const actorTenantField = (auth as { actorTenantId?: string | null }).actorTenantId\n const actorTenant = actorTenantField === undefined\n ? normalizeString(auth.tenantId)\n : actorTenantField === null\n ? null\n : normalizeString(actorTenantField)\n const actorOrgField = (auth as { actorOrgId?: string | null }).actorOrgId\n const actorOrgId = actorOrgField === undefined\n ? normalizeString(auth.orgId)\n : actorOrgField === null\n ? null\n : normalizeString(actorOrgField)\n\n const cookieTenant = request ? getSelectedTenantFromRequest(request) : null\n const requestedTenant =\n tenantOverride !== undefined\n ? tenantOverride\n : cookieTenant !== undefined\n ? cookieTenant\n : undefined\n const requestedTenantId = typeof requestedTenant === 'string' && requestedTenant.trim().length > 0 ? requestedTenant.trim() : null\n const isSuperAdminActor = auth.isSuperAdmin === true\n let effectiveTenantId = requestedTenantId ?? actorTenant ?? null\n if (actorTenant && effectiveTenantId && effectiveTenantId !== actorTenant && !isSuperAdminActor) {\n effectiveTenantId = actorTenant\n }\n if (!effectiveTenantId) {\n return { selectedId: null, filterIds: null, allowedIds: null, tenantId: null }\n }\n\n const scopedAuth = {\n ...auth,\n tenantId: effectiveTenantId,\n orgId: actorTenant && actorTenant === effectiveTenantId ? actorOrgId ?? null : null,\n }\n\n const rawSelected = selectedId !== undefined ? selectedId : (request ? getSelectedOrganizationFromRequest(request) : null)\n const normalizedSelectedId = typeof rawSelected === 'string' && rawSelected.trim().length > 0\n ? rawSelected.trim()\n : null\n\n const userId = typeof auth.sub === 'string' && auth.sub.length > 0 ? auth.sub : null\n const ttlMs = resolveOrgScopeTtlMs()\n const cache = ttlMs > 0 ? resolveCacheFromContainer(container) : null\n const cacheKey = userId\n ? buildOrgScopeCacheKey({\n userId,\n effectiveTenantId,\n selectedOrgId: normalizedSelectedId,\n requestedTenantId: requestedTenantId ?? null,\n })\n : null\n\n const requestMemo = getRequestScopeMemo(request)\n if (requestMemo && cacheKey) {\n const memoized = requestMemo.get(cacheKey)\n if (memoized) return memoized\n }\n\n const resolveScope = async (): Promise<OrganizationScope> => {\n if (cache && cacheKey && typeof cache.get === 'function') {\n try {\n const cached = await cache.get(cacheKey)\n if (isValidCachedScope(cached)) return cached\n } catch (err) {\n logger.warn('Cache read failed', { err })\n }\n }\n\n const baseScope = await resolveOrganizationScope({\n em,\n rbac,\n auth: scopedAuth,\n selectedId: rawSelected,\n tenantId: effectiveTenantId,\n })\n\n if (cache && cacheKey && userId && typeof cache.set === 'function') {\n try {\n await cache.set(cacheKey, baseScope, {\n ttl: ttlMs,\n tags: buildOrgScopeCacheTags({ userId, effectiveTenantId }),\n })\n } catch (err) {\n logger.warn('Cache write failed', { err })\n }\n }\n\n return baseScope\n }\n\n if (requestMemo && cacheKey) {\n const pending = resolveScope()\n requestMemo.set(cacheKey, pending)\n return pending\n }\n\n return resolveScope()\n}\n\nexport type FeatureCheckContext = {\n organizationId: string | null\n scope: OrganizationScope\n allowedOrganizationIds: string[] | null\n}\n\nexport async function resolveFeatureCheckContext({\n container,\n auth,\n request,\n selectedId,\n tenantId,\n}: {\n container: AwilixContainer\n auth: AuthContext | null | undefined\n request?: Request | { cookies?: { get: (name: string) => { value: string } | undefined } }\n selectedId?: string | null\n tenantId?: string | null\n}): Promise<FeatureCheckContext> {\n const scope = await resolveOrganizationScopeForRequest({ container, auth, request, selectedId, tenantId })\n const allowedOrganizationIds = scope.allowedIds ?? null\n const authOrgId = auth?.orgId ?? null\n const organizationId =\n scope.selectedId\n ?? (authOrgId && (!Array.isArray(allowedOrganizationIds) || allowedOrganizationIds.includes(authOrgId)) ? authOrgId : null)\n ?? (Array.isArray(allowedOrganizationIds) && allowedOrganizationIds.length ? allowedOrganizationIds[0] : null)\n\n return { organizationId, scope, allowedOrganizationIds }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { EntityManager } from '@mikro-orm/postgresql'\nimport type { FilterQuery } from '@mikro-orm/core'\nimport type { AwilixContainer } from 'awilix'\nimport { Organization } from '@open-mercato/core/modules/directory/data/entities'\nimport { isAllOrganizationsSelection } from '@open-mercato/core/modules/directory/constants'\nimport type { RbacService } from '@open-mercato/core/modules/auth/services/rbacService'\nimport type { AuthContext } from '@open-mercato/shared/lib/auth/server'\nimport { getCurrentCacheTenant, runWithCacheTenant, type CacheStrategy } from '@open-mercato/cache'\nimport { parseSelectedOrganizationCookie, parseSelectedTenantCookie } from './scopeCookies'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\n\nconst logger = createLogger('directory').child({ component: 'org-scope-cache' })\n\nexport { parseSelectedOrganizationCookie, parseSelectedTenantCookie }\n\nexport type OrganizationScope = {\n selectedId: string | null\n filterIds: string[] | null\n allowedIds: string[] | null\n tenantId: string | null\n // True when the caller explicitly selected a concrete organization (cookie /\n // selectedId param) that could not be honored \u2014 it does not exist for the\n // tenant or is not accessible. Reads degrade gracefully (filterIds/selectedId\n // fall back to the caller's accessible orgs), but writes MUST fail loudly on\n // this so a record never lands under an org the caller did not intend. Absent\n // (undefined) means the selection \u2014 if any \u2014 was honored.\n selectionRejected?: boolean\n}\n\n// Phase 4 \u2014 short-TTL cache for resolveOrganizationScopeForRequest.\n// OrganizationScope is a pure function of (userId, tenantId, selectedOrgId,\n// requestedTenant) between membership changes; caching it bypasses 1\n// SELECT on `organizations` per CRUD request. TTL is short (60s default)\n// to keep staleness bounded as a backstop. Tag-based invalidation also fires\n// eagerly: per-user entries are dropped by RbacService.invalidateUserCache\n// (every ACL/role grant change goes through it \u2014 see buildOrgScopeUserCacheTag)\n// and per-tenant entries by the directory.organization.* subscriber plus\n// RbacService.invalidateTenantCache (role-ACL changes).\nconst ORG_SCOPE_CACHE_KEY_PREFIX = 'org-scope'\n// Phase 4 default-off until the same readiness probe (`GET /api/customers/people`)\n// stays green with the cache layer engaged. Set `OM_ORG_SCOPE_CACHE_TTL_MS=60000`\n// (or any positive integer) to opt in once cross-request safety is re-verified.\nconst ORG_SCOPE_DEFAULT_TTL_MS = 0\n\nfunction resolveOrgScopeTtlMs(): number {\n const raw = process.env.OM_ORG_SCOPE_CACHE_TTL_MS\n if (raw === undefined) return ORG_SCOPE_DEFAULT_TTL_MS\n const parsed = Number(raw)\n if (!Number.isFinite(parsed) || parsed < 0) return ORG_SCOPE_DEFAULT_TTL_MS\n return parsed\n}\n\nfunction buildOrgScopeCacheKey(parts: {\n userId: string\n effectiveTenantId: string\n selectedOrgId: string | null\n requestedTenantId: string | null\n}): string {\n const selected = parts.selectedOrgId ?? 'none'\n const requested = parts.requestedTenantId ?? 'none'\n return `${ORG_SCOPE_CACHE_KEY_PREFIX}:${parts.userId}:${parts.effectiveTenantId}:${selected}:${requested}`\n}\n\n// Tag builders are exported so the modules that own the \"this user's scope\n// changed\" / \"this tenant's org tree changed\" signals (auth RBAC invalidation,\n// the directory.organization.* subscriber) can drop the matching cross-request\n// cache entries without re-deriving the tag format. Keeping the format in one\n// place is what lets the TTL be enabled safely (issue #2259).\nexport function buildOrgScopeUserCacheTag(userId: string): string {\n return `${ORG_SCOPE_CACHE_KEY_PREFIX}:user:${userId}`\n}\n\nexport function buildOrgScopeTenantCacheTag(tenantId: string): string {\n return `${ORG_SCOPE_CACHE_KEY_PREFIX}:tenant:${tenantId}`\n}\n\nfunction buildOrgScopeCacheTags(parts: { userId: string; effectiveTenantId: string }): string[] {\n return [\n buildOrgScopeUserCacheTag(parts.userId),\n buildOrgScopeTenantCacheTag(parts.effectiveTenantId),\n ]\n}\n\nfunction isValidCachedScope(value: unknown): value is OrganizationScope {\n if (typeof value !== 'object' || value === null) return false\n const record = value as Partial<OrganizationScope>\n const idOk = (v: unknown) => v === null || typeof v === 'string'\n const arrOk = (v: unknown) => v === null || (Array.isArray(v) && v.every((entry) => typeof entry === 'string'))\n const flagOk = record.selectionRejected === undefined || typeof record.selectionRejected === 'boolean'\n return idOk(record.selectedId) && idOk(record.tenantId) && arrOk(record.filterIds) && arrOk(record.allowedIds) && flagOk\n}\n\nfunction resolveCacheFromContainer(container: AwilixContainer | null | undefined): CacheStrategy | null {\n if (!container) return null\n try {\n const c = container.resolve('cache') as CacheStrategy | undefined\n if (c && typeof c.get === 'function' && typeof c.set === 'function') return c\n } catch {\n return null\n }\n return null\n}\n\nexport async function invalidateOrganizationScopeCacheForUser(\n container: AwilixContainer,\n userId: string,\n tenantId?: string | null,\n): Promise<void> {\n const cache = resolveCacheFromContainer(container)\n if (!cache?.deleteByTags) return\n try {\n const cacheTenantId = tenantId === undefined ? getCurrentCacheTenant() : tenantId\n await runWithCacheTenant(cacheTenantId, () =>\n cache.deleteByTags([buildOrgScopeUserCacheTag(userId)]),\n )\n } catch (err) {\n logger.warn('Cache invalidate user failed', { err })\n }\n}\n\nexport async function invalidateOrganizationScopeCacheForTenant(\n container: AwilixContainer,\n tenantId: string,\n): Promise<void> {\n const cache = resolveCacheFromContainer(container)\n if (!cache?.deleteByTags) return\n try {\n await runWithCacheTenant(tenantId, () =>\n cache.deleteByTags([buildOrgScopeTenantCacheTag(tenantId)]),\n )\n } catch (err) {\n logger.warn('Cache invalidate tenant failed', { err })\n }\n}\n\n// Issue #2259 \u2014 per-request memoization. resolveOrganizationScopeForRequest\n// runs at least twice per CRUD request: once for the route-level feature check\n// (resolveFeatureCheckContext) and once inside the shared factory's withCtx.\n// Those two call sites use different request-scoped DI containers but are handed\n// the SAME Request instance, so memoizing the resolved scope on a WeakMap keyed\n// by that request collapses the duplicate work \u2014 and the duplicate\n// `organizations` SELECT \u2014 into a single resolution. The inner map is keyed by\n// the same identity tuple as the cross-request cache key, so distinct explicit\n// selectedId/tenant overrides on one request stay independent. There is no\n// staleness risk: the memo lives only for the lifetime of one request and is\n// dropped with the request object by the GC.\nconst orgScopeRequestMemo = new WeakMap<object, Map<string, Promise<OrganizationScope>>>()\n\nfunction getRequestScopeMemo(request: unknown): Map<string, Promise<OrganizationScope>> | null {\n if (!request || (typeof request !== 'object' && typeof request !== 'function')) return null\n const key = request as object\n let memo = orgScopeRequestMemo.get(key)\n if (!memo) {\n memo = new Map<string, Promise<OrganizationScope>>()\n orgScopeRequestMemo.set(key, memo)\n }\n return memo\n}\n\nfunction normalizeOrganizationId(value: unknown): string | null {\n if (typeof value !== 'string') return null\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : null\n}\n\nexport function getSelectedOrganizationFromRequest(req: Request | { cookies?: { get: (name: string) => { value: string } | undefined }; headers?: { get(name: string): string | null } }): string | null {\n const cookieContainer = (req as { cookies?: { get: (name: string) => { value: string } | undefined } }).cookies\n if (cookieContainer && typeof cookieContainer.get === 'function') {\n const val = cookieContainer.get('om_selected_org')?.value\n return val ?? null\n }\n const headerContainer = (req as { headers?: { get(name: string): string | null } }).headers\n const header = typeof headerContainer?.get === 'function' ? headerContainer.get('cookie') : null\n return parseSelectedOrganizationCookie(header)\n}\n\nexport function getSelectedTenantFromRequest(\n req: Request | { cookies?: { get: (name: string) => { value: string } | undefined }; headers?: { get(name: string): string | null } },\n): string | null {\n const cookieContainer = (req as { cookies?: { get: (name: string) => { value: string } | undefined } }).cookies\n if (cookieContainer && typeof cookieContainer.get === 'function') {\n const val = cookieContainer.get('om_selected_tenant')?.value\n return val ?? null\n }\n const headerContainer = (req as { headers?: { get(name: string): string | null } }).headers\n const header = typeof headerContainer?.get === 'function' ? headerContainer.get('cookie') : null\n return parseSelectedTenantCookie(header)\n}\n\nfunction normalizeOrganizationIds(ids: string[]): string[] {\n return Array.from(new Set(\n ids.map((value) => normalizeOrganizationId(value)).filter((value): value is string => {\n if (!value) return false\n if (isAllOrganizationsSelection(value)) return false\n return true\n })\n ))\n}\n\n// Map each organization id to itself plus its persisted descendant ids. Only\n// orgs that exist for the tenant and are not soft-deleted are included, so an\n// unknown/inaccessible id simply has no entry (matching the per-id query that\n// returned an empty set for it).\ntype OrgDescendantMap = Map<string, string[]>\n\n// Issue #2228 \u2014 single round-trip for org-scope resolution. Instead of issuing\n// one `organizations` SELECT per `collectWithDescendants` call (up to 3-4\n// sequential queries per request: accessible set, fallback set, selected set),\n// gather every candidate id up front and fetch their descendant expansions in\n// one `em.find(Organization, { id: $in })`. Expansion then happens in-memory.\nasync function loadOrgDescendantMap(em: EntityManager, tenantId: string, ids: string[]): Promise<OrgDescendantMap> {\n const unique = normalizeOrganizationIds(ids)\n if (!unique.length) return new Map()\n const filter: FilterQuery<Organization> = {\n tenant: tenantId,\n id: { $in: unique },\n deletedAt: null,\n }\n const orgs = await em.find(Organization, filter)\n const map: OrgDescendantMap = new Map()\n for (const org of orgs) {\n const id = String(org.id)\n const expansion = [id]\n if (Array.isArray(org.descendantIds)) {\n for (const desc of org.descendantIds) expansion.push(String(desc))\n }\n map.set(id, expansion)\n }\n return map\n}\n\nfunction expandWithDescendants(map: OrgDescendantMap, ids: string[]): Set<string> {\n const set = new Set<string>()\n for (const value of ids) {\n const id = normalizeOrganizationId(value)\n if (!id || isAllOrganizationsSelection(id)) continue\n const expansion = map.get(id)\n if (!expansion) continue\n for (const entry of expansion) set.add(entry)\n }\n return set\n}\n\nexport async function resolveOrganizationScope({\n em,\n rbac,\n auth,\n selectedId,\n tenantId: tenantIdOverride,\n}: {\n em: EntityManager\n rbac: RbacService\n auth: AuthContext\n selectedId?: string | null\n tenantId?: string | null\n}): Promise<OrganizationScope> {\n if (!auth || !auth.sub) {\n return { selectedId: null, filterIds: null, allowedIds: null, tenantId: null }\n }\n const actorTenantId = typeof auth.tenantId === 'string' && auth.tenantId.trim().length > 0 ? auth.tenantId.trim() : null\n const candidateTenantId = typeof tenantIdOverride === 'string' && tenantIdOverride.trim().length > 0\n ? tenantIdOverride.trim()\n : tenantIdOverride === null\n ? null\n : actorTenantId\n if (!candidateTenantId) {\n return { selectedId: null, filterIds: null, allowedIds: null, tenantId: null }\n }\n const usingOverride = candidateTenantId !== actorTenantId\n const isSuperAdminActor = auth.isSuperAdmin === true\n const tenantId = usingOverride && actorTenantId && !isSuperAdminActor ? actorTenantId : candidateTenantId\n if (!tenantId) {\n return { selectedId: null, filterIds: null, allowedIds: null, tenantId: null }\n }\n const normalizedRequestedSelection = normalizeOrganizationId(selectedId)\n const explicitAllOrgsChoice =\n normalizedRequestedSelection !== null && isAllOrganizationsSelection(normalizedRequestedSelection)\n const normalizedSelectedId = explicitAllOrgsChoice\n ? null\n : normalizedRequestedSelection\n const contextOrgId = actorTenantId && actorTenantId === tenantId ? normalizeOrganizationId(auth.orgId) : null\n const acl = await rbac.loadAcl(auth.sub, { tenantId, organizationId: contextOrgId })\n const aclIsSuperAdmin = acl?.isSuperAdmin === true\n const effectiveSuperAdmin = aclIsSuperAdmin || isSuperAdminActor\n const normalizedAccessible = effectiveSuperAdmin\n ? null\n : Array.isArray(acl?.organizations)\n ? acl.organizations\n .map((value) => normalizeOrganizationId(value))\n .filter((value): value is string => value !== null)\n : null\n const accessibleList = effectiveSuperAdmin\n ? null\n : normalizedAccessible && normalizedAccessible.some((value) => isAllOrganizationsSelection(value))\n ? null\n : normalizedAccessible?.filter((value) => !isAllOrganizationsSelection(value)) ?? null\n\n const accountOrgId = actorTenantId && actorTenantId === tenantId ? normalizeOrganizationId(auth.orgId) : null\n const fallbackOrgId = accountOrgId ?? null\n\n // Every id that could be expanded below \u2014 accessible set, fallback (account)\n // org, and the requested selection \u2014 is known up front, so fetch them all in\n // a single `organizations` query and expand from the in-memory map.\n const candidateIds = [\n ...(accessibleList ?? []),\n ...(fallbackOrgId ? [fallbackOrgId] : []),\n ...(normalizedSelectedId ? [normalizedSelectedId] : []),\n ]\n const orgDescendants = await loadOrgDescendantMap(em, tenantId, candidateIds)\n const loadFallbackSet = (): Set<string> | null =>\n fallbackOrgId ? expandWithDescendants(orgDescendants, [fallbackOrgId]) : null\n\n let allowedSet: Set<string> | null = null\n if (accessibleList === null) {\n allowedSet = null\n } else if (accessibleList.length === 0) {\n allowedSet = new Set()\n } else {\n allowedSet = expandWithDescendants(orgDescendants, accessibleList)\n }\n\n if (allowedSet && allowedSet.size === 0 && fallbackOrgId) {\n const computed = loadFallbackSet()\n if (computed && computed.size > 0) {\n allowedSet = computed\n }\n }\n\n const hasUnrestrictedAccess = effectiveSuperAdmin || (accessibleList === null)\n const noOrgSelection = normalizedSelectedId === null && !explicitAllOrgsChoice\n const widenToAllOrgs =\n (explicitAllOrgsChoice && hasUnrestrictedAccess)\n || (effectiveSuperAdmin && noOrgSelection)\n const initialSelected =\n normalizedSelectedId\n ?? (widenToAllOrgs ? null : accountOrgId ?? null)\n // A selection is only honored when it resolves to a real, non-deleted org for\n // this tenant. `orgDescendants` holds exactly the existing orgs among the\n // candidate ids, so a stale/dead id (e.g. a selected-org cookie or JWT org\n // that no longer resolves after a DB reset) has no entry and is dropped here.\n // Without the existence guard an unrestricted (all-orgs) principal \u2014 whose\n // `allowedSet` is null \u2014 would accept the dead id as `effectiveSelected`, and\n // writes derived from `selectedId` would land under an org the read scope\n // (`filterIds`) never filters to, silently orphaning the record.\n const selectionResolvesToOrg = (id: string): boolean => orgDescendants.has(id)\n let effectiveSelected: string | null = null\n if (initialSelected) {\n if ((allowedSet === null || allowedSet.has(initialSelected)) && selectionResolvesToOrg(initialSelected)) {\n effectiveSelected = initialSelected\n }\n }\n\n let filterSet: Set<string> | null = null\n if (effectiveSelected) {\n filterSet = expandWithDescendants(orgDescendants, [effectiveSelected])\n } else if (allowedSet !== null) {\n filterSet = allowedSet\n } else if (widenToAllOrgs) {\n filterSet = null\n } else if (auth.orgId) {\n filterSet = loadFallbackSet()\n // Keep the write target (`selectedId`) aligned with the read scope\n // (`filterIds`): when an unrestricted principal's requested selection was\n // dropped above, fall the selection back to the account org too so a record\n // created here is always readable back by the same caller.\n if (!effectiveSelected && fallbackOrgId && filterSet && filterSet.size > 0) {\n effectiveSelected = fallbackOrgId\n }\n }\n\n if ((!filterSet || filterSet.size === 0) && fallbackOrgId && !widenToAllOrgs) {\n const computed = loadFallbackSet()\n if (computed && computed.size > 0) {\n filterSet = computed\n if (!effectiveSelected) {\n effectiveSelected = fallbackOrgId\n }\n }\n }\n\n // A concrete organization was explicitly requested (`normalizedSelectedId` is\n // null for both \"no selection\" and the \"all organizations\" token) but the\n // resolver could not honor it \u2014 it was dropped as non-existent/inaccessible\n // and the effective selection fell back to something else. Surface this so the\n // write layer can reject the request instead of silently creating the record\n // under the fallback org. Only set the field when true to keep the scope shape\n // unchanged for the common (honored) case.\n const selectionRejected = normalizedSelectedId !== null && effectiveSelected !== normalizedSelectedId\n\n return {\n selectedId: effectiveSelected,\n filterIds: filterSet ? Array.from(filterSet) : null,\n allowedIds: allowedSet ? Array.from(allowedSet) : null,\n tenantId,\n ...(selectionRejected ? { selectionRejected: true } : {}),\n }\n}\n\nexport async function resolveOrganizationScopeForRequest({\n container,\n auth,\n request,\n selectedId,\n tenantId: tenantOverride,\n}: {\n container: AwilixContainer\n auth: AuthContext | null | undefined\n request?: Request | { cookies?: { get: (name: string) => { value: string } | undefined }; headers?: { get(name: string): string | null } }\n selectedId?: string | null\n tenantId?: string | null\n}): Promise<OrganizationScope> {\n if (!auth || !auth.sub) {\n return { selectedId: null, filterIds: null, allowedIds: null, tenantId: null }\n }\n\n let em: EntityManager | null = null\n let rbac: RbacService | null = null\n try { em = container.resolve<EntityManager>('em') } catch { em = null }\n try { rbac = container.resolve<RbacService>('rbacService') } catch { rbac = null }\n const normalizeString = (value: unknown): string | null => {\n if (typeof value === 'string' && value.trim().length > 0) return value.trim()\n return null\n }\n if (!em || !rbac) {\n const fallbackSelected = normalizeOrganizationId(selectedId ?? auth.orgId ?? null)\n return {\n selectedId: fallbackSelected,\n filterIds: fallbackSelected ? [fallbackSelected] : null,\n allowedIds: fallbackSelected ? [fallbackSelected] : null,\n tenantId: normalizeString(auth.tenantId),\n }\n }\n\n const actorTenantField = (auth as { actorTenantId?: string | null }).actorTenantId\n const actorTenant = actorTenantField === undefined\n ? normalizeString(auth.tenantId)\n : actorTenantField === null\n ? null\n : normalizeString(actorTenantField)\n const actorOrgField = (auth as { actorOrgId?: string | null }).actorOrgId\n const actorOrgId = actorOrgField === undefined\n ? normalizeString(auth.orgId)\n : actorOrgField === null\n ? null\n : normalizeString(actorOrgField)\n\n const cookieTenant = request ? getSelectedTenantFromRequest(request) : null\n const requestedTenant =\n tenantOverride !== undefined\n ? tenantOverride\n : cookieTenant !== undefined\n ? cookieTenant\n : undefined\n const requestedTenantId = typeof requestedTenant === 'string' && requestedTenant.trim().length > 0 ? requestedTenant.trim() : null\n const isSuperAdminActor = auth.isSuperAdmin === true\n let effectiveTenantId = requestedTenantId ?? actorTenant ?? null\n if (actorTenant && effectiveTenantId && effectiveTenantId !== actorTenant && !isSuperAdminActor) {\n effectiveTenantId = actorTenant\n }\n if (!effectiveTenantId) {\n return { selectedId: null, filterIds: null, allowedIds: null, tenantId: null }\n }\n\n const scopedAuth = {\n ...auth,\n tenantId: effectiveTenantId,\n orgId: actorTenant && actorTenant === effectiveTenantId ? actorOrgId ?? null : null,\n }\n\n const rawSelected = selectedId !== undefined ? selectedId : (request ? getSelectedOrganizationFromRequest(request) : null)\n const normalizedSelectedId = typeof rawSelected === 'string' && rawSelected.trim().length > 0\n ? rawSelected.trim()\n : null\n\n const userId = typeof auth.sub === 'string' && auth.sub.length > 0 ? auth.sub : null\n const ttlMs = resolveOrgScopeTtlMs()\n const cache = ttlMs > 0 ? resolveCacheFromContainer(container) : null\n const cacheKey = userId\n ? buildOrgScopeCacheKey({\n userId,\n effectiveTenantId,\n selectedOrgId: normalizedSelectedId,\n requestedTenantId: requestedTenantId ?? null,\n })\n : null\n\n const requestMemo = getRequestScopeMemo(request)\n if (requestMemo && cacheKey) {\n const memoized = requestMemo.get(cacheKey)\n if (memoized) return memoized\n }\n\n const resolveScope = async (): Promise<OrganizationScope> => {\n if (cache && cacheKey && typeof cache.get === 'function') {\n try {\n const cached = await cache.get(cacheKey)\n if (isValidCachedScope(cached)) return cached\n } catch (err) {\n logger.warn('Cache read failed', { err })\n }\n }\n\n const baseScope = await resolveOrganizationScope({\n em,\n rbac,\n auth: scopedAuth,\n selectedId: rawSelected,\n tenantId: effectiveTenantId,\n })\n\n if (cache && cacheKey && userId && typeof cache.set === 'function') {\n try {\n await cache.set(cacheKey, baseScope, {\n ttl: ttlMs,\n tags: buildOrgScopeCacheTags({ userId, effectiveTenantId }),\n })\n } catch (err) {\n logger.warn('Cache write failed', { err })\n }\n }\n\n return baseScope\n }\n\n if (requestMemo && cacheKey) {\n const pending = resolveScope()\n requestMemo.set(cacheKey, pending)\n return pending\n }\n\n return resolveScope()\n}\n\nexport type FeatureCheckContext = {\n organizationId: string | null\n scope: OrganizationScope\n allowedOrganizationIds: string[] | null\n}\n\nexport async function resolveFeatureCheckContext({\n container,\n auth,\n request,\n selectedId,\n tenantId,\n}: {\n container: AwilixContainer\n auth: AuthContext | null | undefined\n request?: Request | { cookies?: { get: (name: string) => { value: string } | undefined } }\n selectedId?: string | null\n tenantId?: string | null\n}): Promise<FeatureCheckContext> {\n const scope = await resolveOrganizationScopeForRequest({ container, auth, request, selectedId, tenantId })\n const allowedOrganizationIds = scope.allowedIds ?? null\n const authOrgId = auth?.orgId ?? null\n const organizationId =\n scope.selectedId\n ?? (authOrgId && (!Array.isArray(allowedOrganizationIds) || allowedOrganizationIds.includes(authOrgId)) ? authOrgId : null)\n ?? (Array.isArray(allowedOrganizationIds) && allowedOrganizationIds.length ? allowedOrganizationIds[0] : null)\n\n return { organizationId, scope, allowedOrganizationIds }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -11,6 +11,7 @@ import {
11
11
  ENTITY_DEFINITIONS_CACHE_TTL_MS
12
12
  } from "./definitions.cache.js";
13
13
  import { filterSelectableSystemEntityIds, isSystemEntitySelectable } from "@open-mercato/shared/lib/entities/system-entities";
14
+ import { isOrmBackedSystemEntityId } from "@open-mercato/shared/lib/data/engine";
14
15
  import { resolveOrganizationScopeForRequest } from "@open-mercato/core/modules/directory/utils/organizationScope";
15
16
  import { loadEntityFieldsetConfigs } from "../lib/fieldsets.js";
16
17
  import { installCustomEntitiesFromModules } from "../lib/install-from-ce.js";
@@ -20,6 +21,12 @@ import {
20
21
  beginEntitiesMutationGuard,
21
22
  FIELD_DEFINITION_RESOURCE_KIND
22
23
  } from "./definitions.mutation-guard.js";
24
+ import {
25
+ canReadAllEntityMetadata,
26
+ canReadEntityMetadata,
27
+ getDeclaredCustomEntityRestriction,
28
+ resolveEntityAclRequirement
29
+ } from "../lib/entityAcl.js";
23
30
  import {
24
31
  createExactDefinitionWhere,
25
32
  createScopedDefinitionTombstone,
@@ -187,8 +194,8 @@ async function GET(req) {
187
194
  const fieldsetFilter = requestedFieldset && requestedFieldset.trim().length ? requestedFieldset.trim() : null;
188
195
  const auth = await getAuthFromRequest(req);
189
196
  if (!auth) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
190
- const entityIds = filterSelectableSystemEntityIds(requestedEntityIds);
191
- if (!entityIds.length) {
197
+ const selectableEntityIds = filterSelectableSystemEntityIds(requestedEntityIds);
198
+ if (!selectableEntityIds.length) {
192
199
  return NextResponse.json({ items: [] });
193
200
  }
194
201
  const container = await createRequestContainer();
@@ -201,6 +208,48 @@ async function GET(req) {
201
208
  const organizationId = definitionScope.organizationId;
202
209
  const { resolve } = container;
203
210
  const em = resolve("em");
211
+ const rbac = resolve("rbacService");
212
+ const acl = await rbac.loadAcl(auth.sub ?? "", {
213
+ tenantId,
214
+ organizationId
215
+ });
216
+ const designerCanRead = canReadAllEntityMetadata(acl);
217
+ const customEntityRestrictions = /* @__PURE__ */ new Map();
218
+ for (const entityId of selectableEntityIds) {
219
+ if (isOrmBackedSystemEntityId(em, entityId)) continue;
220
+ const declaredRestriction = getDeclaredCustomEntityRestriction(entityId);
221
+ if (declaredRestriction !== void 0) customEntityRestrictions.set(entityId, declaredRestriction);
222
+ }
223
+ if (!designerCanRead) {
224
+ const unresolvedEntityIds = selectableEntityIds.filter(
225
+ (entityId) => !resolveEntityAclRequirement(entityId) && !customEntityRestrictions.has(entityId)
226
+ );
227
+ if (unresolvedEntityIds.length) {
228
+ const registrations = await em.find(CustomEntity, {
229
+ entityId: { $in: unresolvedEntityIds },
230
+ isActive: true,
231
+ $and: [
232
+ { $or: [{ tenantId }, { tenantId: null }] },
233
+ { $or: [{ organizationId }, { organizationId: null }] }
234
+ ]
235
+ });
236
+ for (const registration of registrations) {
237
+ const entityId = String(registration.entityId);
238
+ if (!isOrmBackedSystemEntityId(em, entityId)) {
239
+ customEntityRestrictions.set(entityId, registration.accessRestricted === true);
240
+ }
241
+ }
242
+ }
243
+ }
244
+ const entityIds = selectableEntityIds.filter((entityId) => canReadEntityMetadata({
245
+ entityId,
246
+ isCustomEntity: customEntityRestrictions.has(entityId),
247
+ isRestricted: customEntityRestrictions.get(entityId) === true,
248
+ acl
249
+ }));
250
+ if (!entityIds.length) {
251
+ return NextResponse.json({ items: [], fieldsetsByEntity: {}, entitySettings: {} });
252
+ }
204
253
  let cache;
205
254
  try {
206
255
  cache = resolve("cache");
@@ -209,7 +258,6 @@ async function GET(req) {
209
258
  let canManageDefinitions = false;
210
259
  if (typeof auth.sub === "string" && auth.sub.length > 0) {
211
260
  try {
212
- const rbac = resolve("rbacService");
213
261
  canManageDefinitions = await rbac.userHasAllFeatures(auth.sub, ["entities.definitions.manage"], {
214
262
  tenantId,
215
263
  organizationId
@@ -336,6 +384,7 @@ async function GET(req) {
336
384
  label: d.configJson?.label || d.key,
337
385
  description: d.configJson?.description || void 0,
338
386
  multi: Boolean(d.configJson?.multi),
387
+ relatedEntityId: d.kind === "relation" && typeof d.configJson?.relatedEntityId === "string" ? d.configJson.relatedEntityId.trim() || void 0 : void 0,
339
388
  options: (() => {
340
389
  if (d.kind === "currency") return void 0;
341
390
  const normalizedOptions = normalizeCustomFieldOptions(d.configJson?.options);
@@ -582,6 +631,7 @@ const customFieldDefinitionSchema = z.object({
582
631
  label: z.string(),
583
632
  description: z.string().optional(),
584
633
  multi: z.boolean().optional(),
634
+ relatedEntityId: z.string().optional(),
585
635
  options: z.array(customFieldOptionValueSchema).optional(),
586
636
  optionsUrl: z.string().optional(),
587
637
  filterable: z.boolean().optional(),
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/entities/api/definitions.ts"],
4
- "sourcesContent": ["import { NextResponse } from 'next/server'\nimport { z } from 'zod'\nimport type { CacheStrategy } from '@open-mercato/cache'\nimport { createRequestContainer } from '@open-mercato/shared/lib/di/container'\nimport { getAuthFromRequest } from '@open-mercato/shared/lib/auth/server'\nimport type { RbacService } from '@open-mercato/core/modules/auth/services/rbacService'\nimport { CustomEntity, CustomFieldDef } from '@open-mercato/core/modules/entities/data/entities'\nimport { upsertCustomFieldDefSchema, fieldsetCodeRegex } from '@open-mercato/core/modules/entities/data/validators'\nimport {\n createDefinitionsCacheKey,\n createDefinitionsCacheTags,\n invalidateDefinitionsCache,\n ENTITY_DEFINITIONS_CACHE_TTL_MS,\n} from './definitions.cache'\nimport type { OpenApiRouteDoc } from '@open-mercato/shared/lib/openapi'\nimport { filterSelectableSystemEntityIds, isSystemEntitySelectable } from '@open-mercato/shared/lib/entities/system-entities'\nimport { resolveOrganizationScopeForRequest } from '@open-mercato/core/modules/directory/utils/organizationScope'\nimport { loadEntityFieldsetConfigs, CustomFieldsetDefinition } from '../lib/fieldsets'\nimport { installCustomEntitiesFromModules } from '../lib/install-from-ce'\nimport { normalizeCustomFieldOptions } from '@open-mercato/shared/modules/entities/options'\nimport { CURRENCY_OPTIONS_URL } from '@open-mercato/shared/modules/entities/kinds'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport {\n beginEntitiesMutationGuard,\n FIELD_DEFINITION_RESOURCE_KIND,\n} from './definitions.mutation-guard'\nimport {\n createExactDefinitionWhere,\n createScopedDefinitionTombstone,\n createVisibleDefinitionWhere,\n markDefinitionTombstoned,\n resolveDefinitionScopeFromOrganizationScope,\n resolveDefinitionMutationScope,\n selectVisibleDefinitionWinner,\n} from '../lib/definition-scope'\nimport { resolveEntityDefinitionsVersion } from '../lib/definitions-version'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\n\nconst logger = createLogger('entities').child({ component: 'definitions' })\n\n/**\n * Validate defaultValue against the field kind. Returns an error message string\n * if invalid, or null if valid. For dictionary and currency kinds, queries the\n * database to verify the token exists.\n */\nasync function validateDefaultValueByKind(\n value: unknown,\n kind: string,\n cfg: Record<string, unknown>,\n em: EntityManager,\n tenantContext: { tenantId: string | null; organizationId: string | null },\n): Promise<string | null> {\n switch (kind) {\n case 'boolean':\n if (typeof value !== 'boolean') return 'defaultValue for boolean fields must be true or false'\n return null\n case 'integer':\n if (typeof value !== 'number' || !Number.isInteger(value))\n return 'defaultValue for integer fields must be a whole number'\n return null\n case 'float':\n if (typeof value !== 'number' || !isFinite(value))\n return 'defaultValue for float fields must be a finite number'\n return null\n case 'text':\n case 'multiline':\n case 'date':\n case 'datetime':\n if (typeof value !== 'string')\n return `defaultValue for ${kind} fields must be a string`\n return null\n case 'dictionary': {\n if (typeof value !== 'string')\n return 'defaultValue for dictionary fields must be a string'\n const dictionaryId = typeof cfg.dictionaryId === 'string' ? cfg.dictionaryId.trim() : ''\n if (dictionaryId) {\n try {\n const { DictionaryEntry } = await import('@open-mercato/core/modules/dictionaries/data/entities')\n const entry = await em.findOne(DictionaryEntry, {\n dictionary: dictionaryId,\n value: value,\n ...(tenantContext.organizationId ? { organizationId: tenantContext.organizationId } : {}),\n ...(tenantContext.tenantId ? { tenantId: tenantContext.tenantId } : {}),\n })\n if (!entry) return `defaultValue \"${value}\" does not match any entry in the configured dictionary`\n } catch (err) {\n // If the dictionaries module is not available, skip entry validation\n logger.debug('Dictionary validation skipped \u2014 module not available', { err })\n }\n }\n return null\n }\n case 'currency': {\n if (typeof value !== 'string')\n return 'defaultValue for currency fields must be a string'\n try {\n const { Currency } = await import('@open-mercato/core/modules/currencies/data/entities')\n const where: Record<string, string> = { code: value as string }\n if (tenantContext.tenantId) where.tenantId = tenantContext.tenantId\n if (tenantContext.organizationId) where.organizationId = tenantContext.organizationId\n const currency = await em.findOne(Currency, where)\n if (!currency) return `defaultValue \"${value}\" does not match any available currency`\n } catch (err) {\n // If the currencies module is not available, skip currency validation\n logger.debug('Currency validation skipped \u2014 module not available', { err })\n }\n return null\n }\n case 'select': {\n if (typeof value !== 'string' && typeof value !== 'number')\n return 'defaultValue for select fields must be a string or number'\n const options = normalizeCustomFieldOptions(\n Array.isArray(cfg.options) ? cfg.options : [],\n )\n if (options.length > 0) {\n const match = options.some(\n (o) => o.value === value || String(o.value) === String(value),\n )\n if (!match) return 'defaultValue does not match any of the configured options'\n }\n return null\n }\n case 'relation':\n case 'attachment':\n return `defaultValue is not supported for ${kind} fields`\n default:\n return null\n }\n}\n\n/**\n * Normalize defaultValue to the canonical storage shape for the given kind.\n */\nfunction normalizeDefaultValueByKind(value: unknown, kind: string): unknown {\n switch (kind) {\n case 'boolean':\n return value === true\n case 'integer':\n return Math.round(Number(value))\n case 'float':\n return Number(value)\n default:\n return value\n }\n}\n\nexport const metadata = {\n // Reading definitions is needed by record forms; keep it auth-protected but accessible to all authenticated users\n GET: { requireAuth: true },\n // Mutations remain admin-only\n POST: { requireAuth: true, requireFeatures: ['entities.definitions.manage'] },\n DELETE: { requireAuth: true, requireFeatures: ['entities.definitions.manage'] },\n}\n\nfunction parseEntityIds(url: URL): string[] {\n const direct = url.searchParams.getAll('entityId').filter((id) => typeof id === 'string' && id.trim().length > 0)\n const combined = url.searchParams.get('entityIds')\n if (combined) {\n combined\n .split(',')\n .map((id) => id.trim())\n .filter((id) => id.length > 0)\n .forEach((id) => direct.push(id))\n }\n const unique: string[] = []\n const seen = new Set<string>()\n for (const id of direct) {\n if (seen.has(id)) continue\n seen.add(id)\n unique.push(id)\n }\n return unique\n}\n\nasync function resolveEntityDefaultEditor(em: any, entityId: string, tenantId: string | null | undefined): Promise<string | undefined> {\n try {\n const ent = await em.findOne(CustomEntity, {\n entityId,\n $and: [\n { $or: [ { tenantId: tenantId ?? undefined as any }, { tenantId: null } ] },\n ],\n } as any)\n if (ent && typeof (ent as any).defaultEditor === 'string') return (ent as any).defaultEditor\n } catch {}\n return undefined\n}\n\nfunction normalizeFieldGroup(raw: unknown): { code: string; title?: string; hint?: string } | undefined {\n if (!raw) return undefined\n if (typeof raw === 'string') {\n const code = raw.trim()\n return code ? { code } : undefined\n }\n if (typeof raw !== 'object') return undefined\n const entry = raw as Record<string, unknown>\n const code = typeof entry.code === 'string' ? entry.code.trim() : ''\n if (!code) return undefined\n const group: { code: string; title?: string; hint?: string } = { code }\n if (typeof entry.title === 'string' && entry.title.trim()) group.title = entry.title.trim()\n if (typeof entry.hint === 'string' && entry.hint.trim()) group.hint = entry.hint.trim()\n return group\n}\n\nfunction definitionMatchesReadScope(\n definition: { tenantId?: string | null; organizationId?: string | null },\n scope: { tenantId: string | null; organizationId: string | null },\n) {\n const definitionTenantId = definition.tenantId ?? null\n const definitionOrganizationId = definition.organizationId ?? null\n const tenantMatches = definitionTenantId === null || definitionTenantId === scope.tenantId\n const organizationMatches =\n definitionOrganizationId === null ||\n (scope.organizationId !== null && definitionOrganizationId === scope.organizationId)\n return tenantMatches && organizationMatches\n}\n\nexport async function GET(req: Request) {\n const url = new URL(req.url)\n const requestedEntityIds = parseEntityIds(url)\n if (!requestedEntityIds.length) {\n return NextResponse.json({ error: 'entityId is required' }, { status: 400 })\n }\n const requestedFieldset = url.searchParams.get('fieldset')\n const fieldsetFilter = requestedFieldset && requestedFieldset.trim().length ? requestedFieldset.trim() : null\n\n const auth = await getAuthFromRequest(req)\n if (!auth) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n\n const entityIds = filterSelectableSystemEntityIds(requestedEntityIds)\n if (!entityIds.length) {\n return NextResponse.json({ items: [] })\n }\n\n const container = await createRequestContainer()\n const scope = await resolveOrganizationScopeForRequest({ container, auth, request: req })\n const definitionScope = resolveDefinitionScopeFromOrganizationScope(auth, scope)\n const tenantId = definitionScope.tenantId\n if (!tenantId) {\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n }\n const organizationId = definitionScope.organizationId\n const { resolve } = container\n const em = resolve('em') as any\n let cache: CacheStrategy | undefined\n try {\n cache = resolve('cache') as CacheStrategy\n } catch {}\n\n let canManageDefinitions = false\n if (typeof auth.sub === 'string' && auth.sub.length > 0) {\n try {\n const rbac = resolve('rbacService') as RbacService\n canManageDefinitions = await rbac.userHasAllFeatures(auth.sub, ['entities.definitions.manage'], {\n tenantId,\n organizationId,\n })\n } catch {\n // RBAC service unavailable \u2014 fall back to read-only (no definition sync)\n }\n }\n\n if (canManageDefinitions) {\n try {\n await installCustomEntitiesFromModules(em, cache, {\n tenantIds: [tenantId],\n entityIds,\n includeGlobal: true,\n createOnly: true,\n })\n } catch (err) {\n logger.warn('Failed to synchronize module-backed definitions', {\n tenantId,\n entityIds,\n err,\n })\n }\n }\n\n let cacheKey: string | null = null\n if (cache && !fieldsetFilter) {\n cacheKey = createDefinitionsCacheKey({\n tenantId,\n organizationId,\n entityIds,\n })\n try {\n const cached = await cache.get(cacheKey)\n if (cached) {\n return NextResponse.json(cached)\n }\n } catch (err) {\n logger.warn('Failed to read cache', { err })\n }\n }\n\n const fieldsetConfigs = await loadEntityFieldsetConfigs(em, {\n entityIds,\n tenantId,\n organizationId,\n mode: 'public',\n })\n\n const tenantCandidates = [{ tenantId }, { tenantId: null as string | null }]\n const organizationCandidates = [{ organizationId: null as string | null }]\n if (organizationId) organizationCandidates.unshift({ organizationId })\n const readScope = { tenantId, organizationId }\n\n const whereActive = {\n entityId: { $in: entityIds as any },\n deletedAt: null,\n $and: [\n { $or: tenantCandidates },\n { $or: organizationCandidates },\n ],\n } as any\n const defs = (await em.find(CustomFieldDef, whereActive as any))\n .filter((definition: any) => definitionMatchesReadScope(definition, readScope))\n const tombstones = (await em.find(CustomFieldDef, {\n entityId: { $in: entityIds as any },\n deletedAt: { $ne: null } as any,\n $and: [\n { $or: tenantCandidates },\n { $or: organizationCandidates },\n ],\n } as any)).filter((definition: any) => definitionMatchesReadScope(definition, readScope))\n\n const tombstonedByEntity = new Map<string, Set<string>>()\n for (const entry of tombstones as any[]) {\n const eid = String(entry.entityId)\n if (!tombstonedByEntity.has(eid)) tombstonedByEntity.set(eid, new Set())\n tombstonedByEntity.get(eid)!.add(entry.key)\n }\n\n const scopeScore = (x: any) => (x.tenantId ? 2 : 0) + (x.organizationId ? 1 : 0)\n\n const definitionsByEntity = new Map<string, any[]>()\n for (const d of defs) {\n const eid = String(d.entityId)\n if (!definitionsByEntity.has(eid)) definitionsByEntity.set(eid, [])\n definitionsByEntity.get(eid)!.push(d)\n }\n\n const entityDefaultEditors = new Map<string, string | undefined>()\n for (const entityId of entityIds) {\n const editor = await resolveEntityDefaultEditor(em, entityId, tenantId ?? null)\n entityDefaultEditors.set(entityId, editor)\n }\n\n const items: any[] = []\n\n const entityOrder = new Map<string, number>()\n entityIds.forEach((id, idx) => entityOrder.set(id, idx))\n\n for (const entityId of entityIds) {\n const defsForEntity = definitionsByEntity.get(entityId) ?? []\n if (!defsForEntity.length) continue\n const tombstonedKeys = tombstonedByEntity.get(entityId) ?? new Set<string>()\n const byKey = new Map<string, any>()\n for (const d of defsForEntity) {\n const existing = byKey.get(d.key)\n if (!existing) { byKey.set(d.key, d); continue }\n const sNew = scopeScore(d)\n const sOld = scopeScore(existing)\n if (sNew > sOld) { byKey.set(d.key, d); continue }\n if (sNew < sOld) continue\n const tNew = (d.updatedAt instanceof Date) ? d.updatedAt.getTime() : new Date(d.updatedAt).getTime()\n const tOld = (existing.updatedAt instanceof Date) ? existing.updatedAt.getTime() : new Date(existing.updatedAt).getTime()\n if (tNew >= tOld) byKey.set(d.key, d)\n }\n\n const defaultEditor = entityDefaultEditors.get(entityId)\n const winning = Array.from(byKey.values()).filter((d: any) => (d.isActive !== false) && !tombstonedKeys.has(d.key))\n winning.sort((a: any, b: any) => ((a.configJson?.priority ?? 0) - (b.configJson?.priority ?? 0)))\n\n for (const d of winning) {\n const rawFieldset = typeof d.configJson?.fieldset === 'string' ? d.configJson.fieldset.trim() : ''\n const normalizedFieldset = rawFieldset.length > 0 ? rawFieldset : undefined\n const normalizedFieldsets = Array.isArray(d.configJson?.fieldsets)\n ? d.configJson.fieldsets\n .filter((entry: unknown): entry is string => typeof entry === 'string')\n .map((entry: string) => entry.trim())\n .filter((entry: string) => entry.length > 0)\n : []\n const effectiveFieldsets = normalizedFieldsets.length > 0\n ? normalizedFieldsets\n : (normalizedFieldset ? [normalizedFieldset] : [])\n if (fieldsetFilter && !effectiveFieldsets.includes(fieldsetFilter)) continue\n const groupInfo = normalizeFieldGroup(d.configJson?.group)\n const keyLower = String(d.key).toLowerCase()\n const candidateBase = {\n key: d.key,\n kind: d.kind,\n label: d.configJson?.label || d.key,\n description: d.configJson?.description || undefined,\n multi: Boolean(d.configJson?.multi),\n options: (() => {\n if (d.kind === 'currency') return undefined\n const normalizedOptions = normalizeCustomFieldOptions(d.configJson?.options)\n return normalizedOptions.length ? normalizedOptions : undefined\n })(),\n optionsUrl: (() => {\n if (d.kind === 'currency') return CURRENCY_OPTIONS_URL\n const dictionaryId = typeof d.configJson?.dictionaryId === 'string' ? d.configJson.dictionaryId : undefined\n if (dictionaryId) return `/api/dictionaries/${dictionaryId}/entries`\n return typeof d.configJson?.optionsUrl === 'string' ? d.configJson.optionsUrl : undefined\n })(),\n filterable: Boolean(d.configJson?.filterable),\n formEditable: d.configJson?.formEditable !== undefined ? Boolean(d.configJson.formEditable) : true,\n listVisible: d.configJson?.listVisible !== undefined ? Boolean(d.configJson.listVisible) : true,\n editor: typeof d.configJson?.editor === 'string'\n ? d.configJson.editor\n : (d.kind === 'multiline' ? defaultEditor : undefined),\n input: typeof d.configJson?.input === 'string' ? d.configJson.input : undefined,\n dictionaryId: typeof d.configJson?.dictionaryId === 'string' ? d.configJson.dictionaryId : undefined,\n dictionaryInlineCreate: d.configJson?.dictionaryInlineCreate !== undefined\n ? Boolean(d.configJson.dictionaryInlineCreate)\n : undefined,\n priority: typeof d.configJson?.priority === 'number' ? d.configJson.priority : 0,\n validation: Array.isArray(d.configJson?.validation) ? d.configJson.validation : undefined,\n defaultValue: d.configJson?.defaultValue !== undefined ? d.configJson.defaultValue : undefined,\n // attachments config passthrough\n maxAttachmentSizeMb: typeof d.configJson?.maxAttachmentSizeMb === 'number' ? d.configJson.maxAttachmentSizeMb : undefined,\n acceptExtensions: Array.isArray(d.configJson?.acceptExtensions) ? d.configJson.acceptExtensions : undefined,\n // phone config passthrough\n defaultCountryIso2: typeof d.configJson?.defaultCountryIso2 === 'string' ? d.configJson.defaultCountryIso2 : undefined,\n entityId,\n fieldset: normalizedFieldset ?? effectiveFieldsets[0],\n fieldsets: effectiveFieldsets.length > 0 ? effectiveFieldsets : undefined,\n group: groupInfo,\n } as any\n const metrics = computeDefinitionScore(d, candidateBase, entityOrder.get(entityId) ?? Number.MAX_SAFE_INTEGER)\n const candidate = { ...candidateBase, __score: metrics }\n const existing = (items as any[]).find((entry) => entry.key.toLowerCase() === keyLower)\n if (!existing) {\n items.push(candidate)\n continue\n }\n const existingScore = existing.__score as { base: number; penalty: number; entityIndex: number }\n const candidateScoreInfo = candidate.__score as { base: number; penalty: number; entityIndex: number }\n const better =\n candidateScoreInfo.base > existingScore.base ||\n (candidateScoreInfo.base === existingScore.base && candidateScoreInfo.penalty < existingScore.penalty) ||\n (candidateScoreInfo.base === existingScore.base && candidateScoreInfo.penalty === existingScore.penalty && candidateScoreInfo.entityIndex < existingScore.entityIndex)\n if (better) {\n const index = items.findIndex((entry) => entry.key.toLowerCase() === keyLower)\n if (index >= 0) items[index] = candidate\n }\n }\n }\n\n const sanitized = items.map((item: any) => {\n const { __score, ...rest } = item\n return rest\n })\n sanitized.sort((a: any, b: any) => ((a.priority ?? 0) - (b.priority ?? 0)))\n\n const fieldsetsByEntity: Record<string, CustomFieldsetDefinition[]> = {}\n const entitySettings: Record<string, { singleFieldsetPerRecord: boolean }> = {}\n for (const entityId of entityIds) {\n const cfg = fieldsetConfigs.get(entityId) ?? { fieldsets: [], singleFieldsetPerRecord: true }\n fieldsetsByEntity[entityId] = cfg.fieldsets\n entitySettings[entityId] = { singleFieldsetPerRecord: cfg.singleFieldsetPerRecord }\n }\n\n const responseBody = { items: sanitized, fieldsetsByEntity, entitySettings }\n\n if (cache && cacheKey && !fieldsetFilter) {\n const tags = createDefinitionsCacheTags({\n tenantId,\n organizationId,\n entityIds,\n })\n try {\n await cache.set(cacheKey, responseBody, {\n ttl: ENTITY_DEFINITIONS_CACHE_TTL_MS,\n tags,\n })\n } catch (err) {\n logger.warn('Failed to store cache entry', { err })\n }\n }\n\n return NextResponse.json(responseBody)\n}\n\nexport async function POST(req: Request) {\n const auth = await getAuthFromRequest(req)\n if (!auth || !auth.orgId) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n let body: any\n try { body = await req.json() } catch { return NextResponse.json({ error: 'Invalid JSON' }, { status: 400 }) }\n const parsed = upsertCustomFieldDefSchema.safeParse(body)\n if (!parsed.success) return NextResponse.json({ error: 'Validation failed', details: parsed.error.flatten() }, { status: 400 })\n const input = parsed.data\n\n if (!isSystemEntitySelectable(input.entityId)) {\n return NextResponse.json({ error: 'Custom fields are not supported for this entity' }, { status: 400 })\n }\n\n if (input.kind === 'dictionary') {\n const dictionaryId = input.configJson?.dictionaryId\n if (typeof dictionaryId !== 'string' || dictionaryId.trim().length === 0) {\n return NextResponse.json({ error: 'dictionaryId is required for dictionary custom fields' }, { status: 400 })\n }\n }\n\n const container = await createRequestContainer()\n const scope = await resolveDefinitionMutationScope({ auth, container, request: req })\n const { resolve } = container\n const em = resolve('em') as any\n let cache: CacheStrategy | undefined\n try {\n cache = resolve('cache') as CacheStrategy\n } catch {}\n\n const where: any = createExactDefinitionWhere(input.entityId, input.key, scope)\n let def = await em.findOne(CustomFieldDef, where)\n\n const guard = await beginEntitiesMutationGuard({\n container,\n auth,\n req,\n resourceKind: FIELD_DEFINITION_RESOURCE_KIND,\n resourceId: def ? def.id : `${input.entityId}:${input.key}`,\n operation: def ? 'update' : 'create',\n mutationPayload: input as unknown as Record<string, unknown>,\n })\n if (guard.blockedResponse) return guard.blockedResponse\n\n if (!def) def = em.create(CustomFieldDef, { ...where, createdAt: new Date() })\n def.kind = input.kind\n const inCfg = (input as any).configJson ?? {}\n const cfg: Record<string, any> = { ...inCfg }\n if (cfg.label == null || String(cfg.label).trim() === '') cfg.label = input.key\n if (cfg.formEditable === undefined) cfg.formEditable = true\n if (cfg.listVisible === undefined) cfg.listVisible = true\n if (input.kind === 'dictionary') {\n const dictionaryId = typeof cfg.dictionaryId === 'string' ? cfg.dictionaryId.trim() : ''\n cfg.dictionaryId = dictionaryId\n cfg.dictionaryInlineCreate = cfg.dictionaryInlineCreate !== false\n }\n if (input.kind === 'currency') {\n cfg.optionsUrl = CURRENCY_OPTIONS_URL\n if (Array.isArray(cfg.options)) delete cfg.options\n }\n if (input.kind === 'multiline' && (cfg.editor == null || String(cfg.editor).trim() === '')) {\n cfg.editor = 'markdown'\n }\n // Validate and normalize defaultValue by kind before persisting\n if (cfg.defaultValue !== undefined && cfg.defaultValue !== null) {\n const validationError = await validateDefaultValueByKind(\n cfg.defaultValue, input.kind, cfg, em,\n { tenantId: scope.tenantId, organizationId: scope.organizationId },\n )\n if (validationError) {\n return NextResponse.json({ error: validationError }, { status: 400 })\n }\n cfg.defaultValue = normalizeDefaultValueByKind(cfg.defaultValue, input.kind)\n }\n def.configJson = cfg\n def.isActive = input.isActive ?? true\n def.deletedAt = def.isActive === false ? (def.deletedAt ?? new Date()) : null\n def.updatedAt = new Date()\n em.persist(def)\n await em.flush()\n await guard.runAfterSuccess()\n await invalidateDefinitionsCache(cache, {\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n entityIds: [input.entityId],\n })\n // Changing field definitions may impact forms but not sidebar items; no nav cache touch\n return NextResponse.json({ ok: true, item: { id: def.id, key: def.key, kind: def.kind, configJson: def.configJson, isActive: def.isActive } })\n}\n\nexport async function DELETE(req: Request) {\n const auth = await getAuthFromRequest(req)\n if (!auth || !auth.orgId) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n let body: any\n try { body = await req.json() } catch { return NextResponse.json({ error: 'Invalid JSON' }, { status: 400 }) }\n const { entityId, key } = body || {}\n if (!entityId || !key) return NextResponse.json({ error: 'entityId and key are required' }, { status: 400 })\n\n const container = await createRequestContainer()\n const scope = await resolveDefinitionMutationScope({ auth, container, request: req })\n const { resolve } = container\n const em = resolve('em') as any\n let cache: CacheStrategy | undefined\n try {\n cache = resolve('cache') as CacheStrategy\n } catch {}\n const where: any = createExactDefinitionWhere(entityId, key, scope)\n let def = await em.findOne(CustomFieldDef, where)\n let inherited: any | null = null\n if (!def) {\n inherited = selectVisibleDefinitionWinner(await em.find(CustomFieldDef, createVisibleDefinitionWhere(\n entityId,\n key,\n scope,\n { deletedAt: null, isActive: true },\n )))\n if (!inherited) return NextResponse.json({ error: 'Not found' }, { status: 404 })\n }\n\n const guard = await beginEntitiesMutationGuard({\n container,\n auth,\n req,\n resourceKind: FIELD_DEFINITION_RESOURCE_KIND,\n resourceId: def?.id ?? inherited?.id ?? `${entityId}:${key}`,\n operation: 'delete',\n mutationPayload: { entityId, key },\n })\n if (guard.blockedResponse) return guard.blockedResponse\n\n if (!def) {\n def = createScopedDefinitionTombstone(em, inherited, scope)\n } else {\n markDefinitionTombstoned(def)\n }\n em.persist(def)\n await em.flush()\n await guard.runAfterSuccess()\n await invalidateDefinitionsCache(cache, {\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n entityIds: [entityId],\n })\n // Changing field definitions may impact forms but not sidebar items; no nav cache touch\n // Return the post-delete aggregate version so the edit form keeps its optimistic-lock\n // token in sync after removing a field out-of-band (issue #3152).\n const version = await resolveEntityDefinitionsVersion(em, {\n entityId,\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n })\n return NextResponse.json({ ok: true, version })\n}\n\nconst definitionsQuerySchema = z\n .object({\n entityId: z.union([z.string(), z.array(z.string())]).optional(),\n entityIds: z.string().optional(),\n fieldset: z.string().regex(fieldsetCodeRegex).optional(),\n })\n .refine(\n (value) => {\n if (value.entityId && typeof value.entityId === 'string' && value.entityId.trim().length > 0) return true\n if (Array.isArray(value.entityId) && value.entityId.length > 0) return true\n return typeof value.entityIds === 'string' && value.entityIds.trim().length > 0\n },\n { message: 'Provide at least one entityId or an entityIds list.' }\n )\n\nconst customFieldOptionValueSchema = z.union([z.string(), z.number()])\n\nconst customFieldDefinitionSchema = z.object({\n key: z.string(),\n kind: z.string(),\n label: z.string(),\n description: z.string().optional(),\n multi: z.boolean().optional(),\n options: z.array(customFieldOptionValueSchema).optional(),\n optionsUrl: z.string().optional(),\n filterable: z.boolean().optional(),\n formEditable: z.boolean().optional(),\n listVisible: z.boolean().optional(),\n editor: z.string().optional(),\n input: z.string().optional(),\n dictionaryId: z.string().optional(),\n dictionaryInlineCreate: z.boolean().optional(),\n priority: z.number().optional(),\n validation: z.array(z.any()).optional(),\n defaultValue: z.union([z.string(), z.number(), z.boolean(), z.null()]).optional(),\n maxAttachmentSizeMb: z.number().optional(),\n acceptExtensions: z.array(z.any()).optional(),\n entityId: z.string(),\n fieldset: z.string().optional(),\n group: z\n .object({\n code: z.string(),\n title: z.string().optional(),\n hint: z.string().optional(),\n })\n .optional(),\n})\n\nconst customFieldsetGroupResponseSchema = z.object({\n code: z.string(),\n title: z.string().optional(),\n hint: z.string().optional(),\n})\n\nconst entityFieldsetResponseSchema = z.object({\n code: z.string(),\n label: z.string(),\n icon: z.string().optional(),\n description: z.string().optional(),\n groups: z.array(customFieldsetGroupResponseSchema).optional(),\n})\n\nconst definitionsResponseSchema = z.object({\n items: z.array(customFieldDefinitionSchema),\n fieldsetsByEntity: z.record(z.string(), z.array(entityFieldsetResponseSchema)).optional(),\n entitySettings: z\n .record(\n z.string(),\n z.object({\n singleFieldsetPerRecord: z.boolean().optional(),\n })\n )\n .optional(),\n})\n\nconst upsertDefinitionResponseSchema = z.object({\n ok: z.literal(true),\n item: z.object({\n id: z.string().uuid(),\n key: z.string(),\n kind: z.string(),\n configJson: z.record(z.string(), z.any()),\n isActive: z.boolean().optional(),\n }),\n})\n\nconst deleteDefinitionRequestSchema = z.object({\n entityId: z.string(),\n key: z.string(),\n})\n\nconst deleteDefinitionResponseSchema = z.object({\n ok: z.literal(true),\n version: z.string().nullable().optional(),\n})\n\nexport const openApi: OpenApiRouteDoc = {\n tag: 'Entities',\n summary: 'Manage custom field definitions',\n methods: {\n GET: {\n summary: 'List active custom field definitions',\n description: 'Returns active custom field definitions for the supplied entity ids, respecting tenant scope and tombstones.',\n query: definitionsQuerySchema,\n responses: [\n {\n status: 200,\n description: 'Definition list',\n schema: definitionsResponseSchema,\n },\n {\n status: 400,\n description: 'Missing entity id',\n schema: z.object({ error: z.string() }),\n },\n {\n status: 401,\n description: 'Missing authentication',\n schema: z.object({ error: z.string() }),\n },\n ],\n },\n POST: {\n summary: 'Upsert custom field definition',\n description: 'Creates or updates a custom field definition for the current tenant/org scope.',\n requestBody: {\n contentType: 'application/json',\n schema: upsertCustomFieldDefSchema,\n },\n responses: [\n {\n status: 200,\n description: 'Definition saved',\n schema: upsertDefinitionResponseSchema,\n },\n {\n status: 400,\n description: 'Validation failed',\n schema: z.object({\n error: z.string(),\n details: z.any().optional(),\n }),\n },\n {\n status: 401,\n description: 'Missing authentication',\n schema: z.object({ error: z.string() }),\n },\n ],\n },\n DELETE: {\n summary: 'Soft delete custom field definition',\n description: 'Marks the specified definition inactive and tombstones it for the current scope.',\n requestBody: {\n contentType: 'application/json',\n schema: deleteDefinitionRequestSchema,\n },\n responses: [\n {\n status: 200,\n description: 'Definition deleted',\n schema: deleteDefinitionResponseSchema,\n },\n {\n status: 400,\n description: 'Missing entity id or key',\n schema: z.object({ error: z.string() }),\n },\n {\n status: 401,\n description: 'Missing authentication',\n schema: z.object({ error: z.string() }),\n },\n {\n status: 404,\n description: 'Definition not found',\n schema: z.object({ error: z.string() }),\n },\n ],\n },\n },\n}\nconst computeDefinitionScore = (def: any, cfg: Record<string, any>, entityIndex: number) => {\n const listVisibleScore = cfg.listVisible === false ? 0 : 1\n const formEditableScore = cfg.formEditable === false ? 0 : 1\n const filterableScore = cfg.filterable ? 1 : 0\n const kindScore = (() => {\n switch (def.kind) {\n case 'dictionary':\n return 8\n case 'relation':\n return 6\n case 'select':\n case 'currency':\n return 4\n case 'multiline':\n return 3\n case 'boolean':\n case 'integer':\n case 'float':\n return 2\n default:\n return 1\n }\n })()\n const optionsBonus = Array.isArray(cfg.options) && cfg.options.length ? 2 : 0\n const dictionaryBonus = typeof cfg.dictionaryId === 'string' && cfg.dictionaryId.trim().length ? 5 : 0\n const base = (listVisibleScore * 16) + (formEditableScore * 8) + (filterableScore * 4) + kindScore + optionsBonus + dictionaryBonus\n const penalty = typeof cfg.priority === 'number' ? cfg.priority : 0\n return { base, penalty, entityIndex }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { NextResponse } from 'next/server'\nimport { z } from 'zod'\nimport type { CacheStrategy } from '@open-mercato/cache'\nimport { createRequestContainer } from '@open-mercato/shared/lib/di/container'\nimport { getAuthFromRequest } from '@open-mercato/shared/lib/auth/server'\nimport type { RbacService } from '@open-mercato/core/modules/auth/services/rbacService'\nimport { CustomEntity, CustomFieldDef } from '@open-mercato/core/modules/entities/data/entities'\nimport { upsertCustomFieldDefSchema, fieldsetCodeRegex } from '@open-mercato/core/modules/entities/data/validators'\nimport {\n createDefinitionsCacheKey,\n createDefinitionsCacheTags,\n invalidateDefinitionsCache,\n ENTITY_DEFINITIONS_CACHE_TTL_MS,\n} from './definitions.cache'\nimport type { OpenApiRouteDoc } from '@open-mercato/shared/lib/openapi'\nimport { filterSelectableSystemEntityIds, isSystemEntitySelectable } from '@open-mercato/shared/lib/entities/system-entities'\nimport { isOrmBackedSystemEntityId } from '@open-mercato/shared/lib/data/engine'\nimport { resolveOrganizationScopeForRequest } from '@open-mercato/core/modules/directory/utils/organizationScope'\nimport { loadEntityFieldsetConfigs, CustomFieldsetDefinition } from '../lib/fieldsets'\nimport { installCustomEntitiesFromModules } from '../lib/install-from-ce'\nimport { normalizeCustomFieldOptions } from '@open-mercato/shared/modules/entities/options'\nimport { CURRENCY_OPTIONS_URL } from '@open-mercato/shared/modules/entities/kinds'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport {\n beginEntitiesMutationGuard,\n FIELD_DEFINITION_RESOURCE_KIND,\n} from './definitions.mutation-guard'\nimport {\n canReadAllEntityMetadata,\n canReadEntityMetadata,\n getDeclaredCustomEntityRestriction,\n resolveEntityAclRequirement,\n} from '../lib/entityAcl'\nimport {\n createExactDefinitionWhere,\n createScopedDefinitionTombstone,\n createVisibleDefinitionWhere,\n markDefinitionTombstoned,\n resolveDefinitionScopeFromOrganizationScope,\n resolveDefinitionMutationScope,\n selectVisibleDefinitionWinner,\n} from '../lib/definition-scope'\nimport { resolveEntityDefinitionsVersion } from '../lib/definitions-version'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\n\nconst logger = createLogger('entities').child({ component: 'definitions' })\n\n/**\n * Validate defaultValue against the field kind. Returns an error message string\n * if invalid, or null if valid. For dictionary and currency kinds, queries the\n * database to verify the token exists.\n */\nasync function validateDefaultValueByKind(\n value: unknown,\n kind: string,\n cfg: Record<string, unknown>,\n em: EntityManager,\n tenantContext: { tenantId: string | null; organizationId: string | null },\n): Promise<string | null> {\n switch (kind) {\n case 'boolean':\n if (typeof value !== 'boolean') return 'defaultValue for boolean fields must be true or false'\n return null\n case 'integer':\n if (typeof value !== 'number' || !Number.isInteger(value))\n return 'defaultValue for integer fields must be a whole number'\n return null\n case 'float':\n if (typeof value !== 'number' || !isFinite(value))\n return 'defaultValue for float fields must be a finite number'\n return null\n case 'text':\n case 'multiline':\n case 'date':\n case 'datetime':\n if (typeof value !== 'string')\n return `defaultValue for ${kind} fields must be a string`\n return null\n case 'dictionary': {\n if (typeof value !== 'string')\n return 'defaultValue for dictionary fields must be a string'\n const dictionaryId = typeof cfg.dictionaryId === 'string' ? cfg.dictionaryId.trim() : ''\n if (dictionaryId) {\n try {\n const { DictionaryEntry } = await import('@open-mercato/core/modules/dictionaries/data/entities')\n const entry = await em.findOne(DictionaryEntry, {\n dictionary: dictionaryId,\n value: value,\n ...(tenantContext.organizationId ? { organizationId: tenantContext.organizationId } : {}),\n ...(tenantContext.tenantId ? { tenantId: tenantContext.tenantId } : {}),\n })\n if (!entry) return `defaultValue \"${value}\" does not match any entry in the configured dictionary`\n } catch (err) {\n // If the dictionaries module is not available, skip entry validation\n logger.debug('Dictionary validation skipped \u2014 module not available', { err })\n }\n }\n return null\n }\n case 'currency': {\n if (typeof value !== 'string')\n return 'defaultValue for currency fields must be a string'\n try {\n const { Currency } = await import('@open-mercato/core/modules/currencies/data/entities')\n const where: Record<string, string> = { code: value as string }\n if (tenantContext.tenantId) where.tenantId = tenantContext.tenantId\n if (tenantContext.organizationId) where.organizationId = tenantContext.organizationId\n const currency = await em.findOne(Currency, where)\n if (!currency) return `defaultValue \"${value}\" does not match any available currency`\n } catch (err) {\n // If the currencies module is not available, skip currency validation\n logger.debug('Currency validation skipped \u2014 module not available', { err })\n }\n return null\n }\n case 'select': {\n if (typeof value !== 'string' && typeof value !== 'number')\n return 'defaultValue for select fields must be a string or number'\n const options = normalizeCustomFieldOptions(\n Array.isArray(cfg.options) ? cfg.options : [],\n )\n if (options.length > 0) {\n const match = options.some(\n (o) => o.value === value || String(o.value) === String(value),\n )\n if (!match) return 'defaultValue does not match any of the configured options'\n }\n return null\n }\n case 'relation':\n case 'attachment':\n return `defaultValue is not supported for ${kind} fields`\n default:\n return null\n }\n}\n\n/**\n * Normalize defaultValue to the canonical storage shape for the given kind.\n */\nfunction normalizeDefaultValueByKind(value: unknown, kind: string): unknown {\n switch (kind) {\n case 'boolean':\n return value === true\n case 'integer':\n return Math.round(Number(value))\n case 'float':\n return Number(value)\n default:\n return value\n }\n}\n\nexport const metadata = {\n // Reading definitions is needed by record forms; keep it auth-protected but accessible to all authenticated users\n GET: { requireAuth: true },\n // Mutations remain admin-only\n POST: { requireAuth: true, requireFeatures: ['entities.definitions.manage'] },\n DELETE: { requireAuth: true, requireFeatures: ['entities.definitions.manage'] },\n}\n\nfunction parseEntityIds(url: URL): string[] {\n const direct = url.searchParams.getAll('entityId').filter((id) => typeof id === 'string' && id.trim().length > 0)\n const combined = url.searchParams.get('entityIds')\n if (combined) {\n combined\n .split(',')\n .map((id) => id.trim())\n .filter((id) => id.length > 0)\n .forEach((id) => direct.push(id))\n }\n const unique: string[] = []\n const seen = new Set<string>()\n for (const id of direct) {\n if (seen.has(id)) continue\n seen.add(id)\n unique.push(id)\n }\n return unique\n}\n\nasync function resolveEntityDefaultEditor(em: any, entityId: string, tenantId: string | null | undefined): Promise<string | undefined> {\n try {\n const ent = await em.findOne(CustomEntity, {\n entityId,\n $and: [\n { $or: [ { tenantId: tenantId ?? undefined as any }, { tenantId: null } ] },\n ],\n } as any)\n if (ent && typeof (ent as any).defaultEditor === 'string') return (ent as any).defaultEditor\n } catch {}\n return undefined\n}\n\nfunction normalizeFieldGroup(raw: unknown): { code: string; title?: string; hint?: string } | undefined {\n if (!raw) return undefined\n if (typeof raw === 'string') {\n const code = raw.trim()\n return code ? { code } : undefined\n }\n if (typeof raw !== 'object') return undefined\n const entry = raw as Record<string, unknown>\n const code = typeof entry.code === 'string' ? entry.code.trim() : ''\n if (!code) return undefined\n const group: { code: string; title?: string; hint?: string } = { code }\n if (typeof entry.title === 'string' && entry.title.trim()) group.title = entry.title.trim()\n if (typeof entry.hint === 'string' && entry.hint.trim()) group.hint = entry.hint.trim()\n return group\n}\n\nfunction definitionMatchesReadScope(\n definition: { tenantId?: string | null; organizationId?: string | null },\n scope: { tenantId: string | null; organizationId: string | null },\n) {\n const definitionTenantId = definition.tenantId ?? null\n const definitionOrganizationId = definition.organizationId ?? null\n const tenantMatches = definitionTenantId === null || definitionTenantId === scope.tenantId\n const organizationMatches =\n definitionOrganizationId === null ||\n (scope.organizationId !== null && definitionOrganizationId === scope.organizationId)\n return tenantMatches && organizationMatches\n}\n\nexport async function GET(req: Request) {\n const url = new URL(req.url)\n const requestedEntityIds = parseEntityIds(url)\n if (!requestedEntityIds.length) {\n return NextResponse.json({ error: 'entityId is required' }, { status: 400 })\n }\n const requestedFieldset = url.searchParams.get('fieldset')\n const fieldsetFilter = requestedFieldset && requestedFieldset.trim().length ? requestedFieldset.trim() : null\n\n const auth = await getAuthFromRequest(req)\n if (!auth) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n\n const selectableEntityIds = filterSelectableSystemEntityIds(requestedEntityIds)\n if (!selectableEntityIds.length) {\n return NextResponse.json({ items: [] })\n }\n\n const container = await createRequestContainer()\n const scope = await resolveOrganizationScopeForRequest({ container, auth, request: req })\n const definitionScope = resolveDefinitionScopeFromOrganizationScope(auth, scope)\n const tenantId = definitionScope.tenantId\n if (!tenantId) {\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n }\n const organizationId = definitionScope.organizationId\n const { resolve } = container\n const em = resolve('em') as any\n const rbac = resolve('rbacService') as RbacService\n const acl = await rbac.loadAcl(auth.sub ?? '', {\n tenantId,\n organizationId,\n })\n const designerCanRead = canReadAllEntityMetadata(acl)\n const customEntityRestrictions = new Map<string, boolean>()\n for (const entityId of selectableEntityIds) {\n if (isOrmBackedSystemEntityId(em, entityId)) continue\n const declaredRestriction = getDeclaredCustomEntityRestriction(entityId)\n if (declaredRestriction !== undefined) customEntityRestrictions.set(entityId, declaredRestriction)\n }\n if (!designerCanRead) {\n const unresolvedEntityIds = selectableEntityIds.filter(\n (entityId) => !resolveEntityAclRequirement(entityId) && !customEntityRestrictions.has(entityId),\n )\n if (unresolvedEntityIds.length) {\n const registrations = await em.find(CustomEntity as any, {\n entityId: { $in: unresolvedEntityIds },\n isActive: true,\n $and: [\n { $or: [{ tenantId }, { tenantId: null }] },\n { $or: [{ organizationId }, { organizationId: null }] },\n ],\n } as any)\n for (const registration of registrations as any[]) {\n const entityId = String(registration.entityId)\n if (!isOrmBackedSystemEntityId(em, entityId)) {\n customEntityRestrictions.set(entityId, registration.accessRestricted === true)\n }\n }\n }\n }\n const entityIds = selectableEntityIds.filter((entityId) => canReadEntityMetadata({\n entityId,\n isCustomEntity: customEntityRestrictions.has(entityId),\n isRestricted: customEntityRestrictions.get(entityId) === true,\n acl,\n }))\n if (!entityIds.length) {\n return NextResponse.json({ items: [], fieldsetsByEntity: {}, entitySettings: {} })\n }\n let cache: CacheStrategy | undefined\n try {\n cache = resolve('cache') as CacheStrategy\n } catch {}\n\n let canManageDefinitions = false\n if (typeof auth.sub === 'string' && auth.sub.length > 0) {\n try {\n canManageDefinitions = await rbac.userHasAllFeatures(auth.sub, ['entities.definitions.manage'], {\n tenantId,\n organizationId,\n })\n } catch {\n // RBAC service unavailable \u2014 fall back to read-only (no definition sync)\n }\n }\n\n if (canManageDefinitions) {\n try {\n await installCustomEntitiesFromModules(em, cache, {\n tenantIds: [tenantId],\n entityIds,\n includeGlobal: true,\n createOnly: true,\n })\n } catch (err) {\n logger.warn('Failed to synchronize module-backed definitions', {\n tenantId,\n entityIds,\n err,\n })\n }\n }\n\n let cacheKey: string | null = null\n if (cache && !fieldsetFilter) {\n cacheKey = createDefinitionsCacheKey({\n tenantId,\n organizationId,\n entityIds,\n })\n try {\n const cached = await cache.get(cacheKey)\n if (cached) {\n return NextResponse.json(cached)\n }\n } catch (err) {\n logger.warn('Failed to read cache', { err })\n }\n }\n\n const fieldsetConfigs = await loadEntityFieldsetConfigs(em, {\n entityIds,\n tenantId,\n organizationId,\n mode: 'public',\n })\n\n const tenantCandidates = [{ tenantId }, { tenantId: null as string | null }]\n const organizationCandidates = [{ organizationId: null as string | null }]\n if (organizationId) organizationCandidates.unshift({ organizationId })\n const readScope = { tenantId, organizationId }\n\n const whereActive = {\n entityId: { $in: entityIds as any },\n deletedAt: null,\n $and: [\n { $or: tenantCandidates },\n { $or: organizationCandidates },\n ],\n } as any\n const defs = (await em.find(CustomFieldDef, whereActive as any))\n .filter((definition: any) => definitionMatchesReadScope(definition, readScope))\n const tombstones = (await em.find(CustomFieldDef, {\n entityId: { $in: entityIds as any },\n deletedAt: { $ne: null } as any,\n $and: [\n { $or: tenantCandidates },\n { $or: organizationCandidates },\n ],\n } as any)).filter((definition: any) => definitionMatchesReadScope(definition, readScope))\n\n const tombstonedByEntity = new Map<string, Set<string>>()\n for (const entry of tombstones as any[]) {\n const eid = String(entry.entityId)\n if (!tombstonedByEntity.has(eid)) tombstonedByEntity.set(eid, new Set())\n tombstonedByEntity.get(eid)!.add(entry.key)\n }\n\n const scopeScore = (x: any) => (x.tenantId ? 2 : 0) + (x.organizationId ? 1 : 0)\n\n const definitionsByEntity = new Map<string, any[]>()\n for (const d of defs) {\n const eid = String(d.entityId)\n if (!definitionsByEntity.has(eid)) definitionsByEntity.set(eid, [])\n definitionsByEntity.get(eid)!.push(d)\n }\n\n const entityDefaultEditors = new Map<string, string | undefined>()\n for (const entityId of entityIds) {\n const editor = await resolveEntityDefaultEditor(em, entityId, tenantId ?? null)\n entityDefaultEditors.set(entityId, editor)\n }\n\n const items: any[] = []\n\n const entityOrder = new Map<string, number>()\n entityIds.forEach((id, idx) => entityOrder.set(id, idx))\n\n for (const entityId of entityIds) {\n const defsForEntity = definitionsByEntity.get(entityId) ?? []\n if (!defsForEntity.length) continue\n const tombstonedKeys = tombstonedByEntity.get(entityId) ?? new Set<string>()\n const byKey = new Map<string, any>()\n for (const d of defsForEntity) {\n const existing = byKey.get(d.key)\n if (!existing) { byKey.set(d.key, d); continue }\n const sNew = scopeScore(d)\n const sOld = scopeScore(existing)\n if (sNew > sOld) { byKey.set(d.key, d); continue }\n if (sNew < sOld) continue\n const tNew = (d.updatedAt instanceof Date) ? d.updatedAt.getTime() : new Date(d.updatedAt).getTime()\n const tOld = (existing.updatedAt instanceof Date) ? existing.updatedAt.getTime() : new Date(existing.updatedAt).getTime()\n if (tNew >= tOld) byKey.set(d.key, d)\n }\n\n const defaultEditor = entityDefaultEditors.get(entityId)\n const winning = Array.from(byKey.values()).filter((d: any) => (d.isActive !== false) && !tombstonedKeys.has(d.key))\n winning.sort((a: any, b: any) => ((a.configJson?.priority ?? 0) - (b.configJson?.priority ?? 0)))\n\n for (const d of winning) {\n const rawFieldset = typeof d.configJson?.fieldset === 'string' ? d.configJson.fieldset.trim() : ''\n const normalizedFieldset = rawFieldset.length > 0 ? rawFieldset : undefined\n const normalizedFieldsets = Array.isArray(d.configJson?.fieldsets)\n ? d.configJson.fieldsets\n .filter((entry: unknown): entry is string => typeof entry === 'string')\n .map((entry: string) => entry.trim())\n .filter((entry: string) => entry.length > 0)\n : []\n const effectiveFieldsets = normalizedFieldsets.length > 0\n ? normalizedFieldsets\n : (normalizedFieldset ? [normalizedFieldset] : [])\n if (fieldsetFilter && !effectiveFieldsets.includes(fieldsetFilter)) continue\n const groupInfo = normalizeFieldGroup(d.configJson?.group)\n const keyLower = String(d.key).toLowerCase()\n const candidateBase = {\n key: d.key,\n kind: d.kind,\n label: d.configJson?.label || d.key,\n description: d.configJson?.description || undefined,\n multi: Boolean(d.configJson?.multi),\n relatedEntityId: d.kind === 'relation' && typeof d.configJson?.relatedEntityId === 'string'\n ? d.configJson.relatedEntityId.trim() || undefined\n : undefined,\n options: (() => {\n if (d.kind === 'currency') return undefined\n const normalizedOptions = normalizeCustomFieldOptions(d.configJson?.options)\n return normalizedOptions.length ? normalizedOptions : undefined\n })(),\n optionsUrl: (() => {\n if (d.kind === 'currency') return CURRENCY_OPTIONS_URL\n const dictionaryId = typeof d.configJson?.dictionaryId === 'string' ? d.configJson.dictionaryId : undefined\n if (dictionaryId) return `/api/dictionaries/${dictionaryId}/entries`\n return typeof d.configJson?.optionsUrl === 'string' ? d.configJson.optionsUrl : undefined\n })(),\n filterable: Boolean(d.configJson?.filterable),\n formEditable: d.configJson?.formEditable !== undefined ? Boolean(d.configJson.formEditable) : true,\n listVisible: d.configJson?.listVisible !== undefined ? Boolean(d.configJson.listVisible) : true,\n editor: typeof d.configJson?.editor === 'string'\n ? d.configJson.editor\n : (d.kind === 'multiline' ? defaultEditor : undefined),\n input: typeof d.configJson?.input === 'string' ? d.configJson.input : undefined,\n dictionaryId: typeof d.configJson?.dictionaryId === 'string' ? d.configJson.dictionaryId : undefined,\n dictionaryInlineCreate: d.configJson?.dictionaryInlineCreate !== undefined\n ? Boolean(d.configJson.dictionaryInlineCreate)\n : undefined,\n priority: typeof d.configJson?.priority === 'number' ? d.configJson.priority : 0,\n validation: Array.isArray(d.configJson?.validation) ? d.configJson.validation : undefined,\n defaultValue: d.configJson?.defaultValue !== undefined ? d.configJson.defaultValue : undefined,\n // attachments config passthrough\n maxAttachmentSizeMb: typeof d.configJson?.maxAttachmentSizeMb === 'number' ? d.configJson.maxAttachmentSizeMb : undefined,\n acceptExtensions: Array.isArray(d.configJson?.acceptExtensions) ? d.configJson.acceptExtensions : undefined,\n // phone config passthrough\n defaultCountryIso2: typeof d.configJson?.defaultCountryIso2 === 'string' ? d.configJson.defaultCountryIso2 : undefined,\n entityId,\n fieldset: normalizedFieldset ?? effectiveFieldsets[0],\n fieldsets: effectiveFieldsets.length > 0 ? effectiveFieldsets : undefined,\n group: groupInfo,\n } as any\n const metrics = computeDefinitionScore(d, candidateBase, entityOrder.get(entityId) ?? Number.MAX_SAFE_INTEGER)\n const candidate = { ...candidateBase, __score: metrics }\n const existing = (items as any[]).find((entry) => entry.key.toLowerCase() === keyLower)\n if (!existing) {\n items.push(candidate)\n continue\n }\n const existingScore = existing.__score as { base: number; penalty: number; entityIndex: number }\n const candidateScoreInfo = candidate.__score as { base: number; penalty: number; entityIndex: number }\n const better =\n candidateScoreInfo.base > existingScore.base ||\n (candidateScoreInfo.base === existingScore.base && candidateScoreInfo.penalty < existingScore.penalty) ||\n (candidateScoreInfo.base === existingScore.base && candidateScoreInfo.penalty === existingScore.penalty && candidateScoreInfo.entityIndex < existingScore.entityIndex)\n if (better) {\n const index = items.findIndex((entry) => entry.key.toLowerCase() === keyLower)\n if (index >= 0) items[index] = candidate\n }\n }\n }\n\n const sanitized = items.map((item: any) => {\n const { __score, ...rest } = item\n return rest\n })\n sanitized.sort((a: any, b: any) => ((a.priority ?? 0) - (b.priority ?? 0)))\n\n const fieldsetsByEntity: Record<string, CustomFieldsetDefinition[]> = {}\n const entitySettings: Record<string, { singleFieldsetPerRecord: boolean }> = {}\n for (const entityId of entityIds) {\n const cfg = fieldsetConfigs.get(entityId) ?? { fieldsets: [], singleFieldsetPerRecord: true }\n fieldsetsByEntity[entityId] = cfg.fieldsets\n entitySettings[entityId] = { singleFieldsetPerRecord: cfg.singleFieldsetPerRecord }\n }\n\n const responseBody = { items: sanitized, fieldsetsByEntity, entitySettings }\n\n if (cache && cacheKey && !fieldsetFilter) {\n const tags = createDefinitionsCacheTags({\n tenantId,\n organizationId,\n entityIds,\n })\n try {\n await cache.set(cacheKey, responseBody, {\n ttl: ENTITY_DEFINITIONS_CACHE_TTL_MS,\n tags,\n })\n } catch (err) {\n logger.warn('Failed to store cache entry', { err })\n }\n }\n\n return NextResponse.json(responseBody)\n}\n\nexport async function POST(req: Request) {\n const auth = await getAuthFromRequest(req)\n if (!auth || !auth.orgId) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n let body: any\n try { body = await req.json() } catch { return NextResponse.json({ error: 'Invalid JSON' }, { status: 400 }) }\n const parsed = upsertCustomFieldDefSchema.safeParse(body)\n if (!parsed.success) return NextResponse.json({ error: 'Validation failed', details: parsed.error.flatten() }, { status: 400 })\n const input = parsed.data\n\n if (!isSystemEntitySelectable(input.entityId)) {\n return NextResponse.json({ error: 'Custom fields are not supported for this entity' }, { status: 400 })\n }\n\n if (input.kind === 'dictionary') {\n const dictionaryId = input.configJson?.dictionaryId\n if (typeof dictionaryId !== 'string' || dictionaryId.trim().length === 0) {\n return NextResponse.json({ error: 'dictionaryId is required for dictionary custom fields' }, { status: 400 })\n }\n }\n\n const container = await createRequestContainer()\n const scope = await resolveDefinitionMutationScope({ auth, container, request: req })\n const { resolve } = container\n const em = resolve('em') as any\n let cache: CacheStrategy | undefined\n try {\n cache = resolve('cache') as CacheStrategy\n } catch {}\n\n const where: any = createExactDefinitionWhere(input.entityId, input.key, scope)\n let def = await em.findOne(CustomFieldDef, where)\n\n const guard = await beginEntitiesMutationGuard({\n container,\n auth,\n req,\n resourceKind: FIELD_DEFINITION_RESOURCE_KIND,\n resourceId: def ? def.id : `${input.entityId}:${input.key}`,\n operation: def ? 'update' : 'create',\n mutationPayload: input as unknown as Record<string, unknown>,\n })\n if (guard.blockedResponse) return guard.blockedResponse\n\n if (!def) def = em.create(CustomFieldDef, { ...where, createdAt: new Date() })\n def.kind = input.kind\n const inCfg = (input as any).configJson ?? {}\n const cfg: Record<string, any> = { ...inCfg }\n if (cfg.label == null || String(cfg.label).trim() === '') cfg.label = input.key\n if (cfg.formEditable === undefined) cfg.formEditable = true\n if (cfg.listVisible === undefined) cfg.listVisible = true\n if (input.kind === 'dictionary') {\n const dictionaryId = typeof cfg.dictionaryId === 'string' ? cfg.dictionaryId.trim() : ''\n cfg.dictionaryId = dictionaryId\n cfg.dictionaryInlineCreate = cfg.dictionaryInlineCreate !== false\n }\n if (input.kind === 'currency') {\n cfg.optionsUrl = CURRENCY_OPTIONS_URL\n if (Array.isArray(cfg.options)) delete cfg.options\n }\n if (input.kind === 'multiline' && (cfg.editor == null || String(cfg.editor).trim() === '')) {\n cfg.editor = 'markdown'\n }\n // Validate and normalize defaultValue by kind before persisting\n if (cfg.defaultValue !== undefined && cfg.defaultValue !== null) {\n const validationError = await validateDefaultValueByKind(\n cfg.defaultValue, input.kind, cfg, em,\n { tenantId: scope.tenantId, organizationId: scope.organizationId },\n )\n if (validationError) {\n return NextResponse.json({ error: validationError }, { status: 400 })\n }\n cfg.defaultValue = normalizeDefaultValueByKind(cfg.defaultValue, input.kind)\n }\n def.configJson = cfg\n def.isActive = input.isActive ?? true\n def.deletedAt = def.isActive === false ? (def.deletedAt ?? new Date()) : null\n def.updatedAt = new Date()\n em.persist(def)\n await em.flush()\n await guard.runAfterSuccess()\n await invalidateDefinitionsCache(cache, {\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n entityIds: [input.entityId],\n })\n // Changing field definitions may impact forms but not sidebar items; no nav cache touch\n return NextResponse.json({ ok: true, item: { id: def.id, key: def.key, kind: def.kind, configJson: def.configJson, isActive: def.isActive } })\n}\n\nexport async function DELETE(req: Request) {\n const auth = await getAuthFromRequest(req)\n if (!auth || !auth.orgId) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n let body: any\n try { body = await req.json() } catch { return NextResponse.json({ error: 'Invalid JSON' }, { status: 400 }) }\n const { entityId, key } = body || {}\n if (!entityId || !key) return NextResponse.json({ error: 'entityId and key are required' }, { status: 400 })\n\n const container = await createRequestContainer()\n const scope = await resolveDefinitionMutationScope({ auth, container, request: req })\n const { resolve } = container\n const em = resolve('em') as any\n let cache: CacheStrategy | undefined\n try {\n cache = resolve('cache') as CacheStrategy\n } catch {}\n const where: any = createExactDefinitionWhere(entityId, key, scope)\n let def = await em.findOne(CustomFieldDef, where)\n let inherited: any | null = null\n if (!def) {\n inherited = selectVisibleDefinitionWinner(await em.find(CustomFieldDef, createVisibleDefinitionWhere(\n entityId,\n key,\n scope,\n { deletedAt: null, isActive: true },\n )))\n if (!inherited) return NextResponse.json({ error: 'Not found' }, { status: 404 })\n }\n\n const guard = await beginEntitiesMutationGuard({\n container,\n auth,\n req,\n resourceKind: FIELD_DEFINITION_RESOURCE_KIND,\n resourceId: def?.id ?? inherited?.id ?? `${entityId}:${key}`,\n operation: 'delete',\n mutationPayload: { entityId, key },\n })\n if (guard.blockedResponse) return guard.blockedResponse\n\n if (!def) {\n def = createScopedDefinitionTombstone(em, inherited, scope)\n } else {\n markDefinitionTombstoned(def)\n }\n em.persist(def)\n await em.flush()\n await guard.runAfterSuccess()\n await invalidateDefinitionsCache(cache, {\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n entityIds: [entityId],\n })\n // Changing field definitions may impact forms but not sidebar items; no nav cache touch\n // Return the post-delete aggregate version so the edit form keeps its optimistic-lock\n // token in sync after removing a field out-of-band (issue #3152).\n const version = await resolveEntityDefinitionsVersion(em, {\n entityId,\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n })\n return NextResponse.json({ ok: true, version })\n}\n\nconst definitionsQuerySchema = z\n .object({\n entityId: z.union([z.string(), z.array(z.string())]).optional(),\n entityIds: z.string().optional(),\n fieldset: z.string().regex(fieldsetCodeRegex).optional(),\n })\n .refine(\n (value) => {\n if (value.entityId && typeof value.entityId === 'string' && value.entityId.trim().length > 0) return true\n if (Array.isArray(value.entityId) && value.entityId.length > 0) return true\n return typeof value.entityIds === 'string' && value.entityIds.trim().length > 0\n },\n { message: 'Provide at least one entityId or an entityIds list.' }\n )\n\nconst customFieldOptionValueSchema = z.union([z.string(), z.number()])\n\nconst customFieldDefinitionSchema = z.object({\n key: z.string(),\n kind: z.string(),\n label: z.string(),\n description: z.string().optional(),\n multi: z.boolean().optional(),\n relatedEntityId: z.string().optional(),\n options: z.array(customFieldOptionValueSchema).optional(),\n optionsUrl: z.string().optional(),\n filterable: z.boolean().optional(),\n formEditable: z.boolean().optional(),\n listVisible: z.boolean().optional(),\n editor: z.string().optional(),\n input: z.string().optional(),\n dictionaryId: z.string().optional(),\n dictionaryInlineCreate: z.boolean().optional(),\n priority: z.number().optional(),\n validation: z.array(z.any()).optional(),\n defaultValue: z.union([z.string(), z.number(), z.boolean(), z.null()]).optional(),\n maxAttachmentSizeMb: z.number().optional(),\n acceptExtensions: z.array(z.any()).optional(),\n entityId: z.string(),\n fieldset: z.string().optional(),\n group: z\n .object({\n code: z.string(),\n title: z.string().optional(),\n hint: z.string().optional(),\n })\n .optional(),\n})\n\nconst customFieldsetGroupResponseSchema = z.object({\n code: z.string(),\n title: z.string().optional(),\n hint: z.string().optional(),\n})\n\nconst entityFieldsetResponseSchema = z.object({\n code: z.string(),\n label: z.string(),\n icon: z.string().optional(),\n description: z.string().optional(),\n groups: z.array(customFieldsetGroupResponseSchema).optional(),\n})\n\nconst definitionsResponseSchema = z.object({\n items: z.array(customFieldDefinitionSchema),\n fieldsetsByEntity: z.record(z.string(), z.array(entityFieldsetResponseSchema)).optional(),\n entitySettings: z\n .record(\n z.string(),\n z.object({\n singleFieldsetPerRecord: z.boolean().optional(),\n })\n )\n .optional(),\n})\n\nconst upsertDefinitionResponseSchema = z.object({\n ok: z.literal(true),\n item: z.object({\n id: z.string().uuid(),\n key: z.string(),\n kind: z.string(),\n configJson: z.record(z.string(), z.any()),\n isActive: z.boolean().optional(),\n }),\n})\n\nconst deleteDefinitionRequestSchema = z.object({\n entityId: z.string(),\n key: z.string(),\n})\n\nconst deleteDefinitionResponseSchema = z.object({\n ok: z.literal(true),\n version: z.string().nullable().optional(),\n})\n\nexport const openApi: OpenApiRouteDoc = {\n tag: 'Entities',\n summary: 'Manage custom field definitions',\n methods: {\n GET: {\n summary: 'List active custom field definitions',\n description: 'Returns active custom field definitions for the supplied entity ids, respecting tenant scope and tombstones.',\n query: definitionsQuerySchema,\n responses: [\n {\n status: 200,\n description: 'Definition list',\n schema: definitionsResponseSchema,\n },\n {\n status: 400,\n description: 'Missing entity id',\n schema: z.object({ error: z.string() }),\n },\n {\n status: 401,\n description: 'Missing authentication',\n schema: z.object({ error: z.string() }),\n },\n ],\n },\n POST: {\n summary: 'Upsert custom field definition',\n description: 'Creates or updates a custom field definition for the current tenant/org scope.',\n requestBody: {\n contentType: 'application/json',\n schema: upsertCustomFieldDefSchema,\n },\n responses: [\n {\n status: 200,\n description: 'Definition saved',\n schema: upsertDefinitionResponseSchema,\n },\n {\n status: 400,\n description: 'Validation failed',\n schema: z.object({\n error: z.string(),\n details: z.any().optional(),\n }),\n },\n {\n status: 401,\n description: 'Missing authentication',\n schema: z.object({ error: z.string() }),\n },\n ],\n },\n DELETE: {\n summary: 'Soft delete custom field definition',\n description: 'Marks the specified definition inactive and tombstones it for the current scope.',\n requestBody: {\n contentType: 'application/json',\n schema: deleteDefinitionRequestSchema,\n },\n responses: [\n {\n status: 200,\n description: 'Definition deleted',\n schema: deleteDefinitionResponseSchema,\n },\n {\n status: 400,\n description: 'Missing entity id or key',\n schema: z.object({ error: z.string() }),\n },\n {\n status: 401,\n description: 'Missing authentication',\n schema: z.object({ error: z.string() }),\n },\n {\n status: 404,\n description: 'Definition not found',\n schema: z.object({ error: z.string() }),\n },\n ],\n },\n },\n}\nconst computeDefinitionScore = (def: any, cfg: Record<string, any>, entityIndex: number) => {\n const listVisibleScore = cfg.listVisible === false ? 0 : 1\n const formEditableScore = cfg.formEditable === false ? 0 : 1\n const filterableScore = cfg.filterable ? 1 : 0\n const kindScore = (() => {\n switch (def.kind) {\n case 'dictionary':\n return 8\n case 'relation':\n return 6\n case 'select':\n case 'currency':\n return 4\n case 'multiline':\n return 3\n case 'boolean':\n case 'integer':\n case 'float':\n return 2\n default:\n return 1\n }\n })()\n const optionsBonus = Array.isArray(cfg.options) && cfg.options.length ? 2 : 0\n const dictionaryBonus = typeof cfg.dictionaryId === 'string' && cfg.dictionaryId.trim().length ? 5 : 0\n const base = (listVisibleScore * 16) + (formEditableScore * 8) + (filterableScore * 4) + kindScore + optionsBonus + dictionaryBonus\n const penalty = typeof cfg.priority === 'number' ? cfg.priority : 0\n return { base, penalty, entityIndex }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["code"]
7
7
  }