@open-mercato/core 0.6.6-develop.6465.1.019f0fb26f → 0.6.6-develop.6471.1.9ab5bdd79a

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 (1213) hide show
  1. package/dist/bootstrap.js +13 -11
  2. package/dist/bootstrap.js.map +2 -2
  3. package/dist/helpers/integration/queue-runner.js +4 -2
  4. package/dist/helpers/integration/queue-runner.js.map +2 -2
  5. package/dist/modules/api_keys/services/apiKeyService.js +5 -3
  6. package/dist/modules/api_keys/services/apiKeyService.js.map +2 -2
  7. package/dist/modules/attachments/api/image/[id]/[[...slug]]/route.js +4 -2
  8. package/dist/modules/attachments/api/image/[id]/[[...slug]]/route.js.map +2 -2
  9. package/dist/modules/attachments/api/library/[id]/route.js +3 -1
  10. package/dist/modules/attachments/api/library/[id]/route.js.map +2 -2
  11. package/dist/modules/attachments/api/route.js +8 -6
  12. package/dist/modules/attachments/api/route.js.map +2 -2
  13. package/dist/modules/attachments/components/AttachmentPartitionSettings.js +5 -3
  14. package/dist/modules/attachments/components/AttachmentPartitionSettings.js.map +2 -2
  15. package/dist/modules/attachments/lib/assignmentDetails.js +3 -1
  16. package/dist/modules/attachments/lib/assignmentDetails.js.map +2 -2
  17. package/dist/modules/attachments/lib/drivers/driverFactory.js +3 -1
  18. package/dist/modules/attachments/lib/drivers/driverFactory.js.map +2 -2
  19. package/dist/modules/attachments/lib/ocrQueue.js +10 -11
  20. package/dist/modules/attachments/lib/ocrQueue.js.map +2 -2
  21. package/dist/modules/attachments/lib/ocrService.js +6 -4
  22. package/dist/modules/attachments/lib/ocrService.js.map +2 -2
  23. package/dist/modules/audit_logs/api/audit-logs/actions/redo/route.js +3 -1
  24. package/dist/modules/audit_logs/api/audit-logs/actions/redo/route.js.map +2 -2
  25. package/dist/modules/audit_logs/api/audit-logs/actions/undo/route.js +3 -1
  26. package/dist/modules/audit_logs/api/audit-logs/actions/undo/route.js.map +2 -2
  27. package/dist/modules/audit_logs/backend/audit-logs/page.js +3 -1
  28. package/dist/modules/audit_logs/backend/audit-logs/page.js.map +2 -2
  29. package/dist/modules/audit_logs/components/AuditLogsActions.js +4 -2
  30. package/dist/modules/audit_logs/components/AuditLogsActions.js.map +2 -2
  31. package/dist/modules/audit_logs/services/accessLogService.js +4 -2
  32. package/dist/modules/audit_logs/services/accessLogService.js.map +2 -2
  33. package/dist/modules/audit_logs/services/actionLogService.js +7 -5
  34. package/dist/modules/audit_logs/services/actionLogService.js.map +3 -3
  35. package/dist/modules/auth/api/profile/route.js +4 -2
  36. package/dist/modules/auth/api/profile/route.js.map +2 -2
  37. package/dist/modules/auth/api/reset/confirm.js +3 -1
  38. package/dist/modules/auth/api/reset/confirm.js.map +2 -2
  39. package/dist/modules/auth/api/reset.js +4 -2
  40. package/dist/modules/auth/api/reset.js.map +2 -2
  41. package/dist/modules/auth/api/roles/route.js +3 -1
  42. package/dist/modules/auth/api/roles/route.js.map +2 -2
  43. package/dist/modules/auth/api/sidebar/variants/route.js +3 -1
  44. package/dist/modules/auth/api/sidebar/variants/route.js.map +2 -2
  45. package/dist/modules/auth/api/users/resend-invite/route.js +4 -2
  46. package/dist/modules/auth/api/users/resend-invite/route.js.map +2 -2
  47. package/dist/modules/auth/api/users/route.js +3 -1
  48. package/dist/modules/auth/api/users/route.js.map +2 -2
  49. package/dist/modules/auth/backend/auth/profile/page.js +3 -1
  50. package/dist/modules/auth/backend/auth/profile/page.js.map +2 -2
  51. package/dist/modules/auth/backend/profile/change-password/page.js +3 -1
  52. package/dist/modules/auth/backend/profile/change-password/page.js.map +2 -2
  53. package/dist/modules/auth/backend/users/[id]/edit/page.js +5 -3
  54. package/dist/modules/auth/backend/users/[id]/edit/page.js.map +2 -2
  55. package/dist/modules/auth/backend/users/create/page.js +4 -2
  56. package/dist/modules/auth/backend/users/create/page.js.map +2 -2
  57. package/dist/modules/auth/cli.js +10 -0
  58. package/dist/modules/auth/cli.js.map +2 -2
  59. package/dist/modules/auth/commands/users.js +4 -2
  60. package/dist/modules/auth/commands/users.js.map +2 -2
  61. package/dist/modules/auth/lib/consentIntegrity.js +3 -3
  62. package/dist/modules/auth/lib/consentIntegrity.js.map +2 -2
  63. package/dist/modules/auth/lib/setup-app.js +9 -10
  64. package/dist/modules/auth/lib/setup-app.js.map +2 -2
  65. package/dist/modules/auth/lib/tenantAccess.js +3 -1
  66. package/dist/modules/auth/lib/tenantAccess.js.map +2 -2
  67. package/dist/modules/auth/lib/tokenHash.js +3 -3
  68. package/dist/modules/auth/lib/tokenHash.js.map +2 -2
  69. package/dist/modules/business_rules/api/rules/route.js +4 -2
  70. package/dist/modules/business_rules/api/rules/route.js.map +2 -2
  71. package/dist/modules/business_rules/lib/expression-evaluator.js +7 -5
  72. package/dist/modules/business_rules/lib/expression-evaluator.js.map +2 -2
  73. package/dist/modules/business_rules/lib/rule-engine.js +5 -3
  74. package/dist/modules/business_rules/lib/rule-engine.js.map +2 -2
  75. package/dist/modules/business_rules/lib/rule-evaluator.js +11 -12
  76. package/dist/modules/business_rules/lib/rule-evaluator.js.map +2 -2
  77. package/dist/modules/business_rules/subscribers/crud-rule-trigger.js +3 -1
  78. package/dist/modules/business_rules/subscribers/crud-rule-trigger.js.map +2 -2
  79. package/dist/modules/business_rules/subscribers/rule-execution-failed-notification.js +3 -1
  80. package/dist/modules/business_rules/subscribers/rule-execution-failed-notification.js.map +2 -2
  81. package/dist/modules/catalog/ai-agents-context.js +4 -5
  82. package/dist/modules/catalog/ai-agents-context.js.map +2 -2
  83. package/dist/modules/catalog/ai-tools/_shared.js +3 -1
  84. package/dist/modules/catalog/ai-tools/_shared.js.map +2 -2
  85. package/dist/modules/catalog/ai-tools/authoring-pack.js +3 -1
  86. package/dist/modules/catalog/ai-tools/authoring-pack.js.map +2 -2
  87. package/dist/modules/catalog/ai-tools/merchandising-pack.js +3 -1
  88. package/dist/modules/catalog/ai-tools/merchandising-pack.js.map +2 -2
  89. package/dist/modules/catalog/api/dictionaries/[key]/route.js +3 -1
  90. package/dist/modules/catalog/api/dictionaries/[key]/route.js.map +2 -2
  91. package/dist/modules/catalog/api/prices/route.js +3 -1
  92. package/dist/modules/catalog/api/prices/route.js.map +2 -2
  93. package/dist/modules/catalog/api/products/route.js +5 -3
  94. package/dist/modules/catalog/api/products/route.js.map +2 -2
  95. package/dist/modules/catalog/api/settings/route.js +4 -2
  96. package/dist/modules/catalog/api/settings/route.js.map +2 -2
  97. package/dist/modules/catalog/backend/catalog/products/[id]/page.js +14 -12
  98. package/dist/modules/catalog/backend/catalog/products/[id]/page.js.map +2 -2
  99. package/dist/modules/catalog/backend/catalog/products/[productId]/variants/[variantId]/page.js +8 -6
  100. package/dist/modules/catalog/backend/catalog/products/[productId]/variants/[variantId]/page.js.map +2 -2
  101. package/dist/modules/catalog/backend/catalog/products/[productId]/variants/create/page.js +5 -3
  102. package/dist/modules/catalog/backend/catalog/products/[productId]/variants/create/page.js.map +2 -2
  103. package/dist/modules/catalog/backend/catalog/products/create/page.js +5 -6
  104. package/dist/modules/catalog/backend/catalog/products/create/page.js.map +2 -2
  105. package/dist/modules/catalog/backend/catalog/products/optionSchemaClient.js +3 -1
  106. package/dist/modules/catalog/backend/catalog/products/optionSchemaClient.js.map +2 -2
  107. package/dist/modules/catalog/components/PriceKindSettings.js +5 -3
  108. package/dist/modules/catalog/components/PriceKindSettings.js.map +2 -2
  109. package/dist/modules/catalog/components/UnitPriceDisplaySettings.js +4 -2
  110. package/dist/modules/catalog/components/UnitPriceDisplaySettings.js.map +2 -2
  111. package/dist/modules/catalog/inbox-actions.js +4 -2
  112. package/dist/modules/catalog/inbox-actions.js.map +2 -2
  113. package/dist/modules/catalog/seed/examples.js +4 -5
  114. package/dist/modules/catalog/seed/examples.js.map +2 -2
  115. package/dist/modules/catalog/subscribers/low-stock-notification.js +3 -1
  116. package/dist/modules/catalog/subscribers/low-stock-notification.js.map +2 -2
  117. package/dist/modules/catalog/widgets/injection/product-seo/state.js +3 -1
  118. package/dist/modules/catalog/widgets/injection/product-seo/state.js.map +2 -2
  119. package/dist/modules/communication_channels/api/get/oauth/[provider]/callback/route.js +12 -11
  120. package/dist/modules/communication_channels/api/get/oauth/[provider]/callback/route.js.map +2 -2
  121. package/dist/modules/communication_channels/api/post/channels/[id]/import-history/route.js +3 -1
  122. package/dist/modules/communication_channels/api/post/channels/[id]/import-history/route.js.map +2 -2
  123. package/dist/modules/communication_channels/api/post/channels/[id]/push/register/route.js +3 -1
  124. package/dist/modules/communication_channels/api/post/channels/[id]/push/register/route.js.map +2 -2
  125. package/dist/modules/communication_channels/api/post/webhook/[provider]/route.js +5 -3
  126. package/dist/modules/communication_channels/api/post/webhook/[provider]/route.js.map +2 -2
  127. package/dist/modules/communication_channels/api/post/webhooks/gmail/route.js +6 -6
  128. package/dist/modules/communication_channels/api/post/webhooks/gmail/route.js.map +2 -2
  129. package/dist/modules/communication_channels/commands/connect-credential-channel.js +4 -6
  130. package/dist/modules/communication_channels/commands/connect-credential-channel.js.map +2 -2
  131. package/dist/modules/communication_channels/commands/delete-channel.js +3 -3
  132. package/dist/modules/communication_channels/commands/delete-channel.js.map +2 -2
  133. package/dist/modules/communication_channels/commands/deliver-outbound-message.js +4 -5
  134. package/dist/modules/communication_channels/commands/deliver-outbound-message.js.map +2 -2
  135. package/dist/modules/communication_channels/commands/disconnect-channel.js +3 -3
  136. package/dist/modules/communication_channels/commands/disconnect-channel.js.map +2 -2
  137. package/dist/modules/communication_channels/commands/ingest-inbound-message.js +5 -12
  138. package/dist/modules/communication_channels/commands/ingest-inbound-message.js.map +2 -2
  139. package/dist/modules/communication_channels/commands/push-unregister.js +3 -3
  140. package/dist/modules/communication_channels/commands/push-unregister.js.map +2 -2
  141. package/dist/modules/communication_channels/commands/reassign-conversation.js +5 -3
  142. package/dist/modules/communication_channels/commands/reassign-conversation.js.map +2 -2
  143. package/dist/modules/communication_channels/lib/dead-letter.js +3 -3
  144. package/dist/modules/communication_channels/lib/dead-letter.js.map +2 -2
  145. package/dist/modules/communication_channels/lib/email-mime.js +4 -6
  146. package/dist/modules/communication_channels/lib/email-mime.js.map +2 -2
  147. package/dist/modules/communication_channels/lib/oauth-client-config.js +5 -3
  148. package/dist/modules/communication_channels/lib/oauth-client-config.js.map +2 -2
  149. package/dist/modules/communication_channels/lib/send-as-user.js +3 -1
  150. package/dist/modules/communication_channels/lib/send-as-user.js.map +2 -2
  151. package/dist/modules/communication_channels/lib/thread-token.js +4 -2
  152. package/dist/modules/communication_channels/lib/thread-token.js.map +2 -2
  153. package/dist/modules/communication_channels/setup.js +3 -4
  154. package/dist/modules/communication_channels/setup.js.map +2 -2
  155. package/dist/modules/communication_channels/workers/channel-import-history.js +4 -6
  156. package/dist/modules/communication_channels/workers/channel-import-history.js.map +2 -2
  157. package/dist/modules/communication_channels/workers/gmail-history-sync.js +8 -16
  158. package/dist/modules/communication_channels/workers/gmail-history-sync.js.map +2 -2
  159. package/dist/modules/communication_channels/workers/gmail-renew-watch.js +5 -7
  160. package/dist/modules/communication_channels/workers/gmail-renew-watch.js.map +2 -2
  161. package/dist/modules/communication_channels/workers/outbound-delivery.js +6 -12
  162. package/dist/modules/communication_channels/workers/outbound-delivery.js.map +2 -2
  163. package/dist/modules/communication_channels/workers/poll-channel.js +7 -15
  164. package/dist/modules/communication_channels/workers/poll-channel.js.map +2 -2
  165. package/dist/modules/communication_channels/workers/poll-tick.js +5 -6
  166. package/dist/modules/communication_channels/workers/poll-tick.js.map +2 -2
  167. package/dist/modules/communication_channels/workers/reaction-processor.js +5 -9
  168. package/dist/modules/communication_channels/workers/reaction-processor.js.map +2 -2
  169. package/dist/modules/configs/api/cache/route.js +4 -2
  170. package/dist/modules/configs/api/cache/route.js.map +2 -2
  171. package/dist/modules/configs/api/system-status/route.js +4 -2
  172. package/dist/modules/configs/api/system-status/route.js.map +2 -2
  173. package/dist/modules/configs/api/upgrade-actions/route.js +4 -2
  174. package/dist/modules/configs/api/upgrade-actions/route.js.map +2 -2
  175. package/dist/modules/configs/components/ModuleTelemetryPanel.js +3 -1
  176. package/dist/modules/configs/components/ModuleTelemetryPanel.js.map +2 -2
  177. package/dist/modules/configs/lib/touchGeneratedBarrels.js +2 -1
  178. package/dist/modules/configs/lib/touchGeneratedBarrels.js.map +2 -2
  179. package/dist/modules/configs/services/upgradeActionsService.js +6 -3
  180. package/dist/modules/configs/services/upgradeActionsService.js.map +2 -2
  181. package/dist/modules/currencies/components/CurrencyFetchingConfig.js +3 -1
  182. package/dist/modules/currencies/components/CurrencyFetchingConfig.js.map +2 -2
  183. package/dist/modules/currencies/lib/exchangeRateFormConfig.js +3 -1
  184. package/dist/modules/currencies/lib/exchangeRateFormConfig.js.map +2 -2
  185. package/dist/modules/currencies/services/providers/nbp.js +6 -4
  186. package/dist/modules/currencies/services/providers/nbp.js.map +2 -2
  187. package/dist/modules/currencies/services/providers/raiffeisen.js +7 -7
  188. package/dist/modules/currencies/services/providers/raiffeisen.js.map +2 -2
  189. package/dist/modules/customer_accounts/api/domain-resolve/all.js +6 -5
  190. package/dist/modules/customer_accounts/api/domain-resolve/all.js.map +2 -2
  191. package/dist/modules/customer_accounts/api/signup.js +4 -2
  192. package/dist/modules/customer_accounts/api/signup.js.map +2 -2
  193. package/dist/modules/customer_accounts/lib/customerAuthServer.js +3 -1
  194. package/dist/modules/customer_accounts/lib/customerAuthServer.js.map +2 -2
  195. package/dist/modules/customer_accounts/subscribers/autoLinkCrm.js +3 -1
  196. package/dist/modules/customer_accounts/subscribers/autoLinkCrm.js.map +2 -2
  197. package/dist/modules/customer_accounts/subscribers/autoLinkCrmReverse.js +3 -1
  198. package/dist/modules/customer_accounts/subscribers/autoLinkCrmReverse.js.map +2 -2
  199. package/dist/modules/customer_accounts/subscribers/unlinkOnCompanyDelete.js +3 -1
  200. package/dist/modules/customer_accounts/subscribers/unlinkOnCompanyDelete.js.map +2 -2
  201. package/dist/modules/customer_accounts/subscribers/unlinkOnPersonDelete.js +3 -1
  202. package/dist/modules/customer_accounts/subscribers/unlinkOnPersonDelete.js.map +2 -2
  203. package/dist/modules/customers/ai-agents-context.js +4 -5
  204. package/dist/modules/customers/ai-agents-context.js.map +2 -2
  205. package/dist/modules/customers/api/activities/route.js +6 -4
  206. package/dist/modules/customers/api/activities/route.js.map +2 -2
  207. package/dist/modules/customers/api/comments/route.js +3 -1
  208. package/dist/modules/customers/api/comments/route.js.map +2 -2
  209. package/dist/modules/customers/api/companies/[id]/people/route.js +3 -1
  210. package/dist/modules/customers/api/companies/[id]/people/route.js.map +2 -2
  211. package/dist/modules/customers/api/companies/[id]/route.js +5 -3
  212. package/dist/modules/customers/api/companies/[id]/route.js.map +2 -2
  213. package/dist/modules/customers/api/companies/route.js +5 -3
  214. package/dist/modules/customers/api/companies/route.js.map +2 -2
  215. package/dist/modules/customers/api/dashboard/widgets/customer-todos/route.js +3 -1
  216. package/dist/modules/customers/api/dashboard/widgets/customer-todos/route.js.map +2 -2
  217. package/dist/modules/customers/api/dashboard/widgets/new-customers/route.js +3 -1
  218. package/dist/modules/customers/api/dashboard/widgets/new-customers/route.js.map +2 -2
  219. package/dist/modules/customers/api/dashboard/widgets/new-deals/route.js +3 -1
  220. package/dist/modules/customers/api/dashboard/widgets/new-deals/route.js.map +2 -2
  221. package/dist/modules/customers/api/dashboard/widgets/next-interactions/route.js +3 -1
  222. package/dist/modules/customers/api/dashboard/widgets/next-interactions/route.js.map +2 -2
  223. package/dist/modules/customers/api/deals/[id]/companies/route.js +3 -1
  224. package/dist/modules/customers/api/deals/[id]/companies/route.js.map +2 -2
  225. package/dist/modules/customers/api/deals/[id]/people/route.js +3 -1
  226. package/dist/modules/customers/api/deals/[id]/people/route.js.map +2 -2
  227. package/dist/modules/customers/api/deals/aggregate/route.js +3 -1
  228. package/dist/modules/customers/api/deals/aggregate/route.js.map +2 -2
  229. package/dist/modules/customers/api/deals/bulk-update-owner/route.js +7 -5
  230. package/dist/modules/customers/api/deals/bulk-update-owner/route.js.map +2 -2
  231. package/dist/modules/customers/api/deals/bulk-update-stage/route.js +7 -5
  232. package/dist/modules/customers/api/deals/bulk-update-stage/route.js.map +2 -2
  233. package/dist/modules/customers/api/deals/route.js +3 -1
  234. package/dist/modules/customers/api/deals/route.js.map +2 -2
  235. package/dist/modules/customers/api/deals/summary/route.js +3 -1
  236. package/dist/modules/customers/api/deals/summary/route.js.map +2 -2
  237. package/dist/modules/customers/api/dictionaries/[kind]/[id]/route.js +4 -2
  238. package/dist/modules/customers/api/dictionaries/[kind]/[id]/route.js.map +2 -2
  239. package/dist/modules/customers/api/dictionaries/[kind]/route.js +5 -3
  240. package/dist/modules/customers/api/dictionaries/[kind]/route.js.map +2 -2
  241. package/dist/modules/customers/api/dictionaries/cache.js +3 -1
  242. package/dist/modules/customers/api/dictionaries/cache.js.map +2 -2
  243. package/dist/modules/customers/api/dictionaries/context.js +3 -1
  244. package/dist/modules/customers/api/dictionaries/context.js.map +2 -2
  245. package/dist/modules/customers/api/dictionaries/currency/route.js +3 -1
  246. package/dist/modules/customers/api/dictionaries/currency/route.js.map +2 -2
  247. package/dist/modules/customers/api/dictionaries/kind-settings/route.js +4 -2
  248. package/dist/modules/customers/api/dictionaries/kind-settings/route.js.map +2 -2
  249. package/dist/modules/customers/api/entity-roles-factory.js +7 -5
  250. package/dist/modules/customers/api/entity-roles-factory.js.map +2 -2
  251. package/dist/modules/customers/api/interactions/cancel/route.js +3 -1
  252. package/dist/modules/customers/api/interactions/cancel/route.js.map +2 -2
  253. package/dist/modules/customers/api/interactions/complete/route.js +3 -1
  254. package/dist/modules/customers/api/interactions/complete/route.js.map +2 -2
  255. package/dist/modules/customers/api/interactions/conflicts/route.js +3 -1
  256. package/dist/modules/customers/api/interactions/conflicts/route.js.map +2 -2
  257. package/dist/modules/customers/api/interactions/counts/route.js +3 -1
  258. package/dist/modules/customers/api/interactions/counts/route.js.map +2 -2
  259. package/dist/modules/customers/api/interactions/route.js +7 -4
  260. package/dist/modules/customers/api/interactions/route.js.map +2 -2
  261. package/dist/modules/customers/api/interactions/tasks/route.js +3 -1
  262. package/dist/modules/customers/api/interactions/tasks/route.js.map +2 -2
  263. package/dist/modules/customers/api/labels/assign/route.js +3 -1
  264. package/dist/modules/customers/api/labels/assign/route.js.map +2 -2
  265. package/dist/modules/customers/api/labels/route.js +6 -3
  266. package/dist/modules/customers/api/labels/route.js.map +2 -2
  267. package/dist/modules/customers/api/labels/unassign/route.js +3 -1
  268. package/dist/modules/customers/api/labels/unassign/route.js.map +2 -2
  269. package/dist/modules/customers/api/people/[id]/companies/enriched/route.js +3 -1
  270. package/dist/modules/customers/api/people/[id]/companies/enriched/route.js.map +2 -2
  271. package/dist/modules/customers/api/people/[id]/route.js +5 -3
  272. package/dist/modules/customers/api/people/[id]/route.js.map +2 -2
  273. package/dist/modules/customers/api/people/route.js +5 -3
  274. package/dist/modules/customers/api/people/route.js.map +2 -2
  275. package/dist/modules/customers/api/pipeline-stages/reorder/route.js +3 -1
  276. package/dist/modules/customers/api/pipeline-stages/reorder/route.js.map +2 -2
  277. package/dist/modules/customers/api/pipeline-stages/route.js +6 -4
  278. package/dist/modules/customers/api/pipeline-stages/route.js.map +2 -2
  279. package/dist/modules/customers/api/pipelines/route.js +6 -4
  280. package/dist/modules/customers/api/pipelines/route.js.map +2 -2
  281. package/dist/modules/customers/api/settings/address-format/route.js +4 -2
  282. package/dist/modules/customers/api/settings/address-format/route.js.map +2 -2
  283. package/dist/modules/customers/api/settings/dictionary-sort-modes/route.js +4 -2
  284. package/dist/modules/customers/api/settings/dictionary-sort-modes/route.js.map +2 -2
  285. package/dist/modules/customers/api/settings/stuck-threshold/route.js +4 -2
  286. package/dist/modules/customers/api/settings/stuck-threshold/route.js.map +2 -2
  287. package/dist/modules/customers/api/tags/assign/route.js +3 -1
  288. package/dist/modules/customers/api/tags/assign/route.js.map +2 -2
  289. package/dist/modules/customers/api/tags/unassign/route.js +3 -1
  290. package/dist/modules/customers/api/tags/unassign/route.js.map +2 -2
  291. package/dist/modules/customers/api/todos/route.js +6 -4
  292. package/dist/modules/customers/api/todos/route.js.map +2 -2
  293. package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js +5 -3
  294. package/dist/modules/customers/backend/customers/companies-v2/[id]/page.js.map +2 -2
  295. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealActivities.js +3 -1
  296. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealActivities.js.map +2 -2
  297. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealClosure.js +3 -1
  298. package/dist/modules/customers/backend/customers/deals/[id]/hooks/useDealClosure.js.map +2 -2
  299. package/dist/modules/customers/backend/customers/deals/map/components/DealsMapCanvasImpl.js +4 -2
  300. package/dist/modules/customers/backend/customers/deals/map/components/DealsMapCanvasImpl.js.map +2 -2
  301. package/dist/modules/customers/backend/customers/deals/page.js +4 -2
  302. package/dist/modules/customers/backend/customers/deals/page.js.map +2 -2
  303. package/dist/modules/customers/backend/customers/people-v2/[id]/page.js +5 -3
  304. package/dist/modules/customers/backend/customers/people-v2/[id]/page.js.map +2 -2
  305. package/dist/modules/customers/commands/deals.js +3 -1
  306. package/dist/modules/customers/commands/deals.js.map +2 -2
  307. package/dist/modules/customers/commands/dictionaries.js +3 -1
  308. package/dist/modules/customers/commands/dictionaries.js.map +2 -2
  309. package/dist/modules/customers/commands/interactions.js +4 -2
  310. package/dist/modules/customers/commands/interactions.js.map +2 -2
  311. package/dist/modules/customers/commands/shared.js +4 -2
  312. package/dist/modules/customers/commands/shared.js.map +2 -2
  313. package/dist/modules/customers/commands/todos.js +3 -1
  314. package/dist/modules/customers/commands/todos.js.map +2 -2
  315. package/dist/modules/customers/components/DictionarySettings.js +5 -3
  316. package/dist/modules/customers/components/DictionarySettings.js.map +2 -2
  317. package/dist/modules/customers/components/DictionarySortSettings.js +3 -1
  318. package/dist/modules/customers/components/DictionarySortSettings.js.map +2 -2
  319. package/dist/modules/customers/components/detail/ActivitiesCard.js +3 -1
  320. package/dist/modules/customers/components/detail/ActivitiesCard.js.map +2 -2
  321. package/dist/modules/customers/components/detail/ActivitiesDayStrip.js +3 -1
  322. package/dist/modules/customers/components/detail/ActivitiesDayStrip.js.map +2 -2
  323. package/dist/modules/customers/components/detail/ActivitiesSection.js +6 -4
  324. package/dist/modules/customers/components/detail/ActivitiesSection.js.map +2 -2
  325. package/dist/modules/customers/components/detail/ActivityCard.js +3 -1
  326. package/dist/modules/customers/components/detail/ActivityCard.js.map +2 -2
  327. package/dist/modules/customers/components/detail/ChangelogTab.js +3 -1
  328. package/dist/modules/customers/components/detail/ChangelogTab.js.map +2 -2
  329. package/dist/modules/customers/components/detail/CompanyCard.js +3 -1
  330. package/dist/modules/customers/components/detail/CompanyCard.js.map +2 -2
  331. package/dist/modules/customers/components/detail/ConfirmDealLostDialog.js +3 -1
  332. package/dist/modules/customers/components/detail/ConfirmDealLostDialog.js.map +2 -2
  333. package/dist/modules/customers/components/detail/EntityTagsDialog.js +3 -1
  334. package/dist/modules/customers/components/detail/EntityTagsDialog.js.map +2 -2
  335. package/dist/modules/customers/components/detail/InlineActivityComposer.js +3 -1
  336. package/dist/modules/customers/components/detail/InlineActivityComposer.js.map +2 -2
  337. package/dist/modules/customers/components/detail/ManageTagsDialog.js +3 -1
  338. package/dist/modules/customers/components/detail/ManageTagsDialog.js.map +2 -2
  339. package/dist/modules/customers/components/detail/RoleAssignmentRow.js +5 -3
  340. package/dist/modules/customers/components/detail/RoleAssignmentRow.js.map +2 -2
  341. package/dist/modules/customers/components/detail/RolesSection.js +4 -2
  342. package/dist/modules/customers/components/detail/RolesSection.js.map +2 -2
  343. package/dist/modules/customers/components/detail/hooks/useInteractionMutations.js +5 -3
  344. package/dist/modules/customers/components/detail/hooks/useInteractionMutations.js.map +2 -2
  345. package/dist/modules/customers/components/linking/LinkEntityDialog.js +4 -2
  346. package/dist/modules/customers/components/linking/LinkEntityDialog.js.map +2 -2
  347. package/dist/modules/customers/inbox-actions.js +3 -1
  348. package/dist/modules/customers/inbox-actions.js.map +2 -2
  349. package/dist/modules/customers/lib/bulkDeals.js +3 -1
  350. package/dist/modules/customers/lib/bulkDeals.js.map +2 -2
  351. package/dist/modules/customers/lib/dealClosureNotification.js +4 -2
  352. package/dist/modules/customers/lib/dealClosureNotification.js.map +2 -2
  353. package/dist/modules/customers/lib/dealStageTransitionTable.js +3 -1
  354. package/dist/modules/customers/lib/dealStageTransitionTable.js.map +2 -2
  355. package/dist/modules/customers/lib/interactionFeatureFlags.js +3 -1
  356. package/dist/modules/customers/lib/interactionFeatureFlags.js.map +2 -2
  357. package/dist/modules/customers/lib/todoCompatibility.js +3 -1
  358. package/dist/modules/customers/lib/todoCompatibility.js.map +2 -2
  359. package/dist/modules/customers/search.js +14 -7
  360. package/dist/modules/customers/search.js.map +2 -2
  361. package/dist/modules/customers/widgets/dashboard/customer-todos/widget.client.js +3 -1
  362. package/dist/modules/customers/widgets/dashboard/customer-todos/widget.client.js.map +2 -2
  363. package/dist/modules/customers/widgets/dashboard/new-customers/widget.client.js +3 -1
  364. package/dist/modules/customers/widgets/dashboard/new-customers/widget.client.js.map +2 -2
  365. package/dist/modules/customers/widgets/dashboard/new-deals/widget.client.js +3 -1
  366. package/dist/modules/customers/widgets/dashboard/new-deals/widget.client.js.map +2 -2
  367. package/dist/modules/customers/widgets/dashboard/next-interactions/widget.client.js +3 -1
  368. package/dist/modules/customers/widgets/dashboard/next-interactions/widget.client.js.map +2 -2
  369. package/dist/modules/dashboards/api/widgets/data/batch/route.js +3 -1
  370. package/dist/modules/dashboards/api/widgets/data/batch/route.js.map +2 -2
  371. package/dist/modules/dashboards/api/widgets/data/route.js +3 -1
  372. package/dist/modules/dashboards/api/widgets/data/route.js.map +2 -2
  373. package/dist/modules/dashboards/components/WidgetVisibilityEditor.js +5 -3
  374. package/dist/modules/dashboards/components/WidgetVisibilityEditor.js.map +2 -2
  375. package/dist/modules/dashboards/widgets/dashboard/aov-kpi/widget.client.js +3 -1
  376. package/dist/modules/dashboards/widgets/dashboard/aov-kpi/widget.client.js.map +2 -2
  377. package/dist/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.client.js +3 -1
  378. package/dist/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.client.js.map +2 -2
  379. package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.client.js +3 -1
  380. package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.client.js.map +2 -2
  381. package/dist/modules/dashboards/widgets/dashboard/orders-kpi/widget.client.js +3 -1
  382. package/dist/modules/dashboards/widgets/dashboard/orders-kpi/widget.client.js.map +2 -2
  383. package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/widget.client.js +3 -1
  384. package/dist/modules/dashboards/widgets/dashboard/pipeline-summary/widget.client.js.map +2 -2
  385. package/dist/modules/dashboards/widgets/dashboard/revenue-kpi/widget.client.js +3 -1
  386. package/dist/modules/dashboards/widgets/dashboard/revenue-kpi/widget.client.js.map +2 -2
  387. package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.js +3 -1
  388. package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.js.map +2 -2
  389. package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.js +3 -1
  390. package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.js.map +2 -2
  391. package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.client.js +3 -1
  392. package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.client.js.map +2 -2
  393. package/dist/modules/dashboards/widgets/dashboard/top-products/widget.client.js +3 -1
  394. package/dist/modules/dashboards/widgets/dashboard/top-products/widget.client.js.map +2 -2
  395. package/dist/modules/data_sync/api/run.js +3 -1
  396. package/dist/modules/data_sync/api/run.js.map +2 -2
  397. package/dist/modules/data_sync/backend/data-sync/runs/[id]/page.js +1 -1
  398. package/dist/modules/data_sync/backend/data-sync/runs/[id]/page.js.map +2 -2
  399. package/dist/modules/data_sync/lib/adapter-registry.js +11 -4
  400. package/dist/modules/data_sync/lib/adapter-registry.js.map +2 -2
  401. package/dist/modules/data_sync/lib/sync-engine.js +23 -2
  402. package/dist/modules/data_sync/lib/sync-engine.js.map +2 -2
  403. package/dist/modules/data_sync/workers/sync-export.js +3 -1
  404. package/dist/modules/data_sync/workers/sync-export.js.map +2 -2
  405. package/dist/modules/data_sync/workers/sync-import.js +3 -1
  406. package/dist/modules/data_sync/workers/sync-import.js.map +2 -2
  407. package/dist/modules/dictionaries/api/[dictionaryId]/entries/[entryId]/route.js +4 -2
  408. package/dist/modules/dictionaries/api/[dictionaryId]/entries/[entryId]/route.js.map +2 -2
  409. package/dist/modules/dictionaries/api/[dictionaryId]/entries/reorder/route.js +3 -1
  410. package/dist/modules/dictionaries/api/[dictionaryId]/entries/reorder/route.js.map +2 -2
  411. package/dist/modules/dictionaries/api/[dictionaryId]/entries/route.js +4 -2
  412. package/dist/modules/dictionaries/api/[dictionaryId]/entries/route.js.map +2 -2
  413. package/dist/modules/dictionaries/api/[dictionaryId]/entries/set-default/route.js +3 -1
  414. package/dist/modules/dictionaries/api/[dictionaryId]/entries/set-default/route.js.map +2 -2
  415. package/dist/modules/dictionaries/api/[dictionaryId]/route.js +5 -3
  416. package/dist/modules/dictionaries/api/[dictionaryId]/route.js.map +2 -2
  417. package/dist/modules/dictionaries/api/context.js +3 -1
  418. package/dist/modules/dictionaries/api/context.js.map +2 -2
  419. package/dist/modules/dictionaries/api/route.js +4 -2
  420. package/dist/modules/dictionaries/api/route.js.map +2 -2
  421. package/dist/modules/dictionaries/components/DictionariesManager.js +5 -3
  422. package/dist/modules/dictionaries/components/DictionariesManager.js.map +2 -2
  423. package/dist/modules/dictionaries/components/DictionaryEntriesEditor.js +4 -2
  424. package/dist/modules/dictionaries/components/DictionaryEntriesEditor.js.map +2 -2
  425. package/dist/modules/dictionaries/components/DictionaryEntrySelect.js +4 -2
  426. package/dist/modules/dictionaries/components/DictionaryEntrySelect.js.map +2 -2
  427. package/dist/modules/dictionaries/components/DictionarySelectControl.js +3 -1
  428. package/dist/modules/dictionaries/components/DictionarySelectControl.js.map +2 -2
  429. package/dist/modules/dictionaries/fields/dictionary.js +3 -1
  430. package/dist/modules/dictionaries/fields/dictionary.js.map +2 -2
  431. package/dist/modules/directory/api/organization-branding/route.js +3 -1
  432. package/dist/modules/directory/api/organization-branding/route.js.map +2 -2
  433. package/dist/modules/directory/api/organization-switcher/route.js +3 -1
  434. package/dist/modules/directory/api/organization-switcher/route.js.map +2 -2
  435. package/dist/modules/directory/commands/tenants.js +5 -3
  436. package/dist/modules/directory/commands/tenants.js.map +2 -2
  437. package/dist/modules/directory/utils/organizationScope.js +6 -4
  438. package/dist/modules/directory/utils/organizationScope.js.map +2 -2
  439. package/dist/modules/entities/api/definitions.cache.js +3 -1
  440. package/dist/modules/entities/api/definitions.cache.js.map +2 -2
  441. package/dist/modules/entities/api/definitions.js +7 -5
  442. package/dist/modules/entities/api/definitions.js.map +2 -2
  443. package/dist/modules/entities/api/records.js +4 -8
  444. package/dist/modules/entities/api/records.js.map +2 -2
  445. package/dist/modules/entities/components/EncryptionManager.js +3 -1
  446. package/dist/modules/entities/components/EncryptionManager.js.map +2 -2
  447. package/dist/modules/entities/lib/makeActivityRoute.js +3 -1
  448. package/dist/modules/entities/lib/makeActivityRoute.js.map +2 -2
  449. package/dist/modules/feature_toggles/api/overrides/route.js +3 -1
  450. package/dist/modules/feature_toggles/api/overrides/route.js.map +2 -2
  451. package/dist/modules/feature_toggles/lib/feature-flag-check.js +5 -9
  452. package/dist/modules/feature_toggles/lib/feature-flag-check.js.map +2 -2
  453. package/dist/modules/inbox_ops/api/emails/[id]/reprocess/route.js +4 -2
  454. package/dist/modules/inbox_ops/api/emails/[id]/reprocess/route.js.map +2 -2
  455. package/dist/modules/inbox_ops/api/emails/[id]/route.js +4 -2
  456. package/dist/modules/inbox_ops/api/emails/[id]/route.js.map +2 -2
  457. package/dist/modules/inbox_ops/api/emails/route.js +3 -1
  458. package/dist/modules/inbox_ops/api/emails/route.js.map +2 -2
  459. package/dist/modules/inbox_ops/api/extract/route.js +3 -1
  460. package/dist/modules/inbox_ops/api/extract/route.js.map +2 -2
  461. package/dist/modules/inbox_ops/api/proposals/[id]/actions/[actionId]/route.js +3 -1
  462. package/dist/modules/inbox_ops/api/proposals/[id]/actions/[actionId]/route.js.map +2 -2
  463. package/dist/modules/inbox_ops/api/proposals/[id]/replies/[replyId]/send/route.js +4 -2
  464. package/dist/modules/inbox_ops/api/proposals/[id]/replies/[replyId]/send/route.js.map +2 -2
  465. package/dist/modules/inbox_ops/api/proposals/counts/route.js +4 -2
  466. package/dist/modules/inbox_ops/api/proposals/counts/route.js.map +2 -2
  467. package/dist/modules/inbox_ops/api/proposals/route.js +3 -1
  468. package/dist/modules/inbox_ops/api/proposals/route.js.map +2 -2
  469. package/dist/modules/inbox_ops/api/routeHelpers.js +3 -1
  470. package/dist/modules/inbox_ops/api/routeHelpers.js.map +2 -2
  471. package/dist/modules/inbox_ops/api/settings/route.js +3 -1
  472. package/dist/modules/inbox_ops/api/settings/route.js.map +2 -2
  473. package/dist/modules/inbox_ops/api/webhook/inbound.js +7 -5
  474. package/dist/modules/inbox_ops/api/webhook/inbound.js.map +2 -2
  475. package/dist/modules/inbox_ops/lib/cache.js +4 -2
  476. package/dist/modules/inbox_ops/lib/cache.js.map +2 -2
  477. package/dist/modules/inbox_ops/lib/catalogLookup.js +3 -1
  478. package/dist/modules/inbox_ops/lib/catalogLookup.js.map +2 -2
  479. package/dist/modules/inbox_ops/lib/eventBus.js +3 -4
  480. package/dist/modules/inbox_ops/lib/eventBus.js.map +2 -2
  481. package/dist/modules/inbox_ops/lib/messagesIntegration.js +4 -8
  482. package/dist/modules/inbox_ops/lib/messagesIntegration.js.map +2 -2
  483. package/dist/modules/inbox_ops/subscribers/executionAuditor.js +3 -1
  484. package/dist/modules/inbox_ops/subscribers/executionAuditor.js.map +2 -2
  485. package/dist/modules/inbox_ops/subscribers/extractionWorker.js +10 -8
  486. package/dist/modules/inbox_ops/subscribers/extractionWorker.js.map +2 -2
  487. package/dist/modules/inbox_ops/subscribers/proposalNotifier.js +3 -1
  488. package/dist/modules/inbox_ops/subscribers/proposalNotifier.js.map +2 -2
  489. package/dist/modules/messages/api/[id]/route.js +3 -4
  490. package/dist/modules/messages/api/[id]/route.js.map +2 -2
  491. package/dist/modules/messages/commands/actions.js +3 -1
  492. package/dist/modules/messages/commands/actions.js.map +2 -2
  493. package/dist/modules/messages/components/MessagesInboxPageClient.js +3 -1
  494. package/dist/modules/messages/components/MessagesInboxPageClient.js.map +2 -2
  495. package/dist/modules/messages/lib/email-sender.js +3 -7
  496. package/dist/modules/messages/lib/email-sender.js.map +2 -2
  497. package/dist/modules/messages/lib/message-objects-registry.js +3 -1
  498. package/dist/modules/messages/lib/message-objects-registry.js.map +2 -2
  499. package/dist/modules/messages/lib/message-types-registry.js +3 -1
  500. package/dist/modules/messages/lib/message-types-registry.js.map +2 -2
  501. package/dist/modules/messages/workers/send-email.worker.js +6 -4
  502. package/dist/modules/messages/workers/send-email.worker.js.map +2 -2
  503. package/dist/modules/notifications/lib/notificationMapper.js +3 -4
  504. package/dist/modules/notifications/lib/notificationMapper.js.map +2 -2
  505. package/dist/modules/notifications/lib/notificationService.js +4 -5
  506. package/dist/modules/notifications/lib/notificationService.js.map +2 -2
  507. package/dist/modules/notifications/subscribers/deliver-notification.js +8 -13
  508. package/dist/modules/notifications/subscribers/deliver-notification.js.map +2 -2
  509. package/dist/modules/payment_gateways/api/webhook/[provider]/route.js +3 -1
  510. package/dist/modules/payment_gateways/api/webhook/[provider]/route.js.map +2 -2
  511. package/dist/modules/perspectives/services/perspectiveService.js +3 -3
  512. package/dist/modules/perspectives/services/perspectiveService.js.map +2 -2
  513. package/dist/modules/planner/api/access.js +3 -3
  514. package/dist/modules/planner/api/access.js.map +2 -2
  515. package/dist/modules/planner/api/availability-date-specific.js +3 -1
  516. package/dist/modules/planner/api/availability-date-specific.js.map +2 -2
  517. package/dist/modules/planner/api/availability-weekly.js +3 -1
  518. package/dist/modules/planner/api/availability-weekly.js.map +2 -2
  519. package/dist/modules/planner/backend/planner/availability-rulesets/page.js +4 -2
  520. package/dist/modules/planner/backend/planner/availability-rulesets/page.js.map +2 -2
  521. package/dist/modules/planner/components/AvailabilityRulesEditor.js +3 -1
  522. package/dist/modules/planner/components/AvailabilityRulesEditor.js.map +2 -2
  523. package/dist/modules/progress/api/jobs/route.js +3 -1
  524. package/dist/modules/progress/api/jobs/route.js.map +2 -2
  525. package/dist/modules/query_index/components/QueryIndexesTable.js +5 -3
  526. package/dist/modules/query_index/components/QueryIndexesTable.js.map +2 -2
  527. package/dist/modules/query_index/lib/batch.js +4 -2
  528. package/dist/modules/query_index/lib/batch.js.map +2 -2
  529. package/dist/modules/query_index/lib/coverage.js +3 -1
  530. package/dist/modules/query_index/lib/coverage.js.map +2 -2
  531. package/dist/modules/query_index/lib/engine.js +13 -18
  532. package/dist/modules/query_index/lib/engine.js.map +2 -2
  533. package/dist/modules/query_index/lib/reindexer.js +8 -6
  534. package/dist/modules/query_index/lib/reindexer.js.map +2 -2
  535. package/dist/modules/query_index/lib/search-tokens.js +3 -1
  536. package/dist/modules/query_index/lib/search-tokens.js.map +2 -2
  537. package/dist/modules/query_index/subscribers/coverage_refresh.js +3 -1
  538. package/dist/modules/query_index/subscribers/coverage_refresh.js.map +2 -2
  539. package/dist/modules/resources/api/comments.js +3 -1
  540. package/dist/modules/resources/api/comments.js.map +2 -2
  541. package/dist/modules/resources/api/resources/tags/assign/route.js +3 -1
  542. package/dist/modules/resources/api/resources/tags/assign/route.js.map +2 -2
  543. package/dist/modules/resources/api/resources/tags/unassign/route.js +3 -1
  544. package/dist/modules/resources/api/resources/tags/unassign/route.js.map +2 -2
  545. package/dist/modules/resources/backend/resources/resource-types/[id]/edit/page.js +3 -1
  546. package/dist/modules/resources/backend/resources/resource-types/[id]/edit/page.js.map +2 -2
  547. package/dist/modules/resources/backend/resources/resource-types/page.js +4 -2
  548. package/dist/modules/resources/backend/resources/resource-types/page.js.map +2 -2
  549. package/dist/modules/resources/commands/activities.js +6 -5
  550. package/dist/modules/resources/commands/activities.js.map +2 -2
  551. package/dist/modules/resources/commands/comments.js +6 -4
  552. package/dist/modules/resources/commands/comments.js.map +2 -2
  553. package/dist/modules/resources/commands/shared.js +24 -1
  554. package/dist/modules/resources/commands/shared.js.map +2 -2
  555. package/dist/modules/sales/api/channels/route.js +3 -1
  556. package/dist/modules/sales/api/channels/route.js.map +2 -2
  557. package/dist/modules/sales/api/document-history/route.js +3 -1
  558. package/dist/modules/sales/api/document-history/route.js.map +2 -2
  559. package/dist/modules/sales/api/document-numbers/route.js +3 -1
  560. package/dist/modules/sales/api/document-numbers/route.js.map +2 -2
  561. package/dist/modules/sales/api/quotes/accept/route.js +4 -2
  562. package/dist/modules/sales/api/quotes/accept/route.js.map +2 -2
  563. package/dist/modules/sales/api/quotes/convert/route.js +3 -1
  564. package/dist/modules/sales/api/quotes/convert/route.js.map +2 -2
  565. package/dist/modules/sales/api/quotes/public/[token]/route.js +3 -1
  566. package/dist/modules/sales/api/quotes/public/[token]/route.js.map +2 -2
  567. package/dist/modules/sales/api/quotes/send/route.js +3 -1
  568. package/dist/modules/sales/api/quotes/send/route.js.map +2 -2
  569. package/dist/modules/sales/api/returns/[id]/route.js +3 -1
  570. package/dist/modules/sales/api/returns/[id]/route.js.map +2 -2
  571. package/dist/modules/sales/api/settings/document-numbers/route.js +4 -2
  572. package/dist/modules/sales/api/settings/document-numbers/route.js.map +2 -2
  573. package/dist/modules/sales/api/settings/order-editing/route.js +4 -2
  574. package/dist/modules/sales/api/settings/order-editing/route.js.map +2 -2
  575. package/dist/modules/sales/backend/sales/channels/[channelId]/edit/page.js +3 -1
  576. package/dist/modules/sales/backend/sales/channels/[channelId]/edit/page.js.map +2 -2
  577. package/dist/modules/sales/backend/sales/channels/offers/page.js +6 -4
  578. package/dist/modules/sales/backend/sales/channels/offers/page.js.map +2 -2
  579. package/dist/modules/sales/backend/sales/channels/page.js +4 -2
  580. package/dist/modules/sales/backend/sales/channels/page.js.map +2 -2
  581. package/dist/modules/sales/backend/sales/documents/[id]/page.js +20 -18
  582. package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
  583. package/dist/modules/sales/commands/documents.js +4 -8
  584. package/dist/modules/sales/commands/documents.js.map +2 -2
  585. package/dist/modules/sales/commands/payments.js +3 -1
  586. package/dist/modules/sales/commands/payments.js.map +2 -2
  587. package/dist/modules/sales/commands/shipments.js +3 -1
  588. package/dist/modules/sales/commands/shipments.js.map +2 -2
  589. package/dist/modules/sales/components/AdjustmentKindSettings.js +5 -3
  590. package/dist/modules/sales/components/AdjustmentKindSettings.js.map +2 -2
  591. package/dist/modules/sales/components/DocumentNumberSettings.js +4 -2
  592. package/dist/modules/sales/components/DocumentNumberSettings.js.map +2 -2
  593. package/dist/modules/sales/components/OrderEditingSettings.js +4 -2
  594. package/dist/modules/sales/components/OrderEditingSettings.js.map +2 -2
  595. package/dist/modules/sales/components/PaymentMethodsSettings.js +5 -3
  596. package/dist/modules/sales/components/PaymentMethodsSettings.js.map +2 -2
  597. package/dist/modules/sales/components/ShippingMethodsSettings.js +5 -3
  598. package/dist/modules/sales/components/ShippingMethodsSettings.js.map +2 -2
  599. package/dist/modules/sales/components/StatusSettings.js +5 -3
  600. package/dist/modules/sales/components/StatusSettings.js.map +2 -2
  601. package/dist/modules/sales/components/TaxRatesSettings.js +5 -3
  602. package/dist/modules/sales/components/TaxRatesSettings.js.map +2 -2
  603. package/dist/modules/sales/components/channels/ChannelOfferForm.js +16 -14
  604. package/dist/modules/sales/components/channels/ChannelOfferForm.js.map +2 -2
  605. package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js +4 -2
  606. package/dist/modules/sales/components/channels/SalesChannelOffersPanel.js.map +2 -2
  607. package/dist/modules/sales/components/documents/AddressesSection.js +5 -3
  608. package/dist/modules/sales/components/documents/AddressesSection.js.map +2 -2
  609. package/dist/modules/sales/components/documents/AdjustmentDialog.js +3 -1
  610. package/dist/modules/sales/components/documents/AdjustmentDialog.js.map +2 -2
  611. package/dist/modules/sales/components/documents/AdjustmentsSection.js +5 -3
  612. package/dist/modules/sales/components/documents/AdjustmentsSection.js.map +2 -2
  613. package/dist/modules/sales/components/documents/ItemsSection.js +6 -4
  614. package/dist/modules/sales/components/documents/ItemsSection.js.map +2 -2
  615. package/dist/modules/sales/components/documents/LineItemDialog.js +8 -6
  616. package/dist/modules/sales/components/documents/LineItemDialog.js.map +2 -2
  617. package/dist/modules/sales/components/documents/PaymentDialog.js +5 -3
  618. package/dist/modules/sales/components/documents/PaymentDialog.js.map +2 -2
  619. package/dist/modules/sales/components/documents/PaymentsSection.js +4 -2
  620. package/dist/modules/sales/components/documents/PaymentsSection.js.map +2 -2
  621. package/dist/modules/sales/components/documents/SalesDocumentForm.js +14 -12
  622. package/dist/modules/sales/components/documents/SalesDocumentForm.js.map +2 -2
  623. package/dist/modules/sales/components/documents/SalesDocumentsTable.js +5 -3
  624. package/dist/modules/sales/components/documents/SalesDocumentsTable.js.map +2 -2
  625. package/dist/modules/sales/components/documents/ShipmentDialog.js +9 -7
  626. package/dist/modules/sales/components/documents/ShipmentDialog.js.map +2 -2
  627. package/dist/modules/sales/components/documents/ShipmentsSection.js +4 -2
  628. package/dist/modules/sales/components/documents/ShipmentsSection.js.map +2 -2
  629. package/dist/modules/sales/frontend/quote/[token]/page.js +4 -2
  630. package/dist/modules/sales/frontend/quote/[token]/page.js.map +2 -2
  631. package/dist/modules/sales/seed/examples.js +7 -9
  632. package/dist/modules/sales/seed/examples.js.map +2 -2
  633. package/dist/modules/sales/subscribers/quote-expiring-notification.js +3 -1
  634. package/dist/modules/sales/subscribers/quote-expiring-notification.js.map +2 -2
  635. package/dist/modules/sales/subscribers/reconcileOnAddressDelete.js +3 -1
  636. package/dist/modules/sales/subscribers/reconcileOnAddressDelete.js.map +2 -2
  637. package/dist/modules/sales/subscribers/reconcileOnCompanyDelete.js +3 -1
  638. package/dist/modules/sales/subscribers/reconcileOnCompanyDelete.js.map +2 -2
  639. package/dist/modules/sales/subscribers/reconcileOnCustomerDelete.js +3 -1
  640. package/dist/modules/sales/subscribers/reconcileOnCustomerDelete.js.map +2 -2
  641. package/dist/modules/sales/widgets/dashboard/makeDashboardWidgetRoute.js +5 -3
  642. package/dist/modules/sales/widgets/dashboard/makeDashboardWidgetRoute.js.map +2 -2
  643. package/dist/modules/sales/widgets/dashboard/new-orders/widget.client.js +3 -1
  644. package/dist/modules/sales/widgets/dashboard/new-orders/widget.client.js.map +2 -2
  645. package/dist/modules/sales/widgets/dashboard/new-quotes/widget.client.js +3 -1
  646. package/dist/modules/sales/widgets/dashboard/new-quotes/widget.client.js.map +2 -2
  647. package/dist/modules/shipping_carriers/api/tracking/route.js +5 -0
  648. package/dist/modules/shipping_carriers/api/tracking/route.js.map +2 -2
  649. package/dist/modules/shipping_carriers/api/webhook/[provider]/route.js +3 -1
  650. package/dist/modules/shipping_carriers/api/webhook/[provider]/route.js.map +2 -2
  651. package/dist/modules/shipping_carriers/lib/shipping-service.js +41 -19
  652. package/dist/modules/shipping_carriers/lib/shipping-service.js.map +2 -2
  653. package/dist/modules/shipping_carriers/lib/upstream-error-response.js +3 -1
  654. package/dist/modules/shipping_carriers/lib/upstream-error-response.js.map +2 -2
  655. package/dist/modules/shipping_carriers/workers/webhook-processor.js +3 -5
  656. package/dist/modules/shipping_carriers/workers/webhook-processor.js.map +2 -2
  657. package/dist/modules/staff/api/comments.js +3 -1
  658. package/dist/modules/staff/api/comments.js.map +2 -2
  659. package/dist/modules/staff/api/leave-requests/accept/route.js +3 -1
  660. package/dist/modules/staff/api/leave-requests/accept/route.js.map +2 -2
  661. package/dist/modules/staff/api/leave-requests/reject/route.js +3 -1
  662. package/dist/modules/staff/api/leave-requests/reject/route.js.map +2 -2
  663. package/dist/modules/staff/api/team-members/assignable/route.js +3 -1
  664. package/dist/modules/staff/api/team-members/assignable/route.js.map +2 -2
  665. package/dist/modules/staff/api/team-members/self/route.js +4 -2
  666. package/dist/modules/staff/api/team-members/self/route.js.map +2 -2
  667. package/dist/modules/staff/api/team-members/tags/assign/route.js +3 -1
  668. package/dist/modules/staff/api/team-members/tags/assign/route.js.map +2 -2
  669. package/dist/modules/staff/api/team-members/tags/unassign/route.js +3 -1
  670. package/dist/modules/staff/api/team-members/tags/unassign/route.js.map +2 -2
  671. package/dist/modules/staff/api/timesheets/my-projects/[projectId]/route.js +3 -1
  672. package/dist/modules/staff/api/timesheets/my-projects/[projectId]/route.js.map +2 -2
  673. package/dist/modules/staff/api/timesheets/my-projects/route.js +3 -1
  674. package/dist/modules/staff/api/timesheets/my-projects/route.js.map +2 -2
  675. package/dist/modules/staff/api/timesheets/projects/kpis/route.js +3 -1
  676. package/dist/modules/staff/api/timesheets/projects/kpis/route.js.map +2 -2
  677. package/dist/modules/staff/api/timesheets/time-entries/[id]/segments/route.js +3 -1
  678. package/dist/modules/staff/api/timesheets/time-entries/[id]/segments/route.js.map +2 -2
  679. package/dist/modules/staff/api/timesheets/time-entries/[id]/timer-start/route.js +4 -2
  680. package/dist/modules/staff/api/timesheets/time-entries/[id]/timer-start/route.js.map +2 -2
  681. package/dist/modules/staff/api/timesheets/time-entries/[id]/timer-stop/route.js +4 -2
  682. package/dist/modules/staff/api/timesheets/time-entries/[id]/timer-stop/route.js.map +2 -2
  683. package/dist/modules/staff/api/timesheets/time-entries/bulk/route.js +3 -1
  684. package/dist/modules/staff/api/timesheets/time-entries/bulk/route.js.map +2 -2
  685. package/dist/modules/staff/api/timesheets/time-entries/start-timer/route.js +3 -1
  686. package/dist/modules/staff/api/timesheets/time-entries/start-timer/route.js.map +2 -2
  687. package/dist/modules/staff/backend/staff/team-members/page.js +4 -2
  688. package/dist/modules/staff/backend/staff/team-members/page.js.map +2 -2
  689. package/dist/modules/staff/backend/staff/team-roles/page.js +4 -2
  690. package/dist/modules/staff/backend/staff/team-roles/page.js.map +2 -2
  691. package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js +4 -2
  692. package/dist/modules/staff/backend/staff/teams/[id]/edit/page.js.map +2 -2
  693. package/dist/modules/staff/backend/staff/teams/page.js +4 -2
  694. package/dist/modules/staff/backend/staff/teams/page.js.map +2 -2
  695. package/dist/modules/staff/backend/staff/timesheets/page.js +7 -5
  696. package/dist/modules/staff/backend/staff/timesheets/page.js.map +2 -2
  697. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/page.js +3 -1
  698. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/page.js.map +2 -2
  699. package/dist/modules/staff/backend/staff/timesheets/projects/page.js +4 -2
  700. package/dist/modules/staff/backend/staff/timesheets/projects/page.js.map +2 -2
  701. package/dist/modules/staff/commands/timesheets-entries.js +3 -1
  702. package/dist/modules/staff/commands/timesheets-entries.js.map +2 -2
  703. package/dist/modules/staff/widgets/dashboard/timesheets-hours-by-project/widget.client.js +3 -1
  704. package/dist/modules/staff/widgets/dashboard/timesheets-hours-by-project/widget.client.js.map +2 -2
  705. package/dist/modules/staff/widgets/dashboard/timesheets-time-reporting/widget.client.js +5 -3
  706. package/dist/modules/staff/widgets/dashboard/timesheets-time-reporting/widget.client.js.map +2 -2
  707. package/dist/modules/sync_excel/api/import/route.js +3 -1
  708. package/dist/modules/sync_excel/api/import/route.js.map +2 -2
  709. package/dist/modules/translations/api/[entityType]/[entityId]/route.js +5 -3
  710. package/dist/modules/translations/api/[entityType]/[entityId]/route.js.map +2 -2
  711. package/dist/modules/translations/api/get/locales.js +3 -1
  712. package/dist/modules/translations/api/get/locales.js.map +2 -2
  713. package/dist/modules/translations/api/put/locales.js +3 -1
  714. package/dist/modules/translations/api/put/locales.js.map +2 -2
  715. package/dist/modules/translations/components/TranslationManager.js +3 -1
  716. package/dist/modules/translations/components/TranslationManager.js.map +2 -2
  717. package/dist/modules/translations/subscribers/cleanup.js +3 -1
  718. package/dist/modules/translations/subscribers/cleanup.js.map +2 -2
  719. package/dist/modules/workflows/api/definitions/[id]/customize/route.js +4 -2
  720. package/dist/modules/workflows/api/definitions/[id]/customize/route.js.map +2 -2
  721. package/dist/modules/workflows/api/definitions/[id]/reset-to-code/route.js +4 -2
  722. package/dist/modules/workflows/api/definitions/[id]/reset-to-code/route.js.map +2 -2
  723. package/dist/modules/workflows/api/definitions/[id]/route.js +6 -4
  724. package/dist/modules/workflows/api/definitions/[id]/route.js.map +2 -2
  725. package/dist/modules/workflows/api/definitions/route.js +4 -2
  726. package/dist/modules/workflows/api/definitions/route.js.map +2 -2
  727. package/dist/modules/workflows/api/events/[id]/route.js +3 -1
  728. package/dist/modules/workflows/api/events/[id]/route.js.map +2 -2
  729. package/dist/modules/workflows/api/events/route.js +3 -1
  730. package/dist/modules/workflows/api/events/route.js.map +2 -2
  731. package/dist/modules/workflows/api/instances/[id]/advance/route.js +3 -1
  732. package/dist/modules/workflows/api/instances/[id]/advance/route.js.map +2 -2
  733. package/dist/modules/workflows/api/instances/[id]/cancel/route.js +3 -1
  734. package/dist/modules/workflows/api/instances/[id]/cancel/route.js.map +2 -2
  735. package/dist/modules/workflows/api/instances/[id]/events/route.js +3 -1
  736. package/dist/modules/workflows/api/instances/[id]/events/route.js.map +2 -2
  737. package/dist/modules/workflows/api/instances/[id]/retry/route.js +3 -1
  738. package/dist/modules/workflows/api/instances/[id]/retry/route.js.map +2 -2
  739. package/dist/modules/workflows/api/instances/[id]/route.js +3 -1
  740. package/dist/modules/workflows/api/instances/[id]/route.js.map +2 -2
  741. package/dist/modules/workflows/api/instances/[id]/signal/route.js +5 -7
  742. package/dist/modules/workflows/api/instances/[id]/signal/route.js.map +2 -2
  743. package/dist/modules/workflows/api/instances/route.js +5 -3
  744. package/dist/modules/workflows/api/instances/route.js.map +2 -2
  745. package/dist/modules/workflows/api/instances/validate-start/route.js +3 -1
  746. package/dist/modules/workflows/api/instances/validate-start/route.js.map +2 -2
  747. package/dist/modules/workflows/api/signals/route.js +3 -1
  748. package/dist/modules/workflows/api/signals/route.js.map +2 -2
  749. package/dist/modules/workflows/api/tasks/[id]/claim/route.js +3 -1
  750. package/dist/modules/workflows/api/tasks/[id]/claim/route.js.map +2 -2
  751. package/dist/modules/workflows/api/tasks/[id]/complete/route.js +3 -1
  752. package/dist/modules/workflows/api/tasks/[id]/complete/route.js.map +2 -2
  753. package/dist/modules/workflows/api/tasks/[id]/route.js +3 -1
  754. package/dist/modules/workflows/api/tasks/[id]/route.js.map +2 -2
  755. package/dist/modules/workflows/api/tasks/route.js +3 -1
  756. package/dist/modules/workflows/api/tasks/route.js.map +2 -2
  757. package/dist/modules/workflows/backend/definitions/visual-editor/page.js +4 -2
  758. package/dist/modules/workflows/backend/definitions/visual-editor/page.js.map +2 -2
  759. package/dist/modules/workflows/backend/instances/[id]/page.js +5 -3
  760. package/dist/modules/workflows/backend/instances/[id]/page.js.map +2 -2
  761. package/dist/modules/workflows/backend/tasks/[id]/page.js +3 -1
  762. package/dist/modules/workflows/backend/tasks/[id]/page.js.map +2 -2
  763. package/dist/modules/workflows/components/BusinessRulesSelector.js +5 -3
  764. package/dist/modules/workflows/components/BusinessRulesSelector.js.map +2 -2
  765. package/dist/modules/workflows/components/WorkflowSelector.js +5 -3
  766. package/dist/modules/workflows/components/WorkflowSelector.js.map +2 -2
  767. package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js +3 -1
  768. package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js.map +2 -2
  769. package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js +3 -1
  770. package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js.map +2 -2
  771. package/dist/modules/workflows/components/fields/WorkflowSelectorField.js +3 -1
  772. package/dist/modules/workflows/components/fields/WorkflowSelectorField.js.map +2 -2
  773. package/dist/modules/workflows/frontend/checkout-demo/page.js +8 -7
  774. package/dist/modules/workflows/frontend/checkout-demo/page.js.map +2 -2
  775. package/dist/modules/workflows/lib/activity-executor.js +25 -21
  776. package/dist/modules/workflows/lib/activity-executor.js.map +2 -2
  777. package/dist/modules/workflows/lib/activity-worker-handler.js +8 -15
  778. package/dist/modules/workflows/lib/activity-worker-handler.js.map +2 -2
  779. package/dist/modules/workflows/lib/code-registry.js +7 -7
  780. package/dist/modules/workflows/lib/code-registry.js.map +2 -2
  781. package/dist/modules/workflows/lib/compensation-handler.js +4 -2
  782. package/dist/modules/workflows/lib/compensation-handler.js.map +2 -2
  783. package/dist/modules/workflows/lib/edgeFormTransforms.js +3 -1
  784. package/dist/modules/workflows/lib/edgeFormTransforms.js.map +2 -2
  785. package/dist/modules/workflows/lib/event-trigger-service.js +5 -3
  786. package/dist/modules/workflows/lib/event-trigger-service.js.map +2 -2
  787. package/dist/modules/workflows/lib/nodeFormTransforms.js +3 -1
  788. package/dist/modules/workflows/lib/nodeFormTransforms.js.map +2 -2
  789. package/dist/modules/workflows/lib/seeds.js +16 -2
  790. package/dist/modules/workflows/lib/seeds.js.map +2 -2
  791. package/dist/modules/workflows/lib/signal-handler.js +3 -1
  792. package/dist/modules/workflows/lib/signal-handler.js.map +2 -2
  793. package/dist/modules/workflows/lib/start-validator.js +9 -3
  794. package/dist/modules/workflows/lib/start-validator.js.map +2 -2
  795. package/dist/modules/workflows/lib/step-handler.js +3 -1
  796. package/dist/modules/workflows/lib/step-handler.js.map +2 -2
  797. package/dist/modules/workflows/lib/task-handler.js +3 -1
  798. package/dist/modules/workflows/lib/task-handler.js.map +2 -2
  799. package/dist/modules/workflows/lib/transition-handler.js +5 -3
  800. package/dist/modules/workflows/lib/transition-handler.js.map +2 -2
  801. package/dist/modules/workflows/lib/workflow-executor.js +27 -15
  802. package/dist/modules/workflows/lib/workflow-executor.js.map +2 -2
  803. package/dist/modules/workflows/subscribers/event-trigger.js +21 -18
  804. package/dist/modules/workflows/subscribers/event-trigger.js.map +2 -2
  805. package/dist/modules/workflows/subscribers/task-assigned-notification.js +3 -1
  806. package/dist/modules/workflows/subscribers/task-assigned-notification.js.map +2 -2
  807. package/dist/modules/workflows/workers/workflow-activities.worker.js +30 -20
  808. package/dist/modules/workflows/workers/workflow-activities.worker.js.map +2 -2
  809. package/package.json +7 -7
  810. package/src/bootstrap.ts +14 -11
  811. package/src/helpers/integration/queue-runner.ts +2 -2
  812. package/src/modules/api_keys/services/apiKeyService.ts +6 -3
  813. package/src/modules/attachments/api/image/[id]/[[...slug]]/route.ts +5 -2
  814. package/src/modules/attachments/api/library/[id]/route.ts +4 -1
  815. package/src/modules/attachments/api/route.ts +9 -6
  816. package/src/modules/attachments/components/AttachmentPartitionSettings.tsx +6 -3
  817. package/src/modules/attachments/lib/assignmentDetails.ts +4 -1
  818. package/src/modules/attachments/lib/drivers/driverFactory.ts +4 -1
  819. package/src/modules/attachments/lib/ocrQueue.ts +11 -11
  820. package/src/modules/attachments/lib/ocrService.ts +7 -4
  821. package/src/modules/audit_logs/api/audit-logs/actions/redo/route.ts +4 -1
  822. package/src/modules/audit_logs/api/audit-logs/actions/undo/route.ts +4 -1
  823. package/src/modules/audit_logs/backend/audit-logs/page.tsx +4 -1
  824. package/src/modules/audit_logs/components/AuditLogsActions.tsx +5 -2
  825. package/src/modules/audit_logs/services/accessLogService.ts +5 -4
  826. package/src/modules/audit_logs/services/actionLogService.ts +5 -2
  827. package/src/modules/auth/api/profile/route.ts +5 -2
  828. package/src/modules/auth/api/reset/confirm.ts +4 -1
  829. package/src/modules/auth/api/reset.ts +5 -2
  830. package/src/modules/auth/api/roles/route.ts +4 -1
  831. package/src/modules/auth/api/sidebar/variants/route.ts +4 -2
  832. package/src/modules/auth/api/users/resend-invite/route.ts +5 -2
  833. package/src/modules/auth/api/users/route.ts +4 -1
  834. package/src/modules/auth/backend/auth/profile/page.tsx +4 -1
  835. package/src/modules/auth/backend/profile/change-password/page.tsx +4 -1
  836. package/src/modules/auth/backend/users/[id]/edit/page.tsx +6 -3
  837. package/src/modules/auth/backend/users/create/page.tsx +5 -2
  838. package/src/modules/auth/cli.ts +10 -0
  839. package/src/modules/auth/commands/users.ts +5 -2
  840. package/src/modules/auth/lib/consentIntegrity.ts +4 -4
  841. package/src/modules/auth/lib/setup-app.ts +10 -10
  842. package/src/modules/auth/lib/tenantAccess.ts +4 -1
  843. package/src/modules/auth/lib/tokenHash.ts +4 -4
  844. package/src/modules/business_rules/api/rules/route.ts +5 -2
  845. package/src/modules/business_rules/lib/expression-evaluator.ts +8 -6
  846. package/src/modules/business_rules/lib/rule-engine.ts +6 -3
  847. package/src/modules/business_rules/lib/rule-evaluator.ts +11 -11
  848. package/src/modules/business_rules/subscribers/crud-rule-trigger.ts +4 -1
  849. package/src/modules/business_rules/subscribers/rule-execution-failed-notification.ts +4 -1
  850. package/src/modules/catalog/ai-agents-context.ts +5 -5
  851. package/src/modules/catalog/ai-tools/_shared.ts +4 -1
  852. package/src/modules/catalog/ai-tools/authoring-pack.ts +4 -1
  853. package/src/modules/catalog/ai-tools/merchandising-pack.ts +4 -1
  854. package/src/modules/catalog/api/dictionaries/[key]/route.ts +4 -1
  855. package/src/modules/catalog/api/prices/route.ts +4 -1
  856. package/src/modules/catalog/api/products/route.ts +6 -3
  857. package/src/modules/catalog/api/settings/route.ts +5 -2
  858. package/src/modules/catalog/backend/catalog/products/[id]/page.tsx +15 -12
  859. package/src/modules/catalog/backend/catalog/products/[productId]/variants/[variantId]/page.tsx +9 -6
  860. package/src/modules/catalog/backend/catalog/products/[productId]/variants/create/page.tsx +6 -3
  861. package/src/modules/catalog/backend/catalog/products/create/page.tsx +6 -6
  862. package/src/modules/catalog/backend/catalog/products/optionSchemaClient.ts +4 -1
  863. package/src/modules/catalog/components/PriceKindSettings.tsx +6 -3
  864. package/src/modules/catalog/components/UnitPriceDisplaySettings.tsx +5 -2
  865. package/src/modules/catalog/inbox-actions.ts +5 -2
  866. package/src/modules/catalog/seed/examples.ts +5 -5
  867. package/src/modules/catalog/subscribers/low-stock-notification.ts +4 -1
  868. package/src/modules/catalog/widgets/injection/product-seo/state.ts +4 -1
  869. package/src/modules/communication_channels/api/get/oauth/[provider]/callback/route.ts +13 -13
  870. package/src/modules/communication_channels/api/post/channels/[id]/import-history/route.ts +4 -1
  871. package/src/modules/communication_channels/api/post/channels/[id]/push/register/route.ts +4 -1
  872. package/src/modules/communication_channels/api/post/webhook/[provider]/route.ts +6 -3
  873. package/src/modules/communication_channels/api/post/webhooks/gmail/route.ts +7 -6
  874. package/src/modules/communication_channels/commands/connect-credential-channel.ts +5 -10
  875. package/src/modules/communication_channels/commands/delete-channel.ts +4 -5
  876. package/src/modules/communication_channels/commands/deliver-outbound-message.ts +5 -5
  877. package/src/modules/communication_channels/commands/disconnect-channel.ts +4 -5
  878. package/src/modules/communication_channels/commands/ingest-inbound-message.ts +6 -12
  879. package/src/modules/communication_channels/commands/push-unregister.ts +4 -3
  880. package/src/modules/communication_channels/commands/reassign-conversation.ts +6 -3
  881. package/src/modules/communication_channels/lib/dead-letter.ts +4 -5
  882. package/src/modules/communication_channels/lib/email-mime.ts +5 -6
  883. package/src/modules/communication_channels/lib/oauth-client-config.ts +7 -3
  884. package/src/modules/communication_channels/lib/send-as-user.ts +4 -1
  885. package/src/modules/communication_channels/lib/thread-token.ts +5 -2
  886. package/src/modules/communication_channels/setup.ts +4 -4
  887. package/src/modules/communication_channels/workers/channel-import-history.ts +5 -8
  888. package/src/modules/communication_channels/workers/gmail-history-sync.ts +9 -18
  889. package/src/modules/communication_channels/workers/gmail-renew-watch.ts +6 -9
  890. package/src/modules/communication_channels/workers/outbound-delivery.ts +7 -12
  891. package/src/modules/communication_channels/workers/poll-channel.ts +8 -15
  892. package/src/modules/communication_channels/workers/poll-tick.ts +6 -6
  893. package/src/modules/communication_channels/workers/reaction-processor.ts +6 -9
  894. package/src/modules/configs/api/cache/route.ts +5 -2
  895. package/src/modules/configs/api/system-status/route.ts +5 -2
  896. package/src/modules/configs/api/upgrade-actions/route.ts +5 -2
  897. package/src/modules/configs/components/ModuleTelemetryPanel.tsx +4 -1
  898. package/src/modules/configs/lib/touchGeneratedBarrels.ts +1 -1
  899. package/src/modules/configs/services/upgradeActionsService.ts +7 -3
  900. package/src/modules/currencies/components/CurrencyFetchingConfig.tsx +4 -1
  901. package/src/modules/currencies/lib/exchangeRateFormConfig.ts +4 -1
  902. package/src/modules/currencies/services/providers/nbp.ts +7 -4
  903. package/src/modules/currencies/services/providers/raiffeisen.ts +8 -7
  904. package/src/modules/customer_accounts/api/domain-resolve/all.ts +7 -5
  905. package/src/modules/customer_accounts/api/signup.ts +5 -2
  906. package/src/modules/customer_accounts/lib/customerAuthServer.ts +4 -1
  907. package/src/modules/customer_accounts/subscribers/autoLinkCrm.ts +4 -1
  908. package/src/modules/customer_accounts/subscribers/autoLinkCrmReverse.ts +4 -1
  909. package/src/modules/customer_accounts/subscribers/unlinkOnCompanyDelete.ts +4 -1
  910. package/src/modules/customer_accounts/subscribers/unlinkOnPersonDelete.ts +4 -1
  911. package/src/modules/customers/ai-agents-context.ts +5 -5
  912. package/src/modules/customers/api/activities/route.ts +7 -4
  913. package/src/modules/customers/api/comments/route.ts +4 -1
  914. package/src/modules/customers/api/companies/[id]/people/route.ts +4 -1
  915. package/src/modules/customers/api/companies/[id]/route.ts +6 -3
  916. package/src/modules/customers/api/companies/route.ts +6 -3
  917. package/src/modules/customers/api/dashboard/widgets/customer-todos/route.ts +4 -1
  918. package/src/modules/customers/api/dashboard/widgets/new-customers/route.ts +4 -1
  919. package/src/modules/customers/api/dashboard/widgets/new-deals/route.ts +4 -1
  920. package/src/modules/customers/api/dashboard/widgets/next-interactions/route.ts +4 -1
  921. package/src/modules/customers/api/deals/[id]/companies/route.ts +4 -1
  922. package/src/modules/customers/api/deals/[id]/people/route.ts +4 -1
  923. package/src/modules/customers/api/deals/aggregate/route.ts +4 -1
  924. package/src/modules/customers/api/deals/bulk-update-owner/route.ts +8 -5
  925. package/src/modules/customers/api/deals/bulk-update-stage/route.ts +8 -5
  926. package/src/modules/customers/api/deals/route.ts +4 -1
  927. package/src/modules/customers/api/deals/summary/route.ts +4 -1
  928. package/src/modules/customers/api/dictionaries/[kind]/[id]/route.ts +5 -2
  929. package/src/modules/customers/api/dictionaries/[kind]/route.ts +6 -3
  930. package/src/modules/customers/api/dictionaries/cache.ts +4 -1
  931. package/src/modules/customers/api/dictionaries/context.ts +4 -1
  932. package/src/modules/customers/api/dictionaries/currency/route.ts +4 -1
  933. package/src/modules/customers/api/dictionaries/kind-settings/route.ts +5 -2
  934. package/src/modules/customers/api/entity-roles-factory.ts +8 -5
  935. package/src/modules/customers/api/interactions/cancel/route.ts +4 -1
  936. package/src/modules/customers/api/interactions/complete/route.ts +4 -1
  937. package/src/modules/customers/api/interactions/conflicts/route.ts +4 -1
  938. package/src/modules/customers/api/interactions/counts/route.ts +4 -1
  939. package/src/modules/customers/api/interactions/route.ts +8 -4
  940. package/src/modules/customers/api/interactions/tasks/route.ts +4 -1
  941. package/src/modules/customers/api/labels/assign/route.ts +4 -1
  942. package/src/modules/customers/api/labels/route.ts +7 -3
  943. package/src/modules/customers/api/labels/unassign/route.ts +4 -1
  944. package/src/modules/customers/api/people/[id]/companies/enriched/route.ts +4 -1
  945. package/src/modules/customers/api/people/[id]/route.ts +6 -3
  946. package/src/modules/customers/api/people/route.ts +6 -3
  947. package/src/modules/customers/api/pipeline-stages/reorder/route.ts +4 -1
  948. package/src/modules/customers/api/pipeline-stages/route.ts +7 -4
  949. package/src/modules/customers/api/pipelines/route.ts +7 -4
  950. package/src/modules/customers/api/settings/address-format/route.ts +5 -2
  951. package/src/modules/customers/api/settings/dictionary-sort-modes/route.ts +5 -2
  952. package/src/modules/customers/api/settings/stuck-threshold/route.ts +5 -2
  953. package/src/modules/customers/api/tags/assign/route.ts +4 -1
  954. package/src/modules/customers/api/tags/unassign/route.ts +4 -1
  955. package/src/modules/customers/api/todos/route.ts +7 -4
  956. package/src/modules/customers/backend/customers/companies-v2/[id]/page.tsx +6 -3
  957. package/src/modules/customers/backend/customers/deals/[id]/hooks/useDealActivities.ts +4 -1
  958. package/src/modules/customers/backend/customers/deals/[id]/hooks/useDealClosure.ts +4 -1
  959. package/src/modules/customers/backend/customers/deals/map/components/DealsMapCanvasImpl.tsx +5 -3
  960. package/src/modules/customers/backend/customers/deals/page.tsx +5 -2
  961. package/src/modules/customers/backend/customers/people-v2/[id]/page.tsx +6 -3
  962. package/src/modules/customers/commands/deals.ts +4 -1
  963. package/src/modules/customers/commands/dictionaries.ts +4 -1
  964. package/src/modules/customers/commands/interactions.ts +5 -2
  965. package/src/modules/customers/commands/shared.ts +5 -2
  966. package/src/modules/customers/commands/todos.ts +4 -1
  967. package/src/modules/customers/components/DictionarySettings.tsx +6 -3
  968. package/src/modules/customers/components/DictionarySortSettings.tsx +4 -1
  969. package/src/modules/customers/components/detail/ActivitiesCard.tsx +4 -1
  970. package/src/modules/customers/components/detail/ActivitiesDayStrip.tsx +4 -1
  971. package/src/modules/customers/components/detail/ActivitiesSection.tsx +7 -4
  972. package/src/modules/customers/components/detail/ActivityCard.tsx +4 -1
  973. package/src/modules/customers/components/detail/ChangelogTab.tsx +4 -1
  974. package/src/modules/customers/components/detail/CompanyCard.tsx +4 -1
  975. package/src/modules/customers/components/detail/ConfirmDealLostDialog.tsx +4 -1
  976. package/src/modules/customers/components/detail/EntityTagsDialog.tsx +4 -1
  977. package/src/modules/customers/components/detail/InlineActivityComposer.tsx +4 -1
  978. package/src/modules/customers/components/detail/ManageTagsDialog.tsx +4 -1
  979. package/src/modules/customers/components/detail/RoleAssignmentRow.tsx +6 -3
  980. package/src/modules/customers/components/detail/RolesSection.tsx +5 -2
  981. package/src/modules/customers/components/detail/hooks/useInteractionMutations.ts +6 -3
  982. package/src/modules/customers/components/linking/LinkEntityDialog.tsx +5 -2
  983. package/src/modules/customers/inbox-actions.ts +4 -1
  984. package/src/modules/customers/lib/bulkDeals.ts +4 -1
  985. package/src/modules/customers/lib/dealClosureNotification.ts +5 -2
  986. package/src/modules/customers/lib/dealStageTransitionTable.ts +4 -1
  987. package/src/modules/customers/lib/interactionFeatureFlags.ts +5 -1
  988. package/src/modules/customers/lib/todoCompatibility.ts +4 -1
  989. package/src/modules/customers/search.ts +15 -7
  990. package/src/modules/customers/widgets/dashboard/customer-todos/widget.client.tsx +4 -1
  991. package/src/modules/customers/widgets/dashboard/new-customers/widget.client.tsx +4 -1
  992. package/src/modules/customers/widgets/dashboard/new-deals/widget.client.tsx +4 -1
  993. package/src/modules/customers/widgets/dashboard/next-interactions/widget.client.tsx +4 -1
  994. package/src/modules/dashboards/api/widgets/data/batch/route.ts +4 -1
  995. package/src/modules/dashboards/api/widgets/data/route.ts +4 -1
  996. package/src/modules/dashboards/components/WidgetVisibilityEditor.tsx +6 -3
  997. package/src/modules/dashboards/widgets/dashboard/aov-kpi/widget.client.tsx +4 -1
  998. package/src/modules/dashboards/widgets/dashboard/new-customers-kpi/widget.client.tsx +4 -1
  999. package/src/modules/dashboards/widgets/dashboard/orders-by-status/widget.client.tsx +4 -1
  1000. package/src/modules/dashboards/widgets/dashboard/orders-kpi/widget.client.tsx +4 -1
  1001. package/src/modules/dashboards/widgets/dashboard/pipeline-summary/widget.client.tsx +4 -1
  1002. package/src/modules/dashboards/widgets/dashboard/revenue-kpi/widget.client.tsx +4 -1
  1003. package/src/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.tsx +4 -1
  1004. package/src/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.tsx +4 -1
  1005. package/src/modules/dashboards/widgets/dashboard/top-customers/widget.client.tsx +4 -1
  1006. package/src/modules/dashboards/widgets/dashboard/top-products/widget.client.tsx +4 -1
  1007. package/src/modules/data_sync/api/run.ts +4 -1
  1008. package/src/modules/data_sync/backend/data-sync/runs/[id]/page.tsx +3 -1
  1009. package/src/modules/data_sync/lib/adapter-registry.ts +16 -4
  1010. package/src/modules/data_sync/lib/sync-engine.ts +31 -2
  1011. package/src/modules/data_sync/workers/sync-export.ts +4 -1
  1012. package/src/modules/data_sync/workers/sync-import.ts +4 -1
  1013. package/src/modules/dictionaries/api/[dictionaryId]/entries/[entryId]/route.ts +5 -2
  1014. package/src/modules/dictionaries/api/[dictionaryId]/entries/reorder/route.ts +4 -1
  1015. package/src/modules/dictionaries/api/[dictionaryId]/entries/route.ts +5 -2
  1016. package/src/modules/dictionaries/api/[dictionaryId]/entries/set-default/route.ts +4 -1
  1017. package/src/modules/dictionaries/api/[dictionaryId]/route.ts +6 -3
  1018. package/src/modules/dictionaries/api/context.ts +4 -1
  1019. package/src/modules/dictionaries/api/route.ts +5 -2
  1020. package/src/modules/dictionaries/components/DictionariesManager.tsx +6 -3
  1021. package/src/modules/dictionaries/components/DictionaryEntriesEditor.tsx +5 -2
  1022. package/src/modules/dictionaries/components/DictionaryEntrySelect.tsx +5 -2
  1023. package/src/modules/dictionaries/components/DictionarySelectControl.tsx +4 -1
  1024. package/src/modules/dictionaries/fields/dictionary.tsx +4 -1
  1025. package/src/modules/directory/api/organization-branding/route.ts +4 -1
  1026. package/src/modules/directory/api/organization-switcher/route.ts +4 -1
  1027. package/src/modules/directory/commands/tenants.ts +6 -3
  1028. package/src/modules/directory/utils/organizationScope.ts +7 -4
  1029. package/src/modules/entities/api/definitions.cache.ts +4 -1
  1030. package/src/modules/entities/api/definitions.ts +8 -5
  1031. package/src/modules/entities/api/records.ts +5 -2
  1032. package/src/modules/entities/components/EncryptionManager.tsx +4 -1
  1033. package/src/modules/entities/lib/makeActivityRoute.ts +4 -1
  1034. package/src/modules/feature_toggles/api/overrides/route.ts +4 -1
  1035. package/src/modules/feature_toggles/lib/feature-flag-check.ts +6 -9
  1036. package/src/modules/inbox_ops/api/emails/[id]/reprocess/route.ts +5 -2
  1037. package/src/modules/inbox_ops/api/emails/[id]/route.ts +5 -2
  1038. package/src/modules/inbox_ops/api/emails/route.ts +4 -1
  1039. package/src/modules/inbox_ops/api/extract/route.ts +4 -1
  1040. package/src/modules/inbox_ops/api/proposals/[id]/actions/[actionId]/route.ts +4 -1
  1041. package/src/modules/inbox_ops/api/proposals/[id]/replies/[replyId]/send/route.ts +5 -2
  1042. package/src/modules/inbox_ops/api/proposals/counts/route.ts +5 -2
  1043. package/src/modules/inbox_ops/api/proposals/route.ts +4 -1
  1044. package/src/modules/inbox_ops/api/routeHelpers.ts +4 -1
  1045. package/src/modules/inbox_ops/api/settings/route.ts +4 -1
  1046. package/src/modules/inbox_ops/api/webhook/inbound.ts +8 -5
  1047. package/src/modules/inbox_ops/lib/cache.ts +5 -2
  1048. package/src/modules/inbox_ops/lib/catalogLookup.ts +4 -1
  1049. package/src/modules/inbox_ops/lib/eventBus.ts +4 -4
  1050. package/src/modules/inbox_ops/lib/messagesIntegration.ts +5 -8
  1051. package/src/modules/inbox_ops/subscribers/executionAuditor.ts +5 -1
  1052. package/src/modules/inbox_ops/subscribers/extractionWorker.ts +11 -8
  1053. package/src/modules/inbox_ops/subscribers/proposalNotifier.ts +4 -1
  1054. package/src/modules/messages/api/[id]/route.ts +4 -4
  1055. package/src/modules/messages/commands/actions.ts +4 -1
  1056. package/src/modules/messages/components/MessagesInboxPageClient.tsx +4 -1
  1057. package/src/modules/messages/lib/email-sender.ts +4 -7
  1058. package/src/modules/messages/lib/message-objects-registry.ts +4 -1
  1059. package/src/modules/messages/lib/message-types-registry.ts +4 -1
  1060. package/src/modules/messages/workers/send-email.worker.ts +7 -4
  1061. package/src/modules/notifications/lib/notificationMapper.ts +4 -4
  1062. package/src/modules/notifications/lib/notificationService.ts +4 -5
  1063. package/src/modules/notifications/subscribers/deliver-notification.ts +9 -14
  1064. package/src/modules/payment_gateways/api/webhook/[provider]/route.ts +4 -1
  1065. package/src/modules/perspectives/services/perspectiveService.ts +4 -3
  1066. package/src/modules/planner/api/access.ts +4 -3
  1067. package/src/modules/planner/api/availability-date-specific.ts +4 -1
  1068. package/src/modules/planner/api/availability-weekly.ts +4 -1
  1069. package/src/modules/planner/backend/planner/availability-rulesets/page.tsx +5 -2
  1070. package/src/modules/planner/components/AvailabilityRulesEditor.tsx +4 -1
  1071. package/src/modules/progress/api/jobs/route.ts +4 -1
  1072. package/src/modules/query_index/components/QueryIndexesTable.tsx +6 -3
  1073. package/src/modules/query_index/lib/batch.ts +5 -2
  1074. package/src/modules/query_index/lib/coverage.ts +4 -1
  1075. package/src/modules/query_index/lib/engine.ts +14 -17
  1076. package/src/modules/query_index/lib/reindexer.ts +9 -6
  1077. package/src/modules/query_index/lib/search-tokens.ts +4 -2
  1078. package/src/modules/query_index/subscribers/coverage_refresh.ts +4 -1
  1079. package/src/modules/resources/api/comments.ts +4 -1
  1080. package/src/modules/resources/api/resources/tags/assign/route.ts +4 -1
  1081. package/src/modules/resources/api/resources/tags/unassign/route.ts +4 -1
  1082. package/src/modules/resources/backend/resources/resource-types/[id]/edit/page.tsx +4 -1
  1083. package/src/modules/resources/backend/resources/resource-types/page.tsx +5 -2
  1084. package/src/modules/resources/commands/activities.ts +5 -4
  1085. package/src/modules/resources/commands/comments.ts +6 -4
  1086. package/src/modules/resources/commands/shared.ts +36 -0
  1087. package/src/modules/sales/api/channels/route.ts +4 -1
  1088. package/src/modules/sales/api/document-history/route.ts +4 -1
  1089. package/src/modules/sales/api/document-numbers/route.ts +4 -1
  1090. package/src/modules/sales/api/quotes/accept/route.ts +5 -2
  1091. package/src/modules/sales/api/quotes/convert/route.ts +4 -1
  1092. package/src/modules/sales/api/quotes/public/[token]/route.ts +4 -1
  1093. package/src/modules/sales/api/quotes/send/route.ts +4 -1
  1094. package/src/modules/sales/api/returns/[id]/route.ts +4 -1
  1095. package/src/modules/sales/api/settings/document-numbers/route.ts +5 -2
  1096. package/src/modules/sales/api/settings/order-editing/route.ts +5 -2
  1097. package/src/modules/sales/backend/sales/channels/[channelId]/edit/page.tsx +4 -1
  1098. package/src/modules/sales/backend/sales/channels/offers/page.tsx +7 -4
  1099. package/src/modules/sales/backend/sales/channels/page.tsx +5 -2
  1100. package/src/modules/sales/backend/sales/documents/[id]/page.tsx +21 -18
  1101. package/src/modules/sales/commands/documents.ts +5 -8
  1102. package/src/modules/sales/commands/payments.ts +4 -1
  1103. package/src/modules/sales/commands/shipments.ts +4 -2
  1104. package/src/modules/sales/components/AdjustmentKindSettings.tsx +6 -3
  1105. package/src/modules/sales/components/DocumentNumberSettings.tsx +5 -2
  1106. package/src/modules/sales/components/OrderEditingSettings.tsx +5 -2
  1107. package/src/modules/sales/components/PaymentMethodsSettings.tsx +6 -3
  1108. package/src/modules/sales/components/ShippingMethodsSettings.tsx +6 -3
  1109. package/src/modules/sales/components/StatusSettings.tsx +6 -3
  1110. package/src/modules/sales/components/TaxRatesSettings.tsx +6 -3
  1111. package/src/modules/sales/components/channels/ChannelOfferForm.tsx +17 -14
  1112. package/src/modules/sales/components/channels/SalesChannelOffersPanel.tsx +5 -2
  1113. package/src/modules/sales/components/documents/AddressesSection.tsx +6 -3
  1114. package/src/modules/sales/components/documents/AdjustmentDialog.tsx +4 -1
  1115. package/src/modules/sales/components/documents/AdjustmentsSection.tsx +6 -3
  1116. package/src/modules/sales/components/documents/ItemsSection.tsx +7 -4
  1117. package/src/modules/sales/components/documents/LineItemDialog.tsx +9 -6
  1118. package/src/modules/sales/components/documents/PaymentDialog.tsx +6 -3
  1119. package/src/modules/sales/components/documents/PaymentsSection.tsx +5 -2
  1120. package/src/modules/sales/components/documents/SalesDocumentForm.tsx +15 -12
  1121. package/src/modules/sales/components/documents/SalesDocumentsTable.tsx +6 -3
  1122. package/src/modules/sales/components/documents/ShipmentDialog.tsx +10 -7
  1123. package/src/modules/sales/components/documents/ShipmentsSection.tsx +5 -2
  1124. package/src/modules/sales/frontend/quote/[token]/page.tsx +5 -2
  1125. package/src/modules/sales/seed/examples.ts +8 -9
  1126. package/src/modules/sales/subscribers/quote-expiring-notification.ts +4 -1
  1127. package/src/modules/sales/subscribers/reconcileOnAddressDelete.ts +4 -1
  1128. package/src/modules/sales/subscribers/reconcileOnCompanyDelete.ts +4 -1
  1129. package/src/modules/sales/subscribers/reconcileOnCustomerDelete.ts +4 -1
  1130. package/src/modules/sales/widgets/dashboard/makeDashboardWidgetRoute.ts +6 -3
  1131. package/src/modules/sales/widgets/dashboard/new-orders/widget.client.tsx +274 -271
  1132. package/src/modules/sales/widgets/dashboard/new-quotes/widget.client.tsx +280 -277
  1133. package/src/modules/shipping_carriers/api/tracking/route.ts +5 -1
  1134. package/src/modules/shipping_carriers/api/webhook/[provider]/route.ts +4 -1
  1135. package/src/modules/shipping_carriers/lib/shipping-service.ts +47 -22
  1136. package/src/modules/shipping_carriers/lib/upstream-error-response.ts +4 -1
  1137. package/src/modules/shipping_carriers/workers/webhook-processor.ts +4 -5
  1138. package/src/modules/staff/api/comments.ts +4 -1
  1139. package/src/modules/staff/api/leave-requests/accept/route.ts +4 -1
  1140. package/src/modules/staff/api/leave-requests/reject/route.ts +4 -1
  1141. package/src/modules/staff/api/team-members/assignable/route.ts +4 -1
  1142. package/src/modules/staff/api/team-members/self/route.ts +5 -2
  1143. package/src/modules/staff/api/team-members/tags/assign/route.ts +4 -1
  1144. package/src/modules/staff/api/team-members/tags/unassign/route.ts +4 -1
  1145. package/src/modules/staff/api/timesheets/my-projects/[projectId]/route.ts +4 -1
  1146. package/src/modules/staff/api/timesheets/my-projects/route.ts +4 -1
  1147. package/src/modules/staff/api/timesheets/projects/kpis/route.ts +4 -1
  1148. package/src/modules/staff/api/timesheets/time-entries/[id]/segments/route.ts +4 -1
  1149. package/src/modules/staff/api/timesheets/time-entries/[id]/timer-start/route.ts +5 -2
  1150. package/src/modules/staff/api/timesheets/time-entries/[id]/timer-stop/route.ts +5 -2
  1151. package/src/modules/staff/api/timesheets/time-entries/bulk/route.ts +4 -1
  1152. package/src/modules/staff/api/timesheets/time-entries/start-timer/route.ts +4 -1
  1153. package/src/modules/staff/backend/staff/team-members/page.tsx +5 -2
  1154. package/src/modules/staff/backend/staff/team-roles/page.tsx +5 -2
  1155. package/src/modules/staff/backend/staff/teams/[id]/edit/page.tsx +5 -2
  1156. package/src/modules/staff/backend/staff/teams/page.tsx +5 -2
  1157. package/src/modules/staff/backend/staff/timesheets/page.tsx +8 -5
  1158. package/src/modules/staff/backend/staff/timesheets/projects/[id]/page.tsx +4 -1
  1159. package/src/modules/staff/backend/staff/timesheets/projects/page.tsx +5 -2
  1160. package/src/modules/staff/commands/timesheets-entries.ts +4 -1
  1161. package/src/modules/staff/widgets/dashboard/timesheets-hours-by-project/widget.client.tsx +4 -1
  1162. package/src/modules/staff/widgets/dashboard/timesheets-time-reporting/widget.client.tsx +6 -3
  1163. package/src/modules/sync_excel/api/import/route.ts +4 -1
  1164. package/src/modules/translations/api/[entityType]/[entityId]/route.ts +6 -3
  1165. package/src/modules/translations/api/get/locales.ts +4 -1
  1166. package/src/modules/translations/api/put/locales.ts +4 -1
  1167. package/src/modules/translations/components/TranslationManager.tsx +4 -1
  1168. package/src/modules/translations/subscribers/cleanup.ts +4 -1
  1169. package/src/modules/workflows/api/definitions/[id]/customize/route.ts +5 -2
  1170. package/src/modules/workflows/api/definitions/[id]/reset-to-code/route.ts +5 -2
  1171. package/src/modules/workflows/api/definitions/[id]/route.ts +7 -4
  1172. package/src/modules/workflows/api/definitions/route.ts +5 -2
  1173. package/src/modules/workflows/api/events/[id]/route.ts +4 -1
  1174. package/src/modules/workflows/api/events/route.ts +4 -1
  1175. package/src/modules/workflows/api/instances/[id]/advance/route.ts +4 -1
  1176. package/src/modules/workflows/api/instances/[id]/cancel/route.ts +4 -1
  1177. package/src/modules/workflows/api/instances/[id]/events/route.ts +4 -1
  1178. package/src/modules/workflows/api/instances/[id]/retry/route.ts +4 -1
  1179. package/src/modules/workflows/api/instances/[id]/route.ts +4 -1
  1180. package/src/modules/workflows/api/instances/[id]/signal/route.ts +6 -7
  1181. package/src/modules/workflows/api/instances/route.ts +6 -3
  1182. package/src/modules/workflows/api/instances/validate-start/route.ts +4 -1
  1183. package/src/modules/workflows/api/signals/route.ts +4 -1
  1184. package/src/modules/workflows/api/tasks/[id]/claim/route.ts +4 -1
  1185. package/src/modules/workflows/api/tasks/[id]/complete/route.ts +4 -1
  1186. package/src/modules/workflows/api/tasks/[id]/route.ts +4 -1
  1187. package/src/modules/workflows/api/tasks/route.ts +4 -1
  1188. package/src/modules/workflows/backend/definitions/visual-editor/page.tsx +5 -2
  1189. package/src/modules/workflows/backend/instances/[id]/page.tsx +6 -3
  1190. package/src/modules/workflows/backend/tasks/[id]/page.tsx +4 -1
  1191. package/src/modules/workflows/components/BusinessRulesSelector.tsx +6 -3
  1192. package/src/modules/workflows/components/WorkflowSelector.tsx +6 -3
  1193. package/src/modules/workflows/components/fields/BusinessRuleConditionsEditor.tsx +4 -1
  1194. package/src/modules/workflows/components/fields/StartPreConditionsEditor.tsx +4 -1
  1195. package/src/modules/workflows/components/fields/WorkflowSelectorField.tsx +4 -1
  1196. package/src/modules/workflows/frontend/checkout-demo/page.tsx +9 -7
  1197. package/src/modules/workflows/lib/activity-executor.ts +26 -21
  1198. package/src/modules/workflows/lib/activity-worker-handler.ts +9 -15
  1199. package/src/modules/workflows/lib/code-registry.ts +8 -7
  1200. package/src/modules/workflows/lib/compensation-handler.ts +5 -2
  1201. package/src/modules/workflows/lib/edgeFormTransforms.ts +4 -1
  1202. package/src/modules/workflows/lib/event-trigger-service.ts +6 -3
  1203. package/src/modules/workflows/lib/nodeFormTransforms.ts +4 -1
  1204. package/src/modules/workflows/lib/seeds.ts +17 -2
  1205. package/src/modules/workflows/lib/signal-handler.ts +4 -1
  1206. package/src/modules/workflows/lib/start-validator.ts +10 -3
  1207. package/src/modules/workflows/lib/step-handler.ts +4 -1
  1208. package/src/modules/workflows/lib/task-handler.ts +4 -1
  1209. package/src/modules/workflows/lib/transition-handler.ts +6 -3
  1210. package/src/modules/workflows/lib/workflow-executor.ts +28 -15
  1211. package/src/modules/workflows/subscribers/event-trigger.ts +22 -24
  1212. package/src/modules/workflows/subscribers/task-assigned-notification.ts +4 -1
  1213. package/src/modules/workflows/workers/workflow-activities.worker.ts +31 -20
@@ -1,6 +1,8 @@
1
1
  import { WorkflowEvent } from "../data/entities.js";
2
2
  import { executeActivity } from "./activity-executor.js";
3
3
  import { logWorkflowEvent } from "./event-logger.js";
4
+ import { createLogger } from "@open-mercato/shared/lib/logger";
5
+ const logger = createLogger("workflows");
4
6
  async function compensateWorkflow(em, container, instance, definition, options = {}) {
5
7
  const {
6
8
  maxCompensations,
@@ -38,7 +40,7 @@ async function compensateWorkflow(em, container, instance, definition, options =
38
40
  const activityName = event.eventData.activityName;
39
41
  const activityDef = findActivityInDefinition(definition, activityId);
40
42
  if (!activityDef) {
41
- console.warn(`Activity ${activityId} not found in definition, skipping compensation`);
43
+ logger.warn("Activity not found in definition, skipping compensation", { activityId });
42
44
  continue;
43
45
  }
44
46
  if (!activityDef.compensation?.activityId) {
@@ -47,7 +49,7 @@ async function compensateWorkflow(em, container, instance, definition, options =
47
49
  const compensationActivityId = activityDef.compensation.activityId;
48
50
  const compensationDef = findActivityInDefinition(definition, compensationActivityId);
49
51
  if (!compensationDef) {
50
- console.warn(`Compensation activity ${compensationActivityId} not found, skipping`);
52
+ logger.warn("Compensation activity not found, skipping", { compensationActivityId });
51
53
  result.failedCompensations.push(activityId);
52
54
  continue;
53
55
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/workflows/lib/compensation-handler.ts"],
4
- "sourcesContent": ["import { EntityManager } from '@mikro-orm/core'\nimport type { AwilixContainer } from 'awilix'\nimport { WorkflowInstance, WorkflowDefinition, WorkflowEvent } from '../data/entities'\nimport { executeActivity } from './activity-executor'\nimport { logWorkflowEvent } from './event-logger'\n\n/**\n * Compensation Handler - Implements Saga pattern for workflow rollback\n *\n * When a workflow fails, this service executes compensation activities\n * in reverse order to undo changes made by completed activities.\n */\n\nexport interface CompensationOptions {\n /**\n * Maximum number of compensation activities to execute\n * Useful for partial compensation scenarios\n */\n maxCompensations?: number\n\n /**\n * Whether to continue compensating if a compensation activity fails\n * Default: true (continue with best effort)\n */\n continueOnError?: boolean\n\n /**\n * User ID initiating compensation\n */\n userId?: string\n}\n\nexport interface CompensationResult {\n status: 'COMPLETED' | 'FAILED' | 'PARTIAL'\n totalActivities: number\n compensatedActivities: number\n failedCompensations: string[]\n errors?: string[]\n}\n\n/**\n * Execute compensation for a failed workflow\n * Reverses completed activities in LIFO order\n */\nexport async function compensateWorkflow(\n em: EntityManager,\n container: AwilixContainer,\n instance: WorkflowInstance,\n definition: WorkflowDefinition,\n options: CompensationOptions = {}\n): Promise<CompensationResult> {\n const {\n maxCompensations,\n continueOnError = true,\n userId\n } = options\n\n // Update workflow status to COMPENSATING\n instance.status = 'COMPENSATING'\n await em.flush()\n\n await logWorkflowEvent(em, {\n workflowInstanceId: instance.id,\n eventType: 'COMPENSATION_STARTED',\n eventData: {\n reason: instance.errorMessage,\n maxCompensations,\n continueOnError\n },\n userId,\n tenantId: instance.tenantId,\n organizationId: instance.organizationId\n })\n\n // Get all ACTIVITY_COMPLETED events in reverse chronological order\n const completedActivities = await getCompletedActivitiesForCompensation(\n em,\n instance.id\n )\n\n // Limit compensation count if specified\n const activitiesToCompensate = maxCompensations\n ? completedActivities.slice(0, maxCompensations)\n : completedActivities\n\n const result: CompensationResult = {\n status: 'COMPLETED',\n totalActivities: completedActivities.length,\n compensatedActivities: 0,\n failedCompensations: [],\n errors: []\n }\n\n // Execute compensation activities in reverse order (LIFO)\n for (const event of activitiesToCompensate) {\n const activityId = event.eventData.activityId\n const activityName = event.eventData.activityName\n\n // Find activity definition\n const activityDef = findActivityInDefinition(definition, activityId)\n\n if (!activityDef) {\n console.warn(`Activity ${activityId} not found in definition, skipping compensation`)\n continue\n }\n\n // Check if activity has compensation defined\n if (!activityDef.compensation?.activityId) {\n continue\n }\n\n // Find compensation activity definition\n const compensationActivityId = activityDef.compensation.activityId\n const compensationDef = findActivityInDefinition(definition, compensationActivityId)\n\n if (!compensationDef) {\n console.warn(`Compensation activity ${compensationActivityId} not found, skipping`)\n result.failedCompensations.push(activityId)\n continue\n }\n\n // Execute compensation activity\n try {\n await logWorkflowEvent(em, {\n workflowInstanceId: instance.id,\n eventType: 'COMPENSATION_ACTIVITY_STARTED',\n eventData: {\n originalActivityId: activityId,\n compensationActivityId,\n compensationActivityName: compensationDef.activityName\n },\n userId,\n tenantId: instance.tenantId,\n organizationId: instance.organizationId\n })\n\n const compensationResult = await executeActivity(em, container, compensationDef, {\n workflowInstance: instance,\n workflowContext: instance.context,\n userId\n })\n\n if (compensationResult.success) {\n result.compensatedActivities++\n\n await logWorkflowEvent(em, {\n workflowInstanceId: instance.id,\n eventType: 'COMPENSATION_ACTIVITY_COMPLETED',\n eventData: {\n originalActivityId: activityId,\n compensationActivityId,\n output: compensationResult.output,\n executionTimeMs: compensationResult.executionTimeMs\n },\n userId,\n tenantId: instance.tenantId,\n organizationId: instance.organizationId\n })\n } else {\n result.failedCompensations.push(activityId)\n result.errors?.push(`Failed to compensate ${activityName}: ${compensationResult.error}`)\n\n await logWorkflowEvent(em, {\n workflowInstanceId: instance.id,\n eventType: 'COMPENSATION_ACTIVITY_FAILED',\n eventData: {\n originalActivityId: activityId,\n compensationActivityId,\n error: compensationResult.error\n },\n userId,\n tenantId: instance.tenantId,\n organizationId: instance.organizationId\n })\n\n if (!continueOnError) {\n result.status = 'FAILED'\n break\n }\n }\n } catch (error: any) {\n result.failedCompensations.push(activityId)\n result.errors?.push(`Exception compensating ${activityName}: ${error.message}`)\n\n await logWorkflowEvent(em, {\n workflowInstanceId: instance.id,\n eventType: 'COMPENSATION_ACTIVITY_FAILED',\n eventData: {\n originalActivityId: activityId,\n compensationActivityId,\n error: error.message\n },\n userId,\n tenantId: instance.tenantId,\n organizationId: instance.organizationId\n })\n\n if (!continueOnError) {\n result.status = 'FAILED'\n break\n }\n }\n }\n\n // Determine final status\n if (result.failedCompensations.length > 0) {\n result.status = result.compensatedActivities > 0 ? 'PARTIAL' : 'FAILED'\n }\n\n // Update workflow instance status\n instance.status = result.status === 'COMPLETED' ? 'COMPENSATED' : 'FAILED'\n await em.flush()\n\n await logWorkflowEvent(em, {\n workflowInstanceId: instance.id,\n eventType: result.status === 'COMPLETED'\n ? 'COMPENSATION_COMPLETED'\n : result.status === 'PARTIAL'\n ? 'COMPENSATION_PARTIAL'\n : 'COMPENSATION_FAILED',\n eventData: {\n totalActivities: result.totalActivities,\n compensatedActivities: result.compensatedActivities,\n failedCompensations: result.failedCompensations,\n errors: result.errors\n },\n userId,\n tenantId: instance.tenantId,\n organizationId: instance.organizationId\n })\n\n return result\n}\n\n/**\n * Get completed activities that need compensation, in reverse order (LIFO)\n */\nasync function getCompletedActivitiesForCompensation(\n em: EntityManager,\n workflowInstanceId: string\n): Promise<WorkflowEvent[]> {\n const events = await em.find(WorkflowEvent, {\n workflowInstanceId,\n eventType: 'ACTIVITY_COMPLETED'\n }, {\n orderBy: { occurredAt: 'DESC' } // Reverse chronological order\n })\n\n return events\n}\n\n/**\n * Find activity definition in workflow definition\n * Activities can be in transitions or at definition root (legacy)\n */\nfunction findActivityInDefinition(\n definition: WorkflowDefinition,\n activityId: string\n): any | undefined {\n // Check activities in transitions (new structure)\n for (const transition of definition.definition.transitions) {\n if (transition.activities) {\n const activity = transition.activities.find((a: any) => a.activityId === activityId)\n if (activity) return activity\n }\n }\n\n // Check root-level activities (legacy structure)\n if (definition.definition.activities) {\n return definition.definition.activities.find((a: any) => a.activityId === activityId)\n }\n\n return undefined\n}\n\n/**\n * Check if an activity should be compensated based on its configuration\n */\nexport function shouldCompensateActivity(activityDef: any): boolean {\n return !!(activityDef.compensation?.activityId)\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { EntityManager } from '@mikro-orm/core'\nimport type { AwilixContainer } from 'awilix'\nimport { WorkflowInstance, WorkflowDefinition, WorkflowEvent } from '../data/entities'\nimport { executeActivity } from './activity-executor'\nimport { logWorkflowEvent } from './event-logger'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\n\nconst logger = createLogger('workflows')\n\n/**\n * Compensation Handler - Implements Saga pattern for workflow rollback\n *\n * When a workflow fails, this service executes compensation activities\n * in reverse order to undo changes made by completed activities.\n */\n\nexport interface CompensationOptions {\n /**\n * Maximum number of compensation activities to execute\n * Useful for partial compensation scenarios\n */\n maxCompensations?: number\n\n /**\n * Whether to continue compensating if a compensation activity fails\n * Default: true (continue with best effort)\n */\n continueOnError?: boolean\n\n /**\n * User ID initiating compensation\n */\n userId?: string\n}\n\nexport interface CompensationResult {\n status: 'COMPLETED' | 'FAILED' | 'PARTIAL'\n totalActivities: number\n compensatedActivities: number\n failedCompensations: string[]\n errors?: string[]\n}\n\n/**\n * Execute compensation for a failed workflow\n * Reverses completed activities in LIFO order\n */\nexport async function compensateWorkflow(\n em: EntityManager,\n container: AwilixContainer,\n instance: WorkflowInstance,\n definition: WorkflowDefinition,\n options: CompensationOptions = {}\n): Promise<CompensationResult> {\n const {\n maxCompensations,\n continueOnError = true,\n userId\n } = options\n\n // Update workflow status to COMPENSATING\n instance.status = 'COMPENSATING'\n await em.flush()\n\n await logWorkflowEvent(em, {\n workflowInstanceId: instance.id,\n eventType: 'COMPENSATION_STARTED',\n eventData: {\n reason: instance.errorMessage,\n maxCompensations,\n continueOnError\n },\n userId,\n tenantId: instance.tenantId,\n organizationId: instance.organizationId\n })\n\n // Get all ACTIVITY_COMPLETED events in reverse chronological order\n const completedActivities = await getCompletedActivitiesForCompensation(\n em,\n instance.id\n )\n\n // Limit compensation count if specified\n const activitiesToCompensate = maxCompensations\n ? completedActivities.slice(0, maxCompensations)\n : completedActivities\n\n const result: CompensationResult = {\n status: 'COMPLETED',\n totalActivities: completedActivities.length,\n compensatedActivities: 0,\n failedCompensations: [],\n errors: []\n }\n\n // Execute compensation activities in reverse order (LIFO)\n for (const event of activitiesToCompensate) {\n const activityId = event.eventData.activityId\n const activityName = event.eventData.activityName\n\n // Find activity definition\n const activityDef = findActivityInDefinition(definition, activityId)\n\n if (!activityDef) {\n logger.warn('Activity not found in definition, skipping compensation', { activityId })\n continue\n }\n\n // Check if activity has compensation defined\n if (!activityDef.compensation?.activityId) {\n continue\n }\n\n // Find compensation activity definition\n const compensationActivityId = activityDef.compensation.activityId\n const compensationDef = findActivityInDefinition(definition, compensationActivityId)\n\n if (!compensationDef) {\n logger.warn('Compensation activity not found, skipping', { compensationActivityId })\n result.failedCompensations.push(activityId)\n continue\n }\n\n // Execute compensation activity\n try {\n await logWorkflowEvent(em, {\n workflowInstanceId: instance.id,\n eventType: 'COMPENSATION_ACTIVITY_STARTED',\n eventData: {\n originalActivityId: activityId,\n compensationActivityId,\n compensationActivityName: compensationDef.activityName\n },\n userId,\n tenantId: instance.tenantId,\n organizationId: instance.organizationId\n })\n\n const compensationResult = await executeActivity(em, container, compensationDef, {\n workflowInstance: instance,\n workflowContext: instance.context,\n userId\n })\n\n if (compensationResult.success) {\n result.compensatedActivities++\n\n await logWorkflowEvent(em, {\n workflowInstanceId: instance.id,\n eventType: 'COMPENSATION_ACTIVITY_COMPLETED',\n eventData: {\n originalActivityId: activityId,\n compensationActivityId,\n output: compensationResult.output,\n executionTimeMs: compensationResult.executionTimeMs\n },\n userId,\n tenantId: instance.tenantId,\n organizationId: instance.organizationId\n })\n } else {\n result.failedCompensations.push(activityId)\n result.errors?.push(`Failed to compensate ${activityName}: ${compensationResult.error}`)\n\n await logWorkflowEvent(em, {\n workflowInstanceId: instance.id,\n eventType: 'COMPENSATION_ACTIVITY_FAILED',\n eventData: {\n originalActivityId: activityId,\n compensationActivityId,\n error: compensationResult.error\n },\n userId,\n tenantId: instance.tenantId,\n organizationId: instance.organizationId\n })\n\n if (!continueOnError) {\n result.status = 'FAILED'\n break\n }\n }\n } catch (error: any) {\n result.failedCompensations.push(activityId)\n result.errors?.push(`Exception compensating ${activityName}: ${error.message}`)\n\n await logWorkflowEvent(em, {\n workflowInstanceId: instance.id,\n eventType: 'COMPENSATION_ACTIVITY_FAILED',\n eventData: {\n originalActivityId: activityId,\n compensationActivityId,\n error: error.message\n },\n userId,\n tenantId: instance.tenantId,\n organizationId: instance.organizationId\n })\n\n if (!continueOnError) {\n result.status = 'FAILED'\n break\n }\n }\n }\n\n // Determine final status\n if (result.failedCompensations.length > 0) {\n result.status = result.compensatedActivities > 0 ? 'PARTIAL' : 'FAILED'\n }\n\n // Update workflow instance status\n instance.status = result.status === 'COMPLETED' ? 'COMPENSATED' : 'FAILED'\n await em.flush()\n\n await logWorkflowEvent(em, {\n workflowInstanceId: instance.id,\n eventType: result.status === 'COMPLETED'\n ? 'COMPENSATION_COMPLETED'\n : result.status === 'PARTIAL'\n ? 'COMPENSATION_PARTIAL'\n : 'COMPENSATION_FAILED',\n eventData: {\n totalActivities: result.totalActivities,\n compensatedActivities: result.compensatedActivities,\n failedCompensations: result.failedCompensations,\n errors: result.errors\n },\n userId,\n tenantId: instance.tenantId,\n organizationId: instance.organizationId\n })\n\n return result\n}\n\n/**\n * Get completed activities that need compensation, in reverse order (LIFO)\n */\nasync function getCompletedActivitiesForCompensation(\n em: EntityManager,\n workflowInstanceId: string\n): Promise<WorkflowEvent[]> {\n const events = await em.find(WorkflowEvent, {\n workflowInstanceId,\n eventType: 'ACTIVITY_COMPLETED'\n }, {\n orderBy: { occurredAt: 'DESC' } // Reverse chronological order\n })\n\n return events\n}\n\n/**\n * Find activity definition in workflow definition\n * Activities can be in transitions or at definition root (legacy)\n */\nfunction findActivityInDefinition(\n definition: WorkflowDefinition,\n activityId: string\n): any | undefined {\n // Check activities in transitions (new structure)\n for (const transition of definition.definition.transitions) {\n if (transition.activities) {\n const activity = transition.activities.find((a: any) => a.activityId === activityId)\n if (activity) return activity\n }\n }\n\n // Check root-level activities (legacy structure)\n if (definition.definition.activities) {\n return definition.definition.activities.find((a: any) => a.activityId === activityId)\n }\n\n return undefined\n}\n\n/**\n * Check if an activity should be compensated based on its configuration\n */\nexport function shouldCompensateActivity(activityDef: any): boolean {\n return !!(activityDef.compensation?.activityId)\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,3 +1,5 @@
1
+ import { createLogger } from "@open-mercato/shared/lib/logger";
2
+ const logger = createLogger("workflows");
1
3
  function generateNameFromId(edgeId) {
2
4
  return edgeId.split("_to_").map((part) => part.split("_").map(
3
5
  (word) => word.charAt(0).toUpperCase() + word.slice(1)
@@ -52,7 +54,7 @@ function formValuesToEdgeUpdates(values, edge) {
52
54
  const parsed = JSON.parse(values.advancedConfig);
53
55
  Object.assign(updates, parsed);
54
56
  } catch (error) {
55
- console.error("Invalid JSON in Advanced Configuration:", error);
57
+ logger.error("Invalid JSON in Advanced Configuration", { err: error });
56
58
  throw new Error("Invalid JSON in Advanced Configuration. Please check your syntax.");
57
59
  }
58
60
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/workflows/lib/edgeFormTransforms.ts"],
4
- "sourcesContent": ["/**\n * Edge Form Transforms\n *\n * Utilities to convert between React Flow edge data structures and CrudForm field values.\n * Handles bidirectional transformation for transitions/edges with proper type safety.\n */\n\nimport type { Edge } from '@xyflow/react'\nimport type { Activity } from '../components/fields/ActivityArrayEditor'\nimport type { TransitionCondition } from '../components/fields/BusinessRuleConditionsEditor'\n\n/**\n * Normalized condition format (object only, no string)\n */\nexport interface NormalizedCondition {\n ruleId: string\n required: boolean\n}\n\n/**\n * Form values interface matching CrudForm field structure\n */\nexport interface EdgeFormValues {\n transitionName: string\n trigger: string\n priority: string // Number as string in form\n continueOnActivityFailure: boolean\n preConditions: NormalizedCondition[]\n postConditions: NormalizedCondition[]\n activities: Activity[]\n advancedConfig?: string\n}\n\n/**\n * Generate a readable name from edge ID\n * Example: \"start_to_cart\" -> \"Start \u2192 Cart\"\n */\nfunction generateNameFromId(edgeId: string): string {\n return edgeId\n .split('_to_')\n .map(part => part.split('_').map(word =>\n word.charAt(0).toUpperCase() + word.slice(1)\n ).join(' '))\n .join(' \u2192 ')\n}\n\n/**\n * Normalize legacy string format to object format\n */\nexport function normalizeCondition(raw: string | TransitionCondition): NormalizedCondition {\n if (typeof raw === 'string') {\n return { ruleId: raw, required: true }\n }\n return raw as NormalizedCondition\n}\n\n/**\n * Normalize array of conditions (handles both string and object formats)\n */\nexport function normalizeConditions(raw: any[]): NormalizedCondition[] {\n if (!Array.isArray(raw)) return []\n return raw.map(normalizeCondition)\n}\n\n/**\n * Convert Edge data to CrudForm values\n */\nexport function edgeToFormValues(edge: Edge): EdgeFormValues {\n const edgeData = edge.data as any\n\n // Try to get transition name from various sources\n let transitionName = ''\n if (edgeData?.transitionName && edgeData.transitionName !== '') {\n transitionName = edgeData.transitionName\n } else if (edgeData?.label && edgeData.label !== '' && edgeData.label !== undefined) {\n transitionName = edgeData.label\n } else {\n // Generate a name from the edge ID as fallback\n transitionName = generateNameFromId(edge.id)\n }\n\n return {\n transitionName,\n trigger: edgeData?.trigger || 'auto',\n priority: (edgeData?.priority || 100).toString(),\n continueOnActivityFailure: edgeData?.continueOnActivityFailure !== undefined\n ? edgeData.continueOnActivityFailure\n : false,\n preConditions: normalizeConditions(edgeData?.preConditions || []),\n postConditions: normalizeConditions(edgeData?.postConditions || []),\n activities: edgeData?.activities || [],\n advancedConfig: '', // Advanced config is empty initially (can be populated from edgeData if needed)\n }\n}\n\n/**\n * Convert CrudForm values back to Edge data updates\n *\n * Returns partial edge data to be merged with existing edge data.\n */\nexport function formValuesToEdgeUpdates(\n values: EdgeFormValues,\n edge: Edge\n): Partial<Edge['data']> {\n const updates: Partial<Edge['data']> = {\n transitionName: values.transitionName,\n label: values.transitionName, // Keep label for backward compatibility\n trigger: values.trigger,\n priority: parseInt(values.priority) || 100,\n continueOnActivityFailure: values.continueOnActivityFailure,\n preConditions: values.preConditions.length > 0 ? values.preConditions : undefined,\n postConditions: values.postConditions.length > 0 ? values.postConditions : undefined,\n activities: values.activities.length > 0 ? values.activities : undefined,\n }\n\n // Parse advanced config (JSON) and merge\n if (values.advancedConfig && values.advancedConfig.trim()) {\n try {\n const parsed = JSON.parse(values.advancedConfig)\n Object.assign(updates, parsed)\n } catch (error) {\n console.error('Invalid JSON in Advanced Configuration:', error)\n throw new Error('Invalid JSON in Advanced Configuration. Please check your syntax.')\n }\n }\n\n return updates\n}\n\n/**\n * Get excluded rule IDs for business rule selector\n * (to avoid selecting the same rule twice)\n */\nexport function getExcludedPreConditionRuleIds(values: EdgeFormValues): string[] {\n return values.preConditions.map(c => {\n const normalized = normalizeCondition(c)\n return normalized.ruleId\n })\n}\n\n/**\n * Get excluded rule IDs for business rule selector\n * (to avoid selecting the same rule twice)\n */\nexport function getExcludedPostConditionRuleIds(values: EdgeFormValues): string[] {\n return values.postConditions.map(c => {\n const normalized = normalizeCondition(c)\n return normalized.ruleId\n })\n}\n"],
5
- "mappings": "AAqCA,SAAS,mBAAmB,QAAwB;AAClD,SAAO,OACJ,MAAM,MAAM,EACZ,IAAI,UAAQ,KAAK,MAAM,GAAG,EAAE;AAAA,IAAI,UAC/B,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC;AAAA,EAC7C,EAAE,KAAK,GAAG,CAAC,EACV,KAAK,UAAK;AACf;AAKO,SAAS,mBAAmB,KAAwD;AACzF,MAAI,OAAO,QAAQ,UAAU;AAC3B,WAAO,EAAE,QAAQ,KAAK,UAAU,KAAK;AAAA,EACvC;AACA,SAAO;AACT;AAKO,SAAS,oBAAoB,KAAmC;AACrE,MAAI,CAAC,MAAM,QAAQ,GAAG,EAAG,QAAO,CAAC;AACjC,SAAO,IAAI,IAAI,kBAAkB;AACnC;AAKO,SAAS,iBAAiB,MAA4B;AAC3D,QAAM,WAAW,KAAK;AAGtB,MAAI,iBAAiB;AACrB,MAAI,UAAU,kBAAkB,SAAS,mBAAmB,IAAI;AAC9D,qBAAiB,SAAS;AAAA,EAC5B,WAAW,UAAU,SAAS,SAAS,UAAU,MAAM,SAAS,UAAU,QAAW;AACnF,qBAAiB,SAAS;AAAA,EAC5B,OAAO;AAEL,qBAAiB,mBAAmB,KAAK,EAAE;AAAA,EAC7C;AAEA,SAAO;AAAA,IACL;AAAA,IACA,SAAS,UAAU,WAAW;AAAA,IAC9B,WAAW,UAAU,YAAY,KAAK,SAAS;AAAA,IAC/C,2BAA2B,UAAU,8BAA8B,SAC/D,SAAS,4BACT;AAAA,IACJ,eAAe,oBAAoB,UAAU,iBAAiB,CAAC,CAAC;AAAA,IAChE,gBAAgB,oBAAoB,UAAU,kBAAkB,CAAC,CAAC;AAAA,IAClE,YAAY,UAAU,cAAc,CAAC;AAAA,IACrC,gBAAgB;AAAA;AAAA,EAClB;AACF;AAOO,SAAS,wBACd,QACA,MACuB;AACvB,QAAM,UAAiC;AAAA,IACrC,gBAAgB,OAAO;AAAA,IACvB,OAAO,OAAO;AAAA;AAAA,IACd,SAAS,OAAO;AAAA,IAChB,UAAU,SAAS,OAAO,QAAQ,KAAK;AAAA,IACvC,2BAA2B,OAAO;AAAA,IAClC,eAAe,OAAO,cAAc,SAAS,IAAI,OAAO,gBAAgB;AAAA,IACxE,gBAAgB,OAAO,eAAe,SAAS,IAAI,OAAO,iBAAiB;AAAA,IAC3E,YAAY,OAAO,WAAW,SAAS,IAAI,OAAO,aAAa;AAAA,EACjE;AAGA,MAAI,OAAO,kBAAkB,OAAO,eAAe,KAAK,GAAG;AACzD,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,OAAO,cAAc;AAC/C,aAAO,OAAO,SAAS,MAAM;AAAA,IAC/B,SAAS,OAAO;AACd,cAAQ,MAAM,2CAA2C,KAAK;AAC9D,YAAM,IAAI,MAAM,mEAAmE;AAAA,IACrF;AAAA,EACF;AAEA,SAAO;AACT;AAMO,SAAS,+BAA+B,QAAkC;AAC/E,SAAO,OAAO,cAAc,IAAI,OAAK;AACnC,UAAM,aAAa,mBAAmB,CAAC;AACvC,WAAO,WAAW;AAAA,EACpB,CAAC;AACH;AAMO,SAAS,gCAAgC,QAAkC;AAChF,SAAO,OAAO,eAAe,IAAI,OAAK;AACpC,UAAM,aAAa,mBAAmB,CAAC;AACvC,WAAO,WAAW;AAAA,EACpB,CAAC;AACH;",
4
+ "sourcesContent": ["/**\n * Edge Form Transforms\n *\n * Utilities to convert between React Flow edge data structures and CrudForm field values.\n * Handles bidirectional transformation for transitions/edges with proper type safety.\n */\n\nimport type { Edge } from '@xyflow/react'\nimport type { Activity } from '../components/fields/ActivityArrayEditor'\nimport type { TransitionCondition } from '../components/fields/BusinessRuleConditionsEditor'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\n\nconst logger = createLogger('workflows')\n\n/**\n * Normalized condition format (object only, no string)\n */\nexport interface NormalizedCondition {\n ruleId: string\n required: boolean\n}\n\n/**\n * Form values interface matching CrudForm field structure\n */\nexport interface EdgeFormValues {\n transitionName: string\n trigger: string\n priority: string // Number as string in form\n continueOnActivityFailure: boolean\n preConditions: NormalizedCondition[]\n postConditions: NormalizedCondition[]\n activities: Activity[]\n advancedConfig?: string\n}\n\n/**\n * Generate a readable name from edge ID\n * Example: \"start_to_cart\" -> \"Start \u2192 Cart\"\n */\nfunction generateNameFromId(edgeId: string): string {\n return edgeId\n .split('_to_')\n .map(part => part.split('_').map(word =>\n word.charAt(0).toUpperCase() + word.slice(1)\n ).join(' '))\n .join(' \u2192 ')\n}\n\n/**\n * Normalize legacy string format to object format\n */\nexport function normalizeCondition(raw: string | TransitionCondition): NormalizedCondition {\n if (typeof raw === 'string') {\n return { ruleId: raw, required: true }\n }\n return raw as NormalizedCondition\n}\n\n/**\n * Normalize array of conditions (handles both string and object formats)\n */\nexport function normalizeConditions(raw: any[]): NormalizedCondition[] {\n if (!Array.isArray(raw)) return []\n return raw.map(normalizeCondition)\n}\n\n/**\n * Convert Edge data to CrudForm values\n */\nexport function edgeToFormValues(edge: Edge): EdgeFormValues {\n const edgeData = edge.data as any\n\n // Try to get transition name from various sources\n let transitionName = ''\n if (edgeData?.transitionName && edgeData.transitionName !== '') {\n transitionName = edgeData.transitionName\n } else if (edgeData?.label && edgeData.label !== '' && edgeData.label !== undefined) {\n transitionName = edgeData.label\n } else {\n // Generate a name from the edge ID as fallback\n transitionName = generateNameFromId(edge.id)\n }\n\n return {\n transitionName,\n trigger: edgeData?.trigger || 'auto',\n priority: (edgeData?.priority || 100).toString(),\n continueOnActivityFailure: edgeData?.continueOnActivityFailure !== undefined\n ? edgeData.continueOnActivityFailure\n : false,\n preConditions: normalizeConditions(edgeData?.preConditions || []),\n postConditions: normalizeConditions(edgeData?.postConditions || []),\n activities: edgeData?.activities || [],\n advancedConfig: '', // Advanced config is empty initially (can be populated from edgeData if needed)\n }\n}\n\n/**\n * Convert CrudForm values back to Edge data updates\n *\n * Returns partial edge data to be merged with existing edge data.\n */\nexport function formValuesToEdgeUpdates(\n values: EdgeFormValues,\n edge: Edge\n): Partial<Edge['data']> {\n const updates: Partial<Edge['data']> = {\n transitionName: values.transitionName,\n label: values.transitionName, // Keep label for backward compatibility\n trigger: values.trigger,\n priority: parseInt(values.priority) || 100,\n continueOnActivityFailure: values.continueOnActivityFailure,\n preConditions: values.preConditions.length > 0 ? values.preConditions : undefined,\n postConditions: values.postConditions.length > 0 ? values.postConditions : undefined,\n activities: values.activities.length > 0 ? values.activities : undefined,\n }\n\n // Parse advanced config (JSON) and merge\n if (values.advancedConfig && values.advancedConfig.trim()) {\n try {\n const parsed = JSON.parse(values.advancedConfig)\n Object.assign(updates, parsed)\n } catch (error) {\n logger.error('Invalid JSON in Advanced Configuration', { err: error })\n throw new Error('Invalid JSON in Advanced Configuration. Please check your syntax.')\n }\n }\n\n return updates\n}\n\n/**\n * Get excluded rule IDs for business rule selector\n * (to avoid selecting the same rule twice)\n */\nexport function getExcludedPreConditionRuleIds(values: EdgeFormValues): string[] {\n return values.preConditions.map(c => {\n const normalized = normalizeCondition(c)\n return normalized.ruleId\n })\n}\n\n/**\n * Get excluded rule IDs for business rule selector\n * (to avoid selecting the same rule twice)\n */\nexport function getExcludedPostConditionRuleIds(values: EdgeFormValues): string[] {\n return values.postConditions.map(c => {\n const normalized = normalizeCondition(c)\n return normalized.ruleId\n })\n}\n"],
5
+ "mappings": "AAUA,SAAS,oBAAoB;AAE7B,MAAM,SAAS,aAAa,WAAW;AA4BvC,SAAS,mBAAmB,QAAwB;AAClD,SAAO,OACJ,MAAM,MAAM,EACZ,IAAI,UAAQ,KAAK,MAAM,GAAG,EAAE;AAAA,IAAI,UAC/B,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC;AAAA,EAC7C,EAAE,KAAK,GAAG,CAAC,EACV,KAAK,UAAK;AACf;AAKO,SAAS,mBAAmB,KAAwD;AACzF,MAAI,OAAO,QAAQ,UAAU;AAC3B,WAAO,EAAE,QAAQ,KAAK,UAAU,KAAK;AAAA,EACvC;AACA,SAAO;AACT;AAKO,SAAS,oBAAoB,KAAmC;AACrE,MAAI,CAAC,MAAM,QAAQ,GAAG,EAAG,QAAO,CAAC;AACjC,SAAO,IAAI,IAAI,kBAAkB;AACnC;AAKO,SAAS,iBAAiB,MAA4B;AAC3D,QAAM,WAAW,KAAK;AAGtB,MAAI,iBAAiB;AACrB,MAAI,UAAU,kBAAkB,SAAS,mBAAmB,IAAI;AAC9D,qBAAiB,SAAS;AAAA,EAC5B,WAAW,UAAU,SAAS,SAAS,UAAU,MAAM,SAAS,UAAU,QAAW;AACnF,qBAAiB,SAAS;AAAA,EAC5B,OAAO;AAEL,qBAAiB,mBAAmB,KAAK,EAAE;AAAA,EAC7C;AAEA,SAAO;AAAA,IACL;AAAA,IACA,SAAS,UAAU,WAAW;AAAA,IAC9B,WAAW,UAAU,YAAY,KAAK,SAAS;AAAA,IAC/C,2BAA2B,UAAU,8BAA8B,SAC/D,SAAS,4BACT;AAAA,IACJ,eAAe,oBAAoB,UAAU,iBAAiB,CAAC,CAAC;AAAA,IAChE,gBAAgB,oBAAoB,UAAU,kBAAkB,CAAC,CAAC;AAAA,IAClE,YAAY,UAAU,cAAc,CAAC;AAAA,IACrC,gBAAgB;AAAA;AAAA,EAClB;AACF;AAOO,SAAS,wBACd,QACA,MACuB;AACvB,QAAM,UAAiC;AAAA,IACrC,gBAAgB,OAAO;AAAA,IACvB,OAAO,OAAO;AAAA;AAAA,IACd,SAAS,OAAO;AAAA,IAChB,UAAU,SAAS,OAAO,QAAQ,KAAK;AAAA,IACvC,2BAA2B,OAAO;AAAA,IAClC,eAAe,OAAO,cAAc,SAAS,IAAI,OAAO,gBAAgB;AAAA,IACxE,gBAAgB,OAAO,eAAe,SAAS,IAAI,OAAO,iBAAiB;AAAA,IAC3E,YAAY,OAAO,WAAW,SAAS,IAAI,OAAO,aAAa;AAAA,EACjE;AAGA,MAAI,OAAO,kBAAkB,OAAO,eAAe,KAAK,GAAG;AACzD,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,OAAO,cAAc;AAC/C,aAAO,OAAO,SAAS,MAAM;AAAA,IAC/B,SAAS,OAAO;AACd,aAAO,MAAM,0CAA0C,EAAE,KAAK,MAAM,CAAC;AACrE,YAAM,IAAI,MAAM,mEAAmE;AAAA,IACrF;AAAA,EACF;AAEA,SAAO;AACT;AAMO,SAAS,+BAA+B,QAAkC;AAC/E,SAAO,OAAO,cAAc,IAAI,OAAK;AACnC,UAAM,aAAa,mBAAmB,CAAC;AACvC,WAAO,WAAW;AAAA,EACpB,CAAC;AACH;AAMO,SAAS,gCAAgC,QAAkC;AAChF,SAAO,OAAO,eAAe,IAAI,OAAK;AACpC,UAAM,aAAa,mBAAmB,CAAC;AACvC,WAAO,WAAW;AAAA,EACpB,CAAC;AACH;",
6
6
  "names": []
7
7
  }
@@ -7,6 +7,8 @@ import {
7
7
  WorkflowInstance
8
8
  } from "../data/entities.js";
9
9
  import { startWorkflow, executeWorkflow } from "./workflow-executor.js";
10
+ import { createLogger } from "@open-mercato/shared/lib/logger";
11
+ const logger = createLogger("workflows").child({ component: "event-trigger" });
10
12
  const TRIGGER_CACHE_TTL = 5 * 60 * 1e3;
11
13
  const MAX_WORKFLOW_REGEX_PATTERN_LENGTH = 200;
12
14
  const MAX_WORKFLOW_REGEX_INPUT_LENGTH = 1e4;
@@ -336,7 +338,7 @@ async function processEventTriggers(em, container, context) {
336
338
  try {
337
339
  const canStart = await checkConcurrencyLimit(em, trigger);
338
340
  if (!canStart) {
339
- console.log(`[workflow-trigger] Skipping trigger "${trigger.name}": max concurrent instances reached`);
341
+ logger.debug("Skipping trigger: max concurrent instances reached", { triggerId: trigger.id, triggerName: trigger.name });
340
342
  result.skipped++;
341
343
  continue;
342
344
  }
@@ -382,11 +384,11 @@ async function processEventTriggers(em, container, context) {
382
384
  instanceId: instance.id
383
385
  });
384
386
  executeWorkflow(em.fork(), container, instance.id).catch((err) => {
385
- console.error(`[workflow-trigger] Error executing workflow ${instance.id}:`, err);
387
+ logger.error("Error executing workflow", { instanceId: instance.id, err });
386
388
  });
387
389
  } catch (error) {
388
390
  const errorMessage = error instanceof Error ? error.message : String(error);
389
- console.error(`[workflow-trigger] Error processing trigger "${trigger.name}":`, error);
391
+ logger.error("Error processing trigger", { triggerId: trigger.id, triggerName: trigger.name, err: error });
390
392
  result.errors.push({
391
393
  triggerId: trigger.id,
392
394
  error: errorMessage
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/workflows/lib/event-trigger-service.ts"],
4
- "sourcesContent": ["/**\n * Workflows Module - Event Trigger Service\n *\n * Core service for evaluating and processing workflow event triggers.\n * Handles pattern matching, filter evaluation, context mapping, and workflow starting.\n */\n\nimport type { EntityManager } from '@mikro-orm/core'\nimport type { EntityManager as PostgreSqlEntityManager } from '@mikro-orm/postgresql'\nimport type { AwilixContainer } from 'awilix'\nimport type { CacheService } from '@open-mercato/cache'\nimport { matchEventPattern } from '@open-mercato/shared/lib/events/patterns'\nimport { findWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { testLinearRegex } from '@open-mercato/shared/lib/regex/linear'\nimport {\n WorkflowEventTrigger,\n WorkflowDefinition,\n WorkflowInstance,\n type TriggerFilterCondition,\n type TriggerContextMapping,\n type WorkflowEventTriggerConfig,\n type WorkflowDefinitionTrigger,\n} from '../data/entities'\nimport { startWorkflow, executeWorkflow } from './workflow-executor'\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface EventTriggerContext {\n eventName: string\n payload: Record<string, unknown>\n tenantId: string\n organizationId: string\n}\n\nexport interface ProcessTriggersResult {\n triggered: number\n skipped: number\n errors: Array<{ triggerId: string; error: string }>\n instances: Array<{ triggerId: string; instanceId: string }>\n}\n\n/**\n * Unified trigger interface for both legacy (entity) and embedded (definition) triggers\n */\nexport interface UnifiedTrigger {\n id: string // For legacy: entity ID, for embedded: `${definitionId}:${triggerId}`\n triggerId: string\n name: string\n description?: string | null\n eventPattern: string\n config: WorkflowEventTriggerConfig | null\n enabled: boolean\n priority: number\n workflowDefinitionId: string\n workflowId: string\n workflowVersion: number\n source: 'legacy' | 'embedded'\n tenantId: string\n organizationId: string\n}\n\ninterface CachedTriggers {\n triggers: UnifiedTrigger[]\n cachedAt: number\n}\n\n// Cache TTL: 5 minutes\nconst TRIGGER_CACHE_TTL = 5 * 60 * 1000\n\n// ============================================================================\n// Pattern Matching\n// ============================================================================\n\n// ============================================================================\n// Filter Evaluation\n// ============================================================================\n\nconst MAX_WORKFLOW_REGEX_PATTERN_LENGTH = 200\nconst MAX_WORKFLOW_REGEX_INPUT_LENGTH = 10_000\n\n/**\n * Get a nested value from an object using dot notation.\n */\nfunction getNestedValue(obj: unknown, path: string): unknown {\n if (obj === null || obj === undefined) return undefined\n\n const parts = path.split('.')\n let current: unknown = obj\n\n for (const part of parts) {\n if (current === null || current === undefined) return undefined\n if (typeof current !== 'object') return undefined\n current = (current as Record<string, unknown>)[part]\n }\n\n return current\n}\n\nfunction getQuantifierEnd(pattern: string, index: number): number | null {\n const char = pattern[index]\n if (char === '*' || char === '+' || char === '?') return index\n if (char !== '{') return null\n\n const closeIndex = pattern.indexOf('}', index + 1)\n if (closeIndex === -1) return null\n\n const body = pattern.slice(index + 1, closeIndex)\n return /^[0-9]+(?:,[0-9]*)?$/.test(body) ? closeIndex : null\n}\n\ninterface RegexGroupFrame {\n hasAlternation: boolean\n hasQuantifier: boolean\n}\n\nfunction isSafeWorkflowRegexPattern(pattern: string): boolean {\n if (pattern.length > MAX_WORKFLOW_REGEX_PATTERN_LENGTH) return false\n\n const groupStack: RegexGroupFrame[] = [{ hasAlternation: false, hasQuantifier: false }]\n let inCharClass = false\n let lastClosedGroup: RegexGroupFrame | null = null\n let lastAtomWasQuantified = false\n\n // Hand-written single-pass lexer: `index` is intentionally advanced inside the\n // loop body (escape pairs, `(?:` prefixes, multi-char quantifiers, lazy `?`) on\n // top of the `index += 1` update clause. Do not \"simplify\" these in-body writes.\n for (let index = 0; index < pattern.length; index += 1) {\n const char = pattern[index]\n\n if (char === '\\\\') {\n const next = pattern[index + 1]\n if (!inCharClass && (/[1-9]/.test(next ?? '') || (next === 'k' && pattern[index + 2] === '<'))) {\n return false\n }\n index += 1\n lastClosedGroup = null\n lastAtomWasQuantified = false\n continue\n }\n\n if (inCharClass) {\n if (char === ']') {\n inCharClass = false\n lastAtomWasQuantified = false\n }\n lastClosedGroup = null\n continue\n }\n\n if (char === '[') {\n inCharClass = true\n lastClosedGroup = null\n lastAtomWasQuantified = false\n continue\n }\n\n if (char === '(') {\n if (pattern[index + 1] === '?') {\n if (pattern[index + 2] !== ':') return false\n index += 2\n }\n\n groupStack.push({ hasAlternation: false, hasQuantifier: false })\n lastClosedGroup = null\n lastAtomWasQuantified = false\n continue\n }\n\n if (char === ')') {\n if (groupStack.length === 1) return false\n lastClosedGroup = groupStack.pop()!\n lastAtomWasQuantified = false\n continue\n }\n\n if (char === '|') {\n groupStack[groupStack.length - 1].hasAlternation = true\n lastClosedGroup = null\n lastAtomWasQuantified = false\n continue\n }\n\n const quantifierEnd = getQuantifierEnd(pattern, index)\n if (quantifierEnd !== null) {\n if (lastAtomWasQuantified) return false\n if (lastClosedGroup?.hasAlternation || lastClosedGroup?.hasQuantifier) return false\n\n groupStack[groupStack.length - 1].hasQuantifier = true\n lastClosedGroup = null\n lastAtomWasQuantified = true\n index = quantifierEnd\n\n if (pattern[index + 1] === '?') {\n index += 1\n }\n\n continue\n }\n\n lastClosedGroup = null\n lastAtomWasQuantified = false\n }\n\n return groupStack.length === 1 && !inCharClass\n}\n\n/**\n * Evaluate a single filter condition against the event payload.\n */\nfunction evaluateCondition(condition: TriggerFilterCondition, payload: Record<string, unknown>): boolean {\n const value = getNestedValue(payload, condition.field)\n const expected = condition.value\n\n switch (condition.operator) {\n case 'eq':\n return value === expected\n\n case 'neq':\n return value !== expected\n\n case 'gt':\n return typeof value === 'number' && typeof expected === 'number' && value > expected\n\n case 'gte':\n return typeof value === 'number' && typeof expected === 'number' && value >= expected\n\n case 'lt':\n return typeof value === 'number' && typeof expected === 'number' && value < expected\n\n case 'lte':\n return typeof value === 'number' && typeof expected === 'number' && value <= expected\n\n case 'contains':\n if (typeof value === 'string' && typeof expected === 'string') {\n return value.includes(expected)\n }\n if (Array.isArray(value)) {\n return value.includes(expected)\n }\n return false\n\n case 'startsWith':\n return typeof value === 'string' && typeof expected === 'string' && value.startsWith(expected)\n\n case 'endsWith':\n return typeof value === 'string' && typeof expected === 'string' && value.endsWith(expected)\n\n case 'in':\n return Array.isArray(expected) && expected.includes(value)\n\n case 'notIn':\n return Array.isArray(expected) && !expected.includes(value)\n\n case 'exists':\n return value !== undefined && value !== null\n\n case 'notExists':\n return value === undefined || value === null\n\n case 'regex':\n if (typeof value !== 'string' || typeof expected !== 'string') return false\n if (value.length > MAX_WORKFLOW_REGEX_INPUT_LENGTH) return false\n if (!isSafeWorkflowRegexPattern(expected)) return false\n {\n const result = testLinearRegex(expected, value, {\n maxPatternLength: MAX_WORKFLOW_REGEX_PATTERN_LENGTH,\n maxInputLength: MAX_WORKFLOW_REGEX_INPUT_LENGTH,\n })\n return result.ok ? result.matched : false\n }\n\n default:\n return false\n }\n}\n\n/**\n * Evaluate all filter conditions against the event payload.\n * All conditions must pass (AND logic).\n */\nexport function evaluateFilterConditions(\n conditions: TriggerFilterCondition[] | undefined,\n payload: Record<string, unknown>\n): boolean {\n if (!conditions || conditions.length === 0) return true\n\n return conditions.every(condition => evaluateCondition(condition, payload))\n}\n\n// ============================================================================\n// Context Mapping\n// ============================================================================\n\n/**\n * Map event payload to workflow initial context.\n */\nexport function mapEventToContext(\n mapping: TriggerContextMapping[] | undefined,\n payload: Record<string, unknown>\n): Record<string, unknown> {\n const context: Record<string, unknown> = {}\n\n if (!mapping || mapping.length === 0) return context\n\n for (const item of mapping) {\n const value = getNestedValue(payload, item.sourceExpression)\n context[item.targetKey] = value !== undefined ? value : item.defaultValue\n }\n\n return context\n}\n\n// ============================================================================\n// Trigger Loading with Caching\n// ============================================================================\n\n// In-memory cache for triggers (per tenant/org).\n// Park the Map on globalThis so the same compiled module loaded under two\n// paths (a Next.js server chunk vs. a worker resolving the file through a\n// different import root) shares one cache. Without this,\n// `invalidateTriggerCache(...)` called from the PUT /api/workflows/definitions\n// route clears its own copy while the wildcard event-trigger subscriber keeps\n// reading a stale copy populated before the trigger was added \u2014 newly added\n// triggers stay invisible for up to TRIGGER_CACHE_TTL. Mirrors the same\n// workaround used by the modules registry and `getDiRegistrars()`.\nconst GLOBAL_TRIGGER_CACHE_KEY = '__openMercatoWorkflowTriggerCache__'\n\nfunction getTriggerCache(): Map<string, CachedTriggers> {\n const existing = (globalThis as any)[GLOBAL_TRIGGER_CACHE_KEY] as\n | Map<string, CachedTriggers>\n | undefined\n if (existing) return existing\n const created = new Map<string, CachedTriggers>()\n ;(globalThis as any)[GLOBAL_TRIGGER_CACHE_KEY] = created\n return created\n}\n\nfunction getCacheKey(tenantId: string, organizationId: string): string {\n return `${tenantId}:${organizationId}`\n}\n\n/**\n * Load legacy triggers from WorkflowEventTrigger entity table.\n * For backward compatibility with existing triggers.\n */\nasync function loadLegacyTriggers(\n em: EntityManager,\n tenantId: string,\n organizationId: string\n): Promise<UnifiedTrigger[]> {\n const postgresEm = em as unknown as PostgreSqlEntityManager\n const legacyTriggers = await findWithDecryption(\n postgresEm,\n WorkflowEventTrigger,\n {\n tenantId,\n organizationId,\n enabled: true,\n deletedAt: null,\n },\n {\n orderBy: { priority: 'DESC', createdAt: 'ASC' },\n },\n { tenantId, organizationId },\n )\n\n // Get definitions for these triggers to get workflowId\n const definitionIds = [...new Set(legacyTriggers.map(t => t.workflowDefinitionId))]\n const definitions = definitionIds.length > 0 ? await findWithDecryption(postgresEm, WorkflowDefinition, {\n id: { $in: definitionIds },\n tenantId,\n organizationId,\n enabled: true,\n deletedAt: null,\n }, {}, { tenantId, organizationId }) : []\n const definitionMap = new Map(definitions.map(d => [d.id, d]))\n\n return legacyTriggers\n .filter(t => definitionMap.has(t.workflowDefinitionId))\n .map(t => {\n const def = definitionMap.get(t.workflowDefinitionId)!\n return {\n id: t.id,\n triggerId: t.id,\n name: t.name,\n description: t.description,\n eventPattern: t.eventPattern,\n config: t.config ?? null,\n enabled: t.enabled,\n priority: t.priority,\n workflowDefinitionId: t.workflowDefinitionId,\n workflowId: def.workflowId,\n workflowVersion: def.version,\n source: 'legacy' as const,\n tenantId: t.tenantId,\n organizationId: t.organizationId,\n }\n })\n}\n\n/**\n * Load embedded triggers from workflow definitions.\n * New triggers are embedded directly in the definition JSONB.\n */\nasync function loadEmbeddedTriggers(\n em: EntityManager,\n tenantId: string,\n organizationId: string\n): Promise<UnifiedTrigger[]> {\n const postgresEm = em as unknown as PostgreSqlEntityManager\n // Load all enabled definitions that may have triggers\n const definitions = await findWithDecryption(\n postgresEm,\n WorkflowDefinition,\n {\n tenantId,\n organizationId,\n enabled: true,\n deletedAt: null,\n },\n {},\n { tenantId, organizationId },\n )\n\n const triggers: UnifiedTrigger[] = []\n\n for (const def of definitions) {\n const embeddedTriggers = def.definition?.triggers as WorkflowDefinitionTrigger[] | undefined\n if (!embeddedTriggers || embeddedTriggers.length === 0) continue\n\n for (const trigger of embeddedTriggers) {\n if (!trigger.enabled) continue\n\n triggers.push({\n id: `${def.id}:${trigger.triggerId}`,\n triggerId: trigger.triggerId,\n name: trigger.name,\n description: trigger.description ?? null,\n eventPattern: trigger.eventPattern,\n config: trigger.config ?? null,\n enabled: trigger.enabled,\n priority: trigger.priority,\n workflowDefinitionId: def.id,\n workflowId: def.workflowId,\n workflowVersion: def.version,\n source: 'embedded' as const,\n tenantId,\n organizationId,\n })\n }\n }\n\n return triggers\n}\n\n/**\n * Load all enabled triggers for a tenant/organization with caching.\n * Merges both legacy (entity) triggers and embedded (definition) triggers.\n */\nexport async function loadTriggersForTenant(\n em: EntityManager,\n tenantId: string,\n organizationId: string,\n cacheService?: CacheService\n): Promise<UnifiedTrigger[]> {\n const cacheKey = getCacheKey(tenantId, organizationId)\n const cache = getTriggerCache()\n\n // Check in-memory cache\n const cached = cache.get(cacheKey)\n if (cached && Date.now() - cached.cachedAt < TRIGGER_CACHE_TTL) {\n return cached.triggers\n }\n\n // Load from both sources\n const [legacyTriggers, embeddedTriggers] = await Promise.all([\n loadLegacyTriggers(em, tenantId, organizationId),\n loadEmbeddedTriggers(em, tenantId, organizationId),\n ])\n\n // Merge and sort by priority (higher first)\n const allTriggers = [...legacyTriggers, ...embeddedTriggers]\n .sort((a, b) => b.priority - a.priority)\n\n // Update cache\n cache.set(cacheKey, {\n triggers: allTriggers,\n cachedAt: Date.now(),\n })\n\n return allTriggers\n}\n\n/**\n * Invalidate trigger cache for a tenant/organization.\n * Call this when:\n * - Legacy triggers are created/updated/deleted\n * - Workflow definitions with embedded triggers are created/updated/deleted\n */\nexport function invalidateTriggerCache(tenantId: string, organizationId?: string): void {\n const cache = getTriggerCache()\n if (organizationId) {\n // Invalidate specific org\n const cacheKey = getCacheKey(tenantId, organizationId)\n cache.delete(cacheKey)\n } else {\n // Invalidate all orgs for tenant\n for (const key of cache.keys()) {\n if (key.startsWith(`${tenantId}:`)) {\n cache.delete(key)\n }\n }\n }\n}\n\n// ============================================================================\n// Trigger Matching\n// ============================================================================\n\n/**\n * Find all triggers that match an event.\n */\nexport async function findMatchingTriggers(\n em: EntityManager,\n context: EventTriggerContext\n): Promise<UnifiedTrigger[]> {\n const triggers = await loadTriggersForTenant(\n em,\n context.tenantId,\n context.organizationId\n )\n\n return triggers.filter(trigger => {\n // Check event pattern\n if (!matchEventPattern(context.eventName, trigger.eventPattern)) {\n return false\n }\n\n // Check filter conditions\n if (!evaluateFilterConditions(trigger.config?.filterConditions, context.payload)) {\n return false\n }\n\n return true\n })\n}\n\n// ============================================================================\n// Trigger Processing\n// ============================================================================\n\n/**\n * Check if max concurrent instances limit is reached.\n */\nasync function checkConcurrencyLimit(\n em: EntityManager,\n trigger: UnifiedTrigger\n): Promise<boolean> {\n const maxInstances = trigger.config?.maxConcurrentInstances\n\n if (!maxInstances) return true // No limit\n\n // Count running instances for this trigger's workflow definition\n const runningCount = await em.count(WorkflowInstance, {\n definitionId: trigger.workflowDefinitionId,\n status: { $in: ['RUNNING', 'WAITING_FOR_ACTIVITIES'] },\n tenantId: trigger.tenantId,\n organizationId: trigger.organizationId,\n deletedAt: null,\n })\n\n return runningCount < maxInstances\n}\n\n/**\n * Process all matching triggers for an event and start workflows.\n */\nexport async function processEventTriggers(\n em: EntityManager,\n container: AwilixContainer,\n context: EventTriggerContext\n): Promise<ProcessTriggersResult> {\n const result: ProcessTriggersResult = {\n triggered: 0,\n skipped: 0,\n errors: [],\n instances: [],\n }\n\n // Find matching triggers\n const triggers = await findMatchingTriggers(em, context)\n\n if (triggers.length === 0) {\n return result\n }\n\n // Process each trigger (definitions already validated during loading)\n for (const trigger of triggers) {\n try {\n // Check concurrency limit\n const canStart = await checkConcurrencyLimit(em, trigger)\n if (!canStart) {\n console.log(`[workflow-trigger] Skipping trigger \"${trigger.name}\": max concurrent instances reached`)\n result.skipped++\n continue\n }\n\n // Map event payload to workflow context\n const mappedContext = mapEventToContext(trigger.config?.contextMapping, context.payload)\n\n // Extract entity info from payload for metadata\n const payloadId = context.payload?.id as string | undefined\n const payloadEntityType = context.payload?.entityType as string | undefined\n\n // Include event metadata and payload in context\n const initialContext = {\n // Include raw event payload fields (e.g., id, organizationId, tenantId)\n ...context.payload,\n // Override with explicit mappings if provided\n ...mappedContext,\n __trigger: {\n triggerId: trigger.id,\n triggerName: trigger.name,\n eventName: context.eventName,\n eventPayload: context.payload,\n triggeredAt: new Date().toISOString(),\n source: trigger.source,\n },\n }\n\n // Start workflow\n const instance = await startWorkflow(em, {\n workflowId: trigger.workflowId,\n version: trigger.workflowVersion,\n initialContext,\n metadata: {\n initiatedBy: `trigger:${trigger.id}`,\n // Include entityId and entityType for widget discovery\n entityId: payloadId,\n entityType: payloadEntityType || trigger.config?.entityType,\n labels: {\n trigger_id: trigger.id,\n trigger_name: trigger.name,\n event_name: context.eventName,\n trigger_source: trigger.source,\n },\n },\n tenantId: context.tenantId,\n organizationId: context.organizationId,\n })\n\n result.triggered++\n result.instances.push({\n triggerId: trigger.id,\n instanceId: instance.id,\n })\n\n // Execute workflow asynchronously (don't wait)\n executeWorkflow(em.fork(), container, instance.id).catch(err => {\n console.error(`[workflow-trigger] Error executing workflow ${instance.id}:`, err)\n })\n\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n console.error(`[workflow-trigger] Error processing trigger \"${trigger.name}\":`, error)\n result.errors.push({\n triggerId: trigger.id,\n error: errorMessage,\n })\n }\n }\n\n return result\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Workflows Module - Event Trigger Service\n *\n * Core service for evaluating and processing workflow event triggers.\n * Handles pattern matching, filter evaluation, context mapping, and workflow starting.\n */\n\nimport type { EntityManager } from '@mikro-orm/core'\nimport type { EntityManager as PostgreSqlEntityManager } from '@mikro-orm/postgresql'\nimport type { AwilixContainer } from 'awilix'\nimport type { CacheService } from '@open-mercato/cache'\nimport { matchEventPattern } from '@open-mercato/shared/lib/events/patterns'\nimport { findWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { testLinearRegex } from '@open-mercato/shared/lib/regex/linear'\nimport {\n WorkflowEventTrigger,\n WorkflowDefinition,\n WorkflowInstance,\n type TriggerFilterCondition,\n type TriggerContextMapping,\n type WorkflowEventTriggerConfig,\n type WorkflowDefinitionTrigger,\n} from '../data/entities'\nimport { startWorkflow, executeWorkflow } from './workflow-executor'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\n\nconst logger = createLogger('workflows').child({ component: 'event-trigger' })\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface EventTriggerContext {\n eventName: string\n payload: Record<string, unknown>\n tenantId: string\n organizationId: string\n}\n\nexport interface ProcessTriggersResult {\n triggered: number\n skipped: number\n errors: Array<{ triggerId: string; error: string }>\n instances: Array<{ triggerId: string; instanceId: string }>\n}\n\n/**\n * Unified trigger interface for both legacy (entity) and embedded (definition) triggers\n */\nexport interface UnifiedTrigger {\n id: string // For legacy: entity ID, for embedded: `${definitionId}:${triggerId}`\n triggerId: string\n name: string\n description?: string | null\n eventPattern: string\n config: WorkflowEventTriggerConfig | null\n enabled: boolean\n priority: number\n workflowDefinitionId: string\n workflowId: string\n workflowVersion: number\n source: 'legacy' | 'embedded'\n tenantId: string\n organizationId: string\n}\n\ninterface CachedTriggers {\n triggers: UnifiedTrigger[]\n cachedAt: number\n}\n\n// Cache TTL: 5 minutes\nconst TRIGGER_CACHE_TTL = 5 * 60 * 1000\n\n// ============================================================================\n// Pattern Matching\n// ============================================================================\n\n// ============================================================================\n// Filter Evaluation\n// ============================================================================\n\nconst MAX_WORKFLOW_REGEX_PATTERN_LENGTH = 200\nconst MAX_WORKFLOW_REGEX_INPUT_LENGTH = 10_000\n\n/**\n * Get a nested value from an object using dot notation.\n */\nfunction getNestedValue(obj: unknown, path: string): unknown {\n if (obj === null || obj === undefined) return undefined\n\n const parts = path.split('.')\n let current: unknown = obj\n\n for (const part of parts) {\n if (current === null || current === undefined) return undefined\n if (typeof current !== 'object') return undefined\n current = (current as Record<string, unknown>)[part]\n }\n\n return current\n}\n\nfunction getQuantifierEnd(pattern: string, index: number): number | null {\n const char = pattern[index]\n if (char === '*' || char === '+' || char === '?') return index\n if (char !== '{') return null\n\n const closeIndex = pattern.indexOf('}', index + 1)\n if (closeIndex === -1) return null\n\n const body = pattern.slice(index + 1, closeIndex)\n return /^[0-9]+(?:,[0-9]*)?$/.test(body) ? closeIndex : null\n}\n\ninterface RegexGroupFrame {\n hasAlternation: boolean\n hasQuantifier: boolean\n}\n\nfunction isSafeWorkflowRegexPattern(pattern: string): boolean {\n if (pattern.length > MAX_WORKFLOW_REGEX_PATTERN_LENGTH) return false\n\n const groupStack: RegexGroupFrame[] = [{ hasAlternation: false, hasQuantifier: false }]\n let inCharClass = false\n let lastClosedGroup: RegexGroupFrame | null = null\n let lastAtomWasQuantified = false\n\n // Hand-written single-pass lexer: `index` is intentionally advanced inside the\n // loop body (escape pairs, `(?:` prefixes, multi-char quantifiers, lazy `?`) on\n // top of the `index += 1` update clause. Do not \"simplify\" these in-body writes.\n for (let index = 0; index < pattern.length; index += 1) {\n const char = pattern[index]\n\n if (char === '\\\\') {\n const next = pattern[index + 1]\n if (!inCharClass && (/[1-9]/.test(next ?? '') || (next === 'k' && pattern[index + 2] === '<'))) {\n return false\n }\n index += 1\n lastClosedGroup = null\n lastAtomWasQuantified = false\n continue\n }\n\n if (inCharClass) {\n if (char === ']') {\n inCharClass = false\n lastAtomWasQuantified = false\n }\n lastClosedGroup = null\n continue\n }\n\n if (char === '[') {\n inCharClass = true\n lastClosedGroup = null\n lastAtomWasQuantified = false\n continue\n }\n\n if (char === '(') {\n if (pattern[index + 1] === '?') {\n if (pattern[index + 2] !== ':') return false\n index += 2\n }\n\n groupStack.push({ hasAlternation: false, hasQuantifier: false })\n lastClosedGroup = null\n lastAtomWasQuantified = false\n continue\n }\n\n if (char === ')') {\n if (groupStack.length === 1) return false\n lastClosedGroup = groupStack.pop()!\n lastAtomWasQuantified = false\n continue\n }\n\n if (char === '|') {\n groupStack[groupStack.length - 1].hasAlternation = true\n lastClosedGroup = null\n lastAtomWasQuantified = false\n continue\n }\n\n const quantifierEnd = getQuantifierEnd(pattern, index)\n if (quantifierEnd !== null) {\n if (lastAtomWasQuantified) return false\n if (lastClosedGroup?.hasAlternation || lastClosedGroup?.hasQuantifier) return false\n\n groupStack[groupStack.length - 1].hasQuantifier = true\n lastClosedGroup = null\n lastAtomWasQuantified = true\n index = quantifierEnd\n\n if (pattern[index + 1] === '?') {\n index += 1\n }\n\n continue\n }\n\n lastClosedGroup = null\n lastAtomWasQuantified = false\n }\n\n return groupStack.length === 1 && !inCharClass\n}\n\n/**\n * Evaluate a single filter condition against the event payload.\n */\nfunction evaluateCondition(condition: TriggerFilterCondition, payload: Record<string, unknown>): boolean {\n const value = getNestedValue(payload, condition.field)\n const expected = condition.value\n\n switch (condition.operator) {\n case 'eq':\n return value === expected\n\n case 'neq':\n return value !== expected\n\n case 'gt':\n return typeof value === 'number' && typeof expected === 'number' && value > expected\n\n case 'gte':\n return typeof value === 'number' && typeof expected === 'number' && value >= expected\n\n case 'lt':\n return typeof value === 'number' && typeof expected === 'number' && value < expected\n\n case 'lte':\n return typeof value === 'number' && typeof expected === 'number' && value <= expected\n\n case 'contains':\n if (typeof value === 'string' && typeof expected === 'string') {\n return value.includes(expected)\n }\n if (Array.isArray(value)) {\n return value.includes(expected)\n }\n return false\n\n case 'startsWith':\n return typeof value === 'string' && typeof expected === 'string' && value.startsWith(expected)\n\n case 'endsWith':\n return typeof value === 'string' && typeof expected === 'string' && value.endsWith(expected)\n\n case 'in':\n return Array.isArray(expected) && expected.includes(value)\n\n case 'notIn':\n return Array.isArray(expected) && !expected.includes(value)\n\n case 'exists':\n return value !== undefined && value !== null\n\n case 'notExists':\n return value === undefined || value === null\n\n case 'regex':\n if (typeof value !== 'string' || typeof expected !== 'string') return false\n if (value.length > MAX_WORKFLOW_REGEX_INPUT_LENGTH) return false\n if (!isSafeWorkflowRegexPattern(expected)) return false\n {\n const result = testLinearRegex(expected, value, {\n maxPatternLength: MAX_WORKFLOW_REGEX_PATTERN_LENGTH,\n maxInputLength: MAX_WORKFLOW_REGEX_INPUT_LENGTH,\n })\n return result.ok ? result.matched : false\n }\n\n default:\n return false\n }\n}\n\n/**\n * Evaluate all filter conditions against the event payload.\n * All conditions must pass (AND logic).\n */\nexport function evaluateFilterConditions(\n conditions: TriggerFilterCondition[] | undefined,\n payload: Record<string, unknown>\n): boolean {\n if (!conditions || conditions.length === 0) return true\n\n return conditions.every(condition => evaluateCondition(condition, payload))\n}\n\n// ============================================================================\n// Context Mapping\n// ============================================================================\n\n/**\n * Map event payload to workflow initial context.\n */\nexport function mapEventToContext(\n mapping: TriggerContextMapping[] | undefined,\n payload: Record<string, unknown>\n): Record<string, unknown> {\n const context: Record<string, unknown> = {}\n\n if (!mapping || mapping.length === 0) return context\n\n for (const item of mapping) {\n const value = getNestedValue(payload, item.sourceExpression)\n context[item.targetKey] = value !== undefined ? value : item.defaultValue\n }\n\n return context\n}\n\n// ============================================================================\n// Trigger Loading with Caching\n// ============================================================================\n\n// In-memory cache for triggers (per tenant/org).\n// Park the Map on globalThis so the same compiled module loaded under two\n// paths (a Next.js server chunk vs. a worker resolving the file through a\n// different import root) shares one cache. Without this,\n// `invalidateTriggerCache(...)` called from the PUT /api/workflows/definitions\n// route clears its own copy while the wildcard event-trigger subscriber keeps\n// reading a stale copy populated before the trigger was added \u2014 newly added\n// triggers stay invisible for up to TRIGGER_CACHE_TTL. Mirrors the same\n// workaround used by the modules registry and `getDiRegistrars()`.\nconst GLOBAL_TRIGGER_CACHE_KEY = '__openMercatoWorkflowTriggerCache__'\n\nfunction getTriggerCache(): Map<string, CachedTriggers> {\n const existing = (globalThis as any)[GLOBAL_TRIGGER_CACHE_KEY] as\n | Map<string, CachedTriggers>\n | undefined\n if (existing) return existing\n const created = new Map<string, CachedTriggers>()\n ;(globalThis as any)[GLOBAL_TRIGGER_CACHE_KEY] = created\n return created\n}\n\nfunction getCacheKey(tenantId: string, organizationId: string): string {\n return `${tenantId}:${organizationId}`\n}\n\n/**\n * Load legacy triggers from WorkflowEventTrigger entity table.\n * For backward compatibility with existing triggers.\n */\nasync function loadLegacyTriggers(\n em: EntityManager,\n tenantId: string,\n organizationId: string\n): Promise<UnifiedTrigger[]> {\n const postgresEm = em as unknown as PostgreSqlEntityManager\n const legacyTriggers = await findWithDecryption(\n postgresEm,\n WorkflowEventTrigger,\n {\n tenantId,\n organizationId,\n enabled: true,\n deletedAt: null,\n },\n {\n orderBy: { priority: 'DESC', createdAt: 'ASC' },\n },\n { tenantId, organizationId },\n )\n\n // Get definitions for these triggers to get workflowId\n const definitionIds = [...new Set(legacyTriggers.map(t => t.workflowDefinitionId))]\n const definitions = definitionIds.length > 0 ? await findWithDecryption(postgresEm, WorkflowDefinition, {\n id: { $in: definitionIds },\n tenantId,\n organizationId,\n enabled: true,\n deletedAt: null,\n }, {}, { tenantId, organizationId }) : []\n const definitionMap = new Map(definitions.map(d => [d.id, d]))\n\n return legacyTriggers\n .filter(t => definitionMap.has(t.workflowDefinitionId))\n .map(t => {\n const def = definitionMap.get(t.workflowDefinitionId)!\n return {\n id: t.id,\n triggerId: t.id,\n name: t.name,\n description: t.description,\n eventPattern: t.eventPattern,\n config: t.config ?? null,\n enabled: t.enabled,\n priority: t.priority,\n workflowDefinitionId: t.workflowDefinitionId,\n workflowId: def.workflowId,\n workflowVersion: def.version,\n source: 'legacy' as const,\n tenantId: t.tenantId,\n organizationId: t.organizationId,\n }\n })\n}\n\n/**\n * Load embedded triggers from workflow definitions.\n * New triggers are embedded directly in the definition JSONB.\n */\nasync function loadEmbeddedTriggers(\n em: EntityManager,\n tenantId: string,\n organizationId: string\n): Promise<UnifiedTrigger[]> {\n const postgresEm = em as unknown as PostgreSqlEntityManager\n // Load all enabled definitions that may have triggers\n const definitions = await findWithDecryption(\n postgresEm,\n WorkflowDefinition,\n {\n tenantId,\n organizationId,\n enabled: true,\n deletedAt: null,\n },\n {},\n { tenantId, organizationId },\n )\n\n const triggers: UnifiedTrigger[] = []\n\n for (const def of definitions) {\n const embeddedTriggers = def.definition?.triggers as WorkflowDefinitionTrigger[] | undefined\n if (!embeddedTriggers || embeddedTriggers.length === 0) continue\n\n for (const trigger of embeddedTriggers) {\n if (!trigger.enabled) continue\n\n triggers.push({\n id: `${def.id}:${trigger.triggerId}`,\n triggerId: trigger.triggerId,\n name: trigger.name,\n description: trigger.description ?? null,\n eventPattern: trigger.eventPattern,\n config: trigger.config ?? null,\n enabled: trigger.enabled,\n priority: trigger.priority,\n workflowDefinitionId: def.id,\n workflowId: def.workflowId,\n workflowVersion: def.version,\n source: 'embedded' as const,\n tenantId,\n organizationId,\n })\n }\n }\n\n return triggers\n}\n\n/**\n * Load all enabled triggers for a tenant/organization with caching.\n * Merges both legacy (entity) triggers and embedded (definition) triggers.\n */\nexport async function loadTriggersForTenant(\n em: EntityManager,\n tenantId: string,\n organizationId: string,\n cacheService?: CacheService\n): Promise<UnifiedTrigger[]> {\n const cacheKey = getCacheKey(tenantId, organizationId)\n const cache = getTriggerCache()\n\n // Check in-memory cache\n const cached = cache.get(cacheKey)\n if (cached && Date.now() - cached.cachedAt < TRIGGER_CACHE_TTL) {\n return cached.triggers\n }\n\n // Load from both sources\n const [legacyTriggers, embeddedTriggers] = await Promise.all([\n loadLegacyTriggers(em, tenantId, organizationId),\n loadEmbeddedTriggers(em, tenantId, organizationId),\n ])\n\n // Merge and sort by priority (higher first)\n const allTriggers = [...legacyTriggers, ...embeddedTriggers]\n .sort((a, b) => b.priority - a.priority)\n\n // Update cache\n cache.set(cacheKey, {\n triggers: allTriggers,\n cachedAt: Date.now(),\n })\n\n return allTriggers\n}\n\n/**\n * Invalidate trigger cache for a tenant/organization.\n * Call this when:\n * - Legacy triggers are created/updated/deleted\n * - Workflow definitions with embedded triggers are created/updated/deleted\n */\nexport function invalidateTriggerCache(tenantId: string, organizationId?: string): void {\n const cache = getTriggerCache()\n if (organizationId) {\n // Invalidate specific org\n const cacheKey = getCacheKey(tenantId, organizationId)\n cache.delete(cacheKey)\n } else {\n // Invalidate all orgs for tenant\n for (const key of cache.keys()) {\n if (key.startsWith(`${tenantId}:`)) {\n cache.delete(key)\n }\n }\n }\n}\n\n// ============================================================================\n// Trigger Matching\n// ============================================================================\n\n/**\n * Find all triggers that match an event.\n */\nexport async function findMatchingTriggers(\n em: EntityManager,\n context: EventTriggerContext\n): Promise<UnifiedTrigger[]> {\n const triggers = await loadTriggersForTenant(\n em,\n context.tenantId,\n context.organizationId\n )\n\n return triggers.filter(trigger => {\n // Check event pattern\n if (!matchEventPattern(context.eventName, trigger.eventPattern)) {\n return false\n }\n\n // Check filter conditions\n if (!evaluateFilterConditions(trigger.config?.filterConditions, context.payload)) {\n return false\n }\n\n return true\n })\n}\n\n// ============================================================================\n// Trigger Processing\n// ============================================================================\n\n/**\n * Check if max concurrent instances limit is reached.\n */\nasync function checkConcurrencyLimit(\n em: EntityManager,\n trigger: UnifiedTrigger\n): Promise<boolean> {\n const maxInstances = trigger.config?.maxConcurrentInstances\n\n if (!maxInstances) return true // No limit\n\n // Count running instances for this trigger's workflow definition\n const runningCount = await em.count(WorkflowInstance, {\n definitionId: trigger.workflowDefinitionId,\n status: { $in: ['RUNNING', 'WAITING_FOR_ACTIVITIES'] },\n tenantId: trigger.tenantId,\n organizationId: trigger.organizationId,\n deletedAt: null,\n })\n\n return runningCount < maxInstances\n}\n\n/**\n * Process all matching triggers for an event and start workflows.\n */\nexport async function processEventTriggers(\n em: EntityManager,\n container: AwilixContainer,\n context: EventTriggerContext\n): Promise<ProcessTriggersResult> {\n const result: ProcessTriggersResult = {\n triggered: 0,\n skipped: 0,\n errors: [],\n instances: [],\n }\n\n // Find matching triggers\n const triggers = await findMatchingTriggers(em, context)\n\n if (triggers.length === 0) {\n return result\n }\n\n // Process each trigger (definitions already validated during loading)\n for (const trigger of triggers) {\n try {\n // Check concurrency limit\n const canStart = await checkConcurrencyLimit(em, trigger)\n if (!canStart) {\n logger.debug('Skipping trigger: max concurrent instances reached', { triggerId: trigger.id, triggerName: trigger.name })\n result.skipped++\n continue\n }\n\n // Map event payload to workflow context\n const mappedContext = mapEventToContext(trigger.config?.contextMapping, context.payload)\n\n // Extract entity info from payload for metadata\n const payloadId = context.payload?.id as string | undefined\n const payloadEntityType = context.payload?.entityType as string | undefined\n\n // Include event metadata and payload in context\n const initialContext = {\n // Include raw event payload fields (e.g., id, organizationId, tenantId)\n ...context.payload,\n // Override with explicit mappings if provided\n ...mappedContext,\n __trigger: {\n triggerId: trigger.id,\n triggerName: trigger.name,\n eventName: context.eventName,\n eventPayload: context.payload,\n triggeredAt: new Date().toISOString(),\n source: trigger.source,\n },\n }\n\n // Start workflow\n const instance = await startWorkflow(em, {\n workflowId: trigger.workflowId,\n version: trigger.workflowVersion,\n initialContext,\n metadata: {\n initiatedBy: `trigger:${trigger.id}`,\n // Include entityId and entityType for widget discovery\n entityId: payloadId,\n entityType: payloadEntityType || trigger.config?.entityType,\n labels: {\n trigger_id: trigger.id,\n trigger_name: trigger.name,\n event_name: context.eventName,\n trigger_source: trigger.source,\n },\n },\n tenantId: context.tenantId,\n organizationId: context.organizationId,\n })\n\n result.triggered++\n result.instances.push({\n triggerId: trigger.id,\n instanceId: instance.id,\n })\n\n // Execute workflow asynchronously (don't wait)\n executeWorkflow(em.fork(), container, instance.id).catch(err => {\n logger.error('Error executing workflow', { instanceId: instance.id, err })\n })\n\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n logger.error('Error processing trigger', { triggerId: trigger.id, triggerName: trigger.name, err: error })\n result.errors.push({\n triggerId: trigger.id,\n error: errorMessage,\n })\n }\n }\n\n return result\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,3 +1,5 @@
1
+ import { createLogger } from "@open-mercato/shared/lib/logger";
2
+ const logger = createLogger("workflows");
1
3
  function convertJsonSchemaToFields(schema) {
2
4
  if (!schema || !schema.properties) return [];
3
5
  const fields = [];
@@ -197,7 +199,7 @@ function formValuesToNodeUpdates(values, node) {
197
199
  const parsed = JSON.parse(values.advancedConfig);
198
200
  Object.assign(updates, parsed);
199
201
  } catch (error) {
200
- console.error("Invalid JSON in Advanced Configuration:", error);
202
+ logger.error("Invalid JSON in Advanced Configuration", { err: error });
201
203
  throw new Error("Invalid JSON in Advanced Configuration. Please check your syntax.");
202
204
  }
203
205
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/workflows/lib/nodeFormTransforms.ts"],
4
- "sourcesContent": ["/**\n * Node Form Transforms\n *\n * Utilities to convert between React Flow node data structures and CrudForm field values.\n * Handles bidirectional transformation for all 7 node types with proper type safety.\n */\n\nimport type { Node } from '@xyflow/react'\nimport type { FormField } from '../components/fields/FormFieldArrayEditor'\nimport type { Activity } from '../components/fields/ActivityArrayEditor'\nimport type { Mapping } from '../components/fields/MappingArrayEditor'\nimport type { StartPreCondition } from '../components/fields/StartPreConditionsEditor'\nimport { sanitizeId } from './graph-utils'\n\n/**\n * Form values interface matching CrudForm field structure\n */\nexport interface NodeFormValues {\n // Common fields (all node types)\n stepName: string\n description?: string\n timeout?: string\n\n // UserTask fields\n assignedTo?: string\n assignedToRoles?: string // Comma-separated in form\n formKey?: string\n formFields?: FormField[]\n assignmentRule?: string\n slaDuration?: string\n escalationRules?: any[]\n\n // Automated fields\n activityType?: string\n activityId?: string\n stepActivities?: Activity[]\n\n // SubWorkflow fields\n subWorkflowId?: string\n subWorkflowVersion?: string\n inputMappings?: Mapping[]\n outputMappings?: Mapping[]\n\n // WaitForSignal fields\n signalName?: string\n signalTimeout?: string\n\n // Start node pre-conditions\n preConditions?: StartPreCondition[]\n\n // Advanced configuration (JSON)\n advancedConfig?: string\n}\n\n/**\n * Convert JSON Schema format to custom FormField format\n */\nfunction convertJsonSchemaToFields(schema: any): FormField[] {\n if (!schema || !schema.properties) return []\n\n const fields: FormField[] = []\n const properties = schema.properties\n const required = schema.required || []\n\n for (const [name, prop] of Object.entries(properties)) {\n const propDef = prop as any\n const field: FormField = {\n name,\n type: mapJsonSchemaTypeToFieldType(propDef),\n label: propDef.title || name,\n required: required.includes(name),\n placeholder: propDef.description || undefined,\n }\n\n // Handle enum for select fields\n if (propDef.enum) {\n field.options = propDef.enum\n }\n\n // Handle default value\n if (propDef.default !== undefined) {\n field.defaultValue = String(propDef.default)\n }\n\n fields.push(field)\n }\n\n return fields\n}\n\n/**\n * Map JSON Schema types to FormField types\n */\nfunction mapJsonSchemaTypeToFieldType(propDef: any): string {\n if (propDef.enum) return 'select'\n\n switch (propDef.type) {\n case 'string':\n if (propDef.format === 'email') return 'email'\n if (propDef.format === 'uri') return 'url'\n if (propDef.format === 'date') return 'date'\n if (propDef.format === 'time') return 'time'\n if (propDef.format === 'date-time') return 'datetime-local'\n if (propDef.maxLength && propDef.maxLength > 200) return 'textarea'\n return 'text'\n case 'number':\n case 'integer':\n return 'number'\n case 'boolean':\n return 'checkbox'\n default:\n return 'text'\n }\n}\n\n/**\n * Convert Node data to CrudForm values\n *\n * Handles all 7 node types: start, end, userTask, automated, subWorkflow, waitForSignal, decision\n */\nexport function nodeToFormValues(node: Node): NodeFormValues {\n const nodeData = node.data as any\n\n const values: NodeFormValues = {\n stepName: nodeData?.stepName || nodeData?.label || '',\n description: nodeData?.description || '',\n timeout: nodeData?.timeout || '',\n }\n\n // UserTask fields\n if (node.type === 'userTask') {\n values.assignedTo = nodeData?.assignedTo || ''\n values.assignedToRoles = nodeData?.assignedToRoles?.join(', ') || ''\n values.formKey = nodeData?.formKey || ''\n\n // Advanced userTaskConfig fields\n if (nodeData?.userTaskConfig) {\n values.assignmentRule = nodeData.userTaskConfig.assignmentRule || nodeData.assignmentRule || ''\n values.slaDuration = nodeData.userTaskConfig.slaDuration || nodeData.slaDuration || ''\n values.escalationRules = nodeData.userTaskConfig.escalationRules || nodeData.escalationRules || []\n }\n\n // Load form fields from userTaskConfig.formSchema\n if (nodeData?.userTaskConfig?.formSchema) {\n const schema = nodeData.userTaskConfig.formSchema\n\n // Check if it's our custom format (with fields array) or JSON Schema format\n if (schema.fields && Array.isArray(schema.fields)) {\n // Custom format\n values.formFields = schema.fields\n } else if (schema.properties) {\n // JSON Schema format - convert to our format\n values.formFields = convertJsonSchemaToFields(schema)\n } else {\n values.formFields = []\n }\n } else {\n values.formFields = []\n }\n }\n\n // Automated fields\n if (node.type === 'automated') {\n values.activityType = nodeData?.activityType || ''\n values.activityId = nodeData?.activityId || ''\n values.stepActivities = nodeData?.activities || []\n }\n\n // SubWorkflow fields\n if (node.type === 'subWorkflow' && nodeData?.config) {\n values.subWorkflowId = nodeData.config.subWorkflowId || ''\n values.subWorkflowVersion = nodeData.config.version?.toString() || ''\n\n // Convert inputMapping object to array for editing\n if (nodeData.config.inputMapping) {\n values.inputMappings = Object.entries(nodeData.config.inputMapping).map(([key, value]) => ({\n key,\n value: value as string\n }))\n } else {\n values.inputMappings = []\n }\n\n // Convert outputMapping object to array for editing\n if (nodeData.config.outputMapping) {\n values.outputMappings = Object.entries(nodeData.config.outputMapping).map(([key, value]) => ({\n key,\n value: value as string\n }))\n } else {\n values.outputMappings = []\n }\n }\n\n // WaitForSignal fields\n if (node.type === 'waitForSignal' && nodeData?.signalConfig) {\n values.signalName = nodeData.signalConfig.signalName || ''\n values.signalTimeout = nodeData.signalConfig.timeout || 'PT5M'\n }\n\n // Start node pre-conditions\n if (node.type === 'start' && nodeData?.preConditions) {\n values.preConditions = nodeData.preConditions\n } else if (node.type === 'start') {\n values.preConditions = []\n }\n\n // Advanced config (preserve all fields not explicitly handled)\n const advancedFields: any = {}\n if (nodeData?.userTaskConfig) {\n advancedFields.userTaskConfig = nodeData.userTaskConfig\n }\n if (nodeData?.retryPolicy) {\n advancedFields.retryPolicy = nodeData.retryPolicy\n }\n values.advancedConfig = Object.keys(advancedFields).length > 0\n ? JSON.stringify(advancedFields, null, 2)\n : ''\n\n return values\n}\n\n/**\n * Convert CrudForm values back to Node data updates\n *\n * Returns partial node data to be merged with existing node data.\n * Handles sanitization and validation.\n */\nexport function formValuesToNodeUpdates(\n values: NodeFormValues,\n node: Node\n): Partial<Node['data']> {\n const updates: Partial<Node['data']> = {\n stepName: values.stepName,\n label: values.stepName, // Keep label for backward compatibility\n description: values.description || undefined,\n timeout: values.timeout || undefined,\n }\n\n // UserTask specific fields\n if (node.type === 'userTask') {\n updates.assignedTo = values.assignedTo || undefined\n updates.assignedToRoles = values.assignedToRoles\n ? values.assignedToRoles.split(',').map((r) => r.trim()).filter(Boolean)\n : []\n updates.formKey = values.formKey || undefined\n\n // Build userTaskConfig with all fields\n updates.userTaskConfig = {\n ...(values.formFields && values.formFields.length > 0 && {\n formSchema: {\n fields: values.formFields,\n },\n }),\n ...(values.assignedTo && { assignedTo: values.assignedTo }),\n ...(values.assignedToRoles && {\n assignedToRoles: values.assignedToRoles.split(',').map((r) => r.trim()).filter(Boolean)\n }),\n // Preserve advanced fields\n ...(values.assignmentRule && { assignmentRule: values.assignmentRule }),\n ...(values.slaDuration && { slaDuration: values.slaDuration }),\n ...(values.escalationRules && values.escalationRules.length > 0 && {\n escalationRules: values.escalationRules\n }),\n }\n }\n\n // Automated task specific fields\n if (node.type === 'automated') {\n updates.activityType = values.activityType || undefined\n updates.activityId = values.activityId || undefined\n\n // Step activities\n if (values.stepActivities && values.stepActivities.length > 0) {\n updates.activities = values.stepActivities\n }\n }\n\n // SubWorkflow specific fields\n if (node.type === 'subWorkflow') {\n const config: any = {}\n\n if (values.subWorkflowId) {\n config.subWorkflowId = values.subWorkflowId\n }\n\n if (values.subWorkflowVersion) {\n const versionNum = parseInt(values.subWorkflowVersion, 10)\n if (!isNaN(versionNum)) {\n config.version = versionNum\n }\n }\n\n // Convert inputMappings array to object\n if (values.inputMappings && values.inputMappings.length > 0) {\n config.inputMapping = values.inputMappings\n .filter(m => m.key && m.value)\n .reduce((acc, m) => ({ ...acc, [m.key]: m.value }), {})\n }\n\n // Convert outputMappings array to object\n if (values.outputMappings && values.outputMappings.length > 0) {\n config.outputMapping = values.outputMappings\n .filter(m => m.key && m.value)\n .reduce((acc, m) => ({ ...acc, [m.key]: m.value }), {})\n }\n\n if (Object.keys(config).length > 0) {\n updates.config = config\n }\n }\n\n // WaitForSignal specific fields\n if (node.type === 'waitForSignal') {\n const config: any = {}\n\n if (values.signalName) {\n config.signalName = values.signalName\n }\n\n if (values.signalTimeout) {\n config.timeout = values.signalTimeout\n }\n\n if (Object.keys(config).length > 0) {\n updates.signalConfig = config\n }\n }\n\n // Start node pre-conditions\n if (node.type === 'start') {\n if (values.preConditions && values.preConditions.length > 0) {\n // Filter out empty rule IDs\n updates.preConditions = values.preConditions.filter(pc => pc.ruleId && pc.ruleId.trim())\n } else {\n updates.preConditions = []\n }\n }\n\n // Parse advanced config (JSON) and merge\n if (values.advancedConfig && values.advancedConfig.trim()) {\n try {\n const parsed = JSON.parse(values.advancedConfig)\n Object.assign(updates, parsed)\n } catch (error) {\n console.error('Invalid JSON in Advanced Configuration:', error)\n throw new Error('Invalid JSON in Advanced Configuration. Please check your syntax.')\n }\n }\n\n return updates\n}\n\n/**\n * Check if form fields are in JSON Schema format\n * (used to show conversion warning)\n */\nexport function isJsonSchemaFormat(node: Node): boolean {\n const nodeData = node.data as any\n if (node.type !== 'userTask') return false\n\n const schema = nodeData?.userTaskConfig?.formSchema\n if (!schema) return false\n\n // JSON Schema format has properties, not fields\n return Boolean(schema.properties && !schema.fields)\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Node Form Transforms\n *\n * Utilities to convert between React Flow node data structures and CrudForm field values.\n * Handles bidirectional transformation for all 7 node types with proper type safety.\n */\n\nimport type { Node } from '@xyflow/react'\nimport type { FormField } from '../components/fields/FormFieldArrayEditor'\nimport type { Activity } from '../components/fields/ActivityArrayEditor'\nimport type { Mapping } from '../components/fields/MappingArrayEditor'\nimport type { StartPreCondition } from '../components/fields/StartPreConditionsEditor'\nimport { sanitizeId } from './graph-utils'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\n\nconst logger = createLogger('workflows')\n\n/**\n * Form values interface matching CrudForm field structure\n */\nexport interface NodeFormValues {\n // Common fields (all node types)\n stepName: string\n description?: string\n timeout?: string\n\n // UserTask fields\n assignedTo?: string\n assignedToRoles?: string // Comma-separated in form\n formKey?: string\n formFields?: FormField[]\n assignmentRule?: string\n slaDuration?: string\n escalationRules?: any[]\n\n // Automated fields\n activityType?: string\n activityId?: string\n stepActivities?: Activity[]\n\n // SubWorkflow fields\n subWorkflowId?: string\n subWorkflowVersion?: string\n inputMappings?: Mapping[]\n outputMappings?: Mapping[]\n\n // WaitForSignal fields\n signalName?: string\n signalTimeout?: string\n\n // Start node pre-conditions\n preConditions?: StartPreCondition[]\n\n // Advanced configuration (JSON)\n advancedConfig?: string\n}\n\n/**\n * Convert JSON Schema format to custom FormField format\n */\nfunction convertJsonSchemaToFields(schema: any): FormField[] {\n if (!schema || !schema.properties) return []\n\n const fields: FormField[] = []\n const properties = schema.properties\n const required = schema.required || []\n\n for (const [name, prop] of Object.entries(properties)) {\n const propDef = prop as any\n const field: FormField = {\n name,\n type: mapJsonSchemaTypeToFieldType(propDef),\n label: propDef.title || name,\n required: required.includes(name),\n placeholder: propDef.description || undefined,\n }\n\n // Handle enum for select fields\n if (propDef.enum) {\n field.options = propDef.enum\n }\n\n // Handle default value\n if (propDef.default !== undefined) {\n field.defaultValue = String(propDef.default)\n }\n\n fields.push(field)\n }\n\n return fields\n}\n\n/**\n * Map JSON Schema types to FormField types\n */\nfunction mapJsonSchemaTypeToFieldType(propDef: any): string {\n if (propDef.enum) return 'select'\n\n switch (propDef.type) {\n case 'string':\n if (propDef.format === 'email') return 'email'\n if (propDef.format === 'uri') return 'url'\n if (propDef.format === 'date') return 'date'\n if (propDef.format === 'time') return 'time'\n if (propDef.format === 'date-time') return 'datetime-local'\n if (propDef.maxLength && propDef.maxLength > 200) return 'textarea'\n return 'text'\n case 'number':\n case 'integer':\n return 'number'\n case 'boolean':\n return 'checkbox'\n default:\n return 'text'\n }\n}\n\n/**\n * Convert Node data to CrudForm values\n *\n * Handles all 7 node types: start, end, userTask, automated, subWorkflow, waitForSignal, decision\n */\nexport function nodeToFormValues(node: Node): NodeFormValues {\n const nodeData = node.data as any\n\n const values: NodeFormValues = {\n stepName: nodeData?.stepName || nodeData?.label || '',\n description: nodeData?.description || '',\n timeout: nodeData?.timeout || '',\n }\n\n // UserTask fields\n if (node.type === 'userTask') {\n values.assignedTo = nodeData?.assignedTo || ''\n values.assignedToRoles = nodeData?.assignedToRoles?.join(', ') || ''\n values.formKey = nodeData?.formKey || ''\n\n // Advanced userTaskConfig fields\n if (nodeData?.userTaskConfig) {\n values.assignmentRule = nodeData.userTaskConfig.assignmentRule || nodeData.assignmentRule || ''\n values.slaDuration = nodeData.userTaskConfig.slaDuration || nodeData.slaDuration || ''\n values.escalationRules = nodeData.userTaskConfig.escalationRules || nodeData.escalationRules || []\n }\n\n // Load form fields from userTaskConfig.formSchema\n if (nodeData?.userTaskConfig?.formSchema) {\n const schema = nodeData.userTaskConfig.formSchema\n\n // Check if it's our custom format (with fields array) or JSON Schema format\n if (schema.fields && Array.isArray(schema.fields)) {\n // Custom format\n values.formFields = schema.fields\n } else if (schema.properties) {\n // JSON Schema format - convert to our format\n values.formFields = convertJsonSchemaToFields(schema)\n } else {\n values.formFields = []\n }\n } else {\n values.formFields = []\n }\n }\n\n // Automated fields\n if (node.type === 'automated') {\n values.activityType = nodeData?.activityType || ''\n values.activityId = nodeData?.activityId || ''\n values.stepActivities = nodeData?.activities || []\n }\n\n // SubWorkflow fields\n if (node.type === 'subWorkflow' && nodeData?.config) {\n values.subWorkflowId = nodeData.config.subWorkflowId || ''\n values.subWorkflowVersion = nodeData.config.version?.toString() || ''\n\n // Convert inputMapping object to array for editing\n if (nodeData.config.inputMapping) {\n values.inputMappings = Object.entries(nodeData.config.inputMapping).map(([key, value]) => ({\n key,\n value: value as string\n }))\n } else {\n values.inputMappings = []\n }\n\n // Convert outputMapping object to array for editing\n if (nodeData.config.outputMapping) {\n values.outputMappings = Object.entries(nodeData.config.outputMapping).map(([key, value]) => ({\n key,\n value: value as string\n }))\n } else {\n values.outputMappings = []\n }\n }\n\n // WaitForSignal fields\n if (node.type === 'waitForSignal' && nodeData?.signalConfig) {\n values.signalName = nodeData.signalConfig.signalName || ''\n values.signalTimeout = nodeData.signalConfig.timeout || 'PT5M'\n }\n\n // Start node pre-conditions\n if (node.type === 'start' && nodeData?.preConditions) {\n values.preConditions = nodeData.preConditions\n } else if (node.type === 'start') {\n values.preConditions = []\n }\n\n // Advanced config (preserve all fields not explicitly handled)\n const advancedFields: any = {}\n if (nodeData?.userTaskConfig) {\n advancedFields.userTaskConfig = nodeData.userTaskConfig\n }\n if (nodeData?.retryPolicy) {\n advancedFields.retryPolicy = nodeData.retryPolicy\n }\n values.advancedConfig = Object.keys(advancedFields).length > 0\n ? JSON.stringify(advancedFields, null, 2)\n : ''\n\n return values\n}\n\n/**\n * Convert CrudForm values back to Node data updates\n *\n * Returns partial node data to be merged with existing node data.\n * Handles sanitization and validation.\n */\nexport function formValuesToNodeUpdates(\n values: NodeFormValues,\n node: Node\n): Partial<Node['data']> {\n const updates: Partial<Node['data']> = {\n stepName: values.stepName,\n label: values.stepName, // Keep label for backward compatibility\n description: values.description || undefined,\n timeout: values.timeout || undefined,\n }\n\n // UserTask specific fields\n if (node.type === 'userTask') {\n updates.assignedTo = values.assignedTo || undefined\n updates.assignedToRoles = values.assignedToRoles\n ? values.assignedToRoles.split(',').map((r) => r.trim()).filter(Boolean)\n : []\n updates.formKey = values.formKey || undefined\n\n // Build userTaskConfig with all fields\n updates.userTaskConfig = {\n ...(values.formFields && values.formFields.length > 0 && {\n formSchema: {\n fields: values.formFields,\n },\n }),\n ...(values.assignedTo && { assignedTo: values.assignedTo }),\n ...(values.assignedToRoles && {\n assignedToRoles: values.assignedToRoles.split(',').map((r) => r.trim()).filter(Boolean)\n }),\n // Preserve advanced fields\n ...(values.assignmentRule && { assignmentRule: values.assignmentRule }),\n ...(values.slaDuration && { slaDuration: values.slaDuration }),\n ...(values.escalationRules && values.escalationRules.length > 0 && {\n escalationRules: values.escalationRules\n }),\n }\n }\n\n // Automated task specific fields\n if (node.type === 'automated') {\n updates.activityType = values.activityType || undefined\n updates.activityId = values.activityId || undefined\n\n // Step activities\n if (values.stepActivities && values.stepActivities.length > 0) {\n updates.activities = values.stepActivities\n }\n }\n\n // SubWorkflow specific fields\n if (node.type === 'subWorkflow') {\n const config: any = {}\n\n if (values.subWorkflowId) {\n config.subWorkflowId = values.subWorkflowId\n }\n\n if (values.subWorkflowVersion) {\n const versionNum = parseInt(values.subWorkflowVersion, 10)\n if (!isNaN(versionNum)) {\n config.version = versionNum\n }\n }\n\n // Convert inputMappings array to object\n if (values.inputMappings && values.inputMappings.length > 0) {\n config.inputMapping = values.inputMappings\n .filter(m => m.key && m.value)\n .reduce((acc, m) => ({ ...acc, [m.key]: m.value }), {})\n }\n\n // Convert outputMappings array to object\n if (values.outputMappings && values.outputMappings.length > 0) {\n config.outputMapping = values.outputMappings\n .filter(m => m.key && m.value)\n .reduce((acc, m) => ({ ...acc, [m.key]: m.value }), {})\n }\n\n if (Object.keys(config).length > 0) {\n updates.config = config\n }\n }\n\n // WaitForSignal specific fields\n if (node.type === 'waitForSignal') {\n const config: any = {}\n\n if (values.signalName) {\n config.signalName = values.signalName\n }\n\n if (values.signalTimeout) {\n config.timeout = values.signalTimeout\n }\n\n if (Object.keys(config).length > 0) {\n updates.signalConfig = config\n }\n }\n\n // Start node pre-conditions\n if (node.type === 'start') {\n if (values.preConditions && values.preConditions.length > 0) {\n // Filter out empty rule IDs\n updates.preConditions = values.preConditions.filter(pc => pc.ruleId && pc.ruleId.trim())\n } else {\n updates.preConditions = []\n }\n }\n\n // Parse advanced config (JSON) and merge\n if (values.advancedConfig && values.advancedConfig.trim()) {\n try {\n const parsed = JSON.parse(values.advancedConfig)\n Object.assign(updates, parsed)\n } catch (error) {\n logger.error('Invalid JSON in Advanced Configuration', { err: error })\n throw new Error('Invalid JSON in Advanced Configuration. Please check your syntax.')\n }\n }\n\n return updates\n}\n\n/**\n * Check if form fields are in JSON Schema format\n * (used to show conversion warning)\n */\nexport function isJsonSchemaFormat(node: Node): boolean {\n const nodeData = node.data as any\n if (node.type !== 'userTask') return false\n\n const schema = nodeData?.userTaskConfig?.formSchema\n if (!schema) return false\n\n // JSON Schema format has properties, not fields\n return Boolean(schema.properties && !schema.fields)\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -6,6 +6,8 @@ import { BusinessRule } from "@open-mercato/core/modules/business_rules/data/ent
6
6
  import {
7
7
  invalidateBusinessRuleDiscoveryCache
8
8
  } from "@open-mercato/core/modules/business_rules/lib/rule-engine";
9
+ import { createLogger } from "@open-mercato/shared/lib/logger";
10
+ const logger = createLogger("workflows");
9
11
  const __esmDirname = path.dirname(fileURLToPath(import.meta.url));
10
12
  function readExampleJson(fileName) {
11
13
  const candidates = [
@@ -48,7 +50,14 @@ async function seedWorkflowDefinition(em, scope, fileName) {
48
50
  const existingHasStartPreConditions = existingStartStep?.preConditions && existingStartStep.preConditions.length > 0;
49
51
  const needsUpdate = seedStepCount !== existingStepCount || seedTransitionCount !== existingTransitionCount || seedHasStartPreConditions && !existingHasStartPreConditions || seedHasTransitionPreConditions && !existingHasTransitionPreConditions;
50
52
  if (needsUpdate) {
51
- console.log(`[seed] Updating workflow ${workflowId} (steps: ${existingStepCount}\u2192${seedStepCount}, transitions: ${existingTransitionCount}\u2192${seedTransitionCount})`);
53
+ logger.info("Updating seeded workflow", {
54
+ component: "seed",
55
+ workflowId,
56
+ existingStepCount,
57
+ seedStepCount,
58
+ existingTransitionCount,
59
+ seedTransitionCount
60
+ });
52
61
  existing.definition = seed.definition;
53
62
  await em.flush();
54
63
  return true;
@@ -83,7 +92,12 @@ async function seedGuardRules(em, scope, fileName, cache) {
83
92
  if (existing) {
84
93
  const needsUpdate = existing.entityType !== rule.entityType || existing.eventType !== rule.eventType;
85
94
  if (needsUpdate) {
86
- console.log(`[seed] Updating business rule ${ruleId}: entityType=${rule.entityType}, eventType=${rule.eventType}`);
95
+ logger.info("Updating seeded business rule", {
96
+ component: "seed",
97
+ ruleId,
98
+ entityType: rule.entityType,
99
+ eventType: rule.eventType
100
+ });
87
101
  existing.entityType = rule.entityType;
88
102
  existing.eventType = rule.eventType ?? null;
89
103
  updated += 1;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/workflows/lib/seeds.ts"],
4
- "sourcesContent": ["import type { EntityManager } from '@mikro-orm/postgresql'\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport { fileURLToPath } from 'node:url'\nimport { WorkflowDefinition, type WorkflowDefinitionData } from '../data/entities'\nimport { BusinessRule, type RuleType } from '@open-mercato/core/modules/business_rules/data/entities'\nimport {\n invalidateBusinessRuleDiscoveryCache,\n type RuleDiscoveryCache,\n} from '@open-mercato/core/modules/business_rules/lib/rule-engine'\n\nconst __esmDirname = path.dirname(fileURLToPath(import.meta.url))\n\nexport type WorkflowSeedScope = { tenantId: string; organizationId: string }\n\ntype WorkflowSeedDefinition = {\n workflowId: string\n workflowName: string\n description?: string | null\n version?: number\n definition: WorkflowDefinitionData\n metadata?: Record<string, unknown> | null\n enabled?: boolean\n effectiveFrom?: string | null\n effectiveTo?: string | null\n createdBy?: string | null\n updatedBy?: string | null\n}\n\ntype GuardRuleSeed = {\n ruleId: string\n ruleName: string\n ruleType: RuleType\n entityType: string\n conditionExpression: unknown\n eventType?: string | null\n ruleCategory?: string | null\n description?: string | null\n successActions?: unknown\n failureActions?: unknown\n enabled?: boolean\n priority?: number\n version?: number\n effectiveFrom?: string | null\n effectiveTo?: string | null\n createdBy?: string | null\n updatedBy?: string | null\n tagsJson?: string[]\n labelsJson?: Record<string, string>\n}\n\nfunction readExampleJson<T>(fileName: string): T {\n const candidates = [\n path.join(__esmDirname, '..', 'examples', fileName),\n path.join(process.cwd(), 'packages', 'core', 'src', 'modules', 'workflows', 'examples', fileName),\n path.join(process.cwd(), 'src', 'modules', 'workflows', 'examples', fileName),\n ]\n const filePath = candidates.find((candidate) => fs.existsSync(candidate))\n if (!filePath) {\n throw new Error(`Missing workflow seed file: ${fileName}`)\n }\n return JSON.parse(fs.readFileSync(filePath, 'utf8')) as T\n}\n\nfunction requireString(value: unknown, label: string): string {\n if (typeof value === 'string' && value.trim().length > 0) return value\n throw new Error(`Invalid ${label} in workflow seed data.`)\n}\n\nasync function seedWorkflowDefinition(\n em: EntityManager,\n scope: WorkflowSeedScope,\n fileName: string,\n): Promise<boolean> {\n const seed = readExampleJson<WorkflowSeedDefinition>(fileName)\n const workflowId = requireString(seed.workflowId, 'workflowId')\n\n const existing = await em.findOne(WorkflowDefinition, {\n workflowId,\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n })\n\n if (existing) {\n // Check if the definition needs to be updated by comparing steps and transitions\n const seedStepCount = seed.definition.steps.length\n const existingStepCount = existing.definition.steps.length\n const seedTransitionCount = seed.definition.transitions.length\n const existingTransitionCount = existing.definition.transitions.length\n\n // Check for preConditions on transitions\n const seedHasTransitionPreConditions = seed.definition.transitions.some(\n (t: any) => t.preConditions && t.preConditions.length > 0\n )\n const existingHasTransitionPreConditions = existing.definition.transitions.some(\n (t: any) => t.preConditions && t.preConditions.length > 0\n )\n\n // Check for preConditions on START step\n const seedStartStep = seed.definition.steps.find((s: any) => s.stepType === 'START')\n const existingStartStep = existing.definition.steps.find((s: any) => s.stepType === 'START')\n const seedHasStartPreConditions = seedStartStep?.preConditions && seedStartStep.preConditions.length > 0\n const existingHasStartPreConditions = existingStartStep?.preConditions && existingStartStep.preConditions.length > 0\n\n // Update if structure has changed\n const needsUpdate =\n seedStepCount !== existingStepCount ||\n seedTransitionCount !== existingTransitionCount ||\n (seedHasStartPreConditions && !existingHasStartPreConditions) ||\n (seedHasTransitionPreConditions && !existingHasTransitionPreConditions)\n\n if (needsUpdate) {\n console.log(`[seed] Updating workflow ${workflowId} (steps: ${existingStepCount}\u2192${seedStepCount}, transitions: ${existingTransitionCount}\u2192${seedTransitionCount})`)\n existing.definition = seed.definition\n await em.flush()\n return true\n }\n\n return false\n }\n\n const workflow = em.create(WorkflowDefinition, {\n ...seed,\n workflowId,\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n })\n em.persist(workflow)\n await em.flush()\n return true\n}\n\nasync function seedGuardRules(\n em: EntityManager,\n scope: WorkflowSeedScope,\n fileName: string,\n cache?: RuleDiscoveryCache | null,\n): Promise<{ seeded: number; skipped: number; updated: number }> {\n const seeds = readExampleJson<GuardRuleSeed[]>(fileName)\n if (!Array.isArray(seeds)) {\n throw new Error('Invalid guard rules seed data.')\n }\n\n let seeded = 0\n let skipped = 0\n let updated = 0\n for (const rule of seeds) {\n const ruleId = requireString(rule.ruleId, 'ruleId')\n const existing = await em.findOne(BusinessRule, {\n ruleId,\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n })\n if (existing) {\n // Check if entityType or eventType needs updating\n const needsUpdate = existing.entityType !== rule.entityType || existing.eventType !== rule.eventType\n if (needsUpdate) {\n console.log(`[seed] Updating business rule ${ruleId}: entityType=${rule.entityType}, eventType=${rule.eventType}`)\n existing.entityType = rule.entityType\n existing.eventType = rule.eventType ?? null\n updated += 1\n } else {\n skipped += 1\n }\n continue\n }\n const entry = em.create(BusinessRule, {\n ruleId,\n ruleName: rule.ruleName,\n ruleType: rule.ruleType,\n entityType: rule.entityType,\n conditionExpression: rule.conditionExpression,\n eventType: rule.eventType,\n ruleCategory: rule.ruleCategory,\n description: rule.description,\n successActions: rule.successActions,\n failureActions: rule.failureActions,\n enabled: rule.enabled,\n priority: rule.priority,\n version: rule.version,\n effectiveFrom: rule.effectiveFrom,\n effectiveTo: rule.effectiveTo,\n createdBy: rule.createdBy,\n updatedBy: rule.updatedBy,\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n })\n em.persist(entry)\n seeded += 1\n }\n if (seeded > 0 || updated > 0) {\n await em.flush()\n await invalidateBusinessRuleDiscoveryCache(cache, scope.tenantId, scope.organizationId)\n }\n return { seeded, skipped, updated }\n}\n\nexport async function seedExampleWorkflows(\n em: EntityManager,\n scope: WorkflowSeedScope,\n options: { cache?: RuleDiscoveryCache | null } = {},\n): Promise<void> {\n // workflows.checkout-demo and workflows.simple-approval are now code-defined\n // (see packages/core/src/modules/workflows/workflows.ts). Seeding DB rows for\n // them would shadow the code definitions in the merge layer, so they are no\n // longer seeded here. Existing tenants are migrated via Migration20260428102318.\n await seedGuardRules(em, scope, 'guard-rules-example.json', options.cache)\n await seedWorkflowDefinition(em, scope, 'sales-pipeline-definition.json')\n await seedGuardRules(em, scope, 'order-approval-guard-rules.json', options.cache)\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { EntityManager } from '@mikro-orm/postgresql'\nimport * as fs from 'fs'\nimport * as path from 'path'\nimport { fileURLToPath } from 'node:url'\nimport { WorkflowDefinition, type WorkflowDefinitionData } from '../data/entities'\nimport { BusinessRule, type RuleType } from '@open-mercato/core/modules/business_rules/data/entities'\nimport {\n invalidateBusinessRuleDiscoveryCache,\n type RuleDiscoveryCache,\n} from '@open-mercato/core/modules/business_rules/lib/rule-engine'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\n\nconst logger = createLogger('workflows')\n\nconst __esmDirname = path.dirname(fileURLToPath(import.meta.url))\n\nexport type WorkflowSeedScope = { tenantId: string; organizationId: string }\n\ntype WorkflowSeedDefinition = {\n workflowId: string\n workflowName: string\n description?: string | null\n version?: number\n definition: WorkflowDefinitionData\n metadata?: Record<string, unknown> | null\n enabled?: boolean\n effectiveFrom?: string | null\n effectiveTo?: string | null\n createdBy?: string | null\n updatedBy?: string | null\n}\n\ntype GuardRuleSeed = {\n ruleId: string\n ruleName: string\n ruleType: RuleType\n entityType: string\n conditionExpression: unknown\n eventType?: string | null\n ruleCategory?: string | null\n description?: string | null\n successActions?: unknown\n failureActions?: unknown\n enabled?: boolean\n priority?: number\n version?: number\n effectiveFrom?: string | null\n effectiveTo?: string | null\n createdBy?: string | null\n updatedBy?: string | null\n tagsJson?: string[]\n labelsJson?: Record<string, string>\n}\n\nfunction readExampleJson<T>(fileName: string): T {\n const candidates = [\n path.join(__esmDirname, '..', 'examples', fileName),\n path.join(process.cwd(), 'packages', 'core', 'src', 'modules', 'workflows', 'examples', fileName),\n path.join(process.cwd(), 'src', 'modules', 'workflows', 'examples', fileName),\n ]\n const filePath = candidates.find((candidate) => fs.existsSync(candidate))\n if (!filePath) {\n throw new Error(`Missing workflow seed file: ${fileName}`)\n }\n return JSON.parse(fs.readFileSync(filePath, 'utf8')) as T\n}\n\nfunction requireString(value: unknown, label: string): string {\n if (typeof value === 'string' && value.trim().length > 0) return value\n throw new Error(`Invalid ${label} in workflow seed data.`)\n}\n\nasync function seedWorkflowDefinition(\n em: EntityManager,\n scope: WorkflowSeedScope,\n fileName: string,\n): Promise<boolean> {\n const seed = readExampleJson<WorkflowSeedDefinition>(fileName)\n const workflowId = requireString(seed.workflowId, 'workflowId')\n\n const existing = await em.findOne(WorkflowDefinition, {\n workflowId,\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n })\n\n if (existing) {\n // Check if the definition needs to be updated by comparing steps and transitions\n const seedStepCount = seed.definition.steps.length\n const existingStepCount = existing.definition.steps.length\n const seedTransitionCount = seed.definition.transitions.length\n const existingTransitionCount = existing.definition.transitions.length\n\n // Check for preConditions on transitions\n const seedHasTransitionPreConditions = seed.definition.transitions.some(\n (t: any) => t.preConditions && t.preConditions.length > 0\n )\n const existingHasTransitionPreConditions = existing.definition.transitions.some(\n (t: any) => t.preConditions && t.preConditions.length > 0\n )\n\n // Check for preConditions on START step\n const seedStartStep = seed.definition.steps.find((s: any) => s.stepType === 'START')\n const existingStartStep = existing.definition.steps.find((s: any) => s.stepType === 'START')\n const seedHasStartPreConditions = seedStartStep?.preConditions && seedStartStep.preConditions.length > 0\n const existingHasStartPreConditions = existingStartStep?.preConditions && existingStartStep.preConditions.length > 0\n\n // Update if structure has changed\n const needsUpdate =\n seedStepCount !== existingStepCount ||\n seedTransitionCount !== existingTransitionCount ||\n (seedHasStartPreConditions && !existingHasStartPreConditions) ||\n (seedHasTransitionPreConditions && !existingHasTransitionPreConditions)\n\n if (needsUpdate) {\n logger.info('Updating seeded workflow', {\n component: 'seed',\n workflowId,\n existingStepCount,\n seedStepCount,\n existingTransitionCount,\n seedTransitionCount,\n })\n existing.definition = seed.definition\n await em.flush()\n return true\n }\n\n return false\n }\n\n const workflow = em.create(WorkflowDefinition, {\n ...seed,\n workflowId,\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n })\n em.persist(workflow)\n await em.flush()\n return true\n}\n\nasync function seedGuardRules(\n em: EntityManager,\n scope: WorkflowSeedScope,\n fileName: string,\n cache?: RuleDiscoveryCache | null,\n): Promise<{ seeded: number; skipped: number; updated: number }> {\n const seeds = readExampleJson<GuardRuleSeed[]>(fileName)\n if (!Array.isArray(seeds)) {\n throw new Error('Invalid guard rules seed data.')\n }\n\n let seeded = 0\n let skipped = 0\n let updated = 0\n for (const rule of seeds) {\n const ruleId = requireString(rule.ruleId, 'ruleId')\n const existing = await em.findOne(BusinessRule, {\n ruleId,\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n })\n if (existing) {\n // Check if entityType or eventType needs updating\n const needsUpdate = existing.entityType !== rule.entityType || existing.eventType !== rule.eventType\n if (needsUpdate) {\n logger.info('Updating seeded business rule', {\n component: 'seed',\n ruleId,\n entityType: rule.entityType,\n eventType: rule.eventType,\n })\n existing.entityType = rule.entityType\n existing.eventType = rule.eventType ?? null\n updated += 1\n } else {\n skipped += 1\n }\n continue\n }\n const entry = em.create(BusinessRule, {\n ruleId,\n ruleName: rule.ruleName,\n ruleType: rule.ruleType,\n entityType: rule.entityType,\n conditionExpression: rule.conditionExpression,\n eventType: rule.eventType,\n ruleCategory: rule.ruleCategory,\n description: rule.description,\n successActions: rule.successActions,\n failureActions: rule.failureActions,\n enabled: rule.enabled,\n priority: rule.priority,\n version: rule.version,\n effectiveFrom: rule.effectiveFrom,\n effectiveTo: rule.effectiveTo,\n createdBy: rule.createdBy,\n updatedBy: rule.updatedBy,\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n })\n em.persist(entry)\n seeded += 1\n }\n if (seeded > 0 || updated > 0) {\n await em.flush()\n await invalidateBusinessRuleDiscoveryCache(cache, scope.tenantId, scope.organizationId)\n }\n return { seeded, skipped, updated }\n}\n\nexport async function seedExampleWorkflows(\n em: EntityManager,\n scope: WorkflowSeedScope,\n options: { cache?: RuleDiscoveryCache | null } = {},\n): Promise<void> {\n // workflows.checkout-demo and workflows.simple-approval are now code-defined\n // (see packages/core/src/modules/workflows/workflows.ts). Seeding DB rows for\n // them would shadow the code definitions in the merge layer, so they are no\n // longer seeded here. Existing tenants are migrated via Migration20260428102318.\n await seedGuardRules(em, scope, 'guard-rules-example.json', options.cache)\n await seedWorkflowDefinition(em, scope, 'sales-pipeline-definition.json')\n await seedGuardRules(em, scope, 'order-approval-guard-rules.json', options.cache)\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,5 +1,7 @@
1
1
  import { findOneWithDecryption, findWithDecryption } from "@open-mercato/shared/lib/encryption/find";
2
2
  import { WorkflowInstance, WorkflowBranchInstance, WorkflowDefinition, StepInstance } from "../data/entities.js";
3
+ import { createLogger } from "@open-mercato/shared/lib/logger";
4
+ const logger = createLogger("workflows");
3
5
  class SignalError extends Error {
4
6
  constructor(message, code, details) {
5
7
  super(message);
@@ -246,7 +248,7 @@ async function sendSignalByCorrelationKey(em, container, options) {
246
248
  });
247
249
  signalsProcessed++;
248
250
  } catch (error) {
249
- console.error(`Failed to send signal to instance ${instance.id}:`, error);
251
+ logger.error("Failed to send signal to instance", { instanceId: instance.id, err: error });
250
252
  }
251
253
  }
252
254
  return signalsProcessed;