@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
@@ -11,16 +11,48 @@
11
11
  */
12
12
 
13
13
  import { EntityManager, LockMode } from '@mikro-orm/core'
14
+ import type { EntityManager as PostgreSqlEntityManager } from '@mikro-orm/postgresql'
14
15
  import type { AwilixContainer } from 'awilix'
16
+ import { findOneWithDecryption } from '@open-mercato/shared/lib/encryption/find'
15
17
  import {
16
18
  WorkflowDefinition,
17
19
  WorkflowInstance,
18
20
  WorkflowEvent,
19
21
  type WorkflowInstanceStatus,
22
+ type WorkflowInstanceErrorHandlerMetadata,
20
23
  } from '../data/entities'
21
24
  import { compensateWorkflow } from './compensation-handler'
25
+ import { WORKFLOW_ENGINE_VERSION, isEngineVersionSupported } from './engine-version'
26
+ import {
27
+ WORKFLOW_ERROR_CONTEXT_KEY,
28
+ buildErrorContextEntry,
29
+ } from './error-routing'
30
+ import { excludeNonNormalTransitions } from './route-kinds'
31
+ import {
32
+ WORKFLOW_AGENT_OUTCOME_CONTEXT_KEY,
33
+ readAgentOutcomeMarker,
34
+ resolveAgentOutcomeHandling,
35
+ type OutcomeRoutingDefinitionLike,
36
+ type WorkflowAgentOutcomeContextEntry,
37
+ } from './outcome-routing'
38
+ import { scheduleWorkflowErrorHandler } from './error-handler'
39
+ import { resolveRunOutcome } from './run-outcome'
40
+ import { collectRunOutcomeEvidence } from './run-outcome-evidence'
22
41
  import { findWorkflowDefinition, findDefinitionForInstance } from './find-definition'
42
+ import { resolveWorkflowDefinitionExecutionUserId } from './definition-grant'
23
43
  import { createLogger } from '@open-mercato/shared/lib/logger'
44
+ import { emitWorkflowsEvent } from '../events'
45
+ import { DRY_RUN_EVENT_TYPES } from './dry-run'
46
+ import {
47
+ STEP_THROUGH_EVENT_TYPE,
48
+ consumeStepThroughRelease,
49
+ isStepThroughArmed,
50
+ shouldPauseForStepThrough,
51
+ } from './step-through'
52
+ import type {
53
+ WorkflowActivityJob,
54
+ WorkflowActivityJobResumeSubWorkflowParent,
55
+ } from './activity-queue-types'
24
56
 
25
57
  const logger = createLogger('workflows')
26
58
 
@@ -38,13 +70,33 @@ export interface StartWorkflowOptions {
38
70
  entityId?: string
39
71
  initiatedBy?: string
40
72
  labels?: Record<string, string>
73
+ // Set by the workflow-level error handler when it starts a handler run, so
74
+ // the depth guard travels with the child instance (spec 5.9).
75
+ errorHandler?: WorkflowInstanceErrorHandlerMetadata | null
41
76
  }
77
+ /**
78
+ * Run this instance as a side-effect-free simulation (spec section 8.2).
79
+ *
80
+ * It is durable state on the row rather than a per-call argument because a
81
+ * run outlives the call that started it: it parks on a signal, resumes from a
82
+ * worker, is advanced by a task completion. Anything that only lived on this
83
+ * options object would stop protecting the run the moment it suspended.
84
+ */
85
+ isDryRun?: boolean
42
86
  tenantId: string
43
87
  organizationId: string
44
88
  }
45
89
 
46
90
  export interface ExecutionContext {
47
91
  userId?: string
92
+ /**
93
+ * @deprecated Never read, and never was. Dry-run state lives on
94
+ * `WorkflowInstance.isDryRun` (spec section 8.2) because a per-execution flag
95
+ * cannot survive the instance parking on a signal and resuming inside a
96
+ * worker — which is exactly when a leak would happen. Kept as an inert field
97
+ * for one minor per `BACKWARD_COMPATIBILITY.md`; pass `isDryRun` to
98
+ * `startWorkflow` instead.
99
+ */
48
100
  dryRun?: boolean
49
101
  timeout?: number
50
102
  }
@@ -82,6 +134,30 @@ function resolveWorkflowExecutionUserId(
82
134
  )
83
135
  }
84
136
 
137
+ /**
138
+ * The identity this run advances under.
139
+ *
140
+ * A definition declaring `grantedFeatures` ALWAYS acts as its own least-
141
+ * privilege principal, so a run started by an admin cannot silently gain the
142
+ * admin's powers and an event-triggered run (which has no actor at all) gets a
143
+ * real one. Everything else keeps the historic borrow-the-starting-user
144
+ * behaviour, byte-for-byte.
145
+ */
146
+ async function resolveRunActorUserId(
147
+ em: EntityManager,
148
+ definition: WorkflowDefinition,
149
+ context: ExecutionContext | undefined,
150
+ instance: WorkflowInstance,
151
+ ): Promise<string | undefined> {
152
+ const fallback = resolveWorkflowExecutionUserId(context, instance)
153
+ const actor = await resolveWorkflowDefinitionExecutionUserId(
154
+ em as unknown as PostgreSqlEntityManager,
155
+ definition,
156
+ fallback,
157
+ )
158
+ return actor ?? undefined
159
+ }
160
+
85
161
  export class WorkflowExecutionError extends Error {
86
162
  constructor(
87
163
  message: string,
@@ -115,6 +191,7 @@ export async function startWorkflow(
115
191
  initialContext = {},
116
192
  correlationKey,
117
193
  metadata,
194
+ isDryRun = false,
118
195
  tenantId,
119
196
  organizationId,
120
197
  } = options
@@ -143,6 +220,18 @@ export async function startWorkflow(
143
220
  )
144
221
  }
145
222
 
223
+ // Forward-compatibility guard: a definition authored against a newer engine
224
+ // is refused outright rather than executed with unknown step types treated
225
+ // as no-ops (spec section 5.8).
226
+ const minEngineVersion = definition.metadata?.minEngineVersion
227
+ if (!isEngineVersionSupported(minEngineVersion)) {
228
+ throw new WorkflowExecutionError(
229
+ `Workflow definition requires engine version ${minEngineVersion}, this engine is version ${WORKFLOW_ENGINE_VERSION}`,
230
+ 'ENGINE_VERSION_TOO_OLD',
231
+ { workflowId, version: definition.version, minEngineVersion, engineVersion: WORKFLOW_ENGINE_VERSION }
232
+ )
233
+ }
234
+
146
235
  // Validate definition has required steps
147
236
  const { steps, transitions } = definition.definition
148
237
  if (!steps || steps.length < 2) {
@@ -209,6 +298,7 @@ export async function startWorkflow(
209
298
  metadata,
210
299
  startedAt: now,
211
300
  retryCount: 0,
301
+ isDryRun,
212
302
  tenantId,
213
303
  organizationId,
214
304
  createdAt: now,
@@ -233,6 +323,20 @@ export async function startWorkflow(
233
323
  organizationId,
234
324
  })
235
325
 
326
+ if (isDryRun) {
327
+ await logWorkflowEvent(em, {
328
+ workflowInstanceId: instance.id,
329
+ eventType: DRY_RUN_EVENT_TYPES.started,
330
+ eventData: { workflowId: instance.workflowId, version: instance.version },
331
+ userId: metadata?.initiatedBy,
332
+ tenantId,
333
+ organizationId,
334
+ })
335
+ }
336
+
337
+ await emitInstanceLifecycleEvent(instance, 'workflows.instance.created')
338
+ await emitInstanceLifecycleEvent(instance, 'workflows.instance.started')
339
+
236
340
  return instance
237
341
  }
238
342
 
@@ -308,7 +412,7 @@ export async function executeWorkflow(
308
412
 
309
413
  const maxIterations = 100
310
414
  let iterations = 0
311
- const executionUserId = resolveWorkflowExecutionUserId(context, instance)
415
+ const executionUserId = await resolveRunActorUserId(trx, definition, context, instance)
312
416
 
313
417
  while (iterations < maxIterations) {
314
418
  iterations++
@@ -359,10 +463,64 @@ export async function executeWorkflow(
359
463
  }
360
464
  }
361
465
 
466
+ // Defense in depth: a prior step parked the instance (e.g. an
467
+ // INVOKE_AGENT AUTOMATED step set PAUSED, or a transition set
468
+ // WAITING_FOR_ACTIVITIES). Every resume path (sendSignal,
469
+ // resumeWorkflowAfterActivities) flips status back to RUNNING before
470
+ // re-entering, so a PAUSED/WAITING_FOR_ACTIVITIES status here means an
471
+ // external completion is still pending — stop advancing.
472
+ if (currentInstance.status === 'PAUSED' || currentInstance.status === 'WAITING_FOR_ACTIVITIES') {
473
+ return {
474
+ status: 'RUNNING',
475
+ currentStep: currentInstance.currentStepId,
476
+ context: currentInstance.context,
477
+ events,
478
+ executionTime: Date.now() - startTime,
479
+ }
480
+ }
481
+
362
482
  const currentStep = definition.definition.steps.find(
363
483
  (s: any) => s.stepId === currentInstance.currentStepId
364
484
  )
365
485
 
486
+ // Step-through (spec section 8.2). An instance-level PAUSED between
487
+ // steps — no new instance status and no new step status, so the state
488
+ // machines are untouched. The marker is a RELEASE TOKEN for exactly one
489
+ // step id, so replaying this loop after a crash cannot run a step the
490
+ // author never released, and a double Continue cannot run two.
491
+ if (
492
+ shouldPauseForStepThrough(
493
+ currentInstance,
494
+ currentInstance.currentStepId,
495
+ currentStep?.stepType
496
+ )
497
+ ) {
498
+ await pauseForStepThrough(trx, currentInstance)
499
+ events.push({
500
+ eventType: STEP_THROUGH_EVENT_TYPE,
501
+ occurredAt: new Date(),
502
+ data: { stepId: currentInstance.currentStepId },
503
+ })
504
+ return {
505
+ status: 'RUNNING',
506
+ currentStep: currentInstance.currentStepId,
507
+ context: currentInstance.context,
508
+ events,
509
+ executionTime: Date.now() - startTime,
510
+ }
511
+ }
512
+
513
+ if (isStepThroughArmed(currentInstance)) {
514
+ // The released step is about to run: burn the token now so the cursor
515
+ // landing on the NEXT step pauses, whatever route it takes.
516
+ currentInstance.metadata = {
517
+ ...(currentInstance.metadata || {}),
518
+ stepThrough: consumeStepThroughRelease(),
519
+ }
520
+ currentInstance.updatedAt = new Date()
521
+ await trx.flush()
522
+ }
523
+
366
524
  if (currentStep?.stepType === 'END') {
367
525
  await completeWorkflow(trx, container, instanceId, 'COMPLETED')
368
526
  events.push({
@@ -393,7 +551,67 @@ export async function executeWorkflow(
393
551
  }
394
552
  }
395
553
 
396
- const transitions = definition.definition.transitions.filter(
554
+ // Outcome routing (spec 7.2). An agent step that resolved a disposition
555
+ // leaves an engine-owned marker; a wired outcome route is followed
556
+ // declaratively instead of via a condition matching a context string.
557
+ // `default` — the marker's absence, or a step that wired no outcome at
558
+ // all — falls straight through to the normal routing below, which is the
559
+ // whole of the backward-compatibility guarantee.
560
+ const outcomeMarker = readAgentOutcomeMarker(
561
+ currentInstance.context,
562
+ currentInstance.currentStepId ?? '',
563
+ )
564
+ if (outcomeMarker) {
565
+ const dispatched = await dispatchAgentOutcome(
566
+ trx,
567
+ container,
568
+ currentInstance,
569
+ definition.definition,
570
+ outcomeMarker,
571
+ { workflowContext: currentInstance.context, userId: executionUserId },
572
+ )
573
+ if (dispatched.kind === 'routed') {
574
+ events.push({
575
+ eventType: 'OUTCOME_ROUTED',
576
+ occurredAt: new Date(),
577
+ data: {
578
+ stepId: outcomeMarker.stepId,
579
+ outcome: outcomeMarker.outcome,
580
+ toStepId: dispatched.toStepId,
581
+ transitionId: dispatched.transitionId,
582
+ },
583
+ })
584
+ continue
585
+ }
586
+ if (dispatched.kind === 'failed') {
587
+ errors.push(dispatched.error)
588
+ events.push({
589
+ eventType: 'OUTCOME_UNHANDLED',
590
+ occurredAt: new Date(),
591
+ data: { stepId: outcomeMarker.stepId, outcome: outcomeMarker.outcome },
592
+ })
593
+ await completeWorkflow(trx, container, instanceId, 'FAILED', { error: dispatched.error })
594
+ return {
595
+ status: 'FAILED',
596
+ currentStep: currentInstance.currentStepId,
597
+ context: currentInstance.context,
598
+ events,
599
+ errors,
600
+ executionTime: Date.now() - startTime,
601
+ }
602
+ }
603
+ if (dispatched.kind === 'parked') {
604
+ return {
605
+ status: 'RUNNING',
606
+ currentStep: currentInstance.currentStepId,
607
+ context: currentInstance.context,
608
+ events,
609
+ executionTime: Date.now() - startTime,
610
+ }
611
+ }
612
+ }
613
+
614
+ const transitions = excludeNonNormalTransitions(definition.definition.transitions).filter(
397
615
  (t: any) =>
398
616
  t.fromStepId === currentInstance.currentStepId &&
399
617
  t.trigger === 'auto'
@@ -445,11 +663,88 @@ export async function executeWorkflow(
445
663
  currentInstance,
446
664
  selectedTransition.fromStepId,
447
665
  selectedTransition.toStepId,
448
- evalContext
666
+ { ...evalContext, transitionId: selectedTransition.transitionId },
449
667
  )
450
668
 
451
669
  if (!transitionResult.success) {
452
670
  const rejectionMessage = transitionResult.error || 'Transition failed'
671
+
672
+ // Error routing (spec 5.9): a wired error route is followed instead
673
+ // of failing the instance; a failure-queue directive parks it. Both
674
+ // are absent unless the definition opts in, so the legacy failure
675
+ // path below is byte-identical for every existing definition.
676
+ if (transitionResult.errorRoute && transitionResult.failedStepId) {
677
+ const routed = await followErrorRoute(
678
+ trx,
679
+ container,
680
+ currentInstance,
681
+ transitionResult.failedStepId,
682
+ transitionResult.errorRoute,
683
+ rejectionMessage,
684
+ evalContext
685
+ )
686
+ if (routed) {
687
+ events.push({
688
+ eventType: 'ERROR_ROUTED',
689
+ occurredAt: new Date(),
690
+ data: {
691
+ failedStepId: transitionResult.failedStepId,
692
+ toStepId: transitionResult.errorRoute.toStepId,
693
+ transitionId: transitionResult.errorRoute.transitionId,
694
+ },
695
+ })
696
+ continue
697
+ }
698
+ errors.push(`Error route from ${transitionResult.failedStepId} could not be followed`)
699
+ }
700
+
701
+ if (transitionResult.errorHandlerStepId && transitionResult.failedStepId) {
702
+ const entered = await enterErrorHandlerStep(
703
+ trx,
704
+ container,
705
+ currentInstance,
706
+ transitionResult.failedStepId,
707
+ transitionResult.errorHandlerStepId,
708
+ rejectionMessage,
709
+ executionUserId
710
+ )
711
+ if (entered) {
712
+ events.push({
713
+ eventType: 'ERROR_HANDLER_STARTED',
714
+ occurredAt: new Date(),
715
+ data: {
716
+ failedStepId: transitionResult.failedStepId,
717
+ handlerStepId: transitionResult.errorHandlerStepId,
718
+ },
719
+ })
720
+ continue
721
+ }
722
+ errors.push(
723
+ `Error handler step ${transitionResult.errorHandlerStepId} could not be entered`
724
+ )
725
+ }
726
+
727
+ if (transitionResult.parkForAttention && transitionResult.failedStepId) {
728
+ await parkInstanceForAttention(
729
+ trx,
730
+ currentInstance,
731
+ transitionResult.failedStepId,
732
+ rejectionMessage
733
+ )
734
+ events.push({
735
+ eventType: 'ERROR_PARKED',
736
+ occurredAt: new Date(),
737
+ data: { failedStepId: transitionResult.failedStepId },
738
+ })
739
+ return {
740
+ status: 'RUNNING',
741
+ currentStep: currentInstance.currentStepId,
742
+ context: currentInstance.context,
743
+ events,
744
+ executionTime: Date.now() - startTime,
745
+ }
746
+ }
747
+
453
748
  logger.error('Transition rejected', {
454
749
  instanceId: currentInstance.id,
455
750
  workflowId: currentInstance.workflowId,
@@ -487,6 +782,13 @@ export async function executeWorkflow(
487
782
  },
488
783
  })
489
784
 
785
+ // Spec 2026-06-26: step/stage advances re-emit `started` with the
786
+ // destination stepId so projections can track stage transitions.
787
+ await emitInstanceLifecycleEvent(currentInstance, 'workflows.instance.started', {
788
+ stepId: selectedTransition.toStepId,
789
+ fromStepId: selectedTransition.fromStepId,
790
+ })
791
+
490
792
  if (transitionResult.pausedForActivities) {
491
793
  await logWorkflowEvent(trx, {
492
794
  workflowInstanceId: currentInstance.id,
@@ -519,6 +821,21 @@ export async function executeWorkflow(
519
821
  }
520
822
  }
521
823
 
824
+ // The transition succeeded but the destination step parked the
825
+ // instance (e.g. an INVOKE_AGENT AUTOMATED step enqueued an async
826
+ // agent job and set PAUSED). The token cursor has already advanced to
827
+ // that parked step, so currentInstance.currentStepId is the parked
828
+ // step. Stop advancing until an external signal resumes it.
829
+ if (transitionResult.paused) {
830
+ return {
831
+ status: 'RUNNING',
832
+ currentStep: currentInstance.currentStepId,
833
+ context: currentInstance.context,
834
+ events,
835
+ executionTime: Date.now() - startTime,
836
+ }
837
+ }
838
+
522
839
  await trx.flush()
523
840
  } catch (error) {
524
841
  const errorMessage = error instanceof Error ? error.message : String(error)
@@ -581,6 +898,7 @@ export async function executeWorkflow(
581
898
  instance.errorMessage = errorMessage
582
899
  instance.errorDetails = error instanceof WorkflowExecutionError ? error.details : undefined
583
900
  instance.updatedAt = new Date()
901
+ await writeRunOutcome(trx, instance, 'FAILED')
584
902
  await trx.flush()
585
903
 
586
904
  await logWorkflowEvent(trx, {
@@ -599,9 +917,476 @@ export async function executeWorkflow(
599
917
  }
600
918
  }
601
919
 
602
- return typeof transactionalEm.transactional === 'function'
603
- ? transactionalEm.transactional((trx) => runExecution(trx))
604
- : runExecution(em)
920
+ if (typeof transactionalEm.transactional !== 'function') {
921
+ return runExecution(em)
922
+ }
923
+
924
+ try {
925
+ return await transactionalEm.transactional((trx) => runExecution(trx))
926
+ } catch (error) {
927
+ // The throw has rolled back the execution transaction, discarding the
928
+ // in-transaction FAILED write (and every step/bookkeeping advance) — which
929
+ // would otherwise leave the instance silently stuck at RUNNING/start (#3632).
930
+ // The in-transaction FAILED write is also futile when the underlying error
931
+ // aborted the Postgres transaction (e.g. an effector issuing bad SQL): every
932
+ // subsequent write on that connection fails. Now that the transaction — and
933
+ // its PESSIMISTIC_WRITE lock on the instance row — has been released, durably
934
+ // persist FAILED on an independent fork so the failure is visible and
935
+ // retryable. Restores the #2593 "persist FAILED" guarantee even when the
936
+ // whole transaction is discarded. Best-effort: never masks the original error.
937
+ await persistFailedStatusAfterRollback(em, instanceId, error)
938
+ throw error
939
+ }
940
+ }
941
+
942
+ export type AgentOutcomeDispatch =
943
+ | { kind: 'routed'; toStepId: string; transitionId?: string; paused?: boolean }
944
+ | { kind: 'parked' }
945
+ | { kind: 'failed'; error: string }
946
+ | { kind: 'default' }
947
+
948
+ /**
949
+ * Dispatch a resolved agent disposition for whatever step the instance is
950
+ * currently on, or return null when there is no marker to act on.
951
+ *
952
+ * Exported because `sendSignal` advances a resumed instance ITSELF — it picks
953
+ * the next transition and executes it before handing back to the executor — so
954
+ * an outcome route wired on a parked agent step has to be honoured there too.
955
+ * Routing it in only one of the two places is how a disposition silently takes
956
+ * the happy path on the human-dispose path while working on the inline one.
957
+ */
958
+ export async function dispatchAgentOutcomeForCurrentStep(
959
+ em: EntityManager,
960
+ container: AwilixContainer,
961
+ instance: WorkflowInstance,
962
+ definition: OutcomeRoutingDefinitionLike,
963
+ evalContext: { workflowContext: Record<string, unknown>; userId?: string }
964
+ ): Promise<AgentOutcomeDispatch | null> {
965
+ const marker = readAgentOutcomeMarker(instance.context, instance.currentStepId ?? '')
966
+ if (!marker) return null
967
+ return await dispatchAgentOutcome(em, container, instance, definition, marker, evalContext)
968
+ }
969
+
970
+ /**
971
+ * Act on a resolved agent disposition (spec 7.2).
972
+ *
973
+ * The engine-owned marker is consumed here — cleared before anything else runs —
974
+ * so a route that loops back through the same step cannot re-fire on the old
975
+ * disposition, and so a `default` outcome leaves no residue in the run context.
976
+ *
977
+ * `default` means "route exactly as this instance always would have": the step
978
+ * wired no outcome at all, or the outcome is `approved`, which §7.2 renders as
979
+ * the node's ordinary output. Only a step that opted into outcome routing can
980
+ * reach the inheritance branch, which is what keeps this additive.
981
+ */
982
+ async function dispatchAgentOutcome(
983
+ em: EntityManager,
984
+ container: AwilixContainer,
985
+ instance: WorkflowInstance,
986
+ definition: OutcomeRoutingDefinitionLike,
987
+ marker: WorkflowAgentOutcomeContextEntry,
988
+ evalContext: { workflowContext: Record<string, unknown>; userId?: string }
989
+ ): Promise<AgentOutcomeDispatch> {
990
+ const { [WORKFLOW_AGENT_OUTCOME_CONTEXT_KEY]: _consumed, ...remainingContext } =
991
+ (instance.context || {}) as Record<string, unknown>
992
+ instance.context = remainingContext
993
+ instance.updatedAt = new Date()
994
+ await em.flush()
995
+
996
+ const clearedEvalContext = {
997
+ ...evalContext,
998
+ workflowContext: remainingContext,
999
+ }
1000
+
1001
+ const failUnhandled = async (error: string): Promise<AgentOutcomeDispatch> => {
1002
+ await logWorkflowEvent(em, {
1003
+ workflowInstanceId: instance.id,
1004
+ eventType: 'OUTCOME_UNHANDLED',
1005
+ eventData: { stepId: marker.stepId, outcome: marker.outcome, error },
1006
+ tenantId: instance.tenantId,
1007
+ organizationId: instance.organizationId,
1008
+ })
1009
+ return { kind: 'failed', error }
1010
+ }
1011
+
1012
+ const handling = resolveAgentOutcomeHandling(definition, marker.stepId, marker.outcome)
1013
+ if (handling.kind === 'default') return { kind: 'default' }
1014
+
1015
+ if (handling.kind === 'route') {
1016
+ const toStepId = handling.transition.toStepId
1017
+ if (!toStepId) return { kind: 'default' }
1018
+
1019
+ await logWorkflowEvent(em, {
1020
+ workflowInstanceId: instance.id,
1021
+ eventType: 'OUTCOME_ROUTED',
1022
+ eventData: {
1023
+ stepId: marker.stepId,
1024
+ outcome: marker.outcome,
1025
+ toStepId,
1026
+ transitionId: handling.transition.transitionId,
1027
+ proposalId: marker.proposalId,
1028
+ },
1029
+ tenantId: instance.tenantId,
1030
+ organizationId: instance.organizationId,
1031
+ })
1032
+
1033
+ const transitionHandler = await import('./transition-handler')
1034
+ const routed = await transitionHandler.executeTransition(
1035
+ em,
1036
+ container,
1037
+ instance,
1038
+ marker.stepId,
1039
+ toStepId,
1040
+ { ...clearedEvalContext, transitionId: handling.transition.transitionId },
1041
+ )
1042
+ if (routed.success) {
1043
+ return {
1044
+ kind: 'routed',
1045
+ toStepId,
1046
+ transitionId: handling.transition.transitionId,
1047
+ paused: routed.paused,
1048
+ }
1049
+ }
1050
+ return await failUnhandled(`Outcome route for "${marker.outcome}" could not be followed`)
1051
+ }
1052
+
1053
+ // `inherit`: an unwired non-approved outcome follows the complete step-error
1054
+ // handling contract, including continuation, failure-queue parking and the
1055
+ // definition-level handler step.
1056
+ const unhandled = `Agent step ${marker.stepId} resolved outcome "${marker.outcome}", which is not wired`
1057
+ if (handling.handling.kind === 'route') {
1058
+ const errorRoute = handling.handling.transition
1059
+ if (errorRoute.toStepId) {
1060
+ const routed = await followErrorRoute(
1061
+ em,
1062
+ container,
1063
+ instance,
1064
+ marker.stepId,
1065
+ { transitionId: errorRoute.transitionId, toStepId: errorRoute.toStepId },
1066
+ unhandled,
1067
+ clearedEvalContext
1068
+ )
1069
+ if (routed) {
1070
+ return {
1071
+ kind: 'routed',
1072
+ toStepId: errorRoute.toStepId,
1073
+ transitionId: errorRoute.transitionId,
1074
+ paused: instance.status === 'PAUSED',
1075
+ }
1076
+ }
1077
+ }
1078
+ }
1079
+
1080
+ if (handling.handling.kind === 'continue') {
1081
+ await logWorkflowEvent(em, {
1082
+ workflowInstanceId: instance.id,
1083
+ eventType: 'ERROR_DIRECTIVE_APPLIED',
1084
+ eventData: {
1085
+ stepId: marker.stepId,
1086
+ directive: 'continueWithFallback',
1087
+ source: 'agentOutcome',
1088
+ hasFallbackValue: handling.handling.fallbackValue !== undefined,
1089
+ },
1090
+ tenantId: instance.tenantId,
1091
+ organizationId: instance.organizationId,
1092
+ })
1093
+ if (handling.handling.fallbackValue !== undefined) {
1094
+ instance.context = {
1095
+ ...(instance.context || {}),
1096
+ [marker.stepId]: handling.handling.fallbackValue,
1097
+ }
1098
+ instance.updatedAt = new Date()
1099
+ await em.flush()
1100
+ }
1101
+ return { kind: 'default' }
1102
+ }
1103
+
1104
+ if (handling.handling.kind === 'park') {
1105
+ await parkInstanceForAttention(em, instance, marker.stepId, unhandled)
1106
+ return { kind: 'parked' }
1107
+ }
1108
+
1109
+ if (handling.handling.kind === 'handlerStep') {
1110
+ const entered = await enterErrorHandlerStep(
1111
+ em,
1112
+ container,
1113
+ instance,
1114
+ marker.stepId,
1115
+ handling.handling.stepId,
1116
+ unhandled,
1117
+ clearedEvalContext.userId,
1118
+ )
1119
+ if (entered) {
1120
+ return {
1121
+ kind: 'routed',
1122
+ toStepId: handling.handling.stepId,
1123
+ paused: instance.status === 'PAUSED',
1124
+ }
1125
+ }
1126
+ }
1127
+
1128
+ return await failUnhandled(unhandled)
1129
+ }
1130
+
1131
+ /**
1132
+ * Follow a wired error route out of a failed step (spec 5.9). The failure is
1133
+ * published into the run context under `__error` so the handling branch can act
1134
+ * on it, then the error transition executes through the normal machinery — it
1135
+ * creates its step instance, runs its activities and logs its events like any
1136
+ * other route. Returns false when the route could not be taken, so the caller
1137
+ * falls back to the untouched failure path.
1138
+ */
1139
+ async function followErrorRoute(
1140
+ em: EntityManager,
1141
+ container: AwilixContainer,
1142
+ instance: WorkflowInstance,
1143
+ failedStepId: string,
1144
+ errorRoute: { transitionId?: string; toStepId: string },
1145
+ error: string,
1146
+ evalContext: { workflowContext: Record<string, any>; userId?: string }
1147
+ ): Promise<boolean> {
1148
+ await logWorkflowEvent(em, {
1149
+ workflowInstanceId: instance.id,
1150
+ eventType: 'ERROR_ROUTED',
1151
+ eventData: {
1152
+ failedStepId,
1153
+ toStepId: errorRoute.toStepId,
1154
+ transitionId: errorRoute.transitionId,
1155
+ error,
1156
+ },
1157
+ tenantId: instance.tenantId,
1158
+ organizationId: instance.organizationId,
1159
+ })
1160
+
1161
+ const errorEntry = buildErrorContextEntry(failedStepId, error)
1162
+ instance.context = {
1163
+ ...(instance.context || {}),
1164
+ [WORKFLOW_ERROR_CONTEXT_KEY]: errorEntry,
1165
+ }
1166
+ instance.updatedAt = new Date()
1167
+ await em.flush()
1168
+
1169
+ const transitionHandler = await import('./transition-handler')
1170
+ const routedResult = await transitionHandler.executeTransition(
1171
+ em,
1172
+ container,
1173
+ instance,
1174
+ failedStepId,
1175
+ errorRoute.toStepId,
1176
+ {
1177
+ ...evalContext,
1178
+ workflowContext: {
1179
+ ...evalContext.workflowContext,
1180
+ [WORKFLOW_ERROR_CONTEXT_KEY]: errorEntry,
1181
+ },
1182
+ transitionId: errorRoute.transitionId,
1183
+ },
1184
+ )
1185
+
1186
+ return routedResult.success === true
1187
+ }
1188
+
1189
+ /**
1190
+ * Enter the definition-level handler STEP (spec 5.9, `errorHandler.stepId`) for
1191
+ * a failure no route and no directive handled. The token jumps to the handler
1192
+ * step and executes it — the same cursor-move-plus-`executeStep` shape the
1193
+ * branch/timer/signal resumes already use, so no transition record is invented.
1194
+ * A failure of the handler step itself resolves to `fail` (the resolver never
1195
+ * jumps a step to itself), which is this form's recursion guard.
1196
+ */
1197
+ async function enterErrorHandlerStep(
1198
+ em: EntityManager,
1199
+ container: AwilixContainer,
1200
+ instance: WorkflowInstance,
1201
+ failedStepId: string,
1202
+ handlerStepId: string,
1203
+ error: string,
1204
+ userId?: string
1205
+ ): Promise<boolean> {
1206
+ const errorEntry = buildErrorContextEntry(failedStepId, error)
1207
+
1208
+ await logWorkflowEvent(em, {
1209
+ workflowInstanceId: instance.id,
1210
+ eventType: 'ERROR_HANDLER_STARTED',
1211
+ eventData: { failedStepId, handlerStepId, error },
1212
+ tenantId: instance.tenantId,
1213
+ organizationId: instance.organizationId,
1214
+ })
1215
+
1216
+ instance.context = {
1217
+ ...(instance.context || {}),
1218
+ [WORKFLOW_ERROR_CONTEXT_KEY]: errorEntry,
1219
+ }
1220
+ instance.currentStepId = handlerStepId
1221
+ instance.updatedAt = new Date()
1222
+ await em.flush()
1223
+
1224
+ const { executeStep } = await import('./step-handler')
1225
+ const result = await executeStep(
1226
+ em,
1227
+ instance,
1228
+ handlerStepId,
1229
+ {
1230
+ workflowContext: {
1231
+ ...(instance.context || {}),
1232
+ [WORKFLOW_ERROR_CONTEXT_KEY]: errorEntry,
1233
+ },
1234
+ userId,
1235
+ },
1236
+ container
1237
+ )
1238
+
1239
+ return result.status !== 'FAILED'
1240
+ }
1241
+
1242
+ /**
1243
+ * Park a step-through run before the step the author has not released yet.
1244
+ *
1245
+ * Reuses PAUSED exactly as the failure queue does, and deliberately writes NO
1246
+ * `attention` marker: the run is waiting for the author, not for triage, so it
1247
+ * must not appear in the failure queue.
1248
+ */
1249
+ async function pauseForStepThrough(
1250
+ em: EntityManager,
1251
+ instance: WorkflowInstance
1252
+ ): Promise<void> {
1253
+ const now = new Date()
1254
+ instance.status = 'PAUSED'
1255
+ instance.pausedAt = now
1256
+ instance.updatedAt = now
1257
+ await em.flush()
1258
+
1259
+ await logWorkflowEvent(em, {
1260
+ workflowInstanceId: instance.id,
1261
+ eventType: STEP_THROUGH_EVENT_TYPE,
1262
+ eventData: { stepId: instance.currentStepId },
1263
+ tenantId: instance.tenantId,
1264
+ organizationId: instance.organizationId,
1265
+ })
1266
+ }
1267
+
1268
+ /**
1269
+ * Park an instance for triage instead of failing it — the `failureQueue` error
1270
+ * directive (spec 5.9 "Send to failure queue"). Uses the existing PAUSED state
1271
+ * plus an engine-owned `metadata.attention` marker; no new instance status and
1272
+ * no compensation, because the run is suspended rather than terminated.
1273
+ */
1274
+ async function parkInstanceForAttention(
1275
+ em: EntityManager,
1276
+ instance: WorkflowInstance,
1277
+ failedStepId: string,
1278
+ error: string
1279
+ ): Promise<void> {
1280
+ const now = new Date()
1281
+ instance.status = 'PAUSED'
1282
+ instance.pausedAt = now
1283
+ instance.errorMessage = error
1284
+ instance.metadata = {
1285
+ ...(instance.metadata || {}),
1286
+ attention: {
1287
+ reason: 'ERROR_DIRECTIVE',
1288
+ stepId: failedStepId,
1289
+ error,
1290
+ at: now.toISOString(),
1291
+ },
1292
+ }
1293
+ instance.updatedAt = now
1294
+ await em.flush()
1295
+
1296
+ await logWorkflowEvent(em, {
1297
+ workflowInstanceId: instance.id,
1298
+ eventType: 'ERROR_PARKED',
1299
+ eventData: { failedStepId, error, directive: 'failureQueue' },
1300
+ tenantId: instance.tenantId,
1301
+ organizationId: instance.organizationId,
1302
+ })
1303
+ }
1304
+
1305
+ /**
1306
+ * Durably mark a workflow instance FAILED after its execution transaction has
1307
+ * rolled back. MUST run on a fresh fork (a clean connection): the rolled-back
1308
+ * transaction may be aborted/poisoned, and its PESSIMISTIC_WRITE lock on the
1309
+ * instance row is released only once the transactional callback unwinds, so an
1310
+ * in-transaction write here would be discarded or deadlock. Only transitions a
1311
+ * still-`RUNNING` instance (leaves CANCELLED/COMPLETED/PAUSED untouched).
1312
+ */
1313
+ async function persistFailedStatusAfterRollback(
1314
+ em: EntityManager,
1315
+ instanceId: string,
1316
+ error: unknown,
1317
+ ): Promise<void> {
1318
+ const errorMessage = error instanceof Error ? error.message : String(error)
1319
+ const errorDetails = error instanceof WorkflowExecutionError ? error.details : undefined
1320
+ const markFailed = async (trx: EntityManager): Promise<void> => {
1321
+ const instance = await trx.findOne(
1322
+ WorkflowInstance,
1323
+ { id: instanceId },
1324
+ { lockMode: LockMode.PESSIMISTIC_WRITE },
1325
+ )
1326
+ if (!instance || instance.status !== 'RUNNING') return
1327
+ instance.status = 'FAILED'
1328
+ instance.errorMessage = errorMessage
1329
+ instance.errorDetails = errorDetails
1330
+ instance.updatedAt = new Date()
1331
+ await writeRunOutcome(trx, instance, 'FAILED')
1332
+ await trx.flush()
1333
+ await logWorkflowEvent(trx, {
1334
+ workflowInstanceId: instanceId,
1335
+ eventType: 'WORKFLOW_FAILED',
1336
+ eventData: { error: errorMessage },
1337
+ tenantId: instance.tenantId,
1338
+ organizationId: instance.organizationId,
1339
+ })
1340
+ await emitInstanceLifecycleEvent(instance, 'workflows.instance.failed')
1341
+ }
1342
+ try {
1343
+ if (typeof (em as { fork?: unknown }).fork !== 'function') return
1344
+ const fork = em.fork() as EntityManager & {
1345
+ transactional?: <TResult>(callback: (trx: EntityManager) => Promise<TResult>) => Promise<TResult>
1346
+ }
1347
+ if (typeof fork.transactional === 'function') {
1348
+ await fork.transactional((trx) => markFailed(trx))
1349
+ } else {
1350
+ await markFailed(fork)
1351
+ }
1352
+ } catch (persistError) {
1353
+ logger.error('failed to durably persist FAILED status after rollback', {
1354
+ instanceId,
1355
+ error: persistError instanceof Error ? persistError.message : String(persistError),
1356
+ })
1357
+ }
1358
+ }
1359
+
1360
+ /**
1361
+ * Write the run's terminal VERDICT onto the instance, and guarantee it has a
1362
+ * terminal timestamp.
1363
+ *
1364
+ * The ONE write site, so `outcome` cannot be assembled ad hoc per exit point:
1365
+ * every caller hands over the terminal status and the pure
1366
+ * `resolveRunOutcome` decides from the evidence the run recorded. Called before
1367
+ * the flush that persists the terminal status, so status and verdict land in the
1368
+ * same UPDATE and no reader can observe one without the other.
1369
+ *
1370
+ * The timestamp backstop closes a real gap. `compensation-handler` flips the
1371
+ * status to COMPENSATED (or back to FAILED on a partial compensation) and
1372
+ * `completeWorkflow` RETURNS before its own `completedAt` assignment on that
1373
+ * path, so a compensated run had no terminal instant at all — it could be
1374
+ * attributed to no KPI window and its duration was unmeasurable. Every other
1375
+ * path already assigns one, so this only ever fills a hole; it never moves an
1376
+ * instant that was already recorded, and CANCELLED is excluded because
1377
+ * `cancelledAt` is its terminal instant.
1378
+ */
1379
+ async function writeRunOutcome(
1380
+ em: EntityManager,
1381
+ instance: WorkflowInstance,
1382
+ terminalStatus: string,
1383
+ ): Promise<void> {
1384
+ const evidence = await collectRunOutcomeEvidence(em, instance, terminalStatus)
1385
+ instance.outcome = resolveRunOutcome(evidence)
1386
+
1387
+ if (terminalStatus !== 'CANCELLED' && !instance.completedAt) {
1388
+ instance.completedAt = new Date()
1389
+ }
605
1390
  }
606
1391
 
607
1392
  /**
@@ -629,6 +1414,19 @@ export async function completeWorkflow(
629
1414
  )
630
1415
  }
631
1416
 
1417
+ // Workflow-level error handler (spec 5.9) — scheduled BEFORE compensation so
1418
+ // the handler observes the state that failed rather than the rolled-back one,
1419
+ // and so it still runs when compensation throws (that block swallows errors
1420
+ // and returns early). Executed out of band by the worker; the
1421
+ // ERROR_HANDLER_SCHEDULED event is written here, inside this transaction.
1422
+ if (status === 'FAILED') {
1423
+ await scheduleWorkflowErrorHandler(em, instance, {
1424
+ failedStepId: result?.failedStepId ?? instance.currentStepId,
1425
+ error: result?.error,
1426
+ details: result?.details,
1427
+ })
1428
+ }
1429
+
632
1430
  // Trigger compensation if workflow failed and has compensatable activities (Phase 8.2)
633
1431
  if (status === 'FAILED') {
634
1432
  const definition = await findDefinitionForInstance(em, instance)
@@ -660,7 +1458,21 @@ export async function completeWorkflow(
660
1458
  })
661
1459
 
662
1460
  // Note: instance status already updated by compensateWorkflow
663
- // It will be COMPENSATED or remain FAILED
1461
+ // It will be COMPENSATED or remain FAILED. This branch RETURNS, so the
1462
+ // verdict is written here rather than at the shared tail below — same
1463
+ // resolver, same evidence, one more call site than the ideal one.
1464
+ await writeRunOutcome(em, instance, instance.status)
1465
+ await em.flush()
1466
+
1467
+ // A compensated/failed child must still resume its parent SUB_WORKFLOW
1468
+ // step — otherwise a parent parked on this child stays PAUSED forever.
1469
+ // From the parent's perspective the sub-workflow did not succeed, so this
1470
+ // mirrors the normal-path enqueue below but always signals FAILED.
1471
+ await enqueueSubWorkflowParentResume(instance, 'FAILED')
1472
+ // Terminal signal for external projections: the run did not succeed,
1473
+ // regardless of whether compensation left it COMPENSATED or FAILED
1474
+ // (payload `status` carries the actual post-compensation status).
1475
+ await emitInstanceLifecycleEvent(instance, 'workflows.instance.failed')
664
1476
  return
665
1477
  } catch (error: any) {
666
1478
  logger.error('Compensation failed with exception', { err: error })
@@ -695,6 +1507,8 @@ export async function completeWorkflow(
695
1507
  break
696
1508
  }
697
1509
 
1510
+ await writeRunOutcome(em, instance, status)
1511
+
698
1512
  await em.flush()
699
1513
 
700
1514
  // Log completion event
@@ -712,6 +1526,69 @@ export async function completeWorkflow(
712
1526
  tenantId: instance.tenantId,
713
1527
  organizationId: instance.organizationId,
714
1528
  })
1529
+
1530
+ await emitInstanceLifecycleEvent(
1531
+ instance,
1532
+ status === 'COMPLETED'
1533
+ ? 'workflows.instance.completed'
1534
+ : status === 'FAILED'
1535
+ ? 'workflows.instance.failed'
1536
+ : 'workflows.instance.cancelled'
1537
+ )
1538
+
1539
+ // If this instance is a child of a parked SUB_WORKFLOW step, enqueue a job to
1540
+ // resume the parent on the worker's own connection (never inline inside the
1541
+ // child's transaction — lock-ordering hazard). The worker guard skips the job
1542
+ // when the parent never parked (fully-synchronous fast path).
1543
+ if (status === 'COMPLETED' || status === 'FAILED') {
1544
+ await enqueueSubWorkflowParentResume(instance, status)
1545
+ }
1546
+ }
1547
+
1548
+ /**
1549
+ * Enqueue a `resume_subworkflow_parent` job when a terminating instance carries a
1550
+ * parent linkage. Best-effort: a queue hiccup must not undo the just-persisted
1551
+ * terminal status, so failures are logged rather than thrown. The small delay
1552
+ * lets the parent's PAUSED flush become visible before the worker runs.
1553
+ */
1554
+ async function enqueueSubWorkflowParentResume(
1555
+ instance: WorkflowInstance,
1556
+ childStatus: 'COMPLETED' | 'FAILED'
1557
+ ): Promise<void> {
1558
+ const labels = instance.metadata?.labels
1559
+ const parentInstanceId = labels?.parentInstanceId
1560
+ const parentStepId = labels?.parentStepId
1561
+ const parentStepInstanceId = labels?.parentStepInstanceId
1562
+ if (!parentInstanceId || !parentStepId || !parentStepInstanceId) return
1563
+
1564
+ try {
1565
+ const { createModuleQueue } = await import('@open-mercato/queue')
1566
+ const { WORKFLOW_ACTIVITIES_QUEUE_NAME } = await import('./activity-queue-types')
1567
+ const { INVOKE_AGENT_ENQUEUE_DELAY_MS } = await import('./activity-executor')
1568
+
1569
+ const queue = createModuleQueue<WorkflowActivityJob>(WORKFLOW_ACTIVITIES_QUEUE_NAME, {
1570
+ concurrency: parseInt(process.env.WORKFLOW_WORKER_CONCURRENCY || '5'),
1571
+ })
1572
+
1573
+ const job: WorkflowActivityJobResumeSubWorkflowParent = {
1574
+ kind: 'resume_subworkflow_parent',
1575
+ workflowInstanceId: parentInstanceId,
1576
+ parentInstanceId,
1577
+ parentStepId,
1578
+ parentStepInstanceId,
1579
+ childInstanceId: instance.id,
1580
+ childStatus,
1581
+ tenantId: instance.tenantId,
1582
+ organizationId: instance.organizationId,
1583
+ }
1584
+ await queue.enqueue(job, { delayMs: INVOKE_AGENT_ENQUEUE_DELAY_MS })
1585
+ } catch (error) {
1586
+ logger.error('failed to enqueue parent-resume job', {
1587
+ childInstanceId: instance.id,
1588
+ parentInstanceId,
1589
+ error: error instanceof Error ? error.message : String(error),
1590
+ })
1591
+ }
715
1592
  }
716
1593
 
717
1594
  /**
@@ -794,6 +1671,7 @@ export async function resumeWorkflowAfterActivities(
794
1671
  jobId: e.eventData.jobId,
795
1672
  })),
796
1673
  }
1674
+ await writeRunOutcome(trx, instance, 'FAILED')
797
1675
  await trx.flush()
798
1676
 
799
1677
  await logWorkflowEvent(trx, {
@@ -894,6 +1772,11 @@ export async function resumeWorkflowAfterActivities(
894
1772
  organizationId: instance.organizationId,
895
1773
  })
896
1774
 
1775
+ // The async-resume path runs inside a worker, so it re-resolves the actor
1776
+ // from the definition exactly as the main loop does — otherwise a granted
1777
+ // workflow would revert to the starting user's identity the moment one of
1778
+ // its activities went async.
1779
+ const resumeDefinition = await findDefinitionForInstance(trx, instance)
897
1780
  const { executeStep } = await import('./step-handler')
898
1781
  await executeStep(
899
1782
  trx,
@@ -901,7 +1784,9 @@ export async function resumeWorkflowAfterActivities(
901
1784
  pendingTransition.toStepId,
902
1785
  {
903
1786
  workflowContext: instance.context || {},
904
- userId: resolveWorkflowExecutionUserId(undefined, instance),
1787
+ userId: resumeDefinition
1788
+ ? await resolveRunActorUserId(trx, resumeDefinition, undefined, instance)
1789
+ : resolveWorkflowExecutionUserId(undefined, instance),
905
1790
  },
906
1791
  container
907
1792
  )
@@ -950,7 +1835,12 @@ function checkIfCompensationNeeded(definition: WorkflowDefinition): boolean {
950
1835
  // ============================================================================
951
1836
 
952
1837
  /**
953
- * Get workflow instance by ID
1838
+ * Get workflow instance by ID.
1839
+ *
1840
+ * SECURITY: this helper is NOT tenant-scoped. It is an internal lookup whose
1841
+ * callers are expected to have resolved and enforced the scope already. Never
1842
+ * reach it directly from an HTTP handler — use a scoped query (see
1843
+ * `updateWorkflowContextScoped`) so a cross-tenant id cannot resolve.
954
1844
  *
955
1845
  * @param em - Entity manager
956
1846
  * @param instanceId - Workflow instance ID
@@ -979,7 +1869,12 @@ async function getWorkflowInstanceForExecution(
979
1869
  }
980
1870
 
981
1871
  /**
982
- * Update workflow context with new data
1872
+ * Update workflow context with new data.
1873
+ *
1874
+ * SECURITY: builds on the UNSCOPED {@link getWorkflowInstance} and therefore
1875
+ * performs no tenant/organization filtering of its own. It is preserved as-is
1876
+ * for backward compatibility (it is a DI-exposed surface). HTTP handlers MUST
1877
+ * use {@link updateWorkflowContextScoped} instead.
983
1878
  *
984
1879
  * @param em - Entity manager
985
1880
  * @param instanceId - Workflow instance ID
@@ -1008,8 +1903,139 @@ export async function updateWorkflowContext(
1008
1903
  await em.flush()
1009
1904
  }
1010
1905
 
1906
+ /**
1907
+ * Context keys the engine owns. A caller-supplied patch may never write them:
1908
+ * `__result` carries the terminal workflow result, `_pendingAsyncActivities`
1909
+ * tracks in-flight async activity jobs, and `__park` marks a parked agent step.
1910
+ * Overwriting any of them would corrupt a running instance, so they are
1911
+ * rejected rather than silently dropped.
1912
+ */
1913
+ export const RESERVED_WORKFLOW_CONTEXT_KEYS: readonly string[] = [
1914
+ '__result',
1915
+ '_pendingAsyncActivities',
1916
+ '__park',
1917
+ WORKFLOW_ERROR_CONTEXT_KEY,
1918
+ ]
1919
+
1920
+ export function findReservedContextKeys(updates: Record<string, unknown>): string[] {
1921
+ return Object.keys(updates).filter((key) => RESERVED_WORKFLOW_CONTEXT_KEYS.includes(key))
1922
+ }
1923
+
1924
+ export interface UpdateWorkflowContextScopedOptions {
1925
+ instanceId: string
1926
+ tenantId: string
1927
+ organizationId: string
1928
+ updates: Record<string, unknown>
1929
+ /**
1930
+ * Optional version check, awaited with the freshly loaded row's `updatedAt`
1931
+ * before the patch is applied. HTTP callers pass
1932
+ * `enforceCommandOptimisticLockWithGuards` here so a stale write 409s instead
1933
+ * of silently clobbering a concurrent context change.
1934
+ */
1935
+ assertVersion?: (current: Date | null | undefined) => void | Promise<void>
1936
+ }
1937
+
1938
+ /**
1939
+ * Tenant/organization-scoped sibling of {@link updateWorkflowContext}: the
1940
+ * scope is part of the lookup, so a cross-tenant instance id resolves to
1941
+ * nothing and the caller returns a 404 rather than reading or writing another
1942
+ * tenant's run. Shallow merge, consistent with the legacy helper.
1943
+ */
1944
+ export async function updateWorkflowContextScoped(
1945
+ em: EntityManager,
1946
+ options: UpdateWorkflowContextScopedOptions
1947
+ ): Promise<WorkflowInstance> {
1948
+ const { instanceId, tenantId, organizationId, updates, assertVersion } = options
1949
+
1950
+ const reserved = findReservedContextKeys(updates)
1951
+ if (reserved.length > 0) {
1952
+ throw new WorkflowExecutionError(
1953
+ `Reserved workflow context keys cannot be written: ${reserved.join(', ')}`,
1954
+ 'RESERVED_CONTEXT_KEY',
1955
+ { instanceId, reserved }
1956
+ )
1957
+ }
1958
+
1959
+ const instance = await findOneWithDecryption(
1960
+ em as PostgreSqlEntityManager,
1961
+ WorkflowInstance,
1962
+ { id: instanceId, tenantId, organizationId },
1963
+ undefined,
1964
+ { tenantId, organizationId }
1965
+ )
1966
+ if (!instance) {
1967
+ throw new WorkflowExecutionError(
1968
+ `Workflow instance not found: ${instanceId}`,
1969
+ 'INSTANCE_NOT_FOUND',
1970
+ { instanceId }
1971
+ )
1972
+ }
1973
+
1974
+ if (instance.status !== 'RUNNING' && instance.status !== 'PAUSED' && instance.status !== 'FORKED') {
1975
+ throw new WorkflowExecutionError(
1976
+ `Workflow instance is not accepting context updates: ${instance.status}`,
1977
+ 'INSTANCE_NOT_UPDATABLE',
1978
+ { instanceId, status: instance.status }
1979
+ )
1980
+ }
1981
+
1982
+ if (assertVersion) await assertVersion(instance.updatedAt)
1983
+
1984
+ instance.context = {
1985
+ ...instance.context,
1986
+ ...updates,
1987
+ }
1988
+ instance.updatedAt = new Date()
1989
+
1990
+ await em.flush()
1991
+
1992
+ return instance
1993
+ }
1994
+
1011
1995
  // findWorkflowDefinition is imported from ./find-definition
1012
1996
 
1997
+ type InstanceLifecycleEventId =
1998
+ | 'workflows.instance.created'
1999
+ | 'workflows.instance.started'
2000
+ | 'workflows.instance.completed'
2001
+ | 'workflows.instance.failed'
2002
+ | 'workflows.instance.cancelled'
2003
+
2004
+ /**
2005
+ * Publish a declared `workflows.instance.*` lifecycle event to the event bus,
2006
+ * alongside (never instead of) the internal `WorkflowEvent` audit row. Delivery
2007
+ * is at-least-once and consumers must be idempotent; a bus failure must never
2008
+ * break workflow execution, so this is strictly best-effort.
2009
+ */
2010
+ async function emitInstanceLifecycleEvent(
2011
+ instance: WorkflowInstance,
2012
+ eventId: InstanceLifecycleEventId,
2013
+ extra?: Record<string, unknown>
2014
+ ): Promise<void> {
2015
+ try {
2016
+ await emitWorkflowsEvent(
2017
+ eventId,
2018
+ {
2019
+ id: instance.id,
2020
+ tenantId: instance.tenantId,
2021
+ organizationId: instance.organizationId,
2022
+ workflowId: instance.workflowId,
2023
+ version: instance.version,
2024
+ status: instance.status,
2025
+ stepId: instance.currentStepId ?? null,
2026
+ ...extra,
2027
+ },
2028
+ { persistent: true }
2029
+ )
2030
+ } catch (error) {
2031
+ logger.error('failed to emit workflow event', {
2032
+ eventId,
2033
+ instanceId: instance.id,
2034
+ error: error instanceof Error ? error.message : String(error),
2035
+ })
2036
+ }
2037
+ }
2038
+
1013
2039
  /**
1014
2040
  * Log workflow event to event sourcing table
1015
2041
  *