@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
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/workflows/lib/task-visibility.ts"],
4
+ "sourcesContent": ["/**\n * Who may see and act on a user task (PURE).\n *\n * Spec \u00A76.4: *a user (backoffice or portal) can see and act on a task iff\n * (assigned, or holds an assigned role, or claims from a role queue) AND passes\n * access checks on the task's bound entities. `workflows.tasks.*` features gate\n * administration (viewing others', reassigning) \u2014 never one's own assigned\n * work.*\n *\n * Written out:\n *\n * visible = SCOPE \u2227 (RELATIONSHIP \u2228 ADMINISTRATIVE) \u2227 ENTITY\n * actable = SCOPE \u2227 RELATIONSHIP \u2227 ENTITY \u2227 workable(status) \u2227 own-the-row\n * claimable = actable \u2227 unassigned \u2227 unclaimed \u2227 PENDING \u2227 role overlap\n *\n * Three properties are the whole design and every change here must preserve\n * them:\n *\n * 1. **A task with no bindings passes the entity clause vacuously \u2014 for\n * backoffice.** `[].every(...)` is `true`, and that is deliberate: every\n * `UserTask` row written before Phase 4 carries zero bindings, so reading\n * \"no bindings \u21D2 deny\" would make the entire existing corpus invisible to\n * its own assignees on upgrade. That is an outage, not a narrowing. A PORTAL\n * principal is the mirror image: they carry no org-membership grant at all,\n * so the binding to their own record IS the authorization and an unbound\n * task is visible to nobody.\n * 2. **Fail-closed applies to resolution failures, never to absence of data.**\n * An unresolvable entity type, a map key the resolver never produced, and a\n * resolver that threw all deny. An empty binding list does not.\n * 3. **Administration widens seeing, never acting.** `workflows.tasks.view_all`\n * and superadmin admit a principal to somebody else's row; they never make\n * it actable. To act, an administrator reassigns it to themselves first,\n * which is audited (`reassigned_by`/`reassigned_at`/`reassign_reason` plus a\n * `WorkflowEvent`). That is what keeps \"who approved this?\" answerable.\n *\n * PURE by contract, like `lib/task-resolution.ts` and `lib/error-routing.ts`:\n * no ORM, no DI, no React, no entity registry. Everything impure \u2014 the ACL\n * load, entity classification, portal ownership expansion, the tenant setting \u2014\n * is resolved ONCE per request by the caller and handed in as data.\n */\n\nimport { isOrganizationAccessAllowed } from '@open-mercato/shared/lib/auth/organizationAccess'\nimport { hasAllFeatures, hasFeature } from '@open-mercato/shared/security/features'\n\n/** Admits a principal to the task API. Necessary, never sufficient. */\nexport const WORKFLOWS_TASKS_VIEW_FEATURE = 'workflows.tasks.view'\n\n/** Administration: read rows you have no relationship to. Never grants act. */\nexport const WORKFLOWS_TASKS_VIEW_ALL_FEATURE = 'workflows.tasks.view_all'\n\n/** Administration: move a row to another assignee or role queue. */\nexport const WORKFLOWS_TASKS_REASSIGN_FEATURE = 'workflows.tasks.reassign'\n\n/**\n * The statuses a task can still be worked in.\n *\n * Deliberately the set `completeUserTask` accepts rather than \"not terminal\":\n * the handler filters on `status IN ('PENDING','IN_PROGRESS')`, so treating an\n * `ESCALATED` row as actable would render a Complete button that always fails.\n * The predicate and the handler must agree or the UI lies.\n */\nexport const TASK_ACTIONABLE_STATUSES: readonly string[] = ['PENDING', 'IN_PROGRESS']\n\nexport type BackofficeTaskPrincipal = {\n kind: 'backoffice'\n userId: string\n tenantId: string\n /** `null` = unrestricted operator (`resolveOrganizationScopeFilter` \u2192 `where: {}`). */\n organizationIds: readonly string[] | null\n /** `auth.roles` \u2014 role NAMES, server-derived, never client-supplied. */\n roleNames: readonly string[]\n /** `rbacService.getGrantedFeatures(...)` \u2014 MAY contain `'*'` / `'workflows.*'`. */\n grantedFeatures: readonly string[]\n isSuperAdmin: boolean\n}\n\nexport type PortalTaskPrincipal = {\n kind: 'portal'\n /** `CustomerAuthContext.sub`. */\n principalId: string\n tenantId: string\n organizationId: string\n /**\n * Record ids this principal may legitimately be the subject of. For a plain\n * portal user: `{customerEntityId, personEntityId}` minus nulls. For a portal\n * admin: the same PLUS every company-member record id, resolved once per\n * request by the route \u2014 never by this module.\n */\n ownedRecordIds: ReadonlySet<string>\n isPortalAdmin: boolean\n}\n\nexport type TaskPrincipal = BackofficeTaskPrincipal | PortalTaskPrincipal\n\nexport type TaskEntityBindingFact = { entityType: string; entityId: string }\n\n/**\n * Per-entity-type answer to \"may this principal view records of this type at\n * all\", produced once per request by `lib/task-entity-access.ts`.\n *\n * A tagged union rather than the design's `string[] | null`, because that shape\n * cannot tell `denied:unknown-entity-type` (the authored type does not resolve\n * to any entity id \u2014 an author's typo) from `denied:entity-access` (it resolves\n * fine, but the caller may not view that type, or the platform has no rule for\n * it). \u00A72.3 and \u00A72.7 both need those apart: the first is a definition bug the\n * Problems panel should flag, the second is a policy decision an administrator\n * is told about. Both still deny.\n *\n * `requires` carries the REQUIRED features, not a verdict, so the wildcard-aware\n * match happens here in the one place that decides anything.\n */\nexport type TaskEntityAccessDecision =\n | { kind: 'requires'; features: readonly string[] }\n | { kind: 'unknown-entity-type' }\n | { kind: 'unavailable' }\n\n/** Keyed by the binding's AUTHORED `entityType`, verbatim \u2014 see `resolveTaskEntityAccess`. */\nexport type TaskEntityAccessMap = ReadonlyMap<string, TaskEntityAccessDecision>\n\nexport type TaskFacts = {\n id: string\n tenantId: string\n organizationId: string\n status: string\n assignedTo: string | null\n /** `'user'` = `assignedTo` names a backoffice user; `'customer'` = a portal principal. */\n assigneeKind: 'user' | 'customer'\n assignedToRoles: readonly string[] | null\n claimedBy: string | null\n entityBindings: readonly TaskEntityBindingFact[]\n /**\n * ACL feature that admits a principal to this row when it is an UNASSIGNED\n * administrative queue item rather than personal work \u2014 declared by the work\n * inbox source that produced it (`WorkInboxSourceProvider.administrativeQueueFeature`).\n * Absent falls back to core's own `workflows.tasks.view_all`.\n */\n administrativeQueueFeature?: string | null\n}\n\nexport type TaskVisibilityPolicy = {\n /** Tenant opt-out. `true` = the \u00A76.4 model (default). `false` = legacy read filter. */\n businessContextEnabled: boolean\n}\n\nexport type TaskVisibilityReason =\n // admits\n | 'assignee'\n | 'claimant'\n | 'role-queue'\n | 'administrative'\n | 'administrative-queue'\n | 'legacy-read-filter'\n | 'portal-assignee'\n | 'portal-company-admin'\n // refusals\n | 'denied:tenant'\n | 'denied:organization'\n | 'denied:no-relationship'\n | 'denied:entity-access'\n | 'denied:unknown-entity-type'\n | 'denied:portal-unbound'\n | 'denied:portal-not-owner'\n | 'denied:portal-wrong-assignee-kind'\n\nexport type TaskVisibilityDecision = {\n visible: boolean\n /** May complete / decide this task. */\n actable: boolean\n /** May claim it off a role queue. A refinement of `actable`, never wider. */\n claimable: boolean\n reason: TaskVisibilityReason\n /**\n * The binding that failed the entity clause, when one did.\n *\n * Set on refusals, where it powers the `view_all`-only 403-with-reason\n * diagnostic \u2014 a task hidden by the entity gate must never disappear without\n * trace. Also set on the `legacy-read-filter` ADMIT, which is the one path\n * that shows a row whose entity clause failed: the opt-out restores the read\n * and nothing else, so the act surfaces need to see that the gate is still\n * closed underneath.\n */\n blockedEntityType?: string\n}\n\nfunction deny(reason: TaskVisibilityReason, blockedEntityType?: string): TaskVisibilityDecision {\n return blockedEntityType\n ? { visible: false, actable: false, claimable: false, reason, blockedEntityType }\n : { visible: false, actable: false, claimable: false, reason }\n}\n\n/**\n * Both sides are role NAMES, not ids.\n *\n * `assignedToRoles` holds what the Studio picker wrote, and `roleNames` is\n * `auth.roles`, derived server-side from the session \u2014 so a client cannot forge\n * membership by claiming a role. Names are tenant-MUTABLE, though: renaming a\n * role silently orphans every assignment authored against the old name, and\n * this comparison is where that shows up. Moving to immutable ids needs a\n * coordinated data + authored-definition migration (`loadAcl` returns no role\n * ids today, so changing only this side would match nothing); it is tracked as\n * a follow-up and stated in `framework/workflows/task-visibility.mdx` \u2192\n * Known Limits.\n */\nfunction hasRoleOverlap(\n taskRoles: readonly string[] | null,\n roleNames: readonly string[],\n): boolean {\n if (!taskRoles || taskRoles.length === 0 || roleNames.length === 0) return false\n const held = new Set(roleNames)\n return taskRoles.some((role) => held.has(role))\n}\n\n/** No assignee, no claimant and no role queue \u2014 nobody's personal work. */\nfunction isUnassignedQueueItem(task: TaskFacts): boolean {\n return (\n task.assignedTo === null &&\n task.claimedBy === null &&\n (task.assignedToRoles === null || task.assignedToRoles.length === 0)\n )\n}\n\ntype EntityClauseResult =\n | { ok: true }\n | { ok: false; reason: 'denied:entity-access' | 'denied:unknown-entity-type'; entityType: string }\n\n/**\n * `every`, not `some`: a task bound to a sensitive deal AND a harmless customer\n * must not leak through the harmless one. The cost is real \u2014 a legitimately\n * assigned worker can be blinded by a binding they cannot see \u2014 and is paid for\n * by the author-time Problems check and the `denied:entity-access` diagnostic\n * rather than by weakening the rule.\n */\nfunction evaluateEntityClause(\n principal: BackofficeTaskPrincipal,\n task: TaskFacts,\n entityAccess: TaskEntityAccessMap,\n): EntityClauseResult {\n // Mirrors `assertEntityAclForRequest`'s own `if (acl?.isSuperAdmin) return`.\n if (principal.isSuperAdmin) return { ok: true }\n for (const binding of task.entityBindings) {\n const decision = entityAccess.get(binding.entityType)\n // A key the resolver never produced is a RESOLUTION FAILURE, never a pass.\n if (!decision) {\n return { ok: false, reason: 'denied:entity-access', entityType: binding.entityType }\n }\n if (decision.kind === 'unknown-entity-type') {\n return { ok: false, reason: 'denied:unknown-entity-type', entityType: binding.entityType }\n }\n if (decision.kind === 'unavailable') {\n return { ok: false, reason: 'denied:entity-access', entityType: binding.entityType }\n }\n if (!hasAllFeatures(principal.grantedFeatures, decision.features)) {\n return { ok: false, reason: 'denied:entity-access', entityType: binding.entityType }\n }\n }\n return { ok: true }\n}\n\n/** The queue feature that admits a principal to this row when it is unassigned. */\nfunction administrativeQueueFeatureOf(task: TaskFacts): string {\n return task.administrativeQueueFeature ?? WORKFLOWS_TASKS_VIEW_ALL_FEATURE\n}\n\nfunction resolveRelationshipReason(\n principal: BackofficeTaskPrincipal,\n task: TaskFacts,\n): TaskVisibilityReason | null {\n if (task.assigneeKind === 'user' && task.assignedTo === principal.userId) return 'assignee'\n if (task.claimedBy !== null && task.claimedBy === principal.userId) return 'claimant'\n if (hasRoleOverlap(task.assignedToRoles, principal.roleNames)) return 'role-queue'\n return null\n}\n\nfunction resolveAdministrativeReason(\n principal: BackofficeTaskPrincipal,\n task: TaskFacts,\n): TaskVisibilityReason | null {\n if (principal.isSuperAdmin) return 'administrative'\n if (hasFeature(principal.grantedFeatures, WORKFLOWS_TASKS_VIEW_ALL_FEATURE)) return 'administrative'\n if (\n isUnassignedQueueItem(task) &&\n hasFeature(principal.grantedFeatures, administrativeQueueFeatureOf(task))\n ) {\n return 'administrative-queue'\n }\n return null\n}\n\n/**\n * Who owns the row right now. A claim outranks an assignment because that is\n * what `completeUserTask` enforces (`claimedBy ?? assignedTo`), and the two must\n * not disagree. `null` means the row is open, and membership in its queue is\n * then what confers the right to act.\n */\nexport function currentTaskOwnerId(task: TaskFacts): string | null {\n if (task.claimedBy !== null) return task.claimedBy\n if (task.assigneeKind === 'user') return task.assignedTo\n return null\n}\n\nfunction decideBackoffice(\n principal: BackofficeTaskPrincipal,\n task: TaskFacts,\n entityAccess: TaskEntityAccessMap,\n policy: TaskVisibilityPolicy,\n): TaskVisibilityDecision {\n // Never overridden \u2014 not by superadmin, not by the tenant opt-out.\n if (task.tenantId !== principal.tenantId) return deny('denied:tenant')\n if (\n !isOrganizationAccessAllowed({\n isSuperAdmin: principal.isSuperAdmin,\n allowedOrganizationIds: principal.organizationIds,\n targetOrganizationId: task.organizationId,\n })\n ) {\n return deny('denied:organization')\n }\n\n const relationshipReason = resolveRelationshipReason(principal, task)\n const administrativeReason = relationshipReason\n ? null\n : resolveAdministrativeReason(principal, task)\n const admitReason = relationshipReason ?? administrativeReason\n\n const entity = evaluateEntityClause(principal, task, entityAccess)\n\n // ACT is computed by the NEW rule always \u2014 the opt-out is a SELECT filter, not\n // an authorization mode, so it can neither widen nor narrow this.\n const owner = currentTaskOwnerId(task)\n const ownsTheRow =\n owner !== null\n ? owner === principal.userId\n : hasRoleOverlap(task.assignedToRoles, principal.roleNames)\n const actable =\n entity.ok &&\n ownsTheRow &&\n task.assigneeKind === 'user' &&\n TASK_ACTIONABLE_STATUSES.includes(task.status)\n const claimable =\n actable &&\n task.assignedTo === null &&\n task.claimedBy === null &&\n task.status === 'PENDING' &&\n hasRoleOverlap(task.assignedToRoles, principal.roleNames)\n\n if (admitReason && entity.ok) {\n return { visible: true, actable, claimable, reason: admitReason }\n }\n\n // The opt-out restores the pre-change READ filter and nothing else: same rows,\n // no entity gate, act path untouched. It is additive on purpose \u2014 it must\n // never hide a row the new model would have shown.\n if (\n !policy.businessContextEnabled &&\n hasFeature(principal.grantedFeatures, WORKFLOWS_TASKS_VIEW_FEATURE)\n ) {\n return {\n visible: true,\n actable,\n claimable,\n reason: 'legacy-read-filter',\n // Reported even though the row is admitted: the read came back, the entity\n // gate did not, and an act surface must be able to tell the difference.\n ...(entity.ok ? {} : { blockedEntityType: entity.entityType }),\n }\n }\n\n // No relationship and no administrative grant discloses less than an entity\n // refusal does, so it is reported first: a caller with no legitimate knowledge\n // that the row exists learns nothing about which entity blocked them.\n if (!admitReason) return deny('denied:no-relationship')\n if (!entity.ok) return deny(entity.reason, entity.entityType)\n return deny('denied:no-relationship')\n}\n\nfunction decidePortal(principal: PortalTaskPrincipal, task: TaskFacts): TaskVisibilityDecision {\n if (task.tenantId !== principal.tenantId) return deny('denied:tenant')\n if (task.organizationId !== principal.organizationId) return deny('denied:organization')\n // Structural: a backoffice task is not portal work, whatever the caller holds.\n if (task.assigneeKind !== 'customer') return deny('denied:portal-wrong-assignee-kind')\n // A portal principal carries no org-membership grant, so an unbound task has\n // nothing tying it to them. Denying is the only correct answer, and it is what\n // keeps every legacy (binding-free) backoffice row out of the portal.\n if (task.entityBindings.length === 0) return deny('denied:portal-unbound')\n\n // A data comparison, never a feature check: `isPortalAdmin` resolves to `['*']`\n // in `customerAuth.ts` and short-circuits `userHasAllFeatures`, so a wildcard\n // must not be able to satisfy ownership. A `Set.has` cannot be wildcarded.\n const ownsEveryBinding = task.entityBindings.every((binding) =>\n principal.ownedRecordIds.has(binding.entityId),\n )\n if (!ownsEveryBinding) return deny('denied:portal-not-owner')\n\n if (task.assignedTo === principal.principalId) {\n const actable = TASK_ACTIONABLE_STATUSES.includes(task.status)\n return { visible: true, actable, claimable: false, reason: 'portal-assignee' }\n }\n\n // Consulted LAST, and only to widen seeing \u2014 a company admin reads their\n // members' work, they never complete it.\n if (principal.isPortalAdmin) {\n return { visible: true, actable: false, claimable: false, reason: 'portal-company-admin' }\n }\n\n return deny('denied:portal-not-owner')\n}\n\n/**\n * The one decision point. Every surface \u2014 list, detail, claim, unclaim,\n * complete, reassign, work inbox, the record-page pending-work widget, the\n * workload aggregate and the portal routes \u2014 routes through this function. A\n * second copy of the rule anywhere is a review failure.\n */\nexport function decideTaskVisibility(\n principal: TaskPrincipal,\n task: TaskFacts,\n entityAccess: TaskEntityAccessMap,\n policy: TaskVisibilityPolicy,\n): TaskVisibilityDecision {\n if (principal.kind === 'portal') return decidePortal(principal, task)\n return decideBackoffice(principal, task, entityAccess, policy)\n}\n\n/**\n * The statuses `reassignUserTask` accepts (`lib/task-handler.ts`\n * `REASSIGNABLE_STATUSES`). Restated here because this module is PURE and the\n * handler is not; the two must agree or the Reassign button lies.\n */\nexport const TASK_REASSIGNABLE_STATUSES: readonly string[] = ['PENDING', 'IN_PROGRESS']\n\n/**\n * The status `releaseUserTask` accepts. It looks the row up with\n * `status: 'IN_PROGRESS'`, so a PENDING row is `TASK_NOT_FOUND` there \u2014 which is\n * narrower than `TASK_ACTIONABLE_STATUSES` and must not be widened to it.\n */\nexport const TASK_RELEASABLE_STATUS = 'IN_PROGRESS'\n\n/**\n * Why an act surface is closed to a caller who CAN read the row.\n *\n * Every value here is derivable from fields the caller already has in the same\n * response (`status`, `assignedTo`, `claimedBy`, `assignedToRoles`), so naming\n * the reason discloses nothing the payload does not. The one deliberate\n * exception is `unavailable`, below.\n */\nexport type TaskActionBlockReason =\n /** Terminal status \u2014 the handler answers `TASK_NOT_FOUND`. */\n | 'not-workable'\n /** Somebody else is the assignee or the claimant \u2014 a 409 on click. */\n | 'owned-by-another'\n /** Open, but queued to a role the caller does not hold. */\n | 'not-in-your-queue'\n /** Nobody's work: no assignee, no claim, no queue \u2014 `TASK_NOT_ACTIONABLE`. */\n | 'unowned'\n /**\n * Refused without a reason, on purpose.\n *\n * Reachable only under the tenant opt-out, which restores the READ and never\n * the act path: the row comes back with `blockedEntityType` set and the act\n * routes answer a bare 404 for it, because \"the entity gate blocked you\" names\n * a binding the gate has just refused this caller. The UI must be exactly as\n * uninformative \u2014 it says the action is unavailable and stops there.\n */\n | 'unavailable'\n\n/**\n * What the page may OFFER, decided here so no client re-derives \u00A76.4.\n *\n * These are booleans, not features: a `workflows.tasks.view_all` administrator\n * holds `workflows.tasks.complete` and still gets `canComplete: false`, because\n * administration widens seeing and never acting. Each flag mirrors the gate its\n * own endpoint applies (`resolveTaskActRefusal` for complete/claim/release,\n * visibility + the reassign feature for reassign), so an offered action is one\n * the server will accept.\n */\nexport type TaskAffordances = {\n canComplete: boolean\n canClaim: boolean\n canRelease: boolean\n canReassign: boolean\n /** Why `canComplete` is false, for a caller who can read the row. */\n actBlockedReason: TaskActionBlockReason | null\n}\n\n/**\n * Resolve the act surfaces for one already-decided row.\n *\n * PURE, and deliberately a projection of `decideTaskVisibility`'s own answer\n * rather than a second evaluation of the rule: `canComplete` IS `actable` and\n * `canClaim` IS `claimable`. Only `canRelease` and `canReassign` add anything,\n * and each adds exactly the one condition its endpoint checks beyond visibility.\n */\nexport function resolveTaskAffordances(\n principal: BackofficeTaskPrincipal,\n task: TaskFacts,\n decision: TaskVisibilityDecision,\n): TaskAffordances {\n // Set on the `legacy-read-filter` ADMIT: the opt-out restored the read and the\n // entity gate is still shut underneath, so every act route answers 404.\n const entityGateClosed = decision.blockedEntityType !== undefined\n const actSurfaceOpen = decision.visible && !entityGateClosed\n\n const canComplete = decision.visible && decision.actable\n const canClaim = decision.visible && decision.claimable\n const canRelease =\n actSurfaceOpen && task.status === TASK_RELEASABLE_STATUS && task.claimedBy === principal.userId\n const canReassign =\n actSurfaceOpen &&\n TASK_REASSIGNABLE_STATUSES.includes(task.status) &&\n (principal.isSuperAdmin ||\n hasFeature(principal.grantedFeatures, WORKFLOWS_TASKS_REASSIGN_FEATURE))\n\n return {\n canComplete,\n canClaim,\n canRelease,\n canReassign,\n actBlockedReason: resolveActBlockReason(principal, task, decision, {\n canComplete,\n entityGateClosed,\n }),\n }\n}\n\n/**\n * Mirrors `resolveTaskActRefusal`'s precedence exactly \u2014 entity gate, then\n * status, then ownership \u2014 so the stated reason and the refusal a click would\n * produce can never disagree.\n */\nfunction resolveActBlockReason(\n principal: BackofficeTaskPrincipal,\n task: TaskFacts,\n decision: TaskVisibilityDecision,\n state: { canComplete: boolean; entityGateClosed: boolean },\n): TaskActionBlockReason | null {\n if (state.canComplete) return null\n if (!decision.visible) return null\n if (state.entityGateClosed) return 'unavailable'\n if (!TASK_ACTIONABLE_STATUSES.includes(task.status)) return 'not-workable'\n\n const owner = currentTaskOwnerId(task)\n if (owner !== null) return owner === principal.userId ? 'unavailable' : 'owned-by-another'\n if (task.assignedToRoles !== null && task.assignedToRoles.length > 0) return 'not-in-your-queue'\n return 'unowned'\n}\n\nexport type TaskVisibilityFilterOptions = {\n /**\n * Queue feature for the source being filtered, when it is not core's own\n * `workflows.tasks.view_all`. Supplying it adds the unassigned-queue arm.\n */\n administrativeQueueFeature?: string | null\n}\n\n/**\n * The RELATIONSHIP \u2228 ADMINISTRATIVE half of the rule as ORM conditions, for\n * pushing onto an existing `$and` array (`buildUserTaskWorkInboxWhere` composes\n * independent `$or` groups exactly this way).\n *\n * Returns `[]` when the caller may read everything in scope \u2014 an administrator,\n * a superadmin, or a tenant that has flipped the opt-out.\n *\n * **The ENTITY half is deliberately absent.** The predicate is \"no binding whose\n * type is outside my allowed set\", and the disallowed set is unbounded (authored\n * free text), so it cannot be enumerated as `$contains` negations over the\n * `entity_bindings` jsonb. It becomes a containment test against the\n * denormalized `user_tasks.entity_types` column (design D-2), emitted as one raw\n * fragment where the query is built. Do not try to express it here.\n */\nexport function buildTaskVisibilityConditions(\n principal: BackofficeTaskPrincipal,\n policy: TaskVisibilityPolicy,\n options: TaskVisibilityFilterOptions = {},\n): Record<string, unknown>[] {\n if (principal.isSuperAdmin) return []\n if (hasFeature(principal.grantedFeatures, WORKFLOWS_TASKS_VIEW_ALL_FEATURE)) return []\n if (\n !policy.businessContextEnabled &&\n hasFeature(principal.grantedFeatures, WORKFLOWS_TASKS_VIEW_FEATURE)\n ) {\n return []\n }\n\n const arms: Record<string, unknown>[] = [\n // `assigneeKind` discriminates a backoffice user id from a portal principal\n // id in the same column, so a customer-assigned row can never match a\n // backoffice caller whose user id happens to collide.\n { assignedTo: principal.userId, assigneeKind: 'user' },\n { claimedBy: principal.userId },\n ]\n if (principal.roleNames.length > 0) {\n arms.push({ assignedToRoles: { $overlap: [...principal.roleNames] } })\n }\n\n const queueFeature = options.administrativeQueueFeature\n if (queueFeature && hasFeature(principal.grantedFeatures, queueFeature)) {\n arms.push({\n assignedTo: null,\n claimedBy: null,\n $or: [{ assignedToRoles: null }, { assignedToRoles: { $eq: [] } }],\n })\n }\n\n return [{ $or: arms }]\n}\n\n/**\n * The full `WHERE` for a backoffice principal: tenant, organization and the\n * relationship clause. Same shape as `buildUserTaskWorkInboxWhere`'s output so\n * the two compose.\n *\n * Portal reads do not use this \u2014 they filter on `assignee_kind = 'customer'`\n * plus the caller's owned record ids, which is new surface with its own query.\n */\nexport function buildTaskVisibilityFilter(\n principal: BackofficeTaskPrincipal,\n policy: TaskVisibilityPolicy,\n options: TaskVisibilityFilterOptions = {},\n): Record<string, unknown> {\n const where: Record<string, unknown> = { tenantId: principal.tenantId }\n if (principal.organizationIds !== null) {\n where.organizationId = { $in: [...principal.organizationIds] }\n }\n const conditions = buildTaskVisibilityConditions(principal, policy, options)\n if (conditions.length > 0) where.$and = conditions\n return where\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -161,13 +161,15 @@ async function fireTimer(em, container, options) {
161
161
  await em.flush();
162
162
  return;
163
163
  }
164
+ instance.status = "RUNNING";
165
+ await em.flush();
164
166
  const transitionResult = await transitionHandler.executeTransition(
165
167
  em,
166
168
  container,
167
169
  instance,
168
170
  instance.currentStepId,
169
171
  firstValidTransition.transition.toStepId,
170
- transitionContext
172
+ { ...transitionContext, transitionId: firstValidTransition.transition.transitionId }
171
173
  );
172
174
  if (!transitionResult.success) {
173
175
  throw new TimerError(
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/workflows/lib/timer-handler.ts"],
4
- "sourcesContent": ["/**\n * Timer Handler Service\n *\n * Fires timers for WAIT_FOR_TIMER steps: resumes a paused workflow instance\n * when its scheduled timer job is processed by the activity worker.\n */\n\nimport { EntityManager } from '@mikro-orm/core'\nimport type { EntityManager as PostgreSqlEntityManager } from '@mikro-orm/postgresql'\nimport type { AwilixContainer } from 'awilix'\nimport { findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { WorkflowInstance, WorkflowDefinition, StepInstance } from '../data/entities'\nimport type * as eventLoggerModule from './event-logger'\nimport type * as stepHandlerModule from './step-handler'\nimport type * as transitionHandlerModule from './transition-handler'\nimport type * as workflowExecutorModule from './workflow-executor'\nimport { resolveCodeDefinitionForInstance } from './find-definition'\n\nexport interface FireTimerOptions {\n instanceId: string\n stepInstanceId?: string\n branchInstanceId?: string | null\n userId?: string\n tenantId: string\n organizationId: string\n}\n\nexport class TimerError extends Error {\n constructor(\n message: string,\n public code: string,\n public details?: any\n ) {\n super(message)\n this.name = 'TimerError'\n }\n}\n\n/**\n * Fire a timer and resume workflow execution.\n *\n * Mirrors `sendSignal` from signal-handler.ts \u2014 verifies the instance is\n * paused at a WAIT_FOR_TIMER step, logs TIMER_FIRED, exits the step, then\n * executes auto transitions and resumes the workflow.\n */\nexport async function fireTimer(\n em: EntityManager,\n container: AwilixContainer,\n options: FireTimerOptions\n): Promise<void> {\n const { instanceId, stepInstanceId, branchInstanceId, userId, tenantId, organizationId } = options\n\n const eventLogger = container.resolve<typeof eventLoggerModule>('eventLogger')\n const stepHandler = container.resolve<typeof stepHandlerModule>('stepHandler')\n const transitionHandler = container.resolve<typeof transitionHandlerModule>('transitionHandler')\n const workflowExecutor = container.resolve<typeof workflowExecutorModule>('workflowExecutor')\n\n // Branch-scoped timer: the instance is FORKED and the branch is PAUSED at the\n // WAIT_FOR_TIMER step. Resume just that branch, then drive the parallel loop.\n if (branchInstanceId) {\n await eventLogger.logWorkflowEvent(em, {\n workflowInstanceId: instanceId,\n stepInstanceId,\n branchInstanceId,\n eventType: 'TIMER_FIRED',\n eventData: { firedAt: new Date().toISOString(), branch: true },\n userId,\n tenantId,\n organizationId,\n })\n const { resumeBranch } = await import('./parallel-handler')\n const resumed = await resumeBranch(em, {\n instanceId,\n branchInstanceId,\n tenantId,\n organizationId,\n exitStepInstanceId: stepInstanceId,\n exitOutput: { firedAt: new Date().toISOString() },\n })\n if (resumed) {\n await workflowExecutor.executeWorkflow(em, container, instanceId, { userId })\n }\n return\n }\n\n const instance = await findOneWithDecryption(\n em as PostgreSqlEntityManager,\n WorkflowInstance,\n {\n id: instanceId,\n tenantId,\n organizationId,\n },\n undefined,\n { tenantId, organizationId },\n )\n\n if (!instance) {\n throw new TimerError(\n 'Workflow instance not found',\n 'INSTANCE_NOT_FOUND',\n { instanceId }\n )\n }\n\n if (instance.status !== 'PAUSED') {\n throw new TimerError(\n 'Workflow is not paused',\n 'WORKFLOW_NOT_PAUSED',\n { instanceId, status: instance.status }\n )\n }\n\n const definition = (await findOneWithDecryption(\n em as PostgreSqlEntityManager,\n WorkflowDefinition,\n {\n id: instance.definitionId,\n tenantId: instance.tenantId,\n organizationId: instance.organizationId,\n deletedAt: null,\n },\n undefined,\n { tenantId: instance.tenantId, organizationId: instance.organizationId },\n )) ?? resolveCodeDefinitionForInstance(instance)\n if (!definition) {\n throw new TimerError(\n 'Workflow definition not found',\n 'DEFINITION_NOT_FOUND',\n { definitionId: instance.definitionId }\n )\n }\n\n const currentStep = definition.definition.steps.find(\n (s: any) => s.stepId === instance.currentStepId\n )\n\n if (!currentStep || currentStep.stepType !== 'WAIT_FOR_TIMER') {\n throw new TimerError(\n 'Workflow is not waiting for timer',\n 'NOT_WAITING_FOR_TIMER',\n { instanceId, currentStepId: instance.currentStepId }\n )\n }\n\n const now = new Date()\n instance.updatedAt = now\n\n await eventLogger.logWorkflowEvent(em, {\n workflowInstanceId: instance.id,\n stepInstanceId,\n eventType: 'TIMER_FIRED',\n eventData: {\n stepId: instance.currentStepId,\n firedAt: now.toISOString(),\n },\n userId,\n tenantId: instance.tenantId,\n organizationId: instance.organizationId,\n })\n\n const stepInstance = stepInstanceId\n ? await findOneWithDecryption(\n em as PostgreSqlEntityManager,\n StepInstance,\n {\n id: stepInstanceId,\n workflowInstanceId: instance.id,\n tenantId: instance.tenantId,\n organizationId: instance.organizationId,\n },\n undefined,\n { tenantId: instance.tenantId, organizationId: instance.organizationId },\n )\n : await findOneWithDecryption(\n em as PostgreSqlEntityManager,\n StepInstance,\n {\n workflowInstanceId: instance.id,\n stepId: instance.currentStepId,\n status: 'ACTIVE',\n tenantId: instance.tenantId,\n organizationId: instance.organizationId,\n },\n undefined,\n { tenantId: instance.tenantId, organizationId: instance.organizationId },\n )\n\n if (stepInstance) {\n await stepHandler.exitStep(em, stepInstance, {\n firedAt: now.toISOString(),\n })\n }\n\n const autoTransitions = (definition.definition.transitions || []).filter(\n (t: any) => t.fromStepId === instance.currentStepId && t.trigger === 'auto'\n )\n\n if (autoTransitions.length === 0) {\n instance.status = 'RUNNING'\n await em.flush()\n return\n }\n\n const transitionContext = {\n workflowContext: instance.context,\n userId,\n }\n\n const validTransitions = await transitionHandler.findValidTransitions(\n em,\n instance,\n instance.currentStepId,\n transitionContext\n )\n\n const firstValidTransition = validTransitions.find((t) => t.isValid)\n\n if (!firstValidTransition || !firstValidTransition.transition) {\n instance.status = 'RUNNING'\n await em.flush()\n return\n }\n\n const transitionResult = await transitionHandler.executeTransition(\n em,\n container,\n instance,\n instance.currentStepId,\n firstValidTransition.transition.toStepId,\n transitionContext\n )\n\n if (!transitionResult.success) {\n throw new TimerError(\n 'Transition failed after timer fired',\n 'TRANSITION_FAILED',\n { error: transitionResult.error }\n )\n }\n\n await workflowExecutor.executeWorkflow(em, container, instance.id, { userId })\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Timer Handler Service\n *\n * Fires timers for WAIT_FOR_TIMER steps: resumes a paused workflow instance\n * when its scheduled timer job is processed by the activity worker.\n */\n\nimport { EntityManager } from '@mikro-orm/core'\nimport type { EntityManager as PostgreSqlEntityManager } from '@mikro-orm/postgresql'\nimport type { AwilixContainer } from 'awilix'\nimport { findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { WorkflowInstance, WorkflowDefinition, StepInstance } from '../data/entities'\nimport type * as eventLoggerModule from './event-logger'\nimport type * as stepHandlerModule from './step-handler'\nimport type * as transitionHandlerModule from './transition-handler'\nimport type * as workflowExecutorModule from './workflow-executor'\nimport { resolveCodeDefinitionForInstance } from './find-definition'\n\nexport interface FireTimerOptions {\n instanceId: string\n stepInstanceId?: string\n branchInstanceId?: string | null\n userId?: string\n tenantId: string\n organizationId: string\n}\n\nexport class TimerError extends Error {\n constructor(\n message: string,\n public code: string,\n public details?: any\n ) {\n super(message)\n this.name = 'TimerError'\n }\n}\n\n/**\n * Fire a timer and resume workflow execution.\n *\n * Mirrors `sendSignal` from signal-handler.ts \u2014 verifies the instance is\n * paused at a WAIT_FOR_TIMER step, logs TIMER_FIRED, exits the step, then\n * executes auto transitions and resumes the workflow.\n */\nexport async function fireTimer(\n em: EntityManager,\n container: AwilixContainer,\n options: FireTimerOptions\n): Promise<void> {\n const { instanceId, stepInstanceId, branchInstanceId, userId, tenantId, organizationId } = options\n\n const eventLogger = container.resolve<typeof eventLoggerModule>('eventLogger')\n const stepHandler = container.resolve<typeof stepHandlerModule>('stepHandler')\n const transitionHandler = container.resolve<typeof transitionHandlerModule>('transitionHandler')\n const workflowExecutor = container.resolve<typeof workflowExecutorModule>('workflowExecutor')\n\n // Branch-scoped timer: the instance is FORKED and the branch is PAUSED at the\n // WAIT_FOR_TIMER step. Resume just that branch, then drive the parallel loop.\n if (branchInstanceId) {\n await eventLogger.logWorkflowEvent(em, {\n workflowInstanceId: instanceId,\n stepInstanceId,\n branchInstanceId,\n eventType: 'TIMER_FIRED',\n eventData: { firedAt: new Date().toISOString(), branch: true },\n userId,\n tenantId,\n organizationId,\n })\n const { resumeBranch } = await import('./parallel-handler')\n const resumed = await resumeBranch(em, {\n instanceId,\n branchInstanceId,\n tenantId,\n organizationId,\n exitStepInstanceId: stepInstanceId,\n exitOutput: { firedAt: new Date().toISOString() },\n })\n if (resumed) {\n await workflowExecutor.executeWorkflow(em, container, instanceId, { userId })\n }\n return\n }\n\n const instance = await findOneWithDecryption(\n em as PostgreSqlEntityManager,\n WorkflowInstance,\n {\n id: instanceId,\n tenantId,\n organizationId,\n },\n undefined,\n { tenantId, organizationId },\n )\n\n if (!instance) {\n throw new TimerError(\n 'Workflow instance not found',\n 'INSTANCE_NOT_FOUND',\n { instanceId }\n )\n }\n\n if (instance.status !== 'PAUSED') {\n throw new TimerError(\n 'Workflow is not paused',\n 'WORKFLOW_NOT_PAUSED',\n { instanceId, status: instance.status }\n )\n }\n\n const definition = (await findOneWithDecryption(\n em as PostgreSqlEntityManager,\n WorkflowDefinition,\n {\n id: instance.definitionId,\n tenantId: instance.tenantId,\n organizationId: instance.organizationId,\n deletedAt: null,\n },\n undefined,\n { tenantId: instance.tenantId, organizationId: instance.organizationId },\n )) ?? resolveCodeDefinitionForInstance(instance)\n if (!definition) {\n throw new TimerError(\n 'Workflow definition not found',\n 'DEFINITION_NOT_FOUND',\n { definitionId: instance.definitionId }\n )\n }\n\n const currentStep = definition.definition.steps.find(\n (s: any) => s.stepId === instance.currentStepId\n )\n\n if (!currentStep || currentStep.stepType !== 'WAIT_FOR_TIMER') {\n throw new TimerError(\n 'Workflow is not waiting for timer',\n 'NOT_WAITING_FOR_TIMER',\n { instanceId, currentStepId: instance.currentStepId }\n )\n }\n\n const now = new Date()\n instance.updatedAt = now\n\n await eventLogger.logWorkflowEvent(em, {\n workflowInstanceId: instance.id,\n stepInstanceId,\n eventType: 'TIMER_FIRED',\n eventData: {\n stepId: instance.currentStepId,\n firedAt: now.toISOString(),\n },\n userId,\n tenantId: instance.tenantId,\n organizationId: instance.organizationId,\n })\n\n const stepInstance = stepInstanceId\n ? await findOneWithDecryption(\n em as PostgreSqlEntityManager,\n StepInstance,\n {\n id: stepInstanceId,\n workflowInstanceId: instance.id,\n tenantId: instance.tenantId,\n organizationId: instance.organizationId,\n },\n undefined,\n { tenantId: instance.tenantId, organizationId: instance.organizationId },\n )\n : await findOneWithDecryption(\n em as PostgreSqlEntityManager,\n StepInstance,\n {\n workflowInstanceId: instance.id,\n stepId: instance.currentStepId,\n status: 'ACTIVE',\n tenantId: instance.tenantId,\n organizationId: instance.organizationId,\n },\n undefined,\n { tenantId: instance.tenantId, organizationId: instance.organizationId },\n )\n\n if (stepInstance) {\n await stepHandler.exitStep(em, stepInstance, {\n firedAt: now.toISOString(),\n })\n }\n\n const autoTransitions = (definition.definition.transitions || []).filter(\n (t: any) => t.fromStepId === instance.currentStepId && t.trigger === 'auto'\n )\n\n if (autoTransitions.length === 0) {\n instance.status = 'RUNNING'\n await em.flush()\n return\n }\n\n const transitionContext = {\n workflowContext: instance.context,\n userId,\n }\n\n const validTransitions = await transitionHandler.findValidTransitions(\n em,\n instance,\n instance.currentStepId,\n transitionContext\n )\n\n const firstValidTransition = validTransitions.find((t) => t.isValid)\n\n if (!firstValidTransition || !firstValidTransition.transition) {\n instance.status = 'RUNNING'\n await em.flush()\n return\n }\n\n // Resume from the paused wait BEFORE executing the transition, exactly as\n // `sendSignal` does. Without it the executor's defense-in-depth PAUSED check\n // stops the run at the very first step the timer traverses, so the instance\n // sits at that step (typically END) as PAUSED and never completes.\n instance.status = 'RUNNING'\n await em.flush()\n\n const transitionResult = await transitionHandler.executeTransition(\n em,\n container,\n instance,\n instance.currentStepId,\n firstValidTransition.transition.toStepId,\n { ...transitionContext, transitionId: firstValidTransition.transition.transitionId },\n )\n\n if (!transitionResult.success) {\n throw new TimerError(\n 'Transition failed after timer fired',\n 'TRANSITION_FAILED',\n { error: transitionResult.error }\n )\n }\n\n await workflowExecutor.executeWorkflow(em, container, instance.id, { userId })\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -6,6 +6,13 @@ import * as ruleEngine from "../../business_rules/lib/rule-engine.js";
6
6
  import * as activityExecutor from "./activity-executor.js";
7
7
  import * as stepHandler from "./step-handler.js";
8
8
  import { findDefinitionForInstance } from "./find-definition.js";
9
+ import { resolveDefinitionInterpolationMode } from "./interpolation-pipeline.js";
10
+ import { buildSetVariableContextPatch, isSetVariableOutput } from "./set-variable.js";
11
+ import {
12
+ resolveStepFailureHandling
13
+ } from "./error-routing.js";
14
+ import { DRY_RUN_EVENT_TYPES, isDryRunInstance } from "./dry-run.js";
15
+ import { excludeNonNormalTransitions } from "./route-kinds.js";
9
16
  import {
10
17
  rootToken,
11
18
  tokenBranchInstanceId,
@@ -19,6 +26,33 @@ import {
19
26
  } from "./execution-token.js";
20
27
  import { createLogger } from "@open-mercato/shared/lib/logger";
21
28
  const logger = createLogger("workflows");
29
+ function buildFailureRouting(handling, failedStepId) {
30
+ if (handling.kind === "route" && typeof handling.transition.toStepId === "string") {
31
+ return {
32
+ failedStepId,
33
+ errorRoute: {
34
+ transitionId: handling.transition.transitionId,
35
+ toStepId: handling.transition.toStepId
36
+ }
37
+ };
38
+ }
39
+ if (handling.kind === "park") {
40
+ return { failedStepId, parkForAttention: true };
41
+ }
42
+ if (handling.kind === "handlerStep") {
43
+ return { failedStepId, errorHandlerStepId: handling.stepId };
44
+ }
45
+ return {};
46
+ }
47
+ async function logSuppressedRuleActions(em, instance, ruleId, phase) {
48
+ await logTransitionEvent(em, {
49
+ workflowInstanceId: instance.id,
50
+ eventType: DRY_RUN_EVENT_TYPES.businessRuleActionsSuppressed,
51
+ eventData: { ruleId, phase },
52
+ tenantId: instance.tenantId,
53
+ organizationId: instance.organizationId
54
+ });
55
+ }
22
56
  class TransitionError extends Error {
23
57
  constructor(message, code, details) {
24
58
  super(message);
@@ -42,7 +76,7 @@ async function evaluateTransition(em, instance, fromStepId, toStepId, context) {
42
76
  let transition;
43
77
  if (toStepId) {
44
78
  transition = transitions.find(
45
- (t) => t.fromStepId === fromStepId && t.toStepId === toStepId
79
+ (candidate) => candidate.fromStepId === fromStepId && candidate.toStepId === toStepId && (context.transitionId === void 0 || candidate.transitionId === context.transitionId)
46
80
  );
47
81
  if (!transition) {
48
82
  return {
@@ -52,7 +86,7 @@ async function evaluateTransition(em, instance, fromStepId, toStepId, context) {
52
86
  };
53
87
  }
54
88
  } else {
55
- const availableTransitions = transitions.filter(
89
+ const availableTransitions = excludeNonNormalTransitions(transitions).filter(
56
90
  (t) => t.fromStepId === fromStepId
57
91
  );
58
92
  if (availableTransitions.length === 0) {
@@ -108,7 +142,7 @@ async function findValidTransitions(em, instance, fromStepId, context) {
108
142
  if (!definition) {
109
143
  return [];
110
144
  }
111
- const transitions = (definition.definition.transitions || []).filter((t) => t.fromStepId === fromStepId).sort((a, b) => (b.priority || 0) - (a.priority || 0));
145
+ const transitions = excludeNonNormalTransitions(definition.definition.transitions || []).filter((t) => t.fromStepId === fromStepId).sort((a, b) => (b.priority || 0) - (a.priority || 0));
112
146
  const results = [];
113
147
  for (const transition of transitions) {
114
148
  const conditionResult = await evaluateTransition(
@@ -116,7 +150,7 @@ async function findValidTransitions(em, instance, fromStepId, context) {
116
150
  instance,
117
151
  fromStepId,
118
152
  transition.toStepId,
119
- context
153
+ { ...context, transitionId: transition.transitionId }
120
154
  );
121
155
  if (!conditionResult.isValid) {
122
156
  results.push(conditionResult);
@@ -222,6 +256,7 @@ async function executeTransitionForToken(em, container, token, fromStepId, toSte
222
256
  let activityOutputs = {};
223
257
  const activityResults = [];
224
258
  if (transition.activities && transition.activities.length > 0) {
259
+ const definitionForInterpolation = await findDefinitionForInstance(em, instance);
225
260
  const activityContext = {
226
261
  workflowInstance: instance,
227
262
  workflowContext: {
@@ -229,7 +264,8 @@ async function executeTransitionForToken(em, container, token, fromStepId, toSte
229
264
  ...context.workflowContext
230
265
  },
231
266
  branchInstanceId,
232
- userId: context.userId
267
+ userId: context.userId,
268
+ interpolationMode: resolveDefinitionInterpolationMode(definitionForInterpolation?.definition)
233
269
  };
234
270
  const results = await activityExecutor.executeActivities(
235
271
  em,
@@ -240,6 +276,14 @@ async function executeTransitionForToken(em, container, token, fromStepId, toSte
240
276
  activityResults.push(...results);
241
277
  const failedActivities = results.filter((r) => !r.success);
242
278
  if (failedActivities.length > 0) {
279
+ const refusal = failedActivities.find((result) => result.dryRunRefused);
280
+ if (refusal) {
281
+ return {
282
+ success: false,
283
+ error: refusal.error ?? "Dry run stopped",
284
+ conditionsEvaluated: { preConditions: true, postConditions: false }
285
+ };
286
+ }
243
287
  const continueOnFailure = transition.continueOnActivityFailure ?? false;
244
288
  await logTransitionEvent(em, {
245
289
  workflowInstanceId: instance.id,
@@ -261,20 +305,57 @@ async function executeTransitionForToken(em, container, token, fromStepId, toSte
261
305
  organizationId: instance.organizationId
262
306
  });
263
307
  if (!continueOnFailure) {
264
- return {
265
- success: false,
266
- error: `Activities failed: ${failedActivities.map((f) => f.error).join(", ")}`,
267
- conditionsEvaluated: {
268
- preConditions: true,
269
- postConditions: false
308
+ const failureHandling = resolveStepFailureHandling(
309
+ definitionForInterpolation?.definition,
310
+ fromStepId
311
+ );
312
+ if (failureHandling.kind === "continue") {
313
+ await logTransitionEvent(em, {
314
+ workflowInstanceId: instance.id,
315
+ branchInstanceId,
316
+ eventType: "ERROR_DIRECTIVE_APPLIED",
317
+ eventData: {
318
+ stepId: fromStepId,
319
+ directive: "continueWithFallback",
320
+ transitionId: transition.transitionId || `${fromStepId}->${toStepId}`,
321
+ hasFallbackValue: failureHandling.fallbackValue !== void 0
322
+ },
323
+ userId: context.userId,
324
+ tenantId: instance.tenantId,
325
+ organizationId: instance.organizationId
326
+ });
327
+ if (failureHandling.fallbackValue !== void 0) {
328
+ activityOutputs[fromStepId] = failureHandling.fallbackValue;
270
329
  }
271
- };
330
+ } else {
331
+ return {
332
+ success: false,
333
+ error: `Activities failed: ${failedActivities.map((f) => f.error).join(", ")}`,
334
+ conditionsEvaluated: {
335
+ preConditions: true,
336
+ postConditions: false
337
+ },
338
+ ...buildFailureRouting(failureHandling, fromStepId)
339
+ };
340
+ }
272
341
  }
273
342
  }
274
343
  results.forEach((result) => {
275
344
  if (result.success && result.output) {
276
- const key = result.activityName || result.activityType;
277
- activityOutputs[key] = result.output;
345
+ if (result.activityType === "SET_VARIABLE" && isSetVariableOutput(result.output)) {
346
+ const assignmentBase = {
347
+ ...tokenReadContext(token),
348
+ ...context.workflowContext,
349
+ ...activityOutputs
350
+ };
351
+ Object.assign(
352
+ activityOutputs,
353
+ buildSetVariableContextPatch(assignmentBase, result.output.assignments)
354
+ );
355
+ } else {
356
+ const key = result.activityName || result.activityType;
357
+ activityOutputs[key] = result.output;
358
+ }
278
359
  }
279
360
  });
280
361
  }
@@ -335,11 +416,37 @@ async function executeTransitionForToken(em, container, token, fromStepId, toSte
335
416
  );
336
417
  await em.flush();
337
418
  if (stepExecutionResult.status === "FAILED") {
338
- return {
339
- success: false,
340
- error: stepExecutionResult.error || "Step execution failed"
341
- };
419
+ const definitionForFailure = await findDefinitionForInstance(em, instance);
420
+ const failureHandling = resolveStepFailureHandling(definitionForFailure?.definition, toStepId);
421
+ if (failureHandling.kind === "continue") {
422
+ await logTransitionEvent(em, {
423
+ workflowInstanceId: instance.id,
424
+ branchInstanceId,
425
+ eventType: "ERROR_DIRECTIVE_APPLIED",
426
+ eventData: {
427
+ stepId: toStepId,
428
+ directive: "continueWithFallback",
429
+ transitionId: transition.transitionId || `${fromStepId}->${toStepId}`,
430
+ error: stepExecutionResult.error,
431
+ hasFallbackValue: failureHandling.fallbackValue !== void 0
432
+ },
433
+ userId: context.userId,
434
+ tenantId: instance.tenantId,
435
+ organizationId: instance.organizationId
436
+ });
437
+ if (failureHandling.fallbackValue !== void 0) {
438
+ mergeTokenContext(token, { [toStepId]: failureHandling.fallbackValue });
439
+ await em.flush();
440
+ }
441
+ } else {
442
+ return {
443
+ success: false,
444
+ error: stepExecutionResult.error || "Step execution failed",
445
+ ...buildFailureRouting(failureHandling, toStepId)
446
+ };
447
+ }
342
448
  }
449
+ const stepPaused = stepExecutionResult.status === "WAITING" && stepExecutionResult.waitReason !== "FORK";
343
450
  const postConditionsResult = await evaluatePostConditions(
344
451
  em,
345
452
  instance,
@@ -385,6 +492,7 @@ async function executeTransitionForToken(em, container, token, fromStepId, toSte
385
492
  return {
386
493
  success: true,
387
494
  nextStepId: toStepId,
495
+ paused: stepPaused,
388
496
  conditionsEvaluated: {
389
497
  preConditions: true,
390
498
  postConditions: postConditionsResult.allowed
@@ -463,6 +571,7 @@ async function evaluatePreConditions(em, instance, transition, context, eventBus
463
571
  totalExecutionTime: 0
464
572
  };
465
573
  }
574
+ const dryRun = isDryRunInstance(instance);
466
575
  const startTime = Date.now();
467
576
  const executedRules = [];
468
577
  const errors = [];
@@ -488,8 +597,17 @@ async function evaluatePreConditions(em, instance, transition, context, eventBus
488
597
  executedBy: context.userId,
489
598
  entityType: `workflow:${definition.workflowId}:transition`,
490
599
  entityId: transition.transitionId || `${transition.fromStepId}->${transition.toStepId}`,
491
- eventType: "pre_transition"
600
+ eventType: "pre_transition",
601
+ // Dry run (spec section 8.2): the rule engine's own `dryRun` only
602
+ // suppresses its execution LOG — a rule's success/failure ACTIONS run
603
+ // regardless — so a side-effect-free run has to ask for `skipActions`.
604
+ // The conditions still evaluate, so the run takes the routes it really
605
+ // would; only the ACTION arm is withheld, and it is reported.
606
+ skipActions: dryRun
492
607
  });
608
+ if (dryRun && result.actionsExecuted === null) {
609
+ await logSuppressedRuleActions(em, instance, condition.ruleId, "pre_transition");
610
+ }
493
611
  const ruleResult = {
494
612
  rule: {
495
613
  ruleId: result.ruleId,
@@ -551,6 +669,7 @@ async function evaluatePostConditions(em, instance, transition, context, eventBu
551
669
  totalExecutionTime: 0
552
670
  };
553
671
  }
672
+ const dryRun = isDryRunInstance(instance);
554
673
  const startTime = Date.now();
555
674
  const executedRules = [];
556
675
  const errors = [];
@@ -576,8 +695,17 @@ async function evaluatePostConditions(em, instance, transition, context, eventBu
576
695
  executedBy: context.userId,
577
696
  entityType: `workflow:${definition.workflowId}:transition`,
578
697
  entityId: transition.transitionId || `${transition.fromStepId}->${transition.toStepId}`,
579
- eventType: "post_transition"
698
+ eventType: "post_transition",
699
+ // Dry run (spec section 8.2): the rule engine's own `dryRun` only
700
+ // suppresses its execution LOG — a rule's success/failure ACTIONS run
701
+ // regardless — so a side-effect-free run has to ask for `skipActions`.
702
+ // The conditions still evaluate, so the run takes the routes it really
703
+ // would; only the ACTION arm is withheld, and it is reported.
704
+ skipActions: dryRun
580
705
  });
706
+ if (dryRun && result.actionsExecuted === null) {
707
+ await logSuppressedRuleActions(em, instance, condition.ruleId, "post_transition");
708
+ }
581
709
  const ruleResult = {
582
710
  rule: {
583
711
  ruleId: result.ruleId,