@open-mercato/core 0.7.1-develop.7193.1.910a5b0a1e → 0.7.1-develop.7194.1.ab4fc81f82

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 (1238) hide show
  1. package/.turbo/turbo-build.log +2 -2
  2. package/AGENTS.md +4 -3
  3. package/agentic/standalone-guide.md +1 -1
  4. package/build.mjs +16 -0
  5. package/dist/generated/entities/action_log/index.js +2 -0
  6. package/dist/generated/entities/action_log/index.js.map +2 -2
  7. package/dist/generated/entities/user/index.js +2 -0
  8. package/dist/generated/entities/user/index.js.map +2 -2
  9. package/dist/generated/entities/user_task/index.js +14 -0
  10. package/dist/generated/entities/user_task/index.js.map +2 -2
  11. package/dist/generated/entities/workflow_definition/index.js +6 -0
  12. package/dist/generated/entities/workflow_definition/index.js.map +2 -2
  13. package/dist/generated/entities/workflow_definition_draft/index.js +25 -0
  14. package/dist/generated/entities/workflow_definition_draft/index.js.map +7 -0
  15. package/dist/generated/entities/workflow_definition_metric_rollup/index.js +23 -0
  16. package/dist/generated/entities/workflow_definition_metric_rollup/index.js.map +7 -0
  17. package/dist/generated/entities/workflow_instance/index.js +4 -0
  18. package/dist/generated/entities/workflow_instance/index.js.map +2 -2
  19. package/dist/generated/entities.ids.generated.js +4 -1
  20. package/dist/generated/entities.ids.generated.js.map +2 -2
  21. package/dist/generated/entity-fields-registry.js +39 -0
  22. package/dist/generated/entity-fields-registry.js.map +2 -2
  23. package/dist/helpers/integration/workflowsFixtures.js +477 -2
  24. package/dist/helpers/integration/workflowsFixtures.js.map +2 -2
  25. package/dist/helpers/integration/workflowsUi.js +148 -0
  26. package/dist/helpers/integration/workflowsUi.js.map +7 -0
  27. package/dist/modules/attachments/lib/createFromBuffer.js +79 -0
  28. package/dist/modules/attachments/lib/createFromBuffer.js.map +7 -0
  29. package/dist/modules/audit_logs/data/entities.js +5 -0
  30. package/dist/modules/audit_logs/data/entities.js.map +2 -2
  31. package/dist/modules/audit_logs/data/validators.js +1 -0
  32. package/dist/modules/audit_logs/data/validators.js.map +2 -2
  33. package/dist/modules/audit_logs/lib/projections.js +2 -1
  34. package/dist/modules/audit_logs/lib/projections.js.map +2 -2
  35. package/dist/modules/audit_logs/migrations/Migration20260625120000.js +15 -0
  36. package/dist/modules/audit_logs/migrations/Migration20260625120000.js.map +7 -0
  37. package/dist/modules/audit_logs/services/actionLogService.js +3 -0
  38. package/dist/modules/audit_logs/services/actionLogService.js.map +2 -2
  39. package/dist/modules/auth/data/entities.js +6 -0
  40. package/dist/modules/auth/data/entities.js.map +2 -2
  41. package/dist/modules/auth/lib/executionPrincipal.js +140 -0
  42. package/dist/modules/auth/lib/executionPrincipal.js.map +7 -0
  43. package/dist/modules/auth/migrations/Migration20260625050000.js +13 -0
  44. package/dist/modules/auth/migrations/Migration20260625050000.js.map +7 -0
  45. package/dist/modules/business_rules/components/InlineRuleEditor.js +154 -0
  46. package/dist/modules/business_rules/components/InlineRuleEditor.js.map +7 -0
  47. package/dist/modules/business_rules/data/validators.js +6 -0
  48. package/dist/modules/business_rules/data/validators.js.map +2 -2
  49. package/dist/modules/business_rules/lib/rule-engine.js +5 -3
  50. package/dist/modules/business_rules/lib/rule-engine.js.map +2 -2
  51. package/dist/modules/catalog/commands/products.js +5 -0
  52. package/dist/modules/catalog/commands/products.js.map +2 -2
  53. package/dist/modules/catalog/workflows.js +19 -0
  54. package/dist/modules/catalog/workflows.js.map +7 -0
  55. package/dist/modules/customer_accounts/backend/customer_accounts/roles/[id]/page.js +3 -1
  56. package/dist/modules/customer_accounts/backend/customer_accounts/roles/[id]/page.js.map +2 -2
  57. package/dist/modules/customer_accounts/cli.js +80 -0
  58. package/dist/modules/customer_accounts/cli.js.map +7 -0
  59. package/dist/modules/customer_accounts/lib/customerRoleAclSync.js +59 -0
  60. package/dist/modules/customer_accounts/lib/customerRoleAclSync.js.map +7 -0
  61. package/dist/modules/customer_accounts/setup.js +4 -2
  62. package/dist/modules/customer_accounts/setup.js.map +2 -2
  63. package/dist/modules/customers/commands/deals.js +4 -0
  64. package/dist/modules/customers/commands/deals.js.map +2 -2
  65. package/dist/modules/customers/components/detail/ChangelogEntryRow.js +1 -1
  66. package/dist/modules/customers/components/detail/ChangelogEntryRow.js.map +2 -2
  67. package/dist/modules/customers/components/detail/utils.js +2 -0
  68. package/dist/modules/customers/components/detail/utils.js.map +2 -2
  69. package/dist/modules/customers/events.js +13 -2
  70. package/dist/modules/customers/events.js.map +2 -2
  71. package/dist/modules/customers/lib/link-workflow-task-handler.js +64 -0
  72. package/dist/modules/customers/lib/link-workflow-task-handler.js.map +7 -0
  73. package/dist/modules/customers/lib/todoCompatibility.js +1 -1
  74. package/dist/modules/customers/lib/todoCompatibility.js.map +2 -2
  75. package/dist/modules/customers/lib/workflowTaskLink.js +9 -0
  76. package/dist/modules/customers/lib/workflowTaskLink.js.map +7 -0
  77. package/dist/modules/customers/subscribers/link-workflow-task.js +12 -0
  78. package/dist/modules/customers/subscribers/link-workflow-task.js.map +7 -0
  79. package/dist/modules/customers/workflows.js +29 -0
  80. package/dist/modules/customers/workflows.js.map +7 -0
  81. package/dist/modules/entities/api/records.js +13 -33
  82. package/dist/modules/entities/api/records.js.map +3 -3
  83. package/dist/modules/entities/lib/entityClassification.js +60 -0
  84. package/dist/modules/entities/lib/entityClassification.js.map +7 -0
  85. package/dist/modules/sales/commands/documents.js +31 -0
  86. package/dist/modules/sales/commands/documents.js.map +2 -2
  87. package/dist/modules/sales/events.js +12 -1
  88. package/dist/modules/sales/events.js.map +2 -2
  89. package/dist/modules/sales/workflows.js +12 -1
  90. package/dist/modules/sales/workflows.js.map +2 -2
  91. package/dist/modules/seeds/cli.js +199 -0
  92. package/dist/modules/seeds/cli.js.map +7 -0
  93. package/dist/modules/seeds/examples/sample-seed.json +26 -0
  94. package/dist/modules/seeds/index.js +12 -0
  95. package/dist/modules/seeds/index.js.map +7 -0
  96. package/dist/modules/workflows/acl.js +96 -0
  97. package/dist/modules/workflows/acl.js.map +2 -2
  98. package/dist/modules/workflows/ai-agents.js +50 -0
  99. package/dist/modules/workflows/ai-agents.js.map +7 -0
  100. package/dist/modules/workflows/ai-tools/authoring-pack.js +582 -0
  101. package/dist/modules/workflows/ai-tools/authoring-pack.js.map +7 -0
  102. package/dist/modules/workflows/ai-tools/types.js +43 -0
  103. package/dist/modules/workflows/ai-tools/types.js.map +7 -0
  104. package/dist/modules/workflows/ai-tools.js +10 -0
  105. package/dist/modules/workflows/ai-tools.js.map +7 -0
  106. package/dist/modules/workflows/api/command-settings/route.js +137 -0
  107. package/dist/modules/workflows/api/command-settings/route.js.map +7 -0
  108. package/dist/modules/workflows/api/commands/route.js +72 -0
  109. package/dist/modules/workflows/api/commands/route.js.map +7 -0
  110. package/dist/modules/workflows/api/definitions/[id]/callers/route.js +76 -0
  111. package/dist/modules/workflows/api/definitions/[id]/callers/route.js.map +7 -0
  112. package/dist/modules/workflows/api/definitions/[id]/context-schema/route.js +134 -0
  113. package/dist/modules/workflows/api/definitions/[id]/context-schema/route.js.map +7 -0
  114. package/dist/modules/workflows/api/definitions/[id]/customize/route.js +5 -1
  115. package/dist/modules/workflows/api/definitions/[id]/customize/route.js.map +2 -2
  116. package/dist/modules/workflows/api/definitions/[id]/draft/route.js +286 -0
  117. package/dist/modules/workflows/api/definitions/[id]/draft/route.js.map +7 -0
  118. package/dist/modules/workflows/api/definitions/[id]/publish/route.js +207 -0
  119. package/dist/modules/workflows/api/definitions/[id]/publish/route.js.map +7 -0
  120. package/dist/modules/workflows/api/definitions/[id]/reset-to-code/route.js +5 -0
  121. package/dist/modules/workflows/api/definitions/[id]/reset-to-code/route.js.map +2 -2
  122. package/dist/modules/workflows/api/definitions/[id]/route.js +93 -9
  123. package/dist/modules/workflows/api/definitions/[id]/route.js.map +3 -3
  124. package/dist/modules/workflows/api/definitions/[id]/test-step/route.js +210 -0
  125. package/dist/modules/workflows/api/definitions/[id]/test-step/route.js.map +7 -0
  126. package/dist/modules/workflows/api/definitions/generate/route.js +233 -0
  127. package/dist/modules/workflows/api/definitions/generate/route.js.map +7 -0
  128. package/dist/modules/workflows/api/definitions/route.js +61 -113
  129. package/dist/modules/workflows/api/definitions/route.js.map +2 -2
  130. package/dist/modules/workflows/api/definitions/serialize.js +9 -0
  131. package/dist/modules/workflows/api/definitions/serialize.js.map +2 -2
  132. package/dist/modules/workflows/api/endpoints/route.js +69 -0
  133. package/dist/modules/workflows/api/endpoints/route.js.map +7 -0
  134. package/dist/modules/workflows/api/functions/route.js +73 -0
  135. package/dist/modules/workflows/api/functions/route.js.map +7 -0
  136. package/dist/modules/workflows/api/grantable-features/route.js +75 -0
  137. package/dist/modules/workflows/api/grantable-features/route.js.map +7 -0
  138. package/dist/modules/workflows/api/instances/[id]/context/route.js +180 -0
  139. package/dist/modules/workflows/api/instances/[id]/context/route.js.map +7 -0
  140. package/dist/modules/workflows/api/instances/[id]/rerun-step/route.js +184 -0
  141. package/dist/modules/workflows/api/instances/[id]/rerun-step/route.js.map +7 -0
  142. package/dist/modules/workflows/api/instances/[id]/retry/route.js +12 -2
  143. package/dist/modules/workflows/api/instances/[id]/retry/route.js.map +2 -2
  144. package/dist/modules/workflows/api/instances/[id]/step-through/route.js +148 -0
  145. package/dist/modules/workflows/api/instances/[id]/step-through/route.js.map +7 -0
  146. package/dist/modules/workflows/api/instances/[id]/steps/route.js +123 -0
  147. package/dist/modules/workflows/api/instances/[id]/steps/route.js.map +7 -0
  148. package/dist/modules/workflows/api/instances/[id]/would-do/route.js +172 -0
  149. package/dist/modules/workflows/api/instances/[id]/would-do/route.js.map +7 -0
  150. package/dist/modules/workflows/api/instances/bulk-replay/route.js +117 -0
  151. package/dist/modules/workflows/api/instances/bulk-replay/route.js.map +7 -0
  152. package/dist/modules/workflows/api/instances/failure-queue/route.js +165 -0
  153. package/dist/modules/workflows/api/instances/failure-queue/route.js.map +7 -0
  154. package/dist/modules/workflows/api/instances/route.js +94 -3
  155. package/dist/modules/workflows/api/instances/route.js.map +2 -2
  156. package/dist/modules/workflows/api/metrics/definitions/route.js +188 -0
  157. package/dist/modules/workflows/api/metrics/definitions/route.js.map +7 -0
  158. package/dist/modules/workflows/api/openapi.js +415 -4
  159. package/dist/modules/workflows/api/openapi.js.map +2 -2
  160. package/dist/modules/workflows/api/portal/tasks/[id]/complete/route.js +132 -0
  161. package/dist/modules/workflows/api/portal/tasks/[id]/complete/route.js.map +7 -0
  162. package/dist/modules/workflows/api/portal/tasks/[id]/route.js +97 -0
  163. package/dist/modules/workflows/api/portal/tasks/[id]/route.js.map +7 -0
  164. package/dist/modules/workflows/api/portal/tasks/route.js +126 -0
  165. package/dist/modules/workflows/api/portal/tasks/route.js.map +7 -0
  166. package/dist/modules/workflows/api/rule-usage/route.js +80 -0
  167. package/dist/modules/workflows/api/rule-usage/route.js.map +7 -0
  168. package/dist/modules/workflows/api/task-settings/route.js +107 -0
  169. package/dist/modules/workflows/api/task-settings/route.js.map +7 -0
  170. package/dist/modules/workflows/api/tasks/[id]/claim/route.js +27 -16
  171. package/dist/modules/workflows/api/tasks/[id]/claim/route.js.map +2 -2
  172. package/dist/modules/workflows/api/tasks/[id]/complete/route.js +40 -16
  173. package/dist/modules/workflows/api/tasks/[id]/complete/route.js.map +2 -2
  174. package/dist/modules/workflows/api/tasks/[id]/reassign/route.js +150 -0
  175. package/dist/modules/workflows/api/tasks/[id]/reassign/route.js.map +7 -0
  176. package/dist/modules/workflows/api/tasks/[id]/route.js +39 -6
  177. package/dist/modules/workflows/api/tasks/[id]/route.js.map +2 -2
  178. package/dist/modules/workflows/api/tasks/[id]/unclaim/route.js +100 -0
  179. package/dist/modules/workflows/api/tasks/[id]/unclaim/route.js.map +7 -0
  180. package/dist/modules/workflows/api/tasks/route.js +37 -6
  181. package/dist/modules/workflows/api/tasks/route.js.map +2 -2
  182. package/dist/modules/workflows/api/tasks/serialize.js +83 -0
  183. package/dist/modules/workflows/api/tasks/serialize.js.map +7 -0
  184. package/dist/modules/workflows/api/templates/route.js +69 -0
  185. package/dist/modules/workflows/api/templates/route.js.map +7 -0
  186. package/dist/modules/workflows/api/work-inbox/next/route.js +129 -0
  187. package/dist/modules/workflows/api/work-inbox/next/route.js.map +7 -0
  188. package/dist/modules/workflows/api/work-inbox/route.js +119 -0
  189. package/dist/modules/workflows/api/work-inbox/route.js.map +7 -0
  190. package/dist/modules/workflows/backend/config/workflows/page.js +10 -0
  191. package/dist/modules/workflows/backend/config/workflows/page.js.map +7 -0
  192. package/dist/modules/workflows/backend/config/workflows/page.meta.js +35 -0
  193. package/dist/modules/workflows/backend/config/workflows/page.meta.js.map +7 -0
  194. package/dist/modules/workflows/backend/definitions/[id]/page.js +6 -271
  195. package/dist/modules/workflows/backend/definitions/[id]/page.js.map +3 -3
  196. package/dist/modules/workflows/backend/definitions/create/page.js +7 -56
  197. package/dist/modules/workflows/backend/definitions/create/page.js.map +2 -2
  198. package/dist/modules/workflows/backend/definitions/create/page.meta.js +1 -1
  199. package/dist/modules/workflows/backend/definitions/create/page.meta.js.map +2 -2
  200. package/dist/modules/workflows/backend/definitions/page.js +131 -51
  201. package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
  202. package/dist/modules/workflows/backend/definitions/visual-editor/page.js +2606 -677
  203. package/dist/modules/workflows/backend/definitions/visual-editor/page.js.map +3 -3
  204. package/dist/modules/workflows/backend/instances/[id]/page.js +532 -421
  205. package/dist/modules/workflows/backend/instances/[id]/page.js.map +2 -2
  206. package/dist/modules/workflows/backend/instances/[id]/page.meta.js +1 -1
  207. package/dist/modules/workflows/backend/instances/[id]/page.meta.js.map +1 -1
  208. package/dist/modules/workflows/backend/instances/failure-queue/page.js +211 -0
  209. package/dist/modules/workflows/backend/instances/failure-queue/page.js.map +7 -0
  210. package/dist/modules/workflows/backend/instances/failure-queue/page.meta.js +20 -0
  211. package/dist/modules/workflows/backend/instances/failure-queue/page.meta.js.map +7 -0
  212. package/dist/modules/workflows/backend/instances/page.js +159 -22
  213. package/dist/modules/workflows/backend/instances/page.js.map +2 -2
  214. package/dist/modules/workflows/backend/instances/page.meta.js +1 -1
  215. package/dist/modules/workflows/backend/instances/page.meta.js.map +1 -1
  216. package/dist/modules/workflows/backend/tasks/[id]/page.js +553 -392
  217. package/dist/modules/workflows/backend/tasks/[id]/page.js.map +3 -3
  218. package/dist/modules/workflows/backend/tasks/page.js +8 -250
  219. package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
  220. package/dist/modules/workflows/backend/tasks/page.meta.js +1 -0
  221. package/dist/modules/workflows/backend/tasks/page.meta.js.map +2 -2
  222. package/dist/modules/workflows/backend/work-inbox/page.js +399 -0
  223. package/dist/modules/workflows/backend/work-inbox/page.js.map +7 -0
  224. package/dist/modules/workflows/backend/work-inbox/page.meta.js +19 -0
  225. package/dist/modules/workflows/backend/work-inbox/page.meta.js.map +7 -0
  226. package/dist/modules/workflows/cli.js +1 -1
  227. package/dist/modules/workflows/cli.js.map +2 -2
  228. package/dist/modules/workflows/commands/tasks.js +81 -0
  229. package/dist/modules/workflows/commands/tasks.js.map +7 -0
  230. package/dist/modules/workflows/components/ActivitiesEditor.js +281 -287
  231. package/dist/modules/workflows/components/ActivitiesEditor.js.map +2 -2
  232. package/dist/modules/workflows/components/ActivityEditDialog.js +220 -0
  233. package/dist/modules/workflows/components/ActivityEditDialog.js.map +7 -0
  234. package/dist/modules/workflows/components/AgentSelector.js +115 -0
  235. package/dist/modules/workflows/components/AgentSelector.js.map +7 -0
  236. package/dist/modules/workflows/components/AnnotationEditDialog.js +110 -0
  237. package/dist/modules/workflows/components/AnnotationEditDialog.js.map +7 -0
  238. package/dist/modules/workflows/components/BusinessRuleUsagePanel.js +71 -0
  239. package/dist/modules/workflows/components/BusinessRuleUsagePanel.js.map +7 -0
  240. package/dist/modules/workflows/components/BusinessRulesSelector.js +151 -93
  241. package/dist/modules/workflows/components/BusinessRulesSelector.js.map +2 -2
  242. package/dist/modules/workflows/components/ConfigJsonTextarea.js +85 -0
  243. package/dist/modules/workflows/components/ConfigJsonTextarea.js.map +7 -0
  244. package/dist/modules/workflows/components/ContextSchemaEditor.js +150 -0
  245. package/dist/modules/workflows/components/ContextSchemaEditor.js.map +7 -0
  246. package/dist/modules/workflows/components/DefinitionErrorHandlerField.js +102 -0
  247. package/dist/modules/workflows/components/DefinitionErrorHandlerField.js.map +7 -0
  248. package/dist/modules/workflows/components/DefinitionMetadataDrawer.js +377 -0
  249. package/dist/modules/workflows/components/DefinitionMetadataDrawer.js.map +7 -0
  250. package/dist/modules/workflows/components/DefinitionMetricsCells.js +132 -0
  251. package/dist/modules/workflows/components/DefinitionMetricsCells.js.map +7 -0
  252. package/dist/modules/workflows/components/DefinitionTriggersEditor.js +307 -216
  253. package/dist/modules/workflows/components/DefinitionTriggersEditor.js.map +2 -2
  254. package/dist/modules/workflows/components/EdgeEditDialog.js +11 -18
  255. package/dist/modules/workflows/components/EdgeEditDialog.js.map +2 -2
  256. package/dist/modules/workflows/components/EdgeEditDialogCrudForm.js +112 -72
  257. package/dist/modules/workflows/components/EdgeEditDialogCrudForm.js.map +2 -2
  258. package/dist/modules/workflows/components/InputDataPanel.js +128 -0
  259. package/dist/modules/workflows/components/InputDataPanel.js.map +7 -0
  260. package/dist/modules/workflows/components/InspectorPanel.js +161 -0
  261. package/dist/modules/workflows/components/InspectorPanel.js.map +7 -0
  262. package/dist/modules/workflows/components/NodeEditDialog.js +363 -41
  263. package/dist/modules/workflows/components/NodeEditDialog.js.map +2 -2
  264. package/dist/modules/workflows/components/NodeEditDialogCrudForm.js +714 -159
  265. package/dist/modules/workflows/components/NodeEditDialogCrudForm.js.map +2 -2
  266. package/dist/modules/workflows/components/StepsEditor.js.map +2 -2
  267. package/dist/modules/workflows/components/TemplateGalleryDialog.js +148 -0
  268. package/dist/modules/workflows/components/TemplateGalleryDialog.js.map +7 -0
  269. package/dist/modules/workflows/components/TransitionsEditor.js +80 -74
  270. package/dist/modules/workflows/components/TransitionsEditor.js.map +2 -2
  271. package/dist/modules/workflows/components/TriggersDialog.js +53 -0
  272. package/dist/modules/workflows/components/TriggersDialog.js.map +7 -0
  273. package/dist/modules/workflows/components/TriggersEditor.js +331 -0
  274. package/dist/modules/workflows/components/TriggersEditor.js.map +7 -0
  275. package/dist/modules/workflows/components/WorkflowAiDraftDialog.js +278 -0
  276. package/dist/modules/workflows/components/WorkflowAiDraftDialog.js.map +7 -0
  277. package/dist/modules/workflows/components/WorkflowCodeView.js +173 -0
  278. package/dist/modules/workflows/components/WorkflowCodeView.js.map +7 -0
  279. package/dist/modules/workflows/components/WorkflowCommandPalette.js +62 -0
  280. package/dist/modules/workflows/components/WorkflowCommandPalette.js.map +7 -0
  281. package/dist/modules/workflows/components/WorkflowCompensationGhostEdge.js +70 -0
  282. package/dist/modules/workflows/components/WorkflowCompensationGhostEdge.js.map +7 -0
  283. package/dist/modules/workflows/components/WorkflowDataMappingEdge.js +36 -0
  284. package/dist/modules/workflows/components/WorkflowDataMappingEdge.js.map +7 -0
  285. package/dist/modules/workflows/components/WorkflowGraph.js +4 -2
  286. package/dist/modules/workflows/components/WorkflowGraph.js.map +2 -2
  287. package/dist/modules/workflows/components/WorkflowGraphImpl.js +324 -86
  288. package/dist/modules/workflows/components/WorkflowGraphImpl.js.map +3 -3
  289. package/dist/modules/workflows/components/WorkflowIconPicker.js +109 -0
  290. package/dist/modules/workflows/components/WorkflowIconPicker.js.map +7 -0
  291. package/dist/modules/workflows/components/WorkflowLegend.js +45 -29
  292. package/dist/modules/workflows/components/WorkflowLegend.js.map +2 -2
  293. package/dist/modules/workflows/components/WorkflowNodeCard.js +221 -22
  294. package/dist/modules/workflows/components/WorkflowNodeCard.js.map +2 -2
  295. package/dist/modules/workflows/components/WorkflowRouteChips.js +111 -0
  296. package/dist/modules/workflows/components/WorkflowRouteChips.js.map +7 -0
  297. package/dist/modules/workflows/components/WorkflowSelector.js +108 -88
  298. package/dist/modules/workflows/components/WorkflowSelector.js.map +2 -2
  299. package/dist/modules/workflows/components/WorkflowTransitionEdge.js +61 -11
  300. package/dist/modules/workflows/components/WorkflowTransitionEdge.js.map +2 -2
  301. package/dist/modules/workflows/components/WorkflowTransitionLabel.js +15 -5
  302. package/dist/modules/workflows/components/WorkflowTransitionLabel.js.map +2 -2
  303. package/dist/modules/workflows/components/fields/ActivityArrayEditor.js +88 -21
  304. package/dist/modules/workflows/components/fields/ActivityArrayEditor.js.map +2 -2
  305. package/dist/modules/workflows/components/fields/ActivityConfigFields.js +615 -0
  306. package/dist/modules/workflows/components/fields/ActivityConfigFields.js.map +7 -0
  307. package/dist/modules/workflows/components/fields/ActivityTestPanel.js +191 -0
  308. package/dist/modules/workflows/components/fields/ActivityTestPanel.js.map +7 -0
  309. package/dist/modules/workflows/components/fields/AgentInvokeConfigField.js +488 -0
  310. package/dist/modules/workflows/components/fields/AgentInvokeConfigField.js.map +7 -0
  311. package/dist/modules/workflows/components/fields/AgentReviewOnBreachField.js +61 -0
  312. package/dist/modules/workflows/components/fields/AgentReviewOnBreachField.js.map +7 -0
  313. package/dist/modules/workflows/components/fields/BranchingRoutesEditor.js +227 -0
  314. package/dist/modules/workflows/components/fields/BranchingRoutesEditor.js.map +7 -0
  315. package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js +37 -4
  316. package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js.map +2 -2
  317. package/dist/modules/workflows/components/fields/CommandPicker.js +111 -0
  318. package/dist/modules/workflows/components/fields/CommandPicker.js.map +7 -0
  319. package/dist/modules/workflows/components/fields/EndpointPicker.js +235 -0
  320. package/dist/modules/workflows/components/fields/EndpointPicker.js.map +7 -0
  321. package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js +2 -2
  322. package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js.map +2 -2
  323. package/dist/modules/workflows/components/fields/FunctionPicker.js +55 -0
  324. package/dist/modules/workflows/components/fields/FunctionPicker.js.map +7 -0
  325. package/dist/modules/workflows/components/fields/MappingArrayEditor.js +38 -15
  326. package/dist/modules/workflows/components/fields/MappingArrayEditor.js.map +2 -2
  327. package/dist/modules/workflows/components/fields/PortFieldArrayEditor.js +206 -0
  328. package/dist/modules/workflows/components/fields/PortFieldArrayEditor.js.map +7 -0
  329. package/dist/modules/workflows/components/fields/RolesMultiSelect.js +53 -0
  330. package/dist/modules/workflows/components/fields/RolesMultiSelect.js.map +7 -0
  331. package/dist/modules/workflows/components/fields/RouteOrderEditor.js +130 -0
  332. package/dist/modules/workflows/components/fields/RouteOrderEditor.js.map +7 -0
  333. package/dist/modules/workflows/components/fields/SchemaBuilderDialog.js +104 -0
  334. package/dist/modules/workflows/components/fields/SchemaBuilderDialog.js.map +7 -0
  335. package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js +2 -2
  336. package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js.map +2 -2
  337. package/dist/modules/workflows/components/fields/TaskAssignmentField.js +210 -0
  338. package/dist/modules/workflows/components/fields/TaskAssignmentField.js.map +7 -0
  339. package/dist/modules/workflows/components/fields/TaskDeadlineFields.js +126 -0
  340. package/dist/modules/workflows/components/fields/TaskDeadlineFields.js.map +7 -0
  341. package/dist/modules/workflows/components/fields/TaskDecisionsField.js +218 -0
  342. package/dist/modules/workflows/components/fields/TaskDecisionsField.js.map +7 -0
  343. package/dist/modules/workflows/components/fields/TaskEntityBindingsField.js +114 -0
  344. package/dist/modules/workflows/components/fields/TaskEntityBindingsField.js.map +7 -0
  345. package/dist/modules/workflows/components/fields/TemplateTextControl.js +64 -0
  346. package/dist/modules/workflows/components/fields/TemplateTextControl.js.map +7 -0
  347. package/dist/modules/workflows/components/fields/VariablePickerButton.js +121 -0
  348. package/dist/modules/workflows/components/fields/VariablePickerButton.js.map +7 -0
  349. package/dist/modules/workflows/components/fields/ledgerDropTarget.js +35 -0
  350. package/dist/modules/workflows/components/fields/ledgerDropTarget.js.map +7 -0
  351. package/dist/modules/workflows/components/fields/useActivityTypeOptions.js +16 -0
  352. package/dist/modules/workflows/components/fields/useActivityTypeOptions.js.map +7 -0
  353. package/dist/modules/workflows/components/formConfig.js +39 -10
  354. package/dist/modules/workflows/components/formConfig.js.map +2 -2
  355. package/dist/modules/workflows/components/mobile/MobileDefinitionDetail.js.map +2 -2
  356. package/dist/modules/workflows/components/mobile/MobileMetadataSheet.js.map +2 -2
  357. package/dist/modules/workflows/components/mobile/MobileTaskForm.js +29 -2
  358. package/dist/modules/workflows/components/mobile/MobileTaskForm.js.map +2 -2
  359. package/dist/modules/workflows/components/mobile/MobileVisualEditor.js +64 -65
  360. package/dist/modules/workflows/components/mobile/MobileVisualEditor.js.map +2 -2
  361. package/dist/modules/workflows/components/nodes/AnnotationGroupNode.js +64 -0
  362. package/dist/modules/workflows/components/nodes/AnnotationGroupNode.js.map +7 -0
  363. package/dist/modules/workflows/components/nodes/AutomatedNode.js +24 -16
  364. package/dist/modules/workflows/components/nodes/AutomatedNode.js.map +2 -2
  365. package/dist/modules/workflows/components/nodes/EndNode.js +13 -12
  366. package/dist/modules/workflows/components/nodes/EndNode.js.map +2 -2
  367. package/dist/modules/workflows/components/nodes/ErrorOutputHandle.js +29 -0
  368. package/dist/modules/workflows/components/nodes/ErrorOutputHandle.js.map +7 -0
  369. package/dist/modules/workflows/components/nodes/IfElseNode.js +51 -0
  370. package/dist/modules/workflows/components/nodes/IfElseNode.js.map +7 -0
  371. package/dist/modules/workflows/components/nodes/InvokeAgentNode.js +122 -0
  372. package/dist/modules/workflows/components/nodes/InvokeAgentNode.js.map +7 -0
  373. package/dist/modules/workflows/components/nodes/NodeOutcomeRows.js +100 -0
  374. package/dist/modules/workflows/components/nodes/NodeOutcomeRows.js.map +7 -0
  375. package/dist/modules/workflows/components/nodes/ParallelForkNode.js +18 -14
  376. package/dist/modules/workflows/components/nodes/ParallelForkNode.js.map +2 -2
  377. package/dist/modules/workflows/components/nodes/ParallelJoinNode.js +18 -14
  378. package/dist/modules/workflows/components/nodes/ParallelJoinNode.js.map +2 -2
  379. package/dist/modules/workflows/components/nodes/StartNode.js +66 -15
  380. package/dist/modules/workflows/components/nodes/StartNode.js.map +2 -2
  381. package/dist/modules/workflows/components/nodes/StickyNoteNode.js +54 -0
  382. package/dist/modules/workflows/components/nodes/StickyNoteNode.js.map +7 -0
  383. package/dist/modules/workflows/components/nodes/SubWorkflowNode.js +107 -41
  384. package/dist/modules/workflows/components/nodes/SubWorkflowNode.js.map +2 -2
  385. package/dist/modules/workflows/components/nodes/SwitchNode.js +51 -0
  386. package/dist/modules/workflows/components/nodes/SwitchNode.js.map +7 -0
  387. package/dist/modules/workflows/components/nodes/TriggerCap.js +65 -0
  388. package/dist/modules/workflows/components/nodes/TriggerCap.js.map +7 -0
  389. package/dist/modules/workflows/components/nodes/TriggerNode.js +111 -0
  390. package/dist/modules/workflows/components/nodes/TriggerNode.js.map +7 -0
  391. package/dist/modules/workflows/components/nodes/UserTaskNode.js +43 -17
  392. package/dist/modules/workflows/components/nodes/UserTaskNode.js.map +2 -2
  393. package/dist/modules/workflows/components/nodes/WaitForConditionNode.js +53 -0
  394. package/dist/modules/workflows/components/nodes/WaitForConditionNode.js.map +7 -0
  395. package/dist/modules/workflows/components/nodes/WaitForSignalNode.js +21 -15
  396. package/dist/modules/workflows/components/nodes/WaitForSignalNode.js.map +2 -2
  397. package/dist/modules/workflows/components/nodes/WaitForTimerNode.js +21 -15
  398. package/dist/modules/workflows/components/nodes/WaitForTimerNode.js.map +2 -2
  399. package/dist/modules/workflows/components/nodes/index.js +14 -0
  400. package/dist/modules/workflows/components/nodes/index.js.map +2 -2
  401. package/dist/modules/workflows/components/portal/PortalTaskForm.js +196 -0
  402. package/dist/modules/workflows/components/portal/PortalTaskForm.js.map +7 -0
  403. package/dist/modules/workflows/components/run/AgentActivityPanel.js +22 -0
  404. package/dist/modules/workflows/components/run/AgentActivityPanel.js.map +7 -0
  405. package/dist/modules/workflows/components/run/RerunStepDialog.js +106 -0
  406. package/dist/modules/workflows/components/run/RerunStepDialog.js.map +7 -0
  407. package/dist/modules/workflows/components/run/RunEventBadge.js +30 -0
  408. package/dist/modules/workflows/components/run/RunEventBadge.js.map +7 -0
  409. package/dist/modules/workflows/components/run/RunGantt.js +130 -0
  410. package/dist/modules/workflows/components/run/RunGantt.js.map +7 -0
  411. package/dist/modules/workflows/components/run/RunStatusBadge.js +82 -0
  412. package/dist/modules/workflows/components/run/RunStatusBadge.js.map +7 -0
  413. package/dist/modules/workflows/components/run/RunStepInspector.js +116 -0
  414. package/dist/modules/workflows/components/run/RunStepInspector.js.map +7 -0
  415. package/dist/modules/workflows/components/run/WouldDoReport.js +52 -0
  416. package/dist/modules/workflows/components/run/WouldDoReport.js.map +7 -0
  417. package/dist/modules/workflows/components/run/useAgentLabels.js +28 -0
  418. package/dist/modules/workflows/components/run/useAgentLabels.js.map +7 -0
  419. package/dist/modules/workflows/components/run/useLastRunOverlay.js +89 -0
  420. package/dist/modules/workflows/components/run/useLastRunOverlay.js.map +7 -0
  421. package/dist/modules/workflows/components/run/useLiveAgentActions.js +41 -0
  422. package/dist/modules/workflows/components/run/useLiveAgentActions.js.map +7 -0
  423. package/dist/modules/workflows/components/run/useLiveRunUpdates.js +57 -0
  424. package/dist/modules/workflows/components/run/useLiveRunUpdates.js.map +7 -0
  425. package/dist/modules/workflows/components/settings/CommandSettingsPageClient.js +156 -0
  426. package/dist/modules/workflows/components/settings/CommandSettingsPageClient.js.map +7 -0
  427. package/dist/modules/workflows/components/work-inbox/EntityContextPanel.js +72 -0
  428. package/dist/modules/workflows/components/work-inbox/EntityContextPanel.js.map +7 -0
  429. package/dist/modules/workflows/components/work-inbox/ReassignTaskDialog.js +156 -0
  430. package/dist/modules/workflows/components/work-inbox/ReassignTaskDialog.js.map +7 -0
  431. package/dist/modules/workflows/components/work-inbox/StatusChip.js +46 -0
  432. package/dist/modules/workflows/components/work-inbox/StatusChip.js.map +7 -0
  433. package/dist/modules/workflows/components/work-inbox/TaskActionNotice.js +53 -0
  434. package/dist/modules/workflows/components/work-inbox/TaskActionNotice.js.map +7 -0
  435. package/dist/modules/workflows/components/work-inbox/TaskFormFields.js +261 -0
  436. package/dist/modules/workflows/components/work-inbox/TaskFormFields.js.map +7 -0
  437. package/dist/modules/workflows/components/work-inbox/WorkInboxEmptyState.js +27 -0
  438. package/dist/modules/workflows/components/work-inbox/WorkInboxEmptyState.js.map +7 -0
  439. package/dist/modules/workflows/data/activity-config-schemas.js +191 -0
  440. package/dist/modules/workflows/data/activity-config-schemas.js.map +7 -0
  441. package/dist/modules/workflows/data/activity-config-warnings.js +42 -0
  442. package/dist/modules/workflows/data/activity-config-warnings.js.map +7 -0
  443. package/dist/modules/workflows/data/branching-route-warnings.js +65 -0
  444. package/dist/modules/workflows/data/branching-route-warnings.js.map +7 -0
  445. package/dist/modules/workflows/data/entities.js +144 -4
  446. package/dist/modules/workflows/data/entities.js.map +2 -2
  447. package/dist/modules/workflows/data/metrics-validators.js +35 -0
  448. package/dist/modules/workflows/data/metrics-validators.js.map +7 -0
  449. package/dist/modules/workflows/data/task-primitives.js +14 -0
  450. package/dist/modules/workflows/data/task-primitives.js.map +7 -0
  451. package/dist/modules/workflows/data/validators.js +504 -61
  452. package/dist/modules/workflows/data/validators.js.map +3 -3
  453. package/dist/modules/workflows/di.js +16 -1
  454. package/dist/modules/workflows/di.js.map +2 -2
  455. package/dist/modules/workflows/events.js +66 -8
  456. package/dist/modules/workflows/events.js.map +2 -2
  457. package/dist/modules/workflows/examples/oze-residential-install-60-nodes.json +1545 -0
  458. package/dist/modules/workflows/examples/sales-pipeline-definition.json +35 -35
  459. package/dist/modules/workflows/examples/templates/lead-to-install.json +160 -0
  460. package/dist/modules/workflows/examples/templates/order-approval.json +230 -0
  461. package/dist/modules/workflows/examples/templates/task-escalation.json +110 -0
  462. package/dist/modules/workflows/examples/templates/webhook-integration.json +113 -0
  463. package/dist/modules/workflows/extension-points.js +1 -1
  464. package/dist/modules/workflows/extension-points.js.map +2 -2
  465. package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/[id]/page.js +144 -0
  466. package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/[id]/page.js.map +7 -0
  467. package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/[id]/page.meta.js +12 -0
  468. package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/[id]/page.meta.js.map +7 -0
  469. package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/page.js +114 -0
  470. package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/page.js.map +7 -0
  471. package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/page.meta.js +18 -0
  472. package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/page.meta.js.map +7 -0
  473. package/dist/modules/workflows/lib/activity-executor.js +505 -137
  474. package/dist/modules/workflows/lib/activity-executor.js.map +3 -3
  475. package/dist/modules/workflows/lib/activity-queue-types.js +3 -1
  476. package/dist/modules/workflows/lib/activity-queue-types.js.map +2 -2
  477. package/dist/modules/workflows/lib/activity-registry-bootstrap.js +2 -0
  478. package/dist/modules/workflows/lib/activity-registry-bootstrap.js.map +7 -0
  479. package/dist/modules/workflows/lib/activity-registry.js +27 -0
  480. package/dist/modules/workflows/lib/activity-registry.js.map +7 -0
  481. package/dist/modules/workflows/lib/activity-types.js +291 -0
  482. package/dist/modules/workflows/lib/activity-types.js.map +7 -0
  483. package/dist/modules/workflows/lib/activity-worker-handler.js +456 -32
  484. package/dist/modules/workflows/lib/activity-worker-handler.js.map +3 -3
  485. package/dist/modules/workflows/lib/advanced-config.js +31 -0
  486. package/dist/modules/workflows/lib/advanced-config.js.map +7 -0
  487. package/dist/modules/workflows/lib/agent-disposition-task.js +198 -0
  488. package/dist/modules/workflows/lib/agent-disposition-task.js.map +7 -0
  489. package/dist/modules/workflows/lib/agent-outcome-paths.js +82 -0
  490. package/dist/modules/workflows/lib/agent-outcome-paths.js.map +7 -0
  491. package/dist/modules/workflows/lib/agent-result-mapping.js +54 -0
  492. package/dist/modules/workflows/lib/agent-result-mapping.js.map +7 -0
  493. package/dist/modules/workflows/lib/agent-review-inspector.js +61 -0
  494. package/dist/modules/workflows/lib/agent-review-inspector.js.map +7 -0
  495. package/dist/modules/workflows/lib/agent-review.js +66 -0
  496. package/dist/modules/workflows/lib/agent-review.js.map +7 -0
  497. package/dist/modules/workflows/lib/ai-authoring.js +155 -0
  498. package/dist/modules/workflows/lib/ai-authoring.js.map +7 -0
  499. package/dist/modules/workflows/lib/ai-draft-runner.js +43 -0
  500. package/dist/modules/workflows/lib/ai-draft-runner.js.map +7 -0
  501. package/dist/modules/workflows/lib/annotation-events.js +10 -0
  502. package/dist/modules/workflows/lib/annotation-events.js.map +7 -0
  503. package/dist/modules/workflows/lib/branching-routes.js +182 -0
  504. package/dist/modules/workflows/lib/branching-routes.js.map +7 -0
  505. package/dist/modules/workflows/lib/breach-routing.js +50 -0
  506. package/dist/modules/workflows/lib/breach-routing.js.map +7 -0
  507. package/dist/modules/workflows/lib/bulk-replay.js +101 -0
  508. package/dist/modules/workflows/lib/bulk-replay.js.map +7 -0
  509. package/dist/modules/workflows/lib/business-rule-usage.js +91 -0
  510. package/dist/modules/workflows/lib/business-rule-usage.js.map +7 -0
  511. package/dist/modules/workflows/lib/caller-graph.js +53 -0
  512. package/dist/modules/workflows/lib/caller-graph.js.map +7 -0
  513. package/dist/modules/workflows/lib/code-view-apply.js +86 -0
  514. package/dist/modules/workflows/lib/code-view-apply.js.map +7 -0
  515. package/dist/modules/workflows/lib/collect-validation-issues.js +164 -0
  516. package/dist/modules/workflows/lib/collect-validation-issues.js.map +7 -0
  517. package/dist/modules/workflows/lib/compensation-ghosts.js +72 -0
  518. package/dist/modules/workflows/lib/compensation-ghosts.js.map +7 -0
  519. package/dist/modules/workflows/lib/component-guard.js +7 -0
  520. package/dist/modules/workflows/lib/component-guard.js.map +7 -0
  521. package/dist/modules/workflows/lib/condition-handler.js +443 -0
  522. package/dist/modules/workflows/lib/condition-handler.js.map +7 -0
  523. package/dist/modules/workflows/lib/context-ledger.js +448 -0
  524. package/dist/modules/workflows/lib/context-ledger.js.map +7 -0
  525. package/dist/modules/workflows/lib/crud-form-dialogs-flag.js +8 -0
  526. package/dist/modules/workflows/lib/crud-form-dialogs-flag.js.map +7 -0
  527. package/dist/modules/workflows/lib/data-edge-mapping.js +63 -0
  528. package/dist/modules/workflows/lib/data-edge-mapping.js.map +7 -0
  529. package/dist/modules/workflows/lib/definition-context-schema.js +56 -0
  530. package/dist/modules/workflows/lib/definition-context-schema.js.map +7 -0
  531. package/dist/modules/workflows/lib/definition-edit-safety.js +123 -0
  532. package/dist/modules/workflows/lib/definition-edit-safety.js.map +7 -0
  533. package/dist/modules/workflows/lib/definition-error-body.js +33 -0
  534. package/dist/modules/workflows/lib/definition-error-body.js.map +7 -0
  535. package/dist/modules/workflows/lib/definition-evaluation.js +79 -0
  536. package/dist/modules/workflows/lib/definition-evaluation.js.map +7 -0
  537. package/dist/modules/workflows/lib/definition-grant.js +90 -0
  538. package/dist/modules/workflows/lib/definition-grant.js.map +7 -0
  539. package/dist/modules/workflows/lib/definition-json-locations.js +139 -0
  540. package/dist/modules/workflows/lib/definition-json-locations.js.map +7 -0
  541. package/dist/modules/workflows/lib/definition-payload.js +31 -0
  542. package/dist/modules/workflows/lib/definition-payload.js.map +7 -0
  543. package/dist/modules/workflows/lib/draft-restore.js +49 -0
  544. package/dist/modules/workflows/lib/draft-restore.js.map +7 -0
  545. package/dist/modules/workflows/lib/dry-run.js +106 -0
  546. package/dist/modules/workflows/lib/dry-run.js.map +7 -0
  547. package/dist/modules/workflows/lib/duration.js +66 -17
  548. package/dist/modules/workflows/lib/duration.js.map +2 -2
  549. package/dist/modules/workflows/lib/edge-reattachment.js +79 -0
  550. package/dist/modules/workflows/lib/edge-reattachment.js.map +7 -0
  551. package/dist/modules/workflows/lib/edgeFormTransforms.js +7 -11
  552. package/dist/modules/workflows/lib/edgeFormTransforms.js.map +2 -2
  553. package/dist/modules/workflows/lib/editor-annotations.js +195 -0
  554. package/dist/modules/workflows/lib/editor-annotations.js.map +7 -0
  555. package/dist/modules/workflows/lib/editor-commands.js +103 -0
  556. package/dist/modules/workflows/lib/editor-commands.js.map +7 -0
  557. package/dist/modules/workflows/lib/editor-history.js +51 -0
  558. package/dist/modules/workflows/lib/editor-history.js.map +7 -0
  559. package/dist/modules/workflows/lib/endpoint-catalog.js +181 -0
  560. package/dist/modules/workflows/lib/endpoint-catalog.js.map +7 -0
  561. package/dist/modules/workflows/lib/endpoint-path.js +90 -0
  562. package/dist/modules/workflows/lib/endpoint-path.js.map +7 -0
  563. package/dist/modules/workflows/lib/engine-version.js +42 -0
  564. package/dist/modules/workflows/lib/engine-version.js.map +7 -0
  565. package/dist/modules/workflows/lib/error-handler.js +132 -0
  566. package/dist/modules/workflows/lib/error-handler.js.map +7 -0
  567. package/dist/modules/workflows/lib/error-routing.js +104 -0
  568. package/dist/modules/workflows/lib/error-routing.js.map +7 -0
  569. package/dist/modules/workflows/lib/event-logger.js +23 -0
  570. package/dist/modules/workflows/lib/event-logger.js.map +2 -2
  571. package/dist/modules/workflows/lib/expression-refs.js +168 -0
  572. package/dist/modules/workflows/lib/expression-refs.js.map +7 -0
  573. package/dist/modules/workflows/lib/failure-grouping.js +62 -0
  574. package/dist/modules/workflows/lib/failure-grouping.js.map +7 -0
  575. package/dist/modules/workflows/lib/find-definition.js +1 -0
  576. package/dist/modules/workflows/lib/find-definition.js.map +2 -2
  577. package/dist/modules/workflows/lib/flow-logic-warnings.js +338 -0
  578. package/dist/modules/workflows/lib/flow-logic-warnings.js.map +7 -0
  579. package/dist/modules/workflows/lib/graph-utils.js +328 -77
  580. package/dist/modules/workflows/lib/graph-utils.js.map +2 -2
  581. package/dist/modules/workflows/lib/icon-search.js +32 -0
  582. package/dist/modules/workflows/lib/icon-search.js.map +7 -0
  583. package/dist/modules/workflows/lib/insert-at-cursor.js +26 -0
  584. package/dist/modules/workflows/lib/insert-at-cursor.js.map +7 -0
  585. package/dist/modules/workflows/lib/instance-date-filter.js +28 -0
  586. package/dist/modules/workflows/lib/instance-date-filter.js.map +7 -0
  587. package/dist/modules/workflows/lib/interpolation-pipeline.js +271 -0
  588. package/dist/modules/workflows/lib/interpolation-pipeline.js.map +7 -0
  589. package/dist/modules/workflows/lib/ledger-drag.js +28 -0
  590. package/dist/modules/workflows/lib/ledger-drag.js.map +7 -0
  591. package/dist/modules/workflows/lib/ledger-entry-display.js +66 -0
  592. package/dist/modules/workflows/lib/ledger-entry-display.js.map +7 -0
  593. package/dist/modules/workflows/lib/ledger-schema-flatten.js +82 -0
  594. package/dist/modules/workflows/lib/ledger-schema-flatten.js.map +7 -0
  595. package/dist/modules/workflows/lib/metrics/definition-metrics.js +110 -0
  596. package/dist/modules/workflows/lib/metrics/definition-metrics.js.map +7 -0
  597. package/dist/modules/workflows/lib/metrics/metrics-display.js +26 -0
  598. package/dist/modules/workflows/lib/metrics/metrics-display.js.map +7 -0
  599. package/dist/modules/workflows/lib/metrics/rollup-schedule.js +7 -0
  600. package/dist/modules/workflows/lib/metrics/rollup-schedule.js.map +7 -0
  601. package/dist/modules/workflows/lib/metrics/rollup-service.js +160 -0
  602. package/dist/modules/workflows/lib/metrics/rollup-service.js.map +7 -0
  603. package/dist/modules/workflows/lib/node-config-summary.js +128 -0
  604. package/dist/modules/workflows/lib/node-config-summary.js.map +7 -0
  605. package/dist/modules/workflows/lib/node-geometry.js +53 -0
  606. package/dist/modules/workflows/lib/node-geometry.js.map +7 -0
  607. package/dist/modules/workflows/lib/node-nudge.js +44 -0
  608. package/dist/modules/workflows/lib/node-nudge.js.map +7 -0
  609. package/dist/modules/workflows/lib/node-outcome-rows.js +88 -0
  610. package/dist/modules/workflows/lib/node-outcome-rows.js.map +7 -0
  611. package/dist/modules/workflows/lib/node-placement.js +55 -0
  612. package/dist/modules/workflows/lib/node-placement.js.map +7 -0
  613. package/dist/modules/workflows/lib/node-type-icons.js +54 -13
  614. package/dist/modules/workflows/lib/node-type-icons.js.map +2 -2
  615. package/dist/modules/workflows/lib/nodeFormTransforms.js +329 -19
  616. package/dist/modules/workflows/lib/nodeFormTransforms.js.map +2 -2
  617. package/dist/modules/workflows/lib/outcome-routing.js +158 -0
  618. package/dist/modules/workflows/lib/outcome-routing.js.map +7 -0
  619. package/dist/modules/workflows/lib/owned-definition.js +107 -0
  620. package/dist/modules/workflows/lib/owned-definition.js.map +7 -0
  621. package/dist/modules/workflows/lib/owned-node-changes.js +10 -0
  622. package/dist/modules/workflows/lib/owned-node-changes.js.map +7 -0
  623. package/dist/modules/workflows/lib/palette-drag.js +36 -0
  624. package/dist/modules/workflows/lib/palette-drag.js.map +7 -0
  625. package/dist/modules/workflows/lib/palette-drop.js +45 -0
  626. package/dist/modules/workflows/lib/palette-drop.js.map +7 -0
  627. package/dist/modules/workflows/lib/parallel-handler.js +57 -2
  628. package/dist/modules/workflows/lib/parallel-handler.js.map +2 -2
  629. package/dist/modules/workflows/lib/port-contract.js +54 -0
  630. package/dist/modules/workflows/lib/port-contract.js.map +7 -0
  631. package/dist/modules/workflows/lib/portal-task-access.js +89 -0
  632. package/dist/modules/workflows/lib/portal-task-access.js.map +7 -0
  633. package/dist/modules/workflows/lib/rerun-from-step.js +65 -0
  634. package/dist/modules/workflows/lib/rerun-from-step.js.map +7 -0
  635. package/dist/modules/workflows/lib/route-chip-events.js +23 -0
  636. package/dist/modules/workflows/lib/route-chip-events.js.map +7 -0
  637. package/dist/modules/workflows/lib/route-chips.js +91 -0
  638. package/dist/modules/workflows/lib/route-chips.js.map +7 -0
  639. package/dist/modules/workflows/lib/route-edge.js +17 -0
  640. package/dist/modules/workflows/lib/route-edge.js.map +7 -0
  641. package/dist/modules/workflows/lib/route-kinds.js +67 -0
  642. package/dist/modules/workflows/lib/route-kinds.js.map +7 -0
  643. package/dist/modules/workflows/lib/route-priority.js +104 -0
  644. package/dist/modules/workflows/lib/route-priority.js.map +7 -0
  645. package/dist/modules/workflows/lib/run-duration.js +44 -0
  646. package/dist/modules/workflows/lib/run-duration.js.map +7 -0
  647. package/dist/modules/workflows/lib/run-event-tone.js +25 -0
  648. package/dist/modules/workflows/lib/run-event-tone.js.map +7 -0
  649. package/dist/modules/workflows/lib/run-execution.js +305 -0
  650. package/dist/modules/workflows/lib/run-execution.js.map +7 -0
  651. package/dist/modules/workflows/lib/run-gantt.js +180 -0
  652. package/dist/modules/workflows/lib/run-gantt.js.map +7 -0
  653. package/dist/modules/workflows/lib/run-outcome-evidence.js +33 -0
  654. package/dist/modules/workflows/lib/run-outcome-evidence.js.map +7 -0
  655. package/dist/modules/workflows/lib/run-outcome.js +48 -0
  656. package/dist/modules/workflows/lib/run-outcome.js.map +7 -0
  657. package/dist/modules/workflows/lib/sample-resolver.js +71 -0
  658. package/dist/modules/workflows/lib/sample-resolver.js.map +7 -0
  659. package/dist/modules/workflows/lib/seeds.js +1 -1
  660. package/dist/modules/workflows/lib/seeds.js.map +2 -2
  661. package/dist/modules/workflows/lib/server-output-contract.js +65 -0
  662. package/dist/modules/workflows/lib/server-output-contract.js.map +7 -0
  663. package/dist/modules/workflows/lib/set-variable.js +47 -0
  664. package/dist/modules/workflows/lib/set-variable.js.map +7 -0
  665. package/dist/modules/workflows/lib/signal-handler.js +63 -4
  666. package/dist/modules/workflows/lib/signal-handler.js.map +2 -2
  667. package/dist/modules/workflows/lib/start-fixtures.js +42 -0
  668. package/dist/modules/workflows/lib/start-fixtures.js.map +7 -0
  669. package/dist/modules/workflows/lib/status-colors.js +153 -22
  670. package/dist/modules/workflows/lib/status-colors.js.map +2 -2
  671. package/dist/modules/workflows/lib/step-handler.js +529 -53
  672. package/dist/modules/workflows/lib/step-handler.js.map +3 -3
  673. package/dist/modules/workflows/lib/step-presentation.js +147 -0
  674. package/dist/modules/workflows/lib/step-presentation.js.map +7 -0
  675. package/dist/modules/workflows/lib/step-through.js +26 -0
  676. package/dist/modules/workflows/lib/step-through.js.map +7 -0
  677. package/dist/modules/workflows/lib/step-type-conversion.js +167 -0
  678. package/dist/modules/workflows/lib/step-type-conversion.js.map +7 -0
  679. package/dist/modules/workflows/lib/subgraph-clipboard.js +114 -0
  680. package/dist/modules/workflows/lib/subgraph-clipboard.js.map +7 -0
  681. package/dist/modules/workflows/lib/task-decision-context.js +38 -0
  682. package/dist/modules/workflows/lib/task-decision-context.js.map +7 -0
  683. package/dist/modules/workflows/lib/task-decisions.js +49 -0
  684. package/dist/modules/workflows/lib/task-decisions.js.map +7 -0
  685. package/dist/modules/workflows/lib/task-entity-access.js +62 -0
  686. package/dist/modules/workflows/lib/task-entity-access.js.map +7 -0
  687. package/dist/modules/workflows/lib/task-entity-aliases.js +39 -0
  688. package/dist/modules/workflows/lib/task-entity-aliases.js.map +7 -0
  689. package/dist/modules/workflows/lib/task-entity-types.js +36 -0
  690. package/dist/modules/workflows/lib/task-entity-types.js.map +7 -0
  691. package/dist/modules/workflows/lib/task-form-registry.js +33 -0
  692. package/dist/modules/workflows/lib/task-form-registry.js.map +7 -0
  693. package/dist/modules/workflows/lib/task-form-schema.js +75 -0
  694. package/dist/modules/workflows/lib/task-form-schema.js.map +7 -0
  695. package/dist/modules/workflows/lib/task-handler.js +251 -32
  696. package/dist/modules/workflows/lib/task-handler.js.map +2 -2
  697. package/dist/modules/workflows/lib/task-inspector-config.js +182 -0
  698. package/dist/modules/workflows/lib/task-inspector-config.js.map +7 -0
  699. package/dist/modules/workflows/lib/task-list-query.js +19 -0
  700. package/dist/modules/workflows/lib/task-list-query.js.map +7 -0
  701. package/dist/modules/workflows/lib/task-notifications.js +119 -0
  702. package/dist/modules/workflows/lib/task-notifications.js.map +7 -0
  703. package/dist/modules/workflows/lib/task-permission-settings.js +43 -0
  704. package/dist/modules/workflows/lib/task-permission-settings.js.map +7 -0
  705. package/dist/modules/workflows/lib/task-presets.js +35 -0
  706. package/dist/modules/workflows/lib/task-presets.js.map +7 -0
  707. package/dist/modules/workflows/lib/task-quick-action.js +45 -0
  708. package/dist/modules/workflows/lib/task-quick-action.js.map +7 -0
  709. package/dist/modules/workflows/lib/task-resolution.js +120 -0
  710. package/dist/modules/workflows/lib/task-resolution.js.map +7 -0
  711. package/dist/modules/workflows/lib/task-sla.js +357 -0
  712. package/dist/modules/workflows/lib/task-sla.js.map +7 -0
  713. package/dist/modules/workflows/lib/task-visibility-request.js +266 -0
  714. package/dist/modules/workflows/lib/task-visibility-request.js.map +7 -0
  715. package/dist/modules/workflows/lib/task-visibility.js +194 -0
  716. package/dist/modules/workflows/lib/task-visibility.js.map +7 -0
  717. package/dist/modules/workflows/lib/timer-handler.js +3 -1
  718. package/dist/modules/workflows/lib/timer-handler.js.map +2 -2
  719. package/dist/modules/workflows/lib/transition-handler.js +148 -20
  720. package/dist/modules/workflows/lib/transition-handler.js.map +2 -2
  721. package/dist/modules/workflows/lib/trigger-node.js +121 -0
  722. package/dist/modules/workflows/lib/trigger-node.js.map +7 -0
  723. package/dist/modules/workflows/lib/visual-editor-navigation.js +14 -0
  724. package/dist/modules/workflows/lib/visual-editor-navigation.js.map +7 -0
  725. package/dist/modules/workflows/lib/work-inbox/empty-state.js +52 -0
  726. package/dist/modules/workflows/lib/work-inbox/empty-state.js.map +7 -0
  727. package/dist/modules/workflows/lib/work-inbox/entity-links.js +63 -0
  728. package/dist/modules/workflows/lib/work-inbox/entity-links.js.map +7 -0
  729. package/dist/modules/workflows/lib/work-inbox/navigation.js +11 -0
  730. package/dist/modules/workflows/lib/work-inbox/navigation.js.map +7 -0
  731. package/dist/modules/workflows/lib/work-inbox/presentation.js +90 -0
  732. package/dist/modules/workflows/lib/work-inbox/presentation.js.map +7 -0
  733. package/dist/modules/workflows/lib/work-inbox/provider.js +118 -0
  734. package/dist/modules/workflows/lib/work-inbox/provider.js.map +7 -0
  735. package/dist/modules/workflows/lib/work-inbox/query.js +70 -0
  736. package/dist/modules/workflows/lib/work-inbox/query.js.map +7 -0
  737. package/dist/modules/workflows/lib/work-inbox/service.js +56 -0
  738. package/dist/modules/workflows/lib/work-inbox/service.js.map +7 -0
  739. package/dist/modules/workflows/lib/work-inbox/user-task-source.js +149 -0
  740. package/dist/modules/workflows/lib/work-inbox/user-task-source.js.map +7 -0
  741. package/dist/modules/workflows/lib/workflow-command-enablement.js +57 -0
  742. package/dist/modules/workflows/lib/workflow-command-enablement.js.map +7 -0
  743. package/dist/modules/workflows/lib/workflow-command-settings.js +54 -0
  744. package/dist/modules/workflows/lib/workflow-command-settings.js.map +7 -0
  745. package/dist/modules/workflows/lib/workflow-executor.js +658 -6
  746. package/dist/modules/workflows/lib/workflow-executor.js.map +2 -2
  747. package/dist/modules/workflows/lib/workflow-function-registry.js +40 -0
  748. package/dist/modules/workflows/lib/workflow-function-registry.js.map +7 -0
  749. package/dist/modules/workflows/lib/workflow-safe-commands.js +11 -1
  750. package/dist/modules/workflows/lib/workflow-safe-commands.js.map +2 -2
  751. package/dist/modules/workflows/lib/workflow-templates.js +69 -0
  752. package/dist/modules/workflows/lib/workflow-templates.js.map +7 -0
  753. package/dist/modules/workflows/migrations/Migration20260626214855_workflows.js +15 -0
  754. package/dist/modules/workflows/migrations/Migration20260626214855_workflows.js.map +7 -0
  755. package/dist/modules/workflows/migrations/Migration20260626222424_workflows.js +17 -0
  756. package/dist/modules/workflows/migrations/Migration20260626222424_workflows.js.map +7 -0
  757. package/dist/modules/workflows/migrations/Migration20260727074335_workflows.js +15 -0
  758. package/dist/modules/workflows/migrations/Migration20260727074335_workflows.js.map +7 -0
  759. package/dist/modules/workflows/migrations/Migration20260728104038_workflows.js +13 -0
  760. package/dist/modules/workflows/migrations/Migration20260728104038_workflows.js.map +7 -0
  761. package/dist/modules/workflows/migrations/Migration20260728163001_workflows.js +15 -0
  762. package/dist/modules/workflows/migrations/Migration20260728163001_workflows.js.map +7 -0
  763. package/dist/modules/workflows/migrations/Migration20260729061736_workflows.js +13 -0
  764. package/dist/modules/workflows/migrations/Migration20260729061736_workflows.js.map +7 -0
  765. package/dist/modules/workflows/migrations/Migration20260729192652_workflows.js +12 -0
  766. package/dist/modules/workflows/migrations/Migration20260729192652_workflows.js.map +7 -0
  767. package/dist/modules/workflows/migrations/Migration20260730085000_workflows.js +13 -0
  768. package/dist/modules/workflows/migrations/Migration20260730085000_workflows.js.map +7 -0
  769. package/dist/modules/workflows/migrations/Migration20260730092706_workflows.js +13 -0
  770. package/dist/modules/workflows/migrations/Migration20260730092706_workflows.js.map +7 -0
  771. package/dist/modules/workflows/notifications.js +38 -10
  772. package/dist/modules/workflows/notifications.js.map +2 -2
  773. package/dist/modules/workflows/setup.js +81 -1
  774. package/dist/modules/workflows/setup.js.map +2 -2
  775. package/dist/modules/workflows/subscribers/task-assigned-notification.js +19 -27
  776. package/dist/modules/workflows/subscribers/task-assigned-notification.js.map +2 -2
  777. package/dist/modules/workflows/subscribers/task-deadline-breached-notification.js +24 -0
  778. package/dist/modules/workflows/subscribers/task-deadline-breached-notification.js.map +7 -0
  779. package/dist/modules/workflows/subscribers/task-reminder-notification.js +24 -0
  780. package/dist/modules/workflows/subscribers/task-reminder-notification.js.map +7 -0
  781. package/dist/modules/workflows/widgets/injection/pending-work/widget.client.js +73 -0
  782. package/dist/modules/workflows/widgets/injection/pending-work/widget.client.js.map +7 -0
  783. package/dist/modules/workflows/widgets/injection/pending-work/widget.js +17 -0
  784. package/dist/modules/workflows/widgets/injection/pending-work/widget.js.map +7 -0
  785. package/dist/modules/workflows/widgets/injection-table.js +26 -0
  786. package/dist/modules/workflows/widgets/injection-table.js.map +2 -2
  787. package/dist/modules/workflows/workers/workflow-activities.worker.js +61 -39
  788. package/dist/modules/workflows/workers/workflow-activities.worker.js.map +2 -2
  789. package/dist/modules/workflows/workers/workflow-definition-metric-rollup.worker.js +40 -0
  790. package/dist/modules/workflows/workers/workflow-definition-metric-rollup.worker.js.map +7 -0
  791. package/dist/modules/workflows/workers/workflow-instance-bulk-replay.js +43 -0
  792. package/dist/modules/workflows/workers/workflow-instance-bulk-replay.js.map +7 -0
  793. package/dist/modules/workflows/workers/workflow-invoke-agent.worker.js +30 -0
  794. package/dist/modules/workflows/workers/workflow-invoke-agent.worker.js.map +7 -0
  795. package/generated/entities/action_log/index.ts +1 -0
  796. package/generated/entities/user/index.ts +1 -0
  797. package/generated/entities/user_task/index.ts +7 -0
  798. package/generated/entities/workflow_definition/index.ts +3 -0
  799. package/generated/entities/workflow_definition_draft/index.ts +11 -0
  800. package/generated/entities/workflow_definition_metric_rollup/index.ts +10 -0
  801. package/generated/entities/workflow_instance/index.ts +2 -0
  802. package/generated/entities.ids.generated.ts +4 -1
  803. package/generated/entity-fields-registry.ts +39 -0
  804. package/jest.setup.ts +13 -0
  805. package/package.json +8 -7
  806. package/src/helpers/integration/workflowsFixtures.ts +765 -5
  807. package/src/helpers/integration/workflowsUi.ts +318 -0
  808. package/src/modules/attachments/lib/createFromBuffer.ts +120 -0
  809. package/src/modules/audit_logs/data/entities.ts +12 -0
  810. package/src/modules/audit_logs/data/validators.ts +1 -0
  811. package/src/modules/audit_logs/lib/projections.ts +5 -1
  812. package/src/modules/audit_logs/migrations/.snapshot-open-mercato.json +26 -0
  813. package/src/modules/audit_logs/migrations/Migration20260625120000.ts +15 -0
  814. package/src/modules/audit_logs/services/actionLogService.ts +3 -0
  815. package/src/modules/auth/data/entities.ts +21 -0
  816. package/src/modules/auth/i18n/de.json +31 -0
  817. package/src/modules/auth/i18n/en.json +31 -0
  818. package/src/modules/auth/i18n/es.json +31 -0
  819. package/src/modules/auth/i18n/ko.json +31 -0
  820. package/src/modules/auth/i18n/pl.json +31 -0
  821. package/src/modules/auth/lib/executionPrincipal.ts +235 -0
  822. package/src/modules/auth/migrations/.snapshot-open-mercato.json +16 -0
  823. package/src/modules/auth/migrations/Migration20260625050000.ts +21 -0
  824. package/src/modules/business_rules/components/InlineRuleEditor.tsx +231 -0
  825. package/src/modules/business_rules/data/validators.ts +6 -0
  826. package/src/modules/business_rules/i18n/de.json +4 -0
  827. package/src/modules/business_rules/i18n/en.json +4 -0
  828. package/src/modules/business_rules/i18n/es.json +4 -0
  829. package/src/modules/business_rules/i18n/ko.json +4 -0
  830. package/src/modules/business_rules/i18n/pl.json +4 -0
  831. package/src/modules/business_rules/lib/rule-engine.ts +15 -1
  832. package/src/modules/catalog/commands/products.ts +12 -0
  833. package/src/modules/catalog/i18n/de.json +1 -0
  834. package/src/modules/catalog/i18n/en.json +1 -0
  835. package/src/modules/catalog/i18n/es.json +1 -0
  836. package/src/modules/catalog/i18n/ko.json +1 -0
  837. package/src/modules/catalog/i18n/pl.json +1 -0
  838. package/src/modules/catalog/workflows.ts +35 -0
  839. package/src/modules/customer_accounts/AGENTS.md +11 -0
  840. package/src/modules/customer_accounts/backend/customer_accounts/roles/[id]/page.tsx +2 -0
  841. package/src/modules/customer_accounts/cli.ts +96 -0
  842. package/src/modules/customer_accounts/i18n/de.json +5 -0
  843. package/src/modules/customer_accounts/i18n/en.json +5 -0
  844. package/src/modules/customer_accounts/i18n/es.json +5 -0
  845. package/src/modules/customer_accounts/i18n/ko.json +5 -0
  846. package/src/modules/customer_accounts/i18n/pl.json +5 -0
  847. package/src/modules/customer_accounts/lib/customerRoleAclSync.ts +92 -0
  848. package/src/modules/customer_accounts/setup.ts +15 -3
  849. package/src/modules/customers/commands/deals.ts +5 -0
  850. package/src/modules/customers/components/detail/ChangelogEntryRow.tsx +4 -2
  851. package/src/modules/customers/components/detail/utils.ts +2 -0
  852. package/src/modules/customers/events.ts +21 -3
  853. package/src/modules/customers/i18n/de.json +4 -0
  854. package/src/modules/customers/i18n/en.json +4 -0
  855. package/src/modules/customers/i18n/es.json +4 -0
  856. package/src/modules/customers/i18n/ko.json +4 -0
  857. package/src/modules/customers/i18n/pl.json +4 -0
  858. package/src/modules/customers/lib/link-workflow-task-handler.ts +136 -0
  859. package/src/modules/customers/lib/todoCompatibility.ts +4 -1
  860. package/src/modules/customers/lib/workflowTaskLink.ts +23 -0
  861. package/src/modules/customers/subscribers/link-workflow-task.ts +19 -0
  862. package/src/modules/customers/workflows.ts +57 -0
  863. package/src/modules/entities/api/records.ts +18 -62
  864. package/src/modules/entities/lib/entityClassification.ts +102 -0
  865. package/src/modules/sales/commands/documents.ts +46 -0
  866. package/src/modules/sales/events.ts +20 -2
  867. package/src/modules/sales/i18n/de.json +2 -1
  868. package/src/modules/sales/i18n/en.json +2 -1
  869. package/src/modules/sales/i18n/es.json +2 -1
  870. package/src/modules/sales/i18n/ko.json +2 -1
  871. package/src/modules/sales/i18n/pl.json +2 -1
  872. package/src/modules/sales/workflows.ts +12 -1
  873. package/src/modules/seeds/README.md +86 -0
  874. package/src/modules/seeds/cli.ts +220 -0
  875. package/src/modules/seeds/examples/sample-seed.json +26 -0
  876. package/src/modules/seeds/index.ts +11 -0
  877. package/src/modules/workflows/AGENTS.md +851 -10
  878. package/src/modules/workflows/acl.ts +96 -0
  879. package/src/modules/workflows/ai-agents.ts +80 -0
  880. package/src/modules/workflows/ai-tools/authoring-pack.ts +798 -0
  881. package/src/modules/workflows/ai-tools/types.ts +117 -0
  882. package/src/modules/workflows/ai-tools.ts +20 -0
  883. package/src/modules/workflows/api/command-settings/route.ts +171 -0
  884. package/src/modules/workflows/api/commands/route.ts +109 -0
  885. package/src/modules/workflows/api/definitions/[id]/callers/route.ts +95 -0
  886. package/src/modules/workflows/api/definitions/[id]/context-schema/route.ts +187 -0
  887. package/src/modules/workflows/api/definitions/[id]/customize/route.ts +6 -1
  888. package/src/modules/workflows/api/definitions/[id]/draft/route.ts +395 -0
  889. package/src/modules/workflows/api/definitions/[id]/publish/route.ts +250 -0
  890. package/src/modules/workflows/api/definitions/[id]/reset-to-code/route.ts +5 -0
  891. package/src/modules/workflows/api/definitions/[id]/route.ts +107 -7
  892. package/src/modules/workflows/api/definitions/[id]/test-step/route.ts +288 -0
  893. package/src/modules/workflows/api/definitions/generate/route.ts +335 -0
  894. package/src/modules/workflows/api/definitions/route.ts +88 -113
  895. package/src/modules/workflows/api/definitions/serialize.ts +9 -0
  896. package/src/modules/workflows/api/endpoints/route.ts +88 -0
  897. package/src/modules/workflows/api/functions/route.ts +91 -0
  898. package/src/modules/workflows/api/grantable-features/route.ts +102 -0
  899. package/src/modules/workflows/api/instances/[id]/context/route.ts +214 -0
  900. package/src/modules/workflows/api/instances/[id]/rerun-step/route.ts +226 -0
  901. package/src/modules/workflows/api/instances/[id]/retry/route.ts +18 -2
  902. package/src/modules/workflows/api/instances/[id]/step-through/route.ts +195 -0
  903. package/src/modules/workflows/api/instances/[id]/steps/route.ts +160 -0
  904. package/src/modules/workflows/api/instances/[id]/would-do/route.ts +216 -0
  905. package/src/modules/workflows/api/instances/bulk-replay/route.ts +141 -0
  906. package/src/modules/workflows/api/instances/failure-queue/route.ts +197 -0
  907. package/src/modules/workflows/api/instances/route.ts +135 -3
  908. package/src/modules/workflows/api/metrics/definitions/route.ts +262 -0
  909. package/src/modules/workflows/api/openapi.ts +549 -2
  910. package/src/modules/workflows/api/portal/tasks/[id]/complete/route.ts +160 -0
  911. package/src/modules/workflows/api/portal/tasks/[id]/route.ts +124 -0
  912. package/src/modules/workflows/api/portal/tasks/route.ts +157 -0
  913. package/src/modules/workflows/api/rule-usage/route.ts +94 -0
  914. package/src/modules/workflows/api/task-settings/route.ts +138 -0
  915. package/src/modules/workflows/api/tasks/[id]/claim/route.ts +42 -17
  916. package/src/modules/workflows/api/tasks/[id]/complete/route.ts +47 -15
  917. package/src/modules/workflows/api/tasks/[id]/reassign/route.ts +197 -0
  918. package/src/modules/workflows/api/tasks/[id]/route.ts +57 -6
  919. package/src/modules/workflows/api/tasks/[id]/unclaim/route.ts +132 -0
  920. package/src/modules/workflows/api/tasks/route.ts +60 -5
  921. package/src/modules/workflows/api/tasks/serialize.ts +119 -0
  922. package/src/modules/workflows/api/templates/route.ts +87 -0
  923. package/src/modules/workflows/api/work-inbox/next/route.ts +170 -0
  924. package/src/modules/workflows/api/work-inbox/route.ts +153 -0
  925. package/src/modules/workflows/backend/config/workflows/page.meta.ts +33 -0
  926. package/src/modules/workflows/backend/config/workflows/page.tsx +12 -0
  927. package/src/modules/workflows/backend/definitions/[id]/page.tsx +19 -343
  928. package/src/modules/workflows/backend/definitions/create/page.meta.ts +1 -1
  929. package/src/modules/workflows/backend/definitions/create/page.tsx +19 -59
  930. package/src/modules/workflows/backend/definitions/page.tsx +156 -76
  931. package/src/modules/workflows/backend/definitions/visual-editor/page.tsx +3129 -584
  932. package/src/modules/workflows/backend/instances/[id]/page.meta.ts +1 -1
  933. package/src/modules/workflows/backend/instances/[id]/page.tsx +711 -539
  934. package/src/modules/workflows/backend/instances/failure-queue/page.meta.ts +16 -0
  935. package/src/modules/workflows/backend/instances/failure-queue/page.tsx +311 -0
  936. package/src/modules/workflows/backend/instances/page.meta.ts +1 -1
  937. package/src/modules/workflows/backend/instances/page.tsx +218 -38
  938. package/src/modules/workflows/backend/tasks/[id]/page.tsx +639 -400
  939. package/src/modules/workflows/backend/tasks/page.meta.ts +7 -0
  940. package/src/modules/workflows/backend/tasks/page.tsx +20 -333
  941. package/src/modules/workflows/backend/work-inbox/page.meta.ts +15 -0
  942. package/src/modules/workflows/backend/work-inbox/page.tsx +506 -0
  943. package/src/modules/workflows/cli.ts +1 -1
  944. package/src/modules/workflows/commands/tasks.ts +146 -0
  945. package/src/modules/workflows/components/ActivitiesEditor.tsx +91 -114
  946. package/src/modules/workflows/components/ActivityEditDialog.tsx +244 -0
  947. package/src/modules/workflows/components/AgentSelector.tsx +200 -0
  948. package/src/modules/workflows/components/AnnotationEditDialog.tsx +157 -0
  949. package/src/modules/workflows/components/BusinessRuleUsagePanel.tsx +106 -0
  950. package/src/modules/workflows/components/BusinessRulesSelector.tsx +71 -17
  951. package/src/modules/workflows/components/ConfigJsonTextarea.tsx +111 -0
  952. package/src/modules/workflows/components/ContextSchemaEditor.tsx +165 -0
  953. package/src/modules/workflows/components/DefinitionErrorHandlerField.tsx +133 -0
  954. package/src/modules/workflows/components/DefinitionMetadataDrawer.tsx +456 -0
  955. package/src/modules/workflows/components/DefinitionMetricsCells.tsx +212 -0
  956. package/src/modules/workflows/components/DefinitionTriggersEditor.tsx +196 -95
  957. package/src/modules/workflows/components/EdgeEditDialog.tsx +15 -16
  958. package/src/modules/workflows/components/EdgeEditDialogCrudForm.tsx +130 -80
  959. package/src/modules/workflows/components/InputDataPanel.tsx +177 -0
  960. package/src/modules/workflows/components/InspectorPanel.tsx +250 -0
  961. package/src/modules/workflows/components/NodeEditDialog.tsx +444 -38
  962. package/src/modules/workflows/components/NodeEditDialogCrudForm.tsx +848 -178
  963. package/src/modules/workflows/components/StepsEditor.tsx +9 -2
  964. package/src/modules/workflows/components/TemplateGalleryDialog.tsx +205 -0
  965. package/src/modules/workflows/components/TransitionsEditor.tsx +98 -89
  966. package/src/modules/workflows/components/TriggersDialog.tsx +83 -0
  967. package/src/modules/workflows/components/TriggersEditor.tsx +363 -0
  968. package/src/modules/workflows/components/WorkflowAiDraftDialog.tsx +383 -0
  969. package/src/modules/workflows/components/WorkflowCodeView.tsx +257 -0
  970. package/src/modules/workflows/components/WorkflowCommandPalette.tsx +82 -0
  971. package/src/modules/workflows/components/WorkflowCompensationGhostEdge.tsx +78 -0
  972. package/src/modules/workflows/components/WorkflowDataMappingEdge.tsx +46 -0
  973. package/src/modules/workflows/components/WorkflowGraph.tsx +54 -1
  974. package/src/modules/workflows/components/WorkflowGraphImpl.tsx +463 -37
  975. package/src/modules/workflows/components/WorkflowIconPicker.tsx +144 -0
  976. package/src/modules/workflows/components/WorkflowLegend.tsx +59 -33
  977. package/src/modules/workflows/components/WorkflowNodeCard.tsx +355 -28
  978. package/src/modules/workflows/components/WorkflowRouteChips.tsx +145 -0
  979. package/src/modules/workflows/components/WorkflowSelector.tsx +33 -14
  980. package/src/modules/workflows/components/WorkflowTransitionEdge.tsx +83 -10
  981. package/src/modules/workflows/components/WorkflowTransitionLabel.tsx +13 -2
  982. package/src/modules/workflows/components/fields/ActivityArrayEditor.tsx +120 -30
  983. package/src/modules/workflows/components/fields/ActivityConfigFields.tsx +675 -0
  984. package/src/modules/workflows/components/fields/ActivityTestPanel.tsx +250 -0
  985. package/src/modules/workflows/components/fields/AgentInvokeConfigField.tsx +580 -0
  986. package/src/modules/workflows/components/fields/AgentReviewOnBreachField.tsx +88 -0
  987. package/src/modules/workflows/components/fields/BranchingRoutesEditor.tsx +323 -0
  988. package/src/modules/workflows/components/fields/BusinessRuleConditionsEditor.tsx +36 -4
  989. package/src/modules/workflows/components/fields/CommandPicker.tsx +158 -0
  990. package/src/modules/workflows/components/fields/EndpointPicker.tsx +330 -0
  991. package/src/modules/workflows/components/fields/FormFieldArrayEditor.tsx +2 -2
  992. package/src/modules/workflows/components/fields/FunctionPicker.tsx +68 -0
  993. package/src/modules/workflows/components/fields/MappingArrayEditor.tsx +46 -12
  994. package/src/modules/workflows/components/fields/PortFieldArrayEditor.tsx +255 -0
  995. package/src/modules/workflows/components/fields/RolesMultiSelect.tsx +68 -0
  996. package/src/modules/workflows/components/fields/RouteOrderEditor.tsx +169 -0
  997. package/src/modules/workflows/components/fields/SchemaBuilderDialog.tsx +139 -0
  998. package/src/modules/workflows/components/fields/StartPreConditionsEditor.tsx +2 -2
  999. package/src/modules/workflows/components/fields/TaskAssignmentField.tsx +355 -0
  1000. package/src/modules/workflows/components/fields/TaskDeadlineFields.tsx +172 -0
  1001. package/src/modules/workflows/components/fields/TaskDecisionsField.tsx +294 -0
  1002. package/src/modules/workflows/components/fields/TaskEntityBindingsField.tsx +156 -0
  1003. package/src/modules/workflows/components/fields/TemplateTextControl.tsx +85 -0
  1004. package/src/modules/workflows/components/fields/VariablePickerButton.tsx +177 -0
  1005. package/src/modules/workflows/components/fields/ledgerDropTarget.ts +55 -0
  1006. package/src/modules/workflows/components/fields/useActivityTypeOptions.ts +19 -0
  1007. package/src/modules/workflows/components/formConfig.tsx +84 -10
  1008. package/src/modules/workflows/components/mobile/MobileDefinitionDetail.tsx +5 -0
  1009. package/src/modules/workflows/components/mobile/MobileMetadataSheet.tsx +10 -0
  1010. package/src/modules/workflows/components/mobile/MobileTaskForm.tsx +55 -19
  1011. package/src/modules/workflows/components/mobile/MobileVisualEditor.tsx +49 -40
  1012. package/src/modules/workflows/components/nodes/AnnotationGroupNode.tsx +81 -0
  1013. package/src/modules/workflows/components/nodes/AutomatedNode.tsx +34 -17
  1014. package/src/modules/workflows/components/nodes/EndNode.tsx +15 -14
  1015. package/src/modules/workflows/components/nodes/ErrorOutputHandle.tsx +32 -0
  1016. package/src/modules/workflows/components/nodes/IfElseNode.tsx +64 -0
  1017. package/src/modules/workflows/components/nodes/InvokeAgentNode.tsx +180 -0
  1018. package/src/modules/workflows/components/nodes/NodeOutcomeRows.tsx +143 -0
  1019. package/src/modules/workflows/components/nodes/ParallelForkNode.tsx +28 -15
  1020. package/src/modules/workflows/components/nodes/ParallelJoinNode.tsx +28 -15
  1021. package/src/modules/workflows/components/nodes/StartNode.tsx +78 -18
  1022. package/src/modules/workflows/components/nodes/StickyNoteNode.tsx +65 -0
  1023. package/src/modules/workflows/components/nodes/SubWorkflowNode.tsx +124 -23
  1024. package/src/modules/workflows/components/nodes/SwitchNode.tsx +64 -0
  1025. package/src/modules/workflows/components/nodes/TriggerCap.tsx +103 -0
  1026. package/src/modules/workflows/components/nodes/TriggerNode.tsx +151 -0
  1027. package/src/modules/workflows/components/nodes/UserTaskNode.tsx +67 -22
  1028. package/src/modules/workflows/components/nodes/WaitForConditionNode.tsx +74 -0
  1029. package/src/modules/workflows/components/nodes/WaitForSignalNode.tsx +31 -17
  1030. package/src/modules/workflows/components/nodes/WaitForTimerNode.tsx +31 -16
  1031. package/src/modules/workflows/components/nodes/index.ts +17 -0
  1032. package/src/modules/workflows/components/portal/PortalTaskForm.tsx +280 -0
  1033. package/src/modules/workflows/components/run/AgentActivityPanel.tsx +48 -0
  1034. package/src/modules/workflows/components/run/RerunStepDialog.tsx +133 -0
  1035. package/src/modules/workflows/components/run/RunEventBadge.tsx +37 -0
  1036. package/src/modules/workflows/components/run/RunGantt.tsx +180 -0
  1037. package/src/modules/workflows/components/run/RunStatusBadge.tsx +112 -0
  1038. package/src/modules/workflows/components/run/RunStepInspector.tsx +176 -0
  1039. package/src/modules/workflows/components/run/WouldDoReport.tsx +93 -0
  1040. package/src/modules/workflows/components/run/useAgentLabels.ts +42 -0
  1041. package/src/modules/workflows/components/run/useLastRunOverlay.ts +150 -0
  1042. package/src/modules/workflows/components/run/useLiveAgentActions.ts +70 -0
  1043. package/src/modules/workflows/components/run/useLiveRunUpdates.ts +89 -0
  1044. package/src/modules/workflows/components/settings/CommandSettingsPageClient.tsx +228 -0
  1045. package/src/modules/workflows/components/work-inbox/EntityContextPanel.tsx +179 -0
  1046. package/src/modules/workflows/components/work-inbox/ReassignTaskDialog.tsx +203 -0
  1047. package/src/modules/workflows/components/work-inbox/StatusChip.tsx +61 -0
  1048. package/src/modules/workflows/components/work-inbox/TaskActionNotice.tsx +77 -0
  1049. package/src/modules/workflows/components/work-inbox/TaskFormFields.tsx +322 -0
  1050. package/src/modules/workflows/components/work-inbox/WorkInboxEmptyState.tsx +43 -0
  1051. package/src/modules/workflows/data/activity-config-schemas.ts +249 -0
  1052. package/src/modules/workflows/data/activity-config-warnings.ts +71 -0
  1053. package/src/modules/workflows/data/branching-route-warnings.ts +129 -0
  1054. package/src/modules/workflows/data/entities.ts +397 -4
  1055. package/src/modules/workflows/data/metrics-validators.ts +51 -0
  1056. package/src/modules/workflows/data/task-primitives.ts +36 -0
  1057. package/src/modules/workflows/data/types.ts +81 -2
  1058. package/src/modules/workflows/data/validators.ts +729 -60
  1059. package/src/modules/workflows/di.ts +22 -0
  1060. package/src/modules/workflows/events.ts +68 -8
  1061. package/src/modules/workflows/examples/oze-residential-install-60-nodes.json +1545 -0
  1062. package/src/modules/workflows/examples/sales-pipeline-definition.json +35 -35
  1063. package/src/modules/workflows/examples/templates/lead-to-install.json +160 -0
  1064. package/src/modules/workflows/examples/templates/order-approval.json +230 -0
  1065. package/src/modules/workflows/examples/templates/task-escalation.json +110 -0
  1066. package/src/modules/workflows/examples/templates/webhook-integration.json +113 -0
  1067. package/src/modules/workflows/extension-points.ts +1 -1
  1068. package/src/modules/workflows/frontend/[orgSlug]/portal/tasks/[id]/page.meta.ts +21 -0
  1069. package/src/modules/workflows/frontend/[orgSlug]/portal/tasks/[id]/page.tsx +212 -0
  1070. package/src/modules/workflows/frontend/[orgSlug]/portal/tasks/page.meta.ts +25 -0
  1071. package/src/modules/workflows/frontend/[orgSlug]/portal/tasks/page.tsx +185 -0
  1072. package/src/modules/workflows/i18n/de.json +1083 -24
  1073. package/src/modules/workflows/i18n/en.json +1081 -22
  1074. package/src/modules/workflows/i18n/es.json +1083 -24
  1075. package/src/modules/workflows/i18n/ko.json +1072 -13
  1076. package/src/modules/workflows/i18n/pl.json +1082 -23
  1077. package/src/modules/workflows/lib/activity-executor.ts +855 -186
  1078. package/src/modules/workflows/lib/activity-queue-types.ts +120 -1
  1079. package/src/modules/workflows/lib/activity-registry-bootstrap.ts +7 -0
  1080. package/src/modules/workflows/lib/activity-registry.ts +89 -0
  1081. package/src/modules/workflows/lib/activity-types.ts +415 -0
  1082. package/src/modules/workflows/lib/activity-worker-handler.ts +744 -35
  1083. package/src/modules/workflows/lib/advanced-config.ts +41 -0
  1084. package/src/modules/workflows/lib/agent-disposition-task.ts +343 -0
  1085. package/src/modules/workflows/lib/agent-outcome-paths.ts +153 -0
  1086. package/src/modules/workflows/lib/agent-result-mapping.ts +88 -0
  1087. package/src/modules/workflows/lib/agent-review-inspector.ts +125 -0
  1088. package/src/modules/workflows/lib/agent-review.ts +171 -0
  1089. package/src/modules/workflows/lib/ai-authoring.ts +402 -0
  1090. package/src/modules/workflows/lib/ai-draft-runner.ts +105 -0
  1091. package/src/modules/workflows/lib/annotation-events.ts +15 -0
  1092. package/src/modules/workflows/lib/branching-routes.ts +280 -0
  1093. package/src/modules/workflows/lib/breach-routing.ts +142 -0
  1094. package/src/modules/workflows/lib/bulk-replay.ts +185 -0
  1095. package/src/modules/workflows/lib/business-rule-usage.ts +154 -0
  1096. package/src/modules/workflows/lib/caller-graph.ts +104 -0
  1097. package/src/modules/workflows/lib/code-view-apply.ts +178 -0
  1098. package/src/modules/workflows/lib/collect-validation-issues.ts +239 -0
  1099. package/src/modules/workflows/lib/compensation-ghosts.ts +134 -0
  1100. package/src/modules/workflows/lib/component-guard.ts +13 -0
  1101. package/src/modules/workflows/lib/condition-handler.ts +658 -0
  1102. package/src/modules/workflows/lib/context-ledger.ts +814 -0
  1103. package/src/modules/workflows/lib/crud-form-dialogs-flag.ts +5 -0
  1104. package/src/modules/workflows/lib/data-edge-mapping.ts +112 -0
  1105. package/src/modules/workflows/lib/definition-context-schema.ts +103 -0
  1106. package/src/modules/workflows/lib/definition-edit-safety.ts +228 -0
  1107. package/src/modules/workflows/lib/definition-error-body.ts +43 -0
  1108. package/src/modules/workflows/lib/definition-evaluation.ts +156 -0
  1109. package/src/modules/workflows/lib/definition-grant.ts +211 -0
  1110. package/src/modules/workflows/lib/definition-json-locations.ts +226 -0
  1111. package/src/modules/workflows/lib/definition-payload.ts +81 -0
  1112. package/src/modules/workflows/lib/draft-restore.ts +72 -0
  1113. package/src/modules/workflows/lib/dry-run.ts +203 -0
  1114. package/src/modules/workflows/lib/duration.ts +138 -24
  1115. package/src/modules/workflows/lib/edge-reattachment.ts +186 -0
  1116. package/src/modules/workflows/lib/edgeFormTransforms.ts +15 -14
  1117. package/src/modules/workflows/lib/editor-annotations.ts +301 -0
  1118. package/src/modules/workflows/lib/editor-commands.ts +205 -0
  1119. package/src/modules/workflows/lib/editor-history.ts +151 -0
  1120. package/src/modules/workflows/lib/endpoint-catalog.ts +283 -0
  1121. package/src/modules/workflows/lib/endpoint-path.ts +134 -0
  1122. package/src/modules/workflows/lib/engine-version.ts +67 -0
  1123. package/src/modules/workflows/lib/error-handler.ts +192 -0
  1124. package/src/modules/workflows/lib/error-routing.ts +236 -0
  1125. package/src/modules/workflows/lib/event-logger.ts +27 -0
  1126. package/src/modules/workflows/lib/expression-refs.ts +291 -0
  1127. package/src/modules/workflows/lib/failure-grouping.ts +134 -0
  1128. package/src/modules/workflows/lib/find-definition.ts +4 -0
  1129. package/src/modules/workflows/lib/flow-logic-warnings.ts +591 -0
  1130. package/src/modules/workflows/lib/graph-utils.ts +620 -110
  1131. package/src/modules/workflows/lib/icon-search.ts +65 -0
  1132. package/src/modules/workflows/lib/insert-at-cursor.ts +53 -0
  1133. package/src/modules/workflows/lib/instance-date-filter.ts +56 -0
  1134. package/src/modules/workflows/lib/interpolation-pipeline.ts +351 -0
  1135. package/src/modules/workflows/lib/ledger-drag.ts +61 -0
  1136. package/src/modules/workflows/lib/ledger-entry-display.ts +89 -0
  1137. package/src/modules/workflows/lib/ledger-schema-flatten.ts +137 -0
  1138. package/src/modules/workflows/lib/metrics/definition-metrics.ts +268 -0
  1139. package/src/modules/workflows/lib/metrics/metrics-display.ts +57 -0
  1140. package/src/modules/workflows/lib/metrics/rollup-schedule.ts +26 -0
  1141. package/src/modules/workflows/lib/metrics/rollup-service.ts +292 -0
  1142. package/src/modules/workflows/lib/node-config-summary.ts +235 -0
  1143. package/src/modules/workflows/lib/node-geometry.ts +168 -0
  1144. package/src/modules/workflows/lib/node-nudge.ts +63 -0
  1145. package/src/modules/workflows/lib/node-outcome-rows.ts +195 -0
  1146. package/src/modules/workflows/lib/node-placement.ts +104 -0
  1147. package/src/modules/workflows/lib/node-type-icons.ts +71 -10
  1148. package/src/modules/workflows/lib/nodeFormTransforms.ts +519 -28
  1149. package/src/modules/workflows/lib/outcome-routing.ts +346 -0
  1150. package/src/modules/workflows/lib/owned-definition.ts +188 -0
  1151. package/src/modules/workflows/lib/owned-node-changes.ts +29 -0
  1152. package/src/modules/workflows/lib/palette-drag.ts +68 -0
  1153. package/src/modules/workflows/lib/palette-drop.ts +114 -0
  1154. package/src/modules/workflows/lib/parallel-handler.ts +79 -2
  1155. package/src/modules/workflows/lib/port-contract.ts +107 -0
  1156. package/src/modules/workflows/lib/portal-task-access.ts +220 -0
  1157. package/src/modules/workflows/lib/rerun-from-step.ts +140 -0
  1158. package/src/modules/workflows/lib/route-chip-events.ts +45 -0
  1159. package/src/modules/workflows/lib/route-chips.ts +177 -0
  1160. package/src/modules/workflows/lib/route-edge.ts +57 -0
  1161. package/src/modules/workflows/lib/route-kinds.ts +166 -0
  1162. package/src/modules/workflows/lib/route-priority.ts +197 -0
  1163. package/src/modules/workflows/lib/run-duration.ts +70 -0
  1164. package/src/modules/workflows/lib/run-event-tone.ts +46 -0
  1165. package/src/modules/workflows/lib/run-execution.ts +598 -0
  1166. package/src/modules/workflows/lib/run-gantt.ts +311 -0
  1167. package/src/modules/workflows/lib/run-outcome-evidence.ts +60 -0
  1168. package/src/modules/workflows/lib/run-outcome.ts +142 -0
  1169. package/src/modules/workflows/lib/sample-resolver.ts +113 -0
  1170. package/src/modules/workflows/lib/seeds.ts +3 -1
  1171. package/src/modules/workflows/lib/server-output-contract.ts +120 -0
  1172. package/src/modules/workflows/lib/set-variable.ts +94 -0
  1173. package/src/modules/workflows/lib/signal-handler.ts +134 -4
  1174. package/src/modules/workflows/lib/start-fixtures.ts +93 -0
  1175. package/src/modules/workflows/lib/status-colors.ts +220 -21
  1176. package/src/modules/workflows/lib/step-handler.ts +744 -68
  1177. package/src/modules/workflows/lib/step-presentation.ts +295 -0
  1178. package/src/modules/workflows/lib/step-through.ts +71 -0
  1179. package/src/modules/workflows/lib/step-type-conversion.ts +263 -0
  1180. package/src/modules/workflows/lib/subgraph-clipboard.ts +214 -0
  1181. package/src/modules/workflows/lib/task-decision-context.ts +76 -0
  1182. package/src/modules/workflows/lib/task-decisions.ts +117 -0
  1183. package/src/modules/workflows/lib/task-entity-access.ts +181 -0
  1184. package/src/modules/workflows/lib/task-entity-aliases.ts +77 -0
  1185. package/src/modules/workflows/lib/task-entity-types.ts +66 -0
  1186. package/src/modules/workflows/lib/task-form-registry.ts +123 -0
  1187. package/src/modules/workflows/lib/task-form-schema.ts +129 -0
  1188. package/src/modules/workflows/lib/task-handler.ts +492 -51
  1189. package/src/modules/workflows/lib/task-inspector-config.ts +348 -0
  1190. package/src/modules/workflows/lib/task-list-query.ts +46 -0
  1191. package/src/modules/workflows/lib/task-notifications.ts +218 -0
  1192. package/src/modules/workflows/lib/task-permission-settings.ts +117 -0
  1193. package/src/modules/workflows/lib/task-presets.ts +95 -0
  1194. package/src/modules/workflows/lib/task-quick-action.ts +111 -0
  1195. package/src/modules/workflows/lib/task-resolution.ts +270 -0
  1196. package/src/modules/workflows/lib/task-sla.ts +628 -0
  1197. package/src/modules/workflows/lib/task-visibility-request.ts +668 -0
  1198. package/src/modules/workflows/lib/task-visibility.ts +627 -0
  1199. package/src/modules/workflows/lib/timer-handler.ts +8 -1
  1200. package/src/modules/workflows/lib/transition-handler.ts +228 -20
  1201. package/src/modules/workflows/lib/trigger-node.ts +272 -0
  1202. package/src/modules/workflows/lib/visual-editor-navigation.ts +29 -0
  1203. package/src/modules/workflows/lib/work-inbox/empty-state.ts +150 -0
  1204. package/src/modules/workflows/lib/work-inbox/entity-links.ts +99 -0
  1205. package/src/modules/workflows/lib/work-inbox/navigation.ts +28 -0
  1206. package/src/modules/workflows/lib/work-inbox/presentation.ts +163 -0
  1207. package/src/modules/workflows/lib/work-inbox/provider.ts +390 -0
  1208. package/src/modules/workflows/lib/work-inbox/query.ts +103 -0
  1209. package/src/modules/workflows/lib/work-inbox/service.ts +122 -0
  1210. package/src/modules/workflows/lib/work-inbox/user-task-source.ts +240 -0
  1211. package/src/modules/workflows/lib/workflow-command-enablement.ts +188 -0
  1212. package/src/modules/workflows/lib/workflow-command-settings.ts +124 -0
  1213. package/src/modules/workflows/lib/workflow-executor.ts +1036 -10
  1214. package/src/modules/workflows/lib/workflow-function-registry.ts +44 -0
  1215. package/src/modules/workflows/lib/workflow-safe-commands.ts +42 -1
  1216. package/src/modules/workflows/lib/workflow-templates.ts +91 -0
  1217. package/src/modules/workflows/migrations/.snapshot-open-mercato.json +2321 -698
  1218. package/src/modules/workflows/migrations/Migration20260626214855_workflows.ts +15 -0
  1219. package/src/modules/workflows/migrations/Migration20260626222424_workflows.ts +17 -0
  1220. package/src/modules/workflows/migrations/Migration20260727074335_workflows.ts +15 -0
  1221. package/src/modules/workflows/migrations/Migration20260728104038_workflows.ts +13 -0
  1222. package/src/modules/workflows/migrations/Migration20260728163001_workflows.ts +36 -0
  1223. package/src/modules/workflows/migrations/Migration20260729061736_workflows.ts +13 -0
  1224. package/src/modules/workflows/migrations/Migration20260729192652_workflows.ts +11 -0
  1225. package/src/modules/workflows/migrations/Migration20260730085000_workflows.ts +13 -0
  1226. package/src/modules/workflows/migrations/Migration20260730092706_workflows.ts +13 -0
  1227. package/src/modules/workflows/notifications.ts +40 -10
  1228. package/src/modules/workflows/setup.ts +128 -0
  1229. package/src/modules/workflows/subscribers/task-assigned-notification.ts +36 -45
  1230. package/src/modules/workflows/subscribers/task-deadline-breached-notification.ts +31 -0
  1231. package/src/modules/workflows/subscribers/task-reminder-notification.ts +31 -0
  1232. package/src/modules/workflows/widgets/injection/pending-work/widget.client.tsx +119 -0
  1233. package/src/modules/workflows/widgets/injection/pending-work/widget.ts +27 -0
  1234. package/src/modules/workflows/widgets/injection-table.ts +52 -2
  1235. package/src/modules/workflows/workers/workflow-activities.worker.ts +95 -42
  1236. package/src/modules/workflows/workers/workflow-definition-metric-rollup.worker.ts +71 -0
  1237. package/src/modules/workflows/workers/workflow-instance-bulk-replay.ts +51 -0
  1238. package/src/modules/workflows/workers/workflow-invoke-agent.worker.ts +72 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/audit_logs/data/validators.ts"],
4
- "sourcesContent": ["import { z } from 'zod'\n\nexport const uuid = z.string().uuid()\n\nexport const baseScopeSchema = z.object({\n tenantId: uuid.nullish(),\n organizationId: uuid.nullish(),\n actorUserId: uuid.nullish(),\n})\n\nconst recordLike = z.union([\n z.record(z.string(), z.unknown()),\n z.array(z.unknown()),\n z.null(),\n]).optional()\n\nexport const actionLogCreateSchema = baseScopeSchema.extend({\n commandId: z.string().min(1),\n actionLabel: z.string().min(1).optional(),\n resourceKind: z.string().min(1).optional(),\n resourceId: z.string().min(1).optional(),\n parentResourceKind: z.string().min(1).optional().nullable(),\n parentResourceId: z.string().min(1).optional().nullable(),\n executionState: z.enum(['done', 'undone', 'failed']).optional(),\n undoToken: z.string().min(1).optional(),\n commandPayload: z.unknown().optional(),\n snapshotBefore: z.unknown().optional(),\n snapshotAfter: z.unknown().optional(),\n relatedResourceKind: z.string().min(1).optional().nullable(),\n relatedResourceId: z.string().min(1).optional().nullable(),\n changes: recordLike,\n context: recordLike,\n})\n\nexport const actionLogListSchema = z.object({\n tenantId: uuid.optional(),\n organizationId: uuid.optional(),\n actorUserId: uuid.optional(),\n actorUserIds: z.array(uuid).optional(),\n undoableOnly: z.boolean().optional(),\n resourceKind: z.string().min(1).optional(),\n resourceId: z.string().min(1).optional(),\n includeRelated: z.boolean().optional(),\n actionType: z.enum(['create', 'edit', 'delete', 'assign']).optional(),\n actionTypes: z.array(z.enum(['create', 'edit', 'delete', 'assign'])).optional(),\n fieldName: z.string().min(1).optional(),\n fieldNames: z.array(z.string().min(1)).optional(),\n sortField: z.enum(['createdAt', 'user', 'action', 'field', 'source']).optional(),\n sortDir: z.enum(['asc', 'desc']).optional(),\n limit: z.number().int().positive().max(1000).optional(),\n offset: z.number().int().min(0).optional(),\n page: z.number().int().positive().default(1),\n pageSize: z.number().int().positive().max(200).default(50),\n before: z.date().optional(),\n after: z.date().optional(),\n})\n\nexport const accessLogCreateSchema = baseScopeSchema.extend({\n resourceKind: z.string().min(1),\n resourceId: z.string().min(1),\n accessType: z.string().min(1),\n fields: z.array(z.string().min(1)).optional(),\n context: z.record(z.string(), z.unknown()).optional(),\n})\n\nexport const accessLogListSchema = z.object({\n tenantId: uuid.optional(),\n organizationId: uuid.optional(),\n actorUserId: uuid.optional(),\n resourceKind: z.string().optional(),\n accessType: z.string().optional(),\n limit: z.number().int().positive().max(200).optional(),\n page: z.number().int().positive().default(1),\n pageSize: z.number().int().positive().max(200).default(50),\n before: z.date().optional(),\n after: z.date().optional(),\n})\n\nexport type ActionLogCreateInput = z.infer<typeof actionLogCreateSchema>\nexport type ActionLogListQuery = z.infer<typeof actionLogListSchema>\nexport type AccessLogCreateInput = z.infer<typeof accessLogCreateSchema>\nexport type AccessLogListQuery = z.infer<typeof accessLogListSchema>\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { z } from 'zod'\n\nexport const uuid = z.string().uuid()\n\nexport const baseScopeSchema = z.object({\n tenantId: uuid.nullish(),\n organizationId: uuid.nullish(),\n actorUserId: uuid.nullish(),\n})\n\nconst recordLike = z.union([\n z.record(z.string(), z.unknown()),\n z.array(z.unknown()),\n z.null(),\n]).optional()\n\nexport const actionLogCreateSchema = baseScopeSchema.extend({\n commandId: z.string().min(1),\n onBehalfOfUserId: uuid.nullish(),\n actionLabel: z.string().min(1).optional(),\n resourceKind: z.string().min(1).optional(),\n resourceId: z.string().min(1).optional(),\n parentResourceKind: z.string().min(1).optional().nullable(),\n parentResourceId: z.string().min(1).optional().nullable(),\n executionState: z.enum(['done', 'undone', 'failed']).optional(),\n undoToken: z.string().min(1).optional(),\n commandPayload: z.unknown().optional(),\n snapshotBefore: z.unknown().optional(),\n snapshotAfter: z.unknown().optional(),\n relatedResourceKind: z.string().min(1).optional().nullable(),\n relatedResourceId: z.string().min(1).optional().nullable(),\n changes: recordLike,\n context: recordLike,\n})\n\nexport const actionLogListSchema = z.object({\n tenantId: uuid.optional(),\n organizationId: uuid.optional(),\n actorUserId: uuid.optional(),\n actorUserIds: z.array(uuid).optional(),\n undoableOnly: z.boolean().optional(),\n resourceKind: z.string().min(1).optional(),\n resourceId: z.string().min(1).optional(),\n includeRelated: z.boolean().optional(),\n actionType: z.enum(['create', 'edit', 'delete', 'assign']).optional(),\n actionTypes: z.array(z.enum(['create', 'edit', 'delete', 'assign'])).optional(),\n fieldName: z.string().min(1).optional(),\n fieldNames: z.array(z.string().min(1)).optional(),\n sortField: z.enum(['createdAt', 'user', 'action', 'field', 'source']).optional(),\n sortDir: z.enum(['asc', 'desc']).optional(),\n limit: z.number().int().positive().max(1000).optional(),\n offset: z.number().int().min(0).optional(),\n page: z.number().int().positive().default(1),\n pageSize: z.number().int().positive().max(200).default(50),\n before: z.date().optional(),\n after: z.date().optional(),\n})\n\nexport const accessLogCreateSchema = baseScopeSchema.extend({\n resourceKind: z.string().min(1),\n resourceId: z.string().min(1),\n accessType: z.string().min(1),\n fields: z.array(z.string().min(1)).optional(),\n context: z.record(z.string(), z.unknown()).optional(),\n})\n\nexport const accessLogListSchema = z.object({\n tenantId: uuid.optional(),\n organizationId: uuid.optional(),\n actorUserId: uuid.optional(),\n resourceKind: z.string().optional(),\n accessType: z.string().optional(),\n limit: z.number().int().positive().max(200).optional(),\n page: z.number().int().positive().default(1),\n pageSize: z.number().int().positive().max(200).default(50),\n before: z.date().optional(),\n after: z.date().optional(),\n})\n\nexport type ActionLogCreateInput = z.infer<typeof actionLogCreateSchema>\nexport type ActionLogListQuery = z.infer<typeof actionLogListSchema>\nexport type AccessLogCreateInput = z.infer<typeof accessLogCreateSchema>\nexport type AccessLogListQuery = z.infer<typeof accessLogListSchema>\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  import { extractChangeRows, isRecord } from "./changeRows.js";
2
2
  const ACTION_LOG_FILTER_TYPES = ["create", "edit", "delete", "assign"];
3
3
  const ACTION_LOG_PROJECTION_TYPES = [...ACTION_LOG_FILTER_TYPES, "system"];
4
- const ACTION_LOG_SOURCE_KEYS = ["ui", "api", "system"];
4
+ const ACTION_LOG_SOURCE_KEYS = ["ui", "api", "system", "agent"];
5
5
  function normalizeText(value) {
6
6
  return (value ?? "").trim().toLowerCase();
7
7
  }
@@ -28,6 +28,7 @@ function deriveActionLogSource(context, actorUserId) {
28
28
  if (normalizedSource === "api") return "api";
29
29
  if (normalizedSource === "system") return "system";
30
30
  if (normalizedSource === "ui") return "ui";
31
+ if (normalizedSource === "agent") return "agent";
31
32
  return actorUserId ? "ui" : "system";
32
33
  }
33
34
  function deriveActionLogChangedFields(changes, snapshotBefore) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/audit_logs/lib/projections.ts"],
4
- "sourcesContent": ["import { extractChangeRows, isRecord } from './changeRows'\n\nexport const ACTION_LOG_FILTER_TYPES = ['create', 'edit', 'delete', 'assign'] as const\nexport const ACTION_LOG_PROJECTION_TYPES = [...ACTION_LOG_FILTER_TYPES, 'system'] as const\nexport const ACTION_LOG_SOURCE_KEYS = ['ui', 'api', 'system'] as const\n\nexport type ActionLogFilterType = (typeof ACTION_LOG_FILTER_TYPES)[number]\nexport type ActionLogProjectionType = (typeof ACTION_LOG_PROJECTION_TYPES)[number]\nexport type ActionLogSourceKey = (typeof ACTION_LOG_SOURCE_KEYS)[number]\n\ntype ProjectionInput = {\n actorUserId?: string | null\n actionLabel?: string | null\n changes?: Record<string, unknown> | null\n commandId: string\n context?: Record<string, unknown> | null\n snapshotBefore?: unknown\n}\n\nfunction normalizeText(value: string | null | undefined): string {\n return (value ?? '').trim().toLowerCase()\n}\n\nexport function deriveActionLogActionType(input: Pick<ProjectionInput, 'actionLabel' | 'commandId'>): ActionLogProjectionType {\n const normalizedCommandId = normalizeText(input.commandId)\n const normalizedLabel = normalizeText(input.actionLabel)\n\n if (\n normalizedCommandId.endsWith('.create') ||\n normalizedCommandId.endsWith('.add') ||\n normalizedLabel.includes('create') ||\n normalizedLabel.includes('add')\n ) {\n return 'create'\n }\n\n if (\n normalizedCommandId.endsWith('.delete') ||\n normalizedCommandId.endsWith('.remove') ||\n normalizedLabel.includes('delete') ||\n normalizedLabel.includes('remove')\n ) {\n return 'delete'\n }\n\n if (\n normalizedCommandId.endsWith('.assign') ||\n normalizedCommandId.endsWith('.unassign') ||\n normalizedLabel.includes('assign') ||\n normalizedLabel.includes('unassign')\n ) {\n return 'assign'\n }\n\n if (\n normalizedCommandId.endsWith('.update') ||\n normalizedCommandId.endsWith('.edit') ||\n normalizedCommandId.endsWith('.upsert') ||\n normalizedLabel.includes('update') ||\n normalizedLabel.includes('edit') ||\n normalizedLabel.includes('upsert')\n ) {\n return 'edit'\n }\n\n return 'system'\n}\n\nexport function deriveActionLogSource(\n context: Record<string, unknown> | null | undefined,\n actorUserId: string | null | undefined,\n): ActionLogSourceKey {\n const rawSource = isRecord(context) ? context.source : undefined\n const normalizedSource = typeof rawSource === 'string' ? rawSource.trim().toLowerCase() : ''\n\n if (normalizedSource === 'api') return 'api'\n if (normalizedSource === 'system') return 'system'\n if (normalizedSource === 'ui') return 'ui'\n\n return actorUserId ? 'ui' : 'system'\n}\n\nexport function deriveActionLogChangedFields(\n changes: Record<string, unknown> | null | undefined,\n snapshotBefore: unknown,\n): string[] {\n return Array.from(\n new Set(\n extractChangeRows(changes, snapshotBefore)\n .map((entry) => entry.field)\n .filter((value) => typeof value === 'string' && value.trim().length > 0),\n ),\n ).sort((left, right) => left.localeCompare(right))\n}\n\nexport function deriveActionLogProjection(input: ProjectionInput): {\n actionType: ActionLogProjectionType\n changedFields: string[]\n primaryChangedField: string | null\n sourceKey: ActionLogSourceKey\n} {\n const changedFields = deriveActionLogChangedFields(input.changes, input.snapshotBefore)\n\n return {\n actionType: deriveActionLogActionType(input),\n changedFields,\n primaryChangedField: changedFields[0] ?? null,\n sourceKey: deriveActionLogSource(input.context, input.actorUserId),\n }\n}\n"],
5
- "mappings": "AAAA,SAAS,mBAAmB,gBAAgB;AAErC,MAAM,0BAA0B,CAAC,UAAU,QAAQ,UAAU,QAAQ;AACrE,MAAM,8BAA8B,CAAC,GAAG,yBAAyB,QAAQ;AACzE,MAAM,yBAAyB,CAAC,MAAM,OAAO,QAAQ;AAe5D,SAAS,cAAc,OAA0C;AAC/D,UAAQ,SAAS,IAAI,KAAK,EAAE,YAAY;AAC1C;AAEO,SAAS,0BAA0B,OAAoF;AAC5H,QAAM,sBAAsB,cAAc,MAAM,SAAS;AACzD,QAAM,kBAAkB,cAAc,MAAM,WAAW;AAEvD,MACE,oBAAoB,SAAS,SAAS,KACtC,oBAAoB,SAAS,MAAM,KACnC,gBAAgB,SAAS,QAAQ,KACjC,gBAAgB,SAAS,KAAK,GAC9B;AACA,WAAO;AAAA,EACT;AAEA,MACE,oBAAoB,SAAS,SAAS,KACtC,oBAAoB,SAAS,SAAS,KACtC,gBAAgB,SAAS,QAAQ,KACjC,gBAAgB,SAAS,QAAQ,GACjC;AACA,WAAO;AAAA,EACT;AAEA,MACE,oBAAoB,SAAS,SAAS,KACtC,oBAAoB,SAAS,WAAW,KACxC,gBAAgB,SAAS,QAAQ,KACjC,gBAAgB,SAAS,UAAU,GACnC;AACA,WAAO;AAAA,EACT;AAEA,MACE,oBAAoB,SAAS,SAAS,KACtC,oBAAoB,SAAS,OAAO,KACpC,oBAAoB,SAAS,SAAS,KACtC,gBAAgB,SAAS,QAAQ,KACjC,gBAAgB,SAAS,MAAM,KAC/B,gBAAgB,SAAS,QAAQ,GACjC;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,sBACd,SACA,aACoB;AACpB,QAAM,YAAY,SAAS,OAAO,IAAI,QAAQ,SAAS;AACvD,QAAM,mBAAmB,OAAO,cAAc,WAAW,UAAU,KAAK,EAAE,YAAY,IAAI;AAE1F,MAAI,qBAAqB,MAAO,QAAO;AACvC,MAAI,qBAAqB,SAAU,QAAO;AAC1C,MAAI,qBAAqB,KAAM,QAAO;AAEtC,SAAO,cAAc,OAAO;AAC9B;AAEO,SAAS,6BACd,SACA,gBACU;AACV,SAAO,MAAM;AAAA,IACX,IAAI;AAAA,MACF,kBAAkB,SAAS,cAAc,EACtC,IAAI,CAAC,UAAU,MAAM,KAAK,EAC1B,OAAO,CAAC,UAAU,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,CAAC;AAAA,IAC3E;AAAA,EACF,EAAE,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC;AACnD;AAEO,SAAS,0BAA0B,OAKxC;AACA,QAAM,gBAAgB,6BAA6B,MAAM,SAAS,MAAM,cAAc;AAEtF,SAAO;AAAA,IACL,YAAY,0BAA0B,KAAK;AAAA,IAC3C;AAAA,IACA,qBAAqB,cAAc,CAAC,KAAK;AAAA,IACzC,WAAW,sBAAsB,MAAM,SAAS,MAAM,WAAW;AAAA,EACnE;AACF;",
4
+ "sourcesContent": ["import { extractChangeRows, isRecord } from './changeRows'\n\nexport const ACTION_LOG_FILTER_TYPES = ['create', 'edit', 'delete', 'assign'] as const\nexport const ACTION_LOG_PROJECTION_TYPES = [...ACTION_LOG_FILTER_TYPES, 'system'] as const\nexport const ACTION_LOG_SOURCE_KEYS = ['ui', 'api', 'system', 'agent'] as const\n\nexport type ActionLogFilterType = (typeof ACTION_LOG_FILTER_TYPES)[number]\nexport type ActionLogProjectionType = (typeof ACTION_LOG_PROJECTION_TYPES)[number]\nexport type ActionLogSourceKey = (typeof ACTION_LOG_SOURCE_KEYS)[number]\n\ntype ProjectionInput = {\n actorUserId?: string | null\n actionLabel?: string | null\n changes?: Record<string, unknown> | null\n commandId: string\n context?: Record<string, unknown> | null\n snapshotBefore?: unknown\n}\n\nfunction normalizeText(value: string | null | undefined): string {\n return (value ?? '').trim().toLowerCase()\n}\n\nexport function deriveActionLogActionType(input: Pick<ProjectionInput, 'actionLabel' | 'commandId'>): ActionLogProjectionType {\n const normalizedCommandId = normalizeText(input.commandId)\n const normalizedLabel = normalizeText(input.actionLabel)\n\n if (\n normalizedCommandId.endsWith('.create') ||\n normalizedCommandId.endsWith('.add') ||\n normalizedLabel.includes('create') ||\n normalizedLabel.includes('add')\n ) {\n return 'create'\n }\n\n if (\n normalizedCommandId.endsWith('.delete') ||\n normalizedCommandId.endsWith('.remove') ||\n normalizedLabel.includes('delete') ||\n normalizedLabel.includes('remove')\n ) {\n return 'delete'\n }\n\n if (\n normalizedCommandId.endsWith('.assign') ||\n normalizedCommandId.endsWith('.unassign') ||\n normalizedLabel.includes('assign') ||\n normalizedLabel.includes('unassign')\n ) {\n return 'assign'\n }\n\n if (\n normalizedCommandId.endsWith('.update') ||\n normalizedCommandId.endsWith('.edit') ||\n normalizedCommandId.endsWith('.upsert') ||\n normalizedLabel.includes('update') ||\n normalizedLabel.includes('edit') ||\n normalizedLabel.includes('upsert')\n ) {\n return 'edit'\n }\n\n return 'system'\n}\n\nexport function deriveActionLogSource(\n context: Record<string, unknown> | null | undefined,\n actorUserId: string | null | undefined,\n): ActionLogSourceKey {\n const rawSource = isRecord(context) ? context.source : undefined\n const normalizedSource = typeof rawSource === 'string' ? rawSource.trim().toLowerCase() : ''\n\n if (normalizedSource === 'api') return 'api'\n if (normalizedSource === 'system') return 'system'\n if (normalizedSource === 'ui') return 'ui'\n // Agent-attributed writes flow through the same Command path as a human's; the\n // `runAs` wrapper stamps `context.source = 'agent'` so the action is sourced to\n // the agent principal (actorUserId) rather than defaulting to 'ui'.\n if (normalizedSource === 'agent') return 'agent'\n\n return actorUserId ? 'ui' : 'system'\n}\n\nexport function deriveActionLogChangedFields(\n changes: Record<string, unknown> | null | undefined,\n snapshotBefore: unknown,\n): string[] {\n return Array.from(\n new Set(\n extractChangeRows(changes, snapshotBefore)\n .map((entry) => entry.field)\n .filter((value) => typeof value === 'string' && value.trim().length > 0),\n ),\n ).sort((left, right) => left.localeCompare(right))\n}\n\nexport function deriveActionLogProjection(input: ProjectionInput): {\n actionType: ActionLogProjectionType\n changedFields: string[]\n primaryChangedField: string | null\n sourceKey: ActionLogSourceKey\n} {\n const changedFields = deriveActionLogChangedFields(input.changes, input.snapshotBefore)\n\n return {\n actionType: deriveActionLogActionType(input),\n changedFields,\n primaryChangedField: changedFields[0] ?? null,\n sourceKey: deriveActionLogSource(input.context, input.actorUserId),\n }\n}\n"],
5
+ "mappings": "AAAA,SAAS,mBAAmB,gBAAgB;AAErC,MAAM,0BAA0B,CAAC,UAAU,QAAQ,UAAU,QAAQ;AACrE,MAAM,8BAA8B,CAAC,GAAG,yBAAyB,QAAQ;AACzE,MAAM,yBAAyB,CAAC,MAAM,OAAO,UAAU,OAAO;AAerE,SAAS,cAAc,OAA0C;AAC/D,UAAQ,SAAS,IAAI,KAAK,EAAE,YAAY;AAC1C;AAEO,SAAS,0BAA0B,OAAoF;AAC5H,QAAM,sBAAsB,cAAc,MAAM,SAAS;AACzD,QAAM,kBAAkB,cAAc,MAAM,WAAW;AAEvD,MACE,oBAAoB,SAAS,SAAS,KACtC,oBAAoB,SAAS,MAAM,KACnC,gBAAgB,SAAS,QAAQ,KACjC,gBAAgB,SAAS,KAAK,GAC9B;AACA,WAAO;AAAA,EACT;AAEA,MACE,oBAAoB,SAAS,SAAS,KACtC,oBAAoB,SAAS,SAAS,KACtC,gBAAgB,SAAS,QAAQ,KACjC,gBAAgB,SAAS,QAAQ,GACjC;AACA,WAAO;AAAA,EACT;AAEA,MACE,oBAAoB,SAAS,SAAS,KACtC,oBAAoB,SAAS,WAAW,KACxC,gBAAgB,SAAS,QAAQ,KACjC,gBAAgB,SAAS,UAAU,GACnC;AACA,WAAO;AAAA,EACT;AAEA,MACE,oBAAoB,SAAS,SAAS,KACtC,oBAAoB,SAAS,OAAO,KACpC,oBAAoB,SAAS,SAAS,KACtC,gBAAgB,SAAS,QAAQ,KACjC,gBAAgB,SAAS,MAAM,KAC/B,gBAAgB,SAAS,QAAQ,GACjC;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,sBACd,SACA,aACoB;AACpB,QAAM,YAAY,SAAS,OAAO,IAAI,QAAQ,SAAS;AACvD,QAAM,mBAAmB,OAAO,cAAc,WAAW,UAAU,KAAK,EAAE,YAAY,IAAI;AAE1F,MAAI,qBAAqB,MAAO,QAAO;AACvC,MAAI,qBAAqB,SAAU,QAAO;AAC1C,MAAI,qBAAqB,KAAM,QAAO;AAItC,MAAI,qBAAqB,QAAS,QAAO;AAEzC,SAAO,cAAc,OAAO;AAC9B;AAEO,SAAS,6BACd,SACA,gBACU;AACV,SAAO,MAAM;AAAA,IACX,IAAI;AAAA,MACF,kBAAkB,SAAS,cAAc,EACtC,IAAI,CAAC,UAAU,MAAM,KAAK,EAC1B,OAAO,CAAC,UAAU,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,CAAC;AAAA,IAC3E;AAAA,EACF,EAAE,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC;AACnD;AAEO,SAAS,0BAA0B,OAKxC;AACA,QAAM,gBAAgB,6BAA6B,MAAM,SAAS,MAAM,cAAc;AAEtF,SAAO;AAAA,IACL,YAAY,0BAA0B,KAAK;AAAA,IAC3C;AAAA,IACA,qBAAqB,cAAc,CAAC,KAAK;AAAA,IACzC,WAAW,sBAAsB,MAAM,SAAS,MAAM,WAAW;AAAA,EACnE;AACF;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,15 @@
1
+ import { Migration } from "@mikro-orm/migrations";
2
+ class Migration20260625120000 extends Migration {
3
+ up() {
4
+ this.addSql(`alter table "action_logs" add column "on_behalf_of_user_id" uuid null;`);
5
+ this.addSql(`create index "action_logs_obo_idx" on "action_logs" ("on_behalf_of_user_id");`);
6
+ }
7
+ down() {
8
+ this.addSql(`drop index "action_logs_obo_idx";`);
9
+ this.addSql(`alter table "action_logs" drop column "on_behalf_of_user_id";`);
10
+ }
11
+ }
12
+ export {
13
+ Migration20260625120000
14
+ };
15
+ //# sourceMappingURL=Migration20260625120000.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/audit_logs/migrations/Migration20260625120000.ts"],
4
+ "sourcesContent": ["import { Migration } from '@mikro-orm/migrations';\n\nexport class Migration20260625120000 extends Migration {\n\n override up(): void | Promise<void> {\n this.addSql(`alter table \"action_logs\" add column \"on_behalf_of_user_id\" uuid null;`);\n this.addSql(`create index \"action_logs_obo_idx\" on \"action_logs\" (\"on_behalf_of_user_id\");`);\n }\n\n override down(): void | Promise<void> {\n this.addSql(`drop index \"action_logs_obo_idx\";`);\n this.addSql(`alter table \"action_logs\" drop column \"on_behalf_of_user_id\";`);\n }\n\n}\n"],
5
+ "mappings": "AAAA,SAAS,iBAAiB;AAEnB,MAAM,gCAAgC,UAAU;AAAA,EAE5C,KAA2B;AAClC,SAAK,OAAO,wEAAwE;AACpF,SAAK,OAAO,+EAA+E;AAAA,EAC7F;AAAA,EAES,OAA6B;AACpC,SAAK,OAAO,mCAAmC;AAC/C,SAAK,OAAO,+DAA+D;AAAA,EAC7E;AAEF;",
6
+ "names": []
7
+ }
@@ -216,6 +216,7 @@ class ActionLogService {
216
216
  tenantId: data.tenantId ?? null,
217
217
  organizationId: data.organizationId ?? null,
218
218
  actorUserId: data.actorUserId ?? null,
219
+ onBehalfOfUserId: data.onBehalfOfUserId ?? null,
219
220
  commandId: data.commandId,
220
221
  actionLabel: data.actionLabel ?? null,
221
222
  actionType: projection.actionType,
@@ -245,6 +246,7 @@ class ActionLogService {
245
246
  tenantId: null,
246
247
  organizationId: null,
247
248
  actorUserId: null,
249
+ onBehalfOfUserId: null,
248
250
  commandId: "unknown",
249
251
  actionLabel: void 0,
250
252
  resourceKind: void 0,
@@ -271,6 +273,7 @@ class ActionLogService {
271
273
  tenantId: toNullableUuid(input.tenantId),
272
274
  organizationId: toNullableUuid(input.organizationId),
273
275
  actorUserId: normalizeActorUserId(input.actorUserId),
276
+ onBehalfOfUserId: toNullableUuid(input.onBehalfOfUserId),
274
277
  commandId: typeof input.commandId === "string" && input.commandId.length > 0 ? input.commandId : "unknown",
275
278
  actionLabel: toOptionalString(input.actionLabel) ?? void 0,
276
279
  resourceKind: toOptionalString(input.resourceKind) ?? void 0,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/audit_logs/services/actionLogService.ts"],
4
- "sourcesContent": ["import type { FilterQuery } from '@mikro-orm/core'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport { sql } from 'kysely'\nimport { ActionLog } from '@open-mercato/core/modules/audit_logs/data/entities'\nimport {\n actionLogCreateSchema,\n actionLogListSchema,\n uuid,\n type ActionLogCreateInput,\n type ActionLogListQuery,\n} from '@open-mercato/core/modules/audit_logs/data/validators'\nimport { isRecord } from '@open-mercato/core/modules/audit_logs/lib/changeRows'\nimport {\n ACTION_LOG_FILTER_TYPES,\n type ActionLogFilterType,\n deriveActionLogProjection,\n} from '@open-mercato/core/modules/audit_logs/lib/projections'\nimport { decryptWithAesGcm } from '@open-mercato/shared/lib/encryption/aes'\nimport {\n TenantDataEncryptionService,\n parseDecryptedFieldValue,\n} from '@open-mercato/shared/lib/encryption/tenantDataEncryptionService'\nimport { toOptionalString } from '@open-mercato/shared/lib/string/coerce'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\n\nconst logger = createLogger('audit_logs').child({ component: 'action-log-service' })\n\nlet validationWarningLogged = false\nlet runtimeValidationAvailable: boolean | null = null\nlet decryptionWarningLogged = false\n\nconst isZodRuntimeMissing = (err: unknown) => err instanceof TypeError && typeof err.message === 'string' && err.message.includes('_zod')\n\nconst SORT_FIELDS = {\n createdAt: 'action_logs.created_at',\n} as const\nconst UUID_REGEX = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$/\n// Mirrors what `uuid` (`data/validators.ts`) accepts \u2014 versions 1-8 plus the nil and\n// max UUIDs \u2014 and is used only when the zod runtime is unavailable, so the actor\n// sanitizer can never reject a value `actionLogCreateSchema` would have accepted.\nexport const SCHEMA_UUID_REGEX = /^(?:[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/\nconst API_KEY_ACTOR_PREFIX = 'api_key:'\nconst SYSTEM_ACTOR_PREFIX = 'system:'\n// `context.systemActor` names the automated principal behind an entry; `context.source`\n// (read by `deriveActionLogSource`) names the channel it arrived through. They are\n// siblings on purpose and never contradict each other: an entry carrying `systemActor`\n// has a null actor column, which already derives the `system` source.\nconst SYSTEM_ACTOR_CONTEXT_KEY = 'systemActor'\nconst SYSTEM_ACTOR_REFERENCE_MAX_LENGTH = 255\n\nfunction toNullableUuid(value: unknown): string | null {\n return typeof value === 'string' && UUID_REGEX.test(value) ? value : null\n}\n\nfunction isSchemaUuid(value: string): boolean {\n if (runtimeValidationAvailable === false) return SCHEMA_UUID_REGEX.test(value)\n\n try {\n return uuid.safeParse(value).success\n } catch (err) {\n if (isZodRuntimeMissing(err)) runtimeValidationAvailable = false\n return SCHEMA_UUID_REGEX.test(value)\n }\n}\n\nfunction readActorCandidate(value: unknown): string | null {\n if (typeof value !== 'string') return null\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : null\n}\n\nfunction normalizeActorUserId(value: unknown): string | null {\n const candidate = readActorCandidate(value)\n if (!candidate) return null\n const unwrapped = candidate.startsWith(API_KEY_ACTOR_PREFIX)\n ? candidate.slice(API_KEY_ACTOR_PREFIX.length)\n : candidate\n\n return isSchemaUuid(unwrapped) ? unwrapped : null\n}\n\nfunction toSystemActorReference(candidate: string): string | null {\n if (!candidate.startsWith(SYSTEM_ACTOR_PREFIX)) return null\n if (candidate.length === SYSTEM_ACTOR_PREFIX.length) return null\n return candidate.slice(0, SYSTEM_ACTOR_REFERENCE_MAX_LENGTH)\n}\n\ntype ActionLogProjectionBackfillOptions = {\n batchSize?: number\n force?: boolean\n logger?: (message: string) => void\n organizationId?: string | null\n tenantId?: string | null\n}\n\nexport type ActionLogProjectionBackfillResult = {\n errors: number\n scanned: number\n skipped: number\n updated: number\n}\n\ntype BackfillRow = {\n action_label: string | null\n action_type: string | null\n actor_user_id: string | null\n changed_fields: string[] | null\n changes_json: Record<string, unknown> | null\n command_id: string\n context_json: Record<string, unknown> | null\n created_at: Date\n id: string\n organization_id: string | null\n primary_changed_field: string | null\n snapshot_before: unknown | null\n source_key: string | null\n tenant_id: string | null\n}\n\nfunction readString(record: Record<string, unknown>, ...keys: string[]): string | null {\n for (const key of keys) {\n const value = record[key]\n if (typeof value === 'string' && value.length > 0) return value\n }\n\n return null\n}\n\nfunction readRecord(record: Record<string, unknown>, ...keys: string[]): Record<string, unknown> | null {\n for (const key of keys) {\n const value = record[key]\n if (isRecord(value)) return value\n }\n\n return null\n}\n\nfunction readValue(record: Record<string, unknown>, ...keys: string[]): unknown {\n for (const key of keys) {\n if (Object.prototype.hasOwnProperty.call(record, key)) return record[key]\n }\n\n return undefined\n}\n\nfunction readStringArray(record: Record<string, unknown>, ...keys: string[]): string[] | null {\n for (const key of keys) {\n const value = record[key]\n if (Array.isArray(value)) {\n return value.filter((entry): entry is string => typeof entry === 'string')\n }\n }\n\n return null\n}\n\nfunction stringArraysEqual(left: string[] | null, right: string[]): boolean {\n if (!Array.isArray(left)) return false\n if (left.length !== right.length) return false\n\n return left.every((value, index) => value === right[index])\n}\n\nexport class ActionLogService {\n constructor(\n private readonly em: EntityManager,\n private readonly tenantEncryptionService?: TenantDataEncryptionService,\n ) {}\n\n private async decryptEntryPayload<T extends Record<string, unknown>>(entry: T): Promise<T> {\n if (!this.tenantEncryptionService?.isEnabled()) return entry\n\n try {\n const tenantId = readString(entry, 'tenantId', 'tenant_id')\n const organizationId = readString(entry, 'organizationId', 'organization_id')\n const dek = await this.tenantEncryptionService.getDek(tenantId)\n const deepDecrypt = (value: unknown): unknown => {\n if (!dek) return value\n if (typeof value === 'string' && value.split(':').length === 4 && value.endsWith(':v1')) {\n const decrypted = decryptWithAesGcm(value, dek.key)\n if (decrypted === null) return value\n return parseDecryptedFieldValue(decrypted)\n }\n if (Array.isArray(value)) return value.map((item) => deepDecrypt(item))\n if (value && typeof value === 'object') {\n const copy: Record<string, unknown> = {}\n for (const [key, item] of Object.entries(value as Record<string, unknown>)) {\n copy[key] = deepDecrypt(item)\n }\n return copy\n }\n return value\n }\n\n const decrypted = await this.tenantEncryptionService.decryptEntityPayload(\n 'audit_logs:action_log',\n entry,\n tenantId,\n organizationId,\n )\n\n const merged = {\n ...entry,\n ...decrypted,\n } as Record<string, unknown>\n\n // Audit log jsonb columns are encrypted as JSON-stringified payloads. After the\n // service-level `decryptEntityPayload` call (which now returns raw strings \u2014\n // see issue #1810 follow-up), reattach the structured shape via\n // `parseDecryptedFieldValue` before running the recursive `deepDecrypt` walk\n // so nested encrypted strings inside payload objects/arrays are handled.\n const restoreJson = (value: unknown): unknown =>\n typeof value === 'string' ? parseDecryptedFieldValue(value) : value\n\n merged.changesJson = deepDecrypt(restoreJson(merged.changesJson ?? merged.changes_json ?? entry.changesJson ?? entry.changes_json))\n merged.changes_json = merged.changesJson\n merged.snapshotBefore = deepDecrypt(restoreJson(merged.snapshotBefore ?? merged.snapshot_before ?? entry.snapshotBefore ?? entry.snapshot_before))\n merged.snapshot_before = merged.snapshotBefore\n merged.snapshotAfter = deepDecrypt(restoreJson(merged.snapshotAfter ?? merged.snapshot_after ?? entry.snapshotAfter ?? entry.snapshot_after))\n merged.snapshot_after = merged.snapshotAfter\n merged.commandPayload = deepDecrypt(restoreJson(merged.commandPayload ?? merged.command_payload ?? entry.commandPayload ?? entry.command_payload))\n merged.command_payload = merged.commandPayload\n merged.contextJson = deepDecrypt(restoreJson(merged.contextJson ?? merged.context_json ?? entry.contextJson ?? entry.context_json))\n merged.context_json = merged.contextJson\n\n return merged as T\n } catch (err) {\n if (!decryptionWarningLogged) {\n decryptionWarningLogged = true\n logger.warn('Failed to decrypt action log entry', { err })\n }\n return entry\n }\n }\n\n private async decryptEntries(entries: ActionLog | ActionLog[] | null | undefined): Promise<void> {\n if (!entries) return\n\n const list = Array.isArray(entries) ? entries : [entries]\n for (const entry of list) {\n Object.assign(entry as unknown as Record<string, unknown>, await this.decryptEntryPayload(entry as unknown as Record<string, unknown>))\n }\n }\n\n async log(input: ActionLogCreateInput): Promise<ActionLog | null> {\n const data = this.parseCreateInput(input)\n const fork = this.em.fork()\n const log = this.createLogEntity(fork, data)\n await fork.persist(log).flush()\n await this.decryptEntries(log)\n return log\n }\n\n private parseCreateInput(input: ActionLogCreateInput): ActionLogCreateInput {\n const sanitized = this.sanitizeActor(input)\n let data: ActionLogCreateInput\n const schema = actionLogCreateSchema as typeof actionLogCreateSchema & { _zod?: unknown }\n const canValidate = Boolean(schema && typeof schema.parse === 'function')\n const shouldValidate = canValidate && runtimeValidationAvailable !== false\n\n if (shouldValidate) {\n try {\n data = schema.parse(sanitized)\n runtimeValidationAvailable = true\n } catch (err) {\n if (!isZodRuntimeMissing(err) && !validationWarningLogged) {\n validationWarningLogged = true\n logger.warn('Falling back to permissive action log payload parser', { err })\n }\n if (isZodRuntimeMissing(err)) runtimeValidationAvailable = false\n data = this.normalizeInput(sanitized)\n }\n } else {\n data = this.normalizeInput(sanitized)\n }\n\n return data\n }\n\n private sanitizeActor(input: ActionLogCreateInput): ActionLogCreateInput {\n if (!input) return input\n const candidate = readActorCandidate(input.actorUserId)\n const actorUserId = normalizeActorUserId(candidate)\n const systemActorReference = candidate && !actorUserId ? toSystemActorReference(candidate) : null\n\n if (!systemActorReference) {\n if (actorUserId === (input.actorUserId ?? null)) return input\n return { ...input, actorUserId }\n }\n\n const context = isRecord(input.context) ? { ...input.context } : {}\n if (context[SYSTEM_ACTOR_CONTEXT_KEY] === undefined) {\n context[SYSTEM_ACTOR_CONTEXT_KEY] = systemActorReference\n }\n\n return { ...input, actorUserId, context }\n }\n\n private createLogEntity(fork: EntityManager, data: ActionLogCreateInput): ActionLog {\n const projection = deriveActionLogProjection({\n actorUserId: data.actorUserId ?? null,\n actionLabel: data.actionLabel ?? null,\n changes: isRecord(data.changes) ? data.changes : null,\n commandId: data.commandId,\n context: isRecord(data.context) ? data.context : null,\n snapshotBefore: data.snapshotBefore,\n })\n\n return fork.create(ActionLog, {\n tenantId: data.tenantId ?? null,\n organizationId: data.organizationId ?? null,\n actorUserId: data.actorUserId ?? null,\n commandId: data.commandId,\n actionLabel: data.actionLabel ?? null,\n actionType: projection.actionType,\n resourceKind: data.resourceKind ?? null,\n resourceId: data.resourceId ?? null,\n parentResourceKind: data.parentResourceKind ?? null,\n parentResourceId: data.parentResourceId ?? null,\n relatedResourceKind: toOptionalString(data.relatedResourceKind) ?? null,\n relatedResourceId: toOptionalString(data.relatedResourceId) ?? null,\n executionState: data.executionState ?? 'done',\n undoToken: data.undoToken ?? null,\n commandPayload: data.commandPayload ?? null,\n snapshotBefore: data.snapshotBefore ?? null,\n snapshotAfter: data.snapshotAfter ?? null,\n changesJson: isRecord(data.changes) ? data.changes : null,\n changedFields: projection.changedFields,\n primaryChangedField: projection.primaryChangedField,\n contextJson: isRecord(data.context) ? data.context : null,\n sourceKey: projection.sourceKey,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n }\n\n private normalizeInput(input: Partial<ActionLogCreateInput> | null | undefined): ActionLogCreateInput {\n if (!input) {\n return {\n tenantId: null,\n organizationId: null,\n actorUserId: null,\n commandId: 'unknown',\n actionLabel: undefined,\n resourceKind: undefined,\n resourceId: undefined,\n relatedResourceKind: null,\n relatedResourceId: null,\n executionState: 'done',\n undoToken: undefined,\n commandPayload: undefined,\n snapshotBefore: undefined,\n snapshotAfter: undefined,\n changes: undefined,\n context: undefined,\n }\n }\n\n const normalizeRecordLike = (value: unknown): ActionLogCreateInput['changes'] => {\n if (value === null) return null\n if (Array.isArray(value)) return value\n if (typeof value === 'object') return value as Record<string, unknown>\n return undefined\n }\n\n const normalizeContext = (value: unknown) => (\n typeof value === 'object' && value !== null && !Array.isArray(value)\n ? value as Record<string, unknown>\n : undefined\n )\n\n return {\n tenantId: toNullableUuid(input.tenantId),\n organizationId: toNullableUuid(input.organizationId),\n actorUserId: normalizeActorUserId(input.actorUserId),\n commandId: typeof input.commandId === 'string' && input.commandId.length > 0 ? input.commandId : 'unknown',\n actionLabel: toOptionalString(input.actionLabel) ?? undefined,\n resourceKind: toOptionalString(input.resourceKind) ?? undefined,\n resourceId: toOptionalString(input.resourceId) ?? undefined,\n parentResourceKind: toOptionalString(input.parentResourceKind) ?? null,\n parentResourceId: toOptionalString(input.parentResourceId) ?? null,\n relatedResourceKind: toOptionalString(input.relatedResourceKind) ?? null,\n relatedResourceId: toOptionalString(input.relatedResourceId) ?? null,\n executionState: input.executionState === 'undone' || input.executionState === 'failed' ? input.executionState : 'done',\n undoToken: toOptionalString(input.undoToken) ?? undefined,\n commandPayload: input.commandPayload,\n snapshotBefore: input.snapshotBefore,\n snapshotAfter: input.snapshotAfter,\n changes: normalizeRecordLike(input.changes),\n context: normalizeContext(input.context),\n }\n }\n\n private parseListQuery(query: Partial<ActionLogListQuery>) {\n return actionLogListSchema.parse({\n ...query,\n })\n }\n\n private resolveActorUserIds(parsed: ActionLogListQuery): string[] {\n const values = [...(parsed.actorUserIds ?? [])]\n if (parsed.actorUserId) values.push(parsed.actorUserId)\n\n return Array.from(new Set(values.map((value) => value.trim()).filter(Boolean)))\n }\n\n private resolveFieldNames(parsed: ActionLogListQuery): string[] {\n const values = [...(parsed.fieldNames ?? [])]\n if (parsed.fieldName) values.push(parsed.fieldName)\n\n return Array.from(new Set(values.map((value) => value.trim()).filter(Boolean)))\n }\n\n private resolveActionTypes(parsed: ActionLogListQuery): ActionLogFilterType[] {\n const values = [...(parsed.actionTypes ?? [])]\n if (parsed.actionType) values.push(parsed.actionType)\n\n return Array.from(new Set(values))\n .filter((value): value is ActionLogFilterType => ACTION_LOG_FILTER_TYPES.includes(value as ActionLogFilterType))\n }\n\n private resolvePagination(parsed: ActionLogListQuery): { page: number; pageSize: number; offset: number; limit: number } {\n const pageSize =\n typeof parsed.pageSize === 'number' && parsed.pageSize > 0\n ? parsed.pageSize\n : typeof parsed.limit === 'number' && parsed.limit > 0\n ? parsed.limit\n : 50\n const page = typeof parsed.page === 'number' && parsed.page > 0 ? parsed.page : 1\n const offset =\n typeof parsed.offset === 'number' && parsed.offset >= 0\n ? parsed.offset\n : (page - 1) * pageSize\n return { page, pageSize, offset, limit: pageSize }\n }\n\n private async loadEntries(parsed: ActionLogListQuery, options?: { paginate?: boolean }) {\n let query = (this.buildListQuery(parsed) as any).select('action_logs.id as id')\n\n if (options?.paginate !== false) {\n const { limit, offset } = this.resolvePagination(parsed)\n query = query.limit(limit).offset(offset)\n }\n\n const rows = await query.execute()\n const ids = rows.map((row: any) => row.id).filter(Boolean)\n if (ids.length === 0) return []\n\n const results = await this.em.find(ActionLog, {\n id: { $in: ids } as any,\n deletedAt: null,\n })\n await this.decryptEntries(results)\n\n const byId = new Map(results.map((entry: any) => [entry.id, entry]))\n return ids\n .map((id: any) => byId.get(id))\n .filter((entry: any): entry is ActionLog => Boolean(entry))\n }\n\n private buildListQuery(parsed: ActionLogListQuery): any {\n let query = (this.em.getKysely<any>() as any)\n .selectFrom('action_logs')\n .selectAll()\n .where('action_logs.deleted_at', 'is', null) as any\n\n if (parsed.tenantId) query = query.where('action_logs.tenant_id', '=', parsed.tenantId)\n if (parsed.organizationId) query = query.where('action_logs.organization_id', '=', parsed.organizationId)\n\n const actorUserIds = this.resolveActorUserIds(parsed)\n if (actorUserIds.length === 1) query = query.where('action_logs.actor_user_id', '=', actorUserIds[0])\n if (actorUserIds.length > 1) query = query.where('action_logs.actor_user_id', 'in', actorUserIds)\n\n if (parsed.includeRelated && parsed.resourceKind && parsed.resourceId) {\n query = query.where((eb: any) =>\n eb.or([\n eb.and([\n eb('action_logs.resource_kind', '=', parsed.resourceKind),\n eb('action_logs.resource_id', '=', parsed.resourceId),\n ]),\n eb.and([\n eb('action_logs.parent_resource_kind', '=', parsed.resourceKind),\n eb('action_logs.parent_resource_id', '=', parsed.resourceId),\n ]),\n eb.and([\n eb('action_logs.related_resource_kind', '=', parsed.resourceKind),\n eb('action_logs.related_resource_id', '=', parsed.resourceId),\n ]),\n ])\n )\n } else {\n if (parsed.resourceKind) query = query.where('action_logs.resource_kind', '=', parsed.resourceKind)\n if (parsed.resourceId) query = query.where('action_logs.resource_id', '=', parsed.resourceId)\n }\n\n if (parsed.undoableOnly) query = query.where('action_logs.undo_token', 'is not', null)\n if (parsed.before) query = query.where('action_logs.created_at', '<', parsed.before)\n if (parsed.after) query = query.where('action_logs.created_at', '>', parsed.after)\n\n const fieldNames = this.resolveFieldNames(parsed)\n if (fieldNames.length === 1) query = query.where('action_logs.primary_changed_field', '=', fieldNames[0])\n if (fieldNames.length > 1) query = query.where('action_logs.primary_changed_field', 'in', fieldNames)\n\n const actionTypes = this.resolveActionTypes(parsed)\n if (actionTypes.length === 1) query = query.where('action_logs.action_type', '=', actionTypes[0])\n if (actionTypes.length > 1) query = query.where('action_logs.action_type', 'in', actionTypes)\n\n if (parsed.sortField === 'user') {\n query = query.leftJoin('users as audit_actor', 'audit_actor.id', 'action_logs.actor_user_id')\n }\n\n const sortDir = parsed.sortDir === 'asc' ? 'asc' : 'desc'\n switch (parsed.sortField) {\n case 'user':\n query = query.orderBy(sql`coalesce(nullif(audit_actor.name, ''), audit_actor.email, '')`, sortDir)\n break\n case 'action':\n query = query.orderBy(sql`coalesce(action_logs.action_type, '')`, sortDir)\n break\n case 'field':\n query = query.orderBy(sql`coalesce(action_logs.primary_changed_field, '')`, sortDir)\n break\n case 'source':\n query = query.orderBy(sql`coalesce(action_logs.source_key, '')`, sortDir)\n break\n case 'createdAt':\n default:\n query = query.orderBy(SORT_FIELDS.createdAt, sortDir)\n query = query.orderBy('action_logs.id', sortDir)\n return query\n }\n\n query = query.orderBy('action_logs.created_at', 'desc')\n query = query.orderBy('action_logs.id', 'desc')\n return query\n }\n\n async count(query: Partial<ActionLogListQuery>) {\n const parsed = this.parseListQuery(query)\n const row = await (this.buildListQuery(parsed) as any)\n .clearSelect()\n .clearOrderBy()\n .select(sql<string>`count(*)`.as('count'))\n .executeTakeFirst()\n\n if (!row) return 0\n const rawCount = row.count ?? 0\n return typeof rawCount === 'number' ? rawCount : Number.parseInt(rawCount, 10) || 0\n }\n\n async list(query: Partial<ActionLogListQuery>) {\n const parsed = this.parseListQuery(query)\n const { page, pageSize } = this.resolvePagination(parsed)\n const [items, total] = await Promise.all([\n this.loadEntries(parsed),\n this.count(parsed),\n ])\n const totalPages = Math.max(1, Math.ceil((total || 0) / (pageSize || 1)))\n return { items, total, page, pageSize, totalPages }\n }\n\n async latestUndoableForActor(actorUserId: string, scope: { tenantId?: string | null; organizationId?: string | null }) {\n const where: FilterQuery<ActionLog> = {\n actorUserId,\n undoToken: { $ne: null } as any,\n executionState: 'done',\n deletedAt: null,\n }\n if (scope.tenantId) where.tenantId = scope.tenantId\n if (scope.organizationId) where.organizationId = scope.organizationId\n\n const entry = await this.em.findOne(ActionLog, where, { orderBy: { createdAt: 'desc' } })\n await this.decryptEntries(entry)\n return entry\n }\n\n async claimForUndo(id: string): Promise<boolean> {\n const affected = await this.em.nativeUpdate(\n ActionLog,\n { id, executionState: 'done', deletedAt: null },\n { executionState: 'undoing' },\n )\n return affected === 1\n }\n\n async releaseUndoClaim(id: string): Promise<boolean> {\n const affected = await this.em.nativeUpdate(\n ActionLog,\n { id, executionState: 'undoing', deletedAt: null },\n { executionState: 'done' },\n )\n return affected === 1\n }\n\n async markUndone(id: string, traceInput?: ActionLogCreateInput) {\n const fork = this.em.fork()\n const log = await fork.findOne(ActionLog, { id, deletedAt: null })\n if (!log) return null\n\n log.executionState = 'undone'\n log.undoToken = null\n\n const traceLog = traceInput ? this.createLogEntity(fork, this.parseCreateInput(traceInput)) : null\n if (traceLog) {\n fork.persist(traceLog)\n }\n\n await fork.flush()\n await this.decryptEntries(log)\n if (traceLog) await this.decryptEntries(traceLog)\n\n return log\n }\n\n async findByUndoToken(undoToken: string) {\n const entry = await this.em.findOne(ActionLog, { undoToken, deletedAt: null })\n await this.decryptEntries(entry)\n return entry\n }\n\n async findById(id: string) {\n const entry = await this.em.findOne(ActionLog, { id, deletedAt: null })\n await this.decryptEntries(entry)\n return entry\n }\n\n async latestUndoableForResource(params: {\n actorUserId: string\n tenantId?: string | null\n organizationId?: string | null\n resourceKind?: string | null\n resourceId?: string | null\n }) {\n const where: FilterQuery<ActionLog> = {\n actorUserId: params.actorUserId,\n undoToken: { $ne: null } as any,\n executionState: 'done',\n deletedAt: null,\n }\n if (params.tenantId) where.tenantId = params.tenantId\n if (params.organizationId) where.organizationId = params.organizationId\n if (params.resourceKind) where.resourceKind = params.resourceKind\n if (params.resourceId) where.resourceId = params.resourceId\n\n const entry = await this.em.findOne(ActionLog, where, { orderBy: { createdAt: 'desc' } })\n await this.decryptEntries(entry)\n return entry\n }\n\n async latestUndoneForActor(actorUserId: string, scope: { tenantId?: string | null; organizationId?: string | null }) {\n const where: FilterQuery<ActionLog> = {\n actorUserId,\n executionState: 'undone',\n deletedAt: null,\n }\n if (scope.tenantId) where.tenantId = scope.tenantId\n if (scope.organizationId) where.organizationId = scope.organizationId\n\n const entry = await this.em.findOne(ActionLog, where, { orderBy: { updatedAt: 'desc' } })\n await this.decryptEntries(entry)\n return entry\n }\n\n async markRedone(id: string) {\n const log = await this.em.findOne(ActionLog, { id, deletedAt: null })\n if (!log) return null\n\n log.executionState = 'redone'\n log.undoToken = null\n await this.em.flush()\n return log\n }\n\n async backfillProjections(options: ActionLogProjectionBackfillOptions = {}): Promise<ActionLogProjectionBackfillResult> {\n const batchSize = Math.min(Math.max(Math.trunc(options.batchSize ?? 250), 1), 1000)\n const logger = options.logger ?? (() => {})\n const result: ActionLogProjectionBackfillResult = {\n errors: 0,\n scanned: 0,\n skipped: 0,\n updated: 0,\n }\n\n let cursorCreatedAt: Date | null = null\n let cursorId: string | null = null\n\n while (true) {\n const rowsQuery = (this.em.getKysely<any>() as any)\n .selectFrom('action_logs')\n .select([\n 'action_logs.id',\n 'action_logs.tenant_id',\n 'action_logs.organization_id',\n 'action_logs.actor_user_id',\n 'action_logs.command_id',\n 'action_logs.action_label',\n 'action_logs.snapshot_before',\n 'action_logs.changes_json',\n 'action_logs.context_json',\n 'action_logs.action_type',\n 'action_logs.source_key',\n 'action_logs.changed_fields',\n 'action_logs.primary_changed_field',\n 'action_logs.created_at',\n ])\n .where('action_logs.deleted_at', 'is', null) as any\n\n if (options.tenantId) rowsQuery.where('action_logs.tenant_id', '=', options.tenantId)\n if (options.organizationId) rowsQuery.where('action_logs.organization_id', '=', options.organizationId)\n\n if (!options.force) {\n rowsQuery.where((eb: any) =>\n eb.or([\n eb('action_logs.action_type', 'is', null),\n eb('action_logs.source_key', 'is', null),\n eb('action_logs.changed_fields', 'is', null),\n ])\n )\n }\n\n if (cursorCreatedAt && cursorId) {\n rowsQuery.where((eb: any) =>\n eb.or([\n eb('action_logs.created_at', '>', cursorCreatedAt),\n eb.and([\n eb('action_logs.created_at', '=', cursorCreatedAt),\n eb('action_logs.id', '>', cursorId),\n ]),\n ])\n )\n }\n\n const rows = await rowsQuery\n .orderBy('created_at', 'asc')\n .orderBy('id', 'asc')\n .limit(batchSize)\n\n if (rows.length === 0) break\n\n for (const row of rows) {\n result.scanned += 1\n\n try {\n const decrypted = await this.decryptEntryPayload(row as unknown as Record<string, unknown>)\n const projection = deriveActionLogProjection({\n actorUserId: readString(decrypted, 'actorUserId', 'actor_user_id'),\n actionLabel: readString(decrypted, 'actionLabel', 'action_label'),\n changes: readRecord(decrypted, 'changesJson', 'changes_json'),\n commandId: readString(decrypted, 'commandId', 'command_id') ?? 'unknown',\n context: readRecord(decrypted, 'contextJson', 'context_json'),\n snapshotBefore: readValue(decrypted, 'snapshotBefore', 'snapshot_before'),\n })\n\n const needsUpdate = options.force === true\n || row.action_type !== projection.actionType\n || row.source_key !== projection.sourceKey\n || row.primary_changed_field !== projection.primaryChangedField\n || !stringArraysEqual(row.changed_fields, projection.changedFields)\n\n if (!needsUpdate) {\n result.skipped += 1\n continue\n }\n\n await (this.em.getKysely<any>() as any)\n .updateTable('action_logs')\n .set({\n action_type: projection.actionType,\n changed_fields: projection.changedFields,\n primary_changed_field: projection.primaryChangedField,\n source_key: projection.sourceKey,\n })\n .where('id', '=', row.id)\n .execute()\n\n result.updated += 1\n } catch (err) {\n result.errors += 1\n logger(`[backfill] Failed for action log ${row.id}: ${err instanceof Error ? err.message : String(err)}`)\n }\n }\n\n const lastRow = rows[rows.length - 1]\n cursorCreatedAt = lastRow.created_at\n cursorId = lastRow.id\n\n logger(\n `[backfill] Processed ${result.scanned} action logs (updated: ${result.updated}, skipped: ${result.skipped}, errors: ${result.errors})`,\n )\n\n if (rows.length < batchSize) break\n }\n\n return result\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { FilterQuery } from '@mikro-orm/core'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport { sql } from 'kysely'\nimport { ActionLog } from '@open-mercato/core/modules/audit_logs/data/entities'\nimport {\n actionLogCreateSchema,\n actionLogListSchema,\n uuid,\n type ActionLogCreateInput,\n type ActionLogListQuery,\n} from '@open-mercato/core/modules/audit_logs/data/validators'\nimport { isRecord } from '@open-mercato/core/modules/audit_logs/lib/changeRows'\nimport {\n ACTION_LOG_FILTER_TYPES,\n type ActionLogFilterType,\n deriveActionLogProjection,\n} from '@open-mercato/core/modules/audit_logs/lib/projections'\nimport { decryptWithAesGcm } from '@open-mercato/shared/lib/encryption/aes'\nimport {\n TenantDataEncryptionService,\n parseDecryptedFieldValue,\n} from '@open-mercato/shared/lib/encryption/tenantDataEncryptionService'\nimport { toOptionalString } from '@open-mercato/shared/lib/string/coerce'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\n\nconst logger = createLogger('audit_logs').child({ component: 'action-log-service' })\n\nlet validationWarningLogged = false\nlet runtimeValidationAvailable: boolean | null = null\nlet decryptionWarningLogged = false\n\nconst isZodRuntimeMissing = (err: unknown) => err instanceof TypeError && typeof err.message === 'string' && err.message.includes('_zod')\n\nconst SORT_FIELDS = {\n createdAt: 'action_logs.created_at',\n} as const\nconst UUID_REGEX = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$/\n// Mirrors what `uuid` (`data/validators.ts`) accepts \u2014 versions 1-8 plus the nil and\n// max UUIDs \u2014 and is used only when the zod runtime is unavailable, so the actor\n// sanitizer can never reject a value `actionLogCreateSchema` would have accepted.\nexport const SCHEMA_UUID_REGEX = /^(?:[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/\nconst API_KEY_ACTOR_PREFIX = 'api_key:'\nconst SYSTEM_ACTOR_PREFIX = 'system:'\n// `context.systemActor` names the automated principal behind an entry; `context.source`\n// (read by `deriveActionLogSource`) names the channel it arrived through. They are\n// siblings on purpose and never contradict each other: an entry carrying `systemActor`\n// has a null actor column, which already derives the `system` source.\nconst SYSTEM_ACTOR_CONTEXT_KEY = 'systemActor'\nconst SYSTEM_ACTOR_REFERENCE_MAX_LENGTH = 255\n\nfunction toNullableUuid(value: unknown): string | null {\n return typeof value === 'string' && UUID_REGEX.test(value) ? value : null\n}\n\nfunction isSchemaUuid(value: string): boolean {\n if (runtimeValidationAvailable === false) return SCHEMA_UUID_REGEX.test(value)\n\n try {\n return uuid.safeParse(value).success\n } catch (err) {\n if (isZodRuntimeMissing(err)) runtimeValidationAvailable = false\n return SCHEMA_UUID_REGEX.test(value)\n }\n}\n\nfunction readActorCandidate(value: unknown): string | null {\n if (typeof value !== 'string') return null\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : null\n}\n\nfunction normalizeActorUserId(value: unknown): string | null {\n const candidate = readActorCandidate(value)\n if (!candidate) return null\n const unwrapped = candidate.startsWith(API_KEY_ACTOR_PREFIX)\n ? candidate.slice(API_KEY_ACTOR_PREFIX.length)\n : candidate\n\n return isSchemaUuid(unwrapped) ? unwrapped : null\n}\n\nfunction toSystemActorReference(candidate: string): string | null {\n if (!candidate.startsWith(SYSTEM_ACTOR_PREFIX)) return null\n if (candidate.length === SYSTEM_ACTOR_PREFIX.length) return null\n return candidate.slice(0, SYSTEM_ACTOR_REFERENCE_MAX_LENGTH)\n}\n\ntype ActionLogProjectionBackfillOptions = {\n batchSize?: number\n force?: boolean\n logger?: (message: string) => void\n organizationId?: string | null\n tenantId?: string | null\n}\n\nexport type ActionLogProjectionBackfillResult = {\n errors: number\n scanned: number\n skipped: number\n updated: number\n}\n\ntype BackfillRow = {\n action_label: string | null\n action_type: string | null\n actor_user_id: string | null\n changed_fields: string[] | null\n changes_json: Record<string, unknown> | null\n command_id: string\n context_json: Record<string, unknown> | null\n created_at: Date\n id: string\n organization_id: string | null\n primary_changed_field: string | null\n snapshot_before: unknown | null\n source_key: string | null\n tenant_id: string | null\n}\n\nfunction readString(record: Record<string, unknown>, ...keys: string[]): string | null {\n for (const key of keys) {\n const value = record[key]\n if (typeof value === 'string' && value.length > 0) return value\n }\n\n return null\n}\n\nfunction readRecord(record: Record<string, unknown>, ...keys: string[]): Record<string, unknown> | null {\n for (const key of keys) {\n const value = record[key]\n if (isRecord(value)) return value\n }\n\n return null\n}\n\nfunction readValue(record: Record<string, unknown>, ...keys: string[]): unknown {\n for (const key of keys) {\n if (Object.prototype.hasOwnProperty.call(record, key)) return record[key]\n }\n\n return undefined\n}\n\nfunction readStringArray(record: Record<string, unknown>, ...keys: string[]): string[] | null {\n for (const key of keys) {\n const value = record[key]\n if (Array.isArray(value)) {\n return value.filter((entry): entry is string => typeof entry === 'string')\n }\n }\n\n return null\n}\n\nfunction stringArraysEqual(left: string[] | null, right: string[]): boolean {\n if (!Array.isArray(left)) return false\n if (left.length !== right.length) return false\n\n return left.every((value, index) => value === right[index])\n}\n\nexport class ActionLogService {\n constructor(\n private readonly em: EntityManager,\n private readonly tenantEncryptionService?: TenantDataEncryptionService,\n ) {}\n\n private async decryptEntryPayload<T extends Record<string, unknown>>(entry: T): Promise<T> {\n if (!this.tenantEncryptionService?.isEnabled()) return entry\n\n try {\n const tenantId = readString(entry, 'tenantId', 'tenant_id')\n const organizationId = readString(entry, 'organizationId', 'organization_id')\n const dek = await this.tenantEncryptionService.getDek(tenantId)\n const deepDecrypt = (value: unknown): unknown => {\n if (!dek) return value\n if (typeof value === 'string' && value.split(':').length === 4 && value.endsWith(':v1')) {\n const decrypted = decryptWithAesGcm(value, dek.key)\n if (decrypted === null) return value\n return parseDecryptedFieldValue(decrypted)\n }\n if (Array.isArray(value)) return value.map((item) => deepDecrypt(item))\n if (value && typeof value === 'object') {\n const copy: Record<string, unknown> = {}\n for (const [key, item] of Object.entries(value as Record<string, unknown>)) {\n copy[key] = deepDecrypt(item)\n }\n return copy\n }\n return value\n }\n\n const decrypted = await this.tenantEncryptionService.decryptEntityPayload(\n 'audit_logs:action_log',\n entry,\n tenantId,\n organizationId,\n )\n\n const merged = {\n ...entry,\n ...decrypted,\n } as Record<string, unknown>\n\n // Audit log jsonb columns are encrypted as JSON-stringified payloads. After the\n // service-level `decryptEntityPayload` call (which now returns raw strings \u2014\n // see issue #1810 follow-up), reattach the structured shape via\n // `parseDecryptedFieldValue` before running the recursive `deepDecrypt` walk\n // so nested encrypted strings inside payload objects/arrays are handled.\n const restoreJson = (value: unknown): unknown =>\n typeof value === 'string' ? parseDecryptedFieldValue(value) : value\n\n merged.changesJson = deepDecrypt(restoreJson(merged.changesJson ?? merged.changes_json ?? entry.changesJson ?? entry.changes_json))\n merged.changes_json = merged.changesJson\n merged.snapshotBefore = deepDecrypt(restoreJson(merged.snapshotBefore ?? merged.snapshot_before ?? entry.snapshotBefore ?? entry.snapshot_before))\n merged.snapshot_before = merged.snapshotBefore\n merged.snapshotAfter = deepDecrypt(restoreJson(merged.snapshotAfter ?? merged.snapshot_after ?? entry.snapshotAfter ?? entry.snapshot_after))\n merged.snapshot_after = merged.snapshotAfter\n merged.commandPayload = deepDecrypt(restoreJson(merged.commandPayload ?? merged.command_payload ?? entry.commandPayload ?? entry.command_payload))\n merged.command_payload = merged.commandPayload\n merged.contextJson = deepDecrypt(restoreJson(merged.contextJson ?? merged.context_json ?? entry.contextJson ?? entry.context_json))\n merged.context_json = merged.contextJson\n\n return merged as T\n } catch (err) {\n if (!decryptionWarningLogged) {\n decryptionWarningLogged = true\n logger.warn('Failed to decrypt action log entry', { err })\n }\n return entry\n }\n }\n\n private async decryptEntries(entries: ActionLog | ActionLog[] | null | undefined): Promise<void> {\n if (!entries) return\n\n const list = Array.isArray(entries) ? entries : [entries]\n for (const entry of list) {\n Object.assign(entry as unknown as Record<string, unknown>, await this.decryptEntryPayload(entry as unknown as Record<string, unknown>))\n }\n }\n\n async log(input: ActionLogCreateInput): Promise<ActionLog | null> {\n const data = this.parseCreateInput(input)\n const fork = this.em.fork()\n const log = this.createLogEntity(fork, data)\n await fork.persist(log).flush()\n await this.decryptEntries(log)\n return log\n }\n\n private parseCreateInput(input: ActionLogCreateInput): ActionLogCreateInput {\n const sanitized = this.sanitizeActor(input)\n let data: ActionLogCreateInput\n const schema = actionLogCreateSchema as typeof actionLogCreateSchema & { _zod?: unknown }\n const canValidate = Boolean(schema && typeof schema.parse === 'function')\n const shouldValidate = canValidate && runtimeValidationAvailable !== false\n\n if (shouldValidate) {\n try {\n data = schema.parse(sanitized)\n runtimeValidationAvailable = true\n } catch (err) {\n if (!isZodRuntimeMissing(err) && !validationWarningLogged) {\n validationWarningLogged = true\n logger.warn('Falling back to permissive action log payload parser', { err })\n }\n if (isZodRuntimeMissing(err)) runtimeValidationAvailable = false\n data = this.normalizeInput(sanitized)\n }\n } else {\n data = this.normalizeInput(sanitized)\n }\n\n return data\n }\n\n private sanitizeActor(input: ActionLogCreateInput): ActionLogCreateInput {\n if (!input) return input\n const candidate = readActorCandidate(input.actorUserId)\n const actorUserId = normalizeActorUserId(candidate)\n const systemActorReference = candidate && !actorUserId ? toSystemActorReference(candidate) : null\n\n if (!systemActorReference) {\n if (actorUserId === (input.actorUserId ?? null)) return input\n return { ...input, actorUserId }\n }\n\n const context = isRecord(input.context) ? { ...input.context } : {}\n if (context[SYSTEM_ACTOR_CONTEXT_KEY] === undefined) {\n context[SYSTEM_ACTOR_CONTEXT_KEY] = systemActorReference\n }\n\n return { ...input, actorUserId, context }\n }\n\n private createLogEntity(fork: EntityManager, data: ActionLogCreateInput): ActionLog {\n const projection = deriveActionLogProjection({\n actorUserId: data.actorUserId ?? null,\n actionLabel: data.actionLabel ?? null,\n changes: isRecord(data.changes) ? data.changes : null,\n commandId: data.commandId,\n context: isRecord(data.context) ? data.context : null,\n snapshotBefore: data.snapshotBefore,\n })\n\n return fork.create(ActionLog, {\n tenantId: data.tenantId ?? null,\n organizationId: data.organizationId ?? null,\n actorUserId: data.actorUserId ?? null,\n onBehalfOfUserId: data.onBehalfOfUserId ?? null,\n commandId: data.commandId,\n actionLabel: data.actionLabel ?? null,\n actionType: projection.actionType,\n resourceKind: data.resourceKind ?? null,\n resourceId: data.resourceId ?? null,\n parentResourceKind: data.parentResourceKind ?? null,\n parentResourceId: data.parentResourceId ?? null,\n relatedResourceKind: toOptionalString(data.relatedResourceKind) ?? null,\n relatedResourceId: toOptionalString(data.relatedResourceId) ?? null,\n executionState: data.executionState ?? 'done',\n undoToken: data.undoToken ?? null,\n commandPayload: data.commandPayload ?? null,\n snapshotBefore: data.snapshotBefore ?? null,\n snapshotAfter: data.snapshotAfter ?? null,\n changesJson: isRecord(data.changes) ? data.changes : null,\n changedFields: projection.changedFields,\n primaryChangedField: projection.primaryChangedField,\n contextJson: isRecord(data.context) ? data.context : null,\n sourceKey: projection.sourceKey,\n createdAt: new Date(),\n updatedAt: new Date(),\n })\n }\n\n private normalizeInput(input: Partial<ActionLogCreateInput> | null | undefined): ActionLogCreateInput {\n if (!input) {\n return {\n tenantId: null,\n organizationId: null,\n actorUserId: null,\n onBehalfOfUserId: null,\n commandId: 'unknown',\n actionLabel: undefined,\n resourceKind: undefined,\n resourceId: undefined,\n relatedResourceKind: null,\n relatedResourceId: null,\n executionState: 'done',\n undoToken: undefined,\n commandPayload: undefined,\n snapshotBefore: undefined,\n snapshotAfter: undefined,\n changes: undefined,\n context: undefined,\n }\n }\n\n const normalizeRecordLike = (value: unknown): ActionLogCreateInput['changes'] => {\n if (value === null) return null\n if (Array.isArray(value)) return value\n if (typeof value === 'object') return value as Record<string, unknown>\n return undefined\n }\n\n const normalizeContext = (value: unknown) => (\n typeof value === 'object' && value !== null && !Array.isArray(value)\n ? value as Record<string, unknown>\n : undefined\n )\n\n return {\n tenantId: toNullableUuid(input.tenantId),\n organizationId: toNullableUuid(input.organizationId),\n actorUserId: normalizeActorUserId(input.actorUserId),\n onBehalfOfUserId: toNullableUuid(input.onBehalfOfUserId),\n commandId: typeof input.commandId === 'string' && input.commandId.length > 0 ? input.commandId : 'unknown',\n actionLabel: toOptionalString(input.actionLabel) ?? undefined,\n resourceKind: toOptionalString(input.resourceKind) ?? undefined,\n resourceId: toOptionalString(input.resourceId) ?? undefined,\n parentResourceKind: toOptionalString(input.parentResourceKind) ?? null,\n parentResourceId: toOptionalString(input.parentResourceId) ?? null,\n relatedResourceKind: toOptionalString(input.relatedResourceKind) ?? null,\n relatedResourceId: toOptionalString(input.relatedResourceId) ?? null,\n executionState: input.executionState === 'undone' || input.executionState === 'failed' ? input.executionState : 'done',\n undoToken: toOptionalString(input.undoToken) ?? undefined,\n commandPayload: input.commandPayload,\n snapshotBefore: input.snapshotBefore,\n snapshotAfter: input.snapshotAfter,\n changes: normalizeRecordLike(input.changes),\n context: normalizeContext(input.context),\n }\n }\n\n private parseListQuery(query: Partial<ActionLogListQuery>) {\n return actionLogListSchema.parse({\n ...query,\n })\n }\n\n private resolveActorUserIds(parsed: ActionLogListQuery): string[] {\n const values = [...(parsed.actorUserIds ?? [])]\n if (parsed.actorUserId) values.push(parsed.actorUserId)\n\n return Array.from(new Set(values.map((value) => value.trim()).filter(Boolean)))\n }\n\n private resolveFieldNames(parsed: ActionLogListQuery): string[] {\n const values = [...(parsed.fieldNames ?? [])]\n if (parsed.fieldName) values.push(parsed.fieldName)\n\n return Array.from(new Set(values.map((value) => value.trim()).filter(Boolean)))\n }\n\n private resolveActionTypes(parsed: ActionLogListQuery): ActionLogFilterType[] {\n const values = [...(parsed.actionTypes ?? [])]\n if (parsed.actionType) values.push(parsed.actionType)\n\n return Array.from(new Set(values))\n .filter((value): value is ActionLogFilterType => ACTION_LOG_FILTER_TYPES.includes(value as ActionLogFilterType))\n }\n\n private resolvePagination(parsed: ActionLogListQuery): { page: number; pageSize: number; offset: number; limit: number } {\n const pageSize =\n typeof parsed.pageSize === 'number' && parsed.pageSize > 0\n ? parsed.pageSize\n : typeof parsed.limit === 'number' && parsed.limit > 0\n ? parsed.limit\n : 50\n const page = typeof parsed.page === 'number' && parsed.page > 0 ? parsed.page : 1\n const offset =\n typeof parsed.offset === 'number' && parsed.offset >= 0\n ? parsed.offset\n : (page - 1) * pageSize\n return { page, pageSize, offset, limit: pageSize }\n }\n\n private async loadEntries(parsed: ActionLogListQuery, options?: { paginate?: boolean }) {\n let query = (this.buildListQuery(parsed) as any).select('action_logs.id as id')\n\n if (options?.paginate !== false) {\n const { limit, offset } = this.resolvePagination(parsed)\n query = query.limit(limit).offset(offset)\n }\n\n const rows = await query.execute()\n const ids = rows.map((row: any) => row.id).filter(Boolean)\n if (ids.length === 0) return []\n\n const results = await this.em.find(ActionLog, {\n id: { $in: ids } as any,\n deletedAt: null,\n })\n await this.decryptEntries(results)\n\n const byId = new Map(results.map((entry: any) => [entry.id, entry]))\n return ids\n .map((id: any) => byId.get(id))\n .filter((entry: any): entry is ActionLog => Boolean(entry))\n }\n\n private buildListQuery(parsed: ActionLogListQuery): any {\n let query = (this.em.getKysely<any>() as any)\n .selectFrom('action_logs')\n .selectAll()\n .where('action_logs.deleted_at', 'is', null) as any\n\n if (parsed.tenantId) query = query.where('action_logs.tenant_id', '=', parsed.tenantId)\n if (parsed.organizationId) query = query.where('action_logs.organization_id', '=', parsed.organizationId)\n\n const actorUserIds = this.resolveActorUserIds(parsed)\n if (actorUserIds.length === 1) query = query.where('action_logs.actor_user_id', '=', actorUserIds[0])\n if (actorUserIds.length > 1) query = query.where('action_logs.actor_user_id', 'in', actorUserIds)\n\n if (parsed.includeRelated && parsed.resourceKind && parsed.resourceId) {\n query = query.where((eb: any) =>\n eb.or([\n eb.and([\n eb('action_logs.resource_kind', '=', parsed.resourceKind),\n eb('action_logs.resource_id', '=', parsed.resourceId),\n ]),\n eb.and([\n eb('action_logs.parent_resource_kind', '=', parsed.resourceKind),\n eb('action_logs.parent_resource_id', '=', parsed.resourceId),\n ]),\n eb.and([\n eb('action_logs.related_resource_kind', '=', parsed.resourceKind),\n eb('action_logs.related_resource_id', '=', parsed.resourceId),\n ]),\n ])\n )\n } else {\n if (parsed.resourceKind) query = query.where('action_logs.resource_kind', '=', parsed.resourceKind)\n if (parsed.resourceId) query = query.where('action_logs.resource_id', '=', parsed.resourceId)\n }\n\n if (parsed.undoableOnly) query = query.where('action_logs.undo_token', 'is not', null)\n if (parsed.before) query = query.where('action_logs.created_at', '<', parsed.before)\n if (parsed.after) query = query.where('action_logs.created_at', '>', parsed.after)\n\n const fieldNames = this.resolveFieldNames(parsed)\n if (fieldNames.length === 1) query = query.where('action_logs.primary_changed_field', '=', fieldNames[0])\n if (fieldNames.length > 1) query = query.where('action_logs.primary_changed_field', 'in', fieldNames)\n\n const actionTypes = this.resolveActionTypes(parsed)\n if (actionTypes.length === 1) query = query.where('action_logs.action_type', '=', actionTypes[0])\n if (actionTypes.length > 1) query = query.where('action_logs.action_type', 'in', actionTypes)\n\n if (parsed.sortField === 'user') {\n query = query.leftJoin('users as audit_actor', 'audit_actor.id', 'action_logs.actor_user_id')\n }\n\n const sortDir = parsed.sortDir === 'asc' ? 'asc' : 'desc'\n switch (parsed.sortField) {\n case 'user':\n query = query.orderBy(sql`coalesce(nullif(audit_actor.name, ''), audit_actor.email, '')`, sortDir)\n break\n case 'action':\n query = query.orderBy(sql`coalesce(action_logs.action_type, '')`, sortDir)\n break\n case 'field':\n query = query.orderBy(sql`coalesce(action_logs.primary_changed_field, '')`, sortDir)\n break\n case 'source':\n query = query.orderBy(sql`coalesce(action_logs.source_key, '')`, sortDir)\n break\n case 'createdAt':\n default:\n query = query.orderBy(SORT_FIELDS.createdAt, sortDir)\n query = query.orderBy('action_logs.id', sortDir)\n return query\n }\n\n query = query.orderBy('action_logs.created_at', 'desc')\n query = query.orderBy('action_logs.id', 'desc')\n return query\n }\n\n async count(query: Partial<ActionLogListQuery>) {\n const parsed = this.parseListQuery(query)\n const row = await (this.buildListQuery(parsed) as any)\n .clearSelect()\n .clearOrderBy()\n .select(sql<string>`count(*)`.as('count'))\n .executeTakeFirst()\n\n if (!row) return 0\n const rawCount = row.count ?? 0\n return typeof rawCount === 'number' ? rawCount : Number.parseInt(rawCount, 10) || 0\n }\n\n async list(query: Partial<ActionLogListQuery>) {\n const parsed = this.parseListQuery(query)\n const { page, pageSize } = this.resolvePagination(parsed)\n const [items, total] = await Promise.all([\n this.loadEntries(parsed),\n this.count(parsed),\n ])\n const totalPages = Math.max(1, Math.ceil((total || 0) / (pageSize || 1)))\n return { items, total, page, pageSize, totalPages }\n }\n\n async latestUndoableForActor(actorUserId: string, scope: { tenantId?: string | null; organizationId?: string | null }) {\n const where: FilterQuery<ActionLog> = {\n actorUserId,\n undoToken: { $ne: null } as any,\n executionState: 'done',\n deletedAt: null,\n }\n if (scope.tenantId) where.tenantId = scope.tenantId\n if (scope.organizationId) where.organizationId = scope.organizationId\n\n const entry = await this.em.findOne(ActionLog, where, { orderBy: { createdAt: 'desc' } })\n await this.decryptEntries(entry)\n return entry\n }\n\n async claimForUndo(id: string): Promise<boolean> {\n const affected = await this.em.nativeUpdate(\n ActionLog,\n { id, executionState: 'done', deletedAt: null },\n { executionState: 'undoing' },\n )\n return affected === 1\n }\n\n async releaseUndoClaim(id: string): Promise<boolean> {\n const affected = await this.em.nativeUpdate(\n ActionLog,\n { id, executionState: 'undoing', deletedAt: null },\n { executionState: 'done' },\n )\n return affected === 1\n }\n\n async markUndone(id: string, traceInput?: ActionLogCreateInput) {\n const fork = this.em.fork()\n const log = await fork.findOne(ActionLog, { id, deletedAt: null })\n if (!log) return null\n\n log.executionState = 'undone'\n log.undoToken = null\n\n const traceLog = traceInput ? this.createLogEntity(fork, this.parseCreateInput(traceInput)) : null\n if (traceLog) {\n fork.persist(traceLog)\n }\n\n await fork.flush()\n await this.decryptEntries(log)\n if (traceLog) await this.decryptEntries(traceLog)\n\n return log\n }\n\n async findByUndoToken(undoToken: string) {\n const entry = await this.em.findOne(ActionLog, { undoToken, deletedAt: null })\n await this.decryptEntries(entry)\n return entry\n }\n\n async findById(id: string) {\n const entry = await this.em.findOne(ActionLog, { id, deletedAt: null })\n await this.decryptEntries(entry)\n return entry\n }\n\n async latestUndoableForResource(params: {\n actorUserId: string\n tenantId?: string | null\n organizationId?: string | null\n resourceKind?: string | null\n resourceId?: string | null\n }) {\n const where: FilterQuery<ActionLog> = {\n actorUserId: params.actorUserId,\n undoToken: { $ne: null } as any,\n executionState: 'done',\n deletedAt: null,\n }\n if (params.tenantId) where.tenantId = params.tenantId\n if (params.organizationId) where.organizationId = params.organizationId\n if (params.resourceKind) where.resourceKind = params.resourceKind\n if (params.resourceId) where.resourceId = params.resourceId\n\n const entry = await this.em.findOne(ActionLog, where, { orderBy: { createdAt: 'desc' } })\n await this.decryptEntries(entry)\n return entry\n }\n\n async latestUndoneForActor(actorUserId: string, scope: { tenantId?: string | null; organizationId?: string | null }) {\n const where: FilterQuery<ActionLog> = {\n actorUserId,\n executionState: 'undone',\n deletedAt: null,\n }\n if (scope.tenantId) where.tenantId = scope.tenantId\n if (scope.organizationId) where.organizationId = scope.organizationId\n\n const entry = await this.em.findOne(ActionLog, where, { orderBy: { updatedAt: 'desc' } })\n await this.decryptEntries(entry)\n return entry\n }\n\n async markRedone(id: string) {\n const log = await this.em.findOne(ActionLog, { id, deletedAt: null })\n if (!log) return null\n\n log.executionState = 'redone'\n log.undoToken = null\n await this.em.flush()\n return log\n }\n\n async backfillProjections(options: ActionLogProjectionBackfillOptions = {}): Promise<ActionLogProjectionBackfillResult> {\n const batchSize = Math.min(Math.max(Math.trunc(options.batchSize ?? 250), 1), 1000)\n const logger = options.logger ?? (() => {})\n const result: ActionLogProjectionBackfillResult = {\n errors: 0,\n scanned: 0,\n skipped: 0,\n updated: 0,\n }\n\n let cursorCreatedAt: Date | null = null\n let cursorId: string | null = null\n\n while (true) {\n const rowsQuery = (this.em.getKysely<any>() as any)\n .selectFrom('action_logs')\n .select([\n 'action_logs.id',\n 'action_logs.tenant_id',\n 'action_logs.organization_id',\n 'action_logs.actor_user_id',\n 'action_logs.command_id',\n 'action_logs.action_label',\n 'action_logs.snapshot_before',\n 'action_logs.changes_json',\n 'action_logs.context_json',\n 'action_logs.action_type',\n 'action_logs.source_key',\n 'action_logs.changed_fields',\n 'action_logs.primary_changed_field',\n 'action_logs.created_at',\n ])\n .where('action_logs.deleted_at', 'is', null) as any\n\n if (options.tenantId) rowsQuery.where('action_logs.tenant_id', '=', options.tenantId)\n if (options.organizationId) rowsQuery.where('action_logs.organization_id', '=', options.organizationId)\n\n if (!options.force) {\n rowsQuery.where((eb: any) =>\n eb.or([\n eb('action_logs.action_type', 'is', null),\n eb('action_logs.source_key', 'is', null),\n eb('action_logs.changed_fields', 'is', null),\n ])\n )\n }\n\n if (cursorCreatedAt && cursorId) {\n rowsQuery.where((eb: any) =>\n eb.or([\n eb('action_logs.created_at', '>', cursorCreatedAt),\n eb.and([\n eb('action_logs.created_at', '=', cursorCreatedAt),\n eb('action_logs.id', '>', cursorId),\n ]),\n ])\n )\n }\n\n const rows = await rowsQuery\n .orderBy('created_at', 'asc')\n .orderBy('id', 'asc')\n .limit(batchSize)\n\n if (rows.length === 0) break\n\n for (const row of rows) {\n result.scanned += 1\n\n try {\n const decrypted = await this.decryptEntryPayload(row as unknown as Record<string, unknown>)\n const projection = deriveActionLogProjection({\n actorUserId: readString(decrypted, 'actorUserId', 'actor_user_id'),\n actionLabel: readString(decrypted, 'actionLabel', 'action_label'),\n changes: readRecord(decrypted, 'changesJson', 'changes_json'),\n commandId: readString(decrypted, 'commandId', 'command_id') ?? 'unknown',\n context: readRecord(decrypted, 'contextJson', 'context_json'),\n snapshotBefore: readValue(decrypted, 'snapshotBefore', 'snapshot_before'),\n })\n\n const needsUpdate = options.force === true\n || row.action_type !== projection.actionType\n || row.source_key !== projection.sourceKey\n || row.primary_changed_field !== projection.primaryChangedField\n || !stringArraysEqual(row.changed_fields, projection.changedFields)\n\n if (!needsUpdate) {\n result.skipped += 1\n continue\n }\n\n await (this.em.getKysely<any>() as any)\n .updateTable('action_logs')\n .set({\n action_type: projection.actionType,\n changed_fields: projection.changedFields,\n primary_changed_field: projection.primaryChangedField,\n source_key: projection.sourceKey,\n })\n .where('id', '=', row.id)\n .execute()\n\n result.updated += 1\n } catch (err) {\n result.errors += 1\n logger(`[backfill] Failed for action log ${row.id}: ${err instanceof Error ? err.message : String(err)}`)\n }\n }\n\n const lastRow = rows[rows.length - 1]\n cursorCreatedAt = lastRow.created_at\n cursorId = lastRow.id\n\n logger(\n `[backfill] Processed ${result.scanned} action logs (updated: ${result.updated}, skipped: ${result.skipped}, errors: ${result.errors})`,\n )\n\n if (rows.length < batchSize) break\n }\n\n return result\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["decrypted", "logger"]
7
7
  }
@@ -8,10 +8,13 @@ var __decorateClass = (decorators, target, key, kind) => {
8
8
  if (kind && result) __defProp(target, key, result);
9
9
  return result;
10
10
  };
11
+ import { OptionalProps } from "@mikro-orm/core";
11
12
  import { Entity, Index, ManyToOne, PrimaryKey, Property, Unique } from "@mikro-orm/decorators/legacy";
13
+ OptionalProps;
12
14
  let User = class {
13
15
  constructor() {
14
16
  this.isConfirmed = true;
17
+ this.kind = "human";
15
18
  this.createdAt = /* @__PURE__ */ new Date();
16
19
  }
17
20
  };
@@ -40,6 +43,9 @@ __decorateClass([
40
43
  __decorateClass([
41
44
  Property({ name: "is_confirmed", type: "boolean", default: true })
42
45
  ], User.prototype, "isConfirmed", 2);
46
+ __decorateClass([
47
+ Property({ name: "kind", type: "varchar", length: 20, default: "human" })
48
+ ], User.prototype, "kind", 2);
43
49
  __decorateClass([
44
50
  Property({ name: "last_login_at", type: Date, nullable: true })
45
51
  ], User.prototype, "lastLoginAt", 2);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/auth/data/entities.ts"],
4
- "sourcesContent": ["import { Entity, Index, ManyToOne, PrimaryKey, Property, Unique } from '@mikro-orm/decorators/legacy'\n\n@Entity({ tableName: 'users' })\n// Email uniqueness is per-tenant, enforced by a partial unique index\n// (`users_tenant_email_hash_uniq`) on `(tenant_id, email_hash)` over live rows\n// (`WHERE deleted_at IS NULL AND email_hash IS NOT NULL`), owned by raw SQL in\n// Migration20260610120000. It keys on the deterministic `email_hash`, not `email`, because\n// `email` is encrypted at rest with a per-row IV (see encryption.ts) \u2014 its ciphertext is\n// non-deterministic, so a unique index on it would not detect duplicates. A `@Unique`\n// decorator can't express a partial, tenant-scoped index, so the entity omits it \u2014 the\n// migration is the source of truth. A global unique constraint contradicts the multi-tenant\n// login flow and leaks cross-tenant account existence (#2934). Mirrors\n// `customer_users_tenant_email_hash_uniq`.\nexport class User {\n @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })\n id!: string\n\n @Property({ name: 'tenant_id', type: 'uuid', nullable: true })\n tenantId?: string | null\n\n @Property({ name: 'organization_id', type: 'uuid', nullable: true })\n organizationId?: string | null\n\n @Property({ type: 'text' })\n email!: string\n\n @Property({ name: 'email_hash', type: 'text', nullable: true })\n @Index({ name: 'users_email_hash_idx' })\n emailHash?: string | null\n\n @Property({ type: 'text', nullable: true })\n name?: string | null\n\n @Property({ name: 'password_hash', type: 'text', nullable: true })\n passwordHash?: string | null\n\n @Property({ name: 'is_confirmed', type: 'boolean', default: true })\n isConfirmed: boolean = true\n\n @Property({ name: 'last_login_at', type: Date, nullable: true })\n lastLoginAt?: Date\n\n @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })\n createdAt: Date = new Date()\n\n @Property({ name: 'updated_at', type: Date, onCreate: () => new Date(), onUpdate: () => new Date(), nullable: true })\n updatedAt?: Date | null\n\n @Property({ name: 'deleted_at', type: Date, nullable: true })\n deletedAt?: Date | null\n}\n\n@Entity({ tableName: 'roles' })\n@Unique({ properties: ['tenantId', 'name'] })\nexport class Role {\n @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })\n id!: string\n\n @Property({ type: 'text' })\n name!: string\n\n @Property({ name: 'tenant_id', type: 'uuid' })\n tenantId!: string\n\n @Property({ name: 'min_active_holders', type: 'integer', default: 0 })\n minActiveHolders: number = 0\n\n @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })\n createdAt: Date = new Date()\n\n @Property({ name: 'updated_at', type: Date, onCreate: () => new Date(), onUpdate: () => new Date(), nullable: true })\n updatedAt?: Date | null\n\n @Property({ name: 'deleted_at', type: Date, nullable: true })\n deletedAt?: Date | null\n}\n\n@Entity({ tableName: 'user_sidebar_preferences' })\n// Uniqueness is enforced by a partial unique index (`user_sidebar_preferences_active_unique_idx`)\n// scoped to live rows (`WHERE deleted_at IS NULL`) and owned by raw SQL in\n// Migration20260427143311. A `@Unique` decorator can't express a partial index,\n// so the entity intentionally omits it \u2014 the migration is the source of truth.\nexport class UserSidebarPreference {\n @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })\n id!: string\n\n @ManyToOne(() => User, { deleteRule: 'cascade' })\n user!: User\n\n @Property({ name: 'tenant_id', type: 'uuid', nullable: true })\n tenantId?: string | null\n\n @Property({ name: 'organization_id', type: 'uuid', nullable: true })\n organizationId?: string | null\n\n @Property({ type: 'text' })\n locale!: string\n\n @Property({ name: 'settings_json', type: 'json', nullable: true })\n settingsJson?: unknown\n\n @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })\n createdAt: Date = new Date()\n\n @Property({ name: 'updated_at', type: Date, onUpdate: () => new Date(), nullable: true })\n updatedAt?: Date\n\n @Property({ name: 'deleted_at', type: Date, nullable: true })\n deletedAt?: Date | null\n}\n\n@Entity({ tableName: 'role_sidebar_preferences' })\n// Uniqueness is enforced by a partial unique index (`role_sidebar_preferences_active_unique_idx`)\n// scoped to live rows (`WHERE deleted_at IS NULL`) and owned by raw SQL in\n// Migration20260427143311. A `@Unique` decorator can't express a partial index,\n// so the entity intentionally omits it \u2014 the migration is the source of truth.\nexport class RoleSidebarPreference {\n @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })\n id!: string\n\n @ManyToOne(() => Role)\n role!: Role\n\n @Property({ name: 'tenant_id', type: 'uuid', nullable: true })\n tenantId?: string | null\n\n @Property({ type: 'text' })\n locale!: string\n\n @Property({ name: 'settings_json', type: 'json', nullable: true })\n settingsJson?: unknown\n\n @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })\n createdAt: Date = new Date()\n\n @Property({ name: 'updated_at', type: Date, onUpdate: () => new Date(), nullable: true })\n updatedAt?: Date\n\n @Property({ name: 'deleted_at', type: Date, nullable: true })\n deletedAt?: Date | null\n}\n\n@Entity({ tableName: 'sidebar_variants' })\n// Uniqueness is enforced by a partial unique index (`sidebar_variants_active_name_unique_idx`)\n// scoped to live rows (`WHERE deleted_at IS NULL`) and owned by raw SQL in\n// Migration20260427143311. A `@Unique` decorator can't express a partial index,\n// so the entity intentionally omits it \u2014 the migration is the source of truth.\nexport class SidebarVariant {\n @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })\n id!: string\n\n @ManyToOne(() => User, { deleteRule: 'cascade' })\n user!: User\n\n @Property({ name: 'tenant_id', type: 'uuid', nullable: true })\n tenantId?: string | null\n\n @Property({ name: 'organization_id', type: 'uuid', nullable: true })\n organizationId?: string | null\n\n @Property({ type: 'text' })\n locale!: string\n\n @Property({ type: 'text' })\n name!: string\n\n @Property({ name: 'settings_json', type: 'json', nullable: true })\n settingsJson?: unknown\n\n @Property({ name: 'is_active', type: 'boolean', default: false })\n isActive: boolean = false\n\n @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })\n createdAt: Date = new Date()\n\n @Property({ name: 'updated_at', type: Date, onUpdate: () => new Date(), nullable: true })\n updatedAt?: Date\n\n @Property({ name: 'deleted_at', type: Date, nullable: true })\n deletedAt?: Date | null\n}\n\n@Entity({ tableName: 'user_roles' })\n@Index({ name: 'user_roles_user_id_idx', properties: ['user'] })\n@Index({ name: 'user_roles_role_id_idx', properties: ['role'] })\nexport class UserRole {\n @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })\n id!: string\n\n @ManyToOne(() => User)\n user!: User\n\n @ManyToOne(() => Role)\n role!: Role\n\n @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })\n createdAt: Date = new Date()\n\n @Property({ name: 'deleted_at', type: Date, nullable: true })\n deletedAt?: Date | null\n}\n\n@Entity({ tableName: 'sessions' })\nexport class Session {\n @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })\n id!: string\n\n @ManyToOne(() => User)\n user!: User\n\n @Property({ type: 'text', unique: true })\n token!: string\n\n @Property({ name: 'expires_at', type: Date })\n expiresAt!: Date\n\n @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })\n createdAt: Date = new Date()\n\n @Property({ name: 'last_used_at', type: Date, nullable: true })\n lastUsedAt?: Date\n\n @Property({ name: 'deleted_at', type: Date, nullable: true })\n deletedAt?: Date | null\n}\n\n@Entity({ tableName: 'password_resets' })\nexport class PasswordReset {\n @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })\n id!: string\n\n @ManyToOne(() => User)\n user!: User\n\n @Property({ type: 'text', unique: true })\n token!: string\n\n @Property({ name: 'expires_at', type: Date })\n expiresAt!: Date\n\n @Property({ name: 'used_at', type: Date, nullable: true })\n usedAt?: Date\n\n @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })\n createdAt: Date = new Date()\n\n @Property({ name: 'deleted_at', type: Date, nullable: true })\n deletedAt?: Date | null\n}\n\n// RBAC: Role-level ACL\n@Entity({ tableName: 'role_acls' })\nexport class RoleAcl {\n @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })\n id!: string\n\n @ManyToOne(() => Role)\n role!: Role\n\n // Tenant scope is mandatory for ACL evaluation\n @Property({ name: 'tenant_id', type: 'uuid' })\n tenantId!: string\n\n // Feature list (string-based). Use JSON array to preserve order and allow wildcards like \"example.*\".\n @Property({ name: 'features_json', type: 'json', nullable: true })\n featuresJson?: string[] | null\n\n // If true, user with this role can do everything regardless of features\n @Property({ name: 'is_super_admin', type: 'boolean', default: false })\n isSuperAdmin: boolean = false\n\n // Visible organizations within the tenant. `null` or the `__all__` sentinel means every\n // organization. An EMPTY array is a deny-all scope for human principals \u2014 it projects to an\n // empty accessible set so scoped reads and deletes fail closed (#4033). API-key principals\n // read an empty list as \"inherit the key's own organization binding\" instead.\n @Property({ name: 'organizations_json', type: 'json', nullable: true })\n organizationsJson?: string[] | null\n\n @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })\n createdAt: Date = new Date()\n\n @Property({ name: 'updated_at', type: Date, onCreate: () => new Date(), onUpdate: () => new Date(), nullable: true })\n updatedAt?: Date\n\n @Property({ name: 'deleted_at', type: Date, nullable: true })\n deletedAt?: Date | null\n}\n\n// RBAC: Per-user ACL override\n@Entity({ tableName: 'user_acls' })\nexport class UserAcl {\n @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })\n id!: string\n\n @ManyToOne(() => User)\n user!: User\n\n // Tenant scope is mandatory for ACL evaluation\n @Property({ name: 'tenant_id', type: 'uuid' })\n tenantId!: string\n\n // Feature list (string-based). Use JSON array to preserve order and allow wildcards like \"example.*\".\n @Property({ name: 'features_json', type: 'json', nullable: true })\n featuresJson?: string[] | null\n\n // If true, this user can do everything regardless of features\n @Property({ name: 'is_super_admin', type: 'boolean', default: false })\n isSuperAdmin: boolean = false\n\n // Visible organizations within the tenant; null/empty means all organizations\n @Property({ name: 'organizations_json', type: 'json', nullable: true })\n organizationsJson?: string[] | null\n\n @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })\n createdAt: Date = new Date()\n\n @Property({ name: 'updated_at', type: Date, onCreate: () => new Date(), onUpdate: () => new Date(), nullable: true })\n updatedAt?: Date\n\n @Property({ name: 'deleted_at', type: Date, nullable: true })\n deletedAt?: Date | null\n}\n\n@Entity({ tableName: 'user_consents' })\n@Unique({ properties: ['userId', 'tenantId', 'consentType'] })\nexport class UserConsent {\n @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })\n id!: string\n\n @Property({ name: 'user_id', type: 'uuid' })\n userId!: string\n\n @Property({ name: 'tenant_id', type: 'uuid', nullable: true })\n tenantId?: string | null\n\n @Property({ name: 'organization_id', type: 'uuid', nullable: true })\n organizationId?: string | null\n\n @Property({ name: 'consent_type', type: 'text' })\n consentType!: string\n\n @Property({ name: 'is_granted', type: 'boolean', default: false })\n isGranted: boolean = false\n\n @Property({ name: 'granted_at', type: Date, nullable: true })\n grantedAt?: Date | null\n\n @Property({ name: 'withdrawn_at', type: Date, nullable: true })\n withdrawnAt?: Date | null\n\n @Property({ type: 'text', nullable: true })\n source?: string | null\n\n @Property({ name: 'ip_address', type: 'text', nullable: true })\n ipAddress?: string | null\n\n @Property({ name: 'integrity_hash', type: 'text', nullable: true })\n integrityHash?: string | null\n\n @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })\n createdAt: Date = new Date()\n\n @Property({ name: 'updated_at', type: Date, onUpdate: () => new Date(), nullable: true })\n updatedAt?: Date\n\n @Property({ name: 'deleted_at', type: Date, nullable: true })\n deletedAt?: Date | null\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { OptionalProps } from '@mikro-orm/core'\nimport { Entity, Index, ManyToOne, PrimaryKey, Property, Unique } from '@mikro-orm/decorators/legacy'\n\n/**\n * The principal kind a `User` row represents. `human` (the default) is an\n * interactively-authenticating person; `agent` is a non-interactive AI principal\n * provisioned by the agent_orchestrator module (it owns no interactive credential\n * and is barred from the password/SSO login flow); `service` is reserved for\n * machine/system principals. Added additively (NOT NULL, default `'human'`) so\n * every existing row backfills to `human` and no existing reader breaks.\n */\nexport type UserKind = 'human' | 'agent' | 'service'\n\n@Entity({ tableName: 'users' })\n// Email uniqueness is per-tenant, enforced by a partial unique index\n// (`users_tenant_email_hash_uniq`) on `(tenant_id, email_hash)` over live rows\n// (`WHERE deleted_at IS NULL AND email_hash IS NOT NULL`), owned by raw SQL in\n// Migration20260610120000. It keys on the deterministic `email_hash`, not `email`, because\n// `email` is encrypted at rest with a per-row IV (see encryption.ts) \u2014 its ciphertext is\n// non-deterministic, so a unique index on it would not detect duplicates. A `@Unique`\n// decorator can't express a partial, tenant-scoped index, so the entity omits it \u2014 the\n// migration is the source of truth. A global unique constraint contradicts the multi-tenant\n// login flow and leaks cross-tenant account existence (#2934). Mirrors\n// `customer_users_tenant_email_hash_uniq`.\nexport class User {\n // `kind` carries a default ('human'); marking it optional keeps every existing\n // `em.create(User, \u2026)` caller (which never passed `kind`) compiling unchanged \u2014\n // the additive column is backfilled by the default at the DB + entity level.\n [OptionalProps]?: 'kind'\n\n @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })\n id!: string\n\n @Property({ name: 'tenant_id', type: 'uuid', nullable: true })\n tenantId?: string | null\n\n @Property({ name: 'organization_id', type: 'uuid', nullable: true })\n organizationId?: string | null\n\n @Property({ type: 'text' })\n email!: string\n\n @Property({ name: 'email_hash', type: 'text', nullable: true })\n @Index({ name: 'users_email_hash_idx' })\n emailHash?: string | null\n\n @Property({ type: 'text', nullable: true })\n name?: string | null\n\n @Property({ name: 'password_hash', type: 'text', nullable: true })\n passwordHash?: string | null\n\n @Property({ name: 'is_confirmed', type: 'boolean', default: true })\n isConfirmed: boolean = true\n\n // Principal kind. Default 'human' keeps every existing row + external reader\n // unaffected; 'agent' marks a non-interactive AI principal (see UserKind).\n @Property({ name: 'kind', type: 'varchar', length: 20, default: 'human' })\n kind: UserKind = 'human'\n\n @Property({ name: 'last_login_at', type: Date, nullable: true })\n lastLoginAt?: Date\n\n @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })\n createdAt: Date = new Date()\n\n @Property({ name: 'updated_at', type: Date, onCreate: () => new Date(), onUpdate: () => new Date(), nullable: true })\n updatedAt?: Date | null\n\n @Property({ name: 'deleted_at', type: Date, nullable: true })\n deletedAt?: Date | null\n}\n\n@Entity({ tableName: 'roles' })\n@Unique({ properties: ['tenantId', 'name'] })\nexport class Role {\n @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })\n id!: string\n\n @Property({ type: 'text' })\n name!: string\n\n @Property({ name: 'tenant_id', type: 'uuid' })\n tenantId!: string\n\n @Property({ name: 'min_active_holders', type: 'integer', default: 0 })\n minActiveHolders: number = 0\n\n @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })\n createdAt: Date = new Date()\n\n @Property({ name: 'updated_at', type: Date, onCreate: () => new Date(), onUpdate: () => new Date(), nullable: true })\n updatedAt?: Date | null\n\n @Property({ name: 'deleted_at', type: Date, nullable: true })\n deletedAt?: Date | null\n}\n\n@Entity({ tableName: 'user_sidebar_preferences' })\n// Uniqueness is enforced by a partial unique index (`user_sidebar_preferences_active_unique_idx`)\n// scoped to live rows (`WHERE deleted_at IS NULL`) and owned by raw SQL in\n// Migration20260427143311. A `@Unique` decorator can't express a partial index,\n// so the entity intentionally omits it \u2014 the migration is the source of truth.\nexport class UserSidebarPreference {\n @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })\n id!: string\n\n @ManyToOne(() => User, { deleteRule: 'cascade' })\n user!: User\n\n @Property({ name: 'tenant_id', type: 'uuid', nullable: true })\n tenantId?: string | null\n\n @Property({ name: 'organization_id', type: 'uuid', nullable: true })\n organizationId?: string | null\n\n @Property({ type: 'text' })\n locale!: string\n\n @Property({ name: 'settings_json', type: 'json', nullable: true })\n settingsJson?: unknown\n\n @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })\n createdAt: Date = new Date()\n\n @Property({ name: 'updated_at', type: Date, onUpdate: () => new Date(), nullable: true })\n updatedAt?: Date\n\n @Property({ name: 'deleted_at', type: Date, nullable: true })\n deletedAt?: Date | null\n}\n\n@Entity({ tableName: 'role_sidebar_preferences' })\n// Uniqueness is enforced by a partial unique index (`role_sidebar_preferences_active_unique_idx`)\n// scoped to live rows (`WHERE deleted_at IS NULL`) and owned by raw SQL in\n// Migration20260427143311. A `@Unique` decorator can't express a partial index,\n// so the entity intentionally omits it \u2014 the migration is the source of truth.\nexport class RoleSidebarPreference {\n @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })\n id!: string\n\n @ManyToOne(() => Role)\n role!: Role\n\n @Property({ name: 'tenant_id', type: 'uuid', nullable: true })\n tenantId?: string | null\n\n @Property({ type: 'text' })\n locale!: string\n\n @Property({ name: 'settings_json', type: 'json', nullable: true })\n settingsJson?: unknown\n\n @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })\n createdAt: Date = new Date()\n\n @Property({ name: 'updated_at', type: Date, onUpdate: () => new Date(), nullable: true })\n updatedAt?: Date\n\n @Property({ name: 'deleted_at', type: Date, nullable: true })\n deletedAt?: Date | null\n}\n\n@Entity({ tableName: 'sidebar_variants' })\n// Uniqueness is enforced by a partial unique index (`sidebar_variants_active_name_unique_idx`)\n// scoped to live rows (`WHERE deleted_at IS NULL`) and owned by raw SQL in\n// Migration20260427143311. A `@Unique` decorator can't express a partial index,\n// so the entity intentionally omits it \u2014 the migration is the source of truth.\nexport class SidebarVariant {\n @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })\n id!: string\n\n @ManyToOne(() => User, { deleteRule: 'cascade' })\n user!: User\n\n @Property({ name: 'tenant_id', type: 'uuid', nullable: true })\n tenantId?: string | null\n\n @Property({ name: 'organization_id', type: 'uuid', nullable: true })\n organizationId?: string | null\n\n @Property({ type: 'text' })\n locale!: string\n\n @Property({ type: 'text' })\n name!: string\n\n @Property({ name: 'settings_json', type: 'json', nullable: true })\n settingsJson?: unknown\n\n @Property({ name: 'is_active', type: 'boolean', default: false })\n isActive: boolean = false\n\n @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })\n createdAt: Date = new Date()\n\n @Property({ name: 'updated_at', type: Date, onUpdate: () => new Date(), nullable: true })\n updatedAt?: Date\n\n @Property({ name: 'deleted_at', type: Date, nullable: true })\n deletedAt?: Date | null\n}\n\n@Entity({ tableName: 'user_roles' })\n@Index({ name: 'user_roles_user_id_idx', properties: ['user'] })\n@Index({ name: 'user_roles_role_id_idx', properties: ['role'] })\nexport class UserRole {\n @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })\n id!: string\n\n @ManyToOne(() => User)\n user!: User\n\n @ManyToOne(() => Role)\n role!: Role\n\n @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })\n createdAt: Date = new Date()\n\n @Property({ name: 'deleted_at', type: Date, nullable: true })\n deletedAt?: Date | null\n}\n\n@Entity({ tableName: 'sessions' })\nexport class Session {\n @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })\n id!: string\n\n @ManyToOne(() => User)\n user!: User\n\n @Property({ type: 'text', unique: true })\n token!: string\n\n @Property({ name: 'expires_at', type: Date })\n expiresAt!: Date\n\n @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })\n createdAt: Date = new Date()\n\n @Property({ name: 'last_used_at', type: Date, nullable: true })\n lastUsedAt?: Date\n\n @Property({ name: 'deleted_at', type: Date, nullable: true })\n deletedAt?: Date | null\n}\n\n@Entity({ tableName: 'password_resets' })\nexport class PasswordReset {\n @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })\n id!: string\n\n @ManyToOne(() => User)\n user!: User\n\n @Property({ type: 'text', unique: true })\n token!: string\n\n @Property({ name: 'expires_at', type: Date })\n expiresAt!: Date\n\n @Property({ name: 'used_at', type: Date, nullable: true })\n usedAt?: Date\n\n @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })\n createdAt: Date = new Date()\n\n @Property({ name: 'deleted_at', type: Date, nullable: true })\n deletedAt?: Date | null\n}\n\n// RBAC: Role-level ACL\n@Entity({ tableName: 'role_acls' })\nexport class RoleAcl {\n @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })\n id!: string\n\n @ManyToOne(() => Role)\n role!: Role\n\n // Tenant scope is mandatory for ACL evaluation\n @Property({ name: 'tenant_id', type: 'uuid' })\n tenantId!: string\n\n // Feature list (string-based). Use JSON array to preserve order and allow wildcards like \"example.*\".\n @Property({ name: 'features_json', type: 'json', nullable: true })\n featuresJson?: string[] | null\n\n // If true, user with this role can do everything regardless of features\n @Property({ name: 'is_super_admin', type: 'boolean', default: false })\n isSuperAdmin: boolean = false\n\n // Visible organizations within the tenant. `null` or the `__all__` sentinel means every\n // organization. An EMPTY array is a deny-all scope for human principals \u2014 it projects to an\n // empty accessible set so scoped reads and deletes fail closed (#4033). API-key principals\n // read an empty list as \"inherit the key's own organization binding\" instead.\n @Property({ name: 'organizations_json', type: 'json', nullable: true })\n organizationsJson?: string[] | null\n\n @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })\n createdAt: Date = new Date()\n\n @Property({ name: 'updated_at', type: Date, onCreate: () => new Date(), onUpdate: () => new Date(), nullable: true })\n updatedAt?: Date\n\n @Property({ name: 'deleted_at', type: Date, nullable: true })\n deletedAt?: Date | null\n}\n\n// RBAC: Per-user ACL override\n@Entity({ tableName: 'user_acls' })\nexport class UserAcl {\n @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })\n id!: string\n\n @ManyToOne(() => User)\n user!: User\n\n // Tenant scope is mandatory for ACL evaluation\n @Property({ name: 'tenant_id', type: 'uuid' })\n tenantId!: string\n\n // Feature list (string-based). Use JSON array to preserve order and allow wildcards like \"example.*\".\n @Property({ name: 'features_json', type: 'json', nullable: true })\n featuresJson?: string[] | null\n\n // If true, this user can do everything regardless of features\n @Property({ name: 'is_super_admin', type: 'boolean', default: false })\n isSuperAdmin: boolean = false\n\n // Visible organizations within the tenant; null/empty means all organizations\n @Property({ name: 'organizations_json', type: 'json', nullable: true })\n organizationsJson?: string[] | null\n\n @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })\n createdAt: Date = new Date()\n\n @Property({ name: 'updated_at', type: Date, onCreate: () => new Date(), onUpdate: () => new Date(), nullable: true })\n updatedAt?: Date\n\n @Property({ name: 'deleted_at', type: Date, nullable: true })\n deletedAt?: Date | null\n}\n\n@Entity({ tableName: 'user_consents' })\n@Unique({ properties: ['userId', 'tenantId', 'consentType'] })\nexport class UserConsent {\n @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })\n id!: string\n\n @Property({ name: 'user_id', type: 'uuid' })\n userId!: string\n\n @Property({ name: 'tenant_id', type: 'uuid', nullable: true })\n tenantId?: string | null\n\n @Property({ name: 'organization_id', type: 'uuid', nullable: true })\n organizationId?: string | null\n\n @Property({ name: 'consent_type', type: 'text' })\n consentType!: string\n\n @Property({ name: 'is_granted', type: 'boolean', default: false })\n isGranted: boolean = false\n\n @Property({ name: 'granted_at', type: Date, nullable: true })\n grantedAt?: Date | null\n\n @Property({ name: 'withdrawn_at', type: Date, nullable: true })\n withdrawnAt?: Date | null\n\n @Property({ type: 'text', nullable: true })\n source?: string | null\n\n @Property({ name: 'ip_address', type: 'text', nullable: true })\n ipAddress?: string | null\n\n @Property({ name: 'integrity_hash', type: 'text', nullable: true })\n integrityHash?: string | null\n\n @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })\n createdAt: Date = new Date()\n\n @Property({ name: 'updated_at', type: Date, onUpdate: () => new Date(), nullable: true })\n updatedAt?: Date\n\n @Property({ name: 'deleted_at', type: Date, nullable: true })\n deletedAt?: Date | null\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }