@open-mercato/core 0.7.1-develop.7193.1.910a5b0a1e → 0.7.1-develop.7195.1.b5efd1d51a

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 (1241) 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/bootstrap.js +7 -3
  6. package/dist/bootstrap.js.map +2 -2
  7. package/dist/generated/entities/action_log/index.js +2 -0
  8. package/dist/generated/entities/action_log/index.js.map +2 -2
  9. package/dist/generated/entities/user/index.js +2 -0
  10. package/dist/generated/entities/user/index.js.map +2 -2
  11. package/dist/generated/entities/user_task/index.js +14 -0
  12. package/dist/generated/entities/user_task/index.js.map +2 -2
  13. package/dist/generated/entities/workflow_definition/index.js +6 -0
  14. package/dist/generated/entities/workflow_definition/index.js.map +2 -2
  15. package/dist/generated/entities/workflow_definition_draft/index.js +25 -0
  16. package/dist/generated/entities/workflow_definition_draft/index.js.map +7 -0
  17. package/dist/generated/entities/workflow_definition_metric_rollup/index.js +23 -0
  18. package/dist/generated/entities/workflow_definition_metric_rollup/index.js.map +7 -0
  19. package/dist/generated/entities/workflow_instance/index.js +4 -0
  20. package/dist/generated/entities/workflow_instance/index.js.map +2 -2
  21. package/dist/generated/entities.ids.generated.js +4 -1
  22. package/dist/generated/entities.ids.generated.js.map +2 -2
  23. package/dist/generated/entity-fields-registry.js +39 -0
  24. package/dist/generated/entity-fields-registry.js.map +2 -2
  25. package/dist/helpers/integration/workflowsFixtures.js +477 -2
  26. package/dist/helpers/integration/workflowsFixtures.js.map +2 -2
  27. package/dist/helpers/integration/workflowsUi.js +148 -0
  28. package/dist/helpers/integration/workflowsUi.js.map +7 -0
  29. package/dist/modules/attachments/lib/createFromBuffer.js +79 -0
  30. package/dist/modules/attachments/lib/createFromBuffer.js.map +7 -0
  31. package/dist/modules/audit_logs/data/entities.js +5 -0
  32. package/dist/modules/audit_logs/data/entities.js.map +2 -2
  33. package/dist/modules/audit_logs/data/validators.js +1 -0
  34. package/dist/modules/audit_logs/data/validators.js.map +2 -2
  35. package/dist/modules/audit_logs/lib/projections.js +2 -1
  36. package/dist/modules/audit_logs/lib/projections.js.map +2 -2
  37. package/dist/modules/audit_logs/migrations/Migration20260625120000.js +15 -0
  38. package/dist/modules/audit_logs/migrations/Migration20260625120000.js.map +7 -0
  39. package/dist/modules/audit_logs/services/actionLogService.js +3 -0
  40. package/dist/modules/audit_logs/services/actionLogService.js.map +2 -2
  41. package/dist/modules/auth/data/entities.js +6 -0
  42. package/dist/modules/auth/data/entities.js.map +2 -2
  43. package/dist/modules/auth/lib/executionPrincipal.js +140 -0
  44. package/dist/modules/auth/lib/executionPrincipal.js.map +7 -0
  45. package/dist/modules/auth/migrations/Migration20260625050000.js +13 -0
  46. package/dist/modules/auth/migrations/Migration20260625050000.js.map +7 -0
  47. package/dist/modules/business_rules/components/InlineRuleEditor.js +154 -0
  48. package/dist/modules/business_rules/components/InlineRuleEditor.js.map +7 -0
  49. package/dist/modules/business_rules/data/validators.js +6 -0
  50. package/dist/modules/business_rules/data/validators.js.map +2 -2
  51. package/dist/modules/business_rules/lib/rule-engine.js +5 -3
  52. package/dist/modules/business_rules/lib/rule-engine.js.map +2 -2
  53. package/dist/modules/catalog/commands/products.js +5 -0
  54. package/dist/modules/catalog/commands/products.js.map +2 -2
  55. package/dist/modules/catalog/workflows.js +19 -0
  56. package/dist/modules/catalog/workflows.js.map +7 -0
  57. package/dist/modules/customer_accounts/backend/customer_accounts/roles/[id]/page.js +3 -1
  58. package/dist/modules/customer_accounts/backend/customer_accounts/roles/[id]/page.js.map +2 -2
  59. package/dist/modules/customer_accounts/cli.js +80 -0
  60. package/dist/modules/customer_accounts/cli.js.map +7 -0
  61. package/dist/modules/customer_accounts/lib/customerRoleAclSync.js +59 -0
  62. package/dist/modules/customer_accounts/lib/customerRoleAclSync.js.map +7 -0
  63. package/dist/modules/customer_accounts/setup.js +4 -2
  64. package/dist/modules/customer_accounts/setup.js.map +2 -2
  65. package/dist/modules/customers/commands/deals.js +4 -0
  66. package/dist/modules/customers/commands/deals.js.map +2 -2
  67. package/dist/modules/customers/components/detail/ChangelogEntryRow.js +1 -1
  68. package/dist/modules/customers/components/detail/ChangelogEntryRow.js.map +2 -2
  69. package/dist/modules/customers/components/detail/utils.js +2 -0
  70. package/dist/modules/customers/components/detail/utils.js.map +2 -2
  71. package/dist/modules/customers/events.js +13 -2
  72. package/dist/modules/customers/events.js.map +2 -2
  73. package/dist/modules/customers/lib/link-workflow-task-handler.js +64 -0
  74. package/dist/modules/customers/lib/link-workflow-task-handler.js.map +7 -0
  75. package/dist/modules/customers/lib/todoCompatibility.js +1 -1
  76. package/dist/modules/customers/lib/todoCompatibility.js.map +2 -2
  77. package/dist/modules/customers/lib/workflowTaskLink.js +9 -0
  78. package/dist/modules/customers/lib/workflowTaskLink.js.map +7 -0
  79. package/dist/modules/customers/subscribers/link-workflow-task.js +12 -0
  80. package/dist/modules/customers/subscribers/link-workflow-task.js.map +7 -0
  81. package/dist/modules/customers/workflows.js +29 -0
  82. package/dist/modules/customers/workflows.js.map +7 -0
  83. package/dist/modules/entities/api/records.js +13 -33
  84. package/dist/modules/entities/api/records.js.map +3 -3
  85. package/dist/modules/entities/lib/entityClassification.js +60 -0
  86. package/dist/modules/entities/lib/entityClassification.js.map +7 -0
  87. package/dist/modules/sales/commands/documents.js +31 -0
  88. package/dist/modules/sales/commands/documents.js.map +2 -2
  89. package/dist/modules/sales/events.js +12 -1
  90. package/dist/modules/sales/events.js.map +2 -2
  91. package/dist/modules/sales/workflows.js +12 -1
  92. package/dist/modules/sales/workflows.js.map +2 -2
  93. package/dist/modules/seeds/cli.js +199 -0
  94. package/dist/modules/seeds/cli.js.map +7 -0
  95. package/dist/modules/seeds/examples/sample-seed.json +26 -0
  96. package/dist/modules/seeds/index.js +12 -0
  97. package/dist/modules/seeds/index.js.map +7 -0
  98. package/dist/modules/workflows/acl.js +96 -0
  99. package/dist/modules/workflows/acl.js.map +2 -2
  100. package/dist/modules/workflows/ai-agents.js +50 -0
  101. package/dist/modules/workflows/ai-agents.js.map +7 -0
  102. package/dist/modules/workflows/ai-tools/authoring-pack.js +582 -0
  103. package/dist/modules/workflows/ai-tools/authoring-pack.js.map +7 -0
  104. package/dist/modules/workflows/ai-tools/types.js +43 -0
  105. package/dist/modules/workflows/ai-tools/types.js.map +7 -0
  106. package/dist/modules/workflows/ai-tools.js +10 -0
  107. package/dist/modules/workflows/ai-tools.js.map +7 -0
  108. package/dist/modules/workflows/api/command-settings/route.js +137 -0
  109. package/dist/modules/workflows/api/command-settings/route.js.map +7 -0
  110. package/dist/modules/workflows/api/commands/route.js +72 -0
  111. package/dist/modules/workflows/api/commands/route.js.map +7 -0
  112. package/dist/modules/workflows/api/definitions/[id]/callers/route.js +76 -0
  113. package/dist/modules/workflows/api/definitions/[id]/callers/route.js.map +7 -0
  114. package/dist/modules/workflows/api/definitions/[id]/context-schema/route.js +134 -0
  115. package/dist/modules/workflows/api/definitions/[id]/context-schema/route.js.map +7 -0
  116. package/dist/modules/workflows/api/definitions/[id]/customize/route.js +5 -1
  117. package/dist/modules/workflows/api/definitions/[id]/customize/route.js.map +2 -2
  118. package/dist/modules/workflows/api/definitions/[id]/draft/route.js +286 -0
  119. package/dist/modules/workflows/api/definitions/[id]/draft/route.js.map +7 -0
  120. package/dist/modules/workflows/api/definitions/[id]/publish/route.js +207 -0
  121. package/dist/modules/workflows/api/definitions/[id]/publish/route.js.map +7 -0
  122. package/dist/modules/workflows/api/definitions/[id]/reset-to-code/route.js +5 -0
  123. package/dist/modules/workflows/api/definitions/[id]/reset-to-code/route.js.map +2 -2
  124. package/dist/modules/workflows/api/definitions/[id]/route.js +93 -9
  125. package/dist/modules/workflows/api/definitions/[id]/route.js.map +3 -3
  126. package/dist/modules/workflows/api/definitions/[id]/test-step/route.js +210 -0
  127. package/dist/modules/workflows/api/definitions/[id]/test-step/route.js.map +7 -0
  128. package/dist/modules/workflows/api/definitions/generate/route.js +233 -0
  129. package/dist/modules/workflows/api/definitions/generate/route.js.map +7 -0
  130. package/dist/modules/workflows/api/definitions/route.js +61 -113
  131. package/dist/modules/workflows/api/definitions/route.js.map +2 -2
  132. package/dist/modules/workflows/api/definitions/serialize.js +9 -0
  133. package/dist/modules/workflows/api/definitions/serialize.js.map +2 -2
  134. package/dist/modules/workflows/api/endpoints/route.js +69 -0
  135. package/dist/modules/workflows/api/endpoints/route.js.map +7 -0
  136. package/dist/modules/workflows/api/functions/route.js +73 -0
  137. package/dist/modules/workflows/api/functions/route.js.map +7 -0
  138. package/dist/modules/workflows/api/grantable-features/route.js +75 -0
  139. package/dist/modules/workflows/api/grantable-features/route.js.map +7 -0
  140. package/dist/modules/workflows/api/instances/[id]/context/route.js +180 -0
  141. package/dist/modules/workflows/api/instances/[id]/context/route.js.map +7 -0
  142. package/dist/modules/workflows/api/instances/[id]/rerun-step/route.js +184 -0
  143. package/dist/modules/workflows/api/instances/[id]/rerun-step/route.js.map +7 -0
  144. package/dist/modules/workflows/api/instances/[id]/retry/route.js +12 -2
  145. package/dist/modules/workflows/api/instances/[id]/retry/route.js.map +2 -2
  146. package/dist/modules/workflows/api/instances/[id]/step-through/route.js +148 -0
  147. package/dist/modules/workflows/api/instances/[id]/step-through/route.js.map +7 -0
  148. package/dist/modules/workflows/api/instances/[id]/steps/route.js +123 -0
  149. package/dist/modules/workflows/api/instances/[id]/steps/route.js.map +7 -0
  150. package/dist/modules/workflows/api/instances/[id]/would-do/route.js +172 -0
  151. package/dist/modules/workflows/api/instances/[id]/would-do/route.js.map +7 -0
  152. package/dist/modules/workflows/api/instances/bulk-replay/route.js +117 -0
  153. package/dist/modules/workflows/api/instances/bulk-replay/route.js.map +7 -0
  154. package/dist/modules/workflows/api/instances/failure-queue/route.js +165 -0
  155. package/dist/modules/workflows/api/instances/failure-queue/route.js.map +7 -0
  156. package/dist/modules/workflows/api/instances/route.js +94 -3
  157. package/dist/modules/workflows/api/instances/route.js.map +2 -2
  158. package/dist/modules/workflows/api/metrics/definitions/route.js +188 -0
  159. package/dist/modules/workflows/api/metrics/definitions/route.js.map +7 -0
  160. package/dist/modules/workflows/api/openapi.js +415 -4
  161. package/dist/modules/workflows/api/openapi.js.map +2 -2
  162. package/dist/modules/workflows/api/portal/tasks/[id]/complete/route.js +132 -0
  163. package/dist/modules/workflows/api/portal/tasks/[id]/complete/route.js.map +7 -0
  164. package/dist/modules/workflows/api/portal/tasks/[id]/route.js +97 -0
  165. package/dist/modules/workflows/api/portal/tasks/[id]/route.js.map +7 -0
  166. package/dist/modules/workflows/api/portal/tasks/route.js +126 -0
  167. package/dist/modules/workflows/api/portal/tasks/route.js.map +7 -0
  168. package/dist/modules/workflows/api/rule-usage/route.js +80 -0
  169. package/dist/modules/workflows/api/rule-usage/route.js.map +7 -0
  170. package/dist/modules/workflows/api/task-settings/route.js +107 -0
  171. package/dist/modules/workflows/api/task-settings/route.js.map +7 -0
  172. package/dist/modules/workflows/api/tasks/[id]/claim/route.js +27 -16
  173. package/dist/modules/workflows/api/tasks/[id]/claim/route.js.map +2 -2
  174. package/dist/modules/workflows/api/tasks/[id]/complete/route.js +40 -16
  175. package/dist/modules/workflows/api/tasks/[id]/complete/route.js.map +2 -2
  176. package/dist/modules/workflows/api/tasks/[id]/reassign/route.js +150 -0
  177. package/dist/modules/workflows/api/tasks/[id]/reassign/route.js.map +7 -0
  178. package/dist/modules/workflows/api/tasks/[id]/route.js +39 -6
  179. package/dist/modules/workflows/api/tasks/[id]/route.js.map +2 -2
  180. package/dist/modules/workflows/api/tasks/[id]/unclaim/route.js +100 -0
  181. package/dist/modules/workflows/api/tasks/[id]/unclaim/route.js.map +7 -0
  182. package/dist/modules/workflows/api/tasks/route.js +37 -6
  183. package/dist/modules/workflows/api/tasks/route.js.map +2 -2
  184. package/dist/modules/workflows/api/tasks/serialize.js +83 -0
  185. package/dist/modules/workflows/api/tasks/serialize.js.map +7 -0
  186. package/dist/modules/workflows/api/templates/route.js +69 -0
  187. package/dist/modules/workflows/api/templates/route.js.map +7 -0
  188. package/dist/modules/workflows/api/work-inbox/next/route.js +129 -0
  189. package/dist/modules/workflows/api/work-inbox/next/route.js.map +7 -0
  190. package/dist/modules/workflows/api/work-inbox/route.js +119 -0
  191. package/dist/modules/workflows/api/work-inbox/route.js.map +7 -0
  192. package/dist/modules/workflows/backend/config/workflows/page.js +10 -0
  193. package/dist/modules/workflows/backend/config/workflows/page.js.map +7 -0
  194. package/dist/modules/workflows/backend/config/workflows/page.meta.js +35 -0
  195. package/dist/modules/workflows/backend/config/workflows/page.meta.js.map +7 -0
  196. package/dist/modules/workflows/backend/definitions/[id]/page.js +6 -271
  197. package/dist/modules/workflows/backend/definitions/[id]/page.js.map +3 -3
  198. package/dist/modules/workflows/backend/definitions/create/page.js +7 -56
  199. package/dist/modules/workflows/backend/definitions/create/page.js.map +2 -2
  200. package/dist/modules/workflows/backend/definitions/create/page.meta.js +1 -1
  201. package/dist/modules/workflows/backend/definitions/create/page.meta.js.map +2 -2
  202. package/dist/modules/workflows/backend/definitions/page.js +131 -51
  203. package/dist/modules/workflows/backend/definitions/page.js.map +2 -2
  204. package/dist/modules/workflows/backend/definitions/visual-editor/page.js +2606 -677
  205. package/dist/modules/workflows/backend/definitions/visual-editor/page.js.map +3 -3
  206. package/dist/modules/workflows/backend/instances/[id]/page.js +532 -421
  207. package/dist/modules/workflows/backend/instances/[id]/page.js.map +2 -2
  208. package/dist/modules/workflows/backend/instances/[id]/page.meta.js +1 -1
  209. package/dist/modules/workflows/backend/instances/[id]/page.meta.js.map +1 -1
  210. package/dist/modules/workflows/backend/instances/failure-queue/page.js +211 -0
  211. package/dist/modules/workflows/backend/instances/failure-queue/page.js.map +7 -0
  212. package/dist/modules/workflows/backend/instances/failure-queue/page.meta.js +20 -0
  213. package/dist/modules/workflows/backend/instances/failure-queue/page.meta.js.map +7 -0
  214. package/dist/modules/workflows/backend/instances/page.js +159 -22
  215. package/dist/modules/workflows/backend/instances/page.js.map +2 -2
  216. package/dist/modules/workflows/backend/instances/page.meta.js +1 -1
  217. package/dist/modules/workflows/backend/instances/page.meta.js.map +1 -1
  218. package/dist/modules/workflows/backend/tasks/[id]/page.js +553 -392
  219. package/dist/modules/workflows/backend/tasks/[id]/page.js.map +3 -3
  220. package/dist/modules/workflows/backend/tasks/page.js +8 -250
  221. package/dist/modules/workflows/backend/tasks/page.js.map +2 -2
  222. package/dist/modules/workflows/backend/tasks/page.meta.js +1 -0
  223. package/dist/modules/workflows/backend/tasks/page.meta.js.map +2 -2
  224. package/dist/modules/workflows/backend/work-inbox/page.js +399 -0
  225. package/dist/modules/workflows/backend/work-inbox/page.js.map +7 -0
  226. package/dist/modules/workflows/backend/work-inbox/page.meta.js +19 -0
  227. package/dist/modules/workflows/backend/work-inbox/page.meta.js.map +7 -0
  228. package/dist/modules/workflows/cli.js +1 -1
  229. package/dist/modules/workflows/cli.js.map +2 -2
  230. package/dist/modules/workflows/commands/tasks.js +81 -0
  231. package/dist/modules/workflows/commands/tasks.js.map +7 -0
  232. package/dist/modules/workflows/components/ActivitiesEditor.js +281 -287
  233. package/dist/modules/workflows/components/ActivitiesEditor.js.map +2 -2
  234. package/dist/modules/workflows/components/ActivityEditDialog.js +220 -0
  235. package/dist/modules/workflows/components/ActivityEditDialog.js.map +7 -0
  236. package/dist/modules/workflows/components/AgentSelector.js +115 -0
  237. package/dist/modules/workflows/components/AgentSelector.js.map +7 -0
  238. package/dist/modules/workflows/components/AnnotationEditDialog.js +110 -0
  239. package/dist/modules/workflows/components/AnnotationEditDialog.js.map +7 -0
  240. package/dist/modules/workflows/components/BusinessRuleUsagePanel.js +71 -0
  241. package/dist/modules/workflows/components/BusinessRuleUsagePanel.js.map +7 -0
  242. package/dist/modules/workflows/components/BusinessRulesSelector.js +151 -93
  243. package/dist/modules/workflows/components/BusinessRulesSelector.js.map +2 -2
  244. package/dist/modules/workflows/components/ConfigJsonTextarea.js +85 -0
  245. package/dist/modules/workflows/components/ConfigJsonTextarea.js.map +7 -0
  246. package/dist/modules/workflows/components/ContextSchemaEditor.js +150 -0
  247. package/dist/modules/workflows/components/ContextSchemaEditor.js.map +7 -0
  248. package/dist/modules/workflows/components/DefinitionErrorHandlerField.js +102 -0
  249. package/dist/modules/workflows/components/DefinitionErrorHandlerField.js.map +7 -0
  250. package/dist/modules/workflows/components/DefinitionMetadataDrawer.js +377 -0
  251. package/dist/modules/workflows/components/DefinitionMetadataDrawer.js.map +7 -0
  252. package/dist/modules/workflows/components/DefinitionMetricsCells.js +132 -0
  253. package/dist/modules/workflows/components/DefinitionMetricsCells.js.map +7 -0
  254. package/dist/modules/workflows/components/DefinitionTriggersEditor.js +307 -216
  255. package/dist/modules/workflows/components/DefinitionTriggersEditor.js.map +2 -2
  256. package/dist/modules/workflows/components/EdgeEditDialog.js +11 -18
  257. package/dist/modules/workflows/components/EdgeEditDialog.js.map +2 -2
  258. package/dist/modules/workflows/components/EdgeEditDialogCrudForm.js +112 -72
  259. package/dist/modules/workflows/components/EdgeEditDialogCrudForm.js.map +2 -2
  260. package/dist/modules/workflows/components/InputDataPanel.js +128 -0
  261. package/dist/modules/workflows/components/InputDataPanel.js.map +7 -0
  262. package/dist/modules/workflows/components/InspectorPanel.js +161 -0
  263. package/dist/modules/workflows/components/InspectorPanel.js.map +7 -0
  264. package/dist/modules/workflows/components/NodeEditDialog.js +363 -41
  265. package/dist/modules/workflows/components/NodeEditDialog.js.map +2 -2
  266. package/dist/modules/workflows/components/NodeEditDialogCrudForm.js +714 -159
  267. package/dist/modules/workflows/components/NodeEditDialogCrudForm.js.map +2 -2
  268. package/dist/modules/workflows/components/StepsEditor.js.map +2 -2
  269. package/dist/modules/workflows/components/TemplateGalleryDialog.js +148 -0
  270. package/dist/modules/workflows/components/TemplateGalleryDialog.js.map +7 -0
  271. package/dist/modules/workflows/components/TransitionsEditor.js +80 -74
  272. package/dist/modules/workflows/components/TransitionsEditor.js.map +2 -2
  273. package/dist/modules/workflows/components/TriggersDialog.js +53 -0
  274. package/dist/modules/workflows/components/TriggersDialog.js.map +7 -0
  275. package/dist/modules/workflows/components/TriggersEditor.js +331 -0
  276. package/dist/modules/workflows/components/TriggersEditor.js.map +7 -0
  277. package/dist/modules/workflows/components/WorkflowAiDraftDialog.js +278 -0
  278. package/dist/modules/workflows/components/WorkflowAiDraftDialog.js.map +7 -0
  279. package/dist/modules/workflows/components/WorkflowCodeView.js +173 -0
  280. package/dist/modules/workflows/components/WorkflowCodeView.js.map +7 -0
  281. package/dist/modules/workflows/components/WorkflowCommandPalette.js +62 -0
  282. package/dist/modules/workflows/components/WorkflowCommandPalette.js.map +7 -0
  283. package/dist/modules/workflows/components/WorkflowCompensationGhostEdge.js +70 -0
  284. package/dist/modules/workflows/components/WorkflowCompensationGhostEdge.js.map +7 -0
  285. package/dist/modules/workflows/components/WorkflowDataMappingEdge.js +36 -0
  286. package/dist/modules/workflows/components/WorkflowDataMappingEdge.js.map +7 -0
  287. package/dist/modules/workflows/components/WorkflowGraph.js +4 -2
  288. package/dist/modules/workflows/components/WorkflowGraph.js.map +2 -2
  289. package/dist/modules/workflows/components/WorkflowGraphImpl.js +324 -86
  290. package/dist/modules/workflows/components/WorkflowGraphImpl.js.map +3 -3
  291. package/dist/modules/workflows/components/WorkflowIconPicker.js +109 -0
  292. package/dist/modules/workflows/components/WorkflowIconPicker.js.map +7 -0
  293. package/dist/modules/workflows/components/WorkflowLegend.js +45 -29
  294. package/dist/modules/workflows/components/WorkflowLegend.js.map +2 -2
  295. package/dist/modules/workflows/components/WorkflowNodeCard.js +221 -22
  296. package/dist/modules/workflows/components/WorkflowNodeCard.js.map +2 -2
  297. package/dist/modules/workflows/components/WorkflowRouteChips.js +111 -0
  298. package/dist/modules/workflows/components/WorkflowRouteChips.js.map +7 -0
  299. package/dist/modules/workflows/components/WorkflowSelector.js +108 -88
  300. package/dist/modules/workflows/components/WorkflowSelector.js.map +2 -2
  301. package/dist/modules/workflows/components/WorkflowTransitionEdge.js +61 -11
  302. package/dist/modules/workflows/components/WorkflowTransitionEdge.js.map +2 -2
  303. package/dist/modules/workflows/components/WorkflowTransitionLabel.js +15 -5
  304. package/dist/modules/workflows/components/WorkflowTransitionLabel.js.map +2 -2
  305. package/dist/modules/workflows/components/fields/ActivityArrayEditor.js +88 -21
  306. package/dist/modules/workflows/components/fields/ActivityArrayEditor.js.map +2 -2
  307. package/dist/modules/workflows/components/fields/ActivityConfigFields.js +615 -0
  308. package/dist/modules/workflows/components/fields/ActivityConfigFields.js.map +7 -0
  309. package/dist/modules/workflows/components/fields/ActivityTestPanel.js +191 -0
  310. package/dist/modules/workflows/components/fields/ActivityTestPanel.js.map +7 -0
  311. package/dist/modules/workflows/components/fields/AgentInvokeConfigField.js +488 -0
  312. package/dist/modules/workflows/components/fields/AgentInvokeConfigField.js.map +7 -0
  313. package/dist/modules/workflows/components/fields/AgentReviewOnBreachField.js +61 -0
  314. package/dist/modules/workflows/components/fields/AgentReviewOnBreachField.js.map +7 -0
  315. package/dist/modules/workflows/components/fields/BranchingRoutesEditor.js +227 -0
  316. package/dist/modules/workflows/components/fields/BranchingRoutesEditor.js.map +7 -0
  317. package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js +37 -4
  318. package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js.map +2 -2
  319. package/dist/modules/workflows/components/fields/CommandPicker.js +111 -0
  320. package/dist/modules/workflows/components/fields/CommandPicker.js.map +7 -0
  321. package/dist/modules/workflows/components/fields/EndpointPicker.js +235 -0
  322. package/dist/modules/workflows/components/fields/EndpointPicker.js.map +7 -0
  323. package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js +2 -2
  324. package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js.map +2 -2
  325. package/dist/modules/workflows/components/fields/FunctionPicker.js +55 -0
  326. package/dist/modules/workflows/components/fields/FunctionPicker.js.map +7 -0
  327. package/dist/modules/workflows/components/fields/MappingArrayEditor.js +38 -15
  328. package/dist/modules/workflows/components/fields/MappingArrayEditor.js.map +2 -2
  329. package/dist/modules/workflows/components/fields/PortFieldArrayEditor.js +206 -0
  330. package/dist/modules/workflows/components/fields/PortFieldArrayEditor.js.map +7 -0
  331. package/dist/modules/workflows/components/fields/RolesMultiSelect.js +53 -0
  332. package/dist/modules/workflows/components/fields/RolesMultiSelect.js.map +7 -0
  333. package/dist/modules/workflows/components/fields/RouteOrderEditor.js +130 -0
  334. package/dist/modules/workflows/components/fields/RouteOrderEditor.js.map +7 -0
  335. package/dist/modules/workflows/components/fields/SchemaBuilderDialog.js +104 -0
  336. package/dist/modules/workflows/components/fields/SchemaBuilderDialog.js.map +7 -0
  337. package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js +2 -2
  338. package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js.map +2 -2
  339. package/dist/modules/workflows/components/fields/TaskAssignmentField.js +210 -0
  340. package/dist/modules/workflows/components/fields/TaskAssignmentField.js.map +7 -0
  341. package/dist/modules/workflows/components/fields/TaskDeadlineFields.js +126 -0
  342. package/dist/modules/workflows/components/fields/TaskDeadlineFields.js.map +7 -0
  343. package/dist/modules/workflows/components/fields/TaskDecisionsField.js +218 -0
  344. package/dist/modules/workflows/components/fields/TaskDecisionsField.js.map +7 -0
  345. package/dist/modules/workflows/components/fields/TaskEntityBindingsField.js +114 -0
  346. package/dist/modules/workflows/components/fields/TaskEntityBindingsField.js.map +7 -0
  347. package/dist/modules/workflows/components/fields/TemplateTextControl.js +64 -0
  348. package/dist/modules/workflows/components/fields/TemplateTextControl.js.map +7 -0
  349. package/dist/modules/workflows/components/fields/VariablePickerButton.js +121 -0
  350. package/dist/modules/workflows/components/fields/VariablePickerButton.js.map +7 -0
  351. package/dist/modules/workflows/components/fields/ledgerDropTarget.js +35 -0
  352. package/dist/modules/workflows/components/fields/ledgerDropTarget.js.map +7 -0
  353. package/dist/modules/workflows/components/fields/useActivityTypeOptions.js +16 -0
  354. package/dist/modules/workflows/components/fields/useActivityTypeOptions.js.map +7 -0
  355. package/dist/modules/workflows/components/formConfig.js +39 -10
  356. package/dist/modules/workflows/components/formConfig.js.map +2 -2
  357. package/dist/modules/workflows/components/mobile/MobileDefinitionDetail.js.map +2 -2
  358. package/dist/modules/workflows/components/mobile/MobileMetadataSheet.js.map +2 -2
  359. package/dist/modules/workflows/components/mobile/MobileTaskForm.js +29 -2
  360. package/dist/modules/workflows/components/mobile/MobileTaskForm.js.map +2 -2
  361. package/dist/modules/workflows/components/mobile/MobileVisualEditor.js +64 -65
  362. package/dist/modules/workflows/components/mobile/MobileVisualEditor.js.map +2 -2
  363. package/dist/modules/workflows/components/nodes/AnnotationGroupNode.js +64 -0
  364. package/dist/modules/workflows/components/nodes/AnnotationGroupNode.js.map +7 -0
  365. package/dist/modules/workflows/components/nodes/AutomatedNode.js +24 -16
  366. package/dist/modules/workflows/components/nodes/AutomatedNode.js.map +2 -2
  367. package/dist/modules/workflows/components/nodes/EndNode.js +13 -12
  368. package/dist/modules/workflows/components/nodes/EndNode.js.map +2 -2
  369. package/dist/modules/workflows/components/nodes/ErrorOutputHandle.js +29 -0
  370. package/dist/modules/workflows/components/nodes/ErrorOutputHandle.js.map +7 -0
  371. package/dist/modules/workflows/components/nodes/IfElseNode.js +51 -0
  372. package/dist/modules/workflows/components/nodes/IfElseNode.js.map +7 -0
  373. package/dist/modules/workflows/components/nodes/InvokeAgentNode.js +122 -0
  374. package/dist/modules/workflows/components/nodes/InvokeAgentNode.js.map +7 -0
  375. package/dist/modules/workflows/components/nodes/NodeOutcomeRows.js +100 -0
  376. package/dist/modules/workflows/components/nodes/NodeOutcomeRows.js.map +7 -0
  377. package/dist/modules/workflows/components/nodes/ParallelForkNode.js +18 -14
  378. package/dist/modules/workflows/components/nodes/ParallelForkNode.js.map +2 -2
  379. package/dist/modules/workflows/components/nodes/ParallelJoinNode.js +18 -14
  380. package/dist/modules/workflows/components/nodes/ParallelJoinNode.js.map +2 -2
  381. package/dist/modules/workflows/components/nodes/StartNode.js +66 -15
  382. package/dist/modules/workflows/components/nodes/StartNode.js.map +2 -2
  383. package/dist/modules/workflows/components/nodes/StickyNoteNode.js +54 -0
  384. package/dist/modules/workflows/components/nodes/StickyNoteNode.js.map +7 -0
  385. package/dist/modules/workflows/components/nodes/SubWorkflowNode.js +107 -41
  386. package/dist/modules/workflows/components/nodes/SubWorkflowNode.js.map +2 -2
  387. package/dist/modules/workflows/components/nodes/SwitchNode.js +51 -0
  388. package/dist/modules/workflows/components/nodes/SwitchNode.js.map +7 -0
  389. package/dist/modules/workflows/components/nodes/TriggerCap.js +65 -0
  390. package/dist/modules/workflows/components/nodes/TriggerCap.js.map +7 -0
  391. package/dist/modules/workflows/components/nodes/TriggerNode.js +111 -0
  392. package/dist/modules/workflows/components/nodes/TriggerNode.js.map +7 -0
  393. package/dist/modules/workflows/components/nodes/UserTaskNode.js +43 -17
  394. package/dist/modules/workflows/components/nodes/UserTaskNode.js.map +2 -2
  395. package/dist/modules/workflows/components/nodes/WaitForConditionNode.js +53 -0
  396. package/dist/modules/workflows/components/nodes/WaitForConditionNode.js.map +7 -0
  397. package/dist/modules/workflows/components/nodes/WaitForSignalNode.js +21 -15
  398. package/dist/modules/workflows/components/nodes/WaitForSignalNode.js.map +2 -2
  399. package/dist/modules/workflows/components/nodes/WaitForTimerNode.js +21 -15
  400. package/dist/modules/workflows/components/nodes/WaitForTimerNode.js.map +2 -2
  401. package/dist/modules/workflows/components/nodes/index.js +14 -0
  402. package/dist/modules/workflows/components/nodes/index.js.map +2 -2
  403. package/dist/modules/workflows/components/portal/PortalTaskForm.js +196 -0
  404. package/dist/modules/workflows/components/portal/PortalTaskForm.js.map +7 -0
  405. package/dist/modules/workflows/components/run/AgentActivityPanel.js +22 -0
  406. package/dist/modules/workflows/components/run/AgentActivityPanel.js.map +7 -0
  407. package/dist/modules/workflows/components/run/RerunStepDialog.js +106 -0
  408. package/dist/modules/workflows/components/run/RerunStepDialog.js.map +7 -0
  409. package/dist/modules/workflows/components/run/RunEventBadge.js +30 -0
  410. package/dist/modules/workflows/components/run/RunEventBadge.js.map +7 -0
  411. package/dist/modules/workflows/components/run/RunGantt.js +130 -0
  412. package/dist/modules/workflows/components/run/RunGantt.js.map +7 -0
  413. package/dist/modules/workflows/components/run/RunStatusBadge.js +82 -0
  414. package/dist/modules/workflows/components/run/RunStatusBadge.js.map +7 -0
  415. package/dist/modules/workflows/components/run/RunStepInspector.js +116 -0
  416. package/dist/modules/workflows/components/run/RunStepInspector.js.map +7 -0
  417. package/dist/modules/workflows/components/run/WouldDoReport.js +52 -0
  418. package/dist/modules/workflows/components/run/WouldDoReport.js.map +7 -0
  419. package/dist/modules/workflows/components/run/useAgentLabels.js +28 -0
  420. package/dist/modules/workflows/components/run/useAgentLabels.js.map +7 -0
  421. package/dist/modules/workflows/components/run/useLastRunOverlay.js +89 -0
  422. package/dist/modules/workflows/components/run/useLastRunOverlay.js.map +7 -0
  423. package/dist/modules/workflows/components/run/useLiveAgentActions.js +41 -0
  424. package/dist/modules/workflows/components/run/useLiveAgentActions.js.map +7 -0
  425. package/dist/modules/workflows/components/run/useLiveRunUpdates.js +57 -0
  426. package/dist/modules/workflows/components/run/useLiveRunUpdates.js.map +7 -0
  427. package/dist/modules/workflows/components/settings/CommandSettingsPageClient.js +156 -0
  428. package/dist/modules/workflows/components/settings/CommandSettingsPageClient.js.map +7 -0
  429. package/dist/modules/workflows/components/work-inbox/EntityContextPanel.js +72 -0
  430. package/dist/modules/workflows/components/work-inbox/EntityContextPanel.js.map +7 -0
  431. package/dist/modules/workflows/components/work-inbox/ReassignTaskDialog.js +156 -0
  432. package/dist/modules/workflows/components/work-inbox/ReassignTaskDialog.js.map +7 -0
  433. package/dist/modules/workflows/components/work-inbox/StatusChip.js +46 -0
  434. package/dist/modules/workflows/components/work-inbox/StatusChip.js.map +7 -0
  435. package/dist/modules/workflows/components/work-inbox/TaskActionNotice.js +53 -0
  436. package/dist/modules/workflows/components/work-inbox/TaskActionNotice.js.map +7 -0
  437. package/dist/modules/workflows/components/work-inbox/TaskFormFields.js +261 -0
  438. package/dist/modules/workflows/components/work-inbox/TaskFormFields.js.map +7 -0
  439. package/dist/modules/workflows/components/work-inbox/WorkInboxEmptyState.js +27 -0
  440. package/dist/modules/workflows/components/work-inbox/WorkInboxEmptyState.js.map +7 -0
  441. package/dist/modules/workflows/data/activity-config-schemas.js +191 -0
  442. package/dist/modules/workflows/data/activity-config-schemas.js.map +7 -0
  443. package/dist/modules/workflows/data/activity-config-warnings.js +42 -0
  444. package/dist/modules/workflows/data/activity-config-warnings.js.map +7 -0
  445. package/dist/modules/workflows/data/branching-route-warnings.js +65 -0
  446. package/dist/modules/workflows/data/branching-route-warnings.js.map +7 -0
  447. package/dist/modules/workflows/data/entities.js +144 -4
  448. package/dist/modules/workflows/data/entities.js.map +2 -2
  449. package/dist/modules/workflows/data/metrics-validators.js +35 -0
  450. package/dist/modules/workflows/data/metrics-validators.js.map +7 -0
  451. package/dist/modules/workflows/data/task-primitives.js +14 -0
  452. package/dist/modules/workflows/data/task-primitives.js.map +7 -0
  453. package/dist/modules/workflows/data/validators.js +504 -61
  454. package/dist/modules/workflows/data/validators.js.map +3 -3
  455. package/dist/modules/workflows/di.js +16 -1
  456. package/dist/modules/workflows/di.js.map +2 -2
  457. package/dist/modules/workflows/events.js +66 -8
  458. package/dist/modules/workflows/events.js.map +2 -2
  459. package/dist/modules/workflows/examples/oze-residential-install-60-nodes.json +1545 -0
  460. package/dist/modules/workflows/examples/sales-pipeline-definition.json +35 -35
  461. package/dist/modules/workflows/examples/templates/lead-to-install.json +160 -0
  462. package/dist/modules/workflows/examples/templates/order-approval.json +230 -0
  463. package/dist/modules/workflows/examples/templates/task-escalation.json +110 -0
  464. package/dist/modules/workflows/examples/templates/webhook-integration.json +113 -0
  465. package/dist/modules/workflows/extension-points.js +1 -1
  466. package/dist/modules/workflows/extension-points.js.map +2 -2
  467. package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/[id]/page.js +144 -0
  468. package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/[id]/page.js.map +7 -0
  469. package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/[id]/page.meta.js +12 -0
  470. package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/[id]/page.meta.js.map +7 -0
  471. package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/page.js +114 -0
  472. package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/page.js.map +7 -0
  473. package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/page.meta.js +18 -0
  474. package/dist/modules/workflows/frontend/[orgSlug]/portal/tasks/page.meta.js.map +7 -0
  475. package/dist/modules/workflows/lib/activity-executor.js +505 -137
  476. package/dist/modules/workflows/lib/activity-executor.js.map +3 -3
  477. package/dist/modules/workflows/lib/activity-queue-types.js +3 -1
  478. package/dist/modules/workflows/lib/activity-queue-types.js.map +2 -2
  479. package/dist/modules/workflows/lib/activity-registry-bootstrap.js +2 -0
  480. package/dist/modules/workflows/lib/activity-registry-bootstrap.js.map +7 -0
  481. package/dist/modules/workflows/lib/activity-registry.js +27 -0
  482. package/dist/modules/workflows/lib/activity-registry.js.map +7 -0
  483. package/dist/modules/workflows/lib/activity-types.js +291 -0
  484. package/dist/modules/workflows/lib/activity-types.js.map +7 -0
  485. package/dist/modules/workflows/lib/activity-worker-handler.js +456 -32
  486. package/dist/modules/workflows/lib/activity-worker-handler.js.map +3 -3
  487. package/dist/modules/workflows/lib/advanced-config.js +31 -0
  488. package/dist/modules/workflows/lib/advanced-config.js.map +7 -0
  489. package/dist/modules/workflows/lib/agent-disposition-task.js +198 -0
  490. package/dist/modules/workflows/lib/agent-disposition-task.js.map +7 -0
  491. package/dist/modules/workflows/lib/agent-outcome-paths.js +82 -0
  492. package/dist/modules/workflows/lib/agent-outcome-paths.js.map +7 -0
  493. package/dist/modules/workflows/lib/agent-result-mapping.js +54 -0
  494. package/dist/modules/workflows/lib/agent-result-mapping.js.map +7 -0
  495. package/dist/modules/workflows/lib/agent-review-inspector.js +61 -0
  496. package/dist/modules/workflows/lib/agent-review-inspector.js.map +7 -0
  497. package/dist/modules/workflows/lib/agent-review.js +66 -0
  498. package/dist/modules/workflows/lib/agent-review.js.map +7 -0
  499. package/dist/modules/workflows/lib/ai-authoring.js +155 -0
  500. package/dist/modules/workflows/lib/ai-authoring.js.map +7 -0
  501. package/dist/modules/workflows/lib/ai-draft-runner.js +43 -0
  502. package/dist/modules/workflows/lib/ai-draft-runner.js.map +7 -0
  503. package/dist/modules/workflows/lib/annotation-events.js +10 -0
  504. package/dist/modules/workflows/lib/annotation-events.js.map +7 -0
  505. package/dist/modules/workflows/lib/branching-routes.js +182 -0
  506. package/dist/modules/workflows/lib/branching-routes.js.map +7 -0
  507. package/dist/modules/workflows/lib/breach-routing.js +50 -0
  508. package/dist/modules/workflows/lib/breach-routing.js.map +7 -0
  509. package/dist/modules/workflows/lib/bulk-replay.js +101 -0
  510. package/dist/modules/workflows/lib/bulk-replay.js.map +7 -0
  511. package/dist/modules/workflows/lib/business-rule-usage.js +91 -0
  512. package/dist/modules/workflows/lib/business-rule-usage.js.map +7 -0
  513. package/dist/modules/workflows/lib/caller-graph.js +53 -0
  514. package/dist/modules/workflows/lib/caller-graph.js.map +7 -0
  515. package/dist/modules/workflows/lib/code-view-apply.js +86 -0
  516. package/dist/modules/workflows/lib/code-view-apply.js.map +7 -0
  517. package/dist/modules/workflows/lib/collect-validation-issues.js +164 -0
  518. package/dist/modules/workflows/lib/collect-validation-issues.js.map +7 -0
  519. package/dist/modules/workflows/lib/compensation-ghosts.js +72 -0
  520. package/dist/modules/workflows/lib/compensation-ghosts.js.map +7 -0
  521. package/dist/modules/workflows/lib/component-guard.js +7 -0
  522. package/dist/modules/workflows/lib/component-guard.js.map +7 -0
  523. package/dist/modules/workflows/lib/condition-handler.js +443 -0
  524. package/dist/modules/workflows/lib/condition-handler.js.map +7 -0
  525. package/dist/modules/workflows/lib/context-ledger.js +448 -0
  526. package/dist/modules/workflows/lib/context-ledger.js.map +7 -0
  527. package/dist/modules/workflows/lib/crud-form-dialogs-flag.js +8 -0
  528. package/dist/modules/workflows/lib/crud-form-dialogs-flag.js.map +7 -0
  529. package/dist/modules/workflows/lib/data-edge-mapping.js +63 -0
  530. package/dist/modules/workflows/lib/data-edge-mapping.js.map +7 -0
  531. package/dist/modules/workflows/lib/definition-context-schema.js +56 -0
  532. package/dist/modules/workflows/lib/definition-context-schema.js.map +7 -0
  533. package/dist/modules/workflows/lib/definition-edit-safety.js +123 -0
  534. package/dist/modules/workflows/lib/definition-edit-safety.js.map +7 -0
  535. package/dist/modules/workflows/lib/definition-error-body.js +33 -0
  536. package/dist/modules/workflows/lib/definition-error-body.js.map +7 -0
  537. package/dist/modules/workflows/lib/definition-evaluation.js +79 -0
  538. package/dist/modules/workflows/lib/definition-evaluation.js.map +7 -0
  539. package/dist/modules/workflows/lib/definition-grant.js +90 -0
  540. package/dist/modules/workflows/lib/definition-grant.js.map +7 -0
  541. package/dist/modules/workflows/lib/definition-json-locations.js +139 -0
  542. package/dist/modules/workflows/lib/definition-json-locations.js.map +7 -0
  543. package/dist/modules/workflows/lib/definition-payload.js +31 -0
  544. package/dist/modules/workflows/lib/definition-payload.js.map +7 -0
  545. package/dist/modules/workflows/lib/draft-restore.js +49 -0
  546. package/dist/modules/workflows/lib/draft-restore.js.map +7 -0
  547. package/dist/modules/workflows/lib/dry-run.js +106 -0
  548. package/dist/modules/workflows/lib/dry-run.js.map +7 -0
  549. package/dist/modules/workflows/lib/duration.js +66 -17
  550. package/dist/modules/workflows/lib/duration.js.map +2 -2
  551. package/dist/modules/workflows/lib/edge-reattachment.js +79 -0
  552. package/dist/modules/workflows/lib/edge-reattachment.js.map +7 -0
  553. package/dist/modules/workflows/lib/edgeFormTransforms.js +7 -11
  554. package/dist/modules/workflows/lib/edgeFormTransforms.js.map +2 -2
  555. package/dist/modules/workflows/lib/editor-annotations.js +195 -0
  556. package/dist/modules/workflows/lib/editor-annotations.js.map +7 -0
  557. package/dist/modules/workflows/lib/editor-commands.js +103 -0
  558. package/dist/modules/workflows/lib/editor-commands.js.map +7 -0
  559. package/dist/modules/workflows/lib/editor-history.js +51 -0
  560. package/dist/modules/workflows/lib/editor-history.js.map +7 -0
  561. package/dist/modules/workflows/lib/endpoint-catalog.js +181 -0
  562. package/dist/modules/workflows/lib/endpoint-catalog.js.map +7 -0
  563. package/dist/modules/workflows/lib/endpoint-path.js +90 -0
  564. package/dist/modules/workflows/lib/endpoint-path.js.map +7 -0
  565. package/dist/modules/workflows/lib/engine-version.js +42 -0
  566. package/dist/modules/workflows/lib/engine-version.js.map +7 -0
  567. package/dist/modules/workflows/lib/error-handler.js +132 -0
  568. package/dist/modules/workflows/lib/error-handler.js.map +7 -0
  569. package/dist/modules/workflows/lib/error-routing.js +104 -0
  570. package/dist/modules/workflows/lib/error-routing.js.map +7 -0
  571. package/dist/modules/workflows/lib/event-logger.js +23 -0
  572. package/dist/modules/workflows/lib/event-logger.js.map +2 -2
  573. package/dist/modules/workflows/lib/expression-refs.js +168 -0
  574. package/dist/modules/workflows/lib/expression-refs.js.map +7 -0
  575. package/dist/modules/workflows/lib/failure-grouping.js +62 -0
  576. package/dist/modules/workflows/lib/failure-grouping.js.map +7 -0
  577. package/dist/modules/workflows/lib/find-definition.js +1 -0
  578. package/dist/modules/workflows/lib/find-definition.js.map +2 -2
  579. package/dist/modules/workflows/lib/flow-logic-warnings.js +338 -0
  580. package/dist/modules/workflows/lib/flow-logic-warnings.js.map +7 -0
  581. package/dist/modules/workflows/lib/graph-utils.js +328 -77
  582. package/dist/modules/workflows/lib/graph-utils.js.map +2 -2
  583. package/dist/modules/workflows/lib/icon-search.js +32 -0
  584. package/dist/modules/workflows/lib/icon-search.js.map +7 -0
  585. package/dist/modules/workflows/lib/insert-at-cursor.js +26 -0
  586. package/dist/modules/workflows/lib/insert-at-cursor.js.map +7 -0
  587. package/dist/modules/workflows/lib/instance-date-filter.js +28 -0
  588. package/dist/modules/workflows/lib/instance-date-filter.js.map +7 -0
  589. package/dist/modules/workflows/lib/interpolation-pipeline.js +271 -0
  590. package/dist/modules/workflows/lib/interpolation-pipeline.js.map +7 -0
  591. package/dist/modules/workflows/lib/ledger-drag.js +28 -0
  592. package/dist/modules/workflows/lib/ledger-drag.js.map +7 -0
  593. package/dist/modules/workflows/lib/ledger-entry-display.js +66 -0
  594. package/dist/modules/workflows/lib/ledger-entry-display.js.map +7 -0
  595. package/dist/modules/workflows/lib/ledger-schema-flatten.js +82 -0
  596. package/dist/modules/workflows/lib/ledger-schema-flatten.js.map +7 -0
  597. package/dist/modules/workflows/lib/metrics/definition-metrics.js +110 -0
  598. package/dist/modules/workflows/lib/metrics/definition-metrics.js.map +7 -0
  599. package/dist/modules/workflows/lib/metrics/metrics-display.js +26 -0
  600. package/dist/modules/workflows/lib/metrics/metrics-display.js.map +7 -0
  601. package/dist/modules/workflows/lib/metrics/rollup-schedule.js +7 -0
  602. package/dist/modules/workflows/lib/metrics/rollup-schedule.js.map +7 -0
  603. package/dist/modules/workflows/lib/metrics/rollup-service.js +160 -0
  604. package/dist/modules/workflows/lib/metrics/rollup-service.js.map +7 -0
  605. package/dist/modules/workflows/lib/node-config-summary.js +128 -0
  606. package/dist/modules/workflows/lib/node-config-summary.js.map +7 -0
  607. package/dist/modules/workflows/lib/node-geometry.js +53 -0
  608. package/dist/modules/workflows/lib/node-geometry.js.map +7 -0
  609. package/dist/modules/workflows/lib/node-nudge.js +44 -0
  610. package/dist/modules/workflows/lib/node-nudge.js.map +7 -0
  611. package/dist/modules/workflows/lib/node-outcome-rows.js +88 -0
  612. package/dist/modules/workflows/lib/node-outcome-rows.js.map +7 -0
  613. package/dist/modules/workflows/lib/node-placement.js +55 -0
  614. package/dist/modules/workflows/lib/node-placement.js.map +7 -0
  615. package/dist/modules/workflows/lib/node-type-icons.js +54 -13
  616. package/dist/modules/workflows/lib/node-type-icons.js.map +2 -2
  617. package/dist/modules/workflows/lib/nodeFormTransforms.js +329 -19
  618. package/dist/modules/workflows/lib/nodeFormTransforms.js.map +2 -2
  619. package/dist/modules/workflows/lib/outcome-routing.js +158 -0
  620. package/dist/modules/workflows/lib/outcome-routing.js.map +7 -0
  621. package/dist/modules/workflows/lib/owned-definition.js +107 -0
  622. package/dist/modules/workflows/lib/owned-definition.js.map +7 -0
  623. package/dist/modules/workflows/lib/owned-node-changes.js +10 -0
  624. package/dist/modules/workflows/lib/owned-node-changes.js.map +7 -0
  625. package/dist/modules/workflows/lib/palette-drag.js +36 -0
  626. package/dist/modules/workflows/lib/palette-drag.js.map +7 -0
  627. package/dist/modules/workflows/lib/palette-drop.js +45 -0
  628. package/dist/modules/workflows/lib/palette-drop.js.map +7 -0
  629. package/dist/modules/workflows/lib/parallel-handler.js +57 -2
  630. package/dist/modules/workflows/lib/parallel-handler.js.map +2 -2
  631. package/dist/modules/workflows/lib/port-contract.js +54 -0
  632. package/dist/modules/workflows/lib/port-contract.js.map +7 -0
  633. package/dist/modules/workflows/lib/portal-task-access.js +89 -0
  634. package/dist/modules/workflows/lib/portal-task-access.js.map +7 -0
  635. package/dist/modules/workflows/lib/rerun-from-step.js +65 -0
  636. package/dist/modules/workflows/lib/rerun-from-step.js.map +7 -0
  637. package/dist/modules/workflows/lib/route-chip-events.js +23 -0
  638. package/dist/modules/workflows/lib/route-chip-events.js.map +7 -0
  639. package/dist/modules/workflows/lib/route-chips.js +91 -0
  640. package/dist/modules/workflows/lib/route-chips.js.map +7 -0
  641. package/dist/modules/workflows/lib/route-edge.js +17 -0
  642. package/dist/modules/workflows/lib/route-edge.js.map +7 -0
  643. package/dist/modules/workflows/lib/route-kinds.js +67 -0
  644. package/dist/modules/workflows/lib/route-kinds.js.map +7 -0
  645. package/dist/modules/workflows/lib/route-priority.js +104 -0
  646. package/dist/modules/workflows/lib/route-priority.js.map +7 -0
  647. package/dist/modules/workflows/lib/run-duration.js +44 -0
  648. package/dist/modules/workflows/lib/run-duration.js.map +7 -0
  649. package/dist/modules/workflows/lib/run-event-tone.js +25 -0
  650. package/dist/modules/workflows/lib/run-event-tone.js.map +7 -0
  651. package/dist/modules/workflows/lib/run-execution.js +305 -0
  652. package/dist/modules/workflows/lib/run-execution.js.map +7 -0
  653. package/dist/modules/workflows/lib/run-gantt.js +180 -0
  654. package/dist/modules/workflows/lib/run-gantt.js.map +7 -0
  655. package/dist/modules/workflows/lib/run-outcome-evidence.js +33 -0
  656. package/dist/modules/workflows/lib/run-outcome-evidence.js.map +7 -0
  657. package/dist/modules/workflows/lib/run-outcome.js +48 -0
  658. package/dist/modules/workflows/lib/run-outcome.js.map +7 -0
  659. package/dist/modules/workflows/lib/sample-resolver.js +71 -0
  660. package/dist/modules/workflows/lib/sample-resolver.js.map +7 -0
  661. package/dist/modules/workflows/lib/seeds.js +1 -1
  662. package/dist/modules/workflows/lib/seeds.js.map +2 -2
  663. package/dist/modules/workflows/lib/server-output-contract.js +65 -0
  664. package/dist/modules/workflows/lib/server-output-contract.js.map +7 -0
  665. package/dist/modules/workflows/lib/set-variable.js +47 -0
  666. package/dist/modules/workflows/lib/set-variable.js.map +7 -0
  667. package/dist/modules/workflows/lib/signal-handler.js +63 -4
  668. package/dist/modules/workflows/lib/signal-handler.js.map +2 -2
  669. package/dist/modules/workflows/lib/start-fixtures.js +42 -0
  670. package/dist/modules/workflows/lib/start-fixtures.js.map +7 -0
  671. package/dist/modules/workflows/lib/status-colors.js +153 -22
  672. package/dist/modules/workflows/lib/status-colors.js.map +2 -2
  673. package/dist/modules/workflows/lib/step-handler.js +529 -53
  674. package/dist/modules/workflows/lib/step-handler.js.map +3 -3
  675. package/dist/modules/workflows/lib/step-presentation.js +147 -0
  676. package/dist/modules/workflows/lib/step-presentation.js.map +7 -0
  677. package/dist/modules/workflows/lib/step-through.js +26 -0
  678. package/dist/modules/workflows/lib/step-through.js.map +7 -0
  679. package/dist/modules/workflows/lib/step-type-conversion.js +167 -0
  680. package/dist/modules/workflows/lib/step-type-conversion.js.map +7 -0
  681. package/dist/modules/workflows/lib/subgraph-clipboard.js +114 -0
  682. package/dist/modules/workflows/lib/subgraph-clipboard.js.map +7 -0
  683. package/dist/modules/workflows/lib/task-decision-context.js +38 -0
  684. package/dist/modules/workflows/lib/task-decision-context.js.map +7 -0
  685. package/dist/modules/workflows/lib/task-decisions.js +49 -0
  686. package/dist/modules/workflows/lib/task-decisions.js.map +7 -0
  687. package/dist/modules/workflows/lib/task-entity-access.js +62 -0
  688. package/dist/modules/workflows/lib/task-entity-access.js.map +7 -0
  689. package/dist/modules/workflows/lib/task-entity-aliases.js +39 -0
  690. package/dist/modules/workflows/lib/task-entity-aliases.js.map +7 -0
  691. package/dist/modules/workflows/lib/task-entity-types.js +36 -0
  692. package/dist/modules/workflows/lib/task-entity-types.js.map +7 -0
  693. package/dist/modules/workflows/lib/task-form-registry.js +33 -0
  694. package/dist/modules/workflows/lib/task-form-registry.js.map +7 -0
  695. package/dist/modules/workflows/lib/task-form-schema.js +75 -0
  696. package/dist/modules/workflows/lib/task-form-schema.js.map +7 -0
  697. package/dist/modules/workflows/lib/task-handler.js +251 -32
  698. package/dist/modules/workflows/lib/task-handler.js.map +2 -2
  699. package/dist/modules/workflows/lib/task-inspector-config.js +182 -0
  700. package/dist/modules/workflows/lib/task-inspector-config.js.map +7 -0
  701. package/dist/modules/workflows/lib/task-list-query.js +19 -0
  702. package/dist/modules/workflows/lib/task-list-query.js.map +7 -0
  703. package/dist/modules/workflows/lib/task-notifications.js +119 -0
  704. package/dist/modules/workflows/lib/task-notifications.js.map +7 -0
  705. package/dist/modules/workflows/lib/task-permission-settings.js +43 -0
  706. package/dist/modules/workflows/lib/task-permission-settings.js.map +7 -0
  707. package/dist/modules/workflows/lib/task-presets.js +35 -0
  708. package/dist/modules/workflows/lib/task-presets.js.map +7 -0
  709. package/dist/modules/workflows/lib/task-quick-action.js +45 -0
  710. package/dist/modules/workflows/lib/task-quick-action.js.map +7 -0
  711. package/dist/modules/workflows/lib/task-resolution.js +120 -0
  712. package/dist/modules/workflows/lib/task-resolution.js.map +7 -0
  713. package/dist/modules/workflows/lib/task-sla.js +357 -0
  714. package/dist/modules/workflows/lib/task-sla.js.map +7 -0
  715. package/dist/modules/workflows/lib/task-visibility-request.js +266 -0
  716. package/dist/modules/workflows/lib/task-visibility-request.js.map +7 -0
  717. package/dist/modules/workflows/lib/task-visibility.js +194 -0
  718. package/dist/modules/workflows/lib/task-visibility.js.map +7 -0
  719. package/dist/modules/workflows/lib/timer-handler.js +3 -1
  720. package/dist/modules/workflows/lib/timer-handler.js.map +2 -2
  721. package/dist/modules/workflows/lib/transition-handler.js +148 -20
  722. package/dist/modules/workflows/lib/transition-handler.js.map +2 -2
  723. package/dist/modules/workflows/lib/trigger-node.js +121 -0
  724. package/dist/modules/workflows/lib/trigger-node.js.map +7 -0
  725. package/dist/modules/workflows/lib/visual-editor-navigation.js +14 -0
  726. package/dist/modules/workflows/lib/visual-editor-navigation.js.map +7 -0
  727. package/dist/modules/workflows/lib/work-inbox/empty-state.js +52 -0
  728. package/dist/modules/workflows/lib/work-inbox/empty-state.js.map +7 -0
  729. package/dist/modules/workflows/lib/work-inbox/entity-links.js +63 -0
  730. package/dist/modules/workflows/lib/work-inbox/entity-links.js.map +7 -0
  731. package/dist/modules/workflows/lib/work-inbox/navigation.js +11 -0
  732. package/dist/modules/workflows/lib/work-inbox/navigation.js.map +7 -0
  733. package/dist/modules/workflows/lib/work-inbox/presentation.js +90 -0
  734. package/dist/modules/workflows/lib/work-inbox/presentation.js.map +7 -0
  735. package/dist/modules/workflows/lib/work-inbox/provider.js +118 -0
  736. package/dist/modules/workflows/lib/work-inbox/provider.js.map +7 -0
  737. package/dist/modules/workflows/lib/work-inbox/query.js +70 -0
  738. package/dist/modules/workflows/lib/work-inbox/query.js.map +7 -0
  739. package/dist/modules/workflows/lib/work-inbox/service.js +56 -0
  740. package/dist/modules/workflows/lib/work-inbox/service.js.map +7 -0
  741. package/dist/modules/workflows/lib/work-inbox/user-task-source.js +149 -0
  742. package/dist/modules/workflows/lib/work-inbox/user-task-source.js.map +7 -0
  743. package/dist/modules/workflows/lib/workflow-command-enablement.js +57 -0
  744. package/dist/modules/workflows/lib/workflow-command-enablement.js.map +7 -0
  745. package/dist/modules/workflows/lib/workflow-command-settings.js +54 -0
  746. package/dist/modules/workflows/lib/workflow-command-settings.js.map +7 -0
  747. package/dist/modules/workflows/lib/workflow-executor.js +658 -6
  748. package/dist/modules/workflows/lib/workflow-executor.js.map +2 -2
  749. package/dist/modules/workflows/lib/workflow-function-registry.js +40 -0
  750. package/dist/modules/workflows/lib/workflow-function-registry.js.map +7 -0
  751. package/dist/modules/workflows/lib/workflow-safe-commands.js +11 -1
  752. package/dist/modules/workflows/lib/workflow-safe-commands.js.map +2 -2
  753. package/dist/modules/workflows/lib/workflow-templates.js +69 -0
  754. package/dist/modules/workflows/lib/workflow-templates.js.map +7 -0
  755. package/dist/modules/workflows/migrations/Migration20260626214855_workflows.js +15 -0
  756. package/dist/modules/workflows/migrations/Migration20260626214855_workflows.js.map +7 -0
  757. package/dist/modules/workflows/migrations/Migration20260626222424_workflows.js +17 -0
  758. package/dist/modules/workflows/migrations/Migration20260626222424_workflows.js.map +7 -0
  759. package/dist/modules/workflows/migrations/Migration20260727074335_workflows.js +15 -0
  760. package/dist/modules/workflows/migrations/Migration20260727074335_workflows.js.map +7 -0
  761. package/dist/modules/workflows/migrations/Migration20260728104038_workflows.js +13 -0
  762. package/dist/modules/workflows/migrations/Migration20260728104038_workflows.js.map +7 -0
  763. package/dist/modules/workflows/migrations/Migration20260728163001_workflows.js +15 -0
  764. package/dist/modules/workflows/migrations/Migration20260728163001_workflows.js.map +7 -0
  765. package/dist/modules/workflows/migrations/Migration20260729061736_workflows.js +13 -0
  766. package/dist/modules/workflows/migrations/Migration20260729061736_workflows.js.map +7 -0
  767. package/dist/modules/workflows/migrations/Migration20260729192652_workflows.js +12 -0
  768. package/dist/modules/workflows/migrations/Migration20260729192652_workflows.js.map +7 -0
  769. package/dist/modules/workflows/migrations/Migration20260730085000_workflows.js +13 -0
  770. package/dist/modules/workflows/migrations/Migration20260730085000_workflows.js.map +7 -0
  771. package/dist/modules/workflows/migrations/Migration20260730092706_workflows.js +13 -0
  772. package/dist/modules/workflows/migrations/Migration20260730092706_workflows.js.map +7 -0
  773. package/dist/modules/workflows/notifications.js +38 -10
  774. package/dist/modules/workflows/notifications.js.map +2 -2
  775. package/dist/modules/workflows/setup.js +81 -1
  776. package/dist/modules/workflows/setup.js.map +2 -2
  777. package/dist/modules/workflows/subscribers/task-assigned-notification.js +19 -27
  778. package/dist/modules/workflows/subscribers/task-assigned-notification.js.map +2 -2
  779. package/dist/modules/workflows/subscribers/task-deadline-breached-notification.js +24 -0
  780. package/dist/modules/workflows/subscribers/task-deadline-breached-notification.js.map +7 -0
  781. package/dist/modules/workflows/subscribers/task-reminder-notification.js +24 -0
  782. package/dist/modules/workflows/subscribers/task-reminder-notification.js.map +7 -0
  783. package/dist/modules/workflows/widgets/injection/pending-work/widget.client.js +73 -0
  784. package/dist/modules/workflows/widgets/injection/pending-work/widget.client.js.map +7 -0
  785. package/dist/modules/workflows/widgets/injection/pending-work/widget.js +17 -0
  786. package/dist/modules/workflows/widgets/injection/pending-work/widget.js.map +7 -0
  787. package/dist/modules/workflows/widgets/injection-table.js +26 -0
  788. package/dist/modules/workflows/widgets/injection-table.js.map +2 -2
  789. package/dist/modules/workflows/workers/workflow-activities.worker.js +61 -39
  790. package/dist/modules/workflows/workers/workflow-activities.worker.js.map +2 -2
  791. package/dist/modules/workflows/workers/workflow-definition-metric-rollup.worker.js +40 -0
  792. package/dist/modules/workflows/workers/workflow-definition-metric-rollup.worker.js.map +7 -0
  793. package/dist/modules/workflows/workers/workflow-instance-bulk-replay.js +43 -0
  794. package/dist/modules/workflows/workers/workflow-instance-bulk-replay.js.map +7 -0
  795. package/dist/modules/workflows/workers/workflow-invoke-agent.worker.js +30 -0
  796. package/dist/modules/workflows/workers/workflow-invoke-agent.worker.js.map +7 -0
  797. package/generated/entities/action_log/index.ts +1 -0
  798. package/generated/entities/user/index.ts +1 -0
  799. package/generated/entities/user_task/index.ts +7 -0
  800. package/generated/entities/workflow_definition/index.ts +3 -0
  801. package/generated/entities/workflow_definition_draft/index.ts +11 -0
  802. package/generated/entities/workflow_definition_metric_rollup/index.ts +10 -0
  803. package/generated/entities/workflow_instance/index.ts +2 -0
  804. package/generated/entities.ids.generated.ts +4 -1
  805. package/generated/entity-fields-registry.ts +39 -0
  806. package/jest.setup.ts +13 -0
  807. package/package.json +8 -7
  808. package/src/bootstrap.ts +13 -3
  809. package/src/helpers/integration/workflowsFixtures.ts +765 -5
  810. package/src/helpers/integration/workflowsUi.ts +318 -0
  811. package/src/modules/attachments/lib/createFromBuffer.ts +120 -0
  812. package/src/modules/audit_logs/data/entities.ts +12 -0
  813. package/src/modules/audit_logs/data/validators.ts +1 -0
  814. package/src/modules/audit_logs/lib/projections.ts +5 -1
  815. package/src/modules/audit_logs/migrations/.snapshot-open-mercato.json +26 -0
  816. package/src/modules/audit_logs/migrations/Migration20260625120000.ts +15 -0
  817. package/src/modules/audit_logs/services/actionLogService.ts +3 -0
  818. package/src/modules/auth/data/entities.ts +21 -0
  819. package/src/modules/auth/i18n/de.json +31 -0
  820. package/src/modules/auth/i18n/en.json +31 -0
  821. package/src/modules/auth/i18n/es.json +31 -0
  822. package/src/modules/auth/i18n/ko.json +31 -0
  823. package/src/modules/auth/i18n/pl.json +31 -0
  824. package/src/modules/auth/lib/executionPrincipal.ts +235 -0
  825. package/src/modules/auth/migrations/.snapshot-open-mercato.json +16 -0
  826. package/src/modules/auth/migrations/Migration20260625050000.ts +21 -0
  827. package/src/modules/business_rules/components/InlineRuleEditor.tsx +231 -0
  828. package/src/modules/business_rules/data/validators.ts +6 -0
  829. package/src/modules/business_rules/i18n/de.json +4 -0
  830. package/src/modules/business_rules/i18n/en.json +4 -0
  831. package/src/modules/business_rules/i18n/es.json +4 -0
  832. package/src/modules/business_rules/i18n/ko.json +4 -0
  833. package/src/modules/business_rules/i18n/pl.json +4 -0
  834. package/src/modules/business_rules/lib/rule-engine.ts +15 -1
  835. package/src/modules/catalog/commands/products.ts +12 -0
  836. package/src/modules/catalog/i18n/de.json +1 -0
  837. package/src/modules/catalog/i18n/en.json +1 -0
  838. package/src/modules/catalog/i18n/es.json +1 -0
  839. package/src/modules/catalog/i18n/ko.json +1 -0
  840. package/src/modules/catalog/i18n/pl.json +1 -0
  841. package/src/modules/catalog/workflows.ts +35 -0
  842. package/src/modules/customer_accounts/AGENTS.md +11 -0
  843. package/src/modules/customer_accounts/backend/customer_accounts/roles/[id]/page.tsx +2 -0
  844. package/src/modules/customer_accounts/cli.ts +96 -0
  845. package/src/modules/customer_accounts/i18n/de.json +5 -0
  846. package/src/modules/customer_accounts/i18n/en.json +5 -0
  847. package/src/modules/customer_accounts/i18n/es.json +5 -0
  848. package/src/modules/customer_accounts/i18n/ko.json +5 -0
  849. package/src/modules/customer_accounts/i18n/pl.json +5 -0
  850. package/src/modules/customer_accounts/lib/customerRoleAclSync.ts +92 -0
  851. package/src/modules/customer_accounts/setup.ts +15 -3
  852. package/src/modules/customers/commands/deals.ts +5 -0
  853. package/src/modules/customers/components/detail/ChangelogEntryRow.tsx +4 -2
  854. package/src/modules/customers/components/detail/utils.ts +2 -0
  855. package/src/modules/customers/events.ts +21 -3
  856. package/src/modules/customers/i18n/de.json +4 -0
  857. package/src/modules/customers/i18n/en.json +4 -0
  858. package/src/modules/customers/i18n/es.json +4 -0
  859. package/src/modules/customers/i18n/ko.json +4 -0
  860. package/src/modules/customers/i18n/pl.json +4 -0
  861. package/src/modules/customers/lib/link-workflow-task-handler.ts +136 -0
  862. package/src/modules/customers/lib/todoCompatibility.ts +4 -1
  863. package/src/modules/customers/lib/workflowTaskLink.ts +23 -0
  864. package/src/modules/customers/subscribers/link-workflow-task.ts +19 -0
  865. package/src/modules/customers/workflows.ts +57 -0
  866. package/src/modules/entities/api/records.ts +18 -62
  867. package/src/modules/entities/lib/entityClassification.ts +102 -0
  868. package/src/modules/sales/commands/documents.ts +46 -0
  869. package/src/modules/sales/events.ts +20 -2
  870. package/src/modules/sales/i18n/de.json +2 -1
  871. package/src/modules/sales/i18n/en.json +2 -1
  872. package/src/modules/sales/i18n/es.json +2 -1
  873. package/src/modules/sales/i18n/ko.json +2 -1
  874. package/src/modules/sales/i18n/pl.json +2 -1
  875. package/src/modules/sales/workflows.ts +12 -1
  876. package/src/modules/seeds/README.md +86 -0
  877. package/src/modules/seeds/cli.ts +220 -0
  878. package/src/modules/seeds/examples/sample-seed.json +26 -0
  879. package/src/modules/seeds/index.ts +11 -0
  880. package/src/modules/workflows/AGENTS.md +851 -10
  881. package/src/modules/workflows/acl.ts +96 -0
  882. package/src/modules/workflows/ai-agents.ts +80 -0
  883. package/src/modules/workflows/ai-tools/authoring-pack.ts +798 -0
  884. package/src/modules/workflows/ai-tools/types.ts +117 -0
  885. package/src/modules/workflows/ai-tools.ts +20 -0
  886. package/src/modules/workflows/api/command-settings/route.ts +171 -0
  887. package/src/modules/workflows/api/commands/route.ts +109 -0
  888. package/src/modules/workflows/api/definitions/[id]/callers/route.ts +95 -0
  889. package/src/modules/workflows/api/definitions/[id]/context-schema/route.ts +187 -0
  890. package/src/modules/workflows/api/definitions/[id]/customize/route.ts +6 -1
  891. package/src/modules/workflows/api/definitions/[id]/draft/route.ts +395 -0
  892. package/src/modules/workflows/api/definitions/[id]/publish/route.ts +250 -0
  893. package/src/modules/workflows/api/definitions/[id]/reset-to-code/route.ts +5 -0
  894. package/src/modules/workflows/api/definitions/[id]/route.ts +107 -7
  895. package/src/modules/workflows/api/definitions/[id]/test-step/route.ts +288 -0
  896. package/src/modules/workflows/api/definitions/generate/route.ts +335 -0
  897. package/src/modules/workflows/api/definitions/route.ts +88 -113
  898. package/src/modules/workflows/api/definitions/serialize.ts +9 -0
  899. package/src/modules/workflows/api/endpoints/route.ts +88 -0
  900. package/src/modules/workflows/api/functions/route.ts +91 -0
  901. package/src/modules/workflows/api/grantable-features/route.ts +102 -0
  902. package/src/modules/workflows/api/instances/[id]/context/route.ts +214 -0
  903. package/src/modules/workflows/api/instances/[id]/rerun-step/route.ts +226 -0
  904. package/src/modules/workflows/api/instances/[id]/retry/route.ts +18 -2
  905. package/src/modules/workflows/api/instances/[id]/step-through/route.ts +195 -0
  906. package/src/modules/workflows/api/instances/[id]/steps/route.ts +160 -0
  907. package/src/modules/workflows/api/instances/[id]/would-do/route.ts +216 -0
  908. package/src/modules/workflows/api/instances/bulk-replay/route.ts +141 -0
  909. package/src/modules/workflows/api/instances/failure-queue/route.ts +197 -0
  910. package/src/modules/workflows/api/instances/route.ts +135 -3
  911. package/src/modules/workflows/api/metrics/definitions/route.ts +262 -0
  912. package/src/modules/workflows/api/openapi.ts +549 -2
  913. package/src/modules/workflows/api/portal/tasks/[id]/complete/route.ts +160 -0
  914. package/src/modules/workflows/api/portal/tasks/[id]/route.ts +124 -0
  915. package/src/modules/workflows/api/portal/tasks/route.ts +157 -0
  916. package/src/modules/workflows/api/rule-usage/route.ts +94 -0
  917. package/src/modules/workflows/api/task-settings/route.ts +138 -0
  918. package/src/modules/workflows/api/tasks/[id]/claim/route.ts +42 -17
  919. package/src/modules/workflows/api/tasks/[id]/complete/route.ts +47 -15
  920. package/src/modules/workflows/api/tasks/[id]/reassign/route.ts +197 -0
  921. package/src/modules/workflows/api/tasks/[id]/route.ts +57 -6
  922. package/src/modules/workflows/api/tasks/[id]/unclaim/route.ts +132 -0
  923. package/src/modules/workflows/api/tasks/route.ts +60 -5
  924. package/src/modules/workflows/api/tasks/serialize.ts +119 -0
  925. package/src/modules/workflows/api/templates/route.ts +87 -0
  926. package/src/modules/workflows/api/work-inbox/next/route.ts +170 -0
  927. package/src/modules/workflows/api/work-inbox/route.ts +153 -0
  928. package/src/modules/workflows/backend/config/workflows/page.meta.ts +33 -0
  929. package/src/modules/workflows/backend/config/workflows/page.tsx +12 -0
  930. package/src/modules/workflows/backend/definitions/[id]/page.tsx +19 -343
  931. package/src/modules/workflows/backend/definitions/create/page.meta.ts +1 -1
  932. package/src/modules/workflows/backend/definitions/create/page.tsx +19 -59
  933. package/src/modules/workflows/backend/definitions/page.tsx +156 -76
  934. package/src/modules/workflows/backend/definitions/visual-editor/page.tsx +3129 -584
  935. package/src/modules/workflows/backend/instances/[id]/page.meta.ts +1 -1
  936. package/src/modules/workflows/backend/instances/[id]/page.tsx +711 -539
  937. package/src/modules/workflows/backend/instances/failure-queue/page.meta.ts +16 -0
  938. package/src/modules/workflows/backend/instances/failure-queue/page.tsx +311 -0
  939. package/src/modules/workflows/backend/instances/page.meta.ts +1 -1
  940. package/src/modules/workflows/backend/instances/page.tsx +218 -38
  941. package/src/modules/workflows/backend/tasks/[id]/page.tsx +639 -400
  942. package/src/modules/workflows/backend/tasks/page.meta.ts +7 -0
  943. package/src/modules/workflows/backend/tasks/page.tsx +20 -333
  944. package/src/modules/workflows/backend/work-inbox/page.meta.ts +15 -0
  945. package/src/modules/workflows/backend/work-inbox/page.tsx +506 -0
  946. package/src/modules/workflows/cli.ts +1 -1
  947. package/src/modules/workflows/commands/tasks.ts +146 -0
  948. package/src/modules/workflows/components/ActivitiesEditor.tsx +91 -114
  949. package/src/modules/workflows/components/ActivityEditDialog.tsx +244 -0
  950. package/src/modules/workflows/components/AgentSelector.tsx +200 -0
  951. package/src/modules/workflows/components/AnnotationEditDialog.tsx +157 -0
  952. package/src/modules/workflows/components/BusinessRuleUsagePanel.tsx +106 -0
  953. package/src/modules/workflows/components/BusinessRulesSelector.tsx +71 -17
  954. package/src/modules/workflows/components/ConfigJsonTextarea.tsx +111 -0
  955. package/src/modules/workflows/components/ContextSchemaEditor.tsx +165 -0
  956. package/src/modules/workflows/components/DefinitionErrorHandlerField.tsx +133 -0
  957. package/src/modules/workflows/components/DefinitionMetadataDrawer.tsx +456 -0
  958. package/src/modules/workflows/components/DefinitionMetricsCells.tsx +212 -0
  959. package/src/modules/workflows/components/DefinitionTriggersEditor.tsx +196 -95
  960. package/src/modules/workflows/components/EdgeEditDialog.tsx +15 -16
  961. package/src/modules/workflows/components/EdgeEditDialogCrudForm.tsx +130 -80
  962. package/src/modules/workflows/components/InputDataPanel.tsx +177 -0
  963. package/src/modules/workflows/components/InspectorPanel.tsx +250 -0
  964. package/src/modules/workflows/components/NodeEditDialog.tsx +444 -38
  965. package/src/modules/workflows/components/NodeEditDialogCrudForm.tsx +848 -178
  966. package/src/modules/workflows/components/StepsEditor.tsx +9 -2
  967. package/src/modules/workflows/components/TemplateGalleryDialog.tsx +205 -0
  968. package/src/modules/workflows/components/TransitionsEditor.tsx +98 -89
  969. package/src/modules/workflows/components/TriggersDialog.tsx +83 -0
  970. package/src/modules/workflows/components/TriggersEditor.tsx +363 -0
  971. package/src/modules/workflows/components/WorkflowAiDraftDialog.tsx +383 -0
  972. package/src/modules/workflows/components/WorkflowCodeView.tsx +257 -0
  973. package/src/modules/workflows/components/WorkflowCommandPalette.tsx +82 -0
  974. package/src/modules/workflows/components/WorkflowCompensationGhostEdge.tsx +78 -0
  975. package/src/modules/workflows/components/WorkflowDataMappingEdge.tsx +46 -0
  976. package/src/modules/workflows/components/WorkflowGraph.tsx +54 -1
  977. package/src/modules/workflows/components/WorkflowGraphImpl.tsx +463 -37
  978. package/src/modules/workflows/components/WorkflowIconPicker.tsx +144 -0
  979. package/src/modules/workflows/components/WorkflowLegend.tsx +59 -33
  980. package/src/modules/workflows/components/WorkflowNodeCard.tsx +355 -28
  981. package/src/modules/workflows/components/WorkflowRouteChips.tsx +145 -0
  982. package/src/modules/workflows/components/WorkflowSelector.tsx +33 -14
  983. package/src/modules/workflows/components/WorkflowTransitionEdge.tsx +83 -10
  984. package/src/modules/workflows/components/WorkflowTransitionLabel.tsx +13 -2
  985. package/src/modules/workflows/components/fields/ActivityArrayEditor.tsx +120 -30
  986. package/src/modules/workflows/components/fields/ActivityConfigFields.tsx +675 -0
  987. package/src/modules/workflows/components/fields/ActivityTestPanel.tsx +250 -0
  988. package/src/modules/workflows/components/fields/AgentInvokeConfigField.tsx +580 -0
  989. package/src/modules/workflows/components/fields/AgentReviewOnBreachField.tsx +88 -0
  990. package/src/modules/workflows/components/fields/BranchingRoutesEditor.tsx +323 -0
  991. package/src/modules/workflows/components/fields/BusinessRuleConditionsEditor.tsx +36 -4
  992. package/src/modules/workflows/components/fields/CommandPicker.tsx +158 -0
  993. package/src/modules/workflows/components/fields/EndpointPicker.tsx +330 -0
  994. package/src/modules/workflows/components/fields/FormFieldArrayEditor.tsx +2 -2
  995. package/src/modules/workflows/components/fields/FunctionPicker.tsx +68 -0
  996. package/src/modules/workflows/components/fields/MappingArrayEditor.tsx +46 -12
  997. package/src/modules/workflows/components/fields/PortFieldArrayEditor.tsx +255 -0
  998. package/src/modules/workflows/components/fields/RolesMultiSelect.tsx +68 -0
  999. package/src/modules/workflows/components/fields/RouteOrderEditor.tsx +169 -0
  1000. package/src/modules/workflows/components/fields/SchemaBuilderDialog.tsx +139 -0
  1001. package/src/modules/workflows/components/fields/StartPreConditionsEditor.tsx +2 -2
  1002. package/src/modules/workflows/components/fields/TaskAssignmentField.tsx +355 -0
  1003. package/src/modules/workflows/components/fields/TaskDeadlineFields.tsx +172 -0
  1004. package/src/modules/workflows/components/fields/TaskDecisionsField.tsx +294 -0
  1005. package/src/modules/workflows/components/fields/TaskEntityBindingsField.tsx +156 -0
  1006. package/src/modules/workflows/components/fields/TemplateTextControl.tsx +85 -0
  1007. package/src/modules/workflows/components/fields/VariablePickerButton.tsx +177 -0
  1008. package/src/modules/workflows/components/fields/ledgerDropTarget.ts +55 -0
  1009. package/src/modules/workflows/components/fields/useActivityTypeOptions.ts +19 -0
  1010. package/src/modules/workflows/components/formConfig.tsx +84 -10
  1011. package/src/modules/workflows/components/mobile/MobileDefinitionDetail.tsx +5 -0
  1012. package/src/modules/workflows/components/mobile/MobileMetadataSheet.tsx +10 -0
  1013. package/src/modules/workflows/components/mobile/MobileTaskForm.tsx +55 -19
  1014. package/src/modules/workflows/components/mobile/MobileVisualEditor.tsx +49 -40
  1015. package/src/modules/workflows/components/nodes/AnnotationGroupNode.tsx +81 -0
  1016. package/src/modules/workflows/components/nodes/AutomatedNode.tsx +34 -17
  1017. package/src/modules/workflows/components/nodes/EndNode.tsx +15 -14
  1018. package/src/modules/workflows/components/nodes/ErrorOutputHandle.tsx +32 -0
  1019. package/src/modules/workflows/components/nodes/IfElseNode.tsx +64 -0
  1020. package/src/modules/workflows/components/nodes/InvokeAgentNode.tsx +180 -0
  1021. package/src/modules/workflows/components/nodes/NodeOutcomeRows.tsx +143 -0
  1022. package/src/modules/workflows/components/nodes/ParallelForkNode.tsx +28 -15
  1023. package/src/modules/workflows/components/nodes/ParallelJoinNode.tsx +28 -15
  1024. package/src/modules/workflows/components/nodes/StartNode.tsx +78 -18
  1025. package/src/modules/workflows/components/nodes/StickyNoteNode.tsx +65 -0
  1026. package/src/modules/workflows/components/nodes/SubWorkflowNode.tsx +124 -23
  1027. package/src/modules/workflows/components/nodes/SwitchNode.tsx +64 -0
  1028. package/src/modules/workflows/components/nodes/TriggerCap.tsx +103 -0
  1029. package/src/modules/workflows/components/nodes/TriggerNode.tsx +151 -0
  1030. package/src/modules/workflows/components/nodes/UserTaskNode.tsx +67 -22
  1031. package/src/modules/workflows/components/nodes/WaitForConditionNode.tsx +74 -0
  1032. package/src/modules/workflows/components/nodes/WaitForSignalNode.tsx +31 -17
  1033. package/src/modules/workflows/components/nodes/WaitForTimerNode.tsx +31 -16
  1034. package/src/modules/workflows/components/nodes/index.ts +17 -0
  1035. package/src/modules/workflows/components/portal/PortalTaskForm.tsx +280 -0
  1036. package/src/modules/workflows/components/run/AgentActivityPanel.tsx +48 -0
  1037. package/src/modules/workflows/components/run/RerunStepDialog.tsx +133 -0
  1038. package/src/modules/workflows/components/run/RunEventBadge.tsx +37 -0
  1039. package/src/modules/workflows/components/run/RunGantt.tsx +180 -0
  1040. package/src/modules/workflows/components/run/RunStatusBadge.tsx +112 -0
  1041. package/src/modules/workflows/components/run/RunStepInspector.tsx +176 -0
  1042. package/src/modules/workflows/components/run/WouldDoReport.tsx +93 -0
  1043. package/src/modules/workflows/components/run/useAgentLabels.ts +42 -0
  1044. package/src/modules/workflows/components/run/useLastRunOverlay.ts +150 -0
  1045. package/src/modules/workflows/components/run/useLiveAgentActions.ts +70 -0
  1046. package/src/modules/workflows/components/run/useLiveRunUpdates.ts +89 -0
  1047. package/src/modules/workflows/components/settings/CommandSettingsPageClient.tsx +228 -0
  1048. package/src/modules/workflows/components/work-inbox/EntityContextPanel.tsx +179 -0
  1049. package/src/modules/workflows/components/work-inbox/ReassignTaskDialog.tsx +203 -0
  1050. package/src/modules/workflows/components/work-inbox/StatusChip.tsx +61 -0
  1051. package/src/modules/workflows/components/work-inbox/TaskActionNotice.tsx +77 -0
  1052. package/src/modules/workflows/components/work-inbox/TaskFormFields.tsx +322 -0
  1053. package/src/modules/workflows/components/work-inbox/WorkInboxEmptyState.tsx +43 -0
  1054. package/src/modules/workflows/data/activity-config-schemas.ts +249 -0
  1055. package/src/modules/workflows/data/activity-config-warnings.ts +71 -0
  1056. package/src/modules/workflows/data/branching-route-warnings.ts +129 -0
  1057. package/src/modules/workflows/data/entities.ts +397 -4
  1058. package/src/modules/workflows/data/metrics-validators.ts +51 -0
  1059. package/src/modules/workflows/data/task-primitives.ts +36 -0
  1060. package/src/modules/workflows/data/types.ts +81 -2
  1061. package/src/modules/workflows/data/validators.ts +729 -60
  1062. package/src/modules/workflows/di.ts +22 -0
  1063. package/src/modules/workflows/events.ts +68 -8
  1064. package/src/modules/workflows/examples/oze-residential-install-60-nodes.json +1545 -0
  1065. package/src/modules/workflows/examples/sales-pipeline-definition.json +35 -35
  1066. package/src/modules/workflows/examples/templates/lead-to-install.json +160 -0
  1067. package/src/modules/workflows/examples/templates/order-approval.json +230 -0
  1068. package/src/modules/workflows/examples/templates/task-escalation.json +110 -0
  1069. package/src/modules/workflows/examples/templates/webhook-integration.json +113 -0
  1070. package/src/modules/workflows/extension-points.ts +1 -1
  1071. package/src/modules/workflows/frontend/[orgSlug]/portal/tasks/[id]/page.meta.ts +21 -0
  1072. package/src/modules/workflows/frontend/[orgSlug]/portal/tasks/[id]/page.tsx +212 -0
  1073. package/src/modules/workflows/frontend/[orgSlug]/portal/tasks/page.meta.ts +25 -0
  1074. package/src/modules/workflows/frontend/[orgSlug]/portal/tasks/page.tsx +185 -0
  1075. package/src/modules/workflows/i18n/de.json +1083 -24
  1076. package/src/modules/workflows/i18n/en.json +1081 -22
  1077. package/src/modules/workflows/i18n/es.json +1083 -24
  1078. package/src/modules/workflows/i18n/ko.json +1072 -13
  1079. package/src/modules/workflows/i18n/pl.json +1082 -23
  1080. package/src/modules/workflows/lib/activity-executor.ts +855 -186
  1081. package/src/modules/workflows/lib/activity-queue-types.ts +120 -1
  1082. package/src/modules/workflows/lib/activity-registry-bootstrap.ts +7 -0
  1083. package/src/modules/workflows/lib/activity-registry.ts +89 -0
  1084. package/src/modules/workflows/lib/activity-types.ts +415 -0
  1085. package/src/modules/workflows/lib/activity-worker-handler.ts +744 -35
  1086. package/src/modules/workflows/lib/advanced-config.ts +41 -0
  1087. package/src/modules/workflows/lib/agent-disposition-task.ts +343 -0
  1088. package/src/modules/workflows/lib/agent-outcome-paths.ts +153 -0
  1089. package/src/modules/workflows/lib/agent-result-mapping.ts +88 -0
  1090. package/src/modules/workflows/lib/agent-review-inspector.ts +125 -0
  1091. package/src/modules/workflows/lib/agent-review.ts +171 -0
  1092. package/src/modules/workflows/lib/ai-authoring.ts +402 -0
  1093. package/src/modules/workflows/lib/ai-draft-runner.ts +105 -0
  1094. package/src/modules/workflows/lib/annotation-events.ts +15 -0
  1095. package/src/modules/workflows/lib/branching-routes.ts +280 -0
  1096. package/src/modules/workflows/lib/breach-routing.ts +142 -0
  1097. package/src/modules/workflows/lib/bulk-replay.ts +185 -0
  1098. package/src/modules/workflows/lib/business-rule-usage.ts +154 -0
  1099. package/src/modules/workflows/lib/caller-graph.ts +104 -0
  1100. package/src/modules/workflows/lib/code-view-apply.ts +178 -0
  1101. package/src/modules/workflows/lib/collect-validation-issues.ts +239 -0
  1102. package/src/modules/workflows/lib/compensation-ghosts.ts +134 -0
  1103. package/src/modules/workflows/lib/component-guard.ts +13 -0
  1104. package/src/modules/workflows/lib/condition-handler.ts +658 -0
  1105. package/src/modules/workflows/lib/context-ledger.ts +814 -0
  1106. package/src/modules/workflows/lib/crud-form-dialogs-flag.ts +5 -0
  1107. package/src/modules/workflows/lib/data-edge-mapping.ts +112 -0
  1108. package/src/modules/workflows/lib/definition-context-schema.ts +103 -0
  1109. package/src/modules/workflows/lib/definition-edit-safety.ts +228 -0
  1110. package/src/modules/workflows/lib/definition-error-body.ts +43 -0
  1111. package/src/modules/workflows/lib/definition-evaluation.ts +156 -0
  1112. package/src/modules/workflows/lib/definition-grant.ts +211 -0
  1113. package/src/modules/workflows/lib/definition-json-locations.ts +226 -0
  1114. package/src/modules/workflows/lib/definition-payload.ts +81 -0
  1115. package/src/modules/workflows/lib/draft-restore.ts +72 -0
  1116. package/src/modules/workflows/lib/dry-run.ts +203 -0
  1117. package/src/modules/workflows/lib/duration.ts +138 -24
  1118. package/src/modules/workflows/lib/edge-reattachment.ts +186 -0
  1119. package/src/modules/workflows/lib/edgeFormTransforms.ts +15 -14
  1120. package/src/modules/workflows/lib/editor-annotations.ts +301 -0
  1121. package/src/modules/workflows/lib/editor-commands.ts +205 -0
  1122. package/src/modules/workflows/lib/editor-history.ts +151 -0
  1123. package/src/modules/workflows/lib/endpoint-catalog.ts +283 -0
  1124. package/src/modules/workflows/lib/endpoint-path.ts +134 -0
  1125. package/src/modules/workflows/lib/engine-version.ts +67 -0
  1126. package/src/modules/workflows/lib/error-handler.ts +192 -0
  1127. package/src/modules/workflows/lib/error-routing.ts +236 -0
  1128. package/src/modules/workflows/lib/event-logger.ts +27 -0
  1129. package/src/modules/workflows/lib/expression-refs.ts +291 -0
  1130. package/src/modules/workflows/lib/failure-grouping.ts +134 -0
  1131. package/src/modules/workflows/lib/find-definition.ts +4 -0
  1132. package/src/modules/workflows/lib/flow-logic-warnings.ts +591 -0
  1133. package/src/modules/workflows/lib/graph-utils.ts +620 -110
  1134. package/src/modules/workflows/lib/icon-search.ts +65 -0
  1135. package/src/modules/workflows/lib/insert-at-cursor.ts +53 -0
  1136. package/src/modules/workflows/lib/instance-date-filter.ts +56 -0
  1137. package/src/modules/workflows/lib/interpolation-pipeline.ts +351 -0
  1138. package/src/modules/workflows/lib/ledger-drag.ts +61 -0
  1139. package/src/modules/workflows/lib/ledger-entry-display.ts +89 -0
  1140. package/src/modules/workflows/lib/ledger-schema-flatten.ts +137 -0
  1141. package/src/modules/workflows/lib/metrics/definition-metrics.ts +268 -0
  1142. package/src/modules/workflows/lib/metrics/metrics-display.ts +57 -0
  1143. package/src/modules/workflows/lib/metrics/rollup-schedule.ts +26 -0
  1144. package/src/modules/workflows/lib/metrics/rollup-service.ts +292 -0
  1145. package/src/modules/workflows/lib/node-config-summary.ts +235 -0
  1146. package/src/modules/workflows/lib/node-geometry.ts +168 -0
  1147. package/src/modules/workflows/lib/node-nudge.ts +63 -0
  1148. package/src/modules/workflows/lib/node-outcome-rows.ts +195 -0
  1149. package/src/modules/workflows/lib/node-placement.ts +104 -0
  1150. package/src/modules/workflows/lib/node-type-icons.ts +71 -10
  1151. package/src/modules/workflows/lib/nodeFormTransforms.ts +519 -28
  1152. package/src/modules/workflows/lib/outcome-routing.ts +346 -0
  1153. package/src/modules/workflows/lib/owned-definition.ts +188 -0
  1154. package/src/modules/workflows/lib/owned-node-changes.ts +29 -0
  1155. package/src/modules/workflows/lib/palette-drag.ts +68 -0
  1156. package/src/modules/workflows/lib/palette-drop.ts +114 -0
  1157. package/src/modules/workflows/lib/parallel-handler.ts +79 -2
  1158. package/src/modules/workflows/lib/port-contract.ts +107 -0
  1159. package/src/modules/workflows/lib/portal-task-access.ts +220 -0
  1160. package/src/modules/workflows/lib/rerun-from-step.ts +140 -0
  1161. package/src/modules/workflows/lib/route-chip-events.ts +45 -0
  1162. package/src/modules/workflows/lib/route-chips.ts +177 -0
  1163. package/src/modules/workflows/lib/route-edge.ts +57 -0
  1164. package/src/modules/workflows/lib/route-kinds.ts +166 -0
  1165. package/src/modules/workflows/lib/route-priority.ts +197 -0
  1166. package/src/modules/workflows/lib/run-duration.ts +70 -0
  1167. package/src/modules/workflows/lib/run-event-tone.ts +46 -0
  1168. package/src/modules/workflows/lib/run-execution.ts +598 -0
  1169. package/src/modules/workflows/lib/run-gantt.ts +311 -0
  1170. package/src/modules/workflows/lib/run-outcome-evidence.ts +60 -0
  1171. package/src/modules/workflows/lib/run-outcome.ts +142 -0
  1172. package/src/modules/workflows/lib/sample-resolver.ts +113 -0
  1173. package/src/modules/workflows/lib/seeds.ts +3 -1
  1174. package/src/modules/workflows/lib/server-output-contract.ts +120 -0
  1175. package/src/modules/workflows/lib/set-variable.ts +94 -0
  1176. package/src/modules/workflows/lib/signal-handler.ts +134 -4
  1177. package/src/modules/workflows/lib/start-fixtures.ts +93 -0
  1178. package/src/modules/workflows/lib/status-colors.ts +220 -21
  1179. package/src/modules/workflows/lib/step-handler.ts +744 -68
  1180. package/src/modules/workflows/lib/step-presentation.ts +295 -0
  1181. package/src/modules/workflows/lib/step-through.ts +71 -0
  1182. package/src/modules/workflows/lib/step-type-conversion.ts +263 -0
  1183. package/src/modules/workflows/lib/subgraph-clipboard.ts +214 -0
  1184. package/src/modules/workflows/lib/task-decision-context.ts +76 -0
  1185. package/src/modules/workflows/lib/task-decisions.ts +117 -0
  1186. package/src/modules/workflows/lib/task-entity-access.ts +181 -0
  1187. package/src/modules/workflows/lib/task-entity-aliases.ts +77 -0
  1188. package/src/modules/workflows/lib/task-entity-types.ts +66 -0
  1189. package/src/modules/workflows/lib/task-form-registry.ts +123 -0
  1190. package/src/modules/workflows/lib/task-form-schema.ts +129 -0
  1191. package/src/modules/workflows/lib/task-handler.ts +492 -51
  1192. package/src/modules/workflows/lib/task-inspector-config.ts +348 -0
  1193. package/src/modules/workflows/lib/task-list-query.ts +46 -0
  1194. package/src/modules/workflows/lib/task-notifications.ts +218 -0
  1195. package/src/modules/workflows/lib/task-permission-settings.ts +117 -0
  1196. package/src/modules/workflows/lib/task-presets.ts +95 -0
  1197. package/src/modules/workflows/lib/task-quick-action.ts +111 -0
  1198. package/src/modules/workflows/lib/task-resolution.ts +270 -0
  1199. package/src/modules/workflows/lib/task-sla.ts +628 -0
  1200. package/src/modules/workflows/lib/task-visibility-request.ts +668 -0
  1201. package/src/modules/workflows/lib/task-visibility.ts +627 -0
  1202. package/src/modules/workflows/lib/timer-handler.ts +8 -1
  1203. package/src/modules/workflows/lib/transition-handler.ts +228 -20
  1204. package/src/modules/workflows/lib/trigger-node.ts +272 -0
  1205. package/src/modules/workflows/lib/visual-editor-navigation.ts +29 -0
  1206. package/src/modules/workflows/lib/work-inbox/empty-state.ts +150 -0
  1207. package/src/modules/workflows/lib/work-inbox/entity-links.ts +99 -0
  1208. package/src/modules/workflows/lib/work-inbox/navigation.ts +28 -0
  1209. package/src/modules/workflows/lib/work-inbox/presentation.ts +163 -0
  1210. package/src/modules/workflows/lib/work-inbox/provider.ts +390 -0
  1211. package/src/modules/workflows/lib/work-inbox/query.ts +103 -0
  1212. package/src/modules/workflows/lib/work-inbox/service.ts +122 -0
  1213. package/src/modules/workflows/lib/work-inbox/user-task-source.ts +240 -0
  1214. package/src/modules/workflows/lib/workflow-command-enablement.ts +188 -0
  1215. package/src/modules/workflows/lib/workflow-command-settings.ts +124 -0
  1216. package/src/modules/workflows/lib/workflow-executor.ts +1036 -10
  1217. package/src/modules/workflows/lib/workflow-function-registry.ts +44 -0
  1218. package/src/modules/workflows/lib/workflow-safe-commands.ts +42 -1
  1219. package/src/modules/workflows/lib/workflow-templates.ts +91 -0
  1220. package/src/modules/workflows/migrations/.snapshot-open-mercato.json +2321 -698
  1221. package/src/modules/workflows/migrations/Migration20260626214855_workflows.ts +15 -0
  1222. package/src/modules/workflows/migrations/Migration20260626222424_workflows.ts +17 -0
  1223. package/src/modules/workflows/migrations/Migration20260727074335_workflows.ts +15 -0
  1224. package/src/modules/workflows/migrations/Migration20260728104038_workflows.ts +13 -0
  1225. package/src/modules/workflows/migrations/Migration20260728163001_workflows.ts +36 -0
  1226. package/src/modules/workflows/migrations/Migration20260729061736_workflows.ts +13 -0
  1227. package/src/modules/workflows/migrations/Migration20260729192652_workflows.ts +11 -0
  1228. package/src/modules/workflows/migrations/Migration20260730085000_workflows.ts +13 -0
  1229. package/src/modules/workflows/migrations/Migration20260730092706_workflows.ts +13 -0
  1230. package/src/modules/workflows/notifications.ts +40 -10
  1231. package/src/modules/workflows/setup.ts +128 -0
  1232. package/src/modules/workflows/subscribers/task-assigned-notification.ts +36 -45
  1233. package/src/modules/workflows/subscribers/task-deadline-breached-notification.ts +31 -0
  1234. package/src/modules/workflows/subscribers/task-reminder-notification.ts +31 -0
  1235. package/src/modules/workflows/widgets/injection/pending-work/widget.client.tsx +119 -0
  1236. package/src/modules/workflows/widgets/injection/pending-work/widget.ts +27 -0
  1237. package/src/modules/workflows/widgets/injection-table.ts +52 -2
  1238. package/src/modules/workflows/workers/workflow-activities.worker.ts +95 -42
  1239. package/src/modules/workflows/workers/workflow-definition-metric-rollup.worker.ts +71 -0
  1240. package/src/modules/workflows/workers/workflow-instance-bulk-replay.ts +51 -0
  1241. package/src/modules/workflows/workers/workflow-invoke-agent.worker.ts +72 -0
@@ -23,12 +23,54 @@ import {
23
23
  } from '@open-mercato/shared/lib/url-safety'
24
24
  import { parseBooleanWithDefault } from '@open-mercato/shared/lib/boolean'
25
25
  import { isPrivateCrossProcessBroadcastEvent } from '@open-mercato/shared/modules/events'
26
- import { callWebhookConfigSchema } from '../data/validators'
27
- import { WorkflowActivityJob, WORKFLOW_ACTIVITIES_QUEUE_NAME } from './activity-queue-types'
26
+ import { hasAllFeatures } from '@open-mercato/shared/security/features'
27
+ import {
28
+ definitionDeclaresGrant,
29
+ resolveWorkflowDefinitionExecutionUserId,
30
+ } from './definition-grant'
31
+ import {
32
+ callWebhookConfigSchema,
33
+ invokeAgentConfigSchema,
34
+ setVariableConfigSchema,
35
+ } from '../data/activity-config-schemas'
36
+ import {
37
+ buildSetVariableContextPatch,
38
+ isSetVariableOutput,
39
+ splitAssignmentPath,
40
+ type SetVariableOutput,
41
+ } from './set-variable'
42
+ import {
43
+ DRY_RUN_EVENT_TYPES,
44
+ WorkflowDryRunRefusalError,
45
+ isDryRunInstance,
46
+ isDryRunRefusal,
47
+ } from './dry-run'
48
+ import {
49
+ applyTransforms,
50
+ parseInterpolationToken,
51
+ type WorkflowInterpolationMode,
52
+ } from './interpolation-pipeline'
53
+
54
+ export { resolveDefinitionInterpolationMode, type WorkflowInterpolationMode } from './interpolation-pipeline'
55
+ import {
56
+ WorkflowActivityJob,
57
+ WorkflowActivityJobInvokeAgent,
58
+ WORKFLOW_ACTIVITIES_QUEUE_NAME,
59
+ WORKFLOW_INVOKE_AGENT_QUEUE_NAME,
60
+ } from './activity-queue-types'
61
+ import './activity-registry-bootstrap'
62
+ import { bindActivityExecutor } from './activity-types'
63
+ import { getActivityType } from './activity-registry'
28
64
  import { logWorkflowEvent } from './event-logger'
29
- import { parseDuration } from './duration'
65
+ import { calculateWaitDelayMs, parseDuration } from './duration'
66
+
67
+ export { calculateWaitDelayMs } from './duration'
30
68
  import { resolveActivityTimeoutMs } from './activityTimeoutFields'
31
69
  import { getWorkflowSafeCommand } from './workflow-safe-commands'
70
+ import { isWorkflowCommandEnabled } from './workflow-command-enablement'
71
+ import { resolveWorkflowCommandPolicyForContainer } from './workflow-command-settings'
72
+ import { resolveAgentReview, toAgentDispositionReview } from './agent-review'
73
+ import type { AgentDispositionReview } from './agent-disposition-task'
32
74
 
33
75
  export { isPrivateUrl } from '@open-mercato/shared/lib/network'
34
76
  import { createLogger } from '@open-mercato/shared/lib/logger'
@@ -79,14 +121,6 @@ function getWorkflowEnvInterpolationAllowlist(): Set<string> {
79
121
  return allowlist
80
122
  }
81
123
 
82
- function resolveWorkflowEnvInterpolation(envKey: string): string {
83
- if (!getWorkflowEnvInterpolationAllowlist().has(envKey)) {
84
- return ''
85
- }
86
-
87
- return process.env[envKey] ?? ''
88
- }
89
-
90
124
  // ============================================================================
91
125
  // Types and Interfaces
92
126
  // ============================================================================
@@ -99,6 +133,50 @@ export type ActivityType =
99
133
  | 'CALL_WEBHOOK'
100
134
  | 'EXECUTE_FUNCTION'
101
135
  | 'WAIT'
136
+ | 'SET_VARIABLE'
137
+ | 'INVOKE_AGENT'
138
+
139
+ /**
140
+ * Signal name the INVOKE_AGENT step parks on when a proposal is routed to a
141
+ * human. agent_orchestrator's proposal-dispose path emits
142
+ * `agent_orchestrator.proposal.ready` and calls workflows `sendSignal` with this
143
+ * name to resume the parked step.
144
+ */
145
+ export const INVOKE_AGENT_SIGNAL_NAME = 'agent_orchestrator.proposal.ready'
146
+
147
+ /**
148
+ * Signal name a parked SUB_WORKFLOW step resumes on once its child instance
149
+ * reaches a terminal state. `completeWorkflow` enqueues a resume job when the
150
+ * child carries a parent linkage; the worker resumes the parent step via
151
+ * `sendSignal` with this name.
152
+ */
153
+ export const SUB_WORKFLOW_SIGNAL_NAME = 'workflows.sub_workflow.completed'
154
+
155
+ /**
156
+ * Small enqueue delay for the INVOKE_AGENT job so the workflow transaction that
157
+ * parked the step commits before the worker picks the job up. The worker also
158
+ * guards against the race (it requires the instance to be PAUSED at the step
159
+ * before running the agent), so this only trims needless retries.
160
+ */
161
+ export const INVOKE_AGENT_ENQUEUE_DELAY_MS = 1000
162
+
163
+ /**
164
+ * Marker carried on an activity result's output when the step must park and wait
165
+ * for a signal (INVOKE_AGENT routed a proposal to a human). The step handler
166
+ * inspects activity outputs for this marker and parks the instance accordingly.
167
+ * researcher / auto_approved outcomes do NOT carry it and proceed inline.
168
+ */
169
+ export type ActivityParkMarker = { signalName: string }
170
+
171
+ export function getActivityParkMarker(output: unknown): ActivityParkMarker | null {
172
+ if (output && typeof output === 'object' && '__park' in output) {
173
+ const park = (output as { __park?: unknown }).__park
174
+ if (park && typeof park === 'object' && typeof (park as { signalName?: unknown }).signalName === 'string') {
175
+ return { signalName: (park as { signalName: string }).signalName }
176
+ }
177
+ }
178
+ return null
179
+ }
102
180
 
103
181
  export interface ActivityDefinition {
104
182
  activityId: string // Unique identifier for activity
@@ -135,6 +213,10 @@ export interface ActivityContext {
135
213
  branchInstanceId?: string | null
136
214
  transitionId?: string
137
215
  userId?: string
216
+ // The owning definition's `interpolation` mode; absent means lenient.
217
+ // Async activities enforce strict mode at enqueue-time, so the worker-side
218
+ // context deliberately leaves this unset.
219
+ interpolationMode?: WorkflowInterpolationMode
138
220
  }
139
221
 
140
222
  type RbacFeatureResolver = {
@@ -174,6 +256,13 @@ export interface ActivityExecutionResult {
174
256
  executionTimeMs: number
175
257
  async?: boolean // Marks activity as async (queued)
176
258
  jobId?: string // Queue job ID for async activities
259
+ /**
260
+ * The activity was not attempted because a dry run cannot simulate its type
261
+ * (spec section 8.2). Callers MUST treat it as a stop, never as a failure:
262
+ * error routes and error directives describe what to do when an effector
263
+ * fails, and no effector ran.
264
+ */
265
+ dryRunRefused?: boolean
177
266
  }
178
267
 
179
268
  export class ActivityExecutionError extends Error {
@@ -188,11 +277,29 @@ export class ActivityExecutionError extends Error {
188
277
  }
189
278
  }
190
279
 
280
+ /**
281
+ * Thrown by `interpolateVariables` in strict mode when a token cannot be
282
+ * resolved (unresolved context path, env-allowlist miss, unknown workflow.*
283
+ * key, failed or unparseable transform pipeline). Activity call sites rethrow
284
+ * it as `ActivityExecutionError` so it flows through the normal retry/failure
285
+ * machinery.
286
+ */
287
+ export class WorkflowInterpolationError extends Error {
288
+ constructor(
289
+ message: string,
290
+ public token: string
291
+ ) {
292
+ super(message)
293
+ this.name = 'WorkflowInterpolationError'
294
+ }
295
+ }
296
+
191
297
  // ============================================================================
192
298
  // Queue Integration for Async Activities
193
299
  // ============================================================================
194
300
 
195
301
  let activityQueue: Queue<WorkflowActivityJob> | null = null
302
+ let invokeAgentQueue: Queue<WorkflowActivityJob> | null = null
196
303
 
197
304
  /**
198
305
  * Get or create the activity queue (lazy initialization)
@@ -208,6 +315,24 @@ function getActivityQueue(): Queue<WorkflowActivityJob> {
208
315
  return activityQueue
209
316
  }
210
317
 
318
+ /**
319
+ * Get or create the dedicated invoke-agent queue (lazy initialization).
320
+ *
321
+ * Minute-long agent runs get their own queue so they never starve the fast
322
+ * activities sharing 'workflow-activities'. Consumer-side concurrency is
323
+ * governed by the workflow-invoke-agent worker's metadata.
324
+ */
325
+ function getInvokeAgentQueue(): Queue<WorkflowActivityJob> {
326
+ if (!invokeAgentQueue) {
327
+ invokeAgentQueue = createModuleQueue<WorkflowActivityJob>(
328
+ WORKFLOW_INVOKE_AGENT_QUEUE_NAME,
329
+ { concurrency: parseInt(process.env.WORKERS_WORKFLOW_INVOKE_AGENT_CONCURRENCY || '5', 10) },
330
+ )
331
+ }
332
+
333
+ return invokeAgentQueue
334
+ }
335
+
211
336
  /**
212
337
  * Enqueue an activity for background execution
213
338
  *
@@ -224,8 +349,23 @@ export async function enqueueActivity(
224
349
  const { workflowInstance, workflowContext, stepContext, transitionId, stepInstanceId, branchInstanceId } =
225
350
  context
226
351
 
227
- // Interpolate config variables NOW (before queuing)
228
- const interpolatedConfig = interpolateVariables(activity.config, workflowContext, workflowInstance)
352
+ const registryEntry = getActivityType(activity.activityType)
353
+ if (registryEntry && registryEntry.async.capable === false) {
354
+ throw new ActivityExecutionError(
355
+ `[internal] Activity type ${activity.activityType} cannot run asynchronously (${registryEntry.async.reason})`,
356
+ activity.activityType,
357
+ activity.activityName
358
+ )
359
+ }
360
+
361
+ // Interpolate config variables NOW (before queuing) — strict mode is
362
+ // enforced here, at enqueue-time, before the job serializes frozen config.
363
+ const interpolatedConfig = interpolateActivityConfig(
364
+ activity.config,
365
+ context,
366
+ activity.activityType,
367
+ activity.activityName
368
+ )
229
369
 
230
370
  // Create job payload
231
371
  const job: WorkflowActivityJob = {
@@ -246,11 +386,12 @@ export async function enqueueActivity(
246
386
  userId: context.userId,
247
387
  }
248
388
 
249
- // Enqueue to queue (WAIT activities use delayMs for the actual delay)
389
+ // Enqueue to queue (entries with enqueueDelayMs, e.g. WAIT, use delayMs for the actual delay)
250
390
  const queue = getActivityQueue()
251
- const enqueueOptions = activity.activityType === 'WAIT' && (interpolatedConfig.duration || interpolatedConfig.until)
252
- ? { delayMs: calculateWaitDelayMs(interpolatedConfig) }
253
- : undefined
391
+ const registryDelayMs = registryEntry?.enqueueDelayMs
392
+ ? registryEntry.enqueueDelayMs(interpolatedConfig)
393
+ : null
394
+ const enqueueOptions = registryDelayMs !== null ? { delayMs: registryDelayMs } : undefined
254
395
  const jobId = await queue.enqueue(job, enqueueOptions)
255
396
 
256
397
  // Log event
@@ -309,6 +450,112 @@ export async function enqueueTimerJob(params: {
309
450
  return jobId
310
451
  }
311
452
 
453
+ /**
454
+ * Enqueue a delayed SLA job for a USER_TASK (one reminder offset, or the
455
+ * deadline itself).
456
+ *
457
+ * The activity worker handles `kind: 'task_sla'` jobs by calling
458
+ * `taskSla.runTaskSlaJob`. `deadlineAt` is absolute and carried on the payload
459
+ * rather than recomputed at run time, so a queue running behind can never
460
+ * extend the configured deadline — the same guarantee the WAIT_FOR_CONDITION
461
+ * backstop gives.
462
+ */
463
+ export async function enqueueTaskSlaJob(params: {
464
+ workflowInstanceId: string
465
+ stepInstanceId: string
466
+ branchInstanceId?: string | null
467
+ userTaskId: string
468
+ phase: 'reminder' | 'breach'
469
+ deadlineAt: string
470
+ fireAt: string
471
+ delayMs: number
472
+ tenantId: string
473
+ organizationId: string
474
+ userId?: string
475
+ }): Promise<string> {
476
+ const {
477
+ workflowInstanceId,
478
+ stepInstanceId,
479
+ branchInstanceId,
480
+ userTaskId,
481
+ phase,
482
+ deadlineAt,
483
+ fireAt,
484
+ delayMs,
485
+ tenantId,
486
+ organizationId,
487
+ userId,
488
+ } = params
489
+
490
+ const queue = getActivityQueue()
491
+ return await queue.enqueue(
492
+ {
493
+ kind: 'task_sla',
494
+ workflowInstanceId,
495
+ stepInstanceId,
496
+ branchInstanceId: branchInstanceId ?? undefined,
497
+ userTaskId,
498
+ phase,
499
+ deadlineAt,
500
+ fireAt,
501
+ tenantId,
502
+ organizationId,
503
+ userId,
504
+ },
505
+ { delayMs: delayMs > 0 ? delayMs : undefined }
506
+ )
507
+ }
508
+
509
+ /**
510
+ * Enqueue a delayed poll job for a WAIT_FOR_CONDITION step.
511
+ *
512
+ * The activity worker handles `kind: 'condition'` jobs by calling
513
+ * `conditionHandler.evaluateWaitCondition`. This job is the durability
514
+ * backstop behind the event-driven wake: `deadlineAt` travels unchanged across
515
+ * every re-enqueue so the timeout stays anchored to the original step entry.
516
+ */
517
+ export async function enqueueConditionCheckJob(params: {
518
+ workflowInstanceId: string
519
+ stepInstanceId: string
520
+ branchInstanceId?: string | null
521
+ tenantId: string
522
+ organizationId: string
523
+ userId?: string
524
+ deadlineAt: string
525
+ attempt: number
526
+ delayMs: number
527
+ }): Promise<string> {
528
+ const {
529
+ workflowInstanceId,
530
+ stepInstanceId,
531
+ branchInstanceId,
532
+ tenantId,
533
+ organizationId,
534
+ userId,
535
+ deadlineAt,
536
+ attempt,
537
+ delayMs,
538
+ } = params
539
+
540
+ const queue = getActivityQueue()
541
+ const jobId = await queue.enqueue(
542
+ {
543
+ kind: 'condition',
544
+ workflowInstanceId,
545
+ stepInstanceId,
546
+ branchInstanceId: branchInstanceId ?? undefined,
547
+ tenantId,
548
+ organizationId,
549
+ userId,
550
+ deadlineAt,
551
+ attempt,
552
+ },
553
+ { delayMs: delayMs > 0 ? delayMs : undefined }
554
+ )
555
+
556
+ return jobId
557
+ }
558
+
312
559
  // ============================================================================
313
560
  // Main Activity Execution Functions
314
561
  // ============================================================================
@@ -368,6 +615,11 @@ export async function executeActivity(
368
615
  lastError = error
369
616
  retryCount = attempt + 1
370
617
 
618
+ // A dry-run refusal is not a failure — nothing was attempted — so retrying
619
+ // it would only re-log the same refusal N times before reaching the same
620
+ // answer.
621
+ if (isDryRunRefusal(error)) break
622
+
371
623
  // Log activity retry attempt with context
372
624
  if (attempt < retryPolicy.maxAttempts - 1) {
373
625
  logger.error('Activity failed; will retry', {
@@ -396,6 +648,19 @@ export async function executeActivity(
396
648
 
397
649
  // All retries exhausted
398
650
  const errorMessage = lastError instanceof Error ? lastError.message : String(lastError)
651
+ if (isDryRunRefusal(lastError)) {
652
+ return {
653
+ activityId: activity.activityId,
654
+ activityName: activity.activityName,
655
+ activityType: activity.activityType,
656
+ success: false,
657
+ dryRunRefused: true,
658
+ error: `Dry run stopped: activity type ${lastError.activityType} cannot be simulated (${lastError.reason})`,
659
+ retryCount: 0,
660
+ executionTimeMs: 0,
661
+ async: activity.async || false,
662
+ }
663
+ }
399
664
  logger.error('Activity failed after all attempts', {
400
665
  activityId: activity.activityId,
401
666
  activityType: activity.activityType,
@@ -434,11 +699,17 @@ export async function executeActivities(
434
699
  ): Promise<ActivityExecutionResult[]> {
435
700
  const results: ActivityExecutionResult[] = []
436
701
 
702
+ // A dry run never enqueues. The queue job would carry no `isDryRun` of its
703
+ // own, so a worker picking it up would execute the real effector on its own
704
+ // connection — the isolation would leak out of the request that opted in.
705
+ // Mocks are pure and synchronous, so running them inline loses nothing.
706
+ const forceSynchronous = isDryRunInstance(context.workflowInstance)
707
+
437
708
  for (let i = 0; i < activities.length; i++) {
438
709
  const activity = activities[i]
439
710
 
440
711
  // Check if activity should run async
441
- if (activity.async) {
712
+ if (activity.async && !forceSynchronous) {
442
713
  // Enqueue for background execution
443
714
  const jobId = await enqueueActivity(em, activity, context)
444
715
 
@@ -454,7 +725,17 @@ export async function executeActivities(
454
725
  })
455
726
  } else {
456
727
  // Execute synchronously (existing logic)
457
- const result = await executeActivity(em, container, activity, context)
728
+ const executed = await executeActivity(em, container, activity, context)
729
+ // `executeActivity` echoes the AUTHORED `async` flag, which is what the
730
+ // transition handler reads to decide whether to park the token in
731
+ // WAITING_FOR_ACTIVITIES. A dry run that ran an authored-async activity
732
+ // inline must therefore correct the flag, or the run would park waiting
733
+ // for a queue job that was deliberately never enqueued — a deadlock, and
734
+ // the step handler would also misclassify a refusal as "still pending"
735
+ // instead of a failure.
736
+ const result = forceSynchronous && activity.async
737
+ ? { ...executed, async: false }
738
+ : executed
458
739
  results.push(result)
459
740
 
460
741
  // Stop execution if activity fails (fail-fast)
@@ -462,12 +743,21 @@ export async function executeActivities(
462
743
  break
463
744
  }
464
745
 
465
- // Update workflow context with activity output
746
+ // Update workflow context with activity output. SET_VARIABLE outputs
747
+ // land at their assignment paths in top-level context; every other
748
+ // output merges under the activity name/type key.
466
749
  if (result.output && typeof result.output === 'object') {
467
- const key = activity.activityName || activity.activityType
468
- context.workflowContext = {
469
- ...context.workflowContext,
470
- [key]: result.output,
750
+ if (activity.activityType === 'SET_VARIABLE' && isSetVariableOutput(result.output)) {
751
+ context.workflowContext = {
752
+ ...context.workflowContext,
753
+ ...buildSetVariableContextPatch(context.workflowContext, result.output.assignments),
754
+ }
755
+ } else {
756
+ const key = activity.activityName || activity.activityType
757
+ context.workflowContext = {
758
+ ...context.workflowContext,
759
+ [key]: result.output,
760
+ }
471
761
  }
472
762
  }
473
763
  }
@@ -491,43 +781,83 @@ async function executeActivityByType(
491
781
  signal?: AbortSignal
492
782
  ): Promise<any> {
493
783
  // Interpolate config variables from context (including workflow metadata)
494
- const interpolatedConfig = interpolateVariables(activity.config, context.workflowContext, context.workflowInstance)
495
-
496
- switch (activity.activityType) {
497
- case 'SEND_EMAIL':
498
- return await executeSendEmail(interpolatedConfig, context, container)
499
-
500
- case 'CALL_API':
501
- return await executeCallApi(em, interpolatedConfig, context, container, signal)
502
-
503
- case 'EMIT_EVENT':
504
- return await executeEmitEvent(interpolatedConfig, context, container)
505
-
506
- case 'UPDATE_ENTITY':
507
- return await executeUpdateEntity(em, interpolatedConfig, context, container)
508
-
509
- case 'CALL_WEBHOOK':
510
- return await executeCallWebhook(interpolatedConfig, context, { signal })
511
-
512
- case 'EXECUTE_FUNCTION':
513
- return await executeFunction(interpolatedConfig, context, container)
784
+ const interpolatedConfig = interpolateActivityConfig(
785
+ activity.config,
786
+ context,
787
+ activity.activityType,
788
+ activity.activityName
789
+ )
514
790
 
515
- case 'WAIT':
516
- return await executeWait(interpolatedConfig)
791
+ const entry = getActivityType(activity.activityType)
792
+ if (!entry) {
793
+ throw new ActivityExecutionError(
794
+ `Unknown activity type: ${activity.activityType}`,
795
+ activity.activityType,
796
+ activity.activityName
797
+ )
798
+ }
517
799
 
518
- default:
519
- throw new ActivityExecutionError(
520
- `Unknown activity type: ${activity.activityType}`,
800
+ // Dry run (spec section 8.2): the ONE place `entry.execute` is reached, so it
801
+ // is the one place the swap has to happen. Everything side-effecting in the
802
+ // engine ends up here — the command bus, the event bus, the mailer, the
803
+ // webhook fetch and the agent bridge — which is what makes "no effector runs"
804
+ // a property of a single branch rather than a checklist.
805
+ if (isDryRunInstance(context.workflowInstance)) {
806
+ if (entry.mock === 'refuse' || entry.mock === undefined) {
807
+ const refusal = new WorkflowDryRunRefusalError(
521
808
  activity.activityType,
522
- activity.activityName
809
+ entry.mock === 'refuse' ? 'refused' : 'noMock',
810
+ activity.activityName,
523
811
  )
812
+ await logWorkflowEvent(em, {
813
+ workflowInstanceId: context.workflowInstance.id,
814
+ stepInstanceId: context.stepInstanceId,
815
+ eventType: DRY_RUN_EVENT_TYPES.activityRefused,
816
+ eventData: {
817
+ activityId: activity.activityId,
818
+ activityName: activity.activityName,
819
+ activityType: activity.activityType,
820
+ reason: refusal.reason,
821
+ },
822
+ tenantId: context.workflowInstance.tenantId,
823
+ organizationId: context.workflowInstance.organizationId,
824
+ })
825
+ throw refusal
826
+ }
827
+
828
+ const simulated = entry.mock(interpolatedConfig, context)
829
+ await logWorkflowEvent(em, {
830
+ workflowInstanceId: context.workflowInstance.id,
831
+ stepInstanceId: context.stepInstanceId,
832
+ eventType: DRY_RUN_EVENT_TYPES.activitySimulated,
833
+ eventData: {
834
+ activityId: activity.activityId,
835
+ activityName: activity.activityName,
836
+ activityType: activity.activityType,
837
+ output: simulated ?? null,
838
+ },
839
+ tenantId: context.workflowInstance.tenantId,
840
+ organizationId: context.workflowInstance.organizationId,
841
+ })
842
+ return simulated
524
843
  }
844
+
845
+ // `signal` MUST reach the registry entry: CALL_API / CALL_WEBHOOK thread it
846
+ // into fetch, and without it a per-activity timeout rejects the promise while
847
+ // the HTTP request stays in flight — the phantom-execution bug from #4918.
848
+ return await entry.execute(interpolatedConfig, context, {
849
+ em: em as PostgreSqlEntityManager,
850
+ container,
851
+ signal,
852
+ })
525
853
  }
526
854
 
527
855
  /**
528
856
  * SEND_EMAIL activity handler
529
857
  *
530
- * For MVP, this logs the email (actual email sending can be added later)
858
+ * Sends via the DI-registered emailService when available; without one it
859
+ * reports an honest stub result ({ sent: false, simulated: true, reason: 'no-email-service' }).
860
+ * A real send() failure propagates so the activity retry loop handles it.
531
861
  */
532
862
  export async function executeSendEmail(
533
863
  config: any,
@@ -540,27 +870,28 @@ export async function executeSendEmail(
540
870
  throw new Error('SEND_EMAIL requires "to" and "subject" fields')
541
871
  }
542
872
 
543
- // For MVP: Log the email (actual email service integration can be added later)
544
873
  logger.info('Send email activity invoked', { component: 'SEND_EMAIL', subject })
545
874
 
546
- // Check if email service is available in container
875
+ let emailService: { send: (input: unknown) => Promise<unknown> | unknown } | undefined
547
876
  try {
548
- const emailService = container.resolve<{ send: (input: unknown) => Promise<unknown> | unknown }>('emailService')
549
- if (emailService && typeof emailService.send === 'function') {
550
- await emailService.send({
551
- to,
552
- subject,
553
- template,
554
- templateData,
555
- body,
556
- })
557
- return { sent: true, to, subject, via: 'emailService' }
558
- }
559
- } catch (error) {
560
- // Email service not available, just log
877
+ emailService = container.resolve<{ send: (input: unknown) => Promise<unknown> | unknown }>('emailService')
878
+ } catch {
879
+ emailService = undefined
561
880
  }
562
881
 
563
- return { sent: true, to, subject, via: 'console' }
882
+ if (emailService && typeof emailService.send === 'function') {
883
+ await emailService.send({
884
+ to,
885
+ subject,
886
+ template,
887
+ templateData,
888
+ body,
889
+ })
890
+ return { sent: true, to, subject, via: 'emailService' }
891
+ }
892
+
893
+ logger.warn('SEND_EMAIL has no registered email service; email was not sent', { component: 'SEND_EMAIL', subject })
894
+ return { sent: false, simulated: true, to, subject, via: 'console', reason: 'no-email-service' }
564
895
  }
565
896
 
566
897
  /**
@@ -684,11 +1015,23 @@ export async function executeUpdateEntity(
684
1015
  throw new Error('UPDATE_ENTITY requires "commandId" field (e.g., "sales.documents.update")')
685
1016
  }
686
1017
 
1018
+ // Gate 1 — the CODE declares this command possible.
687
1019
  const workflowSafeCommand = getWorkflowSafeCommand(commandId)
688
1020
  if (!workflowSafeCommand) {
689
1021
  throw new Error('UPDATE_ENTITY command is not allowed')
690
1022
  }
691
1023
 
1024
+ // Gate 2 — this TENANT switched it on. A tenant that never saved the setting
1025
+ // resolves to the grandfathered set, so this is byte-identical to the
1026
+ // pre-setting behaviour for every existing tenant.
1027
+ const commandPolicy = await resolveWorkflowCommandPolicyForContainer(
1028
+ container,
1029
+ context.workflowInstance.tenantId,
1030
+ )
1031
+ if (!isWorkflowCommandEnabled(workflowSafeCommand, commandPolicy)) {
1032
+ throw new Error('UPDATE_ENTITY command is not enabled for this tenant')
1033
+ }
1034
+
692
1035
  if (!input || typeof input !== 'object') {
693
1036
  throw new Error('UPDATE_ENTITY requires "input" object with entity data')
694
1037
  }
@@ -954,27 +1297,6 @@ export async function executeFunction(
954
1297
  }
955
1298
  }
956
1299
 
957
- /**
958
- * Calculate delay in milliseconds from a WAIT activity config.
959
- * Supports either `duration` (relative, e.g. "PT5M") or `until` (absolute ISO 8601 datetime).
960
- */
961
- function calculateWaitDelayMs(config: { duration?: string; until?: string }): number {
962
- if (config.until) {
963
- const targetDate = new Date(config.until)
964
- if (isNaN(targetDate.getTime())) {
965
- throw new Error(`WAIT activity: invalid "until" datetime: ${config.until}`)
966
- }
967
- const delayMs = targetDate.getTime() - Date.now()
968
- return Math.max(0, delayMs)
969
- }
970
-
971
- if (config.duration) {
972
- return parseDuration(config.duration)
973
- }
974
-
975
- throw new Error('WAIT activity requires "duration" (e.g., "PT5M", "1h") or "until" (ISO 8601 datetime)')
976
- }
977
-
978
1300
  /**
979
1301
  * WAIT activity handler
980
1302
  *
@@ -985,7 +1307,7 @@ function calculateWaitDelayMs(config: { duration?: string; until?: string }): nu
985
1307
  * - Async mode: delay is handled by the queue's delayMs option;
986
1308
  * this handler returns immediately when called from the worker
987
1309
  */
988
- async function executeWait(config: any): Promise<any> {
1310
+ export async function executeWait(config: any): Promise<any> {
989
1311
  const durationMs = calculateWaitDelayMs(config)
990
1312
 
991
1313
  // In sync mode, actually sleep for the duration
@@ -995,6 +1317,237 @@ async function executeWait(config: any): Promise<any> {
995
1317
  return { waited: true, durationMs }
996
1318
  }
997
1319
 
1320
+ /**
1321
+ * SET_VARIABLE activity handler
1322
+ *
1323
+ * Validates the (already interpolated) assignments and echoes them back as
1324
+ * `{ assignments }`. The sync merge points detect this output shape via
1325
+ * `isSetVariableOutput` and apply each assignment at its dot path in
1326
+ * top-level workflow context (see lib/set-variable.ts) instead of
1327
+ * namespacing the output under the activity name/type key.
1328
+ */
1329
+ export async function executeSetVariable(
1330
+ config: unknown,
1331
+ context: ActivityContext
1332
+ ): Promise<SetVariableOutput> {
1333
+ const parsed = setVariableConfigSchema.safeParse(config)
1334
+ if (!parsed.success) {
1335
+ const issues = parsed.error.issues
1336
+ .map((issue) => `${issue.path.join('.') || 'config'}: ${issue.message}`)
1337
+ .join('; ')
1338
+ throw new Error(`SET_VARIABLE config invalid: ${issues}`)
1339
+ }
1340
+
1341
+ for (const assignment of parsed.data.assignments) {
1342
+ const segments = splitAssignmentPath(assignment.path)
1343
+ if (segments === null) {
1344
+ throw new Error(
1345
+ `SET_VARIABLE assignment path contains a forbidden segment (__proto__, constructor, prototype): "${assignment.path}"`
1346
+ )
1347
+ }
1348
+ if (segments.length === 0) {
1349
+ throw new Error(`SET_VARIABLE assignment path is blank: "${assignment.path}"`)
1350
+ }
1351
+ }
1352
+
1353
+ return { assignments: parsed.data.assignments }
1354
+ }
1355
+
1356
+ /**
1357
+ * INVOKE_AGENT activity handler
1358
+ *
1359
+ * Runs a callable agent via the agent_orchestrator DI bridge (`agentWorkflowBridge`,
1360
+ * an optional peer) and dispositions any proposal:
1361
+ * - researcher → returns the agent data; the step proceeds inline (no park).
1362
+ * - auto_approved → returns the proposalId; the step proceeds inline (no park).
1363
+ * - user_task → returns a result carrying a `__park` marker so the step handler
1364
+ * parks the instance on `INVOKE_AGENT_SIGNAL_NAME`; agent_orchestrator's
1365
+ * dispose path later signals it to resume.
1366
+ *
1367
+ * `config` is the already-interpolated INVOKE_AGENT config.
1368
+ */
1369
+ type AgentWorkflowBridgeLike = {
1370
+ invokeAgentForWorkflow: (args: {
1371
+ agentId: string
1372
+ input: unknown
1373
+ onResult: { autoApproveThreshold: number; autoApproveMargin?: number } | { alwaysAsk: true }
1374
+ ctx: {
1375
+ tenantId: string
1376
+ organizationId: string
1377
+ userId?: string
1378
+ workflowInstanceId: string
1379
+ stepId: string
1380
+ /**
1381
+ * The step-attempt id. With the instance and the step it IS this
1382
+ * invocation's identity, so the run it produces can be correlated by name
1383
+ * rather than by "the newest run for this agent since now".
1384
+ */
1385
+ invocationId?: string
1386
+ // Optional interpolated business-record descriptor (invokeAgentConfigSchema.subject).
1387
+ subject?: unknown
1388
+ // Optional already-resolved Review section (spec 7.5) — who reviews the
1389
+ // proposal this step raises, and by when. Absent means the unassigned
1390
+ // task the disposition service raised before the section existed.
1391
+ review?: AgentDispositionReview
1392
+ }
1393
+ }) => Promise<
1394
+ | { kind: 'research'; data: unknown }
1395
+ | { kind: 'auto_approved'; proposalId: string; payload: unknown }
1396
+ | { kind: 'user_task'; proposalId: string }
1397
+ // The agent proposed nothing: terminal like `researcher`, never parked.
1398
+ | { kind: 'none_proposed'; proposalId: string; payload: unknown }
1399
+ // The agent PRODUCED files. Terminal and non-mutating, so it routes onto the
1400
+ // same governance handle as a research result: the five outcome handles are a
1401
+ // vocabulary of DECISIONS, and "it made a document" is not one of them.
1402
+ | { kind: 'artifact'; artifacts: unknown[]; summary?: string }
1403
+ >
1404
+ }
1405
+
1406
+ function tryResolveAgentWorkflowBridge(
1407
+ container: AwilixContainer,
1408
+ ): AgentWorkflowBridgeLike | undefined {
1409
+ try {
1410
+ return container.resolve<AgentWorkflowBridgeLike>('agentWorkflowBridge')
1411
+ } catch {
1412
+ return undefined
1413
+ }
1414
+ }
1415
+
1416
+ export async function executeInvokeAgent(
1417
+ config: unknown,
1418
+ context: ActivityContext,
1419
+ container: AwilixContainer
1420
+ ): Promise<any> {
1421
+ const parsed = invokeAgentConfigSchema.safeParse(config)
1422
+ if (!parsed.success) {
1423
+ const issues = parsed.error.issues
1424
+ .map((issue) => `${issue.path.join('.') || 'config'}: ${issue.message}`)
1425
+ .join('; ')
1426
+ throw new Error(`INVOKE_AGENT config invalid: ${issues}`)
1427
+ }
1428
+ const { agentId, input, onResult, outputMapping, subject, review } = parsed.data
1429
+
1430
+ // The Review section is resolved HERE, against the context the step ran with,
1431
+ // for the same reason a USER_TASK's assignment is resolved at creation rather
1432
+ // than at read time: a definition edit while the agent is running must not
1433
+ // retro-change who the resulting review task belongs to. `config` reaches this
1434
+ // function already interpolated, so a dynamic assignee is either a resolved id
1435
+ // or an untouched `{{…}}` token — which `resolveTaskAssignment` reads as the
1436
+ // fallback-to-the-role-queue case.
1437
+ const dispositionReview = toAgentDispositionReview(resolveAgentReview(review, (value) => value))
1438
+
1439
+ // Fail fast when the optional agent_orchestrator peer is absent — the worker
1440
+ // would otherwise enqueue a job that can never run.
1441
+ const bridge = tryResolveAgentWorkflowBridge(container)
1442
+ if (!bridge) {
1443
+ throw new Error('[internal] agent_orchestrator not installed')
1444
+ }
1445
+
1446
+ const stepId =
1447
+ context.stepContext?.stepId ||
1448
+ context.workflowInstance.currentStepId
1449
+
1450
+ // Resolve the traceable principal this agent run executes as, from the
1451
+ // workflow instance (NOT the unreliable execution `context.userId`, which is
1452
+ // empty for event/sub-workflow paths). Same security model as CALL_API: the
1453
+ // run must never exceed the permissions of the human who triggered (or
1454
+ // authored) the workflow, and there is no anonymous "system" fallback —
1455
+ // passing an empty user id downstream both poisons the DB transaction
1456
+ // (invalid uuid `""`) and would mint a session token attributed to no one.
1457
+ const principalEm = container.resolve<PostgreSqlEntityManager>('em')
1458
+ const effectiveUserId = await resolveWorkflowPrincipalUserId(principalEm, context.workflowInstance)
1459
+ if (!effectiveUserId) {
1460
+ throw new Error(
1461
+ `[INVOKE_AGENT] Refusing to execute for workflow instance ${context.workflowInstance.id}: ` +
1462
+ `no traceable user (instance initiatedBy or definition author) could be resolved. ` +
1463
+ `Agent runs must execute under the identity of the user who triggered them.`
1464
+ )
1465
+ }
1466
+
1467
+ // Parallel-branch agent steps keep the legacy inline path. The async fix below
1468
+ // parks and resumes at the INSTANCE level, and sendSignal's FORKED branch
1469
+ // resume only matches WAIT_FOR_SIGNAL steps — so an instance-level resume would
1470
+ // not reach a parked branch. The claims blueprints (and the common case) run
1471
+ // agents sequentially at the instance level; only rarely-used parallel branches
1472
+ // hit this fallback, where behavior is unchanged from before.
1473
+ if (context.branchInstanceId) {
1474
+ const outcome = await bridge.invokeAgentForWorkflow({
1475
+ agentId,
1476
+ input,
1477
+ onResult,
1478
+ ctx: {
1479
+ tenantId: context.workflowInstance.tenantId,
1480
+ organizationId: context.workflowInstance.organizationId,
1481
+ userId: effectiveUserId,
1482
+ workflowInstanceId: context.workflowInstance.id,
1483
+ stepId,
1484
+ // The step-attempt row id: a retry enters the step again and mints a new
1485
+ // one, so it names THIS attempt and no other.
1486
+ ...(context.stepInstanceId ? { invocationId: context.stepInstanceId } : {}),
1487
+ ...(subject ? { subject } : {}),
1488
+ ...(dispositionReview ? { review: dispositionReview } : {}),
1489
+ },
1490
+ })
1491
+ if (outcome.kind === 'research') {
1492
+ return { kind: 'research', agentId, data: outcome.data }
1493
+ }
1494
+ if (outcome.kind === 'artifact') {
1495
+ return { kind: 'artifact', agentId, artifacts: outcome.artifacts, summary: outcome.summary }
1496
+ }
1497
+ if (outcome.kind === 'auto_approved' || outcome.kind === 'none_proposed') {
1498
+ return { kind: outcome.kind, agentId, proposalId: outcome.proposalId, proposalPayload: outcome.payload }
1499
+ }
1500
+ return {
1501
+ kind: 'user_task',
1502
+ agentId,
1503
+ proposalId: outcome.proposalId,
1504
+ __park: { signalName: INVOKE_AGENT_SIGNAL_NAME },
1505
+ }
1506
+ }
1507
+
1508
+ if (!context.stepInstanceId) {
1509
+ throw new Error('[internal] INVOKE_AGENT requires a step instance to park on')
1510
+ }
1511
+
1512
+ // Run the agent OUTSIDE the workflow transaction. Previously the agent ran
1513
+ // inline here, on the workflow's transactional EM: a failing statement aborted
1514
+ // the whole workflow transaction ("current transaction is aborted, …") and,
1515
+ // for cross-process OpenCode agents, the per-run api_key / session rows were
1516
+ // written into the still-open transaction so the separate mcp:serve-http
1517
+ // process could not see them to authenticate submit_outcome. Instead we enqueue
1518
+ // a dedicated job and PARK the step on the proposal-ready signal: the
1519
+ // workflow-invoke-agent worker runs the agent on its own connection (committed,
1520
+ // cross-process visible) and resumes the parked step via sendSignal. user_task
1521
+ // outcomes stay parked until agent_orchestrator's human dispose fires the same
1522
+ // signal — identical to the prior park behavior.
1523
+ const queue = getInvokeAgentQueue()
1524
+ const job: WorkflowActivityJobInvokeAgent = {
1525
+ kind: 'invoke_agent',
1526
+ workflowInstanceId: context.workflowInstance.id,
1527
+ branchInstanceId: context.branchInstanceId ?? undefined,
1528
+ stepInstanceId: context.stepInstanceId,
1529
+ stepId,
1530
+ signalName: INVOKE_AGENT_SIGNAL_NAME,
1531
+ agentId,
1532
+ input: (input ?? {}) as Record<string, any>,
1533
+ onResult,
1534
+ ...(outputMapping ? { outputMapping } : {}),
1535
+ ...(subject ? { subject } : {}),
1536
+ ...(dispositionReview ? { review: dispositionReview } : {}),
1537
+ tenantId: context.workflowInstance.tenantId,
1538
+ organizationId: context.workflowInstance.organizationId,
1539
+ userId: effectiveUserId,
1540
+ }
1541
+ const jobId = await queue.enqueue(job, { delayMs: INVOKE_AGENT_ENQUEUE_DELAY_MS })
1542
+
1543
+ return {
1544
+ kind: 'pending_agent',
1545
+ agentId,
1546
+ jobId,
1547
+ __park: { signalName: INVOKE_AGENT_SIGNAL_NAME },
1548
+ }
1549
+ }
1550
+
998
1551
  /**
999
1552
  * CALL_API activity handler
1000
1553
  *
@@ -1013,7 +1566,7 @@ export async function executeCallApi(
1013
1566
  signal?: AbortSignal
1014
1567
  ): Promise<any> {
1015
1568
  // 1. Interpolate variables in config (including {{workflow.*}}, {{context.*}}, allowlisted {{env.*}}, {{now}})
1016
- const interpolatedConfig = interpolateVariables(config, context.workflowContext, context.workflowInstance)
1569
+ const interpolatedConfig = interpolateActivityConfig(config, context, 'CALL_API')
1017
1570
 
1018
1571
  const {
1019
1572
  endpoint,
@@ -1207,16 +1760,40 @@ async function resolveActiveRoleIdsForUser(
1207
1760
  return scopedRoles.map((r: any) => r.id as string)
1208
1761
  }
1209
1762
 
1763
+ /**
1764
+ * Loads the instance's definition (including soft-deleted rows, so an execution
1765
+ * grant on a deleted definition still binds a run that is still executing).
1766
+ */
1767
+ async function loadInstanceDefinition(em: any, instance: CallApiInstanceLike) {
1768
+ if (!instance.definitionId) return null
1769
+ const { findOneWithDecryption } = await import('@open-mercato/shared/lib/encryption/find')
1770
+ const { WorkflowDefinition } = await import('../data/entities')
1771
+ return findOneWithDecryption(
1772
+ em,
1773
+ WorkflowDefinition,
1774
+ { id: instance.definitionId, tenantId: instance.tenantId },
1775
+ {},
1776
+ { tenantId: instance.tenantId, organizationId: instance.organizationId },
1777
+ )
1778
+ }
1779
+
1210
1780
  export async function resolveCallApiRoleIds(
1211
1781
  em: any,
1212
1782
  instance: CallApiInstanceLike
1213
1783
  ): Promise<string[]> {
1214
1784
  if (!instance.definitionId) return []
1215
1785
 
1216
- const { findOneWithDecryption } = await import('@open-mercato/shared/lib/encryption/find')
1217
- const { WorkflowDefinition } = await import('../data/entities')
1218
-
1219
1786
  const scope = { tenantId: instance.tenantId, organizationId: instance.organizationId }
1787
+ const definition = await loadInstanceDefinition(em, instance)
1788
+
1789
+ // 0. A definition that declares its own execution grant ALWAYS acts as its
1790
+ // own least-privilege principal, whoever started the run — otherwise a
1791
+ // CALL_API activity would mint a key carrying the starting admin's roles
1792
+ // and route straight around the grant.
1793
+ if (definitionDeclaresGrant(definition)) {
1794
+ const principalUserId = await resolveWorkflowDefinitionExecutionUserId(em, definition, null)
1795
+ return principalUserId ? resolveActiveRoleIdsForUser(em, principalUserId, scope) : []
1796
+ }
1220
1797
 
1221
1798
  // 1. Prefer the triggering user (whoever manually started this instance).
1222
1799
  // WorkflowInstance.metadata.initiatedBy is the canonical record of that
@@ -1231,17 +1808,48 @@ export async function resolveCallApiRoleIds(
1231
1808
 
1232
1809
  // 2. Event-triggered instance with no human initiator: fall back to the
1233
1810
  // definition author. Soft-deleted definitions must not mint keys.
1234
- const definition = await findOneWithDecryption(em, WorkflowDefinition, {
1235
- id: instance.definitionId,
1236
- tenantId: instance.tenantId,
1237
- deletedAt: null,
1238
- }, {}, scope)
1239
- const authorUserId = definition?.createdBy
1811
+ const authorUserId = definition?.deletedAt ? null : definition?.createdBy
1240
1812
  if (!authorUserId) return []
1241
1813
 
1242
1814
  return resolveActiveRoleIdsForUser(em, authorUserId, scope)
1243
1815
  }
1244
1816
 
1817
+ /**
1818
+ * Resolve the traceable principal user id an INVOKE_AGENT run executes as.
1819
+ *
1820
+ * Mirrors `resolveCallApiRoleIds`' principal chain so workflow-originated agent
1821
+ * runs carry the same audited identity as CALL_API:
1822
+ * 1. The instance's `metadata.initiatedBy` (whoever started it; inherited by
1823
+ * sub-workflows from the parent instance).
1824
+ * 2. The definition's `createdBy` (author) for event-triggered instances with
1825
+ * no human initiator. Soft-deleted definitions resolve to no principal.
1826
+ *
1827
+ * Both are outranked by the definition's own `grantedFeatures` execution
1828
+ * principal when it declares one (see `lib/definition-grant.ts`).
1829
+ *
1830
+ * Returns `null` when no traceable principal exists — callers MUST refuse rather
1831
+ * than fall back to an empty/anonymous user id (which breaks uuid columns and
1832
+ * bypasses RBAC attribution).
1833
+ */
1834
+ export async function resolveWorkflowPrincipalUserId(
1835
+ em: any,
1836
+ instance: CallApiInstanceLike
1837
+ ): Promise<string | null> {
1838
+ const definition = await loadInstanceDefinition(em, instance)
1839
+
1840
+ // 0. A declared execution grant outranks both — the run acts as its own
1841
+ // principal regardless of who started it.
1842
+ if (definitionDeclaresGrant(definition)) {
1843
+ return resolveWorkflowDefinitionExecutionUserId(em, definition, null)
1844
+ }
1845
+
1846
+ const initiatorUserId = instance.metadata?.initiatedBy ?? null
1847
+ if (initiatorUserId) return initiatorUserId
1848
+
1849
+ if (definition?.deletedAt) return null
1850
+ return definition?.createdBy ?? null
1851
+ }
1852
+
1245
1853
  /**
1246
1854
  * Build full API URL from endpoint
1247
1855
  * - Relative paths (/api/...) → prepend APP_URL
@@ -1311,6 +1919,106 @@ function classifyAndThrowError(status: number, body: any, url: string): never {
1311
1919
  // Helper Functions
1312
1920
  // ============================================================================
1313
1921
 
1922
+ type InterpolationBaseResolution =
1923
+ | { status: 'resolved'; value: unknown }
1924
+ | { status: 'unresolved-context'; contextPath: string }
1925
+ | { status: 'unknown-workflow-key'; workflowKey: string }
1926
+ | { status: 'env-not-allowlisted'; envKey: string }
1927
+
1928
+ function resolveInterpolationBaseValue(
1929
+ path: string,
1930
+ context: Record<string, any>,
1931
+ workflowInstance?: WorkflowInstance
1932
+ ): InterpolationBaseResolution {
1933
+ if (path.startsWith('workflow.') && workflowInstance) {
1934
+ const workflowKey = path.substring('workflow.'.length)
1935
+ switch (workflowKey) {
1936
+ case 'instanceId':
1937
+ return { status: 'resolved', value: workflowInstance.id }
1938
+ case 'tenantId':
1939
+ return { status: 'resolved', value: workflowInstance.tenantId }
1940
+ case 'organizationId':
1941
+ return { status: 'resolved', value: workflowInstance.organizationId }
1942
+ case 'currentStepId':
1943
+ return { status: 'resolved', value: workflowInstance.currentStepId }
1944
+ case 'workflowId':
1945
+ return { status: 'resolved', value: workflowInstance.workflowId }
1946
+ case 'version':
1947
+ return { status: 'resolved', value: workflowInstance.version }
1948
+ default:
1949
+ return { status: 'unknown-workflow-key', workflowKey }
1950
+ }
1951
+ }
1952
+
1953
+ if (path.startsWith('env.')) {
1954
+ const envKey = path.substring('env.'.length)
1955
+ if (!getWorkflowEnvInterpolationAllowlist().has(envKey)) {
1956
+ return { status: 'env-not-allowlisted', envKey }
1957
+ }
1958
+ return { status: 'resolved', value: process.env[envKey] ?? '' }
1959
+ }
1960
+
1961
+ if (path === 'now') {
1962
+ return { status: 'resolved', value: new Date().toISOString() }
1963
+ }
1964
+
1965
+ const contextPath = path.startsWith('context.') ? path.substring('context.'.length) : path
1966
+ const value = getNestedValue(context, contextPath)
1967
+ if (value !== undefined) return { status: 'resolved', value }
1968
+ return { status: 'unresolved-context', contextPath }
1969
+ }
1970
+
1971
+ function strictInterpolationError(rawToken: string, reason: string): WorkflowInterpolationError {
1972
+ return new WorkflowInterpolationError(
1973
+ `Cannot interpolate {{${rawToken}}}: ${reason}`,
1974
+ rawToken
1975
+ )
1976
+ }
1977
+
1978
+ function interpolateToken(
1979
+ rawToken: string,
1980
+ context: Record<string, any>,
1981
+ workflowInstance: WorkflowInstance | undefined,
1982
+ strict: boolean
1983
+ ): { resolved: boolean; value?: unknown } {
1984
+ const parsedToken = parseInterpolationToken(rawToken)
1985
+ if (!parsedToken.ok) {
1986
+ if (strict) throw strictInterpolationError(rawToken, parsedToken.error)
1987
+ return { resolved: false }
1988
+ }
1989
+ const resolution = resolveInterpolationBaseValue(parsedToken.path, context, workflowInstance)
1990
+ if (resolution.status === 'unknown-workflow-key') {
1991
+ if (strict) throw strictInterpolationError(rawToken, `unknown workflow key "${resolution.workflowKey}"`)
1992
+ return { resolved: false }
1993
+ }
1994
+ if (resolution.status === 'env-not-allowlisted') {
1995
+ if (strict) throw strictInterpolationError(rawToken, `env variable "${resolution.envKey}" is not allowlisted`)
1996
+ }
1997
+ const baseValue =
1998
+ resolution.status === 'resolved'
1999
+ ? resolution.value
2000
+ : resolution.status === 'env-not-allowlisted'
2001
+ ? ''
2002
+ : undefined
2003
+ if (parsedToken.transforms.length === 0) {
2004
+ if (resolution.status === 'unresolved-context') {
2005
+ if (strict) throw strictInterpolationError(rawToken, `context path "${resolution.contextPath}" is not defined`)
2006
+ return { resolved: false }
2007
+ }
2008
+ return { resolved: true, value: baseValue }
2009
+ }
2010
+ const transformed = applyTransforms(baseValue, parsedToken.transforms)
2011
+ if (!transformed.ok) {
2012
+ if (strict) throw strictInterpolationError(rawToken, transformed.error.message)
2013
+ return { resolved: false }
2014
+ }
2015
+ if (transformed.value === undefined) {
2016
+ if (strict) throw strictInterpolationError(rawToken, 'the transform pipeline produced no value')
2017
+ return { resolved: false }
2018
+ }
2019
+ return { resolved: true, value: transformed.value }
2020
+ }
2021
+
1314
2022
  /**
1315
2023
  * Interpolate variables in config from workflow context
1316
2024
  *
@@ -1322,115 +2030,47 @@ function classifyAndThrowError(status: number, body: any, url: string): never {
1322
2030
  * - {{workflow.currentStepId}} - current step ID
1323
2031
  * - {{env.VAR_NAME}} - server-allowlisted environment variables
1324
2032
  * - {{now}} - current ISO timestamp
2033
+ * - {{ path | transform(args) | ... }} - pill transform pipeline
2034
+ * (`lib/interpolation-pipeline.ts`): a fixed table of pure transforms folded
2035
+ * over the resolved base value. Lenient behavior (the default): an
2036
+ * unparseable token, an unresolved path without a rescuing `default`, or a
2037
+ * failed transform passes the original token/config through unchanged. In
2038
+ * strict mode (`options.mode: 'strict'`, opted in per definition) the same
2039
+ * situations throw `WorkflowInterpolationError` naming the offending token;
2040
+ * only a `default(...)` transform can rescue an unresolved context path.
1325
2041
  */
1326
- function interpolateVariables(
2042
+ export function interpolateVariables(
1327
2043
  config: any,
1328
2044
  context: Record<string, any>,
1329
- workflowInstance?: WorkflowInstance
2045
+ workflowInstance?: WorkflowInstance,
2046
+ options?: { mode?: WorkflowInterpolationMode }
1330
2047
  ): any {
2048
+ const strict = options?.mode === 'strict'
1331
2049
  if (typeof config === 'string') {
1332
2050
  // Check if this is a single variable reference (e.g., "{{context.cart.items}}")
1333
2051
  // This preserves the original type (array, object, number, boolean)
1334
2052
  const singleVarMatch = config.match(/^\{\{([^}]+)\}\}$/)
1335
2053
 
1336
2054
  if (singleVarMatch) {
1337
- const trimmedPath = singleVarMatch[1].trim()
1338
-
1339
- // Handle {{workflow.*}} variables
1340
- if (trimmedPath.startsWith('workflow.') && workflowInstance) {
1341
- const workflowKey = trimmedPath.substring('workflow.'.length)
1342
- switch (workflowKey) {
1343
- case 'instanceId':
1344
- return workflowInstance.id
1345
- case 'tenantId':
1346
- return workflowInstance.tenantId
1347
- case 'organizationId':
1348
- return workflowInstance.organizationId
1349
- case 'currentStepId':
1350
- return workflowInstance.currentStepId
1351
- case 'workflowId':
1352
- return workflowInstance.workflowId
1353
- case 'version':
1354
- return workflowInstance.version // Return as number
1355
- default:
1356
- return config // Return original if unknown
1357
- }
1358
- }
1359
-
1360
- // Handle {{env.*}} variables
1361
- if (trimmedPath.startsWith('env.')) {
1362
- const envKey = trimmedPath.substring('env.'.length)
1363
- return resolveWorkflowEnvInterpolation(envKey)
1364
- }
1365
-
1366
- // Handle {{now}} - current timestamp
1367
- if (trimmedPath === 'now') {
1368
- return new Date().toISOString()
1369
- }
1370
-
1371
- // Handle {{context.*}} variables (default behavior)
1372
- const contextPath = trimmedPath.startsWith('context.')
1373
- ? trimmedPath.substring('context.'.length)
1374
- : trimmedPath
1375
-
1376
- const value = getNestedValue(context, contextPath)
1377
- return value !== undefined ? value : config // Return raw value to preserve type
2055
+ const outcome = interpolateToken(singleVarMatch[1], context, workflowInstance, strict)
2056
+ return outcome.resolved ? outcome.value : config
1378
2057
  }
1379
2058
 
1380
2059
  // Multiple interpolations or mixed text - return string
1381
- return config.replace(/\{\{([^}]+)\}\}/g, (match, path) => {
1382
- const trimmedPath = path.trim()
1383
-
1384
- // Handle {{workflow.*}} variables
1385
- if (trimmedPath.startsWith('workflow.') && workflowInstance) {
1386
- const workflowKey = trimmedPath.substring('workflow.'.length)
1387
- switch (workflowKey) {
1388
- case 'instanceId':
1389
- return workflowInstance.id
1390
- case 'tenantId':
1391
- return workflowInstance.tenantId
1392
- case 'organizationId':
1393
- return workflowInstance.organizationId
1394
- case 'currentStepId':
1395
- return workflowInstance.currentStepId
1396
- case 'workflowId':
1397
- return workflowInstance.workflowId
1398
- case 'version':
1399
- return String(workflowInstance.version)
1400
- default:
1401
- return match // Unknown workflow key
1402
- }
1403
- }
1404
-
1405
- // Handle {{env.*}} variables
1406
- if (trimmedPath.startsWith('env.')) {
1407
- const envKey = trimmedPath.substring('env.'.length)
1408
- return resolveWorkflowEnvInterpolation(envKey)
1409
- }
1410
-
1411
- // Handle {{now}} - current timestamp
1412
- if (trimmedPath === 'now') {
1413
- return new Date().toISOString()
1414
- }
1415
-
1416
- // Handle {{context.*}} variables (default behavior)
1417
- const contextPath = trimmedPath.startsWith('context.')
1418
- ? trimmedPath.substring('context.'.length)
1419
- : trimmedPath
1420
-
1421
- const value = getNestedValue(context, contextPath)
1422
- return value !== undefined ? String(value) : match
2060
+ return config.replace(/\{\{([^}]+)\}\}/g, (match, token) => {
2061
+ const outcome = interpolateToken(token, context, workflowInstance, strict)
2062
+ return outcome.resolved ? String(outcome.value) : match
1423
2063
  })
1424
2064
  }
1425
2065
 
1426
2066
  if (Array.isArray(config)) {
1427
- return config.map((item) => interpolateVariables(item, context, workflowInstance))
2067
+ return config.map((item) => interpolateVariables(item, context, workflowInstance, options))
1428
2068
  }
1429
2069
 
1430
2070
  if (config && typeof config === 'object') {
1431
2071
  const result: Record<string, any> = {}
1432
2072
  for (const [key, value] of Object.entries(config)) {
1433
- result[key] = interpolateVariables(value, context, workflowInstance)
2073
+ result[key] = interpolateVariables(value, context, workflowInstance, options)
1434
2074
  }
1435
2075
  return result
1436
2076
  }
@@ -1438,6 +2078,24 @@ function interpolateVariables(
1438
2078
  return config
1439
2079
  }
1440
2080
 
2081
+ function interpolateActivityConfig(
2082
+ config: any,
2083
+ context: ActivityContext,
2084
+ activityType: ActivityType,
2085
+ activityName?: string
2086
+ ): any {
2087
+ try {
2088
+ return interpolateVariables(config, context.workflowContext, context.workflowInstance, {
2089
+ mode: context.interpolationMode,
2090
+ })
2091
+ } catch (error) {
2092
+ if (error instanceof WorkflowInterpolationError) {
2093
+ throw new ActivityExecutionError(error.message, activityType, activityName, { token: error.token })
2094
+ }
2095
+ throw error
2096
+ }
2097
+ }
2098
+
1441
2099
  /**
1442
2100
  * Get nested value from object by path (e.g., "user.email")
1443
2101
  */
@@ -1504,3 +2162,14 @@ async function executeWithTimeout<T>(
1504
2162
  clearTimeout(timeoutId!)
1505
2163
  }
1506
2164
  }
2165
+
2166
+ bindActivityExecutor({
2167
+ executeSendEmail,
2168
+ executeEmitEvent,
2169
+ executeUpdateEntity,
2170
+ executeCallWebhook,
2171
+ executeFunction,
2172
+ executeCallApi,
2173
+ executeSetVariable,
2174
+ executeInvokeAgent,
2175
+ })