@open-mercato/core 0.8.1-develop.7296.1.2111d779db → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2352) hide show
  1. package/.turbo/turbo-build.log +2 -2
  2. package/AGENTS.md +4 -5
  3. package/dist/generated/entities/availability_policy/index.js +41 -0
  4. package/dist/generated/entities/availability_policy/index.js.map +7 -0
  5. package/dist/generated/entities/communication_channel/index.js +3 -1
  6. package/dist/generated/entities/communication_channel/index.js.map +2 -2
  7. package/dist/generated/entities/customer_email_conversation_share/index.js +21 -0
  8. package/dist/generated/entities/customer_email_conversation_share/index.js.map +7 -0
  9. package/dist/generated/entities/customer_group/index.js +33 -0
  10. package/dist/generated/entities/customer_group/index.js.map +7 -0
  11. package/dist/generated/entities/customer_group_membership/index.js +29 -0
  12. package/dist/generated/entities/customer_group_membership/index.js.map +7 -0
  13. package/dist/generated/entities/customer_group_terms/index.js +33 -0
  14. package/dist/generated/entities/customer_group_terms/index.js.map +7 -0
  15. package/dist/generated/entities/customer_interaction/index.js +2 -0
  16. package/dist/generated/entities/customer_interaction/index.js.map +2 -2
  17. package/dist/generated/entities/form/index.js +35 -0
  18. package/dist/generated/entities/form/index.js.map +7 -0
  19. package/dist/generated/entities/form_access_audit/index.js +21 -0
  20. package/dist/generated/entities/form_access_audit/index.js.map +7 -0
  21. package/dist/generated/entities/form_attachment/index.js +29 -0
  22. package/dist/generated/entities/form_attachment/index.js.map +7 -0
  23. package/dist/generated/entities/form_consent_record/index.js +37 -0
  24. package/dist/generated/entities/form_consent_record/index.js.map +7 -0
  25. package/dist/generated/entities/form_distribution/index.js +47 -0
  26. package/dist/generated/entities/form_distribution/index.js.map +7 -0
  27. package/dist/generated/entities/form_invitation/index.js +49 -0
  28. package/dist/generated/entities/form_invitation/index.js.map +7 -0
  29. package/dist/generated/entities/form_submission/index.js +39 -0
  30. package/dist/generated/entities/form_submission/index.js.map +7 -0
  31. package/dist/generated/entities/form_submission_actor/index.js +23 -0
  32. package/dist/generated/entities/form_submission_actor/index.js.map +7 -0
  33. package/dist/generated/entities/form_submission_revision/index.js +29 -0
  34. package/dist/generated/entities/form_submission_revision/index.js.map +7 -0
  35. package/dist/generated/entities/form_version/index.js +37 -0
  36. package/dist/generated/entities/form_version/index.js.map +7 -0
  37. package/dist/generated/entities/forms_encryption_key/index.js +15 -0
  38. package/dist/generated/entities/forms_encryption_key/index.js.map +7 -0
  39. package/dist/generated/entities.ids.generated.js +27 -2
  40. package/dist/generated/entities.ids.generated.js.map +2 -2
  41. package/dist/generated/entity-fields-registry.js +269 -0
  42. package/dist/generated/entity-fields-registry.js.map +2 -2
  43. package/dist/helpers/integration/communicationChannelsFixtures.js +16 -0
  44. package/dist/helpers/integration/communicationChannelsFixtures.js.map +2 -2
  45. package/dist/helpers/integration/customerGroupsFixtures.js +88 -0
  46. package/dist/helpers/integration/customerGroupsFixtures.js.map +7 -0
  47. package/dist/helpers/integration/formsFixtures.js +448 -0
  48. package/dist/helpers/integration/formsFixtures.js.map +7 -0
  49. package/dist/modules/api_docs/api/get/version.js +19 -7
  50. package/dist/modules/api_docs/api/get/version.js.map +2 -2
  51. package/dist/modules/api_keys/api/keys/route.js +74 -169
  52. package/dist/modules/api_keys/api/keys/route.js.map +2 -2
  53. package/dist/modules/api_keys/backend/api-keys/create/page.js +1 -1
  54. package/dist/modules/api_keys/backend/api-keys/create/page.js.map +2 -2
  55. package/dist/modules/api_keys/commands/keys.js +140 -0
  56. package/dist/modules/api_keys/commands/keys.js.map +7 -0
  57. package/dist/modules/api_keys/services/apiKeyService.js +72 -43
  58. package/dist/modules/api_keys/services/apiKeyService.js.map +2 -2
  59. package/dist/modules/attachments/api/file/[id]/route.js +9 -2
  60. package/dist/modules/attachments/api/file/[id]/route.js.map +2 -2
  61. package/dist/modules/attachments/api/image/[id]/[[...slug]]/route.js +6 -2
  62. package/dist/modules/attachments/api/image/[id]/[[...slug]]/route.js.map +2 -2
  63. package/dist/modules/attachments/api/route.js +10 -4
  64. package/dist/modules/attachments/api/route.js.map +2 -2
  65. package/dist/modules/attachments/components/AttachmentLibrary.js +16 -6
  66. package/dist/modules/attachments/components/AttachmentLibrary.js.map +2 -2
  67. package/dist/modules/attachments/lib/access.js +1 -3
  68. package/dist/modules/attachments/lib/access.js.map +2 -2
  69. package/dist/modules/attachments/lib/requestScope.js +13 -4
  70. package/dist/modules/attachments/lib/requestScope.js.map +2 -2
  71. package/dist/modules/audit_logs/api/audit-logs/actions/export/route.js +6 -1
  72. package/dist/modules/audit_logs/api/audit-logs/actions/export/route.js.map +2 -2
  73. package/dist/modules/audit_logs/api/audit-logs/actions/redo/route.js +36 -6
  74. package/dist/modules/audit_logs/api/audit-logs/actions/redo/route.js.map +3 -3
  75. package/dist/modules/audit_logs/api/audit-logs/actions/route.js +6 -1
  76. package/dist/modules/audit_logs/api/audit-logs/actions/route.js.map +2 -2
  77. package/dist/modules/audit_logs/api/audit-logs/actions/undo/route.js +34 -4
  78. package/dist/modules/audit_logs/api/audit-logs/actions/undo/route.js.map +2 -2
  79. package/dist/modules/audit_logs/data/validators.js +1 -0
  80. package/dist/modules/audit_logs/data/validators.js.map +2 -2
  81. package/dist/modules/audit_logs/lib/actorSubject.js +65 -0
  82. package/dist/modules/audit_logs/lib/actorSubject.js.map +7 -0
  83. package/dist/modules/audit_logs/lib/replayAuthorization.js +41 -0
  84. package/dist/modules/audit_logs/lib/replayAuthorization.js.map +7 -0
  85. package/dist/modules/audit_logs/services/actionLogService.js +162 -39
  86. package/dist/modules/audit_logs/services/actionLogService.js.map +3 -3
  87. package/dist/modules/auth/api/features.js +1 -1
  88. package/dist/modules/auth/api/features.js.map +2 -2
  89. package/dist/modules/auth/cli.js +29 -17
  90. package/dist/modules/auth/cli.js.map +2 -2
  91. package/dist/modules/auth/commands/acl.js +25 -36
  92. package/dist/modules/auth/commands/acl.js.map +2 -2
  93. package/dist/modules/auth/commands/interceptors.js +22 -0
  94. package/dist/modules/auth/commands/interceptors.js.map +7 -0
  95. package/dist/modules/auth/commands/roles.js +421 -147
  96. package/dist/modules/auth/commands/roles.js.map +2 -2
  97. package/dist/modules/auth/commands/users.js +543 -69
  98. package/dist/modules/auth/commands/users.js.map +2 -2
  99. package/dist/modules/auth/lib/authorizationStateLocks.js +249 -0
  100. package/dist/modules/auth/lib/authorizationStateLocks.js.map +7 -0
  101. package/dist/modules/auth/lib/commandReplay.js +144 -0
  102. package/dist/modules/auth/lib/commandReplay.js.map +7 -0
  103. package/dist/modules/auth/lib/executionPrincipal.js +32 -25
  104. package/dist/modules/auth/lib/executionPrincipal.js.map +2 -2
  105. package/dist/modules/auth/lib/grantChecks.js +7 -2
  106. package/dist/modules/auth/lib/grantChecks.js.map +2 -2
  107. package/dist/modules/auth/lib/setup-app.js +85 -49
  108. package/dist/modules/auth/lib/setup-app.js.map +2 -2
  109. package/dist/modules/auth/lib/tokenHash.js +13 -1
  110. package/dist/modules/auth/lib/tokenHash.js.map +2 -2
  111. package/dist/modules/auth/services/rbacService.js +386 -5
  112. package/dist/modules/auth/services/rbacService.js.map +3 -3
  113. package/dist/modules/availability/acl.js +16 -0
  114. package/dist/modules/availability/acl.js.map +7 -0
  115. package/dist/modules/availability/api/check/route.js +115 -0
  116. package/dist/modules/availability/api/check/route.js.map +7 -0
  117. package/dist/modules/availability/api/openapi.js +27 -0
  118. package/dist/modules/availability/api/openapi.js.map +7 -0
  119. package/dist/modules/availability/api/policies/resolve-preview/route.js +72 -0
  120. package/dist/modules/availability/api/policies/resolve-preview/route.js.map +7 -0
  121. package/dist/modules/availability/api/policies/route.js +203 -0
  122. package/dist/modules/availability/api/policies/route.js.map +7 -0
  123. package/dist/modules/availability/backend/availability/check/page.js +186 -0
  124. package/dist/modules/availability/backend/availability/check/page.js.map +7 -0
  125. package/dist/modules/availability/backend/availability/check/page.meta.js +16 -0
  126. package/dist/modules/availability/backend/availability/check/page.meta.js.map +7 -0
  127. package/dist/modules/availability/backend/availability/policies/ResolutionPreviewPanel.js +83 -0
  128. package/dist/modules/availability/backend/availability/policies/ResolutionPreviewPanel.js.map +7 -0
  129. package/dist/modules/availability/backend/availability/policies/ScopeFields.js +53 -0
  130. package/dist/modules/availability/backend/availability/policies/ScopeFields.js.map +7 -0
  131. package/dist/modules/availability/backend/availability/policies/StockManagedField.js +32 -0
  132. package/dist/modules/availability/backend/availability/policies/StockManagedField.js.map +7 -0
  133. package/dist/modules/availability/backend/availability/policies/[id]/page.js +168 -0
  134. package/dist/modules/availability/backend/availability/policies/[id]/page.js.map +7 -0
  135. package/dist/modules/availability/backend/availability/policies/[id]/page.meta.js +12 -0
  136. package/dist/modules/availability/backend/availability/policies/[id]/page.meta.js.map +7 -0
  137. package/dist/modules/availability/backend/availability/policies/create/page.js +122 -0
  138. package/dist/modules/availability/backend/availability/policies/create/page.js.map +7 -0
  139. package/dist/modules/availability/backend/availability/policies/create/page.meta.js +12 -0
  140. package/dist/modules/availability/backend/availability/policies/create/page.meta.js.map +7 -0
  141. package/dist/modules/availability/backend/availability/policies/formGroups.js +77 -0
  142. package/dist/modules/availability/backend/availability/policies/formGroups.js.map +7 -0
  143. package/dist/modules/availability/backend/availability/policies/page.js +207 -0
  144. package/dist/modules/availability/backend/availability/policies/page.js.map +7 -0
  145. package/dist/modules/availability/backend/availability/policies/page.meta.js +16 -0
  146. package/dist/modules/availability/backend/availability/policies/page.meta.js.map +7 -0
  147. package/dist/modules/availability/backend/availability/policies/policyPayload.js +28 -0
  148. package/dist/modules/availability/backend/availability/policies/policyPayload.js.map +7 -0
  149. package/dist/modules/availability/commands/policies.js +364 -0
  150. package/dist/modules/availability/commands/policies.js.map +7 -0
  151. package/dist/modules/availability/commands/scope.js +19 -0
  152. package/dist/modules/availability/commands/scope.js.map +7 -0
  153. package/dist/modules/availability/data/entities.js +94 -0
  154. package/dist/modules/availability/data/entities.js.map +7 -0
  155. package/dist/modules/availability/data/validators.js +59 -0
  156. package/dist/modules/availability/data/validators.js.map +7 -0
  157. package/dist/modules/availability/di.js +50 -0
  158. package/dist/modules/availability/di.js.map +7 -0
  159. package/dist/modules/availability/events.js +18 -0
  160. package/dist/modules/availability/events.js.map +7 -0
  161. package/dist/modules/availability/index.js +15 -0
  162. package/dist/modules/availability/index.js.map +7 -0
  163. package/dist/modules/availability/lib/catalogTarget.js +42 -0
  164. package/dist/modules/availability/lib/catalogTarget.js.map +7 -0
  165. package/dist/modules/availability/lib/organizationScope.js +33 -0
  166. package/dist/modules/availability/lib/organizationScope.js.map +7 -0
  167. package/dist/modules/availability/lib/policyResolution.js +150 -0
  168. package/dist/modules/availability/lib/policyResolution.js.map +7 -0
  169. package/dist/modules/availability/lib/tryResolve.js +11 -0
  170. package/dist/modules/availability/lib/tryResolve.js.map +7 -0
  171. package/dist/modules/availability/migrations/Migration20260922095844_availability.js +16 -0
  172. package/dist/modules/availability/migrations/Migration20260922095844_availability.js.map +7 -0
  173. package/dist/modules/availability/migrations/Migration20260930120000_availability.js +20 -0
  174. package/dist/modules/availability/migrations/Migration20260930120000_availability.js.map +7 -0
  175. package/dist/modules/availability/setup.js +12 -0
  176. package/dist/modules/availability/setup.js.map +7 -0
  177. package/dist/modules/catalog/api/categories/bulk-create/route.js +124 -0
  178. package/dist/modules/catalog/api/categories/bulk-create/route.js.map +7 -0
  179. package/dist/modules/catalog/api/categories/route.js +56 -8
  180. package/dist/modules/catalog/api/categories/route.js.map +2 -2
  181. package/dist/modules/catalog/api/products/bulk-create/route.js +124 -0
  182. package/dist/modules/catalog/api/products/bulk-create/route.js.map +7 -0
  183. package/dist/modules/catalog/api/products/route.js +55 -31
  184. package/dist/modules/catalog/api/products/route.js.map +3 -3
  185. package/dist/modules/catalog/backend/catalog/products/[id]/page.js +3 -6
  186. package/dist/modules/catalog/backend/catalog/products/[id]/page.js.map +2 -2
  187. package/dist/modules/catalog/backend/catalog/products/create/page.js +12 -4
  188. package/dist/modules/catalog/backend/catalog/products/create/page.js.map +2 -2
  189. package/dist/modules/catalog/commands/categories.js +1 -0
  190. package/dist/modules/catalog/commands/categories.js.map +2 -2
  191. package/dist/modules/catalog/commands/products.js +5 -2
  192. package/dist/modules/catalog/commands/products.js.map +2 -2
  193. package/dist/modules/catalog/components/PriceKindSettings.js +5 -19
  194. package/dist/modules/catalog/components/PriceKindSettings.js.map +2 -2
  195. package/dist/modules/catalog/components/prices/PriceScopeSelectors.js +2 -2
  196. package/dist/modules/catalog/components/prices/PriceScopeSelectors.js.map +2 -2
  197. package/dist/modules/catalog/components/products/ProductUomSection.js +26 -29
  198. package/dist/modules/catalog/components/products/ProductUomSection.js.map +2 -2
  199. package/dist/modules/catalog/components/products/productForm.js +3 -2
  200. package/dist/modules/catalog/components/products/productForm.js.map +2 -2
  201. package/dist/modules/catalog/data/validators.js +15 -0
  202. package/dist/modules/catalog/data/validators.js.map +2 -2
  203. package/dist/modules/catalog/di.js +3 -2
  204. package/dist/modules/catalog/di.js.map +2 -2
  205. package/dist/modules/catalog/events.js +9 -3
  206. package/dist/modules/catalog/events.js.map +2 -2
  207. package/dist/modules/catalog/lib/bulkCreateCategories.js +237 -0
  208. package/dist/modules/catalog/lib/bulkCreateCategories.js.map +7 -0
  209. package/dist/modules/catalog/lib/bulkCreateCheckpoint.js +82 -0
  210. package/dist/modules/catalog/lib/bulkCreateCheckpoint.js.map +7 -0
  211. package/dist/modules/catalog/lib/bulkCreateMutationGuards.js +39 -0
  212. package/dist/modules/catalog/lib/bulkCreateMutationGuards.js.map +7 -0
  213. package/dist/modules/catalog/lib/bulkCreateProducts.js +241 -0
  214. package/dist/modules/catalog/lib/bulkCreateProducts.js.map +7 -0
  215. package/dist/modules/catalog/lib/bulkDelete.js +10 -11
  216. package/dist/modules/catalog/lib/bulkDelete.js.map +2 -2
  217. package/dist/modules/catalog/lib/catalogQueue.js +14 -0
  218. package/dist/modules/catalog/lib/catalogQueue.js.map +7 -0
  219. package/dist/modules/catalog/lib/currencyOptions.js +25 -0
  220. package/dist/modules/catalog/lib/currencyOptions.js.map +7 -0
  221. package/dist/modules/catalog/lib/productSearch.js +8 -0
  222. package/dist/modules/catalog/lib/productSearch.js.map +7 -0
  223. package/dist/modules/catalog/lib/seeds.js +2 -42
  224. package/dist/modules/catalog/lib/seeds.js.map +2 -2
  225. package/dist/modules/catalog/lib/unitLabels.js +53 -0
  226. package/dist/modules/catalog/lib/unitLabels.js.map +7 -0
  227. package/dist/modules/catalog/migrations/Migration20260914120000.js +29 -0
  228. package/dist/modules/catalog/migrations/Migration20260914120000.js.map +7 -0
  229. package/dist/modules/catalog/migrations/Migration20260914120100.js +28 -0
  230. package/dist/modules/catalog/migrations/Migration20260914120100.js.map +7 -0
  231. package/dist/modules/catalog/workers/catalog-category-bulk-create.js +40 -0
  232. package/dist/modules/catalog/workers/catalog-category-bulk-create.js.map +7 -0
  233. package/dist/modules/catalog/workers/catalog-product-bulk-create.js +40 -0
  234. package/dist/modules/catalog/workers/catalog-product-bulk-create.js.map +7 -0
  235. package/dist/modules/communication_channels/acl.js +8 -0
  236. package/dist/modules/communication_channels/acl.js.map +2 -2
  237. package/dist/modules/communication_channels/api/get/me/channels/route.js +4 -0
  238. package/dist/modules/communication_channels/api/get/me/channels/route.js.map +2 -2
  239. package/dist/modules/communication_channels/api/get/oauth/[provider]/callback/route.js +22 -0
  240. package/dist/modules/communication_channels/api/get/oauth/[provider]/callback/route.js.map +2 -2
  241. package/dist/modules/communication_channels/api/post/channels/[id]/import-history/route.js +4 -4
  242. package/dist/modules/communication_channels/api/post/channels/[id]/import-history/route.js.map +2 -2
  243. package/dist/modules/communication_channels/api/post/channels/[id]/test-send/route.js +2 -1
  244. package/dist/modules/communication_channels/api/post/channels/[id]/test-send/route.js.map +2 -2
  245. package/dist/modules/communication_channels/api/post/test-seed/route.js +90 -20
  246. package/dist/modules/communication_channels/api/post/test-seed/route.js.map +3 -3
  247. package/dist/modules/communication_channels/api/put/channels/[id]/visibility/route.js +137 -0
  248. package/dist/modules/communication_channels/api/put/channels/[id]/visibility/route.js.map +7 -0
  249. package/dist/modules/communication_channels/backend/profile/communication-channels/page.js +175 -107
  250. package/dist/modules/communication_channels/backend/profile/communication-channels/page.js.map +2 -2
  251. package/dist/modules/communication_channels/commands/ingest-inbound-message.js +2 -1
  252. package/dist/modules/communication_channels/commands/ingest-inbound-message.js.map +2 -2
  253. package/dist/modules/communication_channels/commands/set-channel-visibility.js +88 -0
  254. package/dist/modules/communication_channels/commands/set-channel-visibility.js.map +7 -0
  255. package/dist/modules/communication_channels/data/enrichers.js +18 -9
  256. package/dist/modules/communication_channels/data/enrichers.js.map +2 -2
  257. package/dist/modules/communication_channels/data/entities.js +4 -0
  258. package/dist/modules/communication_channels/data/entities.js.map +2 -2
  259. package/dist/modules/communication_channels/di.js +9 -1
  260. package/dist/modules/communication_channels/di.js.map +2 -2
  261. package/dist/modules/communication_channels/events.js +7 -0
  262. package/dist/modules/communication_channels/events.js.map +2 -2
  263. package/dist/modules/communication_channels/index.js +1 -1
  264. package/dist/modules/communication_channels/index.js.map +1 -1
  265. package/dist/modules/communication_channels/lib/access-control.js +2 -1
  266. package/dist/modules/communication_channels/lib/access-control.js.map +2 -2
  267. package/dist/modules/communication_channels/lib/channel-thread-access.js +60 -0
  268. package/dist/modules/communication_channels/lib/channel-thread-access.js.map +7 -0
  269. package/dist/modules/communication_channels/lib/credential-refresh.js +11 -2
  270. package/dist/modules/communication_channels/lib/credential-refresh.js.map +2 -2
  271. package/dist/modules/communication_channels/lib/inbound-message-origin.js +18 -0
  272. package/dist/modules/communication_channels/lib/inbound-message-origin.js.map +7 -0
  273. package/dist/modules/communication_channels/lib/oauth-state.js +37 -0
  274. package/dist/modules/communication_channels/lib/oauth-state.js.map +2 -2
  275. package/dist/modules/communication_channels/lib/outbound-delivery-intent.js +12 -0
  276. package/dist/modules/communication_channels/lib/outbound-delivery-intent.js.map +7 -0
  277. package/dist/modules/communication_channels/lib/send-as-user.js +1 -1
  278. package/dist/modules/communication_channels/lib/send-as-user.js.map +2 -2
  279. package/dist/modules/communication_channels/migrations/Migration20260825141000_communication_channels.js +14 -0
  280. package/dist/modules/communication_channels/migrations/Migration20260825141000_communication_channels.js.map +7 -0
  281. package/dist/modules/communication_channels/setup.js +6 -2
  282. package/dist/modules/communication_channels/setup.js.map +2 -2
  283. package/dist/modules/communication_channels/subscribers/outbound-bridge.js +8 -2
  284. package/dist/modules/communication_channels/subscribers/outbound-bridge.js.map +2 -2
  285. package/dist/modules/communication_channels/workers/gmail-history-sync.js +1 -1
  286. package/dist/modules/communication_channels/workers/gmail-history-sync.js.map +2 -2
  287. package/dist/modules/communication_channels/workers/poll-channel.js +1 -1
  288. package/dist/modules/communication_channels/workers/poll-channel.js.map +2 -2
  289. package/dist/modules/communication_channels/workers/reaction-processor.js +2 -2
  290. package/dist/modules/communication_channels/workers/reaction-processor.js.map +2 -2
  291. package/dist/modules/configs/api/upgrade-actions/route.js +2 -1
  292. package/dist/modules/configs/api/upgrade-actions/route.js.map +2 -2
  293. package/dist/modules/configs/cli.js +2 -2
  294. package/dist/modules/configs/cli.js.map +2 -2
  295. package/dist/modules/configs/lib/upgrade-actions.js +28 -6
  296. package/dist/modules/configs/lib/upgrade-actions.js.map +2 -2
  297. package/dist/modules/configs/services/upgradeActionsService.js +44 -30
  298. package/dist/modules/configs/services/upgradeActionsService.js.map +2 -2
  299. package/dist/modules/currencies/api/currencies/route.js +11 -5
  300. package/dist/modules/currencies/api/currencies/route.js.map +2 -2
  301. package/dist/modules/currencies/api/exchange-rates/route.js +11 -5
  302. package/dist/modules/currencies/api/exchange-rates/route.js.map +2 -2
  303. package/dist/modules/customer_accounts/api/admin/users/[id]/sessions/[sessionId].js +78 -0
  304. package/dist/modules/customer_accounts/api/admin/users/[id]/sessions/[sessionId].js.map +7 -0
  305. package/dist/modules/customer_groups/acl.js +14 -0
  306. package/dist/modules/customer_groups/acl.js.map +7 -0
  307. package/dist/modules/customer_groups/api/customer-groups/[id]/terms/route.js +266 -0
  308. package/dist/modules/customer_groups/api/customer-groups/[id]/terms/route.js.map +7 -0
  309. package/dist/modules/customer_groups/api/customer-groups/crud.js +473 -0
  310. package/dist/modules/customer_groups/api/customer-groups/crud.js.map +7 -0
  311. package/dist/modules/customer_groups/api/customer-groups/explain-terms/route.js +143 -0
  312. package/dist/modules/customer_groups/api/customer-groups/explain-terms/route.js.map +7 -0
  313. package/dist/modules/customer_groups/api/customer-groups/memberships/crud.js +383 -0
  314. package/dist/modules/customer_groups/api/customer-groups/memberships/crud.js.map +7 -0
  315. package/dist/modules/customer_groups/api/customer-groups/memberships/route.js +66 -0
  316. package/dist/modules/customer_groups/api/customer-groups/memberships/route.js.map +7 -0
  317. package/dist/modules/customer_groups/api/customer-groups/price-kinds/route.js +90 -0
  318. package/dist/modules/customer_groups/api/customer-groups/price-kinds/route.js.map +7 -0
  319. package/dist/modules/customer_groups/api/customer-groups/reconcile/adopt/route.js +133 -0
  320. package/dist/modules/customer_groups/api/customer-groups/reconcile/adopt/route.js.map +7 -0
  321. package/dist/modules/customer_groups/api/customer-groups/reconcile/route.js +80 -0
  322. package/dist/modules/customer_groups/api/customer-groups/reconcile/route.js.map +7 -0
  323. package/dist/modules/customer_groups/api/customer-groups/reorder/route.js +127 -0
  324. package/dist/modules/customer_groups/api/customer-groups/reorder/route.js.map +7 -0
  325. package/dist/modules/customer_groups/api/customer-groups/route.js +62 -0
  326. package/dist/modules/customer_groups/api/customer-groups/route.js.map +7 -0
  327. package/dist/modules/customer_groups/api/openapi.js +27 -0
  328. package/dist/modules/customer_groups/api/openapi.js.map +7 -0
  329. package/dist/modules/customer_groups/backend/customer-groups/[id]/edit/page.js +328 -0
  330. package/dist/modules/customer_groups/backend/customer-groups/[id]/edit/page.js.map +7 -0
  331. package/dist/modules/customer_groups/backend/customer-groups/[id]/edit/page.meta.js +16 -0
  332. package/dist/modules/customer_groups/backend/customer-groups/[id]/edit/page.meta.js.map +7 -0
  333. package/dist/modules/customer_groups/backend/customer-groups/create/page.js +249 -0
  334. package/dist/modules/customer_groups/backend/customer-groups/create/page.js.map +7 -0
  335. package/dist/modules/customer_groups/backend/customer-groups/create/page.meta.js +27 -0
  336. package/dist/modules/customer_groups/backend/customer-groups/create/page.meta.js.map +7 -0
  337. package/dist/modules/customer_groups/backend/customer-groups/orphans/page.js +139 -0
  338. package/dist/modules/customer_groups/backend/customer-groups/orphans/page.js.map +7 -0
  339. package/dist/modules/customer_groups/backend/customer-groups/orphans/page.meta.js +16 -0
  340. package/dist/modules/customer_groups/backend/customer-groups/orphans/page.meta.js.map +7 -0
  341. package/dist/modules/customer_groups/backend/customer-groups/page.js +368 -0
  342. package/dist/modules/customer_groups/backend/customer-groups/page.js.map +7 -0
  343. package/dist/modules/customer_groups/backend/customer-groups/page.meta.js +15 -0
  344. package/dist/modules/customer_groups/backend/customer-groups/page.meta.js.map +7 -0
  345. package/dist/modules/customer_groups/cli.js +72 -0
  346. package/dist/modules/customer_groups/cli.js.map +7 -0
  347. package/dist/modules/customer_groups/commands/reorderGroups.js +96 -0
  348. package/dist/modules/customer_groups/commands/reorderGroups.js.map +7 -0
  349. package/dist/modules/customer_groups/components/CustomerGroupDefaultField.js +41 -0
  350. package/dist/modules/customer_groups/components/CustomerGroupDefaultField.js.map +7 -0
  351. package/dist/modules/customer_groups/components/CustomerGroupParentField.js +156 -0
  352. package/dist/modules/customer_groups/components/CustomerGroupParentField.js.map +7 -0
  353. package/dist/modules/customer_groups/components/CustomerGroupTermsPriceKindField.js +94 -0
  354. package/dist/modules/customer_groups/components/CustomerGroupTermsPriceKindField.js.map +7 -0
  355. package/dist/modules/customer_groups/components/CustomerGroupTermsSection.js +199 -0
  356. package/dist/modules/customer_groups/components/CustomerGroupTermsSection.js.map +7 -0
  357. package/dist/modules/customer_groups/components/GroupPickerField.js +116 -0
  358. package/dist/modules/customer_groups/components/GroupPickerField.js.map +7 -0
  359. package/dist/modules/customer_groups/components/OrphanBanner.js +75 -0
  360. package/dist/modules/customer_groups/components/OrphanBanner.js.map +7 -0
  361. package/dist/modules/customer_groups/components/customerGroupTree.js +57 -0
  362. package/dist/modules/customer_groups/components/customerGroupTree.js.map +7 -0
  363. package/dist/modules/customer_groups/data/entities.js +226 -0
  364. package/dist/modules/customer_groups/data/entities.js.map +7 -0
  365. package/dist/modules/customer_groups/data/validators.js +153 -0
  366. package/dist/modules/customer_groups/data/validators.js.map +7 -0
  367. package/dist/modules/customer_groups/di.js +20 -0
  368. package/dist/modules/customer_groups/di.js.map +7 -0
  369. package/dist/modules/customer_groups/events.js +22 -0
  370. package/dist/modules/customer_groups/events.js.map +7 -0
  371. package/dist/modules/customer_groups/index.js +15 -0
  372. package/dist/modules/customer_groups/index.js.map +7 -0
  373. package/dist/modules/customer_groups/lib/createConflictRecheck.js +29 -0
  374. package/dist/modules/customer_groups/lib/createConflictRecheck.js.map +7 -0
  375. package/dist/modules/customer_groups/lib/customerScope.js +81 -0
  376. package/dist/modules/customer_groups/lib/customerScope.js.map +7 -0
  377. package/dist/modules/customer_groups/lib/groupEvents.js +31 -0
  378. package/dist/modules/customer_groups/lib/groupEvents.js.map +7 -0
  379. package/dist/modules/customer_groups/lib/priceKindScope.js +50 -0
  380. package/dist/modules/customer_groups/lib/priceKindScope.js.map +7 -0
  381. package/dist/modules/customer_groups/lib/reconcile.js +161 -0
  382. package/dist/modules/customer_groups/lib/reconcile.js.map +7 -0
  383. package/dist/modules/customer_groups/migrations/Migration20260922095316_customer_groups.js +27 -0
  384. package/dist/modules/customer_groups/migrations/Migration20260922095316_customer_groups.js.map +7 -0
  385. package/dist/modules/customer_groups/migrations/Migration20260922103033_customer_groups.js +19 -0
  386. package/dist/modules/customer_groups/migrations/Migration20260922103033_customer_groups.js.map +7 -0
  387. package/dist/modules/customer_groups/migrations/Migration20260922105444_customer_groups.js +19 -0
  388. package/dist/modules/customer_groups/migrations/Migration20260922105444_customer_groups.js.map +7 -0
  389. package/dist/modules/customer_groups/migrations/Migration20260923193330_customer_groups.js +19 -0
  390. package/dist/modules/customer_groups/migrations/Migration20260923193330_customer_groups.js.map +7 -0
  391. package/dist/modules/customer_groups/migrations/Migration20260929083000_customer_groups.js +20 -0
  392. package/dist/modules/customer_groups/migrations/Migration20260929083000_customer_groups.js.map +7 -0
  393. package/dist/modules/customer_groups/services/customerGroupsService.js +190 -0
  394. package/dist/modules/customer_groups/services/customerGroupsService.js.map +7 -0
  395. package/dist/modules/customer_groups/setup.js +13 -0
  396. package/dist/modules/customer_groups/setup.js.map +7 -0
  397. package/dist/modules/customer_groups/widgets/injection/group-picker-field/widget.js +31 -0
  398. package/dist/modules/customer_groups/widgets/injection/group-picker-field/widget.js.map +7 -0
  399. package/dist/modules/customer_groups/widgets/injection/person-groups-explain-terms.js +166 -0
  400. package/dist/modules/customer_groups/widgets/injection/person-groups-explain-terms.js.map +7 -0
  401. package/dist/modules/customer_groups/widgets/injection/person-groups-tab/widget.js +17 -0
  402. package/dist/modules/customer_groups/widgets/injection/person-groups-tab/widget.js.map +7 -0
  403. package/dist/modules/customer_groups/widgets/injection/person-groups-tab.js +457 -0
  404. package/dist/modules/customer_groups/widgets/injection/person-groups-tab.js.map +7 -0
  405. package/dist/modules/customer_groups/widgets/injection-table.js +33 -0
  406. package/dist/modules/customer_groups/widgets/injection-table.js.map +7 -0
  407. package/dist/modules/customers/acl.js +13 -0
  408. package/dist/modules/customers/acl.js.map +2 -2
  409. package/dist/modules/customers/api/activities/route.js +9 -1
  410. package/dist/modules/customers/api/activities/route.js.map +2 -2
  411. package/dist/modules/customers/api/companies/[id]/people/route.js +2 -1
  412. package/dist/modules/customers/api/companies/[id]/people/route.js.map +2 -2
  413. package/dist/modules/customers/api/companies/[id]/route.js +19 -7
  414. package/dist/modules/customers/api/companies/[id]/route.js.map +2 -2
  415. package/dist/modules/customers/api/deals/[id]/companies/route.js +2 -1
  416. package/dist/modules/customers/api/deals/[id]/companies/route.js.map +2 -2
  417. package/dist/modules/customers/api/deals/[id]/people/route.js +2 -1
  418. package/dist/modules/customers/api/deals/[id]/people/route.js.map +2 -2
  419. package/dist/modules/customers/api/deals/map/route.js +7 -2
  420. package/dist/modules/customers/api/deals/map/route.js.map +2 -2
  421. package/dist/modules/customers/api/dictionaries/context.js +2 -1
  422. package/dist/modules/customers/api/dictionaries/context.js.map +2 -2
  423. package/dist/modules/customers/api/entity-roles-factory.js +3 -2
  424. package/dist/modules/customers/api/entity-roles-factory.js.map +2 -2
  425. package/dist/modules/customers/api/interactions/[id]/visibility/route.js +2 -1
  426. package/dist/modules/customers/api/interactions/[id]/visibility/route.js.map +2 -2
  427. package/dist/modules/customers/api/interactions/cancel/route.js +2 -1
  428. package/dist/modules/customers/api/interactions/cancel/route.js.map +2 -2
  429. package/dist/modules/customers/api/interactions/complete/route.js +2 -1
  430. package/dist/modules/customers/api/interactions/complete/route.js.map +2 -2
  431. package/dist/modules/customers/api/interactions/conflicts/route.js +10 -6
  432. package/dist/modules/customers/api/interactions/conflicts/route.js.map +2 -2
  433. package/dist/modules/customers/api/interactions/counts/route.js +24 -4
  434. package/dist/modules/customers/api/interactions/counts/route.js.map +2 -2
  435. package/dist/modules/customers/api/interactions/route.js +31 -8
  436. package/dist/modules/customers/api/interactions/route.js.map +2 -2
  437. package/dist/modules/customers/api/labels/assign/route.js +2 -1
  438. package/dist/modules/customers/api/labels/assign/route.js.map +2 -2
  439. package/dist/modules/customers/api/labels/route.js +3 -2
  440. package/dist/modules/customers/api/labels/route.js.map +2 -2
  441. package/dist/modules/customers/api/labels/unassign/route.js +2 -1
  442. package/dist/modules/customers/api/labels/unassign/route.js.map +2 -2
  443. package/dist/modules/customers/api/people/[id]/companies/context.js +7 -2
  444. package/dist/modules/customers/api/people/[id]/companies/context.js.map +2 -2
  445. package/dist/modules/customers/api/people/[id]/email-share/route.js +218 -0
  446. package/dist/modules/customers/api/people/[id]/email-share/route.js.map +7 -0
  447. package/dist/modules/customers/api/people/[id]/email-threads/route.js +11 -2
  448. package/dist/modules/customers/api/people/[id]/email-threads/route.js.map +2 -2
  449. package/dist/modules/customers/api/people/[id]/emails/route.js +2 -1
  450. package/dist/modules/customers/api/people/[id]/emails/route.js.map +2 -2
  451. package/dist/modules/customers/api/people/[id]/route.js +20 -19
  452. package/dist/modules/customers/api/people/[id]/route.js.map +2 -2
  453. package/dist/modules/customers/api/people/check-phone/route.js +2 -1
  454. package/dist/modules/customers/api/people/check-phone/route.js.map +2 -2
  455. package/dist/modules/customers/api/pipeline-stages/reorder/route.js +3 -2
  456. package/dist/modules/customers/api/pipeline-stages/reorder/route.js.map +2 -2
  457. package/dist/modules/customers/api/pipeline-stages/route.js +3 -3
  458. package/dist/modules/customers/api/pipeline-stages/route.js.map +2 -2
  459. package/dist/modules/customers/api/pipelines/route.js +3 -3
  460. package/dist/modules/customers/api/pipelines/route.js.map +2 -2
  461. package/dist/modules/customers/api/settings/address-format/route.js +2 -1
  462. package/dist/modules/customers/api/settings/address-format/route.js.map +2 -2
  463. package/dist/modules/customers/api/settings/dictionary-sort-modes/route.js +2 -1
  464. package/dist/modules/customers/api/settings/dictionary-sort-modes/route.js.map +2 -2
  465. package/dist/modules/customers/api/settings/stuck-threshold/route.js +2 -1
  466. package/dist/modules/customers/api/settings/stuck-threshold/route.js.map +2 -2
  467. package/dist/modules/customers/api/tags/assign/route.js +2 -1
  468. package/dist/modules/customers/api/tags/assign/route.js.map +2 -2
  469. package/dist/modules/customers/api/tags/unassign/route.js +2 -1
  470. package/dist/modules/customers/api/tags/unassign/route.js.map +2 -2
  471. package/dist/modules/customers/backend/customers/companies/[id]/page.js +4 -2
  472. package/dist/modules/customers/backend/customers/companies/[id]/page.js.map +2 -2
  473. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealAssociations.js +6 -2
  474. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealAssociations.js.map +2 -2
  475. package/dist/modules/customers/backend/customers/deals/[id]/page.js +6 -1
  476. package/dist/modules/customers/backend/customers/deals/[id]/page.js.map +2 -2
  477. package/dist/modules/customers/backend/customers/deals/components/ReassignOwnerDialog.js +93 -0
  478. package/dist/modules/customers/backend/customers/deals/components/ReassignOwnerDialog.js.map +7 -0
  479. package/dist/modules/customers/backend/customers/deals/page.js +111 -1
  480. package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
  481. package/dist/modules/customers/backend/customers/people/[id]/page.js +4 -2
  482. package/dist/modules/customers/backend/customers/people/[id]/page.js.map +2 -2
  483. package/dist/modules/customers/commands/addresses.js +83 -15
  484. package/dist/modules/customers/commands/addresses.js.map +2 -2
  485. package/dist/modules/customers/commands/companies.js +24 -5
  486. package/dist/modules/customers/commands/companies.js.map +2 -2
  487. package/dist/modules/customers/commands/emailConversationShares.js +177 -0
  488. package/dist/modules/customers/commands/emailConversationShares.js.map +7 -0
  489. package/dist/modules/customers/commands/index.js +1 -0
  490. package/dist/modules/customers/commands/index.js.map +2 -2
  491. package/dist/modules/customers/commands/interactions.js +48 -23
  492. package/dist/modules/customers/commands/interactions.js.map +3 -3
  493. package/dist/modules/customers/commands/people.js +3 -2
  494. package/dist/modules/customers/commands/people.js.map +2 -2
  495. package/dist/modules/customers/commands/shared.js +4 -0
  496. package/dist/modules/customers/commands/shared.js.map +2 -2
  497. package/dist/modules/customers/components/calendar/types.js.map +1 -1
  498. package/dist/modules/customers/components/detail/CompanyPeopleSection.js +3 -11
  499. package/dist/modules/customers/components/detail/CompanyPeopleSection.js.map +2 -2
  500. package/dist/modules/customers/components/detail/DealForm.js +66 -2
  501. package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
  502. package/dist/modules/customers/components/detail/DealOwnerSelect.js +96 -0
  503. package/dist/modules/customers/components/detail/DealOwnerSelect.js.map +7 -0
  504. package/dist/modules/customers/components/detail/DealsSection.js +8 -14
  505. package/dist/modules/customers/components/detail/DealsSection.js.map +2 -2
  506. package/dist/modules/customers/components/detail/PersonEmailShareControl.js +190 -0
  507. package/dist/modules/customers/components/detail/PersonEmailShareControl.js.map +7 -0
  508. package/dist/modules/customers/components/detail/PersonEmailThreadsTab.js +17 -0
  509. package/dist/modules/customers/components/detail/PersonEmailThreadsTab.js.map +2 -2
  510. package/dist/modules/customers/components/detail/ScheduleActivityDialog.js +5 -2
  511. package/dist/modules/customers/components/detail/ScheduleActivityDialog.js.map +2 -2
  512. package/dist/modules/customers/components/detail/create/CreateDealForm.js +19 -0
  513. package/dist/modules/customers/components/detail/create/CreateDealForm.js.map +2 -2
  514. package/dist/modules/customers/components/detail/create/DealDetailsFields.js +11 -0
  515. package/dist/modules/customers/components/detail/create/DealDetailsFields.js.map +2 -2
  516. package/dist/modules/customers/components/detail/create/DealSectionCard.js +2 -2
  517. package/dist/modules/customers/components/detail/create/DealSectionCard.js.map +2 -2
  518. package/dist/modules/customers/components/detail/create/dealFormTypes.js +1 -0
  519. package/dist/modules/customers/components/detail/create/dealFormTypes.js.map +2 -2
  520. package/dist/modules/customers/components/detail/schedule/useScheduleFormState.js +1 -1
  521. package/dist/modules/customers/components/detail/schedule/useScheduleFormState.js.map +2 -2
  522. package/dist/modules/customers/components/formConfig.js +2 -0
  523. package/dist/modules/customers/components/formConfig.js.map +2 -2
  524. package/dist/modules/customers/components/linking/LinkEntityDialog.js +8 -0
  525. package/dist/modules/customers/components/linking/LinkEntityDialog.js.map +2 -2
  526. package/dist/modules/customers/data/enrichers.js +40 -2
  527. package/dist/modules/customers/data/enrichers.js.map +2 -2
  528. package/dist/modules/customers/data/entities.js +56 -0
  529. package/dist/modules/customers/data/entities.js.map +2 -2
  530. package/dist/modules/customers/data/validators.js +11 -0
  531. package/dist/modules/customers/data/validators.js.map +2 -2
  532. package/dist/modules/customers/events.js +6 -1
  533. package/dist/modules/customers/events.js.map +2 -2
  534. package/dist/modules/customers/lib/assignableStaff.js +14 -0
  535. package/dist/modules/customers/lib/assignableStaff.js.map +2 -2
  536. package/dist/modules/customers/lib/calendar/editorPayload.js +17 -13
  537. package/dist/modules/customers/lib/calendar/editorPayload.js.map +2 -2
  538. package/dist/modules/customers/lib/calendar/mapItem.js +1 -0
  539. package/dist/modules/customers/lib/calendar/mapItem.js.map +2 -2
  540. package/dist/modules/customers/lib/conversationShares.js +126 -0
  541. package/dist/modules/customers/lib/conversationShares.js.map +7 -0
  542. package/dist/modules/customers/lib/dealsOrganizationScope.js +5 -3
  543. package/dist/modules/customers/lib/dealsOrganizationScope.js.map +2 -2
  544. package/dist/modules/customers/lib/interactionRequestContext.js +2 -1
  545. package/dist/modules/customers/lib/interactionRequestContext.js.map +2 -2
  546. package/dist/modules/customers/lib/link-channel-message-handler.js +19 -9
  547. package/dist/modules/customers/lib/link-channel-message-handler.js.map +2 -2
  548. package/dist/modules/customers/lib/personDetailCacheTags.js +32 -0
  549. package/dist/modules/customers/lib/personDetailCacheTags.js.map +7 -0
  550. package/dist/modules/customers/lib/personEmailThreads.js +26 -5
  551. package/dist/modules/customers/lib/personEmailThreads.js.map +2 -2
  552. package/dist/modules/customers/lib/reassignDealOwner.js +25 -0
  553. package/dist/modules/customers/lib/reassignDealOwner.js.map +7 -0
  554. package/dist/modules/customers/lib/userNames.js +26 -0
  555. package/dist/modules/customers/lib/userNames.js.map +7 -0
  556. package/dist/modules/customers/lib/visibilityFilter.js +70 -2
  557. package/dist/modules/customers/lib/visibilityFilter.js.map +2 -2
  558. package/dist/modules/customers/migrations/Migration20260825120000_customers.js +18 -0
  559. package/dist/modules/customers/migrations/Migration20260825120000_customers.js.map +7 -0
  560. package/dist/modules/customers/migrations/Migration20260825140000_customers.js +27 -0
  561. package/dist/modules/customers/migrations/Migration20260825140000_customers.js.map +7 -0
  562. package/dist/modules/customers/setup.js +1 -0
  563. package/dist/modules/customers/setup.js.map +2 -2
  564. package/dist/modules/customers/subscribers/channel-visibility-changed.js +16 -0
  565. package/dist/modules/customers/subscribers/channel-visibility-changed.js.map +7 -0
  566. package/dist/modules/dashboards/api/widgets/data/batch/route.js +3 -8
  567. package/dist/modules/dashboards/api/widgets/data/batch/route.js.map +2 -2
  568. package/dist/modules/dashboards/api/widgets/data/route.js +10 -15
  569. package/dist/modules/dashboards/api/widgets/data/route.js.map +2 -2
  570. package/dist/modules/dashboards/lib/aggregations.js +1 -1
  571. package/dist/modules/dashboards/lib/aggregations.js.map +2 -2
  572. package/dist/modules/dashboards/lib/widgetScope.js +2 -7
  573. package/dist/modules/dashboards/lib/widgetScope.js.map +2 -2
  574. package/dist/modules/data_sync/api/runs/[id]/cancel.js +4 -1
  575. package/dist/modules/data_sync/api/runs/[id]/cancel.js.map +2 -2
  576. package/dist/modules/data_sync/backend/data-sync/page.js +497 -329
  577. package/dist/modules/data_sync/backend/data-sync/page.js.map +2 -2
  578. package/dist/modules/data_sync/backend/data-sync/runs/[id]/page.js +248 -113
  579. package/dist/modules/data_sync/backend/data-sync/runs/[id]/page.js.map +3 -3
  580. package/dist/modules/data_sync/components/useDataSyncRunAccess.js +17 -0
  581. package/dist/modules/data_sync/components/useDataSyncRunAccess.js.map +7 -0
  582. package/dist/modules/data_sync/lib/resume-point.js +21 -0
  583. package/dist/modules/data_sync/lib/resume-point.js.map +7 -0
  584. package/dist/modules/data_sync/lib/start-run.js +52 -2
  585. package/dist/modules/data_sync/lib/start-run.js.map +2 -2
  586. package/dist/modules/data_sync/lib/sync-run-service.js +22 -33
  587. package/dist/modules/data_sync/lib/sync-run-service.js.map +3 -3
  588. package/dist/modules/devices/api/[id]/route.js +3 -2
  589. package/dist/modules/devices/api/[id]/route.js.map +2 -2
  590. package/dist/modules/devices/api/admin/devices/route.js +2 -1
  591. package/dist/modules/devices/api/admin/devices/route.js.map +2 -2
  592. package/dist/modules/devices/api/route.js +2 -1
  593. package/dist/modules/devices/api/route.js.map +2 -2
  594. package/dist/modules/dictionaries/api/[dictionaryId]/route.js.map +2 -2
  595. package/dist/modules/dictionaries/api/context.js +2 -1
  596. package/dist/modules/dictionaries/api/context.js.map +2 -2
  597. package/dist/modules/dictionaries/api/route.js +4 -0
  598. package/dist/modules/dictionaries/api/route.js.map +2 -2
  599. package/dist/modules/dictionaries/components/DictionariesManager.js +101 -89
  600. package/dist/modules/dictionaries/components/DictionariesManager.js.map +2 -2
  601. package/dist/modules/dictionaries/data/validators.js +3 -1
  602. package/dist/modules/dictionaries/data/validators.js.map +2 -2
  603. package/dist/modules/directory/api/organization-branding/route.js +10 -1
  604. package/dist/modules/directory/api/organization-branding/route.js.map +2 -2
  605. package/dist/modules/directory/api/organizations/route.js +1 -1
  606. package/dist/modules/directory/api/organizations/route.js.map +1 -1
  607. package/dist/modules/directory/backend/directory/branding/page.js +17 -4
  608. package/dist/modules/directory/backend/directory/branding/page.js.map +3 -3
  609. package/dist/modules/directory/commands/organizations.js +136 -74
  610. package/dist/modules/directory/commands/organizations.js.map +2 -2
  611. package/dist/modules/directory/lib/hierarchy.js +19 -1
  612. package/dist/modules/directory/lib/hierarchy.js.map +2 -2
  613. package/dist/modules/directory/utils/organizationScope.js +66 -12
  614. package/dist/modules/directory/utils/organizationScope.js.map +2 -2
  615. package/dist/modules/directory/utils/organizationScopeFilter.js +7 -4
  616. package/dist/modules/directory/utils/organizationScopeFilter.js.map +2 -2
  617. package/dist/modules/directory/utils/organizationScopeGuard.js +6 -2
  618. package/dist/modules/directory/utils/organizationScopeGuard.js.map +2 -2
  619. package/dist/modules/entities/api/encryption.js +68 -25
  620. package/dist/modules/entities/api/encryption.js.map +2 -2
  621. package/dist/modules/entities/api/records.js +9 -8
  622. package/dist/modules/entities/api/records.js.map +2 -2
  623. package/dist/modules/entities/cli.js +33 -22
  624. package/dist/modules/entities/cli.js.map +2 -2
  625. package/dist/modules/entities/data/entities.js +8 -0
  626. package/dist/modules/entities/data/entities.js.map +2 -2
  627. package/dist/modules/entities/lib/definition-scope.js +3 -1
  628. package/dist/modules/entities/lib/definition-scope.js.map +2 -2
  629. package/dist/modules/entities/lib/encryption-maps.js +117 -0
  630. package/dist/modules/entities/lib/encryption-maps.js.map +7 -0
  631. package/dist/modules/entities/lib/helpers.js +30 -6
  632. package/dist/modules/entities/lib/helpers.js.map +2 -2
  633. package/dist/modules/entities/migrations/Migration20260910120000.js +17 -0
  634. package/dist/modules/entities/migrations/Migration20260910120000.js.map +7 -0
  635. package/dist/modules/entities/migrations/Migration20261004120000_encryption_map_scope_uniqueness.js +130 -0
  636. package/dist/modules/entities/migrations/Migration20261004120000_encryption_map_scope_uniqueness.js.map +7 -0
  637. package/dist/modules/eudr/api/dashboard/widgets/compliance-overview/route.js +2 -1
  638. package/dist/modules/eudr/api/dashboard/widgets/compliance-overview/route.js.map +2 -2
  639. package/dist/modules/eudr/api/plots/import/route.js +2 -1
  640. package/dist/modules/eudr/api/plots/import/route.js.map +2 -2
  641. package/dist/modules/eudr/api/product-mappings/suggestions/apply/route.js +2 -1
  642. package/dist/modules/eudr/api/product-mappings/suggestions/apply/route.js.map +2 -2
  643. package/dist/modules/eudr/api/product-mappings/suggestions/route.js +2 -1
  644. package/dist/modules/eudr/api/product-mappings/suggestions/route.js.map +2 -2
  645. package/dist/modules/eudr/api/reports/annual/route.js +2 -1
  646. package/dist/modules/eudr/api/reports/annual/route.js.map +2 -2
  647. package/dist/modules/eudr/api/statements/[id]/export/route.js +2 -1
  648. package/dist/modules/eudr/api/statements/[id]/export/route.js.map +2 -2
  649. package/dist/modules/eudr/api/statements/[id]/readiness/route.js +2 -1
  650. package/dist/modules/eudr/api/statements/[id]/readiness/route.js.map +2 -2
  651. package/dist/modules/eudr/api/suppliers/compliance/route.js +2 -1
  652. package/dist/modules/eudr/api/suppliers/compliance/route.js.map +2 -2
  653. package/dist/modules/feature_toggles/commands/global.js +13 -13
  654. package/dist/modules/feature_toggles/commands/global.js.map +2 -2
  655. package/dist/modules/feature_toggles/lib/feature-flag-check.js +8 -2
  656. package/dist/modules/feature_toggles/lib/feature-flag-check.js.map +2 -2
  657. package/dist/modules/forms/acl.js +14 -0
  658. package/dist/modules/forms/acl.js.map +7 -0
  659. package/dist/modules/forms/api/[id]/analytics/route.js +113 -0
  660. package/dist/modules/forms/api/[id]/analytics/route.js.map +7 -0
  661. package/dist/modules/forms/api/[id]/distributions/route.js +176 -0
  662. package/dist/modules/forms/api/[id]/distributions/route.js.map +7 -0
  663. package/dist/modules/forms/api/[id]/route.js +225 -0
  664. package/dist/modules/forms/api/[id]/route.js.map +7 -0
  665. package/dist/modules/forms/api/[id]/run/context/route.js +115 -0
  666. package/dist/modules/forms/api/[id]/run/context/route.js.map +7 -0
  667. package/dist/modules/forms/api/[id]/run/submissions/route.js +109 -0
  668. package/dist/modules/forms/api/[id]/run/submissions/route.js.map +7 -0
  669. package/dist/modules/forms/api/[id]/submissions/route.js +83 -0
  670. package/dist/modules/forms/api/[id]/submissions/route.js.map +7 -0
  671. package/dist/modules/forms/api/[id]/theme-logo/route.js +117 -0
  672. package/dist/modules/forms/api/[id]/theme-logo/route.js.map +7 -0
  673. package/dist/modules/forms/api/[id]/versions/[versionId]/diff/route.js +125 -0
  674. package/dist/modules/forms/api/[id]/versions/[versionId]/diff/route.js.map +7 -0
  675. package/dist/modules/forms/api/[id]/versions/[versionId]/publish/route.js +99 -0
  676. package/dist/modules/forms/api/[id]/versions/[versionId]/publish/route.js.map +7 -0
  677. package/dist/modules/forms/api/[id]/versions/[versionId]/route.js +176 -0
  678. package/dist/modules/forms/api/[id]/versions/[versionId]/route.js.map +7 -0
  679. package/dist/modules/forms/api/[id]/versions/fork/route.js +92 -0
  680. package/dist/modules/forms/api/[id]/versions/fork/route.js.map +7 -0
  681. package/dist/modules/forms/api/attachment-helpers.js +111 -0
  682. package/dist/modules/forms/api/attachment-helpers.js.map +7 -0
  683. package/dist/modules/forms/api/by-key/[key]/active/route.js +140 -0
  684. package/dist/modules/forms/api/by-key/[key]/active/route.js.map +7 -0
  685. package/dist/modules/forms/api/distributions/[distributionId]/invitations/[invitationId]/route.js +84 -0
  686. package/dist/modules/forms/api/distributions/[distributionId]/invitations/[invitationId]/route.js.map +7 -0
  687. package/dist/modules/forms/api/distributions/[distributionId]/invitations/[invitationId]/send/route.js +88 -0
  688. package/dist/modules/forms/api/distributions/[distributionId]/invitations/[invitationId]/send/route.js.map +7 -0
  689. package/dist/modules/forms/api/distributions/[distributionId]/invitations/route.js +183 -0
  690. package/dist/modules/forms/api/distributions/[distributionId]/invitations/route.js.map +7 -0
  691. package/dist/modules/forms/api/distributions/[distributionId]/route.js +191 -0
  692. package/dist/modules/forms/api/distributions/[distributionId]/route.js.map +7 -0
  693. package/dist/modules/forms/api/form-submissions/[id]/attachments/route.js +91 -0
  694. package/dist/modules/forms/api/form-submissions/[id]/attachments/route.js.map +7 -0
  695. package/dist/modules/forms/api/form-submissions/[id]/resume-token/route.js +110 -0
  696. package/dist/modules/forms/api/form-submissions/[id]/resume-token/route.js.map +7 -0
  697. package/dist/modules/forms/api/form-submissions/[id]/route.js +146 -0
  698. package/dist/modules/forms/api/form-submissions/[id]/route.js.map +7 -0
  699. package/dist/modules/forms/api/form-submissions/[id]/submit/route.js +74 -0
  700. package/dist/modules/forms/api/form-submissions/[id]/submit/route.js.map +7 -0
  701. package/dist/modules/forms/api/form-submissions/by-subject/[subject_type]/[subject_id]/route.js +76 -0
  702. package/dist/modules/forms/api/form-submissions/by-subject/[subject_type]/[subject_id]/route.js.map +7 -0
  703. package/dist/modules/forms/api/form-submissions/route.js +113 -0
  704. package/dist/modules/forms/api/form-submissions/route.js.map +7 -0
  705. package/dist/modules/forms/api/helpers.js +124 -0
  706. package/dist/modules/forms/api/helpers.js.map +7 -0
  707. package/dist/modules/forms/api/public/distributions/[slug]/embed-policy/route.js +47 -0
  708. package/dist/modules/forms/api/public/distributions/[slug]/embed-policy/route.js.map +7 -0
  709. package/dist/modules/forms/api/public/distributions/[slug]/route.js +81 -0
  710. package/dist/modules/forms/api/public/distributions/[slug]/route.js.map +7 -0
  711. package/dist/modules/forms/api/public/embed-loader/route.js +116 -0
  712. package/dist/modules/forms/api/public/embed-loader/route.js.map +7 -0
  713. package/dist/modules/forms/api/public/invitations/[token]/route.js +87 -0
  714. package/dist/modules/forms/api/public/invitations/[token]/route.js.map +7 -0
  715. package/dist/modules/forms/api/public/rate-limit.js +54 -0
  716. package/dist/modules/forms/api/public/rate-limit.js.map +7 -0
  717. package/dist/modules/forms/api/public/start/route.js +142 -0
  718. package/dist/modules/forms/api/public/start/route.js.map +7 -0
  719. package/dist/modules/forms/api/public/submissions/[id]/attachments/[attachmentId]/route.js +67 -0
  720. package/dist/modules/forms/api/public/submissions/[id]/attachments/[attachmentId]/route.js.map +7 -0
  721. package/dist/modules/forms/api/public/submissions/[id]/attachments/route.js +85 -0
  722. package/dist/modules/forms/api/public/submissions/[id]/attachments/route.js.map +7 -0
  723. package/dist/modules/forms/api/public/submissions/[id]/pdf/route.js +72 -0
  724. package/dist/modules/forms/api/public/submissions/[id]/pdf/route.js.map +7 -0
  725. package/dist/modules/forms/api/public/submissions/[id]/route.js +154 -0
  726. package/dist/modules/forms/api/public/submissions/[id]/route.js.map +7 -0
  727. package/dist/modules/forms/api/public/submissions/[id]/submit/route.js +127 -0
  728. package/dist/modules/forms/api/public/submissions/[id]/submit/route.js.map +7 -0
  729. package/dist/modules/forms/api/route.js +216 -0
  730. package/dist/modules/forms/api/route.js.map +7 -0
  731. package/dist/modules/forms/api/runtime-helpers.js +149 -0
  732. package/dist/modules/forms/api/runtime-helpers.js.map +7 -0
  733. package/dist/modules/forms/api/subjects/[subjectType]/[subjectId]/consents/route.js +137 -0
  734. package/dist/modules/forms/api/subjects/[subjectType]/[subjectId]/consents/route.js.map +7 -0
  735. package/dist/modules/forms/api/subjects/[subjectType]/[subjectId]/export/route.js +101 -0
  736. package/dist/modules/forms/api/subjects/[subjectType]/[subjectId]/export/route.js.map +7 -0
  737. package/dist/modules/forms/api/submissions/[submissionId]/access-audit/route.js +76 -0
  738. package/dist/modules/forms/api/submissions/[submissionId]/access-audit/route.js.map +7 -0
  739. package/dist/modules/forms/api/submissions/[submissionId]/actors/[actorId]/route.js +56 -0
  740. package/dist/modules/forms/api/submissions/[submissionId]/actors/[actorId]/route.js.map +7 -0
  741. package/dist/modules/forms/api/submissions/[submissionId]/actors/route.js +76 -0
  742. package/dist/modules/forms/api/submissions/[submissionId]/actors/route.js.map +7 -0
  743. package/dist/modules/forms/api/submissions/[submissionId]/anonymize/route.js +107 -0
  744. package/dist/modules/forms/api/submissions/[submissionId]/anonymize/route.js.map +7 -0
  745. package/dist/modules/forms/api/submissions/[submissionId]/attachments/[attachmentId]/route.js +73 -0
  746. package/dist/modules/forms/api/submissions/[submissionId]/attachments/[attachmentId]/route.js.map +7 -0
  747. package/dist/modules/forms/api/submissions/[submissionId]/export/route.js +90 -0
  748. package/dist/modules/forms/api/submissions/[submissionId]/export/route.js.map +7 -0
  749. package/dist/modules/forms/api/submissions/[submissionId]/pdf/route.js +91 -0
  750. package/dist/modules/forms/api/submissions/[submissionId]/pdf/route.js.map +7 -0
  751. package/dist/modules/forms/api/submissions/[submissionId]/reopen/route.js +55 -0
  752. package/dist/modules/forms/api/submissions/[submissionId]/reopen/route.js.map +7 -0
  753. package/dist/modules/forms/api/submissions/[submissionId]/revisions/route.js +61 -0
  754. package/dist/modules/forms/api/submissions/[submissionId]/revisions/route.js.map +7 -0
  755. package/dist/modules/forms/api/submissions/[submissionId]/route.js +75 -0
  756. package/dist/modules/forms/api/submissions/[submissionId]/route.js.map +7 -0
  757. package/dist/modules/forms/backend/forms/[id]/FormStudio.js +2811 -0
  758. package/dist/modules/forms/backend/forms/[id]/FormStudio.js.map +7 -0
  759. package/dist/modules/forms/backend/forms/[id]/analytics/page.js +214 -0
  760. package/dist/modules/forms/backend/forms/[id]/analytics/page.js.map +7 -0
  761. package/dist/modules/forms/backend/forms/[id]/analytics/page.meta.js +19 -0
  762. package/dist/modules/forms/backend/forms/[id]/analytics/page.meta.js.map +7 -0
  763. package/dist/modules/forms/backend/forms/[id]/distributions/page.js +12 -0
  764. package/dist/modules/forms/backend/forms/[id]/distributions/page.js.map +7 -0
  765. package/dist/modules/forms/backend/forms/[id]/distributions/page.meta.js +19 -0
  766. package/dist/modules/forms/backend/forms/[id]/distributions/page.meta.js.map +7 -0
  767. package/dist/modules/forms/backend/forms/[id]/history/page.js +152 -0
  768. package/dist/modules/forms/backend/forms/[id]/history/page.js.map +7 -0
  769. package/dist/modules/forms/backend/forms/[id]/history/page.meta.js +15 -0
  770. package/dist/modules/forms/backend/forms/[id]/history/page.meta.js.map +7 -0
  771. package/dist/modules/forms/backend/forms/[id]/page.js +13 -0
  772. package/dist/modules/forms/backend/forms/[id]/page.js.map +7 -0
  773. package/dist/modules/forms/backend/forms/[id]/page.meta.js +15 -0
  774. package/dist/modules/forms/backend/forms/[id]/page.meta.js.map +7 -0
  775. package/dist/modules/forms/backend/forms/[id]/studio/YesNoRow.js +51 -0
  776. package/dist/modules/forms/backend/forms/[id]/studio/YesNoRow.js.map +7 -0
  777. package/dist/modules/forms/backend/forms/[id]/studio/autosave-guard.js +21 -0
  778. package/dist/modules/forms/backend/forms/[id]/studio/autosave-guard.js.map +7 -0
  779. package/dist/modules/forms/backend/forms/[id]/studio/canvas/DragOverlayCard.js +18 -0
  780. package/dist/modules/forms/backend/forms/[id]/studio/canvas/DragOverlayCard.js.map +7 -0
  781. package/dist/modules/forms/backend/forms/[id]/studio/canvas/DropIndicator.js +41 -0
  782. package/dist/modules/forms/backend/forms/[id]/studio/canvas/DropIndicator.js.map +7 -0
  783. package/dist/modules/forms/backend/forms/[id]/studio/canvas/FieldRow.js +277 -0
  784. package/dist/modules/forms/backend/forms/[id]/studio/canvas/FieldRow.js.map +7 -0
  785. package/dist/modules/forms/backend/forms/[id]/studio/canvas/FormCanvas.js +196 -0
  786. package/dist/modules/forms/backend/forms/[id]/studio/canvas/FormCanvas.js.map +7 -0
  787. package/dist/modules/forms/backend/forms/[id]/studio/canvas/GridSlot.js +151 -0
  788. package/dist/modules/forms/backend/forms/[id]/studio/canvas/GridSlot.js.map +7 -0
  789. package/dist/modules/forms/backend/forms/[id]/studio/canvas/SectionContainer.js +340 -0
  790. package/dist/modules/forms/backend/forms/[id]/studio/canvas/SectionContainer.js.map +7 -0
  791. package/dist/modules/forms/backend/forms/[id]/studio/canvas/grid-collision.js +24 -0
  792. package/dist/modules/forms/backend/forms/[id]/studio/canvas/grid-collision.js.map +7 -0
  793. package/dist/modules/forms/backend/forms/[id]/studio/canvas/keyboard-coordinates.js +91 -0
  794. package/dist/modules/forms/backend/forms/[id]/studio/canvas/keyboard-coordinates.js.map +7 -0
  795. package/dist/modules/forms/backend/forms/[id]/studio/canvas/overlay-size.js +11 -0
  796. package/dist/modules/forms/backend/forms/[id]/studio/canvas/overlay-size.js.map +7 -0
  797. package/dist/modules/forms/backend/forms/[id]/studio/canvas/resize-math.js +27 -0
  798. package/dist/modules/forms/backend/forms/[id]/studio/canvas/resize-math.js.map +7 -0
  799. package/dist/modules/forms/backend/forms/[id]/studio/canvas/row-layout.js +80 -0
  800. package/dist/modules/forms/backend/forms/[id]/studio/canvas/row-layout.js.map +7 -0
  801. package/dist/modules/forms/backend/forms/[id]/studio/logic/ConditionBuilder.js +210 -0
  802. package/dist/modules/forms/backend/forms/[id]/studio/logic/ConditionBuilder.js.map +7 -0
  803. package/dist/modules/forms/backend/forms/[id]/studio/logic/HiddenFieldsPanel.js +91 -0
  804. package/dist/modules/forms/backend/forms/[id]/studio/logic/HiddenFieldsPanel.js.map +7 -0
  805. package/dist/modules/forms/backend/forms/[id]/studio/logic/JumpsEditor.js +201 -0
  806. package/dist/modules/forms/backend/forms/[id]/studio/logic/JumpsEditor.js.map +7 -0
  807. package/dist/modules/forms/backend/forms/[id]/studio/logic/RecallTokenPicker.js +66 -0
  808. package/dist/modules/forms/backend/forms/[id]/studio/logic/RecallTokenPicker.js.map +7 -0
  809. package/dist/modules/forms/backend/forms/[id]/studio/logic/VariablesPanel.js +223 -0
  810. package/dist/modules/forms/backend/forms/[id]/studio/logic/VariablesPanel.js.map +7 -0
  811. package/dist/modules/forms/backend/forms/[id]/studio/logic/condition-model.js +151 -0
  812. package/dist/modules/forms/backend/forms/[id]/studio/logic/condition-model.js.map +7 -0
  813. package/dist/modules/forms/backend/forms/[id]/studio/lucide-icons.js +88 -0
  814. package/dist/modules/forms/backend/forms/[id]/studio/lucide-icons.js.map +7 -0
  815. package/dist/modules/forms/backend/forms/[id]/studio/palette/FormAppearancePanel.js +493 -0
  816. package/dist/modules/forms/backend/forms/[id]/studio/palette/FormAppearancePanel.js.map +7 -0
  817. package/dist/modules/forms/backend/forms/[id]/studio/palette/FormPalettePanel.js +44 -0
  818. package/dist/modules/forms/backend/forms/[id]/studio/palette/FormPalettePanel.js.map +7 -0
  819. package/dist/modules/forms/backend/forms/[id]/studio/palette/InputParametersTab.js +350 -0
  820. package/dist/modules/forms/backend/forms/[id]/studio/palette/InputParametersTab.js.map +7 -0
  821. package/dist/modules/forms/backend/forms/[id]/studio/palette/PaletteCard.js +40 -0
  822. package/dist/modules/forms/backend/forms/[id]/studio/palette/PaletteCard.js.map +7 -0
  823. package/dist/modules/forms/backend/forms/[id]/studio/palette/RolesEditor.js +202 -0
  824. package/dist/modules/forms/backend/forms/[id]/studio/palette/RolesEditor.js.map +7 -0
  825. package/dist/modules/forms/backend/forms/[id]/studio/palette/entries.js +66 -0
  826. package/dist/modules/forms/backend/forms/[id]/studio/palette/entries.js.map +7 -0
  827. package/dist/modules/forms/backend/forms/[id]/studio/preview/PreviewSurface.js +1200 -0
  828. package/dist/modules/forms/backend/forms/[id]/studio/preview/PreviewSurface.js.map +7 -0
  829. package/dist/modules/forms/backend/forms/[id]/studio/preview/ViewportFrame.js +34 -0
  830. package/dist/modules/forms/backend/forms/[id]/studio/preview/ViewportFrame.js.map +7 -0
  831. package/dist/modules/forms/backend/forms/[id]/studio/recall.js +76 -0
  832. package/dist/modules/forms/backend/forms/[id]/studio/recall.js.map +7 -0
  833. package/dist/modules/forms/backend/forms/[id]/studio/schema-helpers.js +1693 -0
  834. package/dist/modules/forms/backend/forms/[id]/studio/schema-helpers.js.map +7 -0
  835. package/dist/modules/forms/backend/forms/[id]/studio/style/BackgroundControl.js +127 -0
  836. package/dist/modules/forms/backend/forms/[id]/studio/style/BackgroundControl.js.map +7 -0
  837. package/dist/modules/forms/backend/forms/[id]/studio/style/ColorControl.js +181 -0
  838. package/dist/modules/forms/backend/forms/[id]/studio/style/ColorControl.js.map +7 -0
  839. package/dist/modules/forms/backend/forms/[id]/studio/style/contrast.js +75 -0
  840. package/dist/modules/forms/backend/forms/[id]/studio/style/contrast.js.map +7 -0
  841. package/dist/modules/forms/backend/forms/[id]/studio/style/presets.js +91 -0
  842. package/dist/modules/forms/backend/forms/[id]/studio/style/presets.js.map +7 -0
  843. package/dist/modules/forms/backend/forms/[id]/studio/type-label.js +11 -0
  844. package/dist/modules/forms/backend/forms/[id]/studio/type-label.js.map +7 -0
  845. package/dist/modules/forms/backend/forms/[id]/studio/types.js +1 -0
  846. package/dist/modules/forms/backend/forms/[id]/studio/types.js.map +7 -0
  847. package/dist/modules/forms/backend/forms/[id]/studio/undo-controller.js +43 -0
  848. package/dist/modules/forms/backend/forms/[id]/studio/undo-controller.js.map +7 -0
  849. package/dist/modules/forms/backend/forms/[id]/studio/validation/FileConstraintsEditor.js +74 -0
  850. package/dist/modules/forms/backend/forms/[id]/studio/validation/FileConstraintsEditor.js.map +7 -0
  851. package/dist/modules/forms/backend/forms/[id]/studio/validation/GroupConfigEditor.js +134 -0
  852. package/dist/modules/forms/backend/forms/[id]/studio/validation/GroupConfigEditor.js.map +7 -0
  853. package/dist/modules/forms/backend/forms/[id]/studio/validation/LengthRangeEditor.js +61 -0
  854. package/dist/modules/forms/backend/forms/[id]/studio/validation/LengthRangeEditor.js.map +7 -0
  855. package/dist/modules/forms/backend/forms/[id]/studio/validation/MatrixColumnsEditor.js +149 -0
  856. package/dist/modules/forms/backend/forms/[id]/studio/validation/MatrixColumnsEditor.js.map +7 -0
  857. package/dist/modules/forms/backend/forms/[id]/studio/validation/MatrixRowsEditor.js +168 -0
  858. package/dist/modules/forms/backend/forms/[id]/studio/validation/MatrixRowsEditor.js.map +7 -0
  859. package/dist/modules/forms/backend/forms/[id]/studio/validation/MessageOverridesEditor.js +64 -0
  860. package/dist/modules/forms/backend/forms/[id]/studio/validation/MessageOverridesEditor.js.map +7 -0
  861. package/dist/modules/forms/backend/forms/[id]/studio/validation/NpsAnchorsEditor.js +52 -0
  862. package/dist/modules/forms/backend/forms/[id]/studio/validation/NpsAnchorsEditor.js.map +7 -0
  863. package/dist/modules/forms/backend/forms/[id]/studio/validation/NumberRangeEditor.js +59 -0
  864. package/dist/modules/forms/backend/forms/[id]/studio/validation/NumberRangeEditor.js.map +7 -0
  865. package/dist/modules/forms/backend/forms/[id]/studio/validation/OpinionIconSelect.js +31 -0
  866. package/dist/modules/forms/backend/forms/[id]/studio/validation/OpinionIconSelect.js.map +7 -0
  867. package/dist/modules/forms/backend/forms/[id]/studio/validation/PatternEditor.js +105 -0
  868. package/dist/modules/forms/backend/forms/[id]/studio/validation/PatternEditor.js.map +7 -0
  869. package/dist/modules/forms/backend/forms/[id]/studio/validation/RankingExhaustiveSwitch.js +15 -0
  870. package/dist/modules/forms/backend/forms/[id]/studio/validation/RankingExhaustiveSwitch.js.map +7 -0
  871. package/dist/modules/forms/backend/forms/[id]/studio/validation/SignatureConfigEditor.js +75 -0
  872. package/dist/modules/forms/backend/forms/[id]/studio/validation/SignatureConfigEditor.js.map +7 -0
  873. package/dist/modules/forms/backend/forms/[id]/studio/validation/ValidationPanel.js +293 -0
  874. package/dist/modules/forms/backend/forms/[id]/studio/validation/ValidationPanel.js.map +7 -0
  875. package/dist/modules/forms/backend/forms/[id]/submissions/components/RowBadges.js +42 -0
  876. package/dist/modules/forms/backend/forms/[id]/submissions/components/RowBadges.js.map +7 -0
  877. package/dist/modules/forms/backend/forms/[id]/submissions/components/SubmissionDrawer.js +473 -0
  878. package/dist/modules/forms/backend/forms/[id]/submissions/components/SubmissionDrawer.js.map +7 -0
  879. package/dist/modules/forms/backend/forms/[id]/submissions/components/formSummary.js +9 -0
  880. package/dist/modules/forms/backend/forms/[id]/submissions/components/formSummary.js.map +7 -0
  881. package/dist/modules/forms/backend/forms/[id]/submissions/page.js +205 -0
  882. package/dist/modules/forms/backend/forms/[id]/submissions/page.js.map +7 -0
  883. package/dist/modules/forms/backend/forms/[id]/submissions/page.meta.js +12 -0
  884. package/dist/modules/forms/backend/forms/[id]/submissions/page.meta.js.map +7 -0
  885. package/dist/modules/forms/backend/forms/create/page.js +101 -0
  886. package/dist/modules/forms/backend/forms/create/page.js.map +7 -0
  887. package/dist/modules/forms/backend/forms/create/page.meta.js +15 -0
  888. package/dist/modules/forms/backend/forms/create/page.meta.js.map +7 -0
  889. package/dist/modules/forms/backend/forms/page.js +227 -0
  890. package/dist/modules/forms/backend/forms/page.js.map +7 -0
  891. package/dist/modules/forms/backend/forms/page.meta.js +33 -0
  892. package/dist/modules/forms/backend/forms/page.meta.js.map +7 -0
  893. package/dist/modules/forms/commands/distribution.js +421 -0
  894. package/dist/modules/forms/commands/distribution.js.map +7 -0
  895. package/dist/modules/forms/commands/form-version.js +645 -0
  896. package/dist/modules/forms/commands/form-version.js.map +7 -0
  897. package/dist/modules/forms/commands/form.js +411 -0
  898. package/dist/modules/forms/commands/form.js.map +7 -0
  899. package/dist/modules/forms/commands/index.js +11 -0
  900. package/dist/modules/forms/commands/index.js.map +7 -0
  901. package/dist/modules/forms/commands/invitation.js +333 -0
  902. package/dist/modules/forms/commands/invitation.js.map +7 -0
  903. package/dist/modules/forms/commands/shared.js +151 -0
  904. package/dist/modules/forms/commands/shared.js.map +7 -0
  905. package/dist/modules/forms/commands/submission.js +139 -0
  906. package/dist/modules/forms/commands/submission.js.map +7 -0
  907. package/dist/modules/forms/data/entities.js +654 -0
  908. package/dist/modules/forms/data/entities.js.map +7 -0
  909. package/dist/modules/forms/data/validators.js +254 -0
  910. package/dist/modules/forms/data/validators.js.map +7 -0
  911. package/dist/modules/forms/di.js +199 -0
  912. package/dist/modules/forms/di.js.map +7 -0
  913. package/dist/modules/forms/encryption.js +15 -0
  914. package/dist/modules/forms/encryption.js.map +7 -0
  915. package/dist/modules/forms/events-payloads.js +81 -0
  916. package/dist/modules/forms/events-payloads.js.map +7 -0
  917. package/dist/modules/forms/events.js +33 -0
  918. package/dist/modules/forms/events.js.map +7 -0
  919. package/dist/modules/forms/extension-points.js +36 -0
  920. package/dist/modules/forms/extension-points.js.map +7 -0
  921. package/dist/modules/forms/frontend/[orgSlug]/portal/forms/[key]/page.js +33 -0
  922. package/dist/modules/forms/frontend/[orgSlug]/portal/forms/[key]/page.js.map +7 -0
  923. package/dist/modules/forms/frontend/[orgSlug]/portal/forms/[key]/page.meta.js +11 -0
  924. package/dist/modules/forms/frontend/[orgSlug]/portal/forms/[key]/page.meta.js.map +7 -0
  925. package/dist/modules/forms/frontend/[orgSlug]/portal/submissions/[id]/continue/page.js +41 -0
  926. package/dist/modules/forms/frontend/[orgSlug]/portal/submissions/[id]/continue/page.js.map +7 -0
  927. package/dist/modules/forms/frontend/[orgSlug]/portal/submissions/[id]/continue/page.meta.js +11 -0
  928. package/dist/modules/forms/frontend/[orgSlug]/portal/submissions/[id]/continue/page.meta.js.map +7 -0
  929. package/dist/modules/forms/frontend/embed/[slug]/page.js +105 -0
  930. package/dist/modules/forms/frontend/embed/[slug]/page.js.map +7 -0
  931. package/dist/modules/forms/frontend/embed/[slug]/page.meta.js +11 -0
  932. package/dist/modules/forms/frontend/embed/[slug]/page.meta.js.map +7 -0
  933. package/dist/modules/forms/frontend/f/[slug]/page.js +12 -0
  934. package/dist/modules/forms/frontend/f/[slug]/page.js.map +7 -0
  935. package/dist/modules/forms/frontend/f/[slug]/page.meta.js +11 -0
  936. package/dist/modules/forms/frontend/f/[slug]/page.meta.js.map +7 -0
  937. package/dist/modules/forms/frontend/forms/[id]/run/page.js +62 -0
  938. package/dist/modules/forms/frontend/forms/[id]/run/page.js.map +7 -0
  939. package/dist/modules/forms/frontend/forms/[id]/run/page.meta.js +11 -0
  940. package/dist/modules/forms/frontend/forms/[id]/run/page.meta.js.map +7 -0
  941. package/dist/modules/forms/frontend/i/[token]/page.js +12 -0
  942. package/dist/modules/forms/frontend/i/[token]/page.js.map +7 -0
  943. package/dist/modules/forms/frontend/i/[token]/page.meta.js +11 -0
  944. package/dist/modules/forms/frontend/i/[token]/page.meta.js.map +7 -0
  945. package/dist/modules/forms/index.js +20 -0
  946. package/dist/modules/forms/index.js.map +7 -0
  947. package/dist/modules/forms/lib/embed-frame-policy.js +68 -0
  948. package/dist/modules/forms/lib/embed-frame-policy.js.map +7 -0
  949. package/dist/modules/forms/lib/form-definition-slicing.js +38 -0
  950. package/dist/modules/forms/lib/form-definition-slicing.js.map +7 -0
  951. package/dist/modules/forms/lib/log-redaction.js +38 -0
  952. package/dist/modules/forms/lib/log-redaction.js.map +7 -0
  953. package/dist/modules/forms/lib/navigable-url.js +24 -0
  954. package/dist/modules/forms/lib/navigable-url.js.map +7 -0
  955. package/dist/modules/forms/lib/retention.js +20 -0
  956. package/dist/modules/forms/lib/retention.js.map +7 -0
  957. package/dist/modules/forms/lib/runtime-principal.js +59 -0
  958. package/dist/modules/forms/lib/runtime-principal.js.map +7 -0
  959. package/dist/modules/forms/migrations/Migration20260508135459_forms.js +17 -0
  960. package/dist/modules/forms/migrations/Migration20260508135459_forms.js.map +7 -0
  961. package/dist/modules/forms/migrations/Migration20260508140932_forms.js +23 -0
  962. package/dist/modules/forms/migrations/Migration20260508140932_forms.js.map +7 -0
  963. package/dist/modules/forms/migrations/Migration20260508155737_forms.js +15 -0
  964. package/dist/modules/forms/migrations/Migration20260508155737_forms.js.map +7 -0
  965. package/dist/modules/forms/migrations/Migration20260520120000_forms.js +23 -0
  966. package/dist/modules/forms/migrations/Migration20260520120000_forms.js.map +7 -0
  967. package/dist/modules/forms/migrations/Migration20260521090000_forms.js +13 -0
  968. package/dist/modules/forms/migrations/Migration20260521090000_forms.js.map +7 -0
  969. package/dist/modules/forms/migrations/Migration20260521120000_forms.js +17 -0
  970. package/dist/modules/forms/migrations/Migration20260521120000_forms.js.map +7 -0
  971. package/dist/modules/forms/runner/FormRunner.js +786 -0
  972. package/dist/modules/forms/runner/FormRunner.js.map +7 -0
  973. package/dist/modules/forms/runner/MatrixField.js +150 -0
  974. package/dist/modules/forms/runner/MatrixField.js.map +7 -0
  975. package/dist/modules/forms/runner/RankingField.js +131 -0
  976. package/dist/modules/forms/runner/RankingField.js.map +7 -0
  977. package/dist/modules/forms/runner/ScaleField.js +78 -0
  978. package/dist/modules/forms/runner/ScaleField.js.map +7 -0
  979. package/dist/modules/forms/runner/SignatureField.js +132 -0
  980. package/dist/modules/forms/runner/SignatureField.js.map +7 -0
  981. package/dist/modules/forms/runner/tamper-check.js +85 -0
  982. package/dist/modules/forms/runner/tamper-check.js.map +7 -0
  983. package/dist/modules/forms/schema/address-countries.js +43 -0
  984. package/dist/modules/forms/schema/address-countries.js.map +7 -0
  985. package/dist/modules/forms/schema/field-type-patterns.js +15 -0
  986. package/dist/modules/forms/schema/field-type-patterns.js.map +7 -0
  987. package/dist/modules/forms/schema/field-type-registry-advanced.js +32 -0
  988. package/dist/modules/forms/schema/field-type-registry-advanced.js.map +7 -0
  989. package/dist/modules/forms/schema/field-type-registry.js +625 -0
  990. package/dist/modules/forms/schema/field-type-registry.js.map +7 -0
  991. package/dist/modules/forms/schema/file-field.js +64 -0
  992. package/dist/modules/forms/schema/file-field.js.map +7 -0
  993. package/dist/modules/forms/schema/group-field.js +143 -0
  994. package/dist/modules/forms/schema/group-field.js.map +7 -0
  995. package/dist/modules/forms/schema/jsonlogic-grammar.js +66 -0
  996. package/dist/modules/forms/schema/jsonlogic-grammar.js.map +7 -0
  997. package/dist/modules/forms/schema/jsonschema-extensions.js +739 -0
  998. package/dist/modules/forms/schema/jsonschema-extensions.js.map +7 -0
  999. package/dist/modules/forms/schema/layout-catalog.js +38 -0
  1000. package/dist/modules/forms/schema/layout-catalog.js.map +7 -0
  1001. package/dist/modules/forms/schema/signature-field.js +67 -0
  1002. package/dist/modules/forms/schema/signature-field.js.map +7 -0
  1003. package/dist/modules/forms/schema/style-extensions.js +77 -0
  1004. package/dist/modules/forms/schema/style-extensions.js.map +7 -0
  1005. package/dist/modules/forms/schema/style-validators.js +181 -0
  1006. package/dist/modules/forms/schema/style-validators.js.map +7 -0
  1007. package/dist/modules/forms/services/access-audit-logger.js +179 -0
  1008. package/dist/modules/forms/services/access-audit-logger.js.map +7 -0
  1009. package/dist/modules/forms/services/analytics-service.js +306 -0
  1010. package/dist/modules/forms/services/analytics-service.js.map +7 -0
  1011. package/dist/modules/forms/services/anonymize-service.js +123 -0
  1012. package/dist/modules/forms/services/anonymize-service.js.map +7 -0
  1013. package/dist/modules/forms/services/attachment-service.js +123 -0
  1014. package/dist/modules/forms/services/attachment-service.js.map +7 -0
  1015. package/dist/modules/forms/services/captcha-verifier.js +76 -0
  1016. package/dist/modules/forms/services/captcha-verifier.js.map +7 -0
  1017. package/dist/modules/forms/services/consent-record-service.js +96 -0
  1018. package/dist/modules/forms/services/consent-record-service.js.map +7 -0
  1019. package/dist/modules/forms/services/distribution-service.js +366 -0
  1020. package/dist/modules/forms/services/distribution-service.js.map +7 -0
  1021. package/dist/modules/forms/services/distribution-token.js +93 -0
  1022. package/dist/modules/forms/services/distribution-token.js.map +7 -0
  1023. package/dist/modules/forms/services/encryption-service.js +328 -0
  1024. package/dist/modules/forms/services/encryption-service.js.map +7 -0
  1025. package/dist/modules/forms/services/export-service.js +210 -0
  1026. package/dist/modules/forms/services/export-service.js.map +7 -0
  1027. package/dist/modules/forms/services/field-validation-service.js +168 -0
  1028. package/dist/modules/forms/services/field-validation-service.js.map +7 -0
  1029. package/dist/modules/forms/services/form-logic-evaluator.js +517 -0
  1030. package/dist/modules/forms/services/form-logic-evaluator.js.map +7 -0
  1031. package/dist/modules/forms/services/form-version-compiler.js +518 -0
  1032. package/dist/modules/forms/services/form-version-compiler.js.map +7 -0
  1033. package/dist/modules/forms/services/form-version-differ.js +89 -0
  1034. package/dist/modules/forms/services/form-version-differ.js.map +7 -0
  1035. package/dist/modules/forms/services/jsonlogic-evaluator.js +171 -0
  1036. package/dist/modules/forms/services/jsonlogic-evaluator.js.map +7 -0
  1037. package/dist/modules/forms/services/pdf-snapshot-service.js +526 -0
  1038. package/dist/modules/forms/services/pdf-snapshot-service.js.map +7 -0
  1039. package/dist/modules/forms/services/prefill-resolver.js +53 -0
  1040. package/dist/modules/forms/services/prefill-resolver.js.map +7 -0
  1041. package/dist/modules/forms/services/role-policy-service.js +55 -0
  1042. package/dist/modules/forms/services/role-policy-service.js.map +7 -0
  1043. package/dist/modules/forms/services/style-compiler.js +234 -0
  1044. package/dist/modules/forms/services/style-compiler.js.map +7 -0
  1045. package/dist/modules/forms/services/submission-service.js +858 -0
  1046. package/dist/modules/forms/services/submission-service.js.map +7 -0
  1047. package/dist/modules/forms/services/upload-scanner.js +9 -0
  1048. package/dist/modules/forms/services/upload-scanner.js.map +7 -0
  1049. package/dist/modules/forms/services/upload-validation.js +54 -0
  1050. package/dist/modules/forms/services/upload-validation.js.map +7 -0
  1051. package/dist/modules/forms/services/visibility-resolver.js +30 -0
  1052. package/dist/modules/forms/services/visibility-resolver.js.map +7 -0
  1053. package/dist/modules/forms/setup.js +18 -0
  1054. package/dist/modules/forms/setup.js.map +7 -0
  1055. package/dist/modules/forms/subscribers/forms-consent-projector.js +58 -0
  1056. package/dist/modules/forms/subscribers/forms-consent-projector.js.map +7 -0
  1057. package/dist/modules/forms/subscribers/forms-pdf-snapshot.js +68 -0
  1058. package/dist/modules/forms/subscribers/forms-pdf-snapshot.js.map +7 -0
  1059. package/dist/modules/forms/subscribers/forms-webhook-bridge-anonymized.js +29 -0
  1060. package/dist/modules/forms/subscribers/forms-webhook-bridge-anonymized.js.map +7 -0
  1061. package/dist/modules/forms/subscribers/forms-webhook-bridge.js +35 -0
  1062. package/dist/modules/forms/subscribers/forms-webhook-bridge.js.map +7 -0
  1063. package/dist/modules/forms/subscribers/invitation-email.js +100 -0
  1064. package/dist/modules/forms/subscribers/invitation-email.js.map +7 -0
  1065. package/dist/modules/forms/translations.js +10 -0
  1066. package/dist/modules/forms/translations.js.map +7 -0
  1067. package/dist/modules/forms/ui/admin/forms/[id]/distributions/CreateDistributionDialog.js +376 -0
  1068. package/dist/modules/forms/ui/admin/forms/[id]/distributions/CreateDistributionDialog.js.map +7 -0
  1069. package/dist/modules/forms/ui/admin/forms/[id]/distributions/DistributionsPanel.js +313 -0
  1070. package/dist/modules/forms/ui/admin/forms/[id]/distributions/DistributionsPanel.js.map +7 -0
  1071. package/dist/modules/forms/ui/admin/forms/[id]/distributions/EmbedSettingsDialog.js +263 -0
  1072. package/dist/modules/forms/ui/admin/forms/[id]/distributions/EmbedSettingsDialog.js.map +7 -0
  1073. package/dist/modules/forms/ui/admin/forms/[id]/distributions/RecipientsTable.js +373 -0
  1074. package/dist/modules/forms/ui/admin/forms/[id]/distributions/RecipientsTable.js.map +7 -0
  1075. package/dist/modules/forms/ui/public/EmbeddedForm.js +166 -0
  1076. package/dist/modules/forms/ui/public/EmbeddedForm.js.map +7 -0
  1077. package/dist/modules/forms/ui/public/FormRunner.js +359 -0
  1078. package/dist/modules/forms/ui/public/FormRunner.js.map +7 -0
  1079. package/dist/modules/forms/ui/public/FormTrigger.js +45 -0
  1080. package/dist/modules/forms/ui/public/FormTrigger.js.map +7 -0
  1081. package/dist/modules/forms/ui/public/PublicFormRunnerPage.js +14 -0
  1082. package/dist/modules/forms/ui/public/PublicFormRunnerPage.js.map +7 -0
  1083. package/dist/modules/forms/ui/public/components/CompletionScreen.js +55 -0
  1084. package/dist/modules/forms/ui/public/components/CompletionScreen.js.map +7 -0
  1085. package/dist/modules/forms/ui/public/components/LocaleSwitch.js +28 -0
  1086. package/dist/modules/forms/ui/public/components/LocaleSwitch.js.map +7 -0
  1087. package/dist/modules/forms/ui/public/components/ResumeGate.js +52 -0
  1088. package/dist/modules/forms/ui/public/components/ResumeGate.js.map +7 -0
  1089. package/dist/modules/forms/ui/public/components/ReviewStep.js +90 -0
  1090. package/dist/modules/forms/ui/public/components/ReviewStep.js.map +7 -0
  1091. package/dist/modules/forms/ui/public/components/SaveIndicator.js +65 -0
  1092. package/dist/modules/forms/ui/public/components/SaveIndicator.js.map +7 -0
  1093. package/dist/modules/forms/ui/public/components/SectionStepper.js +52 -0
  1094. package/dist/modules/forms/ui/public/components/SectionStepper.js.map +7 -0
  1095. package/dist/modules/forms/ui/public/index.js +38 -0
  1096. package/dist/modules/forms/ui/public/index.js.map +7 -0
  1097. package/dist/modules/forms/ui/public/renderers/index.js +737 -0
  1098. package/dist/modules/forms/ui/public/renderers/index.js.map +7 -0
  1099. package/dist/modules/forms/ui/public/state/logic-derivation.js +42 -0
  1100. package/dist/modules/forms/ui/public/state/logic-derivation.js.map +7 -0
  1101. package/dist/modules/forms/ui/public/state/runtime-client.js +306 -0
  1102. package/dist/modules/forms/ui/public/state/runtime-client.js.map +7 -0
  1103. package/dist/modules/forms/ui/public/state/useAutosave.js +64 -0
  1104. package/dist/modules/forms/ui/public/state/useAutosave.js.map +7 -0
  1105. package/dist/modules/forms/ui/public/state/useFormRunner.js +394 -0
  1106. package/dist/modules/forms/ui/public/state/useFormRunner.js.map +7 -0
  1107. package/dist/modules/forms/ui/public/style/LogoHeader.js +33 -0
  1108. package/dist/modules/forms/ui/public/style/LogoHeader.js.map +7 -0
  1109. package/dist/modules/forms/ui/public/style/applyStyle.js +12 -0
  1110. package/dist/modules/forms/ui/public/style/applyStyle.js.map +7 -0
  1111. package/dist/modules/forms/ui/public/types.js +18 -0
  1112. package/dist/modules/forms/ui/public/types.js.map +7 -0
  1113. package/dist/modules/forms/widgets/injection/access-audit-panel/widget.js +100 -0
  1114. package/dist/modules/forms/widgets/injection/access-audit-panel/widget.js.map +7 -0
  1115. package/dist/modules/forms/widgets/injection/anonymize-button/widget.js +148 -0
  1116. package/dist/modules/forms/widgets/injection/anonymize-button/widget.js.map +7 -0
  1117. package/dist/modules/forms/widgets/injection/audit-format.js +33 -0
  1118. package/dist/modules/forms/widgets/injection/audit-format.js.map +7 -0
  1119. package/dist/modules/forms/widgets/injection/context.js +5 -0
  1120. package/dist/modules/forms/widgets/injection/context.js.map +7 -0
  1121. package/dist/modules/forms/widgets/injection/embedded-form/widget.js +52 -0
  1122. package/dist/modules/forms/widgets/injection/embedded-form/widget.js.map +7 -0
  1123. package/dist/modules/forms/widgets/injection/pdf-download-button/widget.js +83 -0
  1124. package/dist/modules/forms/widgets/injection/pdf-download-button/widget.js.map +7 -0
  1125. package/dist/modules/forms/widgets/injection/self-audit-footer/widget.js +38 -0
  1126. package/dist/modules/forms/widgets/injection/self-audit-footer/widget.js.map +7 -0
  1127. package/dist/modules/forms/widgets/injection-table.js +32 -0
  1128. package/dist/modules/forms/widgets/injection-table.js.map +7 -0
  1129. package/dist/modules/forms/workers/pdf-snapshot.js +60 -0
  1130. package/dist/modules/forms/workers/pdf-snapshot.js.map +7 -0
  1131. package/dist/modules/forms/workers/retention-purge.js +112 -0
  1132. package/dist/modules/forms/workers/retention-purge.js.map +7 -0
  1133. package/dist/modules/inbox_ops/api/proposals/[id]/actions/[actionId]/route.js +7 -1
  1134. package/dist/modules/inbox_ops/api/proposals/[id]/actions/[actionId]/route.js.map +2 -2
  1135. package/dist/modules/inbox_ops/data/validators.js +2 -2
  1136. package/dist/modules/inbox_ops/data/validators.js.map +2 -2
  1137. package/dist/modules/inbox_ops/lib/llmProvider.js +5 -1
  1138. package/dist/modules/inbox_ops/lib/llmProvider.js.map +2 -2
  1139. package/dist/modules/inbox_ops/widgets/notifications/ProposalCreatedRenderer.js +2 -2
  1140. package/dist/modules/inbox_ops/widgets/notifications/ProposalCreatedRenderer.js.map +2 -2
  1141. package/dist/modules/integrations/di.js +3 -1
  1142. package/dist/modules/integrations/di.js.map +2 -2
  1143. package/dist/modules/integrations/lib/credentials-service.js +29 -36
  1144. package/dist/modules/integrations/lib/credentials-service.js.map +2 -2
  1145. package/dist/modules/messages/api/[id]/attachments/route.js +7 -3
  1146. package/dist/modules/messages/api/[id]/attachments/route.js.map +2 -2
  1147. package/dist/modules/messages/api/[id]/forward-preview/route.js +4 -3
  1148. package/dist/modules/messages/api/[id]/forward-preview/route.js.map +2 -2
  1149. package/dist/modules/messages/api/[id]/route.js +29 -3
  1150. package/dist/modules/messages/api/[id]/route.js.map +2 -2
  1151. package/dist/modules/messages/api/route.js +91 -2
  1152. package/dist/modules/messages/api/route.js.map +2 -2
  1153. package/dist/modules/messages/commands/messages.js +40 -6
  1154. package/dist/modules/messages/commands/messages.js.map +2 -2
  1155. package/dist/modules/messages/components/ComposeMessagePageClient.js +24 -1
  1156. package/dist/modules/messages/components/ComposeMessagePageClient.js.map +2 -2
  1157. package/dist/modules/messages/data/validators.js +11 -1
  1158. package/dist/modules/messages/data/validators.js.map +2 -2
  1159. package/dist/modules/messages/lib/channelThreadAccess.js +30 -0
  1160. package/dist/modules/messages/lib/channelThreadAccess.js.map +7 -0
  1161. package/dist/modules/messages/lib/composeSenderDelegation.js +87 -0
  1162. package/dist/modules/messages/lib/composeSenderDelegation.js.map +7 -0
  1163. package/dist/modules/messages/lib/composeSenderOptions.js +24 -0
  1164. package/dist/modules/messages/lib/composeSenderOptions.js.map +7 -0
  1165. package/dist/modules/messages/lib/email-sender.js +1 -11
  1166. package/dist/modules/messages/lib/email-sender.js.map +2 -2
  1167. package/dist/modules/messages/lib/forwarding.js +4 -4
  1168. package/dist/modules/messages/lib/forwarding.js.map +2 -2
  1169. package/dist/modules/messages/lib/markdownEmailBody.js +15 -0
  1170. package/dist/modules/messages/lib/markdownEmailBody.js.map +7 -0
  1171. package/dist/modules/messages/lib/messageSourceEntityTypes.js +7 -0
  1172. package/dist/modules/messages/lib/messageSourceEntityTypes.js.map +7 -0
  1173. package/dist/modules/messages/lib/routeHelpers.js +43 -0
  1174. package/dist/modules/messages/lib/routeHelpers.js.map +2 -2
  1175. package/dist/modules/messages/subscribers/message-notification.js +30 -1
  1176. package/dist/modules/messages/subscribers/message-notification.js.map +2 -2
  1177. package/dist/modules/notifications/api/[id]/action/route.js +2 -1
  1178. package/dist/modules/notifications/api/[id]/action/route.js.map +2 -2
  1179. package/dist/modules/notifications/api/openapi.js +2 -1
  1180. package/dist/modules/notifications/api/openapi.js.map +2 -2
  1181. package/dist/modules/notifications/frontend/NotificationSettingsPageClient.js +47 -28
  1182. package/dist/modules/notifications/frontend/NotificationSettingsPageClient.js.map +2 -2
  1183. package/dist/modules/notifications/lib/deliveryConfig.js +27 -2
  1184. package/dist/modules/notifications/lib/deliveryConfig.js.map +2 -2
  1185. package/dist/modules/notifications/lib/notificationMapper.js +3 -1
  1186. package/dist/modules/notifications/lib/notificationMapper.js.map +2 -2
  1187. package/dist/modules/notifications/lib/safeHref.js +4 -0
  1188. package/dist/modules/notifications/lib/safeHref.js.map +2 -2
  1189. package/dist/modules/planner/api/availability-date-specific.js +2 -1
  1190. package/dist/modules/planner/api/availability-date-specific.js.map +2 -2
  1191. package/dist/modules/planner/api/availability-weekly.js +2 -1
  1192. package/dist/modules/planner/api/availability-weekly.js.map +2 -2
  1193. package/dist/modules/progress/api/active/route.js +14 -2
  1194. package/dist/modules/progress/api/active/route.js.map +2 -2
  1195. package/dist/modules/progress/api/jobs/[id]/route.js +38 -22
  1196. package/dist/modules/progress/api/jobs/[id]/route.js.map +2 -2
  1197. package/dist/modules/progress/api/jobs/route.js +20 -6
  1198. package/dist/modules/progress/api/jobs/route.js.map +2 -2
  1199. package/dist/modules/progress/api/requestScope.js +32 -0
  1200. package/dist/modules/progress/api/requestScope.js.map +7 -0
  1201. package/dist/modules/progress/lib/organizationScope.js +10 -0
  1202. package/dist/modules/progress/lib/organizationScope.js.map +7 -0
  1203. package/dist/modules/progress/lib/progressService.js.map +2 -2
  1204. package/dist/modules/progress/lib/progressServiceImpl.js +48 -15
  1205. package/dist/modules/progress/lib/progressServiceImpl.js.map +2 -2
  1206. package/dist/modules/push_notifications/api/custom-send/route.js +4 -1
  1207. package/dist/modules/push_notifications/api/custom-send/route.js.map +2 -2
  1208. package/dist/modules/query_index/api/status.js +5 -3
  1209. package/dist/modules/query_index/api/status.js.map +2 -2
  1210. package/dist/modules/query_index/di.js +2 -1
  1211. package/dist/modules/query_index/di.js.map +2 -2
  1212. package/dist/modules/query_index/lib/engine.js +2 -1
  1213. package/dist/modules/query_index/lib/engine.js.map +2 -2
  1214. package/dist/modules/query_index/lib/request-encryption.js +16 -0
  1215. package/dist/modules/query_index/lib/request-encryption.js.map +7 -0
  1216. package/dist/modules/query_index/lib/search-tokens.js +31 -1
  1217. package/dist/modules/query_index/lib/search-tokens.js.map +2 -2
  1218. package/dist/modules/resources/api/resources/tags/assign/route.js +2 -1
  1219. package/dist/modules/resources/api/resources/tags/assign/route.js.map +2 -2
  1220. package/dist/modules/resources/api/resources/tags/unassign/route.js +2 -1
  1221. package/dist/modules/resources/api/resources/tags/unassign/route.js.map +2 -2
  1222. package/dist/modules/resources/commands/activities.js +2 -2
  1223. package/dist/modules/resources/commands/activities.js.map +2 -2
  1224. package/dist/modules/sales/api/document-history/route.js +5 -1
  1225. package/dist/modules/sales/api/document-history/route.js.map +2 -2
  1226. package/dist/modules/sales/api/document-numbers/route.js +2 -1
  1227. package/dist/modules/sales/api/document-numbers/route.js.map +2 -2
  1228. package/dist/modules/sales/api/quotes/convert/route.js +2 -1
  1229. package/dist/modules/sales/api/quotes/convert/route.js.map +2 -2
  1230. package/dist/modules/sales/api/quotes/send/route.js +2 -1
  1231. package/dist/modules/sales/api/quotes/send/route.js.map +2 -2
  1232. package/dist/modules/sales/api/settings/document-numbers/route.js +7 -1
  1233. package/dist/modules/sales/api/settings/document-numbers/route.js.map +2 -2
  1234. package/dist/modules/sales/api/settings/order-editing/route.js +7 -1
  1235. package/dist/modules/sales/api/settings/order-editing/route.js.map +2 -2
  1236. package/dist/modules/sales/commands/documents.js +354 -138
  1237. package/dist/modules/sales/commands/documents.js.map +3 -3
  1238. package/dist/modules/sales/commands/payments.js +2 -1
  1239. package/dist/modules/sales/commands/payments.js.map +2 -2
  1240. package/dist/modules/sales/commands/settings.js +25 -5
  1241. package/dist/modules/sales/commands/settings.js.map +2 -2
  1242. package/dist/modules/sales/commands/shipments.js +2 -1
  1243. package/dist/modules/sales/commands/shipments.js.map +2 -2
  1244. package/dist/modules/sales/components/DocumentNumberSettings.js +32 -21
  1245. package/dist/modules/sales/components/DocumentNumberSettings.js.map +2 -2
  1246. package/dist/modules/sales/components/documents/ItemsSection.js +49 -11
  1247. package/dist/modules/sales/components/documents/ItemsSection.js.map +2 -2
  1248. package/dist/modules/sales/lib/lineSnapshots.js +19 -0
  1249. package/dist/modules/sales/lib/lineSnapshots.js.map +2 -2
  1250. package/dist/modules/sales/setup.js +4 -4
  1251. package/dist/modules/sales/setup.js.map +2 -2
  1252. package/dist/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.js +2 -2
  1253. package/dist/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.js.map +2 -2
  1254. package/dist/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.js +2 -2
  1255. package/dist/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.js.map +2 -2
  1256. package/dist/modules/staff/api/leave-requests/accept/route.js +2 -1
  1257. package/dist/modules/staff/api/leave-requests/accept/route.js.map +2 -2
  1258. package/dist/modules/staff/api/leave-requests/reject/route.js +2 -1
  1259. package/dist/modules/staff/api/leave-requests/reject/route.js.map +2 -2
  1260. package/dist/modules/staff/api/leave-requests.js +2 -1
  1261. package/dist/modules/staff/api/leave-requests.js.map +2 -2
  1262. package/dist/modules/staff/api/team-members/self/route.js +2 -1
  1263. package/dist/modules/staff/api/team-members/self/route.js.map +2 -2
  1264. package/dist/modules/staff/api/team-members/tags/assign/route.js +2 -1
  1265. package/dist/modules/staff/api/team-members/tags/assign/route.js.map +2 -2
  1266. package/dist/modules/staff/api/team-members/tags/unassign/route.js +2 -1
  1267. package/dist/modules/staff/api/team-members/tags/unassign/route.js.map +2 -2
  1268. package/dist/modules/staff/api/timesheets/_shared/withTimesheetInterceptors.js +12 -11
  1269. package/dist/modules/staff/api/timesheets/_shared/withTimesheetInterceptors.js.map +2 -2
  1270. package/dist/modules/staff/api/timesheets/my-projects/[projectId]/route.js +2 -1
  1271. package/dist/modules/staff/api/timesheets/my-projects/[projectId]/route.js.map +2 -2
  1272. package/dist/modules/staff/api/timesheets/my-projects/route.js +2 -1
  1273. package/dist/modules/staff/api/timesheets/my-projects/route.js.map +2 -2
  1274. package/dist/modules/staff/api/timesheets/my-work/route.js +2 -1
  1275. package/dist/modules/staff/api/timesheets/my-work/route.js.map +2 -2
  1276. package/dist/modules/staff/api/timesheets/projects/kpis/route.js +2 -1
  1277. package/dist/modules/staff/api/timesheets/projects/kpis/route.js.map +2 -2
  1278. package/dist/modules/staff/api/timesheets/reports/[id]/close/route.js +2 -1
  1279. package/dist/modules/staff/api/timesheets/reports/[id]/close/route.js.map +2 -2
  1280. package/dist/modules/staff/api/timesheets/reports/[id]/export/route.js +3 -2
  1281. package/dist/modules/staff/api/timesheets/reports/[id]/export/route.js.map +2 -2
  1282. package/dist/modules/staff/api/timesheets/reports/[id]/sheet/route.js +3 -2
  1283. package/dist/modules/staff/api/timesheets/reports/[id]/sheet/route.js.map +2 -2
  1284. package/dist/modules/staff/api/timesheets/reports/[id]/unlock/route.js +3 -2
  1285. package/dist/modules/staff/api/timesheets/reports/[id]/unlock/route.js.map +2 -2
  1286. package/dist/modules/staff/api/timesheets/reports/preview/route.js +2 -1
  1287. package/dist/modules/staff/api/timesheets/reports/preview/route.js.map +2 -2
  1288. package/dist/modules/staff/api/timesheets/reports/shared.js +2 -1
  1289. package/dist/modules/staff/api/timesheets/reports/shared.js.map +2 -2
  1290. package/dist/modules/staff/api/timesheets/settings/reapply-rounding/route.js +2 -1
  1291. package/dist/modules/staff/api/timesheets/settings/reapply-rounding/route.js.map +2 -2
  1292. package/dist/modules/staff/api/timesheets/tags/entry-assignments/route.js +2 -1
  1293. package/dist/modules/staff/api/timesheets/tags/entry-assignments/route.js.map +2 -2
  1294. package/dist/modules/staff/api/timesheets/tags/task-assignments/route.js +2 -1
  1295. package/dist/modules/staff/api/timesheets/tags/task-assignments/route.js.map +2 -2
  1296. package/dist/modules/staff/api/timesheets/tasks/[id]/comments/route.js +2 -1
  1297. package/dist/modules/staff/api/timesheets/tasks/[id]/comments/route.js.map +2 -2
  1298. package/dist/modules/staff/api/timesheets/tasks/[id]/status/route.js +2 -1
  1299. package/dist/modules/staff/api/timesheets/tasks/[id]/status/route.js.map +2 -2
  1300. package/dist/modules/staff/api/timesheets/time-entries/[id]/duplicate/route.js +3 -2
  1301. package/dist/modules/staff/api/timesheets/time-entries/[id]/duplicate/route.js.map +2 -2
  1302. package/dist/modules/staff/api/timesheets/time-entries/[id]/segments/[segmentId]/route.js +2 -1
  1303. package/dist/modules/staff/api/timesheets/time-entries/[id]/segments/[segmentId]/route.js.map +2 -2
  1304. package/dist/modules/staff/api/timesheets/time-entries/[id]/segments/route.js +2 -1
  1305. package/dist/modules/staff/api/timesheets/time-entries/[id]/segments/route.js.map +2 -2
  1306. package/dist/modules/staff/api/timesheets/time-entries/[id]/timer-start/route.js +2 -1
  1307. package/dist/modules/staff/api/timesheets/time-entries/[id]/timer-start/route.js.map +2 -2
  1308. package/dist/modules/staff/api/timesheets/time-entries/[id]/timer-stop/route.js +2 -1
  1309. package/dist/modules/staff/api/timesheets/time-entries/[id]/timer-stop/route.js.map +2 -2
  1310. package/dist/modules/staff/api/timesheets/time-entries/bulk/route.js +2 -1
  1311. package/dist/modules/staff/api/timesheets/time-entries/bulk/route.js.map +2 -2
  1312. package/dist/modules/staff/api/timesheets/time-entries/copy-day/route.js +3 -2
  1313. package/dist/modules/staff/api/timesheets/time-entries/copy-day/route.js.map +2 -2
  1314. package/dist/modules/staff/api/timesheets/time-entries/overlaps/route.js +2 -1
  1315. package/dist/modules/staff/api/timesheets/time-entries/overlaps/route.js.map +2 -2
  1316. package/dist/modules/staff/api/timesheets/time-entries/start-timer/route.js +3 -2
  1317. package/dist/modules/staff/api/timesheets/time-entries/start-timer/route.js.map +2 -2
  1318. package/dist/modules/staff/api/timesheets/time-projects/[id]/change-currency/route.js +3 -2
  1319. package/dist/modules/staff/api/timesheets/time-projects/[id]/change-currency/route.js.map +2 -2
  1320. package/dist/modules/staff/api/timesheets/time-projects/route.js +2 -1
  1321. package/dist/modules/staff/api/timesheets/time-projects/route.js.map +2 -2
  1322. package/dist/modules/staff/commands/activities.js +2 -2
  1323. package/dist/modules/staff/commands/activities.js.map +2 -2
  1324. package/dist/modules/staff/commands/timesheets-entries.js.map +2 -2
  1325. package/dist/modules/staff/commands/timesheets-reports.js +55 -14
  1326. package/dist/modules/staff/commands/timesheets-reports.js.map +2 -2
  1327. package/dist/modules/staff/lib/timesheets-reports/buildReportSheet.js +2 -1
  1328. package/dist/modules/staff/lib/timesheets-reports/buildReportSheet.js.map +2 -2
  1329. package/dist/modules/staff/lib/timesheets-reports/loadReportData.js +32 -3
  1330. package/dist/modules/staff/lib/timesheets-reports/loadReportData.js.map +2 -2
  1331. package/dist/modules/staff/lib/timesheets-reports/reportPeriod.js +16 -0
  1332. package/dist/modules/staff/lib/timesheets-reports/reportPeriod.js.map +7 -0
  1333. package/dist/modules/staff/lib/timesheets-ui/CalendarPicker.js +15 -10
  1334. package/dist/modules/staff/lib/timesheets-ui/CalendarPicker.js.map +2 -2
  1335. package/dist/modules/sync_excel/api/import/route.js +35 -12
  1336. package/dist/modules/sync_excel/api/import/route.js.map +2 -2
  1337. package/dist/modules/sync_excel/api/upload/route.js +29 -4
  1338. package/dist/modules/sync_excel/api/upload/route.js.map +2 -2
  1339. package/dist/modules/translations/api/context.js +2 -1
  1340. package/dist/modules/translations/api/context.js.map +2 -2
  1341. package/dist/modules/warranty_claims/api/ai/assess/route.js +2 -1
  1342. package/dist/modules/warranty_claims/api/ai/assess/route.js.map +2 -2
  1343. package/dist/modules/warranty_claims/api/ai/draft-reply/route.js +2 -1
  1344. package/dist/modules/warranty_claims/api/ai/draft-reply/route.js.map +2 -2
  1345. package/dist/modules/warranty_claims/api/ai/suggest/route.js +2 -1
  1346. package/dist/modules/warranty_claims/api/ai/suggest/route.js.map +2 -2
  1347. package/dist/modules/warranty_claims/api/assign/route.js +2 -1
  1348. package/dist/modules/warranty_claims/api/assign/route.js.map +2 -2
  1349. package/dist/modules/warranty_claims/api/credit-memo/route.js +2 -1
  1350. package/dist/modules/warranty_claims/api/credit-memo/route.js.map +2 -2
  1351. package/dist/modules/warranty_claims/api/entitlement/route.js +2 -1
  1352. package/dist/modules/warranty_claims/api/entitlement/route.js.map +2 -2
  1353. package/dist/modules/warranty_claims/api/events/route.js +2 -1
  1354. package/dist/modules/warranty_claims/api/events/route.js.map +2 -2
  1355. package/dist/modules/warranty_claims/api/external/claims/route.js +2 -1
  1356. package/dist/modules/warranty_claims/api/external/claims/route.js.map +2 -2
  1357. package/dist/modules/warranty_claims/api/receiving/route.js +2 -1
  1358. package/dist/modules/warranty_claims/api/receiving/route.js.map +2 -2
  1359. package/dist/modules/warranty_claims/api/replacement-order/route.js +2 -1
  1360. package/dist/modules/warranty_claims/api/replacement-order/route.js.map +2 -2
  1361. package/dist/modules/warranty_claims/api/return-label/route.js +2 -1
  1362. package/dist/modules/warranty_claims/api/return-label/route.js.map +2 -2
  1363. package/dist/modules/warranty_claims/api/risk/route.js +2 -1
  1364. package/dist/modules/warranty_claims/api/risk/route.js.map +2 -2
  1365. package/dist/modules/warranty_claims/api/sales-return/route.js +2 -1
  1366. package/dist/modules/warranty_claims/api/sales-return/route.js.map +2 -2
  1367. package/dist/modules/warranty_claims/api/settings-general/route.js +2 -1
  1368. package/dist/modules/warranty_claims/api/settings-general/route.js.map +2 -2
  1369. package/dist/modules/warranty_claims/api/stats/route.js +9 -5
  1370. package/dist/modules/warranty_claims/api/stats/route.js.map +2 -2
  1371. package/dist/modules/warranty_claims/api/submit/route.js +2 -1
  1372. package/dist/modules/warranty_claims/api/submit/route.js.map +2 -2
  1373. package/dist/modules/warranty_claims/api/transition/route.js +2 -1
  1374. package/dist/modules/warranty_claims/api/transition/route.js.map +2 -2
  1375. package/dist/modules/warranty_claims/api/vendor-recovery/route.js +2 -1
  1376. package/dist/modules/warranty_claims/api/vendor-recovery/route.js.map +2 -2
  1377. package/dist/modules/warranty_claims/api/vendor-recovery-suggestions/route.js +2 -1
  1378. package/dist/modules/warranty_claims/api/vendor-recovery-suggestions/route.js.map +2 -2
  1379. package/dist/modules/warranty_claims/widgets/notifications/WarrantyClaimNotificationRenderer.js +1 -1
  1380. package/dist/modules/warranty_claims/widgets/notifications/WarrantyClaimNotificationRenderer.js.map +2 -2
  1381. package/dist/modules/wms/api/dashboard/operational/route.js +2 -1
  1382. package/dist/modules/wms/api/dashboard/operational/route.js.map +2 -2
  1383. package/dist/modules/wms/api/inventory/cycle-count/route.js +1 -0
  1384. package/dist/modules/wms/api/inventory/cycle-count/route.js.map +2 -2
  1385. package/dist/modules/wms/api/inventory/helpers.js +2 -1
  1386. package/dist/modules/wms/api/inventory/helpers.js.map +2 -2
  1387. package/dist/modules/wms/api/inventory/import/helpers.js +2 -1
  1388. package/dist/modules/wms/api/inventory/import/helpers.js.map +2 -2
  1389. package/dist/modules/wms/api/sales-orders/[salesOrderId]/warehouse-assignment/route.js +2 -1
  1390. package/dist/modules/wms/api/sales-orders/[salesOrderId]/warehouse-assignment/route.js.map +2 -2
  1391. package/dist/modules/wms/commands/inventory-actions.js +39 -1
  1392. package/dist/modules/wms/commands/inventory-actions.js.map +2 -2
  1393. package/dist/modules/wms/components/backend/CycleCountWizardDialog.js +14 -1
  1394. package/dist/modules/wms/components/backend/CycleCountWizardDialog.js.map +2 -2
  1395. package/dist/modules/wms/di.js +5 -0
  1396. package/dist/modules/wms/di.js.map +2 -2
  1397. package/dist/modules/wms/lib/availabilityCache.js +86 -0
  1398. package/dist/modules/wms/lib/availabilityCache.js.map +7 -0
  1399. package/dist/modules/wms/lib/availabilityCalculation.js +212 -0
  1400. package/dist/modules/wms/lib/availabilityCalculation.js.map +7 -0
  1401. package/dist/modules/wms/lib/availabilityProvider.js +24 -0
  1402. package/dist/modules/wms/lib/availabilityProvider.js.map +7 -0
  1403. package/dist/modules/wms/lib/loadOperationalDashboard.js +42 -5
  1404. package/dist/modules/wms/lib/loadOperationalDashboard.js.map +2 -2
  1405. package/dist/modules/wms/lib/lowStockBalanceFilter.js +23 -10
  1406. package/dist/modules/wms/lib/lowStockBalanceFilter.js.map +2 -2
  1407. package/dist/modules/wms/lib/sqlInClause.js +9 -0
  1408. package/dist/modules/wms/lib/sqlInClause.js.map +7 -0
  1409. package/dist/modules/wms/lib/tryResolve.js +11 -0
  1410. package/dist/modules/wms/lib/tryResolve.js.map +7 -0
  1411. package/dist/modules/wms/subscribers/invalidate-availability-cache-policy.js +14 -0
  1412. package/dist/modules/wms/subscribers/invalidate-availability-cache-policy.js.map +7 -0
  1413. package/dist/modules/wms/subscribers/invalidate-availability-cache-profile.js +14 -0
  1414. package/dist/modules/wms/subscribers/invalidate-availability-cache-profile.js.map +7 -0
  1415. package/dist/modules/wms/subscribers/invalidate-availability-cache.js +16 -0
  1416. package/dist/modules/wms/subscribers/invalidate-availability-cache.js.map +7 -0
  1417. package/dist/modules/wms/widgets/notifications/WmsLowStockRenderer.js +2 -2
  1418. package/dist/modules/wms/widgets/notifications/WmsLowStockRenderer.js.map +2 -2
  1419. package/dist/modules/wms/widgets/notifications/WmsReservationShortfallRenderer.js +4 -3
  1420. package/dist/modules/wms/widgets/notifications/WmsReservationShortfallRenderer.js.map +2 -2
  1421. package/dist/modules/workflows/api/commands/route.js +4 -1
  1422. package/dist/modules/workflows/api/commands/route.js.map +2 -2
  1423. package/dist/modules/workflows/api/definitions/[id]/callers/route.js +4 -1
  1424. package/dist/modules/workflows/api/definitions/[id]/callers/route.js.map +2 -2
  1425. package/dist/modules/workflows/api/definitions/[id]/context-schema/route.js +4 -2
  1426. package/dist/modules/workflows/api/definitions/[id]/context-schema/route.js.map +2 -2
  1427. package/dist/modules/workflows/api/definitions/[id]/customize/route.js +4 -1
  1428. package/dist/modules/workflows/api/definitions/[id]/customize/route.js.map +2 -2
  1429. package/dist/modules/workflows/api/definitions/[id]/draft/route.js +6 -1
  1430. package/dist/modules/workflows/api/definitions/[id]/draft/route.js.map +2 -2
  1431. package/dist/modules/workflows/api/definitions/[id]/publish/route.js +6 -1
  1432. package/dist/modules/workflows/api/definitions/[id]/publish/route.js.map +2 -2
  1433. package/dist/modules/workflows/api/definitions/[id]/reset-to-code/route.js +4 -1
  1434. package/dist/modules/workflows/api/definitions/[id]/reset-to-code/route.js.map +2 -2
  1435. package/dist/modules/workflows/api/definitions/[id]/route.js +5 -3
  1436. package/dist/modules/workflows/api/definitions/[id]/route.js.map +2 -2
  1437. package/dist/modules/workflows/api/definitions/[id]/test-step/route.js +4 -2
  1438. package/dist/modules/workflows/api/definitions/[id]/test-step/route.js.map +2 -2
  1439. package/dist/modules/workflows/api/definitions/generate/route.js +4 -1
  1440. package/dist/modules/workflows/api/definitions/generate/route.js.map +2 -2
  1441. package/dist/modules/workflows/api/definitions/route.js +4 -2
  1442. package/dist/modules/workflows/api/definitions/route.js.map +2 -2
  1443. package/dist/modules/workflows/api/endpoints/route.js +4 -1
  1444. package/dist/modules/workflows/api/endpoints/route.js.map +2 -2
  1445. package/dist/modules/workflows/api/functions/route.js +4 -1
  1446. package/dist/modules/workflows/api/functions/route.js.map +2 -2
  1447. package/dist/modules/workflows/api/grantable-features/route.js +2 -1
  1448. package/dist/modules/workflows/api/grantable-features/route.js.map +2 -2
  1449. package/dist/modules/workflows/api/instances/[id]/advance/route.js +4 -1
  1450. package/dist/modules/workflows/api/instances/[id]/advance/route.js.map +2 -2
  1451. package/dist/modules/workflows/api/instances/[id]/cancel/route.js +4 -1
  1452. package/dist/modules/workflows/api/instances/[id]/cancel/route.js.map +2 -2
  1453. package/dist/modules/workflows/api/instances/[id]/context/route.js +2 -1
  1454. package/dist/modules/workflows/api/instances/[id]/context/route.js.map +2 -2
  1455. package/dist/modules/workflows/api/instances/[id]/rerun-step/route.js +4 -1
  1456. package/dist/modules/workflows/api/instances/[id]/rerun-step/route.js.map +2 -2
  1457. package/dist/modules/workflows/api/instances/[id]/retry/route.js +4 -1
  1458. package/dist/modules/workflows/api/instances/[id]/retry/route.js.map +2 -2
  1459. package/dist/modules/workflows/api/instances/[id]/signal/route.js +4 -1
  1460. package/dist/modules/workflows/api/instances/[id]/signal/route.js.map +2 -2
  1461. package/dist/modules/workflows/api/instances/[id]/step-through/route.js +4 -2
  1462. package/dist/modules/workflows/api/instances/[id]/step-through/route.js.map +2 -2
  1463. package/dist/modules/workflows/api/instances/route.js +4 -2
  1464. package/dist/modules/workflows/api/instances/route.js.map +2 -2
  1465. package/dist/modules/workflows/api/instances/validate-start/route.js +4 -1
  1466. package/dist/modules/workflows/api/instances/validate-start/route.js.map +2 -2
  1467. package/dist/modules/workflows/api/rule-usage/route.js +4 -1
  1468. package/dist/modules/workflows/api/rule-usage/route.js.map +2 -2
  1469. package/dist/modules/workflows/api/signals/route.js +4 -1
  1470. package/dist/modules/workflows/api/signals/route.js.map +2 -2
  1471. package/dist/modules/workflows/api/tasks/[id]/claim/route.js +4 -1
  1472. package/dist/modules/workflows/api/tasks/[id]/claim/route.js.map +2 -2
  1473. package/dist/modules/workflows/api/tasks/[id]/complete/route.js +4 -1
  1474. package/dist/modules/workflows/api/tasks/[id]/complete/route.js.map +2 -2
  1475. package/dist/modules/workflows/api/tasks/[id]/reassign/route.js +2 -1
  1476. package/dist/modules/workflows/api/tasks/[id]/reassign/route.js.map +2 -2
  1477. package/dist/modules/workflows/api/tasks/[id]/unclaim/route.js +4 -1
  1478. package/dist/modules/workflows/api/tasks/[id]/unclaim/route.js.map +2 -2
  1479. package/dist/modules/workflows/api/templates/route.js +4 -1
  1480. package/dist/modules/workflows/api/templates/route.js.map +2 -2
  1481. package/dist/modules/workflows/api/work-inbox/next/route.js +4 -1
  1482. package/dist/modules/workflows/api/work-inbox/next/route.js.map +2 -2
  1483. package/dist/modules/workflows/lib/activity-executor.js +87 -20
  1484. package/dist/modules/workflows/lib/activity-executor.js.map +2 -2
  1485. package/dist/modules/workflows/lib/activity-types.js +4 -4
  1486. package/dist/modules/workflows/lib/activity-types.js.map +2 -2
  1487. package/dist/modules/workflows/lib/activity-worker-handler.js +16 -11
  1488. package/dist/modules/workflows/lib/activity-worker-handler.js.map +2 -2
  1489. package/dist/modules/workflows/lib/event-trigger-service.js +8 -1
  1490. package/dist/modules/workflows/lib/event-trigger-service.js.map +2 -2
  1491. package/dist/modules/workflows/lib/step-handler.js +4 -4
  1492. package/dist/modules/workflows/lib/step-handler.js.map +2 -2
  1493. package/dist/test-utils/transactionalEntityManagerDouble.js +37 -0
  1494. package/dist/test-utils/transactionalEntityManagerDouble.js.map +7 -0
  1495. package/generated/entities/availability_policy/index.ts +19 -0
  1496. package/generated/entities/communication_channel/index.ts +1 -0
  1497. package/generated/entities/customer_email_conversation_share/index.ts +9 -0
  1498. package/generated/entities/customer_group/index.ts +15 -0
  1499. package/generated/entities/customer_group_membership/index.ts +13 -0
  1500. package/generated/entities/customer_group_terms/index.ts +15 -0
  1501. package/generated/entities/customer_interaction/index.ts +1 -0
  1502. package/generated/entities/form/index.ts +16 -0
  1503. package/generated/entities/form_access_audit/index.ts +9 -0
  1504. package/generated/entities/form_attachment/index.ts +13 -0
  1505. package/generated/entities/form_consent_record/index.ts +17 -0
  1506. package/generated/entities/form_distribution/index.ts +22 -0
  1507. package/generated/entities/form_invitation/index.ts +23 -0
  1508. package/generated/entities/form_submission/index.ts +18 -0
  1509. package/generated/entities/form_submission_actor/index.ts +10 -0
  1510. package/generated/entities/form_submission_revision/index.ts +13 -0
  1511. package/generated/entities/form_version/index.ts +17 -0
  1512. package/generated/entities/forms_encryption_key/index.ts +6 -0
  1513. package/generated/entities.ids.generated.ts +27 -2
  1514. package/generated/entity-fields-registry.ts +269 -0
  1515. package/package.json +19 -9
  1516. package/src/helpers/integration/communicationChannelsFixtures.ts +43 -0
  1517. package/src/helpers/integration/customerGroupsFixtures.ts +171 -0
  1518. package/src/helpers/integration/formsFixtures.ts +757 -0
  1519. package/src/modules/api_docs/api/get/version.ts +28 -11
  1520. package/src/modules/api_keys/api/keys/route.ts +89 -199
  1521. package/src/modules/api_keys/backend/api-keys/create/page.tsx +2 -2
  1522. package/src/modules/api_keys/commands/keys.ts +172 -0
  1523. package/src/modules/api_keys/i18n/de.json +1 -0
  1524. package/src/modules/api_keys/i18n/en.json +1 -0
  1525. package/src/modules/api_keys/i18n/es.json +1 -0
  1526. package/src/modules/api_keys/i18n/ko.json +1 -0
  1527. package/src/modules/api_keys/i18n/pl.json +1 -0
  1528. package/src/modules/api_keys/services/apiKeyService.ts +82 -49
  1529. package/src/modules/attachments/api/file/[id]/route.ts +9 -4
  1530. package/src/modules/attachments/api/image/[id]/[[...slug]]/route.ts +6 -4
  1531. package/src/modules/attachments/api/route.ts +10 -4
  1532. package/src/modules/attachments/components/AttachmentLibrary.tsx +16 -5
  1533. package/src/modules/attachments/lib/access.ts +1 -3
  1534. package/src/modules/attachments/lib/requestScope.ts +35 -3
  1535. package/src/modules/audit_logs/api/audit-logs/actions/export/route.ts +6 -1
  1536. package/src/modules/audit_logs/api/audit-logs/actions/redo/route.ts +41 -6
  1537. package/src/modules/audit_logs/api/audit-logs/actions/route.ts +6 -1
  1538. package/src/modules/audit_logs/api/audit-logs/actions/undo/route.ts +39 -4
  1539. package/src/modules/audit_logs/data/validators.ts +1 -0
  1540. package/src/modules/audit_logs/lib/actorSubject.ts +82 -0
  1541. package/src/modules/audit_logs/lib/replayAuthorization.ts +61 -0
  1542. package/src/modules/audit_logs/services/actionLogService.ts +191 -47
  1543. package/src/modules/auth/api/features.ts +1 -1
  1544. package/src/modules/auth/cli.ts +31 -17
  1545. package/src/modules/auth/commands/acl.ts +26 -36
  1546. package/src/modules/auth/commands/interceptors.ts +23 -0
  1547. package/src/modules/auth/commands/roles.ts +475 -148
  1548. package/src/modules/auth/commands/users.ts +693 -81
  1549. package/src/modules/auth/i18n/de.json +22 -0
  1550. package/src/modules/auth/i18n/en.json +22 -0
  1551. package/src/modules/auth/i18n/es.json +22 -0
  1552. package/src/modules/auth/i18n/ko.json +22 -0
  1553. package/src/modules/auth/i18n/pl.json +22 -0
  1554. package/src/modules/auth/lib/authorizationStateLocks.ts +340 -0
  1555. package/src/modules/auth/lib/commandReplay.ts +194 -0
  1556. package/src/modules/auth/lib/executionPrincipal.ts +36 -28
  1557. package/src/modules/auth/lib/grantChecks.ts +10 -2
  1558. package/src/modules/auth/lib/setup-app.ts +97 -50
  1559. package/src/modules/auth/lib/tokenHash.ts +16 -1
  1560. package/src/modules/auth/services/rbacService.ts +578 -6
  1561. package/src/modules/availability/acl.ts +12 -0
  1562. package/src/modules/availability/api/check/route.ts +136 -0
  1563. package/src/modules/availability/api/openapi.ts +28 -0
  1564. package/src/modules/availability/api/policies/resolve-preview/route.ts +83 -0
  1565. package/src/modules/availability/api/policies/route.ts +243 -0
  1566. package/src/modules/availability/backend/availability/check/page.meta.ts +12 -0
  1567. package/src/modules/availability/backend/availability/check/page.tsx +226 -0
  1568. package/src/modules/availability/backend/availability/policies/ResolutionPreviewPanel.tsx +112 -0
  1569. package/src/modules/availability/backend/availability/policies/ScopeFields.tsx +55 -0
  1570. package/src/modules/availability/backend/availability/policies/StockManagedField.tsx +37 -0
  1571. package/src/modules/availability/backend/availability/policies/[id]/page.meta.ts +8 -0
  1572. package/src/modules/availability/backend/availability/policies/[id]/page.tsx +202 -0
  1573. package/src/modules/availability/backend/availability/policies/create/page.meta.ts +8 -0
  1574. package/src/modules/availability/backend/availability/policies/create/page.tsx +134 -0
  1575. package/src/modules/availability/backend/availability/policies/formGroups.ts +83 -0
  1576. package/src/modules/availability/backend/availability/policies/page.meta.ts +12 -0
  1577. package/src/modules/availability/backend/availability/policies/page.tsx +232 -0
  1578. package/src/modules/availability/backend/availability/policies/policyPayload.ts +29 -0
  1579. package/src/modules/availability/commands/policies.ts +430 -0
  1580. package/src/modules/availability/commands/scope.ts +26 -0
  1581. package/src/modules/availability/data/entities.ts +93 -0
  1582. package/src/modules/availability/data/validators.ts +87 -0
  1583. package/src/modules/availability/di.ts +68 -0
  1584. package/src/modules/availability/events.ts +17 -0
  1585. package/src/modules/availability/i18n/de.json +93 -0
  1586. package/src/modules/availability/i18n/en.json +93 -0
  1587. package/src/modules/availability/i18n/es.json +93 -0
  1588. package/src/modules/availability/i18n/ko.json +93 -0
  1589. package/src/modules/availability/i18n/pl.json +93 -0
  1590. package/src/modules/availability/index.ts +13 -0
  1591. package/src/modules/availability/lib/catalogTarget.ts +72 -0
  1592. package/src/modules/availability/lib/organizationScope.ts +55 -0
  1593. package/src/modules/availability/lib/policyResolution.ts +289 -0
  1594. package/src/modules/availability/lib/tryResolve.ts +8 -0
  1595. package/src/modules/availability/migrations/.snapshot-open-mercato.json +375 -0
  1596. package/src/modules/availability/migrations/Migration20260922095844_availability.ts +13 -0
  1597. package/src/modules/availability/migrations/Migration20260930120000_availability.ts +22 -0
  1598. package/src/modules/availability/setup.ts +10 -0
  1599. package/src/modules/catalog/api/categories/bulk-create/route.ts +133 -0
  1600. package/src/modules/catalog/api/categories/route.ts +70 -8
  1601. package/src/modules/catalog/api/products/bulk-create/route.ts +133 -0
  1602. package/src/modules/catalog/api/products/route.ts +55 -24
  1603. package/src/modules/catalog/backend/catalog/products/[id]/page.tsx +9 -16
  1604. package/src/modules/catalog/backend/catalog/products/create/page.tsx +16 -10
  1605. package/src/modules/catalog/commands/categories.ts +1 -0
  1606. package/src/modules/catalog/commands/products.ts +11 -7
  1607. package/src/modules/catalog/components/PriceKindSettings.tsx +6 -20
  1608. package/src/modules/catalog/components/prices/PriceScopeSelectors.tsx +2 -2
  1609. package/src/modules/catalog/components/products/ProductUomSection.tsx +26 -37
  1610. package/src/modules/catalog/components/products/productForm.ts +6 -4
  1611. package/src/modules/catalog/data/validators.ts +22 -0
  1612. package/src/modules/catalog/di.ts +2 -1
  1613. package/src/modules/catalog/events.ts +9 -3
  1614. package/src/modules/catalog/i18n/de.json +40 -0
  1615. package/src/modules/catalog/i18n/en.json +40 -0
  1616. package/src/modules/catalog/i18n/es.json +40 -0
  1617. package/src/modules/catalog/i18n/ko.json +40 -0
  1618. package/src/modules/catalog/i18n/pl.json +40 -0
  1619. package/src/modules/catalog/lib/bulkCreateCategories.ts +349 -0
  1620. package/src/modules/catalog/lib/bulkCreateCheckpoint.ts +176 -0
  1621. package/src/modules/catalog/lib/bulkCreateMutationGuards.ts +62 -0
  1622. package/src/modules/catalog/lib/bulkCreateProducts.ts +340 -0
  1623. package/src/modules/catalog/lib/bulkDelete.ts +10 -14
  1624. package/src/modules/catalog/lib/catalogQueue.ts +14 -0
  1625. package/src/modules/catalog/lib/currencyOptions.ts +28 -0
  1626. package/src/modules/catalog/lib/productSearch.ts +16 -0
  1627. package/src/modules/catalog/lib/seeds.ts +2 -43
  1628. package/src/modules/catalog/lib/unitLabels.ts +52 -0
  1629. package/src/modules/catalog/migrations/Migration20260914120000.ts +51 -0
  1630. package/src/modules/catalog/migrations/Migration20260914120100.ts +50 -0
  1631. package/src/modules/catalog/workers/catalog-category-bulk-create.ts +48 -0
  1632. package/src/modules/catalog/workers/catalog-product-bulk-create.ts +48 -0
  1633. package/src/modules/communication_channels/acl.ts +8 -0
  1634. package/src/modules/communication_channels/api/get/me/channels/route.ts +4 -0
  1635. package/src/modules/communication_channels/api/get/oauth/[provider]/callback/route.ts +23 -0
  1636. package/src/modules/communication_channels/api/post/channels/[id]/import-history/route.ts +3 -4
  1637. package/src/modules/communication_channels/api/post/channels/[id]/test-send/route.ts +9 -1
  1638. package/src/modules/communication_channels/api/post/test-seed/route.ts +109 -24
  1639. package/src/modules/communication_channels/api/put/channels/[id]/visibility/route.ts +165 -0
  1640. package/src/modules/communication_channels/backend/profile/communication-channels/page.tsx +247 -129
  1641. package/src/modules/communication_channels/commands/ingest-inbound-message.ts +2 -1
  1642. package/src/modules/communication_channels/commands/set-channel-visibility.ts +138 -0
  1643. package/src/modules/communication_channels/data/enrichers.ts +42 -19
  1644. package/src/modules/communication_channels/data/entities.ts +21 -0
  1645. package/src/modules/communication_channels/di.ts +9 -0
  1646. package/src/modules/communication_channels/events.ts +7 -0
  1647. package/src/modules/communication_channels/i18n/de.json +13 -3
  1648. package/src/modules/communication_channels/i18n/en.json +13 -3
  1649. package/src/modules/communication_channels/i18n/es.json +13 -3
  1650. package/src/modules/communication_channels/i18n/ko.json +13 -3
  1651. package/src/modules/communication_channels/i18n/pl.json +13 -3
  1652. package/src/modules/communication_channels/index.ts +1 -1
  1653. package/src/modules/communication_channels/lib/access-control.ts +4 -1
  1654. package/src/modules/communication_channels/lib/adapter.ts +16 -6
  1655. package/src/modules/communication_channels/lib/channel-thread-access.ts +133 -0
  1656. package/src/modules/communication_channels/lib/credential-refresh.ts +27 -5
  1657. package/src/modules/communication_channels/lib/inbound-message-origin.ts +62 -0
  1658. package/src/modules/communication_channels/lib/oauth-state.ts +96 -1
  1659. package/src/modules/communication_channels/lib/outbound-delivery-intent.ts +57 -0
  1660. package/src/modules/communication_channels/lib/send-as-user.ts +2 -2
  1661. package/src/modules/communication_channels/migrations/.snapshot-open-mercato.json +18 -1
  1662. package/src/modules/communication_channels/migrations/Migration20260825141000_communication_channels.ts +22 -0
  1663. package/src/modules/communication_channels/setup.ts +4 -0
  1664. package/src/modules/communication_channels/subscribers/outbound-bridge.ts +34 -9
  1665. package/src/modules/communication_channels/workers/gmail-history-sync.ts +1 -1
  1666. package/src/modules/communication_channels/workers/poll-channel.ts +1 -1
  1667. package/src/modules/communication_channels/workers/reaction-processor.ts +2 -2
  1668. package/src/modules/configs/api/upgrade-actions/route.ts +2 -1
  1669. package/src/modules/configs/cli.ts +2 -2
  1670. package/src/modules/configs/i18n/de.json +2 -0
  1671. package/src/modules/configs/i18n/en.json +2 -0
  1672. package/src/modules/configs/i18n/es.json +2 -0
  1673. package/src/modules/configs/i18n/ko.json +2 -0
  1674. package/src/modules/configs/i18n/pl.json +2 -0
  1675. package/src/modules/configs/lib/upgrade-actions.ts +29 -6
  1676. package/src/modules/configs/services/upgradeActionsService.ts +45 -30
  1677. package/src/modules/currencies/api/currencies/route.ts +11 -5
  1678. package/src/modules/currencies/api/exchange-rates/route.ts +11 -5
  1679. package/src/modules/customer_accounts/AGENTS.md +1 -0
  1680. package/src/modules/customer_accounts/api/admin/users/[id]/sessions/[sessionId].ts +89 -0
  1681. package/src/modules/customer_groups/acl.ts +10 -0
  1682. package/src/modules/customer_groups/api/customer-groups/[id]/terms/route.ts +355 -0
  1683. package/src/modules/customer_groups/api/customer-groups/crud.ts +627 -0
  1684. package/src/modules/customer_groups/api/customer-groups/explain-terms/route.ts +195 -0
  1685. package/src/modules/customer_groups/api/customer-groups/memberships/crud.ts +525 -0
  1686. package/src/modules/customer_groups/api/customer-groups/memberships/route.ts +65 -0
  1687. package/src/modules/customer_groups/api/customer-groups/price-kinds/route.ts +99 -0
  1688. package/src/modules/customer_groups/api/customer-groups/reconcile/adopt/route.ts +150 -0
  1689. package/src/modules/customer_groups/api/customer-groups/reconcile/route.ts +90 -0
  1690. package/src/modules/customer_groups/api/customer-groups/reorder/route.ts +147 -0
  1691. package/src/modules/customer_groups/api/customer-groups/route.ts +65 -0
  1692. package/src/modules/customer_groups/api/openapi.ts +28 -0
  1693. package/src/modules/customer_groups/backend/customer-groups/[id]/edit/page.meta.ts +12 -0
  1694. package/src/modules/customer_groups/backend/customer-groups/[id]/edit/page.tsx +392 -0
  1695. package/src/modules/customer_groups/backend/customer-groups/create/page.meta.ts +25 -0
  1696. package/src/modules/customer_groups/backend/customer-groups/create/page.tsx +279 -0
  1697. package/src/modules/customer_groups/backend/customer-groups/orphans/page.meta.ts +12 -0
  1698. package/src/modules/customer_groups/backend/customer-groups/orphans/page.tsx +216 -0
  1699. package/src/modules/customer_groups/backend/customer-groups/page.meta.ts +11 -0
  1700. package/src/modules/customer_groups/backend/customer-groups/page.tsx +484 -0
  1701. package/src/modules/customer_groups/cli.ts +87 -0
  1702. package/src/modules/customer_groups/commands/reorderGroups.ts +163 -0
  1703. package/src/modules/customer_groups/components/CustomerGroupDefaultField.tsx +55 -0
  1704. package/src/modules/customer_groups/components/CustomerGroupParentField.tsx +194 -0
  1705. package/src/modules/customer_groups/components/CustomerGroupTermsPriceKindField.tsx +112 -0
  1706. package/src/modules/customer_groups/components/CustomerGroupTermsSection.tsx +277 -0
  1707. package/src/modules/customer_groups/components/GroupPickerField.tsx +142 -0
  1708. package/src/modules/customer_groups/components/OrphanBanner.tsx +92 -0
  1709. package/src/modules/customer_groups/components/customerGroupTree.ts +84 -0
  1710. package/src/modules/customer_groups/data/entities.ts +244 -0
  1711. package/src/modules/customer_groups/data/validators.ts +232 -0
  1712. package/src/modules/customer_groups/di.ts +25 -0
  1713. package/src/modules/customer_groups/events.ts +22 -0
  1714. package/src/modules/customer_groups/i18n/de.json +199 -0
  1715. package/src/modules/customer_groups/i18n/en.json +199 -0
  1716. package/src/modules/customer_groups/i18n/es.json +199 -0
  1717. package/src/modules/customer_groups/i18n/ko.json +199 -0
  1718. package/src/modules/customer_groups/i18n/pl.json +199 -0
  1719. package/src/modules/customer_groups/index.ts +13 -0
  1720. package/src/modules/customer_groups/lib/createConflictRecheck.ts +39 -0
  1721. package/src/modules/customer_groups/lib/customerScope.ts +145 -0
  1722. package/src/modules/customer_groups/lib/groupEvents.ts +50 -0
  1723. package/src/modules/customer_groups/lib/priceKindScope.ts +65 -0
  1724. package/src/modules/customer_groups/lib/reconcile.ts +299 -0
  1725. package/src/modules/customer_groups/migrations/.snapshot-open-mercato.json +905 -0
  1726. package/src/modules/customer_groups/migrations/Migration20260922095316_customer_groups.ts +26 -0
  1727. package/src/modules/customer_groups/migrations/Migration20260922103033_customer_groups.ts +22 -0
  1728. package/src/modules/customer_groups/migrations/Migration20260922105444_customer_groups.ts +17 -0
  1729. package/src/modules/customer_groups/migrations/Migration20260923193330_customer_groups.ts +20 -0
  1730. package/src/modules/customer_groups/migrations/Migration20260929083000_customer_groups.ts +21 -0
  1731. package/src/modules/customer_groups/services/customerGroupsService.ts +358 -0
  1732. package/src/modules/customer_groups/setup.ts +11 -0
  1733. package/src/modules/customer_groups/widgets/injection/group-picker-field/widget.ts +41 -0
  1734. package/src/modules/customer_groups/widgets/injection/person-groups-explain-terms.tsx +227 -0
  1735. package/src/modules/customer_groups/widgets/injection/person-groups-tab/widget.ts +21 -0
  1736. package/src/modules/customer_groups/widgets/injection/person-groups-tab.tsx +573 -0
  1737. package/src/modules/customer_groups/widgets/injection-table.ts +35 -0
  1738. package/src/modules/customers/acl.ts +13 -0
  1739. package/src/modules/customers/api/activities/route.ts +10 -0
  1740. package/src/modules/customers/api/companies/[id]/people/route.ts +2 -1
  1741. package/src/modules/customers/api/companies/[id]/route.ts +20 -6
  1742. package/src/modules/customers/api/deals/[id]/companies/route.ts +2 -1
  1743. package/src/modules/customers/api/deals/[id]/people/route.ts +2 -1
  1744. package/src/modules/customers/api/deals/map/route.ts +11 -10
  1745. package/src/modules/customers/api/dictionaries/context.ts +2 -1
  1746. package/src/modules/customers/api/entity-roles-factory.ts +3 -2
  1747. package/src/modules/customers/api/interactions/[id]/visibility/route.ts +2 -1
  1748. package/src/modules/customers/api/interactions/cancel/route.ts +2 -1
  1749. package/src/modules/customers/api/interactions/complete/route.ts +2 -1
  1750. package/src/modules/customers/api/interactions/conflicts/route.ts +10 -10
  1751. package/src/modules/customers/api/interactions/counts/route.ts +25 -7
  1752. package/src/modules/customers/api/interactions/route.ts +34 -10
  1753. package/src/modules/customers/api/labels/assign/route.ts +2 -1
  1754. package/src/modules/customers/api/labels/route.ts +3 -2
  1755. package/src/modules/customers/api/labels/unassign/route.ts +2 -1
  1756. package/src/modules/customers/api/people/[id]/companies/context.ts +11 -2
  1757. package/src/modules/customers/api/people/[id]/email-share/route.ts +276 -0
  1758. package/src/modules/customers/api/people/[id]/email-threads/route.ts +14 -1
  1759. package/src/modules/customers/api/people/[id]/emails/route.ts +2 -1
  1760. package/src/modules/customers/api/people/[id]/route.ts +31 -22
  1761. package/src/modules/customers/api/people/check-phone/route.ts +2 -1
  1762. package/src/modules/customers/api/pipeline-stages/reorder/route.ts +3 -2
  1763. package/src/modules/customers/api/pipeline-stages/route.ts +3 -3
  1764. package/src/modules/customers/api/pipelines/route.ts +3 -3
  1765. package/src/modules/customers/api/settings/address-format/route.ts +2 -1
  1766. package/src/modules/customers/api/settings/dictionary-sort-modes/route.ts +2 -1
  1767. package/src/modules/customers/api/settings/stuck-threshold/route.ts +2 -1
  1768. package/src/modules/customers/api/tags/assign/route.ts +2 -1
  1769. package/src/modules/customers/api/tags/unassign/route.ts +2 -1
  1770. package/src/modules/customers/backend/customers/companies/[id]/page.tsx +4 -2
  1771. package/src/modules/customers/backend/customers/deals/[id]/hooks/useDealAssociations.ts +10 -6
  1772. package/src/modules/customers/backend/customers/deals/[id]/page.tsx +6 -1
  1773. package/src/modules/customers/backend/customers/deals/components/ReassignOwnerDialog.tsx +115 -0
  1774. package/src/modules/customers/backend/customers/deals/page.tsx +121 -1
  1775. package/src/modules/customers/backend/customers/people/[id]/page.tsx +4 -2
  1776. package/src/modules/customers/commands/addresses.ts +117 -15
  1777. package/src/modules/customers/commands/companies.ts +26 -5
  1778. package/src/modules/customers/commands/emailConversationShares.ts +261 -0
  1779. package/src/modules/customers/commands/index.ts +1 -0
  1780. package/src/modules/customers/commands/interactions.ts +61 -21
  1781. package/src/modules/customers/commands/people.ts +3 -2
  1782. package/src/modules/customers/commands/shared.ts +4 -0
  1783. package/src/modules/customers/components/calendar/types.ts +1 -1
  1784. package/src/modules/customers/components/detail/CompanyPeopleSection.tsx +3 -11
  1785. package/src/modules/customers/components/detail/DealForm.tsx +111 -2
  1786. package/src/modules/customers/components/detail/DealOwnerSelect.tsx +161 -0
  1787. package/src/modules/customers/components/detail/DealsSection.tsx +8 -14
  1788. package/src/modules/customers/components/detail/PersonEmailShareControl.tsx +273 -0
  1789. package/src/modules/customers/components/detail/PersonEmailThreadsTab.tsx +26 -0
  1790. package/src/modules/customers/components/detail/ScheduleActivityDialog.tsx +10 -2
  1791. package/src/modules/customers/components/detail/create/CreateDealForm.tsx +30 -0
  1792. package/src/modules/customers/components/detail/create/DealDetailsFields.tsx +12 -0
  1793. package/src/modules/customers/components/detail/create/DealSectionCard.tsx +7 -2
  1794. package/src/modules/customers/components/detail/create/dealFormTypes.ts +3 -0
  1795. package/src/modules/customers/components/detail/schedule/useScheduleFormState.ts +16 -4
  1796. package/src/modules/customers/components/formConfig.tsx +3 -0
  1797. package/src/modules/customers/components/linking/LinkEntityDialog.tsx +8 -0
  1798. package/src/modules/customers/data/enrichers.ts +64 -5
  1799. package/src/modules/customers/data/entities.ts +105 -1
  1800. package/src/modules/customers/data/validators.ts +22 -0
  1801. package/src/modules/customers/events.ts +5 -0
  1802. package/src/modules/customers/i18n/de.json +28 -5
  1803. package/src/modules/customers/i18n/en.json +23 -0
  1804. package/src/modules/customers/i18n/es.json +23 -0
  1805. package/src/modules/customers/i18n/ko.json +23 -0
  1806. package/src/modules/customers/i18n/pl.json +23 -0
  1807. package/src/modules/customers/lib/assignableStaff.ts +17 -0
  1808. package/src/modules/customers/lib/calendar/editorPayload.ts +20 -13
  1809. package/src/modules/customers/lib/calendar/mapItem.ts +1 -0
  1810. package/src/modules/customers/lib/conversationShares.ts +250 -0
  1811. package/src/modules/customers/lib/dealsOrganizationScope.ts +5 -3
  1812. package/src/modules/customers/lib/interactionRequestContext.ts +2 -1
  1813. package/src/modules/customers/lib/link-channel-message-handler.ts +27 -4
  1814. package/src/modules/customers/lib/personDetailCacheTags.ts +68 -0
  1815. package/src/modules/customers/lib/personEmailThreads.ts +61 -6
  1816. package/src/modules/customers/lib/reassignDealOwner.ts +51 -0
  1817. package/src/modules/customers/lib/userNames.ts +39 -0
  1818. package/src/modules/customers/lib/visibilityFilter.ts +170 -3
  1819. package/src/modules/customers/migrations/.snapshot-open-mercato.json +240 -0
  1820. package/src/modules/customers/migrations/Migration20260825120000_customers.ts +19 -0
  1821. package/src/modules/customers/migrations/Migration20260825140000_customers.ts +41 -0
  1822. package/src/modules/customers/setup.ts +1 -0
  1823. package/src/modules/customers/subscribers/channel-visibility-changed.ts +50 -0
  1824. package/src/modules/dashboards/api/widgets/data/batch/route.ts +3 -8
  1825. package/src/modules/dashboards/api/widgets/data/route.ts +12 -18
  1826. package/src/modules/dashboards/lib/aggregations.ts +1 -1
  1827. package/src/modules/dashboards/lib/widgetScope.ts +2 -7
  1828. package/src/modules/data_sync/AGENTS.md +35 -1
  1829. package/src/modules/data_sync/api/runs/[id]/cancel.ts +5 -1
  1830. package/src/modules/data_sync/backend/data-sync/page.tsx +292 -19
  1831. package/src/modules/data_sync/backend/data-sync/runs/[id]/page.tsx +205 -21
  1832. package/src/modules/data_sync/components/useDataSyncRunAccess.ts +27 -0
  1833. package/src/modules/data_sync/i18n/de.json +24 -0
  1834. package/src/modules/data_sync/i18n/en.json +24 -0
  1835. package/src/modules/data_sync/i18n/es.json +24 -0
  1836. package/src/modules/data_sync/i18n/ko.json +24 -0
  1837. package/src/modules/data_sync/i18n/pl.json +24 -0
  1838. package/src/modules/data_sync/lib/adapter.ts +37 -0
  1839. package/src/modules/data_sync/lib/resume-point.ts +63 -0
  1840. package/src/modules/data_sync/lib/start-run.ts +61 -2
  1841. package/src/modules/data_sync/lib/sync-run-service.ts +27 -34
  1842. package/src/modules/devices/api/[id]/route.ts +3 -2
  1843. package/src/modules/devices/api/admin/devices/route.ts +2 -1
  1844. package/src/modules/devices/api/route.ts +2 -1
  1845. package/src/modules/dictionaries/api/[dictionaryId]/route.ts +3 -5
  1846. package/src/modules/dictionaries/api/context.ts +2 -1
  1847. package/src/modules/dictionaries/api/route.ts +4 -0
  1848. package/src/modules/dictionaries/components/DictionariesManager.tsx +12 -4
  1849. package/src/modules/dictionaries/data/validators.ts +9 -1
  1850. package/src/modules/dictionaries/i18n/de.json +3 -3
  1851. package/src/modules/dictionaries/i18n/en.json +3 -3
  1852. package/src/modules/dictionaries/i18n/es.json +3 -3
  1853. package/src/modules/dictionaries/i18n/ko.json +3 -3
  1854. package/src/modules/dictionaries/i18n/pl.json +3 -3
  1855. package/src/modules/directory/api/organization-branding/route.ts +10 -1
  1856. package/src/modules/directory/api/organizations/route.ts +1 -1
  1857. package/src/modules/directory/backend/directory/branding/page.tsx +24 -2
  1858. package/src/modules/directory/commands/organizations.ts +173 -80
  1859. package/src/modules/directory/i18n/de.json +1 -0
  1860. package/src/modules/directory/i18n/en.json +1 -0
  1861. package/src/modules/directory/i18n/es.json +1 -0
  1862. package/src/modules/directory/i18n/ko.json +1 -0
  1863. package/src/modules/directory/i18n/pl.json +1 -0
  1864. package/src/modules/directory/lib/hierarchy.ts +22 -1
  1865. package/src/modules/directory/utils/organizationScope.ts +102 -15
  1866. package/src/modules/directory/utils/organizationScopeFilter.ts +6 -3
  1867. package/src/modules/directory/utils/organizationScopeGuard.ts +9 -5
  1868. package/src/modules/entities/api/encryption.ts +73 -27
  1869. package/src/modules/entities/api/records.ts +9 -8
  1870. package/src/modules/entities/cli.ts +46 -24
  1871. package/src/modules/entities/data/entities.ts +15 -0
  1872. package/src/modules/entities/lib/definition-scope.ts +5 -1
  1873. package/src/modules/entities/lib/encryption-maps.ts +164 -0
  1874. package/src/modules/entities/lib/helpers.ts +95 -8
  1875. package/src/modules/entities/migrations/.snapshot-open-mercato.json +21 -0
  1876. package/src/modules/entities/migrations/.snapshot-openmercato.json +12 -0
  1877. package/src/modules/entities/migrations/Migration20260910120000.ts +42 -0
  1878. package/src/modules/entities/migrations/Migration20261004120000_encryption_map_scope_uniqueness.ts +130 -0
  1879. package/src/modules/eudr/api/dashboard/widgets/compliance-overview/route.ts +2 -1
  1880. package/src/modules/eudr/api/plots/import/route.ts +2 -1
  1881. package/src/modules/eudr/api/product-mappings/suggestions/apply/route.ts +2 -1
  1882. package/src/modules/eudr/api/product-mappings/suggestions/route.ts +2 -1
  1883. package/src/modules/eudr/api/reports/annual/route.ts +2 -1
  1884. package/src/modules/eudr/api/statements/[id]/export/route.ts +2 -1
  1885. package/src/modules/eudr/api/statements/[id]/readiness/route.ts +2 -1
  1886. package/src/modules/eudr/api/suppliers/compliance/route.ts +2 -1
  1887. package/src/modules/eudr/i18n/de.json +1 -0
  1888. package/src/modules/eudr/i18n/en.json +1 -0
  1889. package/src/modules/eudr/i18n/es.json +1 -0
  1890. package/src/modules/eudr/i18n/ko.json +1 -0
  1891. package/src/modules/eudr/i18n/pl.json +1 -0
  1892. package/src/modules/feature_toggles/commands/global.ts +18 -15
  1893. package/src/modules/feature_toggles/lib/feature-flag-check.ts +8 -3
  1894. package/src/modules/forms/acl.ts +10 -0
  1895. package/src/modules/forms/api/[id]/analytics/route.ts +137 -0
  1896. package/src/modules/forms/api/[id]/distributions/route.ts +192 -0
  1897. package/src/modules/forms/api/[id]/route.ts +245 -0
  1898. package/src/modules/forms/api/[id]/run/context/route.ts +142 -0
  1899. package/src/modules/forms/api/[id]/run/submissions/route.ts +147 -0
  1900. package/src/modules/forms/api/[id]/submissions/route.ts +100 -0
  1901. package/src/modules/forms/api/[id]/theme-logo/route.ts +147 -0
  1902. package/src/modules/forms/api/[id]/versions/[versionId]/diff/route.ts +137 -0
  1903. package/src/modules/forms/api/[id]/versions/[versionId]/publish/route.ts +108 -0
  1904. package/src/modules/forms/api/[id]/versions/[versionId]/route.ts +200 -0
  1905. package/src/modules/forms/api/[id]/versions/fork/route.ts +98 -0
  1906. package/src/modules/forms/api/attachment-helpers.ts +160 -0
  1907. package/src/modules/forms/api/by-key/[key]/active/route.ts +165 -0
  1908. package/src/modules/forms/api/distributions/[distributionId]/invitations/[invitationId]/route.ts +92 -0
  1909. package/src/modules/forms/api/distributions/[distributionId]/invitations/[invitationId]/send/route.ts +96 -0
  1910. package/src/modules/forms/api/distributions/[distributionId]/invitations/route.ts +207 -0
  1911. package/src/modules/forms/api/distributions/[distributionId]/route.ts +213 -0
  1912. package/src/modules/forms/api/form-submissions/[id]/attachments/route.ts +114 -0
  1913. package/src/modules/forms/api/form-submissions/[id]/resume-token/route.ts +140 -0
  1914. package/src/modules/forms/api/form-submissions/[id]/route.ts +176 -0
  1915. package/src/modules/forms/api/form-submissions/[id]/submit/route.ts +91 -0
  1916. package/src/modules/forms/api/form-submissions/by-subject/[subject_type]/[subject_id]/route.ts +93 -0
  1917. package/src/modules/forms/api/form-submissions/route.ts +133 -0
  1918. package/src/modules/forms/api/helpers.ts +175 -0
  1919. package/src/modules/forms/api/public/distributions/[slug]/embed-policy/route.ts +74 -0
  1920. package/src/modules/forms/api/public/distributions/[slug]/route.ts +101 -0
  1921. package/src/modules/forms/api/public/embed-loader/route.ts +136 -0
  1922. package/src/modules/forms/api/public/invitations/[token]/route.ts +107 -0
  1923. package/src/modules/forms/api/public/rate-limit.ts +69 -0
  1924. package/src/modules/forms/api/public/start/route.ts +195 -0
  1925. package/src/modules/forms/api/public/submissions/[id]/attachments/[attachmentId]/route.ts +86 -0
  1926. package/src/modules/forms/api/public/submissions/[id]/attachments/route.ts +108 -0
  1927. package/src/modules/forms/api/public/submissions/[id]/pdf/route.ts +96 -0
  1928. package/src/modules/forms/api/public/submissions/[id]/route.ts +189 -0
  1929. package/src/modules/forms/api/public/submissions/[id]/submit/route.ts +159 -0
  1930. package/src/modules/forms/api/route.ts +240 -0
  1931. package/src/modules/forms/api/runtime-helpers.ts +208 -0
  1932. package/src/modules/forms/api/subjects/[subjectType]/[subjectId]/consents/route.ts +178 -0
  1933. package/src/modules/forms/api/subjects/[subjectType]/[subjectId]/export/route.ts +135 -0
  1934. package/src/modules/forms/api/submissions/[submissionId]/access-audit/route.ts +100 -0
  1935. package/src/modules/forms/api/submissions/[submissionId]/actors/[actorId]/route.ts +70 -0
  1936. package/src/modules/forms/api/submissions/[submissionId]/actors/route.ts +92 -0
  1937. package/src/modules/forms/api/submissions/[submissionId]/anonymize/route.ts +134 -0
  1938. package/src/modules/forms/api/submissions/[submissionId]/attachments/[attachmentId]/route.ts +90 -0
  1939. package/src/modules/forms/api/submissions/[submissionId]/export/route.ts +111 -0
  1940. package/src/modules/forms/api/submissions/[submissionId]/pdf/route.ts +118 -0
  1941. package/src/modules/forms/api/submissions/[submissionId]/reopen/route.ts +69 -0
  1942. package/src/modules/forms/api/submissions/[submissionId]/revisions/route.ts +75 -0
  1943. package/src/modules/forms/api/submissions/[submissionId]/route.ts +90 -0
  1944. package/src/modules/forms/backend/forms/[id]/FormStudio.tsx +3269 -0
  1945. package/src/modules/forms/backend/forms/[id]/analytics/page.meta.ts +15 -0
  1946. package/src/modules/forms/backend/forms/[id]/analytics/page.tsx +289 -0
  1947. package/src/modules/forms/backend/forms/[id]/distributions/page.meta.ts +15 -0
  1948. package/src/modules/forms/backend/forms/[id]/distributions/page.tsx +16 -0
  1949. package/src/modules/forms/backend/forms/[id]/history/page.meta.ts +11 -0
  1950. package/src/modules/forms/backend/forms/[id]/history/page.tsx +229 -0
  1951. package/src/modules/forms/backend/forms/[id]/page.meta.ts +11 -0
  1952. package/src/modules/forms/backend/forms/[id]/page.tsx +17 -0
  1953. package/src/modules/forms/backend/forms/[id]/studio/YesNoRow.tsx +65 -0
  1954. package/src/modules/forms/backend/forms/[id]/studio/autosave-guard.ts +25 -0
  1955. package/src/modules/forms/backend/forms/[id]/studio/canvas/DragOverlayCard.tsx +24 -0
  1956. package/src/modules/forms/backend/forms/[id]/studio/canvas/DropIndicator.tsx +36 -0
  1957. package/src/modules/forms/backend/forms/[id]/studio/canvas/FieldRow.tsx +308 -0
  1958. package/src/modules/forms/backend/forms/[id]/studio/canvas/FormCanvas.tsx +265 -0
  1959. package/src/modules/forms/backend/forms/[id]/studio/canvas/GridSlot.tsx +176 -0
  1960. package/src/modules/forms/backend/forms/[id]/studio/canvas/SectionContainer.tsx +473 -0
  1961. package/src/modules/forms/backend/forms/[id]/studio/canvas/grid-collision.ts +25 -0
  1962. package/src/modules/forms/backend/forms/[id]/studio/canvas/keyboard-coordinates.ts +128 -0
  1963. package/src/modules/forms/backend/forms/[id]/studio/canvas/overlay-size.ts +15 -0
  1964. package/src/modules/forms/backend/forms/[id]/studio/canvas/resize-math.ts +36 -0
  1965. package/src/modules/forms/backend/forms/[id]/studio/canvas/row-layout.ts +110 -0
  1966. package/src/modules/forms/backend/forms/[id]/studio/logic/ConditionBuilder.tsx +264 -0
  1967. package/src/modules/forms/backend/forms/[id]/studio/logic/HiddenFieldsPanel.tsx +121 -0
  1968. package/src/modules/forms/backend/forms/[id]/studio/logic/JumpsEditor.tsx +237 -0
  1969. package/src/modules/forms/backend/forms/[id]/studio/logic/RecallTokenPicker.tsx +87 -0
  1970. package/src/modules/forms/backend/forms/[id]/studio/logic/VariablesPanel.tsx +260 -0
  1971. package/src/modules/forms/backend/forms/[id]/studio/logic/condition-model.ts +207 -0
  1972. package/src/modules/forms/backend/forms/[id]/studio/lucide-icons.ts +87 -0
  1973. package/src/modules/forms/backend/forms/[id]/studio/palette/FormAppearancePanel.tsx +561 -0
  1974. package/src/modules/forms/backend/forms/[id]/studio/palette/FormPalettePanel.tsx +52 -0
  1975. package/src/modules/forms/backend/forms/[id]/studio/palette/InputParametersTab.tsx +378 -0
  1976. package/src/modules/forms/backend/forms/[id]/studio/palette/PaletteCard.tsx +40 -0
  1977. package/src/modules/forms/backend/forms/[id]/studio/palette/RolesEditor.tsx +225 -0
  1978. package/src/modules/forms/backend/forms/[id]/studio/palette/entries.ts +102 -0
  1979. package/src/modules/forms/backend/forms/[id]/studio/preview/PreviewSurface.tsx +1459 -0
  1980. package/src/modules/forms/backend/forms/[id]/studio/preview/ViewportFrame.tsx +49 -0
  1981. package/src/modules/forms/backend/forms/[id]/studio/recall.ts +0 -0
  1982. package/src/modules/forms/backend/forms/[id]/studio/schema-helpers.ts +2525 -0
  1983. package/src/modules/forms/backend/forms/[id]/studio/style/BackgroundControl.tsx +137 -0
  1984. package/src/modules/forms/backend/forms/[id]/studio/style/ColorControl.tsx +257 -0
  1985. package/src/modules/forms/backend/forms/[id]/studio/style/contrast.ts +114 -0
  1986. package/src/modules/forms/backend/forms/[id]/studio/style/presets.ts +104 -0
  1987. package/src/modules/forms/backend/forms/[id]/studio/type-label.ts +13 -0
  1988. package/src/modules/forms/backend/forms/[id]/studio/types.ts +31 -0
  1989. package/src/modules/forms/backend/forms/[id]/studio/undo-controller.ts +52 -0
  1990. package/src/modules/forms/backend/forms/[id]/studio/validation/FileConstraintsEditor.tsx +89 -0
  1991. package/src/modules/forms/backend/forms/[id]/studio/validation/GroupConfigEditor.tsx +167 -0
  1992. package/src/modules/forms/backend/forms/[id]/studio/validation/LengthRangeEditor.tsx +67 -0
  1993. package/src/modules/forms/backend/forms/[id]/studio/validation/MatrixColumnsEditor.tsx +166 -0
  1994. package/src/modules/forms/backend/forms/[id]/studio/validation/MatrixRowsEditor.tsx +184 -0
  1995. package/src/modules/forms/backend/forms/[id]/studio/validation/MessageOverridesEditor.tsx +83 -0
  1996. package/src/modules/forms/backend/forms/[id]/studio/validation/NpsAnchorsEditor.tsx +60 -0
  1997. package/src/modules/forms/backend/forms/[id]/studio/validation/NumberRangeEditor.tsx +65 -0
  1998. package/src/modules/forms/backend/forms/[id]/studio/validation/OpinionIconSelect.tsx +46 -0
  1999. package/src/modules/forms/backend/forms/[id]/studio/validation/PatternEditor.tsx +122 -0
  2000. package/src/modules/forms/backend/forms/[id]/studio/validation/RankingExhaustiveSwitch.tsx +28 -0
  2001. package/src/modules/forms/backend/forms/[id]/studio/validation/SignatureConfigEditor.tsx +84 -0
  2002. package/src/modules/forms/backend/forms/[id]/studio/validation/ValidationPanel.tsx +369 -0
  2003. package/src/modules/forms/backend/forms/[id]/submissions/components/RowBadges.ts +56 -0
  2004. package/src/modules/forms/backend/forms/[id]/submissions/components/SubmissionDrawer.tsx +605 -0
  2005. package/src/modules/forms/backend/forms/[id]/submissions/components/formSummary.ts +19 -0
  2006. package/src/modules/forms/backend/forms/[id]/submissions/page.meta.ts +10 -0
  2007. package/src/modules/forms/backend/forms/[id]/submissions/page.tsx +252 -0
  2008. package/src/modules/forms/backend/forms/create/page.meta.ts +11 -0
  2009. package/src/modules/forms/backend/forms/create/page.tsx +113 -0
  2010. package/src/modules/forms/backend/forms/page.meta.ts +31 -0
  2011. package/src/modules/forms/backend/forms/page.tsx +269 -0
  2012. package/src/modules/forms/commands/distribution.ts +506 -0
  2013. package/src/modules/forms/commands/form-version.ts +811 -0
  2014. package/src/modules/forms/commands/form.ts +477 -0
  2015. package/src/modules/forms/commands/index.ts +18 -0
  2016. package/src/modules/forms/commands/invitation.ts +428 -0
  2017. package/src/modules/forms/commands/shared.ts +261 -0
  2018. package/src/modules/forms/commands/submission.ts +216 -0
  2019. package/src/modules/forms/data/entities.ts +686 -0
  2020. package/src/modules/forms/data/validators.ts +483 -0
  2021. package/src/modules/forms/di.ts +246 -0
  2022. package/src/modules/forms/encryption.ts +31 -0
  2023. package/src/modules/forms/events-payloads.ts +103 -0
  2024. package/src/modules/forms/events.ts +50 -0
  2025. package/src/modules/forms/extension-points.ts +41 -0
  2026. package/src/modules/forms/frontend/[orgSlug]/portal/forms/[key]/page.meta.ts +9 -0
  2027. package/src/modules/forms/frontend/[orgSlug]/portal/forms/[key]/page.tsx +45 -0
  2028. package/src/modules/forms/frontend/[orgSlug]/portal/submissions/[id]/continue/page.meta.ts +9 -0
  2029. package/src/modules/forms/frontend/[orgSlug]/portal/submissions/[id]/continue/page.tsx +56 -0
  2030. package/src/modules/forms/frontend/embed/[slug]/page.meta.ts +42 -0
  2031. package/src/modules/forms/frontend/embed/[slug]/page.tsx +171 -0
  2032. package/src/modules/forms/frontend/f/[slug]/page.meta.ts +9 -0
  2033. package/src/modules/forms/frontend/f/[slug]/page.tsx +10 -0
  2034. package/src/modules/forms/frontend/forms/[id]/run/page.meta.ts +17 -0
  2035. package/src/modules/forms/frontend/forms/[id]/run/page.tsx +83 -0
  2036. package/src/modules/forms/frontend/i/[token]/page.meta.ts +9 -0
  2037. package/src/modules/forms/frontend/i/[token]/page.tsx +10 -0
  2038. package/src/modules/forms/i18n/de.json +821 -0
  2039. package/src/modules/forms/i18n/en.json +821 -0
  2040. package/src/modules/forms/i18n/es.json +821 -0
  2041. package/src/modules/forms/i18n/ko.json +821 -0
  2042. package/src/modules/forms/i18n/pl.json +821 -0
  2043. package/src/modules/forms/index.ts +18 -0
  2044. package/src/modules/forms/lib/embed-frame-policy.ts +144 -0
  2045. package/src/modules/forms/lib/form-definition-slicing.ts +54 -0
  2046. package/src/modules/forms/lib/log-redaction.ts +91 -0
  2047. package/src/modules/forms/lib/navigable-url.ts +57 -0
  2048. package/src/modules/forms/lib/retention.ts +73 -0
  2049. package/src/modules/forms/lib/runtime-principal.ts +101 -0
  2050. package/src/modules/forms/migrations/.snapshot-open-mercato.json +3185 -0
  2051. package/src/modules/forms/migrations/Migration20260508135459_forms.ts +17 -0
  2052. package/src/modules/forms/migrations/Migration20260508140932_forms.ts +26 -0
  2053. package/src/modules/forms/migrations/Migration20260508155737_forms.ts +15 -0
  2054. package/src/modules/forms/migrations/Migration20260520120000_forms.ts +26 -0
  2055. package/src/modules/forms/migrations/Migration20260521090000_forms.ts +15 -0
  2056. package/src/modules/forms/migrations/Migration20260521120000_forms.ts +21 -0
  2057. package/src/modules/forms/runner/FormRunner.tsx +924 -0
  2058. package/src/modules/forms/runner/MatrixField.tsx +210 -0
  2059. package/src/modules/forms/runner/RankingField.tsx +207 -0
  2060. package/src/modules/forms/runner/ScaleField.tsx +102 -0
  2061. package/src/modules/forms/runner/SignatureField.tsx +158 -0
  2062. package/src/modules/forms/runner/tamper-check.ts +131 -0
  2063. package/src/modules/forms/schema/address-countries.ts +60 -0
  2064. package/src/modules/forms/schema/field-type-patterns.ts +21 -0
  2065. package/src/modules/forms/schema/field-type-registry-advanced.ts +58 -0
  2066. package/src/modules/forms/schema/field-type-registry.ts +819 -0
  2067. package/src/modules/forms/schema/file-field.ts +102 -0
  2068. package/src/modules/forms/schema/group-field.ts +235 -0
  2069. package/src/modules/forms/schema/jsonlogic-grammar.ts +95 -0
  2070. package/src/modules/forms/schema/jsonschema-extensions.ts +1060 -0
  2071. package/src/modules/forms/schema/layout-catalog.ts +68 -0
  2072. package/src/modules/forms/schema/signature-field.ts +120 -0
  2073. package/src/modules/forms/schema/style-extensions.ts +194 -0
  2074. package/src/modules/forms/schema/style-validators.ts +252 -0
  2075. package/src/modules/forms/services/access-audit-logger.ts +275 -0
  2076. package/src/modules/forms/services/analytics-service.ts +498 -0
  2077. package/src/modules/forms/services/anonymize-service.ts +177 -0
  2078. package/src/modules/forms/services/attachment-service.ts +223 -0
  2079. package/src/modules/forms/services/captcha-verifier.ts +156 -0
  2080. package/src/modules/forms/services/consent-record-service.ts +162 -0
  2081. package/src/modules/forms/services/distribution-service.ts +509 -0
  2082. package/src/modules/forms/services/distribution-token.ts +153 -0
  2083. package/src/modules/forms/services/encryption-service.ts +500 -0
  2084. package/src/modules/forms/services/export-service.ts +360 -0
  2085. package/src/modules/forms/services/field-validation-service.ts +300 -0
  2086. package/src/modules/forms/services/form-logic-evaluator.ts +718 -0
  2087. package/src/modules/forms/services/form-version-compiler.ts +829 -0
  2088. package/src/modules/forms/services/form-version-differ.ts +143 -0
  2089. package/src/modules/forms/services/jsonlogic-evaluator.ts +228 -0
  2090. package/src/modules/forms/services/pdf-snapshot-service.ts +782 -0
  2091. package/src/modules/forms/services/prefill-resolver.ts +125 -0
  2092. package/src/modules/forms/services/role-policy-service.ts +90 -0
  2093. package/src/modules/forms/services/style-compiler.ts +378 -0
  2094. package/src/modules/forms/services/submission-service.ts +1259 -0
  2095. package/src/modules/forms/services/upload-scanner.ts +36 -0
  2096. package/src/modules/forms/services/upload-validation.ts +94 -0
  2097. package/src/modules/forms/services/visibility-resolver.ts +63 -0
  2098. package/src/modules/forms/setup.ts +16 -0
  2099. package/src/modules/forms/subscribers/forms-consent-projector.ts +100 -0
  2100. package/src/modules/forms/subscribers/forms-pdf-snapshot.ts +112 -0
  2101. package/src/modules/forms/subscribers/forms-webhook-bridge-anonymized.ts +36 -0
  2102. package/src/modules/forms/subscribers/forms-webhook-bridge.ts +56 -0
  2103. package/src/modules/forms/subscribers/invitation-email.ts +180 -0
  2104. package/src/modules/forms/translations.ts +14 -0
  2105. package/src/modules/forms/ui/admin/forms/[id]/distributions/CreateDistributionDialog.tsx +401 -0
  2106. package/src/modules/forms/ui/admin/forms/[id]/distributions/DistributionsPanel.tsx +381 -0
  2107. package/src/modules/forms/ui/admin/forms/[id]/distributions/EmbedSettingsDialog.tsx +332 -0
  2108. package/src/modules/forms/ui/admin/forms/[id]/distributions/RecipientsTable.tsx +460 -0
  2109. package/src/modules/forms/ui/public/EmbeddedForm.tsx +248 -0
  2110. package/src/modules/forms/ui/public/FormRunner.tsx +491 -0
  2111. package/src/modules/forms/ui/public/FormTrigger.tsx +80 -0
  2112. package/src/modules/forms/ui/public/PublicFormRunnerPage.tsx +34 -0
  2113. package/src/modules/forms/ui/public/components/CompletionScreen.tsx +97 -0
  2114. package/src/modules/forms/ui/public/components/LocaleSwitch.tsx +42 -0
  2115. package/src/modules/forms/ui/public/components/ResumeGate.tsx +61 -0
  2116. package/src/modules/forms/ui/public/components/ReviewStep.tsx +153 -0
  2117. package/src/modules/forms/ui/public/components/SaveIndicator.tsx +69 -0
  2118. package/src/modules/forms/ui/public/components/SectionStepper.tsx +60 -0
  2119. package/src/modules/forms/ui/public/index.ts +48 -0
  2120. package/src/modules/forms/ui/public/renderers/index.tsx +889 -0
  2121. package/src/modules/forms/ui/public/state/logic-derivation.ts +91 -0
  2122. package/src/modules/forms/ui/public/state/runtime-client.ts +495 -0
  2123. package/src/modules/forms/ui/public/state/useAutosave.ts +97 -0
  2124. package/src/modules/forms/ui/public/state/useFormRunner.ts +547 -0
  2125. package/src/modules/forms/ui/public/style/LogoHeader.tsx +43 -0
  2126. package/src/modules/forms/ui/public/style/applyStyle.ts +26 -0
  2127. package/src/modules/forms/ui/public/types.ts +228 -0
  2128. package/src/modules/forms/widgets/injection/access-audit-panel/widget.tsx +144 -0
  2129. package/src/modules/forms/widgets/injection/anonymize-button/widget.tsx +177 -0
  2130. package/src/modules/forms/widgets/injection/audit-format.ts +60 -0
  2131. package/src/modules/forms/widgets/injection/context.ts +24 -0
  2132. package/src/modules/forms/widgets/injection/embedded-form/widget.tsx +102 -0
  2133. package/src/modules/forms/widgets/injection/pdf-download-button/widget.tsx +111 -0
  2134. package/src/modules/forms/widgets/injection/self-audit-footer/widget.tsx +56 -0
  2135. package/src/modules/forms/widgets/injection-table.ts +54 -0
  2136. package/src/modules/forms/workers/pdf-snapshot.ts +110 -0
  2137. package/src/modules/forms/workers/retention-purge.ts +169 -0
  2138. package/src/modules/inbox_ops/api/proposals/[id]/actions/[actionId]/route.ts +7 -1
  2139. package/src/modules/inbox_ops/data/validators.ts +2 -1
  2140. package/src/modules/inbox_ops/lib/llmProvider.ts +11 -0
  2141. package/src/modules/inbox_ops/widgets/notifications/ProposalCreatedRenderer.tsx +2 -2
  2142. package/src/modules/integrations/di.ts +5 -1
  2143. package/src/modules/integrations/lib/credentials-service.ts +45 -36
  2144. package/src/modules/messages/api/[id]/attachments/route.ts +12 -3
  2145. package/src/modules/messages/api/[id]/forward-preview/route.ts +9 -3
  2146. package/src/modules/messages/api/[id]/route.ts +83 -4
  2147. package/src/modules/messages/api/route.ts +123 -2
  2148. package/src/modules/messages/commands/messages.ts +81 -7
  2149. package/src/modules/messages/components/ComposeMessagePageClient.tsx +29 -1
  2150. package/src/modules/messages/data/validators.ts +10 -0
  2151. package/src/modules/messages/i18n/de.json +8 -0
  2152. package/src/modules/messages/i18n/en.json +8 -0
  2153. package/src/modules/messages/i18n/es.json +8 -0
  2154. package/src/modules/messages/i18n/ko.json +8 -0
  2155. package/src/modules/messages/i18n/pl.json +8 -0
  2156. package/src/modules/messages/lib/channelThreadAccess.ts +101 -0
  2157. package/src/modules/messages/lib/composeSenderDelegation.ts +182 -0
  2158. package/src/modules/messages/lib/composeSenderOptions.ts +56 -0
  2159. package/src/modules/messages/lib/email-sender.ts +1 -17
  2160. package/src/modules/messages/lib/forwarding.ts +17 -2
  2161. package/src/modules/messages/lib/markdownEmailBody.ts +25 -0
  2162. package/src/modules/messages/lib/messageSourceEntityTypes.ts +12 -0
  2163. package/src/modules/messages/lib/routeHelpers.ts +92 -0
  2164. package/src/modules/messages/subscribers/message-notification.ts +47 -1
  2165. package/src/modules/notifications/AGENTS.md +1 -1
  2166. package/src/modules/notifications/api/[id]/action/route.ts +2 -1
  2167. package/src/modules/notifications/api/openapi.ts +1 -0
  2168. package/src/modules/notifications/frontend/NotificationSettingsPageClient.tsx +77 -48
  2169. package/src/modules/notifications/i18n/de.json +1 -0
  2170. package/src/modules/notifications/i18n/en.json +1 -0
  2171. package/src/modules/notifications/i18n/es.json +1 -0
  2172. package/src/modules/notifications/i18n/ko.json +1 -0
  2173. package/src/modules/notifications/i18n/pl.json +1 -0
  2174. package/src/modules/notifications/lib/deliveryConfig.ts +31 -2
  2175. package/src/modules/notifications/lib/notificationMapper.ts +2 -0
  2176. package/src/modules/notifications/lib/safeHref.ts +7 -0
  2177. package/src/modules/planner/api/availability-date-specific.ts +2 -1
  2178. package/src/modules/planner/api/availability-weekly.ts +2 -1
  2179. package/src/modules/progress/AGENTS.md +2 -0
  2180. package/src/modules/progress/api/active/route.ts +14 -2
  2181. package/src/modules/progress/api/jobs/[id]/route.ts +44 -27
  2182. package/src/modules/progress/api/jobs/route.ts +22 -8
  2183. package/src/modules/progress/api/requestScope.ts +43 -0
  2184. package/src/modules/progress/lib/organizationScope.ts +17 -0
  2185. package/src/modules/progress/lib/progressService.ts +3 -2
  2186. package/src/modules/progress/lib/progressServiceImpl.ts +63 -14
  2187. package/src/modules/push_notifications/api/custom-send/route.ts +4 -1
  2188. package/src/modules/push_notifications/i18n/de.json +1 -0
  2189. package/src/modules/push_notifications/i18n/en.json +1 -0
  2190. package/src/modules/push_notifications/i18n/es.json +1 -0
  2191. package/src/modules/push_notifications/i18n/ko.json +1 -0
  2192. package/src/modules/push_notifications/i18n/pl.json +1 -0
  2193. package/src/modules/query_index/api/status.ts +4 -9
  2194. package/src/modules/query_index/di.ts +2 -1
  2195. package/src/modules/query_index/lib/engine.ts +2 -0
  2196. package/src/modules/query_index/lib/request-encryption.ts +31 -0
  2197. package/src/modules/query_index/lib/search-tokens.ts +42 -1
  2198. package/src/modules/resources/api/resources/tags/assign/route.ts +2 -1
  2199. package/src/modules/resources/api/resources/tags/unassign/route.ts +2 -1
  2200. package/src/modules/resources/commands/activities.ts +2 -2
  2201. package/src/modules/sales/api/document-history/route.ts +5 -1
  2202. package/src/modules/sales/api/document-numbers/route.ts +2 -1
  2203. package/src/modules/sales/api/quotes/convert/route.ts +2 -1
  2204. package/src/modules/sales/api/quotes/send/route.ts +2 -1
  2205. package/src/modules/sales/api/settings/document-numbers/route.ts +7 -1
  2206. package/src/modules/sales/api/settings/order-editing/route.ts +7 -1
  2207. package/src/modules/sales/commands/documents.ts +451 -131
  2208. package/src/modules/sales/commands/payments.ts +2 -1
  2209. package/src/modules/sales/commands/settings.ts +34 -6
  2210. package/src/modules/sales/commands/shipments.ts +2 -1
  2211. package/src/modules/sales/components/DocumentNumberSettings.tsx +41 -28
  2212. package/src/modules/sales/components/documents/ItemsSection.tsx +58 -13
  2213. package/src/modules/sales/i18n/de.json +2 -0
  2214. package/src/modules/sales/i18n/en.json +2 -0
  2215. package/src/modules/sales/i18n/es.json +2 -0
  2216. package/src/modules/sales/i18n/ko.json +2 -0
  2217. package/src/modules/sales/i18n/pl.json +2 -0
  2218. package/src/modules/sales/lib/lineSnapshots.ts +36 -0
  2219. package/src/modules/sales/setup.ts +4 -4
  2220. package/src/modules/sales/widgets/notifications/SalesOrderCreatedRenderer.tsx +2 -2
  2221. package/src/modules/sales/widgets/notifications/SalesQuoteCreatedRenderer.tsx +2 -2
  2222. package/src/modules/staff/api/leave-requests/accept/route.ts +2 -1
  2223. package/src/modules/staff/api/leave-requests/reject/route.ts +2 -1
  2224. package/src/modules/staff/api/leave-requests.ts +2 -1
  2225. package/src/modules/staff/api/team-members/self/route.ts +2 -1
  2226. package/src/modules/staff/api/team-members/tags/assign/route.ts +2 -1
  2227. package/src/modules/staff/api/team-members/tags/unassign/route.ts +2 -1
  2228. package/src/modules/staff/api/timesheets/_shared/withTimesheetInterceptors.ts +16 -16
  2229. package/src/modules/staff/api/timesheets/my-projects/[projectId]/route.ts +2 -1
  2230. package/src/modules/staff/api/timesheets/my-projects/route.ts +2 -1
  2231. package/src/modules/staff/api/timesheets/my-work/route.ts +2 -1
  2232. package/src/modules/staff/api/timesheets/projects/kpis/route.ts +2 -1
  2233. package/src/modules/staff/api/timesheets/reports/[id]/close/route.ts +2 -1
  2234. package/src/modules/staff/api/timesheets/reports/[id]/export/route.ts +3 -2
  2235. package/src/modules/staff/api/timesheets/reports/[id]/sheet/route.ts +3 -2
  2236. package/src/modules/staff/api/timesheets/reports/[id]/unlock/route.ts +3 -2
  2237. package/src/modules/staff/api/timesheets/reports/preview/route.ts +2 -1
  2238. package/src/modules/staff/api/timesheets/reports/shared.ts +2 -1
  2239. package/src/modules/staff/api/timesheets/settings/reapply-rounding/route.ts +2 -1
  2240. package/src/modules/staff/api/timesheets/tags/entry-assignments/route.ts +2 -1
  2241. package/src/modules/staff/api/timesheets/tags/task-assignments/route.ts +2 -1
  2242. package/src/modules/staff/api/timesheets/tasks/[id]/comments/route.ts +2 -1
  2243. package/src/modules/staff/api/timesheets/tasks/[id]/status/route.ts +2 -1
  2244. package/src/modules/staff/api/timesheets/time-entries/[id]/duplicate/route.ts +3 -2
  2245. package/src/modules/staff/api/timesheets/time-entries/[id]/segments/[segmentId]/route.ts +2 -1
  2246. package/src/modules/staff/api/timesheets/time-entries/[id]/segments/route.ts +2 -1
  2247. package/src/modules/staff/api/timesheets/time-entries/[id]/timer-start/route.ts +2 -1
  2248. package/src/modules/staff/api/timesheets/time-entries/[id]/timer-stop/route.ts +2 -1
  2249. package/src/modules/staff/api/timesheets/time-entries/bulk/route.ts +2 -1
  2250. package/src/modules/staff/api/timesheets/time-entries/copy-day/route.ts +3 -2
  2251. package/src/modules/staff/api/timesheets/time-entries/overlaps/route.ts +2 -1
  2252. package/src/modules/staff/api/timesheets/time-entries/start-timer/route.ts +3 -2
  2253. package/src/modules/staff/api/timesheets/time-projects/[id]/change-currency/route.ts +3 -2
  2254. package/src/modules/staff/api/timesheets/time-projects/route.ts +2 -1
  2255. package/src/modules/staff/commands/activities.ts +2 -2
  2256. package/src/modules/staff/commands/timesheets-entries.ts +3 -2
  2257. package/src/modules/staff/commands/timesheets-reports.ts +88 -15
  2258. package/src/modules/staff/lib/timesheets-reports/buildReportSheet.ts +1 -0
  2259. package/src/modules/staff/lib/timesheets-reports/loadReportData.ts +69 -8
  2260. package/src/modules/staff/lib/timesheets-reports/reportPeriod.ts +18 -0
  2261. package/src/modules/staff/lib/timesheets-ui/CalendarPicker.tsx +21 -10
  2262. package/src/modules/sync_excel/api/import/route.ts +40 -12
  2263. package/src/modules/sync_excel/api/upload/route.ts +34 -4
  2264. package/src/modules/translations/api/context.ts +2 -1
  2265. package/src/modules/warranty_claims/api/ai/assess/route.ts +2 -1
  2266. package/src/modules/warranty_claims/api/ai/draft-reply/route.ts +2 -1
  2267. package/src/modules/warranty_claims/api/ai/suggest/route.ts +2 -1
  2268. package/src/modules/warranty_claims/api/assign/route.ts +2 -1
  2269. package/src/modules/warranty_claims/api/credit-memo/route.ts +2 -1
  2270. package/src/modules/warranty_claims/api/entitlement/route.ts +2 -1
  2271. package/src/modules/warranty_claims/api/events/route.ts +2 -1
  2272. package/src/modules/warranty_claims/api/external/claims/route.ts +2 -1
  2273. package/src/modules/warranty_claims/api/receiving/route.ts +2 -1
  2274. package/src/modules/warranty_claims/api/replacement-order/route.ts +2 -1
  2275. package/src/modules/warranty_claims/api/return-label/route.ts +2 -1
  2276. package/src/modules/warranty_claims/api/risk/route.ts +2 -1
  2277. package/src/modules/warranty_claims/api/sales-return/route.ts +2 -1
  2278. package/src/modules/warranty_claims/api/settings-general/route.ts +2 -1
  2279. package/src/modules/warranty_claims/api/stats/route.ts +11 -11
  2280. package/src/modules/warranty_claims/api/submit/route.ts +2 -1
  2281. package/src/modules/warranty_claims/api/transition/route.ts +2 -1
  2282. package/src/modules/warranty_claims/api/vendor-recovery/route.ts +2 -1
  2283. package/src/modules/warranty_claims/api/vendor-recovery-suggestions/route.ts +2 -1
  2284. package/src/modules/warranty_claims/i18n/de.json +1 -0
  2285. package/src/modules/warranty_claims/i18n/en.json +1 -0
  2286. package/src/modules/warranty_claims/i18n/es.json +1 -0
  2287. package/src/modules/warranty_claims/i18n/ko.json +1 -0
  2288. package/src/modules/warranty_claims/i18n/pl.json +1 -0
  2289. package/src/modules/warranty_claims/widgets/notifications/WarrantyClaimNotificationRenderer.tsx +1 -1
  2290. package/src/modules/wms/api/dashboard/operational/route.ts +2 -1
  2291. package/src/modules/wms/api/inventory/cycle-count/route.ts +1 -0
  2292. package/src/modules/wms/api/inventory/helpers.ts +2 -1
  2293. package/src/modules/wms/api/inventory/import/helpers.ts +2 -1
  2294. package/src/modules/wms/api/sales-orders/[salesOrderId]/warehouse-assignment/route.ts +2 -1
  2295. package/src/modules/wms/commands/inventory-actions.ts +45 -1
  2296. package/src/modules/wms/components/backend/CycleCountWizardDialog.tsx +14 -1
  2297. package/src/modules/wms/di.ts +6 -0
  2298. package/src/modules/wms/i18n/de.json +2 -0
  2299. package/src/modules/wms/i18n/en.json +2 -0
  2300. package/src/modules/wms/i18n/es.json +2 -0
  2301. package/src/modules/wms/i18n/ko.json +2 -0
  2302. package/src/modules/wms/i18n/pl.json +2 -0
  2303. package/src/modules/wms/lib/availabilityCache.ts +137 -0
  2304. package/src/modules/wms/lib/availabilityCalculation.ts +351 -0
  2305. package/src/modules/wms/lib/availabilityProvider.ts +47 -0
  2306. package/src/modules/wms/lib/loadOperationalDashboard.ts +51 -3
  2307. package/src/modules/wms/lib/lowStockBalanceFilter.ts +23 -10
  2308. package/src/modules/wms/lib/sqlInClause.ts +21 -0
  2309. package/src/modules/wms/lib/tryResolve.ts +8 -0
  2310. package/src/modules/wms/subscribers/invalidate-availability-cache-policy.ts +18 -0
  2311. package/src/modules/wms/subscribers/invalidate-availability-cache-profile.ts +18 -0
  2312. package/src/modules/wms/subscribers/invalidate-availability-cache.ts +30 -0
  2313. package/src/modules/wms/widgets/notifications/WmsLowStockRenderer.tsx +2 -2
  2314. package/src/modules/wms/widgets/notifications/WmsReservationShortfallRenderer.tsx +4 -3
  2315. package/src/modules/workflows/AGENTS.md +7 -5
  2316. package/src/modules/workflows/api/commands/route.ts +4 -1
  2317. package/src/modules/workflows/api/definitions/[id]/callers/route.ts +4 -1
  2318. package/src/modules/workflows/api/definitions/[id]/context-schema/route.ts +4 -2
  2319. package/src/modules/workflows/api/definitions/[id]/customize/route.ts +4 -1
  2320. package/src/modules/workflows/api/definitions/[id]/draft/route.ts +6 -1
  2321. package/src/modules/workflows/api/definitions/[id]/publish/route.ts +10 -1
  2322. package/src/modules/workflows/api/definitions/[id]/reset-to-code/route.ts +4 -1
  2323. package/src/modules/workflows/api/definitions/[id]/route.ts +5 -3
  2324. package/src/modules/workflows/api/definitions/[id]/test-step/route.ts +4 -2
  2325. package/src/modules/workflows/api/definitions/generate/route.ts +4 -1
  2326. package/src/modules/workflows/api/definitions/route.ts +4 -2
  2327. package/src/modules/workflows/api/endpoints/route.ts +4 -1
  2328. package/src/modules/workflows/api/functions/route.ts +4 -1
  2329. package/src/modules/workflows/api/grantable-features/route.ts +2 -1
  2330. package/src/modules/workflows/api/instances/[id]/advance/route.ts +4 -1
  2331. package/src/modules/workflows/api/instances/[id]/cancel/route.ts +4 -1
  2332. package/src/modules/workflows/api/instances/[id]/context/route.ts +2 -1
  2333. package/src/modules/workflows/api/instances/[id]/rerun-step/route.ts +4 -1
  2334. package/src/modules/workflows/api/instances/[id]/retry/route.ts +4 -1
  2335. package/src/modules/workflows/api/instances/[id]/signal/route.ts +4 -1
  2336. package/src/modules/workflows/api/instances/[id]/step-through/route.ts +4 -2
  2337. package/src/modules/workflows/api/instances/route.ts +4 -2
  2338. package/src/modules/workflows/api/instances/validate-start/route.ts +4 -1
  2339. package/src/modules/workflows/api/rule-usage/route.ts +4 -1
  2340. package/src/modules/workflows/api/signals/route.ts +4 -1
  2341. package/src/modules/workflows/api/tasks/[id]/claim/route.ts +4 -1
  2342. package/src/modules/workflows/api/tasks/[id]/complete/route.ts +4 -1
  2343. package/src/modules/workflows/api/tasks/[id]/reassign/route.ts +2 -1
  2344. package/src/modules/workflows/api/tasks/[id]/unclaim/route.ts +4 -1
  2345. package/src/modules/workflows/api/templates/route.ts +4 -1
  2346. package/src/modules/workflows/api/work-inbox/next/route.ts +4 -1
  2347. package/src/modules/workflows/lib/activity-executor.ts +125 -28
  2348. package/src/modules/workflows/lib/activity-types.ts +8 -4
  2349. package/src/modules/workflows/lib/activity-worker-handler.ts +16 -12
  2350. package/src/modules/workflows/lib/event-trigger-service.ts +18 -2
  2351. package/src/modules/workflows/lib/step-handler.ts +13 -8
  2352. package/src/test-utils/transactionalEntityManagerDouble.ts +51 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/auth/lib/grantChecks.ts"],
4
- "sourcesContent": ["import type { EntityManager, FilterQuery } from '@mikro-orm/postgresql'\nimport { badRequest, CrudHttpError, forbidden } from '@open-mercato/shared/lib/crud/errors'\nimport { hasFeature } from '@open-mercato/shared/security/features'\nimport { findOneWithDecryption, findWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport { Role, RoleAcl, User, UserAcl, UserRole } from '@open-mercato/core/modules/auth/data/entities'\nimport type { RbacService } from '@open-mercato/core/modules/auth/services/rbacService'\nimport type { OrganizationScope } from '@open-mercato/core/modules/directory/utils/organizationScope'\n\ntype ActorAcl = {\n isSuperAdmin: boolean\n features: string[]\n organizations: string[] | null\n}\n\ntype GrantCheckContext = {\n em: EntityManager\n rbacService: RbacService\n actorUserId: string | null | undefined\n tenantId: string | null | undefined\n organizationId?: string | null | undefined\n}\n\ntype RoleGrantCheckInput = GrantCheckContext & {\n roles: Role[]\n}\n\ntype RoleTokenGrantCheckInput = GrantCheckContext & {\n roleTokens: unknown\n}\n\ntype UserDestinationRolesInput = {\n em: EntityManager\n targetUserId: string\n destinationTenantId: string | null | undefined\n roleTokens: unknown\n}\n\ntype UserDestinationScopeCheckInput = GrantCheckContext & {\n actorIsSuperAdmin?: boolean\n allowedOrganizationIds?: string[] | null\n destinationTenantId: string | null | undefined\n destinationOrganizationId: string | null | undefined\n roles: Role[]\n}\n\ntype FeatureGrantCheckInput = GrantCheckContext & {\n features: unknown\n isSuperAdmin?: boolean\n organizations?: string[] | null\n}\n\ntype SuperAdminUserTargetInput = GrantCheckContext & {\n targetUserId: string\n actorIsSuperAdmin?: boolean\n}\n\ntype UserTargetAccessInput = SuperAdminUserTargetInput & {\n organizationScope: Pick<OrganizationScope, 'allowedIds'>\n}\n\ntype SuperAdminRoleTargetInput = GrantCheckContext & {\n targetRoleId: string\n actorIsSuperAdmin?: boolean\n}\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\n\nexport async function assertActorCanGrantRoleTokens(input: RoleTokenGrantCheckInput): Promise<Role[]> {\n const tokens = normalizeStringList(input.roleTokens)\n if (!tokens.length) return []\n\n const tenantId = normalizeNullableString(input.tenantId)\n const roles = await resolveRolesForGrant(input.em, tokens, tenantId)\n await assertActorCanGrantRoles({ ...input, tenantId, roles })\n return roles\n}\n\nexport async function resolveUserDestinationRoles(input: UserDestinationRolesInput): Promise<Role[]> {\n const destinationTenantId = normalizeNullableString(input.destinationTenantId)\n if (Array.isArray(input.roleTokens)) {\n return resolveRolesForGrant(input.em, normalizeStringList(input.roleTokens), destinationTenantId)\n }\n\n const links = await findWithDecryption(\n input.em,\n UserRole,\n { user: input.targetUserId as unknown as User } as FilterQuery<UserRole>,\n { populate: ['role'] },\n { tenantId: null, organizationId: null },\n )\n const roles: Role[] = []\n for (const link of links) {\n const linkedRole = (link as { role?: Role | string | null }).role\n if (linkedRole && typeof linkedRole === 'object') {\n roles.push(linkedRole)\n continue\n }\n if (typeof linkedRole === 'string') {\n const resolvedRole = await resolveRoleForGrant(input.em, linkedRole, null)\n if (resolvedRole) {\n roles.push(resolvedRole)\n continue\n }\n }\n throw badRequest(await translateAuthError(\n 'auth.users.errors.invalidRoleAssignment',\n 'User has an invalid role assignment',\n ))\n }\n return roles\n}\n\nexport async function assertActorCanAssignUserDestination(\n input: UserDestinationScopeCheckInput,\n): Promise<void> {\n const destinationTenantId = normalizeNullableString(input.destinationTenantId)\n const destinationOrganizationId = normalizeNullableString(input.destinationOrganizationId)\n if (!destinationTenantId || !destinationOrganizationId) {\n return throwUserDestinationOrganizationNotFound(400)\n }\n\n for (const role of input.roles) {\n if (normalizeNullableString(role.tenantId) !== destinationTenantId) {\n throw forbidden(await translateAuthError(\n 'auth.users.errors.roleOutsideDestinationTenant',\n 'Cannot retain or assign a role outside the destination tenant.',\n ))\n }\n }\n\n if (await resolveActorIsSuperAdmin(input)) return\n\n const actorTenantId = normalizeNullableString(input.tenantId)\n if (!actorTenantId || actorTenantId !== destinationTenantId) {\n return throwUserDestinationOrganizationNotFound(404)\n }\n\n const actorAcl = await loadActorAcl(input)\n const allowedOrganizationIds = input.allowedOrganizationIds === undefined\n ? actorAcl.organizations\n : input.allowedOrganizationIds\n if (\n allowedOrganizationIds !== null\n && !allowedOrganizationIds.includes('__all__')\n && !allowedOrganizationIds.includes(destinationOrganizationId)\n ) {\n throw forbidden(await translateAuthError(\n 'auth.users.errors.destinationOrganizationOutsideScope',\n 'Cannot assign user to a destination organization outside actor scope.',\n ))\n }\n\n await assertActorCanGrantRoles({\n ...input,\n tenantId: destinationTenantId,\n roles: input.roles,\n })\n}\n\nexport async function throwUserDestinationOrganizationNotFound(status: 400 | 404): Promise<never> {\n throw new CrudHttpError(status, {\n error: await translateAuthError(\n 'auth.users.errors.organizationNotFound',\n 'Organization not found',\n ),\n })\n}\n\nexport async function assertActorCanGrantRoles(input: RoleGrantCheckInput): Promise<void> {\n if (!input.roles.length) return\n\n const tenantId = normalizeNullableString(input.tenantId)\n const actorAcl = await loadActorAcl({ ...input, tenantId })\n if (actorAcl.isSuperAdmin) return\n\n if (!tenantId) {\n throw forbidden('Tenant context is required to grant roles.')\n }\n\n for (const role of input.roles) {\n const roleTenantId = normalizeNullableString(role.tenantId)\n if (roleTenantId !== tenantId) {\n throw forbidden('Cannot grant a role outside the target tenant.')\n }\n\n const acl = await findOneWithDecryption(\n input.em,\n RoleAcl,\n { role, tenantId } as FilterQuery<RoleAcl>,\n {},\n { tenantId, organizationId: null },\n )\n if (!acl) continue\n\n assertActorCanGrantAclSnapshot(actorAcl, {\n isSuperAdmin: !!acl.isSuperAdmin,\n features: normalizeStringList(acl.featuresJson),\n organizations: normalizeOrganizationList(acl.organizationsJson),\n })\n }\n}\n\nexport async function assertActorCanGrantAcl(input: FeatureGrantCheckInput): Promise<void> {\n const actorAcl = await loadActorAcl(input)\n if (actorAcl.isSuperAdmin) return\n\n const tenantId = normalizeNullableString(input.tenantId)\n if (!tenantId) {\n throw forbidden('Tenant context is required to grant ACL features.')\n }\n\n assertActorCanGrantAclSnapshot(actorAcl, {\n isSuperAdmin: !!input.isSuperAdmin,\n features: normalizeStringList(input.features),\n organizations: input.organizations === undefined ? undefined : normalizeOrganizationList(input.organizations),\n })\n}\n\nexport function normalizeGrantFeatureList(features: unknown): string[] {\n return normalizeStringList(features)\n}\n\nexport async function assertActorCanModifySuperAdminUserTarget(input: SuperAdminUserTargetInput): Promise<void> {\n const actorIsSuperAdmin = await resolveActorIsSuperAdmin(input)\n if (actorIsSuperAdmin) return\n const targetIsSuperAdmin = await isUserEffectivelySuperAdmin(input.em, input.targetUserId)\n if (targetIsSuperAdmin) {\n throw forbidden('Only super administrators can modify super administrator accounts.')\n }\n}\n\nexport async function assertActorCanModifySuperAdminRoleTarget(input: SuperAdminRoleTargetInput): Promise<void> {\n const actorIsSuperAdmin = await resolveActorIsSuperAdmin(input)\n if (actorIsSuperAdmin) return\n const targetIsSuperAdmin = await isRoleEffectivelySuperAdmin(input.em, input.targetRoleId)\n if (targetIsSuperAdmin) {\n throw forbidden('Only super administrators can modify super administrator roles.')\n }\n}\n\n/**\n * `input.tenantId` is the ACTOR's scope, not the target's: the check below is a\n * comparison between the two, so passing a tenant derived from the target turns\n * it into a tautology. Callers that resolve a record scope separately MUST still\n * hand this guard `auth.tenantId`.\n */\nexport async function assertActorCanAccessUserTarget(input: UserTargetAccessInput): Promise<void> {\n const isSuperAdmin = await resolveActorIsSuperAdmin(input)\n if (isSuperAdmin) return\n\n const target = await findOneWithDecryption(\n input.em,\n User,\n { id: input.targetUserId } as FilterQuery<User>,\n {},\n { tenantId: null, organizationId: null },\n )\n // Not found (incl. soft-deleted, which MikroORM's soft-delete filter hides):\n // delegate to the caller. Every wired call site is itself tenant-scoped \u2014 the\n // ACL/consents reads filter by auth.tenantId and the user commands re-load by\n // id within tenant \u2014 so a missing target yields a safe empty/404 there. The\n // guard's job is to block a foreign *existing* target, below.\n if (!target) return\n\n const actorTenantId = normalizeNullableString(input.tenantId)\n const targetTenantId = normalizeNullableString((target as { tenantId?: string | null }).tenantId)\n if (!targetTenantId || targetTenantId !== actorTenantId) {\n throw new CrudHttpError(404, { error: 'User not found' })\n }\n\n if (input.organizationScope.allowedIds !== null) {\n const targetOrganizationId = normalizeNullableString((target as { organizationId?: string | null }).organizationId)\n if (!targetOrganizationId || !input.organizationScope.allowedIds.includes(targetOrganizationId)) {\n throw forbidden('Not authorized to access this user.')\n }\n }\n}\n\nexport async function assertActorCanAccessRoleTarget(input: SuperAdminRoleTargetInput): Promise<void> {\n const isSuperAdmin = await resolveActorIsSuperAdmin(input)\n if (isSuperAdmin) return\n\n const target = await findOneWithDecryption(\n input.em,\n Role,\n { id: input.targetRoleId } as FilterQuery<Role>,\n {},\n { tenantId: null, organizationId: null },\n )\n // Not found (incl. soft-deleted): delegate (see assertActorCanAccessUserTarget).\n if (!target) return\n\n const actorTenantId = normalizeNullableString(input.tenantId)\n const targetTenantId = normalizeNullableString((target as { tenantId?: string | null }).tenantId)\n if (!targetTenantId || targetTenantId !== actorTenantId) {\n throw new CrudHttpError(404, { error: 'Role not found' })\n }\n}\n\nasync function resolveActorIsSuperAdmin(input: GrantCheckContext & { actorIsSuperAdmin?: boolean }): Promise<boolean> {\n if (typeof input.actorIsSuperAdmin === 'boolean') return input.actorIsSuperAdmin\n const acl = await loadActorAcl(input)\n return acl.isSuperAdmin\n}\n\nexport async function isUserEffectivelySuperAdmin(em: EntityManager, userId: string): Promise<boolean> {\n const directGrant = await em.findOne(\n UserAcl,\n { user: userId as unknown, isSuperAdmin: true } as FilterQuery<UserAcl>,\n )\n if (directGrant && (directGrant as { isSuperAdmin?: boolean }).isSuperAdmin === true) return true\n const links = await findWithDecryption(\n em,\n UserRole,\n { user: userId as unknown } as FilterQuery<UserRole>,\n { populate: ['role'] },\n { tenantId: null, organizationId: null },\n )\n const roleIds = (Array.isArray(links) ? links : [])\n .map((link) => {\n const role = (link as { role?: { id?: unknown } | string | null }).role\n if (!role) return null\n if (typeof role === 'string') return role\n return role.id ? String(role.id) : null\n })\n .filter((id): id is string => typeof id === 'string' && id.length > 0)\n if (!roleIds.length) return false\n const roleGrant = await em.findOne(\n RoleAcl,\n { role: { $in: roleIds } as unknown, isSuperAdmin: true } as FilterQuery<RoleAcl>,\n )\n return !!roleGrant && (roleGrant as { isSuperAdmin?: boolean }).isSuperAdmin === true\n}\n\nexport async function isRoleEffectivelySuperAdmin(em: EntityManager, roleId: string): Promise<boolean> {\n const grant = await em.findOne(\n RoleAcl,\n { role: roleId as unknown, isSuperAdmin: true } as FilterQuery<RoleAcl>,\n )\n return !!grant && (grant as { isSuperAdmin?: boolean }).isSuperAdmin === true\n}\n\nexport async function listSuperAdminUserIds(em: EntityManager, tenantId: string | null): Promise<Set<string>> {\n const ids = new Set<string>()\n const userAclFilter: Record<string, unknown> = { isSuperAdmin: true }\n if (tenantId) userAclFilter.tenantId = tenantId\n const userAcls = await em.find(UserAcl, userAclFilter as FilterQuery<UserAcl>)\n for (const acl of userAcls) {\n const userRef = (acl as { user?: { id?: unknown } | string | null }).user\n const userId = userRef && typeof userRef === 'object'\n ? userRef.id\n : userRef\n if (userId) ids.add(String(userId))\n }\n const roleAcls = await em.find(\n RoleAcl,\n { isSuperAdmin: true } as FilterQuery<RoleAcl>,\n )\n const roleIds = roleAcls\n .map((acl) => {\n const roleRef = (acl as { role?: { id?: unknown } | string | null }).role\n if (!roleRef) return null\n if (typeof roleRef === 'string') return roleRef\n return roleRef.id ? String(roleRef.id) : null\n })\n .filter((id): id is string => typeof id === 'string' && id.length > 0)\n if (roleIds.length) {\n const links = await findWithDecryption(\n em,\n UserRole,\n { role: { $in: roleIds } as unknown } as FilterQuery<UserRole>,\n {},\n { tenantId: null, organizationId: null },\n )\n for (const link of Array.isArray(links) ? links : []) {\n const userRef = (link as { user?: { id?: unknown } | string | null }).user\n const userId = userRef && typeof userRef === 'object'\n ? userRef.id\n : userRef\n if (userId) ids.add(String(userId))\n }\n }\n return ids\n}\n\nasync function loadActorAcl(input: GrantCheckContext): Promise<ActorAcl> {\n const actorUserId = normalizeNullableString(input.actorUserId)\n if (!actorUserId) throw forbidden('Not authorized to grant ACL privileges.')\n\n const acl = await input.rbacService.loadAcl(actorUserId, {\n tenantId: normalizeNullableString(input.tenantId),\n organizationId: normalizeNullableString(input.organizationId),\n })\n\n return {\n isSuperAdmin: !!acl?.isSuperAdmin,\n features: normalizeStringList(acl?.features),\n organizations: normalizeOrganizationList(acl?.organizations),\n }\n}\n\nasync function resolveRolesForGrant(\n em: EntityManager,\n roleTokens: string[],\n tenantId: string | null,\n): Promise<Role[]> {\n const roles: Role[] = []\n const missingRoles: string[] = []\n\n for (const token of roleTokens) {\n const role = await resolveRoleForGrant(em, token, tenantId)\n if (!role) {\n missingRoles.push(token)\n } else {\n roles.push(role)\n }\n }\n\n if (missingRoles.length) {\n const labels = missingRoles.map((role) => `\"${role}\"`).join(', ')\n throw new CrudHttpError(400, { error: `Role(s) not found: ${labels}` })\n }\n\n return roles\n}\n\nasync function resolveRoleForGrant(\n em: EntityManager,\n token: string,\n tenantId: string | null,\n): Promise<Role | null> {\n const where: Record<string, unknown> = UUID_RE.test(token)\n ? { id: token, deletedAt: null }\n : { name: token, deletedAt: null }\n if (tenantId) where.tenantId = tenantId\n return findOneWithDecryption(\n em,\n Role,\n where as FilterQuery<Role>,\n {},\n { tenantId, organizationId: null },\n )\n}\n\nfunction assertActorCanGrantAclSnapshot(\n actorAcl: ActorAcl,\n requested: {\n isSuperAdmin: boolean\n features: string[]\n organizations?: string[] | null\n },\n): void {\n if (requested.isSuperAdmin) {\n throw forbidden('Only super administrators can grant super admin access.')\n }\n\n const actorGrantableFeatures = actorAcl.features.filter((grant) => grant !== '*')\n for (const feature of requested.features) {\n if (feature === '*') {\n throw forbidden('Only super administrators can grant global wildcard access.')\n }\n if (isWildcardFeature(feature)) {\n if (!hasFeature(actorGrantableFeatures, feature)) {\n throw forbidden(`Cannot grant feature wildcard ${feature}.`)\n }\n continue\n }\n if (!hasFeature(actorGrantableFeatures, feature)) {\n throw forbidden(`Cannot grant feature ${feature}.`)\n }\n }\n\n if (requested.organizations !== undefined) {\n assertActorCanGrantOrganizations(actorAcl.organizations, requested.organizations)\n }\n}\n\nfunction assertActorCanGrantOrganizations(\n actorOrganizations: string[] | null,\n requestedOrganizations: string[] | null,\n): void {\n if (actorOrganizations === null || actorOrganizations.includes('__all__')) return\n\n if (requestedOrganizations === null || requestedOrganizations.includes('__all__')) {\n throw forbidden('Cannot grant unrestricted organization access.')\n }\n\n for (const organizationId of requestedOrganizations) {\n if (!actorOrganizations.includes(organizationId)) {\n throw forbidden('Cannot grant organization access outside actor scope.')\n }\n }\n}\n\nfunction normalizeStringList(values: unknown): string[] {\n if (!Array.isArray(values)) return []\n const dedup = new Set<string>()\n for (const value of values) {\n if (typeof value !== 'string') continue\n const trimmed = value.trim()\n if (!trimmed) continue\n dedup.add(trimmed)\n }\n return Array.from(dedup)\n}\n\nfunction normalizeOrganizationList(values: unknown): string[] | null {\n if (values === null || values === undefined) return null\n return normalizeStringList(values)\n}\n\nfunction normalizeNullableString(value: unknown): string | null {\n return typeof value === 'string' && value.trim().length > 0 ? value.trim() : null\n}\n\nfunction isWildcardFeature(feature: string): boolean {\n return feature.endsWith('.*')\n}\n\nasync function translateAuthError(key: string, fallback: string): Promise<string> {\n const { translate } = await resolveTranslations()\n return translate(key, fallback)\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { EntityManager, FilterQuery } from '@mikro-orm/postgresql'\nimport { badRequest, CrudHttpError, forbidden } from '@open-mercato/shared/lib/crud/errors'\nimport { hasFeature } from '@open-mercato/shared/security/features'\nimport { findOneWithDecryption, findWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { resolveTranslations } from '@open-mercato/shared/lib/i18n/server'\nimport { Role, RoleAcl, User, UserAcl, UserRole } from '@open-mercato/core/modules/auth/data/entities'\nimport type { RbacService } from '@open-mercato/core/modules/auth/services/rbacService'\nimport type { OrganizationScope } from '@open-mercato/core/modules/directory/utils/organizationScope'\n\ntype ActorAcl = {\n isSuperAdmin: boolean\n features: string[]\n organizations: string[] | null\n}\n\ntype GrantCheckContext = {\n em: EntityManager\n rbacService: RbacService\n actorUserId: string | null | undefined\n tenantId: string | null | undefined\n organizationId?: string | null | undefined\n requireBoundRbac?: boolean\n}\n\ntype RoleGrantCheckInput = GrantCheckContext & {\n roles: Role[]\n}\n\ntype RoleTokenGrantCheckInput = GrantCheckContext & {\n roleTokens: unknown\n}\n\ntype UserDestinationRolesInput = {\n em: EntityManager\n targetUserId: string\n destinationTenantId: string | null | undefined\n roleTokens: unknown\n}\n\ntype UserDestinationScopeCheckInput = GrantCheckContext & {\n actorIsSuperAdmin?: boolean\n allowedOrganizationIds?: string[] | null\n destinationTenantId: string | null | undefined\n destinationOrganizationId: string | null | undefined\n roles: Role[]\n}\n\ntype FeatureGrantCheckInput = GrantCheckContext & {\n features: unknown\n isSuperAdmin?: boolean\n organizations?: string[] | null\n}\n\ntype SuperAdminUserTargetInput = GrantCheckContext & {\n targetUserId: string\n actorIsSuperAdmin?: boolean\n}\n\ntype UserTargetAccessInput = SuperAdminUserTargetInput & {\n organizationScope: Pick<OrganizationScope, 'allowedIds'>\n}\n\ntype SuperAdminRoleTargetInput = GrantCheckContext & {\n targetRoleId: string\n actorIsSuperAdmin?: boolean\n}\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\n\nexport async function assertActorCanGrantRoleTokens(input: RoleTokenGrantCheckInput): Promise<Role[]> {\n const tokens = normalizeStringList(input.roleTokens)\n if (!tokens.length) return []\n\n const tenantId = normalizeNullableString(input.tenantId)\n const roles = await resolveRolesForGrant(input.em, tokens, tenantId)\n await assertActorCanGrantRoles({ ...input, tenantId, roles })\n return roles\n}\n\nexport async function resolveUserDestinationRoles(input: UserDestinationRolesInput): Promise<Role[]> {\n const destinationTenantId = normalizeNullableString(input.destinationTenantId)\n if (Array.isArray(input.roleTokens)) {\n return resolveRolesForGrant(input.em, normalizeStringList(input.roleTokens), destinationTenantId)\n }\n\n const links = await findWithDecryption(\n input.em,\n UserRole,\n { user: input.targetUserId as unknown as User } as FilterQuery<UserRole>,\n { populate: ['role'] },\n { tenantId: null, organizationId: null },\n )\n const roles: Role[] = []\n for (const link of links) {\n const linkedRole = (link as { role?: Role | string | null }).role\n if (linkedRole && typeof linkedRole === 'object') {\n roles.push(linkedRole)\n continue\n }\n if (typeof linkedRole === 'string') {\n const resolvedRole = await resolveRoleForGrant(input.em, linkedRole, null)\n if (resolvedRole) {\n roles.push(resolvedRole)\n continue\n }\n }\n throw badRequest(await translateAuthError(\n 'auth.users.errors.invalidRoleAssignment',\n 'User has an invalid role assignment',\n ))\n }\n return roles\n}\n\nexport async function assertActorCanAssignUserDestination(\n input: UserDestinationScopeCheckInput,\n): Promise<void> {\n const destinationTenantId = normalizeNullableString(input.destinationTenantId)\n const destinationOrganizationId = normalizeNullableString(input.destinationOrganizationId)\n if (!destinationTenantId || !destinationOrganizationId) {\n return throwUserDestinationOrganizationNotFound(400)\n }\n\n for (const role of input.roles) {\n if (normalizeNullableString(role.tenantId) !== destinationTenantId) {\n throw forbidden(await translateAuthError(\n 'auth.users.errors.roleOutsideDestinationTenant',\n 'Cannot retain or assign a role outside the destination tenant.',\n ))\n }\n }\n\n if (await resolveActorIsSuperAdmin(input)) return\n\n const actorTenantId = normalizeNullableString(input.tenantId)\n if (!actorTenantId || actorTenantId !== destinationTenantId) {\n return throwUserDestinationOrganizationNotFound(404)\n }\n\n const actorAcl = await loadActorAcl(input)\n const allowedOrganizationIds = input.allowedOrganizationIds === undefined\n ? actorAcl.organizations\n : input.allowedOrganizationIds\n if (\n allowedOrganizationIds !== null\n && !allowedOrganizationIds.includes('__all__')\n && !allowedOrganizationIds.includes(destinationOrganizationId)\n ) {\n throw forbidden(await translateAuthError(\n 'auth.users.errors.destinationOrganizationOutsideScope',\n 'Cannot assign user to a destination organization outside actor scope.',\n ))\n }\n\n await assertActorCanGrantRoles({\n ...input,\n tenantId: destinationTenantId,\n roles: input.roles,\n })\n}\n\nexport async function throwUserDestinationOrganizationNotFound(status: 400 | 404): Promise<never> {\n throw new CrudHttpError(status, {\n error: await translateAuthError(\n 'auth.users.errors.organizationNotFound',\n 'Organization not found',\n ),\n })\n}\n\nexport async function assertActorCanGrantRoles(input: RoleGrantCheckInput): Promise<void> {\n if (!input.roles.length) return\n\n const tenantId = normalizeNullableString(input.tenantId)\n const actorAcl = await loadActorAcl({ ...input, tenantId })\n if (actorAcl.isSuperAdmin) return\n\n if (!tenantId) {\n throw forbidden('Tenant context is required to grant roles.')\n }\n\n for (const role of input.roles) {\n const roleTenantId = normalizeNullableString(role.tenantId)\n if (roleTenantId !== tenantId) {\n throw forbidden('Cannot grant a role outside the target tenant.')\n }\n\n const acl = await findOneWithDecryption(\n input.em,\n RoleAcl,\n { role, tenantId } as FilterQuery<RoleAcl>,\n {},\n { tenantId, organizationId: null },\n )\n if (!acl) continue\n\n assertActorCanGrantAclSnapshot(actorAcl, {\n isSuperAdmin: !!acl.isSuperAdmin,\n features: normalizeStringList(acl.featuresJson),\n organizations: normalizeOrganizationList(acl.organizationsJson),\n })\n }\n}\n\nexport async function assertActorCanGrantAcl(input: FeatureGrantCheckInput): Promise<void> {\n const actorAcl = await loadActorAcl(input)\n if (actorAcl.isSuperAdmin) return\n\n const tenantId = normalizeNullableString(input.tenantId)\n if (!tenantId) {\n throw forbidden('Tenant context is required to grant ACL features.')\n }\n\n assertActorCanGrantAclSnapshot(actorAcl, {\n isSuperAdmin: !!input.isSuperAdmin,\n features: normalizeStringList(input.features),\n organizations: input.organizations === undefined ? undefined : normalizeOrganizationList(input.organizations),\n })\n}\n\nexport function normalizeGrantFeatureList(features: unknown): string[] {\n return normalizeStringList(features)\n}\n\nexport async function assertActorCanModifySuperAdminUserTarget(input: SuperAdminUserTargetInput): Promise<void> {\n const actorIsSuperAdmin = await resolveActorIsSuperAdmin(input)\n if (actorIsSuperAdmin) return\n const targetIsSuperAdmin = await isUserEffectivelySuperAdmin(input.em, input.targetUserId)\n if (targetIsSuperAdmin) {\n throw forbidden('Only super administrators can modify super administrator accounts.')\n }\n}\n\nexport async function assertActorCanModifySuperAdminRoleTarget(input: SuperAdminRoleTargetInput): Promise<void> {\n const actorIsSuperAdmin = await resolveActorIsSuperAdmin(input)\n if (actorIsSuperAdmin) return\n const targetIsSuperAdmin = await isRoleEffectivelySuperAdmin(input.em, input.targetRoleId)\n if (targetIsSuperAdmin) {\n throw forbidden('Only super administrators can modify super administrator roles.')\n }\n}\n\n/**\n * `input.tenantId` is the ACTOR's scope, not the target's: the check below is a\n * comparison between the two, so passing a tenant derived from the target turns\n * it into a tautology. Callers that resolve a record scope separately MUST still\n * hand this guard `auth.tenantId`.\n */\nexport async function assertActorCanAccessUserTarget(input: UserTargetAccessInput): Promise<void> {\n const isSuperAdmin = await resolveActorIsSuperAdmin(input)\n if (isSuperAdmin) return\n\n const target = await findOneWithDecryption(\n input.em,\n User,\n { id: input.targetUserId } as FilterQuery<User>,\n {},\n { tenantId: null, organizationId: null },\n )\n // Not found (incl. soft-deleted, which MikroORM's soft-delete filter hides):\n // delegate to the caller. Every wired call site is itself tenant-scoped \u2014 the\n // ACL/consents reads filter by auth.tenantId and the user commands re-load by\n // id within tenant \u2014 so a missing target yields a safe empty/404 there. The\n // guard's job is to block a foreign *existing* target, below.\n if (!target) return\n\n const actorTenantId = normalizeNullableString(input.tenantId)\n const targetTenantId = normalizeNullableString((target as { tenantId?: string | null }).tenantId)\n if (!targetTenantId || targetTenantId !== actorTenantId) {\n throw new CrudHttpError(404, { error: 'User not found' })\n }\n\n if (input.organizationScope.allowedIds !== null) {\n const targetOrganizationId = normalizeNullableString((target as { organizationId?: string | null }).organizationId)\n if (!targetOrganizationId || !input.organizationScope.allowedIds.includes(targetOrganizationId)) {\n throw forbidden('Not authorized to access this user.')\n }\n }\n}\n\nexport async function assertActorCanAccessRoleTarget(input: SuperAdminRoleTargetInput): Promise<void> {\n const isSuperAdmin = await resolveActorIsSuperAdmin(input)\n if (isSuperAdmin) return\n\n const target = await findOneWithDecryption(\n input.em,\n Role,\n { id: input.targetRoleId } as FilterQuery<Role>,\n {},\n { tenantId: null, organizationId: null },\n )\n // Not found (incl. soft-deleted): delegate (see assertActorCanAccessUserTarget).\n if (!target) return\n\n const actorTenantId = normalizeNullableString(input.tenantId)\n const targetTenantId = normalizeNullableString((target as { tenantId?: string | null }).tenantId)\n if (!targetTenantId || targetTenantId !== actorTenantId) {\n throw new CrudHttpError(404, { error: 'Role not found' })\n }\n}\n\nasync function resolveActorIsSuperAdmin(input: GrantCheckContext & { actorIsSuperAdmin?: boolean }): Promise<boolean> {\n if (typeof input.actorIsSuperAdmin === 'boolean') return input.actorIsSuperAdmin\n const acl = await loadActorAcl(input)\n return acl.isSuperAdmin\n}\n\nexport async function isUserEffectivelySuperAdmin(em: EntityManager, userId: string): Promise<boolean> {\n const directGrant = await em.findOne(\n UserAcl,\n { user: userId as unknown, isSuperAdmin: true } as FilterQuery<UserAcl>,\n )\n if (directGrant && (directGrant as { isSuperAdmin?: boolean }).isSuperAdmin === true) return true\n const links = await findWithDecryption(\n em,\n UserRole,\n { user: userId as unknown } as FilterQuery<UserRole>,\n { populate: ['role'] },\n { tenantId: null, organizationId: null },\n )\n const roleIds = (Array.isArray(links) ? links : [])\n .map((link) => {\n const role = (link as { role?: { id?: unknown } | string | null }).role\n if (!role) return null\n if (typeof role === 'string') return role\n return role.id ? String(role.id) : null\n })\n .filter((id): id is string => typeof id === 'string' && id.length > 0)\n if (!roleIds.length) return false\n const roleGrant = await em.findOne(\n RoleAcl,\n { role: { $in: roleIds } as unknown, isSuperAdmin: true } as FilterQuery<RoleAcl>,\n )\n return !!roleGrant && (roleGrant as { isSuperAdmin?: boolean }).isSuperAdmin === true\n}\n\nexport async function isRoleEffectivelySuperAdmin(em: EntityManager, roleId: string): Promise<boolean> {\n const grant = await em.findOne(\n RoleAcl,\n { role: roleId as unknown, isSuperAdmin: true } as FilterQuery<RoleAcl>,\n )\n return !!grant && (grant as { isSuperAdmin?: boolean }).isSuperAdmin === true\n}\n\nexport async function listSuperAdminUserIds(em: EntityManager, tenantId: string | null): Promise<Set<string>> {\n const ids = new Set<string>()\n const userAclFilter: Record<string, unknown> = { isSuperAdmin: true }\n if (tenantId) userAclFilter.tenantId = tenantId\n const userAcls = await em.find(UserAcl, userAclFilter as FilterQuery<UserAcl>)\n for (const acl of userAcls) {\n const userRef = (acl as { user?: { id?: unknown } | string | null }).user\n const userId = userRef && typeof userRef === 'object'\n ? userRef.id\n : userRef\n if (userId) ids.add(String(userId))\n }\n const roleAcls = await em.find(\n RoleAcl,\n { isSuperAdmin: true } as FilterQuery<RoleAcl>,\n )\n const roleIds = roleAcls\n .map((acl) => {\n const roleRef = (acl as { role?: { id?: unknown } | string | null }).role\n if (!roleRef) return null\n if (typeof roleRef === 'string') return roleRef\n return roleRef.id ? String(roleRef.id) : null\n })\n .filter((id): id is string => typeof id === 'string' && id.length > 0)\n if (roleIds.length) {\n const links = await findWithDecryption(\n em,\n UserRole,\n { role: { $in: roleIds } as unknown } as FilterQuery<UserRole>,\n {},\n { tenantId: null, organizationId: null },\n )\n for (const link of Array.isArray(links) ? links : []) {\n const userRef = (link as { user?: { id?: unknown } | string | null }).user\n const userId = userRef && typeof userRef === 'object'\n ? userRef.id\n : userRef\n if (userId) ids.add(String(userId))\n }\n }\n return ids\n}\n\nasync function loadActorAcl(input: GrantCheckContext): Promise<ActorAcl> {\n const actorUserId = normalizeNullableString(input.actorUserId)\n if (!actorUserId) throw forbidden('Not authorized to grant ACL privileges.')\n\n const scope = {\n tenantId: normalizeNullableString(input.tenantId),\n organizationId: normalizeNullableString(input.organizationId),\n }\n const loadBound = input.rbacService.loadAclWithEntityManager\n if (input.requireBoundRbac && typeof loadBound !== 'function') {\n throw new Error('[internal] Transaction-bound RBAC resolution is unavailable')\n }\n const acl = typeof loadBound === 'function'\n ? await loadBound.call(input.rbacService, input.em, actorUserId, scope)\n : await input.rbacService.loadAcl(actorUserId, scope)\n\n return {\n isSuperAdmin: !!acl?.isSuperAdmin,\n features: normalizeStringList(acl?.features),\n organizations: normalizeOrganizationList(acl?.organizations),\n }\n}\n\nasync function resolveRolesForGrant(\n em: EntityManager,\n roleTokens: string[],\n tenantId: string | null,\n): Promise<Role[]> {\n const roles: Role[] = []\n const missingRoles: string[] = []\n\n for (const token of roleTokens) {\n const role = await resolveRoleForGrant(em, token, tenantId)\n if (!role) {\n missingRoles.push(token)\n } else {\n roles.push(role)\n }\n }\n\n if (missingRoles.length) {\n const labels = missingRoles.map((role) => `\"${role}\"`).join(', ')\n throw new CrudHttpError(400, { error: `Role(s) not found: ${labels}` })\n }\n\n return roles\n}\n\nasync function resolveRoleForGrant(\n em: EntityManager,\n token: string,\n tenantId: string | null,\n): Promise<Role | null> {\n const where: Record<string, unknown> = UUID_RE.test(token)\n ? { id: token, deletedAt: null }\n : { name: token, deletedAt: null }\n if (tenantId) where.tenantId = tenantId\n return findOneWithDecryption(\n em,\n Role,\n where as FilterQuery<Role>,\n {},\n { tenantId, organizationId: null },\n )\n}\n\nfunction assertActorCanGrantAclSnapshot(\n actorAcl: ActorAcl,\n requested: {\n isSuperAdmin: boolean\n features: string[]\n organizations?: string[] | null\n },\n): void {\n if (requested.isSuperAdmin) {\n throw forbidden('Only super administrators can grant super admin access.')\n }\n\n const actorGrantableFeatures = actorAcl.features.filter((grant) => grant !== '*')\n for (const feature of requested.features) {\n if (feature === '*') {\n throw forbidden('Only super administrators can grant global wildcard access.')\n }\n if (isWildcardFeature(feature)) {\n if (!hasFeature(actorGrantableFeatures, feature)) {\n throw forbidden(`Cannot grant feature wildcard ${feature}.`)\n }\n continue\n }\n if (!hasFeature(actorGrantableFeatures, feature)) {\n throw forbidden(`Cannot grant feature ${feature}.`)\n }\n }\n\n if (requested.organizations !== undefined) {\n assertActorCanGrantOrganizations(actorAcl.organizations, requested.organizations)\n }\n}\n\nfunction assertActorCanGrantOrganizations(\n actorOrganizations: string[] | null,\n requestedOrganizations: string[] | null,\n): void {\n if (actorOrganizations === null || actorOrganizations.includes('__all__')) return\n\n if (requestedOrganizations === null || requestedOrganizations.includes('__all__')) {\n throw forbidden('Cannot grant unrestricted organization access.')\n }\n\n for (const organizationId of requestedOrganizations) {\n if (!actorOrganizations.includes(organizationId)) {\n throw forbidden('Cannot grant organization access outside actor scope.')\n }\n }\n}\n\nfunction normalizeStringList(values: unknown): string[] {\n if (!Array.isArray(values)) return []\n const dedup = new Set<string>()\n for (const value of values) {\n if (typeof value !== 'string') continue\n const trimmed = value.trim()\n if (!trimmed) continue\n dedup.add(trimmed)\n }\n return Array.from(dedup)\n}\n\nfunction normalizeOrganizationList(values: unknown): string[] | null {\n if (values === null || values === undefined) return null\n return normalizeStringList(values)\n}\n\nfunction normalizeNullableString(value: unknown): string | null {\n return typeof value === 'string' && value.trim().length > 0 ? value.trim() : null\n}\n\nfunction isWildcardFeature(feature: string): boolean {\n return feature.endsWith('.*')\n}\n\nasync function translateAuthError(key: string, fallback: string): Promise<string> {\n const { translate } = await resolveTranslations()\n return translate(key, fallback)\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -7,10 +7,15 @@ import { normalizeTenantId } from "./tenantAccess.js";
7
7
  import { computeEmailHash, emailHashLookupValues } from "@open-mercato/core/modules/auth/lib/emailHash";
8
8
  import { getDefaultEncryptionMaps } from "@open-mercato/shared/modules/registry";
9
9
  import { isEncryptionDebugEnabled, isTenantDataEncryptionEnabled } from "@open-mercato/shared/lib/encryption/toggles";
10
- import { EncryptionMap } from "@open-mercato/core/modules/entities/data/entities";
10
+ import { upsertCanonicalEncryptionMap } from "@open-mercato/core/modules/entities/lib/encryption-maps";
11
11
  import { createKmsService } from "@open-mercato/shared/lib/encryption/kms";
12
12
  import { TenantDataEncryptionService } from "@open-mercato/shared/lib/encryption/tenantDataEncryptionService";
13
13
  import { findOneWithDecryption, findWithDecryption } from "@open-mercato/shared/lib/encryption/find";
14
+ import {
15
+ lockRoleAclWriterAuthorizationState,
16
+ lockUserRoleWriterAuthorizationState
17
+ } from "@open-mercato/core/modules/auth/lib/authorizationStateLocks";
18
+ import { withAtomicFlush } from "@open-mercato/shared/lib/commands/flush";
14
19
  import { parseBooleanToken } from "@open-mercato/shared/lib/boolean";
15
20
  import { createLogger } from "@open-mercato/shared/lib/logger";
16
21
  const logger = createLogger("auth").child({ component: "setup" });
@@ -73,6 +78,27 @@ class DerivedUserPasswordRequiredError extends Error {
73
78
  this.name = "DerivedUserPasswordRequiredError";
74
79
  }
75
80
  }
81
+ async function upsertSetupEncryptionMaps(em, tenantId, organizationId, specs) {
82
+ const materializedEntityIds = [];
83
+ for (const spec of specs) {
84
+ if (spec.keyScope === "system") continue;
85
+ await upsertCanonicalEncryptionMap(em, {
86
+ entityId: spec.entityId,
87
+ tenantId,
88
+ organizationId,
89
+ fields: spec.fields,
90
+ isActive: true
91
+ });
92
+ materializedEntityIds.push(spec.entityId);
93
+ }
94
+ return materializedEntityIds;
95
+ }
96
+ async function invalidateSetupEncryptionMaps(encryptionService, entityIds, tenantId, organizationId) {
97
+ for (const entityId of entityIds) {
98
+ await encryptionService.invalidateMap(entityId, tenantId, organizationId);
99
+ }
100
+ await encryptionService.invalidateMap("auth:user", tenantId, null);
101
+ }
76
102
  async function setupInitialTenant(em, options) {
77
103
  const {
78
104
  primaryUser,
@@ -124,6 +150,7 @@ async function setupInitialTenant(em, options) {
124
150
  let tenantId;
125
151
  let organizationId;
126
152
  let reusedExistingUser = false;
153
+ let materializedEncryptionEntityIds = [];
127
154
  const userSnapshots = [];
128
155
  await em.transactional(async (tem) => {
129
156
  if (!existingUser) return;
@@ -137,6 +164,13 @@ async function setupInitialTenant(em, options) {
137
164
  await ensureRolesInContext(tem, roleNames, roleTenantId);
138
165
  await tem.flush();
139
166
  const requiredRoleSet = /* @__PURE__ */ new Set([...roleNames, ...primaryRoles]);
167
+ const requiredRoles = await Promise.all(
168
+ Array.from(requiredRoleSet).map((roleName) => findRoleByNameOrFail(tem, roleName, roleTenantId))
169
+ );
170
+ await lockUserRoleWriterAuthorizationState(tem, {
171
+ userIds: [String(existingUser.id)],
172
+ roleIds: requiredRoles.map((role) => String(role.id))
173
+ });
140
174
  const links = await findWithDecryption(
141
175
  tem,
142
176
  UserRole,
@@ -145,9 +179,9 @@ async function setupInitialTenant(em, options) {
145
179
  { tenantId: roleTenantId, organizationId: null }
146
180
  );
147
181
  const currentRoles = new Set(links.map((link) => link.role.name));
148
- for (const roleName of requiredRoleSet) {
182
+ for (const role of requiredRoles) {
183
+ const roleName = role.name;
149
184
  if (!currentRoles.has(roleName)) {
150
- const role = await findRoleByNameOrFail(tem, roleName, roleTenantId);
151
185
  tem.persist(tem.create(UserRole, { user: existingUser, role, createdAt: /* @__PURE__ */ new Date() }));
152
186
  }
153
187
  }
@@ -248,25 +282,12 @@ async function setupInitialTenant(em, options) {
248
282
  await ensureRolesInContext(tem, roleNames, roleTenantId);
249
283
  await tem.flush();
250
284
  if (isTenantDataEncryptionEnabled()) {
251
- for (const spec of defaultEncryptionMaps) {
252
- if (spec.keyScope === "system") continue;
253
- const existing = await findOneWithDecryption(tem, EncryptionMap, { entityId: spec.entityId, tenantId: tenant.id, organizationId: organization.id, deletedAt: null }, {}, { tenantId: String(tenant.id), organizationId: String(organization.id) });
254
- if (!existing) {
255
- tem.persist(tem.create(EncryptionMap, {
256
- entityId: spec.entityId,
257
- tenantId: tenant.id,
258
- organizationId: organization.id,
259
- fieldsJson: spec.fields,
260
- isActive: true,
261
- createdAt: /* @__PURE__ */ new Date(),
262
- updatedAt: /* @__PURE__ */ new Date()
263
- }));
264
- } else {
265
- existing.fieldsJson = spec.fields;
266
- existing.isActive = true;
267
- }
268
- }
269
- await tem.flush();
285
+ materializedEncryptionEntityIds = await upsertSetupEncryptionMaps(
286
+ tem,
287
+ String(tenant.id),
288
+ String(organization.id),
289
+ defaultEncryptionMaps
290
+ );
270
291
  }
271
292
  });
272
293
  await em.transactional(async (tem) => {
@@ -274,8 +295,12 @@ async function setupInitialTenant(em, options) {
274
295
  const roleTenantId = tenantId;
275
296
  const encryptionService = isTenantDataEncryptionEnabled() ? new TenantDataEncryptionService(tem, { kms: createKmsService() }) : null;
276
297
  if (encryptionService) {
277
- await encryptionService.invalidateMap("auth:user", String(tenantId), String(organizationId));
278
- await encryptionService.invalidateMap("auth:user", String(tenantId), null);
298
+ await invalidateSetupEncryptionMaps(
299
+ encryptionService,
300
+ materializedEncryptionEntityIds,
301
+ String(tenantId),
302
+ String(organizationId)
303
+ );
279
304
  }
280
305
  for (const base of baseUsers) {
281
306
  const resolvedPasswordHash = base.passwordHash ?? passwordHash;
@@ -309,8 +334,14 @@ async function setupInitialTenant(em, options) {
309
334
  userSnapshots.push({ user, roles: base.roles, created: true, generatedPassword: base.generatedPassword ?? null });
310
335
  }
311
336
  await tem.flush();
312
- for (const roleName of base.roles) {
313
- const role = await findRoleByNameOrFail(tem, roleName, roleTenantId);
337
+ const assignedRoles = await Promise.all(
338
+ base.roles.map((roleName) => findRoleByNameOrFail(tem, roleName, roleTenantId))
339
+ );
340
+ await lockUserRoleWriterAuthorizationState(tem, {
341
+ userIds: [String(user.id)],
342
+ roleIds: assignedRoles.map((role) => String(role.id))
343
+ });
344
+ for (const role of assignedRoles) {
314
345
  const existingLink = await findOneWithDecryption(tem, UserRole, { user, role }, {}, { tenantId: tenantId ?? null, organizationId: null });
315
346
  if (!existingLink) tem.persist(tem.create(UserRole, { user, role, createdAt: /* @__PURE__ */ new Date() }));
316
347
  }
@@ -453,28 +484,31 @@ async function ensureCustomRoleAcls(em, tenantId, modules) {
453
484
  }
454
485
  async function ensureRoleAclFor(em, role, tenantId, features, options = {}) {
455
486
  const uniqueFeatures = Array.from(new Set(features));
456
- const existing = await findOneWithDecryption(em, RoleAcl, { role, tenantId }, {}, { tenantId, organizationId: null });
457
- if (!existing) {
458
- const acl = em.create(RoleAcl, {
459
- role,
460
- tenantId,
461
- featuresJson: uniqueFeatures,
462
- isSuperAdmin: !!options.isSuperAdmin,
463
- createdAt: /* @__PURE__ */ new Date()
464
- });
465
- await em.persist(acl).flush();
466
- return;
467
- }
468
- const currentFeatures = Array.isArray(existing.featuresJson) ? existing.featuresJson : [];
469
- const merged = Array.from(/* @__PURE__ */ new Set([...currentFeatures, ...uniqueFeatures]));
470
- const changed = merged.length !== currentFeatures.length || merged.some((value, index) => value !== currentFeatures[index]);
471
- if (changed) existing.featuresJson = merged;
472
- if (options.isSuperAdmin && !existing.isSuperAdmin) {
473
- existing.isSuperAdmin = true;
474
- }
475
- if (changed || options.isSuperAdmin) {
476
- await em.persist(existing).flush();
477
- }
487
+ await withAtomicFlush(em, [async () => {
488
+ await lockRoleAclWriterAuthorizationState(em, [String(role.id)]);
489
+ const existing = await findOneWithDecryption(em, RoleAcl, { role, tenantId }, {}, { tenantId, organizationId: null });
490
+ if (!existing) {
491
+ const acl = em.create(RoleAcl, {
492
+ role,
493
+ tenantId,
494
+ featuresJson: uniqueFeatures,
495
+ isSuperAdmin: !!options.isSuperAdmin,
496
+ createdAt: /* @__PURE__ */ new Date()
497
+ });
498
+ await em.persist(acl).flush();
499
+ return;
500
+ }
501
+ const currentFeatures = Array.isArray(existing.featuresJson) ? existing.featuresJson : [];
502
+ const merged = Array.from(/* @__PURE__ */ new Set([...currentFeatures, ...uniqueFeatures]));
503
+ const changed = merged.length !== currentFeatures.length || merged.some((value, index) => value !== currentFeatures[index]);
504
+ if (changed) existing.featuresJson = merged;
505
+ if (options.isSuperAdmin && !existing.isSuperAdmin) {
506
+ existing.isSuperAdmin = true;
507
+ }
508
+ if (changed || options.isSuperAdmin) {
509
+ await em.persist(existing).flush();
510
+ }
511
+ }], { transaction: true, label: "auth.ensure-role-acl" });
478
512
  }
479
513
  async function deactivateDemoUsersIfSelfOnboardingEnabled(em) {
480
514
  if (process.env.SELF_SERVICE_ONBOARDING_ENABLED !== "true") return;
@@ -522,7 +556,9 @@ export {
522
556
  ensureCustomRoleAcls,
523
557
  ensureDefaultRoleAcls,
524
558
  ensureRoles,
559
+ invalidateSetupEncryptionMaps,
525
560
  resolveDemoUserEmails,
526
- setupInitialTenant
561
+ setupInitialTenant,
562
+ upsertSetupEncryptionMaps
527
563
  };
528
564
  //# sourceMappingURL=setup-app.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/auth/lib/setup-app.ts"],
4
- "sourcesContent": ["import { hash } from 'bcryptjs'\nimport { randomBytes } from 'node:crypto'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport { Role, RoleAcl, User, UserRole } from '@open-mercato/core/modules/auth/data/entities'\nimport { Tenant, Organization } from '@open-mercato/core/modules/directory/data/entities'\nimport { rebuildHierarchyForTenant } from '@open-mercato/core/modules/directory/lib/hierarchy'\nimport { normalizeTenantId } from './tenantAccess'\nimport { computeEmailHash, emailHashLookupValues } from '@open-mercato/core/modules/auth/lib/emailHash'\nimport { getDefaultEncryptionMaps, type Module } from '@open-mercato/shared/modules/registry'\nimport { isEncryptionDebugEnabled, isTenantDataEncryptionEnabled } from '@open-mercato/shared/lib/encryption/toggles'\nimport { EncryptionMap } from '@open-mercato/core/modules/entities/data/entities'\nimport { createKmsService } from '@open-mercato/shared/lib/encryption/kms'\nimport { TenantDataEncryptionService } from '@open-mercato/shared/lib/encryption/tenantDataEncryptionService'\nimport { findOneWithDecryption, findWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { parseBooleanToken } from '@open-mercato/shared/lib/boolean'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\n\nconst logger = createLogger('auth').child({ component: 'setup' })\n\nconst DEFAULT_ROLE_NAMES = ['employee', 'admin', 'superadmin'] as const\nconst DEMO_SUPERADMIN_EMAIL = 'superadmin@acme.com'\nconst DEFAULT_DERIVED_EMAIL_DOMAIN = DEMO_SUPERADMIN_EMAIL.split('@')[1] ?? 'acme.com'\n\nexport type EnsureRolesOptions = {\n roleNames?: string[]\n tenantId?: string\n}\n\nasync function ensureRolesInContext(\n em: EntityManager,\n roleNames: string[],\n tenantId: string,\n) {\n for (const name of roleNames) {\n const existing = await findOneWithDecryption(em, Role, { name, tenantId }, {}, { tenantId, organizationId: null })\n if (existing) continue\n em.persist(em.create(Role, { name, tenantId, minActiveHolders: name === 'admin' ? 1 : 0, createdAt: new Date() }))\n }\n}\n\nexport async function ensureRoles(em: EntityManager, options: EnsureRolesOptions = {}) {\n const roleNames = options.roleNames ?? [...DEFAULT_ROLE_NAMES]\n const tenantId = normalizeTenantId(options.tenantId ?? null)\n if (!tenantId) {\n throw new Error('ensureRoles requires a tenantId \u2014 global roles are not supported')\n }\n await em.transactional(async (tem) => {\n await ensureRolesInContext(tem, roleNames, tenantId)\n await tem.flush()\n })\n}\n\nasync function findRoleByName(\n em: EntityManager,\n name: string,\n tenantId: string | null,\n): Promise<Role | null> {\n const normalizedTenant = normalizeTenantId(tenantId ?? null) ?? null\n return findOneWithDecryption(em, Role, { name, tenantId: normalizedTenant }, {}, { tenantId: normalizedTenant, organizationId: null })\n}\n\nasync function findRoleByNameOrFail(\n em: EntityManager,\n name: string,\n tenantId: string | null,\n): Promise<Role> {\n const role = await findRoleByName(em, name, tenantId)\n if (!role) throw new Error(`ROLE_NOT_FOUND:${name}`)\n return role\n}\n\ntype PrimaryUserInput = {\n email: string\n password?: string\n hashedPassword?: string | null\n firstName?: string | null\n lastName?: string | null\n displayName?: string | null\n confirm?: boolean\n}\n\nconst DERIVED_EMAIL_ENV = {\n admin: 'OM_INIT_ADMIN_EMAIL',\n employee: 'OM_INIT_EMPLOYEE_EMAIL',\n} as const\n\nexport type DemoUserRole = 'superadmin' | 'admin' | 'employee'\nexport type DemoUserEmail = { role: DemoUserRole; email: string }\n\n/**\n * Returns the canonical list of demo user emails the setup path may have\n * seeded. Honors OM_INIT_ADMIN_EMAIL / OM_INIT_EMPLOYEE_EMAIL exactly the\n * same way the derived-user seeding branch does, so the deactivation loop\n * never drifts from the seeding loop.\n *\n * Pure function \u2014 no side effects, safe to unit-test in isolation.\n *\n * @internal Exported for tests; not part of the public auth API.\n */\nexport function resolveDemoUserEmails(): DemoUserEmail[] {\n const adminEmail = readEnvValue(DERIVED_EMAIL_ENV.admin) ?? `admin@${DEFAULT_DERIVED_EMAIL_DOMAIN}`\n const employeeEmail = readEnvValue(DERIVED_EMAIL_ENV.employee) ?? `employee@${DEFAULT_DERIVED_EMAIL_DOMAIN}`\n return [\n { role: 'superadmin', email: DEMO_SUPERADMIN_EMAIL },\n { role: 'admin', email: adminEmail },\n { role: 'employee', email: employeeEmail },\n ]\n}\n\nexport type SetupInitialTenantOptions = {\n orgName: string\n primaryUser: PrimaryUserInput\n roleNames?: string[]\n includeDerivedUsers?: boolean\n failIfUserExists?: boolean\n primaryUserRoles?: string[]\n includeSuperadminRole?: boolean\n /** Optional list of enabled modules. When provided, module setup hooks are called. */\n modules?: Module[]\n /**\n * Optional global slug to persist on the new Organization. When set, a\n * pre-flight uniqueness check across all tenants throws OrgSlugExistsError\n * on collision so scriptable callers can fail loudly instead of silently\n * reusing or clobbering an existing organization.\n */\n orgSlug?: string\n /**\n * Opt-in flag that allows seeding the derived admin/employee accounts when\n * the OM_INIT_ADMIN_PASSWORD / OM_INIT_EMPLOYEE_PASSWORD env vars are unset.\n *\n * - In non-production (`NODE_ENV !== 'production'`): the demo accounts are\n * seeded with the well-known `'secret'` password so local dev workflows\n * (e.g. `mercato init`) stay predictable for developers.\n * - In production: the fallback uses a randomly generated 96-bit password\n * (printed once by the CLI) so an operator who deliberately opts in still\n * avoids the historical hardcoded credential. When this flag is false/unset\n * in production and the env vars are missing, `DerivedUserPasswordRequiredError`\n * is thrown instead of silently seeding any account.\n */\n allowDemoDerivedPasswords?: boolean\n}\n\nexport class OrgSlugExistsError extends Error {\n constructor(public readonly slug: string) {\n super(`ORG_SLUG_EXISTS: an organization with slug \"${slug}\" already exists`)\n this.name = 'OrgSlugExistsError'\n }\n}\n\nexport class DerivedUserPasswordRequiredError extends Error {\n constructor(public readonly missing: string[]) {\n super(\n `DERIVED_USER_PASSWORD_REQUIRED: missing ${missing.join(', ')} (set the env vars, pass allowDemoDerivedPasswords: true / --include-demo-users in non-production, or disable derived user seeding)`,\n )\n this.name = 'DerivedUserPasswordRequiredError'\n }\n}\n\nexport type SetupInitialTenantResult = {\n tenantId: string\n organizationId: string\n users: Array<{ user: User; roles: string[]; created: boolean; generatedPassword?: string | null }>\n reusedExistingUser: boolean\n}\n\nexport async function setupInitialTenant(\n em: EntityManager,\n options: SetupInitialTenantOptions,\n): Promise<SetupInitialTenantResult> {\n const {\n primaryUser,\n includeDerivedUsers = true,\n failIfUserExists = false,\n primaryUserRoles,\n includeSuperadminRole = true,\n } = options\n const primaryRolesInput = primaryUserRoles && primaryUserRoles.length ? primaryUserRoles : ['superadmin']\n const primaryRoles = includeSuperadminRole\n ? primaryRolesInput\n : primaryRolesInput.filter((role) => role !== 'superadmin')\n if (primaryRoles.length === 0) {\n throw new Error('PRIMARY_ROLES_REQUIRED')\n }\n const defaultRoleNames = options.roleNames ?? [...DEFAULT_ROLE_NAMES]\n const resolvedRoleNames = includeSuperadminRole\n ? defaultRoleNames\n : defaultRoleNames.filter((role) => role !== 'superadmin')\n const roleNames = Array.from(new Set([...resolvedRoleNames, ...primaryRoles]))\n const resolvedModules = options.modules ?? tryGetModules()\n const defaultEncryptionMaps = getDefaultEncryptionMaps(resolvedModules)\n\n const mainEmail = primaryUser.email\n const existingUserByHash = await findOneWithDecryption(\n em,\n User,\n { emailHash: { $in: emailHashLookupValues(mainEmail) }, deletedAt: null },\n {},\n { tenantId: null, organizationId: null },\n )\n const existingUser = existingUserByHash ?? await findOneWithDecryption(\n em,\n User,\n { email: mainEmail, deletedAt: null },\n {},\n { tenantId: null, organizationId: null },\n )\n if (existingUser && failIfUserExists) {\n throw new Error('USER_EXISTS')\n }\n\n if (options.orgSlug) {\n const slugConflict = await findOneWithDecryption(\n em,\n Organization,\n { slug: options.orgSlug },\n {},\n { tenantId: null, organizationId: null },\n )\n if (slugConflict) {\n throw new OrgSlugExistsError(options.orgSlug)\n }\n }\n\n let tenantId: string | undefined\n let organizationId: string | undefined\n let reusedExistingUser = false\n const userSnapshots: Array<{ user: User; roles: string[]; created: boolean; generatedPassword?: string | null }> = []\n\n await em.transactional(async (tem) => {\n if (!existingUser) return\n reusedExistingUser = true\n tenantId = existingUser.tenantId ? String(existingUser.tenantId) : undefined\n organizationId = existingUser.organizationId ? String(existingUser.organizationId) : undefined\n const roleTenantId = normalizeTenantId(existingUser.tenantId ?? null) ?? null\n if (!roleTenantId) {\n throw new Error('Cannot reuse a user without a tenantId \u2014 global roles are not supported')\n }\n\n await ensureRolesInContext(tem, roleNames, roleTenantId)\n await tem.flush()\n\n const requiredRoleSet = new Set([...roleNames, ...primaryRoles])\n const links = await findWithDecryption(\n tem,\n UserRole,\n { user: existingUser },\n { populate: ['role'] },\n { tenantId: roleTenantId, organizationId: null },\n )\n const currentRoles = new Set(links.map((link) => link.role.name))\n for (const roleName of requiredRoleSet) {\n if (!currentRoles.has(roleName)) {\n const role = await findRoleByNameOrFail(tem, roleName, roleTenantId)\n tem.persist(tem.create(UserRole, { user: existingUser, role, createdAt: new Date() }))\n }\n }\n await tem.flush()\n const roles = Array.from(new Set([...currentRoles, ...roleNames]))\n userSnapshots.push({ user: existingUser, roles, created: false })\n })\n\n if (!existingUser) {\n const baseUsers: Array<{\n email: string\n roles: string[]\n name?: string | null\n passwordHash?: string | null\n generatedPassword?: string | null\n }> = [\n { email: primaryUser.email, roles: primaryRoles, name: resolvePrimaryName(primaryUser) },\n ]\n if (includeDerivedUsers) {\n const adminOverride = readEnvValue(DERIVED_EMAIL_ENV.admin)\n const employeeOverride = readEnvValue(DERIVED_EMAIL_ENV.employee)\n const adminEmail = adminOverride ?? `admin@${DEFAULT_DERIVED_EMAIL_DOMAIN}`\n const employeeEmail = employeeOverride ?? `employee@${DEFAULT_DERIVED_EMAIL_DOMAIN}`\n const envAdminPwd = readEnvValue('OM_INIT_ADMIN_PASSWORD')\n const envEmployeePwd = readEnvValue('OM_INIT_EMPLOYEE_PASSWORD')\n const isProduction = process.env.NODE_ENV === 'production'\n const allowDemo = options.allowDemoDerivedPasswords === true\n if (isProduction && !allowDemo) {\n const missing: string[] = []\n if (!envAdminPwd) missing.push('OM_INIT_ADMIN_PASSWORD')\n if (!envEmployeePwd) missing.push('OM_INIT_EMPLOYEE_PASSWORD')\n if (missing.length) {\n throw new DerivedUserPasswordRequiredError(missing)\n }\n }\n // In non-production, fall back to the well-known DEMO_DERIVED_PASSWORD so\n // local dev workflows stay predictable (admin@/employee@ login with the\n // documented demo password). In production we either have env-supplied\n // values, or \u2014 for opt-in --include-demo-users flows \u2014 we generate a\n // random one-time password and surface it via `generatedPassword` so the\n // operator can capture it. Production callers without env vars and\n // without the opt-in already threw above.\n const fallbackAdminPwd = isProduction ? generateDerivedPassword() : DEMO_DERIVED_PASSWORD\n const fallbackEmployeePwd = isProduction ? generateDerivedPassword() : DEMO_DERIVED_PASSWORD\n const adminPasswordPlain = envAdminPwd ?? fallbackAdminPwd\n const employeePasswordPlain = envEmployeePwd ?? fallbackEmployeePwd\n const adminPasswordHash = await hash(adminPasswordPlain, 10)\n const employeePasswordHash = await hash(employeePasswordPlain, 10)\n addUniqueBaseUser(baseUsers, {\n email: adminEmail,\n roles: ['admin'],\n passwordHash: adminPasswordHash,\n generatedPassword: envAdminPwd ? null : adminPasswordPlain,\n })\n addUniqueBaseUser(baseUsers, {\n email: employeeEmail,\n roles: ['employee'],\n passwordHash: employeePasswordHash,\n generatedPassword: envEmployeePwd ? null : employeePasswordPlain,\n })\n }\n const passwordHash = await resolvePasswordHash(primaryUser)\n\n await em.transactional(async (tem) => {\n const tenant = tem.create(Tenant, {\n name: options.orgName,\n isActive: true,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n tem.persist(tenant)\n await tem.flush()\n\n const organization = tem.create(Organization, {\n name: options.orgName,\n slug: options.orgSlug ?? null,\n tenant,\n isActive: true,\n depth: 0,\n ancestorIds: [],\n childIds: [],\n descendantIds: [],\n logoPreserveAspectRatio: false,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n tem.persist(organization)\n await tem.flush()\n\n tenantId = String(tenant.id)\n organizationId = String(organization.id)\n const roleTenantId = tenantId\n\n if (isTenantDataEncryptionEnabled()) {\n try {\n const kms = createKmsService()\n if (kms.isHealthy()) {\n if (isEncryptionDebugEnabled()) {\n logger.info('Provisioning tenant DEK', { tenantId: String(tenant.id) })\n }\n await kms.createTenantDek(String(tenant.id))\n if (isEncryptionDebugEnabled()) {\n logger.info('Created tenant DEK during setup', { tenantId: String(tenant.id) })\n }\n } else {\n if (isEncryptionDebugEnabled()) {\n logger.warn('KMS not healthy, skipping tenant DEK creation', { tenantId: String(tenant.id) })\n }\n }\n } catch (err) {\n if (isEncryptionDebugEnabled()) {\n logger.warn('Failed to create tenant DEK', { err })\n }\n }\n }\n\n await ensureRolesInContext(tem, roleNames, roleTenantId)\n await tem.flush()\n\n if (isTenantDataEncryptionEnabled()) {\n // System-scoped maps are resolved from module code, never from a tenant row.\n // Persisting one here would make the tenant-scoped encryption CLIs believe they\n // own that entity and re-wrap its `system:<entityId>` ciphertext under the tenant\n // DEK, which runtime decryption can no longer read.\n for (const spec of defaultEncryptionMaps) {\n if (spec.keyScope === 'system') continue\n const existing = await findOneWithDecryption(tem, EncryptionMap, { entityId: spec.entityId, tenantId: tenant.id, organizationId: organization.id, deletedAt: null }, {}, { tenantId: String(tenant.id), organizationId: String(organization.id) })\n if (!existing) {\n tem.persist(tem.create(EncryptionMap, {\n entityId: spec.entityId,\n tenantId: tenant.id,\n organizationId: organization.id,\n fieldsJson: spec.fields,\n isActive: true,\n createdAt: new Date(),\n updatedAt: new Date(),\n }))\n } else {\n existing.fieldsJson = spec.fields\n existing.isActive = true\n }\n }\n await tem.flush()\n }\n })\n\n await em.transactional(async (tem) => {\n if (!tenantId || !organizationId) return\n const roleTenantId = tenantId\n const encryptionService = isTenantDataEncryptionEnabled()\n ? new TenantDataEncryptionService(tem as any, { kms: createKmsService() })\n : null\n if (encryptionService) {\n await encryptionService.invalidateMap('auth:user', String(tenantId), String(organizationId))\n await encryptionService.invalidateMap('auth:user', String(tenantId), null)\n }\n\n for (const base of baseUsers) {\n const resolvedPasswordHash = base.passwordHash ?? passwordHash\n let user = await findOneWithDecryption(tem, User, { email: base.email }, {}, { tenantId: tenantId ?? null, organizationId: organizationId ?? null })\n const confirm = primaryUser.confirm ?? true\n const encryptedPayload = encryptionService\n ? await encryptionService.encryptEntityPayload('auth:user', { email: base.email }, tenantId, organizationId)\n : { email: base.email, emailHash: computeEmailHash(base.email) }\n if (user) {\n user.passwordHash = resolvedPasswordHash\n user.organizationId = organizationId\n user.tenantId = tenantId\n if (isTenantDataEncryptionEnabled()) {\n user.email = encryptedPayload.email as any\n user.emailHash = (encryptedPayload as any).emailHash ?? computeEmailHash(base.email)\n }\n if (base.name) user.name = base.name\n if (confirm) user.isConfirmed = true\n tem.persist(user)\n userSnapshots.push({ user, roles: base.roles, created: false, generatedPassword: base.generatedPassword ?? null })\n } else {\n user = tem.create(User, {\n email: (encryptedPayload as any).email ?? base.email,\n emailHash: isTenantDataEncryptionEnabled() ? (encryptedPayload as any).emailHash ?? computeEmailHash(base.email) : undefined,\n passwordHash: resolvedPasswordHash,\n organizationId,\n tenantId,\n name: base.name ?? undefined,\n isConfirmed: confirm,\n createdAt: new Date(),\n })\n tem.persist(user)\n userSnapshots.push({ user, roles: base.roles, created: true, generatedPassword: base.generatedPassword ?? null })\n }\n await tem.flush()\n for (const roleName of base.roles) {\n const role = await findRoleByNameOrFail(tem, roleName, roleTenantId)\n const existingLink = await findOneWithDecryption(tem, UserRole, { user, role }, {}, { tenantId: tenantId ?? null, organizationId: null })\n if (!existingLink) tem.persist(tem.create(UserRole, { user, role, createdAt: new Date() }))\n }\n await tem.flush()\n }\n })\n }\n\n if (!tenantId || !organizationId) {\n throw new Error('SETUP_FAILED')\n }\n\n if (!reusedExistingUser) {\n await rebuildHierarchyForTenant(em, tenantId)\n }\n\n await ensureDefaultRoleAcls(em, tenantId, resolvedModules, { includeSuperadminRole })\n await deactivateDemoUsersIfSelfOnboardingEnabled(em)\n\n // Call module onTenantCreated hooks\n for (const mod of resolvedModules) {\n if (mod.setup?.onTenantCreated) {\n await mod.setup.onTenantCreated({ em, tenantId, organizationId })\n }\n }\n\n // Custom roles are often created inside onTenantCreated hooks, so they did not\n // exist yet when ensureDefaultRoleAcls ran above and were skipped there. Sync\n // again now that the hooks have had a chance to create them \u2014 idempotent, same\n // pattern as the `mercato auth sync-role-acls` CLI command.\n await ensureCustomRoleAcls(em, tenantId, resolvedModules)\n\n return {\n tenantId,\n organizationId,\n users: userSnapshots,\n reusedExistingUser,\n }\n}\n\nfunction resolvePrimaryName(input: PrimaryUserInput): string | null {\n if (input.displayName && input.displayName.trim()) return input.displayName.trim()\n const parts = [input.firstName, input.lastName].map((value) => value?.trim()).filter(Boolean)\n if (parts.length) return parts.join(' ')\n return null\n}\n\nfunction readEnvValue(key: string): string | undefined {\n const value = process.env[key]\n if (typeof value !== 'string') return undefined\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : undefined\n}\n\nfunction addUniqueBaseUser(\n baseUsers: Array<{ email: string; roles: string[]; name?: string | null; passwordHash?: string | null; generatedPassword?: string | null }>,\n entry: { email: string; roles: string[]; name?: string | null; passwordHash?: string | null; generatedPassword?: string | null },\n) {\n if (!entry.email) return\n const normalized = entry.email.toLowerCase()\n if (baseUsers.some((user) => user.email.toLowerCase() === normalized)) return\n baseUsers.push(entry)\n}\n\n/**\n * Well-known demo password seeded for derived admin@/employee@ accounts in\n * non-production (`NODE_ENV !== 'production'`) when no env override is set.\n * Keeps the documented `yarn dev` / `mercato init` DX predictable. Never used\n * in production: the production branch either consumes env-supplied values or\n * falls back to `generateDerivedPassword()` so credentials remain non-guessable.\n */\nconst DEMO_DERIVED_PASSWORD = 'secret'\n\n/**\n * Generate a 16-character base64url password (96 bits of entropy) for a derived\n * demo user in production when no env override is provided AND the caller\n * explicitly opted in via `allowDemoDerivedPasswords`. Surfaced via the\n * `users[].generatedPassword` snapshot so CLI callers can print it to the\n * operator \u2014 there is no other recovery path for these credentials.\n */\nfunction generateDerivedPassword(): string {\n return randomBytes(12).toString('base64url')\n}\n\nfunction isDemoModeEnabled(): boolean {\n const parsed = parseBooleanToken(process.env.DEMO_MODE ?? '')\n return parsed === false ? false : true\n}\n\nfunction shouldKeepDemoSuperadminDuringInit(): boolean {\n if (process.env.OM_INIT_FLOW !== 'true') return false\n if (!readEnvValue('OM_INIT_SUPERADMIN_EMAIL')) return false\n return isDemoModeEnabled()\n}\n\nasync function resolvePasswordHash(input: PrimaryUserInput): Promise<string | null> {\n if (typeof input.hashedPassword === 'string') return input.hashedPassword\n if (input.password) return hash(input.password, 10)\n return null\n}\n\nexport async function ensureDefaultRoleAcls(\n em: EntityManager,\n tenantId: string,\n modules: Module[],\n options: { includeSuperadminRole?: boolean } = {},\n) {\n const includeSuperadminRole = options.includeSuperadminRole ?? true\n const roleTenantId = normalizeTenantId(tenantId) ?? null\n const superadminRole = includeSuperadminRole ? await findRoleByName(em, 'superadmin', roleTenantId) : null\n const adminRole = await findRoleByName(em, 'admin', roleTenantId)\n const employeeRole = await findRoleByName(em, 'employee', roleTenantId)\n\n // Merge features from all enabled modules' setup configs\n const builtInRoles = ['superadmin', 'admin', 'employee'] as const\n const superadminFeatures: string[] = []\n const adminFeatures: string[] = []\n const employeeFeatures: string[] = []\n const customRoleFeatures = new Map<string, string[]>()\n\n for (const mod of modules) {\n const roleFeatures = mod.setup?.defaultRoleFeatures\n if (!roleFeatures) continue\n if (roleFeatures.superadmin) superadminFeatures.push(...roleFeatures.superadmin)\n if (roleFeatures.admin) adminFeatures.push(...roleFeatures.admin)\n if (roleFeatures.employee) employeeFeatures.push(...roleFeatures.employee)\n\n // Collect features for custom roles (any key not in builtInRoles)\n for (const [roleName, features] of Object.entries(roleFeatures)) {\n if ((builtInRoles as readonly string[]).includes(roleName)) continue\n if (!Array.isArray(features)) continue\n const existing = customRoleFeatures.get(roleName) ?? []\n existing.push(...features)\n customRoleFeatures.set(roleName, existing)\n }\n }\n\n logger.info('Seeded default role features', {\n superadmin: superadminFeatures,\n admin: adminFeatures,\n employee: employeeFeatures,\n ...(customRoleFeatures.size > 0\n ? Object.fromEntries(customRoleFeatures)\n : {}),\n })\n\n if (includeSuperadminRole && superadminRole) {\n await ensureRoleAclFor(em, superadminRole, tenantId, superadminFeatures, { isSuperAdmin: true })\n }\n if (adminRole) {\n await ensureRoleAclFor(em, adminRole, tenantId, adminFeatures)\n }\n if (employeeRole) {\n await ensureRoleAclFor(em, employeeRole, tenantId, employeeFeatures)\n }\n\n // Seed ACLs for custom roles defined by app modules.\n // NOTE: Custom roles may not exist yet if they are created in seedDefaults\n // (which runs after this function). In that case, use ensureCustomRoleAcls()\n // after seedDefaults to pick them up.\n for (const [roleName, features] of customRoleFeatures) {\n const role = await findRoleByName(em, roleName, roleTenantId)\n if (role) {\n await ensureRoleAclFor(em, role, tenantId, features)\n }\n }\n}\n\n/**\n * Seed ACLs for custom roles defined in module defaultRoleFeatures.\n * Call this AFTER seedDefaults to pick up roles created by app modules.\n * Safe to call multiple times \u2014 ensureRoleAclFor merges features idempotently.\n */\nexport async function ensureCustomRoleAcls(\n em: EntityManager,\n tenantId: string,\n modules?: Module[],\n): Promise<void> {\n const resolvedModules = modules ?? tryGetModules()\n const roleTenantId = normalizeTenantId(tenantId) ?? null\n const builtInRoles = ['superadmin', 'admin', 'employee']\n const customRoleFeatures = new Map<string, string[]>()\n\n for (const mod of resolvedModules) {\n const roleFeatures = mod.setup?.defaultRoleFeatures\n if (!roleFeatures) continue\n for (const [roleName, features] of Object.entries(roleFeatures)) {\n if (builtInRoles.includes(roleName)) continue\n if (!Array.isArray(features)) continue\n const existing = customRoleFeatures.get(roleName) ?? []\n existing.push(...features)\n customRoleFeatures.set(roleName, existing)\n }\n }\n\n if (customRoleFeatures.size === 0) return\n\n let seeded = 0\n for (const [roleName, features] of customRoleFeatures) {\n const role = await findRoleByName(em, roleName, roleTenantId)\n if (role) {\n await ensureRoleAclFor(em, role, tenantId, features)\n seeded++\n }\n }\n if (seeded > 0) {\n logger.info('Seeded custom role ACLs', { seeded })\n }\n}\n\nasync function ensureRoleAclFor(\n em: EntityManager,\n role: Role,\n tenantId: string,\n features: string[],\n options: { isSuperAdmin?: boolean } = {},\n) {\n // Deduplicated on the create path too, not only on merge. `ensureDefaultRoleAcls` concatenates\n // every enabled module's declared features, and two modules legitimately declare the same\n // grant (the example module asks for `payment_gateways.view`, and so does that module itself),\n // so a first init used to store the string twice while the second run silently collapsed it.\n // Same list, two shapes, depending only on how many times setup had run.\n const uniqueFeatures = Array.from(new Set(features))\n const existing = await findOneWithDecryption(em, RoleAcl, { role, tenantId }, {}, { tenantId, organizationId: null })\n if (!existing) {\n const acl = em.create(RoleAcl, {\n role,\n tenantId,\n featuresJson: uniqueFeatures,\n isSuperAdmin: !!options.isSuperAdmin,\n createdAt: new Date(),\n })\n await em.persist(acl).flush()\n return\n }\n const currentFeatures = Array.isArray(existing.featuresJson) ? existing.featuresJson : []\n const merged = Array.from(new Set([...currentFeatures, ...uniqueFeatures]))\n const changed =\n merged.length !== currentFeatures.length ||\n merged.some((value, index) => value !== currentFeatures[index])\n if (changed) existing.featuresJson = merged\n if (options.isSuperAdmin && !existing.isSuperAdmin) {\n existing.isSuperAdmin = true\n }\n if (changed || options.isSuperAdmin) {\n await em.persist(existing).flush()\n }\n}\n\n/**\n * Neutralizes every demo account the setup path may have seeded\n * (superadmin, admin, employee \u2014 honoring OM_INIT_*_EMAIL overrides)\n * when SELF_SERVICE_ONBOARDING_ENABLED is on and the operator did not\n * opt in to keeping demo credentials via shouldKeepDemoSuperadminDuringInit.\n *\n * Each user is processed in its own try/catch so a single failure (e.g.\n * decryption error on a legacy row) does not skip the remaining accounts.\n *\n * @internal Exported for tests; not part of the public auth API.\n */\nexport async function deactivateDemoUsersIfSelfOnboardingEnabled(em: EntityManager) {\n if (process.env.SELF_SERVICE_ONBOARDING_ENABLED !== 'true') return\n if (shouldKeepDemoSuperadminDuringInit()) return\n for (const { role, email } of resolveDemoUserEmails()) {\n try {\n const user = await findOneWithDecryption(\n em,\n User,\n { email },\n {},\n { tenantId: null, organizationId: null },\n )\n if (!user) continue\n let dirty = false\n if (user.passwordHash) {\n user.passwordHash = null\n dirty = true\n }\n if (user.isConfirmed !== false) {\n user.isConfirmed = false\n dirty = true\n }\n if (dirty) {\n await em.persist(user).flush()\n }\n } catch (error) {\n logger.error('Failed to deactivate demo user', { role, email, err: error })\n }\n }\n}\n\n/**\n * @deprecated Renamed to {@link deactivateDemoUsersIfSelfOnboardingEnabled}\n * because the helper now neutralizes admin/employee demo accounts in addition\n * to superadmin (security tracker finding #5). Kept as an internal alias to\n * avoid breaking any out-of-tree caller that imported the old name; will be\n * removed in a future major.\n */\nconst deactivateDemoSuperAdminIfSelfOnboardingEnabled = deactivateDemoUsersIfSelfOnboardingEnabled\n\n/** Try to get modules from runtime registry; returns empty array if not yet registered. */\nfunction tryGetModules(): Module[] {\n try {\n const { getModules } = require('@open-mercato/shared/lib/modules/registry')\n return getModules()\n } catch {\n return []\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { hash } from 'bcryptjs'\nimport { randomBytes } from 'node:crypto'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport { Role, RoleAcl, User, UserRole } from '@open-mercato/core/modules/auth/data/entities'\nimport { Tenant, Organization } from '@open-mercato/core/modules/directory/data/entities'\nimport { rebuildHierarchyForTenant } from '@open-mercato/core/modules/directory/lib/hierarchy'\nimport { normalizeTenantId } from './tenantAccess'\nimport { computeEmailHash, emailHashLookupValues } from '@open-mercato/core/modules/auth/lib/emailHash'\nimport { getDefaultEncryptionMaps, type Module } from '@open-mercato/shared/modules/registry'\nimport type { ModuleEncryptionMap } from '@open-mercato/shared/modules/encryption'\nimport { isEncryptionDebugEnabled, isTenantDataEncryptionEnabled } from '@open-mercato/shared/lib/encryption/toggles'\nimport { upsertCanonicalEncryptionMap } from '@open-mercato/core/modules/entities/lib/encryption-maps'\nimport { createKmsService } from '@open-mercato/shared/lib/encryption/kms'\nimport { TenantDataEncryptionService } from '@open-mercato/shared/lib/encryption/tenantDataEncryptionService'\nimport { findOneWithDecryption, findWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport {\n lockRoleAclWriterAuthorizationState,\n lockUserRoleWriterAuthorizationState,\n} from '@open-mercato/core/modules/auth/lib/authorizationStateLocks'\nimport { withAtomicFlush } from '@open-mercato/shared/lib/commands/flush'\nimport { parseBooleanToken } from '@open-mercato/shared/lib/boolean'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\n\nconst logger = createLogger('auth').child({ component: 'setup' })\n\nconst DEFAULT_ROLE_NAMES = ['employee', 'admin', 'superadmin'] as const\nconst DEMO_SUPERADMIN_EMAIL = 'superadmin@acme.com'\nconst DEFAULT_DERIVED_EMAIL_DOMAIN = DEMO_SUPERADMIN_EMAIL.split('@')[1] ?? 'acme.com'\n\nexport type EnsureRolesOptions = {\n roleNames?: string[]\n tenantId?: string\n}\n\nasync function ensureRolesInContext(\n em: EntityManager,\n roleNames: string[],\n tenantId: string,\n) {\n for (const name of roleNames) {\n const existing = await findOneWithDecryption(em, Role, { name, tenantId }, {}, { tenantId, organizationId: null })\n if (existing) continue\n em.persist(em.create(Role, { name, tenantId, minActiveHolders: name === 'admin' ? 1 : 0, createdAt: new Date() }))\n }\n}\n\nexport async function ensureRoles(em: EntityManager, options: EnsureRolesOptions = {}) {\n const roleNames = options.roleNames ?? [...DEFAULT_ROLE_NAMES]\n const tenantId = normalizeTenantId(options.tenantId ?? null)\n if (!tenantId) {\n throw new Error('ensureRoles requires a tenantId \u2014 global roles are not supported')\n }\n await em.transactional(async (tem) => {\n await ensureRolesInContext(tem, roleNames, tenantId)\n await tem.flush()\n })\n}\n\nasync function findRoleByName(\n em: EntityManager,\n name: string,\n tenantId: string | null,\n): Promise<Role | null> {\n const normalizedTenant = normalizeTenantId(tenantId ?? null) ?? null\n return findOneWithDecryption(em, Role, { name, tenantId: normalizedTenant }, {}, { tenantId: normalizedTenant, organizationId: null })\n}\n\nasync function findRoleByNameOrFail(\n em: EntityManager,\n name: string,\n tenantId: string | null,\n): Promise<Role> {\n const role = await findRoleByName(em, name, tenantId)\n if (!role) throw new Error(`ROLE_NOT_FOUND:${name}`)\n return role\n}\n\ntype PrimaryUserInput = {\n email: string\n password?: string\n hashedPassword?: string | null\n firstName?: string | null\n lastName?: string | null\n displayName?: string | null\n confirm?: boolean\n}\n\nconst DERIVED_EMAIL_ENV = {\n admin: 'OM_INIT_ADMIN_EMAIL',\n employee: 'OM_INIT_EMPLOYEE_EMAIL',\n} as const\n\nexport type DemoUserRole = 'superadmin' | 'admin' | 'employee'\nexport type DemoUserEmail = { role: DemoUserRole; email: string }\n\n/**\n * Returns the canonical list of demo user emails the setup path may have\n * seeded. Honors OM_INIT_ADMIN_EMAIL / OM_INIT_EMPLOYEE_EMAIL exactly the\n * same way the derived-user seeding branch does, so the deactivation loop\n * never drifts from the seeding loop.\n *\n * Pure function \u2014 no side effects, safe to unit-test in isolation.\n *\n * @internal Exported for tests; not part of the public auth API.\n */\nexport function resolveDemoUserEmails(): DemoUserEmail[] {\n const adminEmail = readEnvValue(DERIVED_EMAIL_ENV.admin) ?? `admin@${DEFAULT_DERIVED_EMAIL_DOMAIN}`\n const employeeEmail = readEnvValue(DERIVED_EMAIL_ENV.employee) ?? `employee@${DEFAULT_DERIVED_EMAIL_DOMAIN}`\n return [\n { role: 'superadmin', email: DEMO_SUPERADMIN_EMAIL },\n { role: 'admin', email: adminEmail },\n { role: 'employee', email: employeeEmail },\n ]\n}\n\nexport type SetupInitialTenantOptions = {\n orgName: string\n primaryUser: PrimaryUserInput\n roleNames?: string[]\n includeDerivedUsers?: boolean\n failIfUserExists?: boolean\n primaryUserRoles?: string[]\n includeSuperadminRole?: boolean\n /** Optional list of enabled modules. When provided, module setup hooks are called. */\n modules?: Module[]\n /**\n * Optional global slug to persist on the new Organization. When set, a\n * pre-flight uniqueness check across all tenants throws OrgSlugExistsError\n * on collision so scriptable callers can fail loudly instead of silently\n * reusing or clobbering an existing organization.\n */\n orgSlug?: string\n /**\n * Opt-in flag that allows seeding the derived admin/employee accounts when\n * the OM_INIT_ADMIN_PASSWORD / OM_INIT_EMPLOYEE_PASSWORD env vars are unset.\n *\n * - In non-production (`NODE_ENV !== 'production'`): the demo accounts are\n * seeded with the well-known `'secret'` password so local dev workflows\n * (e.g. `mercato init`) stay predictable for developers.\n * - In production: the fallback uses a randomly generated 96-bit password\n * (printed once by the CLI) so an operator who deliberately opts in still\n * avoids the historical hardcoded credential. When this flag is false/unset\n * in production and the env vars are missing, `DerivedUserPasswordRequiredError`\n * is thrown instead of silently seeding any account.\n */\n allowDemoDerivedPasswords?: boolean\n}\n\nexport class OrgSlugExistsError extends Error {\n constructor(public readonly slug: string) {\n super(`ORG_SLUG_EXISTS: an organization with slug \"${slug}\" already exists`)\n this.name = 'OrgSlugExistsError'\n }\n}\n\nexport class DerivedUserPasswordRequiredError extends Error {\n constructor(public readonly missing: string[]) {\n super(\n `DERIVED_USER_PASSWORD_REQUIRED: missing ${missing.join(', ')} (set the env vars, pass allowDemoDerivedPasswords: true / --include-demo-users in non-production, or disable derived user seeding)`,\n )\n this.name = 'DerivedUserPasswordRequiredError'\n }\n}\n\nexport type SetupInitialTenantResult = {\n tenantId: string\n organizationId: string\n users: Array<{ user: User; roles: string[]; created: boolean; generatedPassword?: string | null }>\n reusedExistingUser: boolean\n}\n\nexport async function upsertSetupEncryptionMaps(\n em: EntityManager,\n tenantId: string,\n organizationId: string,\n specs: readonly ModuleEncryptionMap[],\n): Promise<string[]> {\n const materializedEntityIds: string[] = []\n for (const spec of specs) {\n if (spec.keyScope === 'system') continue\n await upsertCanonicalEncryptionMap(em, {\n entityId: spec.entityId,\n tenantId,\n organizationId,\n fields: spec.fields,\n isActive: true,\n })\n materializedEntityIds.push(spec.entityId)\n }\n return materializedEntityIds\n}\n\nexport async function invalidateSetupEncryptionMaps(\n encryptionService: Pick<TenantDataEncryptionService, 'invalidateMap'>,\n entityIds: readonly string[],\n tenantId: string,\n organizationId: string,\n): Promise<void> {\n for (const entityId of entityIds) {\n await encryptionService.invalidateMap(entityId, tenantId, organizationId)\n }\n await encryptionService.invalidateMap('auth:user', tenantId, null)\n}\n\nexport async function setupInitialTenant(\n em: EntityManager,\n options: SetupInitialTenantOptions,\n): Promise<SetupInitialTenantResult> {\n const {\n primaryUser,\n includeDerivedUsers = true,\n failIfUserExists = false,\n primaryUserRoles,\n includeSuperadminRole = true,\n } = options\n const primaryRolesInput = primaryUserRoles && primaryUserRoles.length ? primaryUserRoles : ['superadmin']\n const primaryRoles = includeSuperadminRole\n ? primaryRolesInput\n : primaryRolesInput.filter((role) => role !== 'superadmin')\n if (primaryRoles.length === 0) {\n throw new Error('PRIMARY_ROLES_REQUIRED')\n }\n const defaultRoleNames = options.roleNames ?? [...DEFAULT_ROLE_NAMES]\n const resolvedRoleNames = includeSuperadminRole\n ? defaultRoleNames\n : defaultRoleNames.filter((role) => role !== 'superadmin')\n const roleNames = Array.from(new Set([...resolvedRoleNames, ...primaryRoles]))\n const resolvedModules = options.modules ?? tryGetModules()\n const defaultEncryptionMaps = getDefaultEncryptionMaps(resolvedModules)\n\n const mainEmail = primaryUser.email\n const existingUserByHash = await findOneWithDecryption(\n em,\n User,\n { emailHash: { $in: emailHashLookupValues(mainEmail) }, deletedAt: null },\n {},\n { tenantId: null, organizationId: null },\n )\n const existingUser = existingUserByHash ?? await findOneWithDecryption(\n em,\n User,\n { email: mainEmail, deletedAt: null },\n {},\n { tenantId: null, organizationId: null },\n )\n if (existingUser && failIfUserExists) {\n throw new Error('USER_EXISTS')\n }\n\n if (options.orgSlug) {\n const slugConflict = await findOneWithDecryption(\n em,\n Organization,\n { slug: options.orgSlug },\n {},\n { tenantId: null, organizationId: null },\n )\n if (slugConflict) {\n throw new OrgSlugExistsError(options.orgSlug)\n }\n }\n\n let tenantId: string | undefined\n let organizationId: string | undefined\n let reusedExistingUser = false\n let materializedEncryptionEntityIds: string[] = []\n const userSnapshots: Array<{ user: User; roles: string[]; created: boolean; generatedPassword?: string | null }> = []\n\n await em.transactional(async (tem) => {\n if (!existingUser) return\n reusedExistingUser = true\n tenantId = existingUser.tenantId ? String(existingUser.tenantId) : undefined\n organizationId = existingUser.organizationId ? String(existingUser.organizationId) : undefined\n const roleTenantId = normalizeTenantId(existingUser.tenantId ?? null) ?? null\n if (!roleTenantId) {\n throw new Error('Cannot reuse a user without a tenantId \u2014 global roles are not supported')\n }\n\n await ensureRolesInContext(tem, roleNames, roleTenantId)\n await tem.flush()\n\n const requiredRoleSet = new Set([...roleNames, ...primaryRoles])\n const requiredRoles = await Promise.all(\n Array.from(requiredRoleSet).map((roleName) => findRoleByNameOrFail(tem, roleName, roleTenantId)),\n )\n await lockUserRoleWriterAuthorizationState(tem, {\n userIds: [String(existingUser.id)],\n roleIds: requiredRoles.map((role) => String(role.id)),\n })\n const links = await findWithDecryption(\n tem,\n UserRole,\n { user: existingUser },\n { populate: ['role'] },\n { tenantId: roleTenantId, organizationId: null },\n )\n const currentRoles = new Set(links.map((link) => link.role.name))\n for (const role of requiredRoles) {\n const roleName = role.name\n if (!currentRoles.has(roleName)) {\n tem.persist(tem.create(UserRole, { user: existingUser, role, createdAt: new Date() }))\n }\n }\n await tem.flush()\n const roles = Array.from(new Set([...currentRoles, ...roleNames]))\n userSnapshots.push({ user: existingUser, roles, created: false })\n })\n\n if (!existingUser) {\n const baseUsers: Array<{\n email: string\n roles: string[]\n name?: string | null\n passwordHash?: string | null\n generatedPassword?: string | null\n }> = [\n { email: primaryUser.email, roles: primaryRoles, name: resolvePrimaryName(primaryUser) },\n ]\n if (includeDerivedUsers) {\n const adminOverride = readEnvValue(DERIVED_EMAIL_ENV.admin)\n const employeeOverride = readEnvValue(DERIVED_EMAIL_ENV.employee)\n const adminEmail = adminOverride ?? `admin@${DEFAULT_DERIVED_EMAIL_DOMAIN}`\n const employeeEmail = employeeOverride ?? `employee@${DEFAULT_DERIVED_EMAIL_DOMAIN}`\n const envAdminPwd = readEnvValue('OM_INIT_ADMIN_PASSWORD')\n const envEmployeePwd = readEnvValue('OM_INIT_EMPLOYEE_PASSWORD')\n const isProduction = process.env.NODE_ENV === 'production'\n const allowDemo = options.allowDemoDerivedPasswords === true\n if (isProduction && !allowDemo) {\n const missing: string[] = []\n if (!envAdminPwd) missing.push('OM_INIT_ADMIN_PASSWORD')\n if (!envEmployeePwd) missing.push('OM_INIT_EMPLOYEE_PASSWORD')\n if (missing.length) {\n throw new DerivedUserPasswordRequiredError(missing)\n }\n }\n // In non-production, fall back to the well-known DEMO_DERIVED_PASSWORD so\n // local dev workflows stay predictable (admin@/employee@ login with the\n // documented demo password). In production we either have env-supplied\n // values, or \u2014 for opt-in --include-demo-users flows \u2014 we generate a\n // random one-time password and surface it via `generatedPassword` so the\n // operator can capture it. Production callers without env vars and\n // without the opt-in already threw above.\n const fallbackAdminPwd = isProduction ? generateDerivedPassword() : DEMO_DERIVED_PASSWORD\n const fallbackEmployeePwd = isProduction ? generateDerivedPassword() : DEMO_DERIVED_PASSWORD\n const adminPasswordPlain = envAdminPwd ?? fallbackAdminPwd\n const employeePasswordPlain = envEmployeePwd ?? fallbackEmployeePwd\n const adminPasswordHash = await hash(adminPasswordPlain, 10)\n const employeePasswordHash = await hash(employeePasswordPlain, 10)\n addUniqueBaseUser(baseUsers, {\n email: adminEmail,\n roles: ['admin'],\n passwordHash: adminPasswordHash,\n generatedPassword: envAdminPwd ? null : adminPasswordPlain,\n })\n addUniqueBaseUser(baseUsers, {\n email: employeeEmail,\n roles: ['employee'],\n passwordHash: employeePasswordHash,\n generatedPassword: envEmployeePwd ? null : employeePasswordPlain,\n })\n }\n const passwordHash = await resolvePasswordHash(primaryUser)\n\n await em.transactional(async (tem) => {\n const tenant = tem.create(Tenant, {\n name: options.orgName,\n isActive: true,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n tem.persist(tenant)\n await tem.flush()\n\n const organization = tem.create(Organization, {\n name: options.orgName,\n slug: options.orgSlug ?? null,\n tenant,\n isActive: true,\n depth: 0,\n ancestorIds: [],\n childIds: [],\n descendantIds: [],\n logoPreserveAspectRatio: false,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n tem.persist(organization)\n await tem.flush()\n\n tenantId = String(tenant.id)\n organizationId = String(organization.id)\n const roleTenantId = tenantId\n\n if (isTenantDataEncryptionEnabled()) {\n try {\n const kms = createKmsService()\n if (kms.isHealthy()) {\n if (isEncryptionDebugEnabled()) {\n logger.info('Provisioning tenant DEK', { tenantId: String(tenant.id) })\n }\n await kms.createTenantDek(String(tenant.id))\n if (isEncryptionDebugEnabled()) {\n logger.info('Created tenant DEK during setup', { tenantId: String(tenant.id) })\n }\n } else {\n if (isEncryptionDebugEnabled()) {\n logger.warn('KMS not healthy, skipping tenant DEK creation', { tenantId: String(tenant.id) })\n }\n }\n } catch (err) {\n if (isEncryptionDebugEnabled()) {\n logger.warn('Failed to create tenant DEK', { err })\n }\n }\n }\n\n await ensureRolesInContext(tem, roleNames, roleTenantId)\n await tem.flush()\n\n if (isTenantDataEncryptionEnabled()) {\n // System-scoped maps are resolved from module code, never from a tenant row.\n // Persisting one here would make the tenant-scoped encryption CLIs believe they\n // own that entity and re-wrap its `system:<entityId>` ciphertext under the tenant\n // DEK, which runtime decryption can no longer read.\n materializedEncryptionEntityIds = await upsertSetupEncryptionMaps(\n tem,\n String(tenant.id),\n String(organization.id),\n defaultEncryptionMaps,\n )\n }\n })\n\n await em.transactional(async (tem) => {\n if (!tenantId || !organizationId) return\n const roleTenantId = tenantId\n const encryptionService = isTenantDataEncryptionEnabled()\n ? new TenantDataEncryptionService(tem as any, { kms: createKmsService() })\n : null\n if (encryptionService) {\n await invalidateSetupEncryptionMaps(\n encryptionService,\n materializedEncryptionEntityIds,\n String(tenantId),\n String(organizationId),\n )\n }\n\n for (const base of baseUsers) {\n const resolvedPasswordHash = base.passwordHash ?? passwordHash\n let user = await findOneWithDecryption(tem, User, { email: base.email }, {}, { tenantId: tenantId ?? null, organizationId: organizationId ?? null })\n const confirm = primaryUser.confirm ?? true\n const encryptedPayload = encryptionService\n ? await encryptionService.encryptEntityPayload('auth:user', { email: base.email }, tenantId, organizationId)\n : { email: base.email, emailHash: computeEmailHash(base.email) }\n if (user) {\n user.passwordHash = resolvedPasswordHash\n user.organizationId = organizationId\n user.tenantId = tenantId\n if (isTenantDataEncryptionEnabled()) {\n user.email = encryptedPayload.email as any\n user.emailHash = (encryptedPayload as any).emailHash ?? computeEmailHash(base.email)\n }\n if (base.name) user.name = base.name\n if (confirm) user.isConfirmed = true\n tem.persist(user)\n userSnapshots.push({ user, roles: base.roles, created: false, generatedPassword: base.generatedPassword ?? null })\n } else {\n user = tem.create(User, {\n email: (encryptedPayload as any).email ?? base.email,\n emailHash: isTenantDataEncryptionEnabled() ? (encryptedPayload as any).emailHash ?? computeEmailHash(base.email) : undefined,\n passwordHash: resolvedPasswordHash,\n organizationId,\n tenantId,\n name: base.name ?? undefined,\n isConfirmed: confirm,\n createdAt: new Date(),\n })\n tem.persist(user)\n userSnapshots.push({ user, roles: base.roles, created: true, generatedPassword: base.generatedPassword ?? null })\n }\n await tem.flush()\n const assignedRoles = await Promise.all(\n base.roles.map((roleName) => findRoleByNameOrFail(tem, roleName, roleTenantId)),\n )\n await lockUserRoleWriterAuthorizationState(tem, {\n userIds: [String(user.id)],\n roleIds: assignedRoles.map((role) => String(role.id)),\n })\n for (const role of assignedRoles) {\n const existingLink = await findOneWithDecryption(tem, UserRole, { user, role }, {}, { tenantId: tenantId ?? null, organizationId: null })\n if (!existingLink) tem.persist(tem.create(UserRole, { user, role, createdAt: new Date() }))\n }\n await tem.flush()\n }\n })\n }\n\n if (!tenantId || !organizationId) {\n throw new Error('SETUP_FAILED')\n }\n\n if (!reusedExistingUser) {\n await rebuildHierarchyForTenant(em, tenantId)\n }\n\n await ensureDefaultRoleAcls(em, tenantId, resolvedModules, { includeSuperadminRole })\n await deactivateDemoUsersIfSelfOnboardingEnabled(em)\n\n // Call module onTenantCreated hooks\n for (const mod of resolvedModules) {\n if (mod.setup?.onTenantCreated) {\n await mod.setup.onTenantCreated({ em, tenantId, organizationId })\n }\n }\n\n // Custom roles are often created inside onTenantCreated hooks, so they did not\n // exist yet when ensureDefaultRoleAcls ran above and were skipped there. Sync\n // again now that the hooks have had a chance to create them \u2014 idempotent, same\n // pattern as the `mercato auth sync-role-acls` CLI command.\n await ensureCustomRoleAcls(em, tenantId, resolvedModules)\n\n return {\n tenantId,\n organizationId,\n users: userSnapshots,\n reusedExistingUser,\n }\n}\n\nfunction resolvePrimaryName(input: PrimaryUserInput): string | null {\n if (input.displayName && input.displayName.trim()) return input.displayName.trim()\n const parts = [input.firstName, input.lastName].map((value) => value?.trim()).filter(Boolean)\n if (parts.length) return parts.join(' ')\n return null\n}\n\nfunction readEnvValue(key: string): string | undefined {\n const value = process.env[key]\n if (typeof value !== 'string') return undefined\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : undefined\n}\n\nfunction addUniqueBaseUser(\n baseUsers: Array<{ email: string; roles: string[]; name?: string | null; passwordHash?: string | null; generatedPassword?: string | null }>,\n entry: { email: string; roles: string[]; name?: string | null; passwordHash?: string | null; generatedPassword?: string | null },\n) {\n if (!entry.email) return\n const normalized = entry.email.toLowerCase()\n if (baseUsers.some((user) => user.email.toLowerCase() === normalized)) return\n baseUsers.push(entry)\n}\n\n/**\n * Well-known demo password seeded for derived admin@/employee@ accounts in\n * non-production (`NODE_ENV !== 'production'`) when no env override is set.\n * Keeps the documented `yarn dev` / `mercato init` DX predictable. Never used\n * in production: the production branch either consumes env-supplied values or\n * falls back to `generateDerivedPassword()` so credentials remain non-guessable.\n */\nconst DEMO_DERIVED_PASSWORD = 'secret'\n\n/**\n * Generate a 16-character base64url password (96 bits of entropy) for a derived\n * demo user in production when no env override is provided AND the caller\n * explicitly opted in via `allowDemoDerivedPasswords`. Surfaced via the\n * `users[].generatedPassword` snapshot so CLI callers can print it to the\n * operator \u2014 there is no other recovery path for these credentials.\n */\nfunction generateDerivedPassword(): string {\n return randomBytes(12).toString('base64url')\n}\n\nfunction isDemoModeEnabled(): boolean {\n const parsed = parseBooleanToken(process.env.DEMO_MODE ?? '')\n return parsed === false ? false : true\n}\n\nfunction shouldKeepDemoSuperadminDuringInit(): boolean {\n if (process.env.OM_INIT_FLOW !== 'true') return false\n if (!readEnvValue('OM_INIT_SUPERADMIN_EMAIL')) return false\n return isDemoModeEnabled()\n}\n\nasync function resolvePasswordHash(input: PrimaryUserInput): Promise<string | null> {\n if (typeof input.hashedPassword === 'string') return input.hashedPassword\n if (input.password) return hash(input.password, 10)\n return null\n}\n\nexport async function ensureDefaultRoleAcls(\n em: EntityManager,\n tenantId: string,\n modules: Module[],\n options: { includeSuperadminRole?: boolean } = {},\n) {\n const includeSuperadminRole = options.includeSuperadminRole ?? true\n const roleTenantId = normalizeTenantId(tenantId) ?? null\n const superadminRole = includeSuperadminRole ? await findRoleByName(em, 'superadmin', roleTenantId) : null\n const adminRole = await findRoleByName(em, 'admin', roleTenantId)\n const employeeRole = await findRoleByName(em, 'employee', roleTenantId)\n\n // Merge features from all enabled modules' setup configs\n const builtInRoles = ['superadmin', 'admin', 'employee'] as const\n const superadminFeatures: string[] = []\n const adminFeatures: string[] = []\n const employeeFeatures: string[] = []\n const customRoleFeatures = new Map<string, string[]>()\n\n for (const mod of modules) {\n const roleFeatures = mod.setup?.defaultRoleFeatures\n if (!roleFeatures) continue\n if (roleFeatures.superadmin) superadminFeatures.push(...roleFeatures.superadmin)\n if (roleFeatures.admin) adminFeatures.push(...roleFeatures.admin)\n if (roleFeatures.employee) employeeFeatures.push(...roleFeatures.employee)\n\n // Collect features for custom roles (any key not in builtInRoles)\n for (const [roleName, features] of Object.entries(roleFeatures)) {\n if ((builtInRoles as readonly string[]).includes(roleName)) continue\n if (!Array.isArray(features)) continue\n const existing = customRoleFeatures.get(roleName) ?? []\n existing.push(...features)\n customRoleFeatures.set(roleName, existing)\n }\n }\n\n logger.info('Seeded default role features', {\n superadmin: superadminFeatures,\n admin: adminFeatures,\n employee: employeeFeatures,\n ...(customRoleFeatures.size > 0\n ? Object.fromEntries(customRoleFeatures)\n : {}),\n })\n\n if (includeSuperadminRole && superadminRole) {\n await ensureRoleAclFor(em, superadminRole, tenantId, superadminFeatures, { isSuperAdmin: true })\n }\n if (adminRole) {\n await ensureRoleAclFor(em, adminRole, tenantId, adminFeatures)\n }\n if (employeeRole) {\n await ensureRoleAclFor(em, employeeRole, tenantId, employeeFeatures)\n }\n\n // Seed ACLs for custom roles defined by app modules.\n // NOTE: Custom roles may not exist yet if they are created in seedDefaults\n // (which runs after this function). In that case, use ensureCustomRoleAcls()\n // after seedDefaults to pick them up.\n for (const [roleName, features] of customRoleFeatures) {\n const role = await findRoleByName(em, roleName, roleTenantId)\n if (role) {\n await ensureRoleAclFor(em, role, tenantId, features)\n }\n }\n}\n\n/**\n * Seed ACLs for custom roles defined in module defaultRoleFeatures.\n * Call this AFTER seedDefaults to pick up roles created by app modules.\n * Safe to call multiple times \u2014 ensureRoleAclFor merges features idempotently.\n */\nexport async function ensureCustomRoleAcls(\n em: EntityManager,\n tenantId: string,\n modules?: Module[],\n): Promise<void> {\n const resolvedModules = modules ?? tryGetModules()\n const roleTenantId = normalizeTenantId(tenantId) ?? null\n const builtInRoles = ['superadmin', 'admin', 'employee']\n const customRoleFeatures = new Map<string, string[]>()\n\n for (const mod of resolvedModules) {\n const roleFeatures = mod.setup?.defaultRoleFeatures\n if (!roleFeatures) continue\n for (const [roleName, features] of Object.entries(roleFeatures)) {\n if (builtInRoles.includes(roleName)) continue\n if (!Array.isArray(features)) continue\n const existing = customRoleFeatures.get(roleName) ?? []\n existing.push(...features)\n customRoleFeatures.set(roleName, existing)\n }\n }\n\n if (customRoleFeatures.size === 0) return\n\n let seeded = 0\n for (const [roleName, features] of customRoleFeatures) {\n const role = await findRoleByName(em, roleName, roleTenantId)\n if (role) {\n await ensureRoleAclFor(em, role, tenantId, features)\n seeded++\n }\n }\n if (seeded > 0) {\n logger.info('Seeded custom role ACLs', { seeded })\n }\n}\n\nasync function ensureRoleAclFor(\n em: EntityManager,\n role: Role,\n tenantId: string,\n features: string[],\n options: { isSuperAdmin?: boolean } = {},\n) {\n // Deduplicated on the create path too, not only on merge. `ensureDefaultRoleAcls` concatenates\n // every enabled module's declared features, and two modules legitimately declare the same\n // grant (the example module asks for `payment_gateways.view`, and so does that module itself),\n // so a first init used to store the string twice while the second run silently collapsed it.\n // Same list, two shapes, depending only on how many times setup had run.\n const uniqueFeatures = Array.from(new Set(features))\n await withAtomicFlush(em, [async () => {\n await lockRoleAclWriterAuthorizationState(em, [String(role.id)])\n const existing = await findOneWithDecryption(em, RoleAcl, { role, tenantId }, {}, { tenantId, organizationId: null })\n if (!existing) {\n const acl = em.create(RoleAcl, {\n role,\n tenantId,\n featuresJson: uniqueFeatures,\n isSuperAdmin: !!options.isSuperAdmin,\n createdAt: new Date(),\n })\n await em.persist(acl).flush()\n return\n }\n const currentFeatures = Array.isArray(existing.featuresJson) ? existing.featuresJson : []\n const merged = Array.from(new Set([...currentFeatures, ...uniqueFeatures]))\n const changed =\n merged.length !== currentFeatures.length ||\n merged.some((value, index) => value !== currentFeatures[index])\n if (changed) existing.featuresJson = merged\n if (options.isSuperAdmin && !existing.isSuperAdmin) {\n existing.isSuperAdmin = true\n }\n if (changed || options.isSuperAdmin) {\n await em.persist(existing).flush()\n }\n }], { transaction: true, label: 'auth.ensure-role-acl' })\n}\n\n/**\n * Neutralizes every demo account the setup path may have seeded\n * (superadmin, admin, employee \u2014 honoring OM_INIT_*_EMAIL overrides)\n * when SELF_SERVICE_ONBOARDING_ENABLED is on and the operator did not\n * opt in to keeping demo credentials via shouldKeepDemoSuperadminDuringInit.\n *\n * Each user is processed in its own try/catch so a single failure (e.g.\n * decryption error on a legacy row) does not skip the remaining accounts.\n *\n * @internal Exported for tests; not part of the public auth API.\n */\nexport async function deactivateDemoUsersIfSelfOnboardingEnabled(em: EntityManager) {\n if (process.env.SELF_SERVICE_ONBOARDING_ENABLED !== 'true') return\n if (shouldKeepDemoSuperadminDuringInit()) return\n for (const { role, email } of resolveDemoUserEmails()) {\n try {\n const user = await findOneWithDecryption(\n em,\n User,\n { email },\n {},\n { tenantId: null, organizationId: null },\n )\n if (!user) continue\n let dirty = false\n if (user.passwordHash) {\n user.passwordHash = null\n dirty = true\n }\n if (user.isConfirmed !== false) {\n user.isConfirmed = false\n dirty = true\n }\n if (dirty) {\n await em.persist(user).flush()\n }\n } catch (error) {\n logger.error('Failed to deactivate demo user', { role, email, err: error })\n }\n }\n}\n\n/**\n * @deprecated Renamed to {@link deactivateDemoUsersIfSelfOnboardingEnabled}\n * because the helper now neutralizes admin/employee demo accounts in addition\n * to superadmin (security tracker finding #5). Kept as an internal alias to\n * avoid breaking any out-of-tree caller that imported the old name; will be\n * removed in a future major.\n */\nconst deactivateDemoSuperAdminIfSelfOnboardingEnabled = deactivateDemoUsersIfSelfOnboardingEnabled\n\n/** Try to get modules from runtime registry; returns empty array if not yet registered. */\nfunction tryGetModules(): Module[] {\n try {\n const { getModules } = require('@open-mercato/shared/lib/modules/registry')\n return getModules()\n } catch {\n return []\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,16 +1,28 @@
1
1
  import { createHmac, randomBytes } from "node:crypto";
2
2
  import { createLogger } from "@open-mercato/shared/lib/logger";
3
+ import { parseBooleanToken } from "@open-mercato/shared/lib/boolean";
3
4
  const logger = createLogger("auth").child({ component: "token-hash" });
4
5
  const DEV_ONLY_SECRET = "om-auth-token-dev-only-secret";
6
+ const DEV_FALLBACK_NODE_ENVS = /* @__PURE__ */ new Set(["", "development", "test"]);
5
7
  let missingSecretWarned = false;
8
+ function isDevFallbackAllowed(nodeEnv) {
9
+ if (DEV_FALLBACK_NODE_ENVS.has(nodeEnv)) return true;
10
+ return parseBooleanToken(process.env.OM_ALLOW_DEV_AUTH_SECRET) === true;
11
+ }
6
12
  function resolveTokenSecret() {
7
13
  const secret = process.env.AUTH_TOKEN_SECRET || process.env.AUTH_SECRET || process.env.NEXTAUTH_SECRET || process.env.JWT_SECRET;
8
14
  if (!secret) {
9
- if (process.env.NODE_ENV === "production") {
15
+ const nodeEnv = (process.env.NODE_ENV ?? "").trim();
16
+ if (nodeEnv === "production") {
10
17
  throw new Error(
11
18
  "[auth.tokenHash] No AUTH_TOKEN_SECRET/AUTH_SECRET/NEXTAUTH_SECRET/JWT_SECRET set. Refusing to start in production without a token hashing secret."
12
19
  );
13
20
  }
21
+ if (!isDevFallbackAllowed(nodeEnv)) {
22
+ throw new Error(
23
+ `[auth.tokenHash] No AUTH_TOKEN_SECRET/AUTH_SECRET/NEXTAUTH_SECRET/JWT_SECRET set (NODE_ENV=${nodeEnv}). The insecure dev-only token hashing secret is only used when NODE_ENV is development or test. Set a token hashing secret, or set OM_ALLOW_DEV_AUTH_SECRET=true to opt in explicitly.`
24
+ );
25
+ }
14
26
  if (!missingSecretWarned) {
15
27
  missingSecretWarned = true;
16
28
  logger.warn("No AUTH_TOKEN_SECRET/AUTH_SECRET/NEXTAUTH_SECRET/JWT_SECRET set \u2014 using insecure dev-only default. Set a secret before deploying to production.");