@open-mercato/core 0.6.7 → 0.6.8-develop.6874.1.982d6097d8

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,6 +1,7 @@
1
1
  "use client";
2
2
  import { Fragment, jsx } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
+ import { extensionPoints } from "@open-mercato/core/modules/entities/extension-points";
4
5
  import { useQuery } from "@tanstack/react-query";
5
6
  import { DataTable } from "@open-mercato/ui/backend/DataTable";
6
7
  import { RowActions } from "@open-mercato/ui/backend/RowActions";
@@ -58,7 +59,7 @@ function SystemEntitiesTable() {
58
59
  sortable: true,
59
60
  sorting,
60
61
  onSortingChange: setSorting,
61
- perspective: { tableId: "entities.system.list" },
62
+ perspective: { tableId: extensionPoints.hosts.systemEntitiesTable.tableId },
62
63
  rowActions: (row) => /* @__PURE__ */ jsx(
63
64
  RowActions,
64
65
  {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/entities/components/SystemEntitiesTable.tsx"],
4
- "sourcesContent": ["\"use client\"\nimport * as React from 'react'\nimport { useQuery } from '@tanstack/react-query'\nimport type { ColumnDef, SortingState } from '@tanstack/react-table'\nimport { DataTable } from '@open-mercato/ui/backend/DataTable'\nimport { RowActions } from '@open-mercato/ui/backend/RowActions'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { buildEntitiesCsv } from '../lib/entitiesCsvExport'\n\ntype EntityRow = {\n entityId: string\n label: string\n source: 'code' | 'custom'\n count: number\n}\n\ntype EntitiesResponse = { items: EntityRow[] }\n\nconst columns: ColumnDef<EntityRow>[] = [\n { accessorKey: 'entityId', header: 'Entity', meta: { priority: 1 }, cell: ({ getValue }) => <span className=\"font-mono\">{String(getValue())}</span> },\n { accessorKey: 'label', header: 'Label', meta: { priority: 2 } },\n { accessorKey: 'source', header: 'Source', meta: { priority: 3 } },\n { accessorKey: 'count', header: 'Fields', meta: { priority: 4 } },\n]\n\nexport default function SystemEntitiesTable() {\n const [sorting, setSorting] = React.useState<SortingState>([{ id: 'entityId', desc: false }])\n const [page, setPage] = React.useState(1)\n const [search, setSearch] = React.useState('')\n const scopeVersion = useOrganizationScopeVersion()\n\n const { data, isLoading } = useQuery<EntitiesResponse>({\n queryKey: ['custom-entities', scopeVersion],\n queryFn: async () => {\n return readApiResultOrThrow<EntitiesResponse>('/api/entities/entities', undefined, {\n errorMessage: 'Failed to load entities',\n })\n },\n })\n\n const rowsAll = data?.items || []\n // Filter to only show system entities (source: 'code')\n const systemRows = rowsAll.filter(row => row.source === 'code')\n const rows = React.useMemo(() => {\n if (!search) return systemRows\n const q = search.toLowerCase()\n return systemRows.filter(r => r.entityId.toLowerCase().includes(q) || r.label.toLowerCase().includes(q))\n }, [systemRows, search])\n\n return (\n <DataTable\n title=\"System Entities\"\n actions={(\n <>\n <Button variant=\"outline\" onClick={() => {\n const csv = buildEntitiesCsv(rows)\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = 'entities-system.csv'\n a.click()\n URL.revokeObjectURL(url)\n }}>Export</Button>\n </>\n )}\n columns={columns}\n data={rows}\n searchValue={search}\n onSearchChange={(v) => { setSearch(v); setPage(1) }}\n sortable\n sorting={sorting}\n onSortingChange={setSorting}\n perspective={{ tableId: 'entities.system.list' }}\n rowActions={(row) => (\n <RowActions\n items={[\n { id: 'edit', label: 'Edit', href: `/backend/entities/system/${encodeURIComponent(row.entityId)}` },\n ]}\n />\n )}\n pagination={{ page, pageSize: 50, total: rows.length, totalPages: 1, onPageChange: setPage }}\n isLoading={isLoading}\n />\n )\n}\n"],
5
- "mappings": ";AAqB8F,SAkCtF,UAlCsF;AApB9F,YAAY,WAAW;AACvB,SAAS,gBAAgB;AAEzB,SAAS,iBAAiB;AAC1B,SAAS,kBAAkB;AAC3B,SAAS,cAAc;AACvB,SAAS,4BAA4B;AACrC,SAAS,mCAAmC;AAC5C,SAAS,wBAAwB;AAWjC,MAAM,UAAkC;AAAA,EACtC,EAAE,aAAa,YAAY,QAAQ,UAAU,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC,EAAE,SAAS,MAAM,oBAAC,UAAK,WAAU,aAAa,iBAAO,SAAS,CAAC,GAAE,EAAQ;AAAA,EACpJ,EAAE,aAAa,SAAS,QAAQ,SAAS,MAAM,EAAE,UAAU,EAAE,EAAE;AAAA,EAC/D,EAAE,aAAa,UAAU,QAAQ,UAAU,MAAM,EAAE,UAAU,EAAE,EAAE;AAAA,EACjE,EAAE,aAAa,SAAS,QAAQ,UAAU,MAAM,EAAE,UAAU,EAAE,EAAE;AAClE;AAEe,SAAR,sBAAuC;AAC5C,QAAM,CAAC,SAAS,UAAU,IAAI,MAAM,SAAuB,CAAC,EAAE,IAAI,YAAY,MAAM,MAAM,CAAC,CAAC;AAC5F,QAAM,CAAC,MAAM,OAAO,IAAI,MAAM,SAAS,CAAC;AACxC,QAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,SAAS,EAAE;AAC7C,QAAM,eAAe,4BAA4B;AAEjD,QAAM,EAAE,MAAM,UAAU,IAAI,SAA2B;AAAA,IACrD,UAAU,CAAC,mBAAmB,YAAY;AAAA,IAC1C,SAAS,YAAY;AACnB,aAAO,qBAAuC,0BAA0B,QAAW;AAAA,QACjF,cAAc;AAAA,MAChB,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,QAAM,UAAU,MAAM,SAAS,CAAC;AAEhC,QAAM,aAAa,QAAQ,OAAO,SAAO,IAAI,WAAW,MAAM;AAC9D,QAAM,OAAO,MAAM,QAAQ,MAAM;AAC/B,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,IAAI,OAAO,YAAY;AAC7B,WAAO,WAAW,OAAO,OAAK,EAAE,SAAS,YAAY,EAAE,SAAS,CAAC,KAAK,EAAE,MAAM,YAAY,EAAE,SAAS,CAAC,CAAC;AAAA,EACzG,GAAG,CAAC,YAAY,MAAM,CAAC;AAEvB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAM;AAAA,MACN,SACE,gCACE,8BAAC,UAAO,SAAQ,WAAU,SAAS,MAAM;AACvC,cAAM,MAAM,iBAAiB,IAAI;AACjC,cAAM,OAAO,IAAI,KAAK,CAAC,GAAG,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAChE,cAAM,MAAM,IAAI,gBAAgB,IAAI;AACpC,cAAM,IAAI,SAAS,cAAc,GAAG;AACpC,UAAE,OAAO;AACT,UAAE,WAAW;AACb,UAAE,MAAM;AACR,YAAI,gBAAgB,GAAG;AAAA,MACzB,GAAG,oBAAM,GACX;AAAA,MAEF;AAAA,MACA,MAAM;AAAA,MACN,aAAa;AAAA,MACb,gBAAgB,CAAC,MAAM;AAAE,kBAAU,CAAC;AAAG,gBAAQ,CAAC;AAAA,MAAE;AAAA,MAClD,UAAQ;AAAA,MACR;AAAA,MACA,iBAAiB;AAAA,MACjB,aAAa,EAAE,SAAS,uBAAuB;AAAA,MAC/C,YAAY,CAAC,QACX;AAAA,QAAC;AAAA;AAAA,UACC,OAAO;AAAA,YACL,EAAE,IAAI,QAAQ,OAAO,QAAQ,MAAM,4BAA4B,mBAAmB,IAAI,QAAQ,CAAC,GAAG;AAAA,UACpG;AAAA;AAAA,MACF;AAAA,MAEF,YAAY,EAAE,MAAM,UAAU,IAAI,OAAO,KAAK,QAAQ,YAAY,GAAG,cAAc,QAAQ;AAAA,MAC3F;AAAA;AAAA,EACF;AAEJ;",
4
+ "sourcesContent": ["\"use client\"\nimport * as React from 'react'\nimport { extensionPoints } from '@open-mercato/core/modules/entities/extension-points'\nimport { useQuery } from '@tanstack/react-query'\nimport type { ColumnDef, SortingState } from '@tanstack/react-table'\nimport { DataTable } from '@open-mercato/ui/backend/DataTable'\nimport { RowActions } from '@open-mercato/ui/backend/RowActions'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { buildEntitiesCsv } from '../lib/entitiesCsvExport'\n\ntype EntityRow = {\n entityId: string\n label: string\n source: 'code' | 'custom'\n count: number\n}\n\ntype EntitiesResponse = { items: EntityRow[] }\n\nconst columns: ColumnDef<EntityRow>[] = [\n { accessorKey: 'entityId', header: 'Entity', meta: { priority: 1 }, cell: ({ getValue }) => <span className=\"font-mono\">{String(getValue())}</span> },\n { accessorKey: 'label', header: 'Label', meta: { priority: 2 } },\n { accessorKey: 'source', header: 'Source', meta: { priority: 3 } },\n { accessorKey: 'count', header: 'Fields', meta: { priority: 4 } },\n]\n\nexport default function SystemEntitiesTable() {\n const [sorting, setSorting] = React.useState<SortingState>([{ id: 'entityId', desc: false }])\n const [page, setPage] = React.useState(1)\n const [search, setSearch] = React.useState('')\n const scopeVersion = useOrganizationScopeVersion()\n\n const { data, isLoading } = useQuery<EntitiesResponse>({\n queryKey: ['custom-entities', scopeVersion],\n queryFn: async () => {\n return readApiResultOrThrow<EntitiesResponse>('/api/entities/entities', undefined, {\n errorMessage: 'Failed to load entities',\n })\n },\n })\n\n const rowsAll = data?.items || []\n // Filter to only show system entities (source: 'code')\n const systemRows = rowsAll.filter(row => row.source === 'code')\n const rows = React.useMemo(() => {\n if (!search) return systemRows\n const q = search.toLowerCase()\n return systemRows.filter(r => r.entityId.toLowerCase().includes(q) || r.label.toLowerCase().includes(q))\n }, [systemRows, search])\n\n return (\n <DataTable\n title=\"System Entities\"\n actions={(\n <>\n <Button variant=\"outline\" onClick={() => {\n const csv = buildEntitiesCsv(rows)\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = 'entities-system.csv'\n a.click()\n URL.revokeObjectURL(url)\n }}>Export</Button>\n </>\n )}\n columns={columns}\n data={rows}\n searchValue={search}\n onSearchChange={(v) => { setSearch(v); setPage(1) }}\n sortable\n sorting={sorting}\n onSortingChange={setSorting}\n perspective={{ tableId: extensionPoints.hosts.systemEntitiesTable.tableId }}\n rowActions={(row) => (\n <RowActions\n items={[\n { id: 'edit', label: 'Edit', href: `/backend/entities/system/${encodeURIComponent(row.entityId)}` },\n ]}\n />\n )}\n pagination={{ page, pageSize: 50, total: rows.length, totalPages: 1, onPageChange: setPage }}\n isLoading={isLoading}\n />\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,6 +1,7 @@
1
1
  "use client";
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
+ import { extensionPoints } from "@open-mercato/core/modules/entities/extension-points";
4
5
  import Link from "next/link";
5
6
  import { useQuery } from "@tanstack/react-query";
6
7
  import { DataTable, RowActions, Button } from "@open-mercato/ui";
@@ -72,7 +73,7 @@ function UserEntitiesTable() {
72
73
  sortable: true,
73
74
  sorting,
74
75
  onSortingChange: setSorting,
75
- perspective: { tableId: "entities.user.list" },
76
+ perspective: { tableId: extensionPoints.hosts.userEntitiesTable.tableId },
76
77
  emptyState: /* @__PURE__ */ jsx(
77
78
  ListEmptyState,
78
79
  {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/entities/components/UserEntitiesTable.tsx"],
4
- "sourcesContent": ["\n\"use client\"\nimport * as React from 'react'\nimport Link from 'next/link'\nimport { useQuery } from '@tanstack/react-query'\nimport type { ColumnDef, SortingState } from '@tanstack/react-table'\nimport { DataTable, RowActions, Button } from '@open-mercato/ui'\nimport { ListEmptyState } from '@open-mercato/ui/backend/filters/ListEmptyState'\nimport { readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { buildEntitiesCsv } from '../lib/entitiesCsvExport'\n\ntype EntityRow = {\n entityId: string\n label: string\n source: 'code' | 'custom'\n count: number\n showInSidebar?: boolean\n}\n\ntype EntitiesResponse = { items: EntityRow[] }\n\nfunction buildColumns(t: (key: string, fallback: string) => string): ColumnDef<EntityRow>[] {\n return [\n { accessorKey: 'entityId', header: t('entities.user.table.column.entity', 'Entity'), meta: { priority: 1 }, cell: ({ getValue }) => <span className=\"font-mono\">{String(getValue())}</span> },\n { accessorKey: 'label', header: t('entities.user.table.column.label', 'Label'), meta: { priority: 2 } },\n { accessorKey: 'source', header: t('entities.user.table.column.source', 'Source'), meta: { priority: 3 } },\n { accessorKey: 'count', header: t('entities.user.table.column.fields', 'Fields'), meta: { priority: 4 } },\n { \n accessorKey: 'showInSidebar', \n header: t('entities.user.table.column.inSidebar', 'In Sidebar'), \n meta: { priority: 5 },\n cell: ({ getValue }) => (\n <span className={`px-2 py-1 rounded text-xs ${\n getValue() ? 'bg-status-success-bg text-status-success-text' : 'bg-muted text-muted-foreground'\n }`}>\n {getValue() ? t('common.yes', 'Yes') : t('common.no', 'No')}\n </span>\n )\n },\n ]\n}\n\nexport default function UserEntitiesTable() {\n const t = useT()\n const [sorting, setSorting] = React.useState<SortingState>([{ id: 'entityId', desc: false }])\n const [page, setPage] = React.useState(1)\n const [search, setSearch] = React.useState('')\n const scopeVersion = useOrganizationScopeVersion()\n \n const columns = React.useMemo(() => buildColumns(t), [t])\n\n const { data, isLoading } = useQuery<EntitiesResponse>({\n queryKey: ['custom-entities', scopeVersion],\n queryFn: async () => {\n return readApiResultOrThrow<EntitiesResponse>('/api/entities/entities', undefined, {\n errorMessage: 'Failed to load entities',\n })\n },\n })\n\n const rowsAll = data?.items || []\n // Filter to only show user entities (source: 'custom')\n const userRows = rowsAll.filter(row => row.source === 'custom')\n const rows = React.useMemo(() => {\n if (!search) return userRows\n const q = search.toLowerCase()\n return userRows.filter(r => r.entityId.toLowerCase().includes(q) || r.label.toLowerCase().includes(q))\n }, [userRows, search])\n\n return (\n <DataTable\n title={t('entities.user.table.title', 'User Entities')}\n actions={(\n <>\n <Button variant=\"outline\" onClick={() => {\n const csv = buildEntitiesCsv(rows, { includeSidebar: true })\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = 'entities-user.csv'\n a.click()\n URL.revokeObjectURL(url)\n }}>{t('common.export', 'Export')}</Button>\n <Button asChild>\n <Link href=\"/backend/entities/user/create\">{t('common.create', 'Create')}</Link>\n </Button>\n </>\n )}\n columns={columns}\n data={rows}\n searchValue={search}\n onSearchChange={(v) => { setSearch(v); setPage(1) }}\n sortable\n sorting={sorting}\n onSortingChange={setSorting}\n perspective={{ tableId: 'entities.user.list' }}\n emptyState={(\n <ListEmptyState\n entityName={t('entities.user.table.title', 'User Entities')}\n createHref=\"/backend/entities/user/create\"\n createLabel={t('common.create', 'Create')}\n />\n )}\n rowActions={(row) => (\n <RowActions\n items={[\n { id: 'edit', label: t('common.edit', 'Edit'), href: `/backend/entities/user/${encodeURIComponent(row.entityId)}` },\n { id: 'show-records', label: t('entities.user.table.actions.showRecords', 'Show records'), href: `/backend/entities/user/${encodeURIComponent(row.entityId)}/records` },\n ]}\n />\n )}\n pagination={{ page, pageSize: 50, total: rows.length, totalPages: 1, onPageChange: setPage }}\n isLoading={isLoading}\n />\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["\n\"use client\"\nimport * as React from 'react'\nimport { extensionPoints } from '@open-mercato/core/modules/entities/extension-points'\nimport Link from 'next/link'\nimport { useQuery } from '@tanstack/react-query'\nimport type { ColumnDef, SortingState } from '@tanstack/react-table'\nimport { DataTable, RowActions, Button } from '@open-mercato/ui'\nimport { ListEmptyState } from '@open-mercato/ui/backend/filters/ListEmptyState'\nimport { readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { buildEntitiesCsv } from '../lib/entitiesCsvExport'\n\ntype EntityRow = {\n entityId: string\n label: string\n source: 'code' | 'custom'\n count: number\n showInSidebar?: boolean\n}\n\ntype EntitiesResponse = { items: EntityRow[] }\n\nfunction buildColumns(t: (key: string, fallback: string) => string): ColumnDef<EntityRow>[] {\n return [\n { accessorKey: 'entityId', header: t('entities.user.table.column.entity', 'Entity'), meta: { priority: 1 }, cell: ({ getValue }) => <span className=\"font-mono\">{String(getValue())}</span> },\n { accessorKey: 'label', header: t('entities.user.table.column.label', 'Label'), meta: { priority: 2 } },\n { accessorKey: 'source', header: t('entities.user.table.column.source', 'Source'), meta: { priority: 3 } },\n { accessorKey: 'count', header: t('entities.user.table.column.fields', 'Fields'), meta: { priority: 4 } },\n { \n accessorKey: 'showInSidebar', \n header: t('entities.user.table.column.inSidebar', 'In Sidebar'), \n meta: { priority: 5 },\n cell: ({ getValue }) => (\n <span className={`px-2 py-1 rounded text-xs ${\n getValue() ? 'bg-status-success-bg text-status-success-text' : 'bg-muted text-muted-foreground'\n }`}>\n {getValue() ? t('common.yes', 'Yes') : t('common.no', 'No')}\n </span>\n )\n },\n ]\n}\n\nexport default function UserEntitiesTable() {\n const t = useT()\n const [sorting, setSorting] = React.useState<SortingState>([{ id: 'entityId', desc: false }])\n const [page, setPage] = React.useState(1)\n const [search, setSearch] = React.useState('')\n const scopeVersion = useOrganizationScopeVersion()\n \n const columns = React.useMemo(() => buildColumns(t), [t])\n\n const { data, isLoading } = useQuery<EntitiesResponse>({\n queryKey: ['custom-entities', scopeVersion],\n queryFn: async () => {\n return readApiResultOrThrow<EntitiesResponse>('/api/entities/entities', undefined, {\n errorMessage: 'Failed to load entities',\n })\n },\n })\n\n const rowsAll = data?.items || []\n // Filter to only show user entities (source: 'custom')\n const userRows = rowsAll.filter(row => row.source === 'custom')\n const rows = React.useMemo(() => {\n if (!search) return userRows\n const q = search.toLowerCase()\n return userRows.filter(r => r.entityId.toLowerCase().includes(q) || r.label.toLowerCase().includes(q))\n }, [userRows, search])\n\n return (\n <DataTable\n title={t('entities.user.table.title', 'User Entities')}\n actions={(\n <>\n <Button variant=\"outline\" onClick={() => {\n const csv = buildEntitiesCsv(rows, { includeSidebar: true })\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = 'entities-user.csv'\n a.click()\n URL.revokeObjectURL(url)\n }}>{t('common.export', 'Export')}</Button>\n <Button asChild>\n <Link href=\"/backend/entities/user/create\">{t('common.create', 'Create')}</Link>\n </Button>\n </>\n )}\n columns={columns}\n data={rows}\n searchValue={search}\n onSearchChange={(v) => { setSearch(v); setPage(1) }}\n sortable\n sorting={sorting}\n onSortingChange={setSorting}\n perspective={{ tableId: extensionPoints.hosts.userEntitiesTable.tableId }}\n emptyState={(\n <ListEmptyState\n entityName={t('entities.user.table.title', 'User Entities')}\n createHref=\"/backend/entities/user/create\"\n createLabel={t('common.create', 'Create')}\n />\n )}\n rowActions={(row) => (\n <RowActions\n items={[\n { id: 'edit', label: t('common.edit', 'Edit'), href: `/backend/entities/user/${encodeURIComponent(row.entityId)}` },\n { id: 'show-records', label: t('entities.user.table.actions.showRecords', 'Show records'), href: `/backend/entities/user/${encodeURIComponent(row.entityId)}/records` },\n ]}\n />\n )}\n pagination={{ page, pageSize: 50, total: rows.length, totalPages: 1, onPageChange: setPage }}\n isLoading={isLoading}\n />\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,80 @@
1
+ import {
2
+ buildRelationHref,
3
+ collectRelationValueIds,
4
+ fetchRelationRecordDisplays,
5
+ parseRelationOptionsMetadata
6
+ } from "@open-mercato/ui/backend/utils/customFieldRelationDisplay";
7
+ function resolveRelationOptionsUrl(definition) {
8
+ if (definition.kind !== "relation") return null;
9
+ const configuredUrl = definition.optionsUrl?.trim();
10
+ if (configuredUrl && parseRelationOptionsMetadata(configuredUrl)) return configuredUrl;
11
+ const relatedEntityId = definition.relatedEntityId?.trim();
12
+ if (!relatedEntityId) return null;
13
+ return `/api/entities/relations/options?entityId=${encodeURIComponent(relatedEntityId)}`;
14
+ }
15
+ function collectRelationLookups(definitions, records) {
16
+ const lookups = /* @__PURE__ */ new Map();
17
+ definitions.forEach((definition) => {
18
+ const optionsUrl = resolveRelationOptionsUrl(definition);
19
+ if (!optionsUrl) return;
20
+ const relation = parseRelationOptionsMetadata(optionsUrl);
21
+ if (!relation) return;
22
+ const recordIds = new Set(
23
+ records.flatMap((record) => collectRelationValueIds(record[definition.key]))
24
+ );
25
+ if (!recordIds.size) return;
26
+ const lookupKey = JSON.stringify([relation.entityId, optionsUrl]);
27
+ const lookup = lookups.get(lookupKey) ?? {
28
+ optionsUrl,
29
+ relation,
30
+ recordIds: /* @__PURE__ */ new Set(),
31
+ recordIdsByField: /* @__PURE__ */ new Map()
32
+ };
33
+ recordIds.forEach((recordId) => lookup.recordIds.add(recordId));
34
+ lookup.recordIdsByField.set(definition.key, recordIds);
35
+ lookups.set(lookupKey, lookup);
36
+ });
37
+ return Array.from(lookups.values());
38
+ }
39
+ async function resolveRecordListRelationDisplays(definitions, records, signal) {
40
+ const displaysByField = {};
41
+ const lookups = collectRelationLookups(definitions, records);
42
+ await Promise.all(lookups.map(async (lookup) => {
43
+ let fetchedDisplays = {};
44
+ try {
45
+ fetchedDisplays = await fetchRelationRecordDisplays(
46
+ lookup.optionsUrl,
47
+ lookup.relation,
48
+ Array.from(lookup.recordIds),
49
+ signal
50
+ );
51
+ } catch {
52
+ fetchedDisplays = {};
53
+ }
54
+ if (signal?.aborted) return;
55
+ lookup.recordIdsByField.forEach((recordIds, fieldKey) => {
56
+ const fieldDisplays = {};
57
+ recordIds.forEach((recordId) => {
58
+ fieldDisplays[recordId] = fetchedDisplays[recordId] ?? {
59
+ label: recordId,
60
+ href: buildRelationHref(lookup.relation.entityId, recordId)
61
+ };
62
+ });
63
+ displaysByField[fieldKey] = fieldDisplays;
64
+ });
65
+ }));
66
+ return displaysByField;
67
+ }
68
+ function getRecordListRelationDisplays(value, displays) {
69
+ return collectRelationValueIds(value).map((recordId) => ({
70
+ id: recordId,
71
+ label: displays?.[recordId]?.label ?? recordId,
72
+ href: displays?.[recordId]?.href
73
+ }));
74
+ }
75
+ export {
76
+ getRecordListRelationDisplays,
77
+ resolveRecordListRelationDisplays,
78
+ resolveRelationOptionsUrl
79
+ };
80
+ //# sourceMappingURL=recordListRelationDisplays.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/entities/components/recordListRelationDisplays.ts"],
4
+ "sourcesContent": ["import type { CustomFieldDefDto } from '@open-mercato/ui/backend/utils/customFieldDefs'\nimport {\n buildRelationHref,\n collectRelationValueIds,\n fetchRelationRecordDisplays,\n parseRelationOptionsMetadata,\n type RelationOptionsMetadata,\n type ResolvedValueDisplay,\n} from '@open-mercato/ui/backend/utils/customFieldRelationDisplay'\n\nexport type RelationDisplaysByField = Record<string, Record<string, ResolvedValueDisplay>>\n\ntype RelationLookup = {\n optionsUrl: string\n relation: RelationOptionsMetadata\n recordIds: Set<string>\n recordIdsByField: Map<string, Set<string>>\n}\n\nexport function resolveRelationOptionsUrl(definition: CustomFieldDefDto): string | null {\n if (definition.kind !== 'relation') return null\n\n const configuredUrl = definition.optionsUrl?.trim()\n if (configuredUrl && parseRelationOptionsMetadata(configuredUrl)) return configuredUrl\n\n const relatedEntityId = definition.relatedEntityId?.trim()\n if (!relatedEntityId) return null\n return `/api/entities/relations/options?entityId=${encodeURIComponent(relatedEntityId)}`\n}\n\nfunction collectRelationLookups(\n definitions: CustomFieldDefDto[],\n records: Array<Record<string, unknown>>,\n): RelationLookup[] {\n const lookups = new Map<string, RelationLookup>()\n\n definitions.forEach((definition) => {\n const optionsUrl = resolveRelationOptionsUrl(definition)\n if (!optionsUrl) return\n const relation = parseRelationOptionsMetadata(optionsUrl)\n if (!relation) return\n\n const recordIds = new Set(\n records.flatMap((record) => collectRelationValueIds(record[definition.key])),\n )\n if (!recordIds.size) return\n\n const lookupKey = JSON.stringify([relation.entityId, optionsUrl])\n const lookup = lookups.get(lookupKey) ?? {\n optionsUrl,\n relation,\n recordIds: new Set<string>(),\n recordIdsByField: new Map<string, Set<string>>(),\n }\n recordIds.forEach((recordId) => lookup.recordIds.add(recordId))\n lookup.recordIdsByField.set(definition.key, recordIds)\n lookups.set(lookupKey, lookup)\n })\n\n return Array.from(lookups.values())\n}\n\nexport async function resolveRecordListRelationDisplays(\n definitions: CustomFieldDefDto[],\n records: Array<Record<string, unknown>>,\n signal?: AbortSignal,\n): Promise<RelationDisplaysByField> {\n const displaysByField: RelationDisplaysByField = {}\n const lookups = collectRelationLookups(definitions, records)\n\n await Promise.all(lookups.map(async (lookup) => {\n let fetchedDisplays: Record<string, ResolvedValueDisplay> = {}\n try {\n fetchedDisplays = await fetchRelationRecordDisplays(\n lookup.optionsUrl,\n lookup.relation,\n Array.from(lookup.recordIds),\n signal,\n )\n } catch {\n fetchedDisplays = {}\n }\n\n if (signal?.aborted) return\n lookup.recordIdsByField.forEach((recordIds, fieldKey) => {\n const fieldDisplays: Record<string, ResolvedValueDisplay> = {}\n recordIds.forEach((recordId) => {\n fieldDisplays[recordId] = fetchedDisplays[recordId] ?? {\n label: recordId,\n href: buildRelationHref(lookup.relation.entityId, recordId),\n }\n })\n displaysByField[fieldKey] = fieldDisplays\n })\n }))\n\n return displaysByField\n}\n\nexport function getRecordListRelationDisplays(\n value: unknown,\n displays: Record<string, ResolvedValueDisplay> | undefined,\n): Array<{ id: string; label: string; href?: string }> {\n return collectRelationValueIds(value).map((recordId) => ({\n id: recordId,\n label: displays?.[recordId]?.label ?? recordId,\n href: displays?.[recordId]?.href,\n }))\n}\n"],
5
+ "mappings": "AACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AAWA,SAAS,0BAA0B,YAA8C;AACtF,MAAI,WAAW,SAAS,WAAY,QAAO;AAE3C,QAAM,gBAAgB,WAAW,YAAY,KAAK;AAClD,MAAI,iBAAiB,6BAA6B,aAAa,EAAG,QAAO;AAEzE,QAAM,kBAAkB,WAAW,iBAAiB,KAAK;AACzD,MAAI,CAAC,gBAAiB,QAAO;AAC7B,SAAO,4CAA4C,mBAAmB,eAAe,CAAC;AACxF;AAEA,SAAS,uBACP,aACA,SACkB;AAClB,QAAM,UAAU,oBAAI,IAA4B;AAEhD,cAAY,QAAQ,CAAC,eAAe;AAClC,UAAM,aAAa,0BAA0B,UAAU;AACvD,QAAI,CAAC,WAAY;AACjB,UAAM,WAAW,6BAA6B,UAAU;AACxD,QAAI,CAAC,SAAU;AAEf,UAAM,YAAY,IAAI;AAAA,MACpB,QAAQ,QAAQ,CAAC,WAAW,wBAAwB,OAAO,WAAW,GAAG,CAAC,CAAC;AAAA,IAC7E;AACA,QAAI,CAAC,UAAU,KAAM;AAErB,UAAM,YAAY,KAAK,UAAU,CAAC,SAAS,UAAU,UAAU,CAAC;AAChE,UAAM,SAAS,QAAQ,IAAI,SAAS,KAAK;AAAA,MACvC;AAAA,MACA;AAAA,MACA,WAAW,oBAAI,IAAY;AAAA,MAC3B,kBAAkB,oBAAI,IAAyB;AAAA,IACjD;AACA,cAAU,QAAQ,CAAC,aAAa,OAAO,UAAU,IAAI,QAAQ,CAAC;AAC9D,WAAO,iBAAiB,IAAI,WAAW,KAAK,SAAS;AACrD,YAAQ,IAAI,WAAW,MAAM;AAAA,EAC/B,CAAC;AAED,SAAO,MAAM,KAAK,QAAQ,OAAO,CAAC;AACpC;AAEA,eAAsB,kCACpB,aACA,SACA,QACkC;AAClC,QAAM,kBAA2C,CAAC;AAClD,QAAM,UAAU,uBAAuB,aAAa,OAAO;AAE3D,QAAM,QAAQ,IAAI,QAAQ,IAAI,OAAO,WAAW;AAC9C,QAAI,kBAAwD,CAAC;AAC7D,QAAI;AACF,wBAAkB,MAAM;AAAA,QACtB,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM,KAAK,OAAO,SAAS;AAAA,QAC3B;AAAA,MACF;AAAA,IACF,QAAQ;AACN,wBAAkB,CAAC;AAAA,IACrB;AAEA,QAAI,QAAQ,QAAS;AACrB,WAAO,iBAAiB,QAAQ,CAAC,WAAW,aAAa;AACvD,YAAM,gBAAsD,CAAC;AAC7D,gBAAU,QAAQ,CAAC,aAAa;AAC9B,sBAAc,QAAQ,IAAI,gBAAgB,QAAQ,KAAK;AAAA,UACrD,OAAO;AAAA,UACP,MAAM,kBAAkB,OAAO,SAAS,UAAU,QAAQ;AAAA,QAC5D;AAAA,MACF,CAAC;AACD,sBAAgB,QAAQ,IAAI;AAAA,IAC9B,CAAC;AAAA,EACH,CAAC,CAAC;AAEF,SAAO;AACT;AAEO,SAAS,8BACd,OACA,UACqD;AACrD,SAAO,wBAAwB,KAAK,EAAE,IAAI,CAAC,cAAc;AAAA,IACvD,IAAI;AAAA,IACJ,OAAO,WAAW,QAAQ,GAAG,SAAS;AAAA,IACtC,MAAM,WAAW,QAAQ,GAAG;AAAA,EAC9B,EAAE;AACJ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,21 @@
1
+ import { dataTableExtensionHost, defineModuleExtensionPoints, injectionExtensionHost } from "@open-mercato/shared/modules/widgets/extension-points";
2
+ const extensionPoints = defineModuleExtensionPoints({
3
+ moduleId: "entities",
4
+ hosts: {
5
+ systemEntitiesTable: dataTableExtensionHost({ tableId: "entities.system.list", source: "components/SystemEntitiesTable.tsx" }),
6
+ userEntitiesTable: dataTableExtensionHost({ tableId: "entities.user.list", source: "components/UserEntitiesTable.tsx" }),
7
+ userRecordsTable: injectionExtensionHost({
8
+ family: "entity",
9
+ pattern: "data-table:entities.user.records.{entityId}",
10
+ parameters: { entityId: { source: "route.params.entityId" } },
11
+ supported: ["render-widget", "headless-widget", "column-widget", "row-action", "bulk-action", "filter-widget"],
12
+ source: "backend/entities/user/[entityId]/records/page.tsx"
13
+ })
14
+ }
15
+ });
16
+ var extension_points_default = extensionPoints;
17
+ export {
18
+ extension_points_default as default,
19
+ extensionPoints
20
+ };
21
+ //# sourceMappingURL=extension-points.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/modules/entities/extension-points.ts"],
4
+ "sourcesContent": ["import { dataTableExtensionHost, defineModuleExtensionPoints, injectionExtensionHost } from '@open-mercato/shared/modules/widgets/extension-points'\n\nexport const extensionPoints = defineModuleExtensionPoints({\n moduleId: 'entities',\n hosts: {\n systemEntitiesTable: dataTableExtensionHost({ tableId: 'entities.system.list', source: 'components/SystemEntitiesTable.tsx' }),\n userEntitiesTable: dataTableExtensionHost({ tableId: 'entities.user.list', source: 'components/UserEntitiesTable.tsx' }),\n userRecordsTable: injectionExtensionHost({\n family: 'entity',\n pattern: 'data-table:entities.user.records.{entityId}',\n parameters: { entityId: { source: 'route.params.entityId' } },\n supported: ['render-widget', 'headless-widget', 'column-widget', 'row-action', 'bulk-action', 'filter-widget'],\n source: 'backend/entities/user/[entityId]/records/page.tsx',\n }),\n },\n})\n\nexport default extensionPoints\n"],
5
+ "mappings": "AAAA,SAAS,wBAAwB,6BAA6B,8BAA8B;AAErF,MAAM,kBAAkB,4BAA4B;AAAA,EACzD,UAAU;AAAA,EACV,OAAO;AAAA,IACL,qBAAqB,uBAAuB,EAAE,SAAS,wBAAwB,QAAQ,qCAAqC,CAAC;AAAA,IAC7H,mBAAmB,uBAAuB,EAAE,SAAS,sBAAsB,QAAQ,mCAAmC,CAAC;AAAA,IACvH,kBAAkB,uBAAuB;AAAA,MACvC,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,YAAY,EAAE,UAAU,EAAE,QAAQ,wBAAwB,EAAE;AAAA,MAC5D,WAAW,CAAC,iBAAiB,mBAAmB,iBAAiB,cAAc,eAAe,eAAe;AAAA,MAC7G,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AACF,CAAC;AAED,IAAO,2BAAQ;",
6
+ "names": []
7
+ }
@@ -1,5 +1,6 @@
1
1
  import { CrudHttpError } from "@open-mercato/shared/lib/crud/errors";
2
- import { hasAllFeatures } from "@open-mercato/shared/security/features";
2
+ import { getModules } from "@open-mercato/shared/lib/i18n/server";
3
+ import { authorizeFeatures } from "@open-mercato/shared/security/featurePolicy";
3
4
  import { deriveCustomEntityRecordFeature } from "./recordFeatures.js";
4
5
  const ENTITY_ACL_REQUIREMENTS = {
5
6
  "directory:tenant": {
@@ -56,9 +57,63 @@ const ENTITY_ACL_REQUIREMENTS = {
56
57
  manage: ["auth.roles.manage"]
57
58
  }
58
59
  };
60
+ let declaredCustomEntityRestrictions = null;
61
+ function loadDeclaredCustomEntityRestrictions() {
62
+ if (declaredCustomEntityRestrictions === null) {
63
+ try {
64
+ const modules = getModules();
65
+ const restrictions = /* @__PURE__ */ new Map();
66
+ for (const moduleEntry of modules ?? []) {
67
+ for (const spec of moduleEntry.customEntities ?? []) {
68
+ if (spec.id) restrictions.set(spec.id, spec.accessRestricted === true);
69
+ }
70
+ }
71
+ declaredCustomEntityRestrictions = restrictions;
72
+ } catch {
73
+ }
74
+ }
75
+ return declaredCustomEntityRestrictions ?? /* @__PURE__ */ new Map();
76
+ }
77
+ function getDeclaredCustomEntityRestriction(entityId) {
78
+ return loadDeclaredCustomEntityRestrictions().get(entityId);
79
+ }
80
+ function isDeclaredCustomEntity(entityId) {
81
+ return loadDeclaredCustomEntityRestrictions().has(entityId);
82
+ }
59
83
  function resolveEntityAclRequirement(entityId) {
60
84
  return ENTITY_ACL_REQUIREMENTS[entityId] ?? null;
61
85
  }
86
+ function canReadAllEntityMetadata(acl) {
87
+ return authorizeFeatures(["entities.definitions.view"], {
88
+ grantedFeatures: acl.features ?? [],
89
+ unrestricted: Boolean(acl.isSuperAdmin)
90
+ });
91
+ }
92
+ function canReadEntityMetadata(args) {
93
+ const requirement = resolveEntityAclRequirement(args.entityId);
94
+ if (requirement?.platformOnly) {
95
+ return Boolean(args.acl.isSuperAdmin) && authorizeFeatures(requirement.view, {
96
+ grantedFeatures: args.acl.features ?? [],
97
+ unrestricted: true
98
+ });
99
+ }
100
+ if (canReadAllEntityMetadata(args.acl)) return true;
101
+ if (args.isCustomEntity) {
102
+ const requiredFeatures = ["entities.records.view"];
103
+ if (args.isRestricted) {
104
+ requiredFeatures.push(deriveCustomEntityRecordFeature(args.entityId, "view"));
105
+ }
106
+ return authorizeFeatures(requiredFeatures, {
107
+ grantedFeatures: args.acl.features ?? [],
108
+ unrestricted: Boolean(args.acl.isSuperAdmin)
109
+ });
110
+ }
111
+ if (!requirement) return Boolean(args.acl.isSuperAdmin);
112
+ return authorizeFeatures(requirement.view, {
113
+ grantedFeatures: args.acl.features ?? [],
114
+ unrestricted: Boolean(args.acl.isSuperAdmin)
115
+ });
116
+ }
62
117
  function forbiddenEntityAccess() {
63
118
  return new CrudHttpError(403, { error: "Forbidden" });
64
119
  }
@@ -71,25 +126,48 @@ async function loadActorAcl(args) {
71
126
  async function assertEntityAclForRequest(args) {
72
127
  if (args.isCustomEntity) {
73
128
  if (!args.isRestricted) return;
74
- const acl2 = await loadActorAcl(args);
75
- if (acl2?.isSuperAdmin) return;
76
129
  const required = deriveCustomEntityRecordFeature(args.entityId, args.action);
77
- if (!hasAllFeatures(acl2?.features, [required])) {
130
+ const allowed2 = await args.rbac.userHasAllFeatures(
131
+ args.auth.sub ?? "",
132
+ [required],
133
+ {
134
+ tenantId: args.auth.tenantId ?? null,
135
+ organizationId: args.auth.orgId ?? null
136
+ }
137
+ );
138
+ if (!allowed2) {
78
139
  throw forbiddenEntityAccess();
79
140
  }
80
141
  return;
81
142
  }
82
143
  const requirement = resolveEntityAclRequirement(args.entityId);
83
- const acl = await loadActorAcl(args);
84
- if (acl?.isSuperAdmin) return;
85
- if (!requirement) throw forbiddenEntityAccess();
86
- if (requirement.platformOnly) throw forbiddenEntityAccess();
87
- if (!hasAllFeatures(acl?.features, requirement[args.action])) {
144
+ if (!requirement) {
145
+ const acl = await loadActorAcl(args);
146
+ if (!acl.isSuperAdmin) throw forbiddenEntityAccess();
147
+ return;
148
+ }
149
+ if (requirement.platformOnly) {
150
+ const acl = await loadActorAcl(args);
151
+ if (!acl.isSuperAdmin) throw forbiddenEntityAccess();
152
+ }
153
+ const allowed = await args.rbac.userHasAllFeatures(
154
+ args.auth.sub ?? "",
155
+ requirement[args.action],
156
+ {
157
+ tenantId: args.auth.tenantId ?? null,
158
+ organizationId: args.auth.orgId ?? null
159
+ }
160
+ );
161
+ if (!allowed) {
88
162
  throw forbiddenEntityAccess();
89
163
  }
90
164
  }
91
165
  export {
92
166
  assertEntityAclForRequest,
167
+ canReadAllEntityMetadata,
168
+ canReadEntityMetadata,
169
+ getDeclaredCustomEntityRestriction,
170
+ isDeclaredCustomEntity,
93
171
  resolveEntityAclRequirement
94
172
  };
95
173
  //# sourceMappingURL=entityAcl.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/entities/lib/entityAcl.ts"],
4
- "sourcesContent": ["import { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport { hasAllFeatures } from '@open-mercato/shared/security/features'\nimport type { RbacService } from '@open-mercato/core/modules/auth/services/rbacService'\nimport { deriveCustomEntityRecordFeature } from './recordFeatures'\n\nexport type EntityAclRequirement = {\n view: string[]\n manage: string[]\n platformOnly?: boolean\n}\n\nconst ENTITY_ACL_REQUIREMENTS: Record<string, EntityAclRequirement> = {\n 'directory:tenant': {\n view: ['directory.tenants.view'],\n manage: ['directory.tenants.manage'],\n platformOnly: true,\n },\n 'directory:organization': {\n view: ['directory.organizations.view'],\n manage: ['directory.organizations.manage'],\n },\n 'customers:customer_person_profile': {\n view: ['customers.people.view'],\n manage: ['customers.people.manage'],\n },\n 'customers:customer_company_profile': {\n view: ['customers.companies.view'],\n manage: ['customers.companies.manage'],\n },\n 'customers:customer_deal': {\n view: ['customers.deals.view'],\n manage: ['customers.deals.manage'],\n },\n 'customers:customer_activity': {\n view: ['customers.activities.view'],\n manage: ['customers.activities.manage'],\n },\n 'customers:customer_interaction': {\n view: ['customers.interactions.view'],\n manage: ['customers.interactions.manage'],\n },\n 'catalog:catalog_product': {\n view: ['catalog.products.view'],\n manage: ['catalog.products.manage'],\n },\n 'catalog:catalog_product_category': {\n view: ['catalog.categories.view'],\n manage: ['catalog.categories.manage'],\n },\n 'sales:sales_order': {\n view: ['sales.orders.view'],\n manage: ['sales.orders.manage'],\n },\n 'sales:sales_quote': {\n view: ['sales.quotes.view'],\n manage: ['sales.quotes.manage'],\n },\n 'auth:user': {\n view: ['auth.users.list'],\n manage: ['auth.users.edit'],\n },\n 'auth:role': {\n view: ['auth.roles.list'],\n manage: ['auth.roles.manage'],\n },\n}\n\nexport function resolveEntityAclRequirement(entityId: string): EntityAclRequirement | null {\n return ENTITY_ACL_REQUIREMENTS[entityId] ?? null\n}\n\ntype EntityAclActor = {\n sub?: string | null\n tenantId?: string | null\n orgId?: string | null\n isSuperAdmin?: boolean\n}\n\ntype AssertEntityAclArgs = {\n auth: EntityAclActor\n entityId: string\n action: 'view' | 'manage'\n isCustomEntity: boolean\n // Set for a custom entity flagged `access_restricted`. When true, the coarse\n // route-level entities.records.* feature is no longer sufficient \u2014 the caller\n // must additionally hold the synthesized per-entity feature.\n isRestricted?: boolean\n rbac: RbacService\n}\n\nfunction forbiddenEntityAccess(): CrudHttpError {\n return new CrudHttpError(403, { error: 'Forbidden' })\n}\n\nasync function loadActorAcl(args: AssertEntityAclArgs) {\n return args.rbac.loadAcl(args.auth.sub ?? '', {\n tenantId: args.auth.tenantId ?? null,\n organizationId: args.auth.orgId ?? null,\n })\n}\n\nexport async function assertEntityAclForRequest(args: AssertEntityAclArgs): Promise<void> {\n if (args.isCustomEntity) {\n // Unrestricted custom entities keep the historical behavior: the coarse\n // entities.records.view/.manage route guard is the whole authorization.\n if (!args.isRestricted) return\n\n const acl = await loadActorAcl(args)\n if (acl?.isSuperAdmin) return\n\n const required = deriveCustomEntityRecordFeature(args.entityId, args.action)\n if (!hasAllFeatures(acl?.features, [required])) {\n throw forbiddenEntityAccess()\n }\n return\n }\n\n const requirement = resolveEntityAclRequirement(args.entityId)\n\n const acl = await loadActorAcl(args)\n\n if (acl?.isSuperAdmin) return\n\n if (!requirement) throw forbiddenEntityAccess()\n if (requirement.platformOnly) throw forbiddenEntityAccess()\n\n if (!hasAllFeatures(acl?.features, requirement[args.action])) {\n throw forbiddenEntityAccess()\n }\n}\n"],
5
- "mappings": "AAAA,SAAS,qBAAqB;AAC9B,SAAS,sBAAsB;AAE/B,SAAS,uCAAuC;AAQhD,MAAM,0BAAgE;AAAA,EACpE,oBAAoB;AAAA,IAClB,MAAM,CAAC,wBAAwB;AAAA,IAC/B,QAAQ,CAAC,0BAA0B;AAAA,IACnC,cAAc;AAAA,EAChB;AAAA,EACA,0BAA0B;AAAA,IACxB,MAAM,CAAC,8BAA8B;AAAA,IACrC,QAAQ,CAAC,gCAAgC;AAAA,EAC3C;AAAA,EACA,qCAAqC;AAAA,IACnC,MAAM,CAAC,uBAAuB;AAAA,IAC9B,QAAQ,CAAC,yBAAyB;AAAA,EACpC;AAAA,EACA,sCAAsC;AAAA,IACpC,MAAM,CAAC,0BAA0B;AAAA,IACjC,QAAQ,CAAC,4BAA4B;AAAA,EACvC;AAAA,EACA,2BAA2B;AAAA,IACzB,MAAM,CAAC,sBAAsB;AAAA,IAC7B,QAAQ,CAAC,wBAAwB;AAAA,EACnC;AAAA,EACA,+BAA+B;AAAA,IAC7B,MAAM,CAAC,2BAA2B;AAAA,IAClC,QAAQ,CAAC,6BAA6B;AAAA,EACxC;AAAA,EACA,kCAAkC;AAAA,IAChC,MAAM,CAAC,6BAA6B;AAAA,IACpC,QAAQ,CAAC,+BAA+B;AAAA,EAC1C;AAAA,EACA,2BAA2B;AAAA,IACzB,MAAM,CAAC,uBAAuB;AAAA,IAC9B,QAAQ,CAAC,yBAAyB;AAAA,EACpC;AAAA,EACA,oCAAoC;AAAA,IAClC,MAAM,CAAC,yBAAyB;AAAA,IAChC,QAAQ,CAAC,2BAA2B;AAAA,EACtC;AAAA,EACA,qBAAqB;AAAA,IACnB,MAAM,CAAC,mBAAmB;AAAA,IAC1B,QAAQ,CAAC,qBAAqB;AAAA,EAChC;AAAA,EACA,qBAAqB;AAAA,IACnB,MAAM,CAAC,mBAAmB;AAAA,IAC1B,QAAQ,CAAC,qBAAqB;AAAA,EAChC;AAAA,EACA,aAAa;AAAA,IACX,MAAM,CAAC,iBAAiB;AAAA,IACxB,QAAQ,CAAC,iBAAiB;AAAA,EAC5B;AAAA,EACA,aAAa;AAAA,IACX,MAAM,CAAC,iBAAiB;AAAA,IACxB,QAAQ,CAAC,mBAAmB;AAAA,EAC9B;AACF;AAEO,SAAS,4BAA4B,UAA+C;AACzF,SAAO,wBAAwB,QAAQ,KAAK;AAC9C;AAqBA,SAAS,wBAAuC;AAC9C,SAAO,IAAI,cAAc,KAAK,EAAE,OAAO,YAAY,CAAC;AACtD;AAEA,eAAe,aAAa,MAA2B;AACrD,SAAO,KAAK,KAAK,QAAQ,KAAK,KAAK,OAAO,IAAI;AAAA,IAC5C,UAAU,KAAK,KAAK,YAAY;AAAA,IAChC,gBAAgB,KAAK,KAAK,SAAS;AAAA,EACrC,CAAC;AACH;AAEA,eAAsB,0BAA0B,MAA0C;AACxF,MAAI,KAAK,gBAAgB;AAGvB,QAAI,CAAC,KAAK,aAAc;AAExB,UAAMA,OAAM,MAAM,aAAa,IAAI;AACnC,QAAIA,MAAK,aAAc;AAEvB,UAAM,WAAW,gCAAgC,KAAK,UAAU,KAAK,MAAM;AAC3E,QAAI,CAAC,eAAeA,MAAK,UAAU,CAAC,QAAQ,CAAC,GAAG;AAC9C,YAAM,sBAAsB;AAAA,IAC9B;AACA;AAAA,EACF;AAEA,QAAM,cAAc,4BAA4B,KAAK,QAAQ;AAE7D,QAAM,MAAM,MAAM,aAAa,IAAI;AAEnC,MAAI,KAAK,aAAc;AAEvB,MAAI,CAAC,YAAa,OAAM,sBAAsB;AAC9C,MAAI,YAAY,aAAc,OAAM,sBAAsB;AAE1D,MAAI,CAAC,eAAe,KAAK,UAAU,YAAY,KAAK,MAAM,CAAC,GAAG;AAC5D,UAAM,sBAAsB;AAAA,EAC9B;AACF;",
6
- "names": ["acl"]
4
+ "sourcesContent": ["import { CrudHttpError } from '@open-mercato/shared/lib/crud/errors'\nimport type { RbacService } from '@open-mercato/core/modules/auth/services/rbacService'\nimport { getModules } from '@open-mercato/shared/lib/i18n/server'\nimport { authorizeFeatures } from '@open-mercato/shared/security/featurePolicy'\nimport { deriveCustomEntityRecordFeature } from './recordFeatures'\n\nexport type EntityAclRequirement = {\n view: string[]\n manage: string[]\n platformOnly?: boolean\n}\n\nconst ENTITY_ACL_REQUIREMENTS: Record<string, EntityAclRequirement> = {\n 'directory:tenant': {\n view: ['directory.tenants.view'],\n manage: ['directory.tenants.manage'],\n platformOnly: true,\n },\n 'directory:organization': {\n view: ['directory.organizations.view'],\n manage: ['directory.organizations.manage'],\n },\n 'customers:customer_person_profile': {\n view: ['customers.people.view'],\n manage: ['customers.people.manage'],\n },\n 'customers:customer_company_profile': {\n view: ['customers.companies.view'],\n manage: ['customers.companies.manage'],\n },\n 'customers:customer_deal': {\n view: ['customers.deals.view'],\n manage: ['customers.deals.manage'],\n },\n 'customers:customer_activity': {\n view: ['customers.activities.view'],\n manage: ['customers.activities.manage'],\n },\n 'customers:customer_interaction': {\n view: ['customers.interactions.view'],\n manage: ['customers.interactions.manage'],\n },\n 'catalog:catalog_product': {\n view: ['catalog.products.view'],\n manage: ['catalog.products.manage'],\n },\n 'catalog:catalog_product_category': {\n view: ['catalog.categories.view'],\n manage: ['catalog.categories.manage'],\n },\n 'sales:sales_order': {\n view: ['sales.orders.view'],\n manage: ['sales.orders.manage'],\n },\n 'sales:sales_quote': {\n view: ['sales.quotes.view'],\n manage: ['sales.quotes.manage'],\n },\n 'auth:user': {\n view: ['auth.users.list'],\n manage: ['auth.users.edit'],\n },\n 'auth:role': {\n view: ['auth.roles.list'],\n manage: ['auth.roles.manage'],\n },\n}\n\nlet declaredCustomEntityRestrictions: Map<string, boolean> | null = null\n\nfunction loadDeclaredCustomEntityRestrictions(): Map<string, boolean> {\n if (declaredCustomEntityRestrictions === null) {\n try {\n const modules = getModules() as Array<{\n customEntities?: Array<{ id?: string; accessRestricted?: boolean }>\n }>\n const restrictions = new Map<string, boolean>()\n for (const moduleEntry of modules ?? []) {\n for (const spec of moduleEntry.customEntities ?? []) {\n if (spec.id) restrictions.set(spec.id, spec.accessRestricted === true)\n }\n }\n declaredCustomEntityRestrictions = restrictions\n } catch {}\n }\n return declaredCustomEntityRestrictions ?? new Map<string, boolean>()\n}\n\nexport function getDeclaredCustomEntityRestriction(entityId: string): boolean | undefined {\n return loadDeclaredCustomEntityRestrictions().get(entityId)\n}\n\nexport function isDeclaredCustomEntity(entityId: string): boolean {\n return loadDeclaredCustomEntityRestrictions().has(entityId)\n}\n\nexport function resolveEntityAclRequirement(entityId: string): EntityAclRequirement | null {\n return ENTITY_ACL_REQUIREMENTS[entityId] ?? null\n}\n\nexport function canReadAllEntityMetadata(acl: {\n isSuperAdmin?: boolean\n features?: readonly string[]\n}): boolean {\n return authorizeFeatures(['entities.definitions.view'], {\n grantedFeatures: acl.features ?? [],\n unrestricted: Boolean(acl.isSuperAdmin),\n })\n}\n\nexport function canReadEntityMetadata(args: {\n entityId: string\n isCustomEntity: boolean\n isRestricted?: boolean\n acl: { isSuperAdmin?: boolean; features?: readonly string[] }\n}): boolean {\n const requirement = resolveEntityAclRequirement(args.entityId)\n if (requirement?.platformOnly) {\n return Boolean(args.acl.isSuperAdmin) && authorizeFeatures(requirement.view, {\n grantedFeatures: args.acl.features ?? [],\n unrestricted: true,\n })\n }\n if (canReadAllEntityMetadata(args.acl)) return true\n if (args.isCustomEntity) {\n const requiredFeatures = ['entities.records.view']\n if (args.isRestricted) {\n requiredFeatures.push(deriveCustomEntityRecordFeature(args.entityId, 'view'))\n }\n return authorizeFeatures(requiredFeatures, {\n grantedFeatures: args.acl.features ?? [],\n unrestricted: Boolean(args.acl.isSuperAdmin),\n })\n }\n if (!requirement) return Boolean(args.acl.isSuperAdmin)\n return authorizeFeatures(requirement.view, {\n grantedFeatures: args.acl.features ?? [],\n unrestricted: Boolean(args.acl.isSuperAdmin),\n })\n}\n\ntype EntityAclActor = {\n sub?: string | null\n tenantId?: string | null\n orgId?: string | null\n isSuperAdmin?: boolean\n}\n\ntype AssertEntityAclArgs = {\n auth: EntityAclActor\n entityId: string\n action: 'view' | 'manage'\n isCustomEntity: boolean\n // Set for a custom entity flagged `access_restricted`. When true, the coarse\n // route-level entities.records.* feature is no longer sufficient \u2014 the caller\n // must additionally hold the synthesized per-entity feature.\n isRestricted?: boolean\n rbac: RbacService\n}\n\nfunction forbiddenEntityAccess(): CrudHttpError {\n return new CrudHttpError(403, { error: 'Forbidden' })\n}\n\nasync function loadActorAcl(args: AssertEntityAclArgs) {\n return args.rbac.loadAcl(args.auth.sub ?? '', {\n tenantId: args.auth.tenantId ?? null,\n organizationId: args.auth.orgId ?? null,\n })\n}\n\nexport async function assertEntityAclForRequest(args: AssertEntityAclArgs): Promise<void> {\n if (args.isCustomEntity) {\n // Unrestricted custom entities keep the historical behavior: the coarse\n // entities.records.view/.manage route guard is the whole authorization.\n if (!args.isRestricted) return\n\n const required = deriveCustomEntityRecordFeature(args.entityId, args.action)\n const allowed = await args.rbac.userHasAllFeatures(\n args.auth.sub ?? '',\n [required],\n {\n tenantId: args.auth.tenantId ?? null,\n organizationId: args.auth.orgId ?? null,\n },\n )\n if (!allowed) {\n throw forbiddenEntityAccess()\n }\n return\n }\n\n const requirement = resolveEntityAclRequirement(args.entityId)\n\n if (!requirement) {\n const acl = await loadActorAcl(args)\n if (!acl.isSuperAdmin) throw forbiddenEntityAccess()\n return\n }\n\n if (requirement.platformOnly) {\n const acl = await loadActorAcl(args)\n if (!acl.isSuperAdmin) throw forbiddenEntityAccess()\n }\n\n const allowed = await args.rbac.userHasAllFeatures(\n args.auth.sub ?? '',\n requirement[args.action],\n {\n tenantId: args.auth.tenantId ?? null,\n organizationId: args.auth.orgId ?? null,\n },\n )\n if (!allowed) {\n throw forbiddenEntityAccess()\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["allowed"]
7
7
  }
@@ -5,9 +5,10 @@ function FeatureGuard({
5
5
  id,
6
6
  children,
7
7
  fallback = null,
8
- loadingFallback = null
8
+ loadingFallback = null,
9
+ defaultValue = false
9
10
  }) {
10
- const { enabled, isLoading } = useFeatureFlagBoolean({ id });
11
+ const { enabled, isLoading } = useFeatureFlagBoolean({ id, defaultValue });
11
12
  if (isLoading) {
12
13
  return /* @__PURE__ */ jsx(Fragment, { children: loadingFallback });
13
14
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/feature_toggles/components/FeatureGuard.tsx"],
4
- "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { useFeatureFlagBoolean } from './hooks/useFeatureFlagBoolean'\n\nexport type FeatureGuardProps = {\n id: string\n children: React.ReactNode\n fallback?: React.ReactNode\n loadingFallback?: React.ReactNode\n}\n\n/**\n * FeatureGuard component that conditionally renders children based on feature toggle state.\n * \n * @param id - The feature toggle identifier\n * @param children - Content to render when the feature is enabled\n * @param fallback - Optional content to render when the feature is disabled\n * @param loadingFallback - Optional content to render while loading the feature state\n */\nexport function FeatureGuard({\n id,\n children,\n fallback = null,\n loadingFallback = null,\n}: FeatureGuardProps) {\n const { enabled, isLoading } = useFeatureFlagBoolean({ id })\n\n if (isLoading) {\n return <>{loadingFallback}</>\n }\n\n if (!enabled) {\n return <>{fallback}</>\n }\n\n return <>{children}</>\n}\n"],
5
- "mappings": ";AA6BW;AA1BX,SAAS,6BAA6B;AAiB/B,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,kBAAkB;AACpB,GAAsB;AACpB,QAAM,EAAE,SAAS,UAAU,IAAI,sBAAsB,EAAE,GAAG,CAAC;AAE3D,MAAI,WAAW;AACb,WAAO,gCAAG,2BAAgB;AAAA,EAC5B;AAEA,MAAI,CAAC,SAAS;AACZ,WAAO,gCAAG,oBAAS;AAAA,EACrB;AAEA,SAAO,gCAAG,UAAS;AACrB;",
4
+ "sourcesContent": ["\"use client\"\n\nimport * as React from 'react'\nimport { useFeatureFlagBoolean } from './hooks/useFeatureFlagBoolean'\n\nexport type FeatureGuardProps = {\n id: string\n children: React.ReactNode\n fallback?: React.ReactNode\n loadingFallback?: React.ReactNode\n defaultValue?: boolean\n}\n\n/**\n * FeatureGuard component that conditionally renders children based on feature toggle state.\n *\n * @param id - The feature toggle identifier\n * @param children - Content to render when the feature is enabled\n * @param fallback - Optional content to render when the feature is disabled\n * @param loadingFallback - Optional content to render while loading the feature state\n * @param defaultValue - Toggle value assumed when the check cannot be resolved\n * (undefined toggle, type mismatch, network or permission failure). Defaults\n * to `false`; pass `true` to keep guarded UI visible when the check fails.\n * Distinct from `fallback`, which is what gets rendered once the feature is\n * known to be disabled.\n */\nexport function FeatureGuard({\n id,\n children,\n fallback = null,\n loadingFallback = null,\n defaultValue = false,\n}: FeatureGuardProps) {\n const { enabled, isLoading } = useFeatureFlagBoolean({ id, defaultValue })\n\n if (isLoading) {\n return <>{loadingFallback}</>\n }\n\n if (!enabled) {\n return <>{fallback}</>\n }\n\n return <>{children}</>\n}\n"],
5
+ "mappings": ";AAoCW;AAjCX,SAAS,6BAA6B;AAuB/B,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,eAAe;AACjB,GAAsB;AACpB,QAAM,EAAE,SAAS,UAAU,IAAI,sBAAsB,EAAE,IAAI,aAAa,CAAC;AAEzE,MAAI,WAAW;AACb,WAAO,gCAAG,2BAAgB;AAAA,EAC5B;AAEA,MAAI,CAAC,SAAS;AACZ,WAAO,gCAAG,oBAAS;AAAA,EACrB;AAEA,SAAO,gCAAG,UAAS;AACrB;",
6
6
  "names": []
7
7
  }
@@ -58,7 +58,7 @@ function FeatureToggleOverrideCard({ toggleId }) {
58
58
  if (error) {
59
59
  return /* @__PURE__ */ jsxs(Card, { children: [
60
60
  /* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsx(CardTitle, { children: t("feature_toggles.override.title", "Override") }) }),
61
- /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsxs(Alert, { variant: "destructive", children: [
61
+ /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsxs(Alert, { status: "error", children: [
62
62
  /* @__PURE__ */ jsx(AlertTitle, { children: t("ui.errors.defaultTitle", "Something went wrong") }),
63
63
  /* @__PURE__ */ jsx(AlertDescription, { children: error.message })
64
64
  ] }) })
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/feature_toggles/components/FeatureToggleOverrideCard.tsx"],
4
- "sourcesContent": ["\"use client\"\nimport { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@open-mercato/ui/primitives/card'\nimport { DataLoader } from \"@open-mercato/ui\";\nimport { Alert, AlertDescription, AlertTitle } from \"@open-mercato/ui/primitives/alert\";\nimport { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { apiCall, withScopedApiRequestHeaders } from \"@open-mercato/ui/backend/utils/apiCall\";\nimport { buildOptimisticLockHeader } from \"@open-mercato/ui/backend/utils/optimisticLock\";\nimport { surfaceRecordConflict } from \"@open-mercato/ui/backend/conflicts\";\nimport { raiseCrudError } from \"@open-mercato/ui/backend/utils/serverErrors\";\nimport { useT } from \"@open-mercato/shared/lib/i18n/context\";\nimport { CrudForm } from \"@open-mercato/ui/backend/CrudForm\";\nimport { createOverrideFieldDefinitions, createOverrideFormGroups } from \"./overrideFormConfig\";\nimport { FeatureToggleOverrideResponse } from \"../data/validators\";\n\n\nexport function FeatureToggleOverrideCard({ toggleId }: { toggleId: string }) {\n const t = useT()\n const queryClient = useQueryClient()\n \n const { data: overrideData, isLoading, error } = useQuery({\n queryKey: ['feature_toggle_override', toggleId],\n queryFn: async () => {\n const call = await apiCall<FeatureToggleOverrideResponse>(`/api/feature_toggles/global/${toggleId}/override`)\n if (!call.ok) {\n await raiseCrudError(call.response, t('feature_toggles.override.error.load', 'Failed to load override'))\n }\n return call.result\n },\n enabled: !!toggleId\n })\n\n const mutation = useMutation({\n mutationFn: async (input: { toggleId: string; isOverride: boolean; overrideValue?: any; tenantId: string }) => {\n const call = await withScopedApiRequestHeaders(\n buildOptimisticLockHeader(overrideData?.updatedAt ?? null),\n () => apiCall<{ ok: boolean }>(\n `/api/feature_toggles/overrides`,\n {\n method: 'PUT',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n toggleId: input.toggleId,\n isOverride: input.isOverride,\n overrideValue: input.overrideValue,\n }),\n },\n ),\n )\n if (!call.ok) {\n await raiseCrudError(call.response, t('feature_toggles.overrides.error.update', 'Failed to update override'))\n }\n return call.result\n },\n onError: (err: unknown) => {\n // Route an optimistic-lock 409 to the unified conflict bar; other errors\n // already surfaced via raiseCrudError inside mutationFn.\n surfaceRecordConflict(err, t)\n },\n onSettled: async () => {\n await queryClient.invalidateQueries({ queryKey: ['feature_toggle_override', toggleId] })\n await queryClient.invalidateQueries({ queryKey: ['feature_toggle_overrides'] })\n },\n })\n\n if (error) {\n return (\n <Card>\n <CardHeader>\n <CardTitle>{t('feature_toggles.override.title', 'Override')}</CardTitle>\n </CardHeader>\n <CardContent>\n <Alert variant=\"destructive\">\n <AlertTitle>{t('ui.errors.defaultTitle', 'Something went wrong')}</AlertTitle>\n <AlertDescription>{error.message}</AlertDescription>\n </Alert>\n </CardContent>\n </Card>\n )\n }\n\n const fieldDefinitions = createOverrideFieldDefinitions(t)\n const formGroups = createOverrideFormGroups(t)\n const initialValues = overrideData ? {\n isOverride: overrideData.id === '' ? false : true,\n overrideValue: overrideData.value,\n toggleType: overrideData.toggleType,\n tenantId: overrideData.tenantId,\n tenantName: overrideData.tenantName,\n } : {}\n\n const handleSubmit = async (values: any) => {\n if (!overrideData) return\n await mutation.mutateAsync({\n toggleId,\n isOverride: values.isOverride,\n overrideValue: values.overrideValue,\n tenantId: overrideData.tenantId\n })\n }\n\n return (\n <Card>\n <CardHeader>\n <CardTitle>{t('feature_toggles.override.title', 'Override')}</CardTitle>\n {overrideData ? (\n <CardDescription>{t('feature_toggles.override.tenant', 'Tenant: {{name}}', { name: overrideData.tenantName })}</CardDescription>\n ) : <CardDescription className=\"h-5 w-48 animate-pulse bg-zinc-100 dark:bg-zinc-800 rounded-md\" />}\n </CardHeader>\n <CardContent>\n <DataLoader\n isLoading={isLoading}\n showSkeleton\n skeletonComponent={\n <div className=\"space-y-4\">\n <div className=\"h-9 w-full animate-pulse rounded-md bg-zinc-100 dark:bg-zinc-800\" />\n <div className=\"h-20 w-full animate-pulse rounded-md bg-zinc-100 dark:bg-zinc-800\" />\n </div>\n }\n >\n {overrideData && (\n <CrudForm\n fields={fieldDefinitions}\n groups={formGroups}\n initialValues={initialValues}\n onSubmit={handleSubmit}\n submitLabel={t('feature_toggles.override.save', 'Save Override')}\n embedded={true}\n isLoading={false}\n />\n )}\n </DataLoader>\n </CardContent>\n </Card>\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["\"use client\"\nimport { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@open-mercato/ui/primitives/card'\nimport { DataLoader } from \"@open-mercato/ui\";\nimport { Alert, AlertDescription, AlertTitle } from \"@open-mercato/ui/primitives/alert\";\nimport { useQuery, useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { apiCall, withScopedApiRequestHeaders } from \"@open-mercato/ui/backend/utils/apiCall\";\nimport { buildOptimisticLockHeader } from \"@open-mercato/ui/backend/utils/optimisticLock\";\nimport { surfaceRecordConflict } from \"@open-mercato/ui/backend/conflicts\";\nimport { raiseCrudError } from \"@open-mercato/ui/backend/utils/serverErrors\";\nimport { useT } from \"@open-mercato/shared/lib/i18n/context\";\nimport { CrudForm } from \"@open-mercato/ui/backend/CrudForm\";\nimport { createOverrideFieldDefinitions, createOverrideFormGroups } from \"./overrideFormConfig\";\nimport { FeatureToggleOverrideResponse } from \"../data/validators\";\n\n\nexport function FeatureToggleOverrideCard({ toggleId }: { toggleId: string }) {\n const t = useT()\n const queryClient = useQueryClient()\n \n const { data: overrideData, isLoading, error } = useQuery({\n queryKey: ['feature_toggle_override', toggleId],\n queryFn: async () => {\n const call = await apiCall<FeatureToggleOverrideResponse>(`/api/feature_toggles/global/${toggleId}/override`)\n if (!call.ok) {\n await raiseCrudError(call.response, t('feature_toggles.override.error.load', 'Failed to load override'))\n }\n return call.result\n },\n enabled: !!toggleId\n })\n\n const mutation = useMutation({\n mutationFn: async (input: { toggleId: string; isOverride: boolean; overrideValue?: any; tenantId: string }) => {\n const call = await withScopedApiRequestHeaders(\n buildOptimisticLockHeader(overrideData?.updatedAt ?? null),\n () => apiCall<{ ok: boolean }>(\n `/api/feature_toggles/overrides`,\n {\n method: 'PUT',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n toggleId: input.toggleId,\n isOverride: input.isOverride,\n overrideValue: input.overrideValue,\n }),\n },\n ),\n )\n if (!call.ok) {\n await raiseCrudError(call.response, t('feature_toggles.overrides.error.update', 'Failed to update override'))\n }\n return call.result\n },\n onError: (err: unknown) => {\n // Route an optimistic-lock 409 to the unified conflict bar; other errors\n // already surfaced via raiseCrudError inside mutationFn.\n surfaceRecordConflict(err, t)\n },\n onSettled: async () => {\n await queryClient.invalidateQueries({ queryKey: ['feature_toggle_override', toggleId] })\n await queryClient.invalidateQueries({ queryKey: ['feature_toggle_overrides'] })\n },\n })\n\n if (error) {\n return (\n <Card>\n <CardHeader>\n <CardTitle>{t('feature_toggles.override.title', 'Override')}</CardTitle>\n </CardHeader>\n <CardContent>\n <Alert status=\"error\">\n <AlertTitle>{t('ui.errors.defaultTitle', 'Something went wrong')}</AlertTitle>\n <AlertDescription>{error.message}</AlertDescription>\n </Alert>\n </CardContent>\n </Card>\n )\n }\n\n const fieldDefinitions = createOverrideFieldDefinitions(t)\n const formGroups = createOverrideFormGroups(t)\n const initialValues = overrideData ? {\n isOverride: overrideData.id === '' ? false : true,\n overrideValue: overrideData.value,\n toggleType: overrideData.toggleType,\n tenantId: overrideData.tenantId,\n tenantName: overrideData.tenantName,\n } : {}\n\n const handleSubmit = async (values: any) => {\n if (!overrideData) return\n await mutation.mutateAsync({\n toggleId,\n isOverride: values.isOverride,\n overrideValue: values.overrideValue,\n tenantId: overrideData.tenantId\n })\n }\n\n return (\n <Card>\n <CardHeader>\n <CardTitle>{t('feature_toggles.override.title', 'Override')}</CardTitle>\n {overrideData ? (\n <CardDescription>{t('feature_toggles.override.tenant', 'Tenant: {{name}}', { name: overrideData.tenantName })}</CardDescription>\n ) : <CardDescription className=\"h-5 w-48 animate-pulse bg-zinc-100 dark:bg-zinc-800 rounded-md\" />}\n </CardHeader>\n <CardContent>\n <DataLoader\n isLoading={isLoading}\n showSkeleton\n skeletonComponent={\n <div className=\"space-y-4\">\n <div className=\"h-9 w-full animate-pulse rounded-md bg-zinc-100 dark:bg-zinc-800\" />\n <div className=\"h-20 w-full animate-pulse rounded-md bg-zinc-100 dark:bg-zinc-800\" />\n </div>\n }\n >\n {overrideData && (\n <CrudForm\n fields={fieldDefinitions}\n groups={formGroups}\n initialValues={initialValues}\n onSubmit={handleSubmit}\n submitLabel={t('feature_toggles.override.save', 'Save Override')}\n embedded={true}\n isLoading={false}\n />\n )}\n </DataLoader>\n </CardContent>\n </Card>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,5 @@
1
+ const FEATURE_FLAG_STALE_TIME_MS = 6e4;
2
+ export {
3
+ FEATURE_FLAG_STALE_TIME_MS
4
+ };
5
+ //# sourceMappingURL=staleTime.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/feature_toggles/components/hooks/staleTime.ts"],
4
+ "sourcesContent": ["// Mirrors the server-side toggle resolution cache TTL in\n// `lib/feature-flag-check.ts`, so several components reading the same toggle\n// share one request instead of refetching a value the server would not have\n// re-resolved anyway.\nexport const FEATURE_FLAG_STALE_TIME_MS = 60_000\n"],
5
+ "mappings": "AAIO,MAAM,6BAA6B;",
6
+ "names": []
7
+ }
@@ -1,7 +1,9 @@
1
1
  "use client";
2
2
  import { useQuery } from "@tanstack/react-query";
3
3
  import { readApiResultOrThrow } from "@open-mercato/ui/backend/utils/apiCall";
4
+ import { FEATURE_FLAG_STALE_TIME_MS } from "./staleTime.js";
4
5
  function useFeatureFlagBoolean(options) {
6
+ const defaultValue = options.defaultValue ?? false;
5
7
  const query = useQuery({
6
8
  queryKey: ["featureToggles", "check", options?.id],
7
9
  queryFn: async () => {
@@ -15,9 +17,10 @@ function useFeatureFlagBoolean(options) {
15
17
  );
16
18
  return result;
17
19
  },
18
- enabled: !!options.id
20
+ enabled: !!options.id,
21
+ staleTime: FEATURE_FLAG_STALE_TIME_MS
19
22
  });
20
- const enabled = query.data?.ok ? query.data.value : false;
23
+ const enabled = query.data?.ok ? query.data.value : defaultValue;
21
24
  const isLoading = query.isLoading;
22
25
  return {
23
26
  enabled,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/modules/feature_toggles/components/hooks/useFeatureFlagBoolean.ts"],
4
- "sourcesContent": ["\"use client\"\n\nimport { useQuery } from '@tanstack/react-query'\nimport { readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\n\nexport type UseFeatureFlagOptions = {\n id: string\n}\n\nexport type UseFeatureFlagResult = {\n enabled: boolean\n isLoading: boolean\n}\n\ntype Result<T> = {\n ok: true\n value: T\n} | {\n ok: false\n error: unknown\n}\n\nexport function useFeatureFlagBoolean(options: UseFeatureFlagOptions): UseFeatureFlagResult {\n const query = useQuery({\n queryKey: ['featureToggles', 'check', options?.id],\n queryFn: async () => {\n const params = new URLSearchParams({\n identifier: options.id,\n })\n\n const result = await readApiResultOrThrow<Result<boolean>>(\n `/api/feature_toggles/check/boolean?${params.toString()}`,\n undefined,\n { errorMessage: 'Failed to check feature flag.' },\n )\n\n return result\n },\n enabled: !!options.id,\n })\n\n const enabled = query.data?.ok ? query.data.value : false\n const isLoading = query.isLoading\n\n return {\n enabled,\n isLoading,\n }\n}\n"],
5
- "mappings": ";AAEA,SAAS,gBAAgB;AACzB,SAAS,4BAA4B;AAmB9B,SAAS,sBAAsB,SAAsD;AAC1F,QAAM,QAAQ,SAAS;AAAA,IACrB,UAAU,CAAC,kBAAkB,SAAS,SAAS,EAAE;AAAA,IACjD,SAAS,YAAY;AACnB,YAAM,SAAS,IAAI,gBAAgB;AAAA,QACjC,YAAY,QAAQ;AAAA,MACtB,CAAC;AAED,YAAM,SAAS,MAAM;AAAA,QACnB,sCAAsC,OAAO,SAAS,CAAC;AAAA,QACvD;AAAA,QACA,EAAE,cAAc,gCAAgC;AAAA,MAClD;AAEA,aAAO;AAAA,IACT;AAAA,IACA,SAAS,CAAC,CAAC,QAAQ;AAAA,EACrB,CAAC;AAED,QAAM,UAAU,MAAM,MAAM,KAAK,MAAM,KAAK,QAAQ;AACpD,QAAM,YAAY,MAAM;AAExB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["\"use client\"\n\nimport { useQuery } from '@tanstack/react-query'\nimport { readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { FEATURE_FLAG_STALE_TIME_MS } from './staleTime'\n\nexport type UseFeatureFlagOptions = {\n id: string\n /**\n * Value used while the check is in flight and whenever the toggle cannot be\n * resolved (undefined toggle, type mismatch, network or permission failure).\n *\n * Defaults to `false` so an unresolved toggle keeps a feature switched off.\n * Pass `true` for toggles that hide existing UI \u2014 there a failed check must\n * not make the feature disappear.\n */\n defaultValue?: boolean\n}\n\nexport type UseFeatureFlagResult = {\n enabled: boolean\n isLoading: boolean\n}\n\ntype Result<T> = {\n ok: true\n value: T\n} | {\n ok: false\n error: unknown\n}\n\nexport function useFeatureFlagBoolean(options: UseFeatureFlagOptions): UseFeatureFlagResult {\n const defaultValue = options.defaultValue ?? false\n const query = useQuery({\n queryKey: ['featureToggles', 'check', options?.id],\n queryFn: async () => {\n const params = new URLSearchParams({\n identifier: options.id,\n })\n\n const result = await readApiResultOrThrow<Result<boolean>>(\n `/api/feature_toggles/check/boolean?${params.toString()}`,\n undefined,\n { errorMessage: 'Failed to check feature flag.' },\n )\n\n return result\n },\n enabled: !!options.id,\n staleTime: FEATURE_FLAG_STALE_TIME_MS,\n })\n\n const enabled = query.data?.ok ? query.data.value : defaultValue\n const isLoading = query.isLoading\n\n return {\n enabled,\n isLoading,\n }\n}\n"],
5
+ "mappings": ";AAEA,SAAS,gBAAgB;AACzB,SAAS,4BAA4B;AACrC,SAAS,kCAAkC;AA4BpC,SAAS,sBAAsB,SAAsD;AAC1F,QAAM,eAAe,QAAQ,gBAAgB;AAC7C,QAAM,QAAQ,SAAS;AAAA,IACrB,UAAU,CAAC,kBAAkB,SAAS,SAAS,EAAE;AAAA,IACjD,SAAS,YAAY;AACnB,YAAM,SAAS,IAAI,gBAAgB;AAAA,QACjC,YAAY,QAAQ;AAAA,MACtB,CAAC;AAED,YAAM,SAAS,MAAM;AAAA,QACnB,sCAAsC,OAAO,SAAS,CAAC;AAAA,QACvD;AAAA,QACA,EAAE,cAAc,gCAAgC;AAAA,MAClD;AAEA,aAAO;AAAA,IACT;AAAA,IACA,SAAS,CAAC,CAAC,QAAQ;AAAA,IACnB,WAAW;AAAA,EACb,CAAC;AAED,QAAM,UAAU,MAAM,MAAM,KAAK,MAAM,KAAK,QAAQ;AACpD,QAAM,YAAY,MAAM;AAExB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,9 @@
1
1
  "use client";
2
2
  import { useQuery } from "@tanstack/react-query";
3
3
  import { readApiResultOrThrow } from "@open-mercato/ui/backend/utils/apiCall";
4
+ import { FEATURE_FLAG_STALE_TIME_MS } from "./staleTime.js";
4
5
  function useFeatureFlagJson(options) {
6
+ const defaultValue = options.defaultValue ?? null;
5
7
  const query = useQuery({
6
8
  queryKey: ["featureToggles", "check", "json", options?.id],
7
9
  queryFn: async () => {
@@ -15,9 +17,10 @@ function useFeatureFlagJson(options) {
15
17
  );
16
18
  return result;
17
19
  },
18
- enabled: !!options.id
20
+ enabled: !!options.id,
21
+ staleTime: FEATURE_FLAG_STALE_TIME_MS
19
22
  });
20
- const value = query.data?.ok ? query.data.value : null;
23
+ const value = query.data?.ok ? query.data.value : defaultValue;
21
24
  const isLoading = query.isLoading;
22
25
  return {
23
26
  value,