@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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/workflows/lib/parallel-handler.ts"],
4
- "sourcesContent": ["/**\n * Workflows Module - Parallel Fork / Join Handler\n *\n * Implements PARALLEL_FORK / PARALLEL_JOIN execution with a multi-token model:\n *\n * - `openFork` turns a PARALLEL_FORK step into N persistent branch tokens\n * (`WorkflowBranchInstance`), one per outgoing `auto` transition, and puts the\n * instance into the dormant `FORKED` state.\n * - `advanceBranches` runs the interleaved loop: while the instance is FORKED it\n * advances each ACTIVE branch one step at a time (BPMN semantics \u2014 single lock,\n * no thread-level concurrency). A branch pauses independently (USER_TASK /\n * signal / timer / async activity) without blocking siblings.\n * - When every branch has reached its JOIN (wait-all), `fireJoin` merges the\n * branch namespaces back into `instance.context`, applies optional\n * `outputMapping`, and resumes the root token at the step after the JOIN.\n * - A failed branch cancels its siblings and fails the whole instance.\n *\n * All work happens under the executor's pessimistic instance lock + transaction,\n * so wait-all counting and JOIN firing are race-free.\n */\n\nimport { EntityManager, LockMode } from '@mikro-orm/core'\nimport type { AwilixContainer } from 'awilix'\nimport {\n WorkflowInstance,\n WorkflowBranchInstance,\n WorkflowDefinition,\n StepInstance,\n UserTask,\n WorkflowEvent,\n} from '../data/entities'\nimport { logWorkflowEvent } from './event-logger'\nimport * as stepHandler from './step-handler'\nimport { branchToken } from './execution-token'\n\nexport interface AdvanceBranchesResult {\n outcome: 'joined' | 'waiting' | 'failed'\n error?: string\n}\n\nexport interface ResumeBranchOptions {\n instanceId: string\n branchInstanceId: string\n tenantId: string\n organizationId: string\n /** Values merged into the branch's private namespace before resuming (task form data, signal payload, \u2026). */\n contextMerge?: Record<string, any>\n /** Step instance to exit (the paused step's instance) before the branch advances past it. */\n exitStepInstanceId?: string | null\n exitOutput?: any\n}\n\n/**\n * Resume a single paused/waiting branch: optionally merge data into its\n * namespace, exit its paused step instance, and mark it ACTIVE. The caller then\n * re-enters `executeWorkflow` (FORKED mode) so the interleaved loop advances the\n * branch and, if it is the last to arrive, fires the JOIN.\n *\n * Idempotent: a re-delivered signal/timer/task on an already-ACTIVE or terminal\n * branch is a no-op. Returns false when there is nothing to resume.\n */\nexport async function resumeBranch(\n em: EntityManager,\n options: ResumeBranchOptions,\n): Promise<boolean> {\n const branch = await em.findOne(WorkflowBranchInstance, {\n id: options.branchInstanceId,\n workflowInstanceId: options.instanceId,\n tenantId: options.tenantId,\n organizationId: options.organizationId,\n })\n\n if (!branch) return false\n if (branch.status !== 'PAUSED' && branch.status !== 'WAITING_FOR_ACTIVITIES') {\n // Already active or terminal \u2014 re-delivery; nothing to do.\n return false\n }\n\n const now = new Date()\n if (options.contextMerge) {\n branch.contextNamespace = { ...(branch.contextNamespace || {}), ...options.contextMerge }\n }\n\n if (options.exitStepInstanceId) {\n const stepInstance = await em.findOne(StepInstance, {\n id: options.exitStepInstanceId,\n workflowInstanceId: options.instanceId,\n status: 'ACTIVE',\n })\n if (stepInstance) {\n await stepHandler.exitStep(em, stepInstance, options.exitOutput)\n }\n }\n\n branch.status = 'ACTIVE'\n branch.pendingTransition = null\n branch.updatedAt = now\n await em.flush()\n\n return true\n}\n\ninterface ParallelContext {\n userId?: string\n}\n\nfunction normalizeWorkflowUserId(value: unknown): string | null {\n if (typeof value !== 'string') return null\n const trimmed = value.trim()\n if (!trimmed || trimmed.startsWith('trigger:')) return null\n return trimmed\n}\n\nfunction getNestedValue(obj: any, path: string): any {\n return path.split('.').reduce((current, key) => (current == null ? undefined : current[key]), obj)\n}\n\n/**\n * Open a PARALLEL_FORK: create one ACTIVE branch per outgoing `auto` transition\n * and mark the instance FORKED. Branch tokens start positioned ON the fork step\n * so the interleaved loop runs each branch's fork transition (and its\n * activities) in that branch's own context.\n */\nexport async function openFork(\n em: EntityManager,\n instance: WorkflowInstance,\n definition: WorkflowDefinition,\n forkStepDef: any,\n): Promise<void> {\n const forkStepId: string = forkStepDef.stepId\n const joinStepId: string | undefined = forkStepDef.config?.joinStepId\n if (!joinStepId) {\n throw new Error(`[internal] PARALLEL_FORK \"${forkStepId}\" missing config.joinStepId`)\n }\n\n const outgoing = (definition.definition.transitions || []).filter(\n (transition: any) => transition.fromStepId === forkStepId && transition.trigger === 'auto',\n )\n\n const now = new Date()\n const branchKeys: string[] = []\n for (const transition of outgoing) {\n branchKeys.push(transition.transitionId)\n const branch = em.create(WorkflowBranchInstance, {\n workflowInstanceId: instance.id,\n forkStepId,\n joinStepId,\n branchKey: transition.transitionId,\n parentBranchId: null,\n // Start ON the fork; advanceBranches runs the branch_key transition first.\n currentStepId: forkStepId,\n status: 'ACTIVE',\n contextNamespace: {},\n tenantId: instance.tenantId,\n organizationId: instance.organizationId,\n startedAt: now,\n createdAt: now,\n updatedAt: now,\n })\n em.persist(branch)\n }\n\n instance.status = 'FORKED'\n instance.activeForkStepId = forkStepId\n instance.updatedAt = now\n await em.flush()\n\n await logWorkflowEvent(em, {\n workflowInstanceId: instance.id,\n eventType: 'PARALLEL_FORK_OPENED',\n eventData: { forkStepId, joinStepId, branchKeys },\n tenantId: instance.tenantId,\n organizationId: instance.organizationId,\n })\n}\n\n/**\n * Resume a branch that was WAITING_FOR_ACTIVITIES after its async activities\n * finished. Mirrors the instance-level resume but scoped to the branch:\n * merges completed-activity outputs into the branch namespace, advances the\n * branch's pending transition target, and marks it ACTIVE (or FAILED if any\n * async activity failed). The caller re-enters the interleaved loop.\n */\nexport async function resumeBranchAfterActivities(\n em: EntityManager,\n container: AwilixContainer,\n instanceId: string,\n branchInstanceId: string,\n): Promise<{ continueExecution: boolean }> {\n const branch = await em.findOne(\n WorkflowBranchInstance,\n { id: branchInstanceId, workflowInstanceId: instanceId },\n { lockMode: LockMode.PESSIMISTIC_WRITE },\n )\n if (!branch) {\n throw new Error('[internal] Branch not found during async resume')\n }\n if (branch.status !== 'WAITING_FOR_ACTIVITIES') {\n // Re-delivery or already advanced \u2014 nothing to do.\n return { continueExecution: false }\n }\n\n const namespace = branch.contextNamespace || {}\n const pendingJobIds = (namespace._pendingAsyncActivities as any[]) || []\n\n const completedEvents = await em.find(WorkflowEvent, {\n workflowInstanceId: instanceId,\n branchInstanceId,\n eventType: 'ACTIVITY_COMPLETED',\n eventData: { async: true },\n })\n const failedCount = await em.count(WorkflowEvent, {\n workflowInstanceId: instanceId,\n branchInstanceId,\n eventType: 'ACTIVITY_FAILED',\n eventData: { async: true },\n })\n\n if (completedEvents.length + failedCount < pendingJobIds.length) {\n // Still waiting on other branch activities.\n return { continueExecution: false }\n }\n\n const now = new Date()\n if (failedCount > 0) {\n branch.status = 'FAILED'\n branch.errorMessage = `${failedCount} async activities failed in branch \"${branch.branchKey}\"`\n branch.updatedAt = now\n await em.flush()\n // The interleaved loop will observe the FAILED branch and cancel siblings.\n return { continueExecution: true }\n }\n\n const mergedNamespace: Record<string, any> = { ...namespace }\n for (const event of completedEvents) {\n if (event.eventData?.output) {\n mergedNamespace[`${event.eventData.activityId}_result`] = event.eventData.output\n }\n }\n delete mergedNamespace._pendingAsyncActivities\n branch.contextNamespace = mergedNamespace\n\n const pending = branch.pendingTransition\n branch.pendingTransition = null\n branch.status = 'ACTIVE'\n branch.updatedAt = now\n await em.flush()\n\n // Execute the destination step in branch context (mirrors the instance-level\n // resume) so the branch cursor lands on an executed step. The step may pause\n // the branch again (e.g. a following USER_TASK); that is handled by the loop.\n if (pending) {\n const instance = await em.findOne(WorkflowInstance, { id: instanceId })\n if (instance) {\n branch.currentStepId = pending.toStepId\n await em.flush()\n await stepHandler.executeStep(\n em,\n instance,\n pending.toStepId,\n {\n workflowContext: { ...(instance.context || {}), ...(branch.contextNamespace || {}) },\n userId: normalizeWorkflowUserId(instance.metadata?.initiatedBy) ?? undefined,\n },\n container,\n branch,\n )\n }\n }\n\n return { continueExecution: true }\n}\n\n/**\n * Interleaved branch execution loop. Advances ACTIVE branches one step at a\n * time until either all branches reach the JOIN (\u2192 fireJoin \u2192 'joined'), a\n * branch fails (\u2192 cancel siblings + 'failed'), or no branch is ACTIVE because\n * they are all waiting on external resume (\u2192 'waiting').\n */\nexport async function advanceBranches(\n em: EntityManager,\n container: AwilixContainer,\n instance: WorkflowInstance,\n definition: WorkflowDefinition,\n context: ParallelContext,\n): Promise<AdvanceBranchesResult> {\n const forkStepId = instance.activeForkStepId\n if (!forkStepId) {\n throw new Error('[internal] advanceBranches called but instance has no active fork')\n }\n\n // Branch-aware iteration budget: each branch gets the same per-token budget as\n // the single-token loop, so fan-out alone never trips the guard.\n const allBranchesForBudget = await em.find(WorkflowBranchInstance, {\n workflowInstanceId: instance.id,\n forkStepId,\n })\n const maxIterations = Math.max(1, allBranchesForBudget.length) * 100\n let iterations = 0\n\n while (iterations < maxIterations) {\n iterations++\n\n const branches = await em.find(WorkflowBranchInstance, {\n workflowInstanceId: instance.id,\n forkStepId,\n })\n\n const active = branches.filter((b) => b.status === 'ACTIVE')\n\n if (active.length === 0) {\n const failed = branches.find((b) => b.status === 'FAILED')\n if (failed) {\n // A branch failed out-of-band (e.g. async-activity resume marked it\n // FAILED); cancel any non-terminal siblings before failing the instance.\n await cancelSiblings(em, instance, failed)\n return { outcome: 'failed', error: failed.errorMessage || 'Branch failed' }\n }\n if (branches.every((b) => b.status === 'COMPLETED')) {\n await fireJoin(em, instance, definition, branches, forkStepId)\n return { outcome: 'joined' }\n }\n // Some branches paused/waiting for external resume \u2014 instance idles.\n return { outcome: 'waiting' }\n }\n\n for (const branch of active) {\n const result = await advanceOneBranch(em, container, instance, definition, branch, context)\n if (result === 'failed') {\n await cancelSiblings(em, instance, branch)\n return { outcome: 'failed', error: branch.errorMessage || 'Branch failed' }\n }\n }\n }\n\n throw new Error('[internal] Maximum branch execution iterations reached - possible infinite loop')\n}\n\n/**\n * Advance a single ACTIVE branch by one step. Returns 'failed' if the branch\n * failed; otherwise mutates branch state (advanced / completed@join / paused).\n */\nasync function advanceOneBranch(\n em: EntityManager,\n container: AwilixContainer,\n instance: WorkflowInstance,\n definition: WorkflowDefinition,\n branch: WorkflowBranchInstance,\n context: ParallelContext,\n): Promise<'advanced' | 'failed'> {\n // Already at the join \u2192 synchronize (mark completed, do not execute the join).\n if (branch.currentStepId === branch.joinStepId) {\n await completeBranchAtJoin(em, instance, branch)\n return 'advanced'\n }\n\n const transitionHandler = await import('./transition-handler')\n\n const token = branchToken(instance, branch)\n // Token read context = instance snapshot overlaid with branch namespace.\n const readContext = { ...(instance.context || {}), ...(branch.contextNamespace || {}) }\n const evalContext = { workflowContext: readContext, userId: context.userId }\n\n // Select the transition to take. Branches positioned on the fork follow their\n // own branch_key transition; otherwise pick the highest-priority valid auto one.\n let selected: any | null = null\n if (branch.currentStepId === branch.forkStepId) {\n selected = (definition.definition.transitions || []).find(\n (transition: any) => transition.transitionId === branch.branchKey,\n ) || null\n } else {\n const valid = await transitionHandler.findValidTransitions(\n em,\n instance,\n branch.currentStepId,\n evalContext,\n )\n const validAuto = valid.filter((vt) => vt.isValid && vt.transition?.trigger === 'auto')\n selected = validAuto.length > 0 ? validAuto[0].transition : null\n }\n\n if (!selected) {\n // No outgoing transition and not at the join \u2192 the branch is stuck.\n await failBranch(em, instance, branch, `Branch \"${branch.branchKey}\" has no valid transition from \"${branch.currentStepId}\"`)\n return 'failed'\n }\n\n try {\n const transitionResult = await transitionHandler.executeTransitionForToken(\n em,\n container,\n token,\n selected.fromStepId,\n selected.toStepId,\n evalContext,\n )\n\n if (!transitionResult.success) {\n await failBranch(em, instance, branch, transitionResult.error || 'Branch transition failed')\n return 'failed'\n }\n\n // executeTransitionForToken set branch.currentStepId = toStepId. If that is\n // the join, synchronize now (the join step itself is a no-op).\n if (branch.currentStepId === branch.joinStepId) {\n await completeBranchAtJoin(em, instance, branch)\n }\n return 'advanced'\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n await failBranch(em, instance, branch, message)\n return 'failed'\n }\n}\n\nasync function completeBranchAtJoin(\n em: EntityManager,\n instance: WorkflowInstance,\n branch: WorkflowBranchInstance,\n): Promise<void> {\n const now = new Date()\n branch.status = 'COMPLETED'\n branch.completedAt = now\n branch.updatedAt = now\n await em.flush()\n\n await logWorkflowEvent(em, {\n workflowInstanceId: instance.id,\n branchInstanceId: branch.id,\n eventType: 'PARALLEL_BRANCH_COMPLETED',\n eventData: { branchKey: branch.branchKey, joinStepId: branch.joinStepId },\n tenantId: instance.tenantId,\n organizationId: instance.organizationId,\n })\n}\n\nasync function failBranch(\n em: EntityManager,\n instance: WorkflowInstance,\n branch: WorkflowBranchInstance,\n message: string,\n): Promise<void> {\n const now = new Date()\n branch.status = 'FAILED'\n branch.errorMessage = message\n branch.updatedAt = now\n await em.flush()\n\n await logWorkflowEvent(em, {\n workflowInstanceId: instance.id,\n branchInstanceId: branch.id,\n eventType: 'PARALLEL_BRANCH_FAILED',\n eventData: { branchKey: branch.branchKey, error: message },\n tenantId: instance.tenantId,\n organizationId: instance.organizationId,\n })\n}\n\n/**\n * Cancel sibling branches of a failed branch (best-effort), cancel their open\n * user tasks, and log a cancellation event per branch.\n */\nasync function cancelSiblings(\n em: EntityManager,\n instance: WorkflowInstance,\n failedBranch: WorkflowBranchInstance,\n): Promise<void> {\n const siblings = await em.find(WorkflowBranchInstance, {\n workflowInstanceId: instance.id,\n forkStepId: failedBranch.forkStepId,\n })\n\n const now = new Date()\n for (const sibling of siblings) {\n if (sibling.id === failedBranch.id) continue\n if (sibling.status === 'ACTIVE' || sibling.status === 'PAUSED' || sibling.status === 'WAITING_FOR_ACTIVITIES') {\n sibling.status = 'CANCELLED'\n sibling.updatedAt = now\n\n // Best-effort: cancel the branch's open user tasks.\n const openTasks = await em.find(UserTask, {\n workflowInstanceId: instance.id,\n branchInstanceId: sibling.id,\n status: 'PENDING',\n })\n for (const task of openTasks) {\n task.status = 'CANCELLED'\n task.updatedAt = now\n }\n\n await em.flush()\n\n await logWorkflowEvent(em, {\n workflowInstanceId: instance.id,\n branchInstanceId: sibling.id,\n eventType: 'PARALLEL_BRANCH_CANCELLED',\n eventData: { branchKey: sibling.branchKey, reason: 'sibling-failed' },\n tenantId: instance.tenantId,\n organizationId: instance.organizationId,\n })\n }\n }\n\n await logWorkflowEvent(em, {\n workflowInstanceId: instance.id,\n eventType: 'PARALLEL_FORK_FAILED',\n eventData: { forkStepId: failedBranch.forkStepId, failedBranchKey: failedBranch.branchKey },\n tenantId: instance.tenantId,\n organizationId: instance.organizationId,\n })\n}\n\n/**\n * Fire the JOIN once all branches are COMPLETED: merge each branch namespace\n * under `instance.context.branches[branchKey]`, apply optional outputMapping to\n * lift selected values to the top level, then resume the root token at the step\n * after the JOIN.\n */\nasync function fireJoin(\n em: EntityManager,\n instance: WorkflowInstance,\n definition: WorkflowDefinition,\n branches: WorkflowBranchInstance[],\n forkStepId: string,\n): Promise<void> {\n const joinStepId = branches[0]?.joinStepId\n if (!joinStepId) {\n throw new Error('[internal] fireJoin called without a join step id')\n }\n\n const joinStep = definition.definition.steps.find((s: any) => s.stepId === joinStepId)\n\n // Deterministic merge \u2014 no silent collisions: each branch keeps its own slot.\n const branchesContext: Record<string, any> = { ...(instance.context?.branches || {}) }\n const mergedBranchKeys: string[] = []\n for (const branch of branches) {\n branchesContext[branch.branchKey] = branch.contextNamespace || {}\n mergedBranchKeys.push(branch.branchKey)\n }\n\n let nextContext: Record<string, any> = {\n ...(instance.context || {}),\n branches: branchesContext,\n }\n\n // Optional outputMapping: topLevelKey -> 'branches.<branchKey>.<path>'. The\n // reserved `branches` slot map is never overwritten \u2014 guard it explicitly so a\n // mapping cannot clobber the per-branch namespaces.\n const outputMapping: Record<string, string> | undefined = joinStep?.config?.outputMapping\n if (outputMapping) {\n for (const [topKey, sourcePath] of Object.entries(outputMapping)) {\n if (topKey === 'branches') continue\n const value = getNestedValue(nextContext, sourcePath)\n if (value !== undefined) nextContext[topKey] = value\n }\n }\n\n // Park the root token ON the JOIN step (not its successor) and let the\n // single-token executor loop run the JOIN's outgoing transition. Jumping\n // straight to the post-join step would bypass stepHandler.executeStep() for\n // that step \u2014 so a following USER_TASK / WAIT_FOR_TIMER / WAIT_FOR_SIGNAL would\n // never have its task created / timer enqueued / signal wait registered (the\n // instance would hang), and any activities on the JOIN's outgoing transition\n // would be skipped. The JOIN step itself is a no-op, so the loop simply runs\n // its outgoing transition through the normal step-entry path.\n const afterJoinStepId = (definition.definition.transitions || []).find(\n (transition: any) => transition.fromStepId === joinStepId,\n )?.toStepId ?? null\n\n const now = new Date()\n instance.context = nextContext\n instance.status = 'RUNNING'\n instance.activeForkStepId = null\n instance.currentStepId = joinStepId\n instance.updatedAt = now\n await em.flush()\n\n await logWorkflowEvent(em, {\n workflowInstanceId: instance.id,\n eventType: 'PARALLEL_JOIN_COMPLETED',\n eventData: { forkStepId, joinStepId, mergedBranchKeys, afterJoinStepId },\n tenantId: instance.tenantId,\n organizationId: instance.organizationId,\n })\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Workflows Module - Parallel Fork / Join Handler\n *\n * Implements PARALLEL_FORK / PARALLEL_JOIN execution with a multi-token model:\n *\n * - `openFork` turns a PARALLEL_FORK step into N persistent branch tokens\n * (`WorkflowBranchInstance`), one per outgoing `auto` transition, and puts the\n * instance into the dormant `FORKED` state.\n * - `advanceBranches` runs the interleaved loop: while the instance is FORKED it\n * advances each ACTIVE branch one step at a time (BPMN semantics \u2014 single lock,\n * no thread-level concurrency). A branch pauses independently (USER_TASK /\n * signal / timer / async activity) without blocking siblings.\n * - When every branch has reached its JOIN (wait-all), `fireJoin` merges the\n * branch namespaces back into `instance.context`, applies optional\n * `outputMapping`, and resumes the root token at the step after the JOIN.\n * - A failed branch cancels its siblings and fails the whole instance.\n *\n * All work happens under the executor's pessimistic instance lock + transaction,\n * so wait-all counting and JOIN firing are race-free.\n */\n\nimport { EntityManager, LockMode } from '@mikro-orm/core'\nimport type { AwilixContainer } from 'awilix'\nimport {\n WorkflowInstance,\n WorkflowBranchInstance,\n WorkflowDefinition,\n StepInstance,\n UserTask,\n WorkflowEvent,\n} from '../data/entities'\nimport { logWorkflowEvent } from './event-logger'\nimport * as stepHandler from './step-handler'\nimport { branchToken, mergeTokenContext, type ExecutionToken } from './execution-token'\nimport { WORKFLOW_ERROR_CONTEXT_KEY, buildErrorContextEntry } from './error-routing'\n\nexport interface AdvanceBranchesResult {\n outcome: 'joined' | 'waiting' | 'failed'\n error?: string\n}\n\nexport interface ResumeBranchOptions {\n instanceId: string\n branchInstanceId: string\n tenantId: string\n organizationId: string\n /** Values merged into the branch's private namespace before resuming (task form data, signal payload, \u2026). */\n contextMerge?: Record<string, any>\n /** Step instance to exit (the paused step's instance) before the branch advances past it. */\n exitStepInstanceId?: string | null\n exitOutput?: any\n}\n\n/**\n * Resume a single paused/waiting branch: optionally merge data into its\n * namespace, exit its paused step instance, and mark it ACTIVE. The caller then\n * re-enters `executeWorkflow` (FORKED mode) so the interleaved loop advances the\n * branch and, if it is the last to arrive, fires the JOIN.\n *\n * Idempotent: a re-delivered signal/timer/task on an already-ACTIVE or terminal\n * branch is a no-op. Returns false when there is nothing to resume.\n */\nexport async function resumeBranch(\n em: EntityManager,\n options: ResumeBranchOptions,\n): Promise<boolean> {\n const branch = await em.findOne(WorkflowBranchInstance, {\n id: options.branchInstanceId,\n workflowInstanceId: options.instanceId,\n tenantId: options.tenantId,\n organizationId: options.organizationId,\n })\n\n if (!branch) return false\n if (branch.status !== 'PAUSED' && branch.status !== 'WAITING_FOR_ACTIVITIES') {\n // Already active or terminal \u2014 re-delivery; nothing to do.\n return false\n }\n\n const now = new Date()\n if (options.contextMerge) {\n branch.contextNamespace = { ...(branch.contextNamespace || {}), ...options.contextMerge }\n }\n\n if (options.exitStepInstanceId) {\n const stepInstance = await em.findOne(StepInstance, {\n id: options.exitStepInstanceId,\n workflowInstanceId: options.instanceId,\n status: 'ACTIVE',\n })\n if (stepInstance) {\n await stepHandler.exitStep(em, stepInstance, options.exitOutput)\n }\n }\n\n branch.status = 'ACTIVE'\n branch.pendingTransition = null\n branch.updatedAt = now\n await em.flush()\n\n return true\n}\n\ninterface ParallelContext {\n userId?: string\n}\n\nfunction normalizeWorkflowUserId(value: unknown): string | null {\n if (typeof value !== 'string') return null\n const trimmed = value.trim()\n if (!trimmed || trimmed.startsWith('trigger:')) return null\n return trimmed\n}\n\nfunction getNestedValue(obj: any, path: string): any {\n return path.split('.').reduce((current, key) => (current == null ? undefined : current[key]), obj)\n}\n\n/**\n * Open a PARALLEL_FORK: create one ACTIVE branch per outgoing `auto` transition\n * and mark the instance FORKED. Branch tokens start positioned ON the fork step\n * so the interleaved loop runs each branch's fork transition (and its\n * activities) in that branch's own context.\n */\nexport async function openFork(\n em: EntityManager,\n instance: WorkflowInstance,\n definition: WorkflowDefinition,\n forkStepDef: any,\n): Promise<void> {\n const forkStepId: string = forkStepDef.stepId\n const joinStepId: string | undefined = forkStepDef.config?.joinStepId\n if (!joinStepId) {\n throw new Error(`[internal] PARALLEL_FORK \"${forkStepId}\" missing config.joinStepId`)\n }\n\n const outgoing = (definition.definition.transitions || []).filter(\n (transition: any) => transition.fromStepId === forkStepId && transition.trigger === 'auto',\n )\n\n const now = new Date()\n const branchKeys: string[] = []\n for (const transition of outgoing) {\n branchKeys.push(transition.transitionId)\n const branch = em.create(WorkflowBranchInstance, {\n workflowInstanceId: instance.id,\n forkStepId,\n joinStepId,\n branchKey: transition.transitionId,\n parentBranchId: null,\n // Start ON the fork; advanceBranches runs the branch_key transition first.\n currentStepId: forkStepId,\n status: 'ACTIVE',\n contextNamespace: {},\n tenantId: instance.tenantId,\n organizationId: instance.organizationId,\n startedAt: now,\n createdAt: now,\n updatedAt: now,\n })\n em.persist(branch)\n }\n\n instance.status = 'FORKED'\n instance.activeForkStepId = forkStepId\n instance.updatedAt = now\n await em.flush()\n\n await logWorkflowEvent(em, {\n workflowInstanceId: instance.id,\n eventType: 'PARALLEL_FORK_OPENED',\n eventData: { forkStepId, joinStepId, branchKeys },\n tenantId: instance.tenantId,\n organizationId: instance.organizationId,\n })\n}\n\n/**\n * Resume a branch that was WAITING_FOR_ACTIVITIES after its async activities\n * finished. Mirrors the instance-level resume but scoped to the branch:\n * merges completed-activity outputs into the branch namespace, advances the\n * branch's pending transition target, and marks it ACTIVE (or FAILED if any\n * async activity failed). The caller re-enters the interleaved loop.\n */\nexport async function resumeBranchAfterActivities(\n em: EntityManager,\n container: AwilixContainer,\n instanceId: string,\n branchInstanceId: string,\n): Promise<{ continueExecution: boolean }> {\n const branch = await em.findOne(\n WorkflowBranchInstance,\n { id: branchInstanceId, workflowInstanceId: instanceId },\n { lockMode: LockMode.PESSIMISTIC_WRITE },\n )\n if (!branch) {\n throw new Error('[internal] Branch not found during async resume')\n }\n if (branch.status !== 'WAITING_FOR_ACTIVITIES') {\n // Re-delivery or already advanced \u2014 nothing to do.\n return { continueExecution: false }\n }\n\n const namespace = branch.contextNamespace || {}\n const pendingJobIds = (namespace._pendingAsyncActivities as any[]) || []\n\n const completedEvents = await em.find(WorkflowEvent, {\n workflowInstanceId: instanceId,\n branchInstanceId,\n eventType: 'ACTIVITY_COMPLETED',\n eventData: { async: true },\n })\n const failedCount = await em.count(WorkflowEvent, {\n workflowInstanceId: instanceId,\n branchInstanceId,\n eventType: 'ACTIVITY_FAILED',\n eventData: { async: true },\n })\n\n if (completedEvents.length + failedCount < pendingJobIds.length) {\n // Still waiting on other branch activities.\n return { continueExecution: false }\n }\n\n const now = new Date()\n if (failedCount > 0) {\n branch.status = 'FAILED'\n branch.errorMessage = `${failedCount} async activities failed in branch \"${branch.branchKey}\"`\n branch.updatedAt = now\n await em.flush()\n // The interleaved loop will observe the FAILED branch and cancel siblings.\n return { continueExecution: true }\n }\n\n const mergedNamespace: Record<string, any> = { ...namespace }\n for (const event of completedEvents) {\n if (event.eventData?.output) {\n mergedNamespace[`${event.eventData.activityId}_result`] = event.eventData.output\n }\n }\n delete mergedNamespace._pendingAsyncActivities\n branch.contextNamespace = mergedNamespace\n\n const pending = branch.pendingTransition\n branch.pendingTransition = null\n branch.status = 'ACTIVE'\n branch.updatedAt = now\n await em.flush()\n\n // Execute the destination step in branch context (mirrors the instance-level\n // resume) so the branch cursor lands on an executed step. The step may pause\n // the branch again (e.g. a following USER_TASK); that is handled by the loop.\n if (pending) {\n const instance = await em.findOne(WorkflowInstance, { id: instanceId })\n if (instance) {\n branch.currentStepId = pending.toStepId\n await em.flush()\n await stepHandler.executeStep(\n em,\n instance,\n pending.toStepId,\n {\n workflowContext: { ...(instance.context || {}), ...(branch.contextNamespace || {}) },\n userId: normalizeWorkflowUserId(instance.metadata?.initiatedBy) ?? undefined,\n },\n container,\n branch,\n )\n }\n }\n\n return { continueExecution: true }\n}\n\n/**\n * Interleaved branch execution loop. Advances ACTIVE branches one step at a\n * time until either all branches reach the JOIN (\u2192 fireJoin \u2192 'joined'), a\n * branch fails (\u2192 cancel siblings + 'failed'), or no branch is ACTIVE because\n * they are all waiting on external resume (\u2192 'waiting').\n */\nexport async function advanceBranches(\n em: EntityManager,\n container: AwilixContainer,\n instance: WorkflowInstance,\n definition: WorkflowDefinition,\n context: ParallelContext,\n): Promise<AdvanceBranchesResult> {\n const forkStepId = instance.activeForkStepId\n if (!forkStepId) {\n throw new Error('[internal] advanceBranches called but instance has no active fork')\n }\n\n // Branch-aware iteration budget: each branch gets the same per-token budget as\n // the single-token loop, so fan-out alone never trips the guard.\n const allBranchesForBudget = await em.find(WorkflowBranchInstance, {\n workflowInstanceId: instance.id,\n forkStepId,\n })\n const maxIterations = Math.max(1, allBranchesForBudget.length) * 100\n let iterations = 0\n\n while (iterations < maxIterations) {\n iterations++\n\n const branches = await em.find(WorkflowBranchInstance, {\n workflowInstanceId: instance.id,\n forkStepId,\n })\n\n const active = branches.filter((b) => b.status === 'ACTIVE')\n\n if (active.length === 0) {\n const failed = branches.find((b) => b.status === 'FAILED')\n if (failed) {\n // A branch failed out-of-band (e.g. async-activity resume marked it\n // FAILED); cancel any non-terminal siblings before failing the instance.\n await cancelSiblings(em, instance, failed)\n return { outcome: 'failed', error: failed.errorMessage || 'Branch failed' }\n }\n if (branches.every((b) => b.status === 'COMPLETED')) {\n await fireJoin(em, instance, definition, branches, forkStepId)\n return { outcome: 'joined' }\n }\n // Some branches paused/waiting for external resume \u2014 instance idles.\n return { outcome: 'waiting' }\n }\n\n for (const branch of active) {\n const result = await advanceOneBranch(em, container, instance, definition, branch, context)\n if (result === 'failed') {\n await cancelSiblings(em, instance, branch)\n return { outcome: 'failed', error: branch.errorMessage || 'Branch failed' }\n }\n }\n }\n\n throw new Error('[internal] Maximum branch execution iterations reached - possible infinite loop')\n}\n\n/**\n * Advance a single ACTIVE branch by one step. Returns 'failed' if the branch\n * failed; otherwise mutates branch state (advanced / completed@join / paused).\n */\nasync function advanceOneBranch(\n em: EntityManager,\n container: AwilixContainer,\n instance: WorkflowInstance,\n definition: WorkflowDefinition,\n branch: WorkflowBranchInstance,\n context: ParallelContext,\n): Promise<'advanced' | 'failed'> {\n // Already at the join \u2192 synchronize (mark completed, do not execute the join).\n if (branch.currentStepId === branch.joinStepId) {\n await completeBranchAtJoin(em, instance, branch)\n return 'advanced'\n }\n\n const transitionHandler = await import('./transition-handler')\n\n const token = branchToken(instance, branch)\n // Token read context = instance snapshot overlaid with branch namespace.\n const readContext = { ...(instance.context || {}), ...(branch.contextNamespace || {}) }\n const evalContext = { workflowContext: readContext, userId: context.userId }\n\n // Select the transition to take. Branches positioned on the fork follow their\n // own branch_key transition; otherwise pick the highest-priority valid auto one.\n let selected: any | null = null\n if (branch.currentStepId === branch.forkStepId) {\n selected = (definition.definition.transitions || []).find(\n (transition: any) => transition.transitionId === branch.branchKey,\n ) || null\n } else {\n const valid = await transitionHandler.findValidTransitions(\n em,\n instance,\n branch.currentStepId,\n evalContext,\n )\n const validAuto = valid.filter((vt) => vt.isValid && vt.transition?.trigger === 'auto')\n selected = validAuto.length > 0 ? validAuto[0].transition : null\n }\n\n if (!selected) {\n // No outgoing transition and not at the join \u2192 the branch is stuck.\n await failBranch(em, instance, branch, `Branch \"${branch.branchKey}\" has no valid transition from \"${branch.currentStepId}\"`)\n return 'failed'\n }\n\n try {\n const transitionResult = await transitionHandler.executeTransitionForToken(\n em,\n container,\n token,\n selected.fromStepId,\n selected.toStepId,\n { ...evalContext, transitionId: selected.transitionId },\n )\n\n if (!transitionResult.success) {\n // Error routing (spec 5.9) inside a branch: a wired error route is taken\n // in the branch itself, so only unhandled failures propagate to the\n // instance. The failure-queue directive is deliberately instance-level and\n // is not honored per branch \u2014 such a branch keeps failing as it does today.\n const routed = await followBranchErrorRoute(\n em,\n container,\n instance,\n branch,\n token,\n transitionResult,\n evalContext,\n )\n if (routed) {\n if (branch.currentStepId === branch.joinStepId) {\n await completeBranchAtJoin(em, instance, branch)\n }\n return 'advanced'\n }\n await failBranch(em, instance, branch, transitionResult.error || 'Branch transition failed')\n return 'failed'\n }\n\n // executeTransitionForToken set branch.currentStepId = toStepId. If that is\n // the join, synchronize now (the join step itself is a no-op).\n if (branch.currentStepId === branch.joinStepId) {\n await completeBranchAtJoin(em, instance, branch)\n }\n return 'advanced'\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n await failBranch(em, instance, branch, message)\n return 'failed'\n }\n}\n\n/**\n * Follow a branch step's wired error route with the branch token, so the branch\n * keeps its own cursor and context namespace. Returns false when the transition\n * result carries no route or the route could not be taken.\n */\nasync function followBranchErrorRoute(\n em: EntityManager,\n container: AwilixContainer,\n instance: WorkflowInstance,\n branch: WorkflowBranchInstance,\n token: ExecutionToken,\n transitionResult: { failedStepId?: string; errorRoute?: { transitionId?: string; toStepId: string }; error?: string },\n evalContext: { workflowContext: Record<string, any>; userId?: string },\n): Promise<boolean> {\n const { failedStepId, errorRoute } = transitionResult\n if (!failedStepId || !errorRoute) return false\n\n const error = transitionResult.error || 'Branch transition failed'\n await logWorkflowEvent(em, {\n workflowInstanceId: instance.id,\n branchInstanceId: branch.id,\n eventType: 'ERROR_ROUTED',\n eventData: {\n failedStepId,\n toStepId: errorRoute.toStepId,\n transitionId: errorRoute.transitionId,\n branchKey: branch.branchKey,\n error,\n },\n tenantId: instance.tenantId,\n organizationId: instance.organizationId,\n })\n\n const errorEntry = buildErrorContextEntry(failedStepId, error)\n mergeTokenContext(token, { [WORKFLOW_ERROR_CONTEXT_KEY]: errorEntry })\n await em.flush()\n\n const transitionHandler = await import('./transition-handler')\n const routedResult = await transitionHandler.executeTransitionForToken(\n em,\n container,\n token,\n failedStepId,\n errorRoute.toStepId,\n {\n ...evalContext,\n workflowContext: {\n ...evalContext.workflowContext,\n [WORKFLOW_ERROR_CONTEXT_KEY]: errorEntry,\n },\n transitionId: errorRoute.transitionId,\n },\n )\n\n return routedResult.success === true\n}\n\nasync function completeBranchAtJoin(\n em: EntityManager,\n instance: WorkflowInstance,\n branch: WorkflowBranchInstance,\n): Promise<void> {\n const now = new Date()\n branch.status = 'COMPLETED'\n branch.completedAt = now\n branch.updatedAt = now\n await em.flush()\n\n await logWorkflowEvent(em, {\n workflowInstanceId: instance.id,\n branchInstanceId: branch.id,\n eventType: 'PARALLEL_BRANCH_COMPLETED',\n eventData: { branchKey: branch.branchKey, joinStepId: branch.joinStepId },\n tenantId: instance.tenantId,\n organizationId: instance.organizationId,\n })\n}\n\nasync function failBranch(\n em: EntityManager,\n instance: WorkflowInstance,\n branch: WorkflowBranchInstance,\n message: string,\n): Promise<void> {\n const now = new Date()\n branch.status = 'FAILED'\n branch.errorMessage = message\n branch.updatedAt = now\n await em.flush()\n\n await logWorkflowEvent(em, {\n workflowInstanceId: instance.id,\n branchInstanceId: branch.id,\n eventType: 'PARALLEL_BRANCH_FAILED',\n eventData: { branchKey: branch.branchKey, error: message },\n tenantId: instance.tenantId,\n organizationId: instance.organizationId,\n })\n}\n\n/**\n * Cancel sibling branches of a failed branch (best-effort), cancel their open\n * user tasks, and log a cancellation event per branch.\n */\nasync function cancelSiblings(\n em: EntityManager,\n instance: WorkflowInstance,\n failedBranch: WorkflowBranchInstance,\n): Promise<void> {\n const siblings = await em.find(WorkflowBranchInstance, {\n workflowInstanceId: instance.id,\n forkStepId: failedBranch.forkStepId,\n })\n\n const now = new Date()\n for (const sibling of siblings) {\n if (sibling.id === failedBranch.id) continue\n if (sibling.status === 'ACTIVE' || sibling.status === 'PAUSED' || sibling.status === 'WAITING_FOR_ACTIVITIES') {\n sibling.status = 'CANCELLED'\n sibling.updatedAt = now\n\n // Best-effort: cancel the branch's open user tasks.\n const openTasks = await em.find(UserTask, {\n workflowInstanceId: instance.id,\n branchInstanceId: sibling.id,\n status: 'PENDING',\n })\n for (const task of openTasks) {\n task.status = 'CANCELLED'\n task.updatedAt = now\n }\n\n await em.flush()\n\n await logWorkflowEvent(em, {\n workflowInstanceId: instance.id,\n branchInstanceId: sibling.id,\n eventType: 'PARALLEL_BRANCH_CANCELLED',\n eventData: { branchKey: sibling.branchKey, reason: 'sibling-failed' },\n tenantId: instance.tenantId,\n organizationId: instance.organizationId,\n })\n }\n }\n\n await logWorkflowEvent(em, {\n workflowInstanceId: instance.id,\n eventType: 'PARALLEL_FORK_FAILED',\n eventData: { forkStepId: failedBranch.forkStepId, failedBranchKey: failedBranch.branchKey },\n tenantId: instance.tenantId,\n organizationId: instance.organizationId,\n })\n}\n\n/**\n * Fire the JOIN once all branches are COMPLETED: merge each branch namespace\n * under `instance.context.branches[branchKey]`, apply optional outputMapping to\n * lift selected values to the top level, then resume the root token at the step\n * after the JOIN.\n */\nasync function fireJoin(\n em: EntityManager,\n instance: WorkflowInstance,\n definition: WorkflowDefinition,\n branches: WorkflowBranchInstance[],\n forkStepId: string,\n): Promise<void> {\n const joinStepId = branches[0]?.joinStepId\n if (!joinStepId) {\n throw new Error('[internal] fireJoin called without a join step id')\n }\n\n const joinStep = definition.definition.steps.find((s: any) => s.stepId === joinStepId)\n\n // Deterministic merge \u2014 no silent collisions: each branch keeps its own slot.\n const branchesContext: Record<string, any> = { ...(instance.context?.branches || {}) }\n const mergedBranchKeys: string[] = []\n for (const branch of branches) {\n branchesContext[branch.branchKey] = branch.contextNamespace || {}\n mergedBranchKeys.push(branch.branchKey)\n }\n\n let nextContext: Record<string, any> = {\n ...(instance.context || {}),\n branches: branchesContext,\n }\n\n // Optional outputMapping: topLevelKey -> 'branches.<branchKey>.<path>'. The\n // reserved `branches` slot map is never overwritten \u2014 guard it explicitly so a\n // mapping cannot clobber the per-branch namespaces.\n const outputMapping: Record<string, string> | undefined = joinStep?.config?.outputMapping\n if (outputMapping) {\n for (const [topKey, sourcePath] of Object.entries(outputMapping)) {\n if (topKey === 'branches') continue\n const value = getNestedValue(nextContext, sourcePath)\n if (value !== undefined) nextContext[topKey] = value\n }\n }\n\n // Park the root token ON the JOIN step (not its successor) and let the\n // single-token executor loop run the JOIN's outgoing transition. Jumping\n // straight to the post-join step would bypass stepHandler.executeStep() for\n // that step \u2014 so a following USER_TASK / WAIT_FOR_TIMER / WAIT_FOR_SIGNAL would\n // never have its task created / timer enqueued / signal wait registered (the\n // instance would hang), and any activities on the JOIN's outgoing transition\n // would be skipped. The JOIN step itself is a no-op, so the loop simply runs\n // its outgoing transition through the normal step-entry path.\n const afterJoinStepId = (definition.definition.transitions || []).find(\n (transition: any) => transition.fromStepId === joinStepId,\n )?.toStepId ?? null\n\n const now = new Date()\n instance.context = nextContext\n instance.status = 'RUNNING'\n instance.activeForkStepId = null\n instance.currentStepId = joinStepId\n instance.updatedAt = now\n await em.flush()\n\n await logWorkflowEvent(em, {\n workflowInstanceId: instance.id,\n eventType: 'PARALLEL_JOIN_COMPLETED',\n eventData: { forkStepId, joinStepId, mergedBranchKeys, afterJoinStepId },\n tenantId: instance.tenantId,\n organizationId: instance.organizationId,\n })\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,54 @@
1
+ import { parseBooleanToken } from "@open-mercato/shared/lib/boolean";
2
+ function validateAgainstPorts(values, ports) {
3
+ const source = values ?? {};
4
+ const coerced = { ...source };
5
+ const errors = [];
6
+ for (const port of ports) {
7
+ const raw = source[port.name];
8
+ const isAbsent = raw === void 0 || raw === null || raw === "";
9
+ if (isAbsent) {
10
+ if (port.required) {
11
+ errors.push({ port: port.name, message: `Required port "${port.name}" is missing` });
12
+ }
13
+ continue;
14
+ }
15
+ const result = coercePortValue(raw, port);
16
+ if (result.error) {
17
+ errors.push({ port: port.name, message: result.error });
18
+ continue;
19
+ }
20
+ coerced[port.name] = result.value;
21
+ }
22
+ return { coerced, errors };
23
+ }
24
+ function coercePortValue(raw, port) {
25
+ switch (port.type) {
26
+ case "text":
27
+ return { value: String(raw) };
28
+ case "number": {
29
+ const parsed = typeof raw === "number" ? raw : Number(raw);
30
+ return Number.isNaN(parsed) ? { error: `Port "${port.name}" expects a number` } : { value: parsed };
31
+ }
32
+ case "boolean": {
33
+ const parsed = typeof raw === "boolean" ? raw : parseBooleanToken(typeof raw === "string" ? raw : String(raw));
34
+ return parsed === null ? { error: `Port "${port.name}" expects a boolean` } : { value: parsed };
35
+ }
36
+ case "select": {
37
+ const text = String(raw);
38
+ if (port.options && port.options.length > 0 && !port.options.includes(text)) {
39
+ return { error: `Port "${port.name}" must be one of: ${port.options.join(", ")}` };
40
+ }
41
+ return { value: text };
42
+ }
43
+ case "date": {
44
+ const date = raw instanceof Date ? raw : new Date(typeof raw === "number" ? raw : String(raw));
45
+ return Number.isNaN(date.getTime()) ? { error: `Port "${port.name}" expects a valid date` } : { value: date.toISOString() };
46
+ }
47
+ default:
48
+ return { value: raw };
49
+ }
50
+ }
51
+ export {
52
+ validateAgainstPorts
53
+ };
54
+ //# sourceMappingURL=port-contract.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/workflows/lib/port-contract.ts"],
4
+ "sourcesContent": ["/**\n * Workflows Module - Sub-workflow Port Contract Validation\n *\n * Coerces and validates a flat values object against a declared list of port\n * fields (the `definition.io.inputs` / `definition.io.outputs` contract). Used\n * at the SUB_WORKFLOW boundary so mapped inputs entering a child and mapped\n * outputs leaving it conform to the child's declared, business-user-authored\n * contract.\n *\n * Validation is opt-in by contract presence: the caller only invokes this when\n * a child declares ports, so legacy untyped sub-workflows are unaffected.\n *\n * Coercion is intentionally permissive on representation (numeric strings,\n * boolean tokens, ISO/epoch dates) but strict on validity \u2014 an uncoercible\n * value or a missing required port produces an error rather than silently\n * dropping the field.\n */\n\nimport { parseBooleanToken } from '@open-mercato/shared/lib/boolean'\nimport type { PortField } from '../data/validators'\n\nexport interface PortValidationError {\n port: string\n message: string\n}\n\nexport interface PortValidationResult {\n coerced: Record<string, any>\n errors: PortValidationError[]\n}\n\n/**\n * Validate and coerce `values` against the declared `ports`.\n *\n * Declared ports are coerced into the contract's type; keys not covered by a\n * port pass through unchanged (so a partial contract does not strip unrelated\n * context). A required port that is absent, or a value that cannot be coerced\n * to its declared type, is reported as an error.\n */\nexport function validateAgainstPorts(\n values: Record<string, any> | null | undefined,\n ports: PortField[],\n): PortValidationResult {\n const source = values ?? {}\n const coerced: Record<string, any> = { ...source }\n const errors: PortValidationError[] = []\n\n for (const port of ports) {\n const raw = source[port.name]\n const isAbsent = raw === undefined || raw === null || raw === ''\n\n if (isAbsent) {\n if (port.required) {\n errors.push({ port: port.name, message: `Required port \"${port.name}\" is missing` })\n }\n continue\n }\n\n const result = coercePortValue(raw, port)\n if (result.error) {\n errors.push({ port: port.name, message: result.error })\n continue\n }\n coerced[port.name] = result.value\n }\n\n return { coerced, errors }\n}\n\nfunction coercePortValue(raw: any, port: PortField): { value?: any; error?: string } {\n switch (port.type) {\n case 'text':\n return { value: String(raw) }\n\n case 'number': {\n const parsed = typeof raw === 'number' ? raw : Number(raw)\n return Number.isNaN(parsed)\n ? { error: `Port \"${port.name}\" expects a number` }\n : { value: parsed }\n }\n\n case 'boolean': {\n const parsed = typeof raw === 'boolean' ? raw : parseBooleanToken(typeof raw === 'string' ? raw : String(raw))\n return parsed === null\n ? { error: `Port \"${port.name}\" expects a boolean` }\n : { value: parsed }\n }\n\n case 'select': {\n const text = String(raw)\n if (port.options && port.options.length > 0 && !port.options.includes(text)) {\n return { error: `Port \"${port.name}\" must be one of: ${port.options.join(', ')}` }\n }\n return { value: text }\n }\n\n case 'date': {\n const date = raw instanceof Date ? raw : new Date(typeof raw === 'number' ? raw : String(raw))\n return Number.isNaN(date.getTime())\n ? { error: `Port \"${port.name}\" expects a valid date` }\n : { value: date.toISOString() }\n }\n\n default:\n return { value: raw }\n }\n}\n"],
5
+ "mappings": "AAkBA,SAAS,yBAAyB;AAqB3B,SAAS,qBACd,QACA,OACsB;AACtB,QAAM,SAAS,UAAU,CAAC;AAC1B,QAAM,UAA+B,EAAE,GAAG,OAAO;AACjD,QAAM,SAAgC,CAAC;AAEvC,aAAW,QAAQ,OAAO;AACxB,UAAM,MAAM,OAAO,KAAK,IAAI;AAC5B,UAAM,WAAW,QAAQ,UAAa,QAAQ,QAAQ,QAAQ;AAE9D,QAAI,UAAU;AACZ,UAAI,KAAK,UAAU;AACjB,eAAO,KAAK,EAAE,MAAM,KAAK,MAAM,SAAS,kBAAkB,KAAK,IAAI,eAAe,CAAC;AAAA,MACrF;AACA;AAAA,IACF;AAEA,UAAM,SAAS,gBAAgB,KAAK,IAAI;AACxC,QAAI,OAAO,OAAO;AAChB,aAAO,KAAK,EAAE,MAAM,KAAK,MAAM,SAAS,OAAO,MAAM,CAAC;AACtD;AAAA,IACF;AACA,YAAQ,KAAK,IAAI,IAAI,OAAO;AAAA,EAC9B;AAEA,SAAO,EAAE,SAAS,OAAO;AAC3B;AAEA,SAAS,gBAAgB,KAAU,MAAkD;AACnF,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,EAAE,OAAO,OAAO,GAAG,EAAE;AAAA,IAE9B,KAAK,UAAU;AACb,YAAM,SAAS,OAAO,QAAQ,WAAW,MAAM,OAAO,GAAG;AACzD,aAAO,OAAO,MAAM,MAAM,IACtB,EAAE,OAAO,SAAS,KAAK,IAAI,qBAAqB,IAChD,EAAE,OAAO,OAAO;AAAA,IACtB;AAAA,IAEA,KAAK,WAAW;AACd,YAAM,SAAS,OAAO,QAAQ,YAAY,MAAM,kBAAkB,OAAO,QAAQ,WAAW,MAAM,OAAO,GAAG,CAAC;AAC7G,aAAO,WAAW,OACd,EAAE,OAAO,SAAS,KAAK,IAAI,sBAAsB,IACjD,EAAE,OAAO,OAAO;AAAA,IACtB;AAAA,IAEA,KAAK,UAAU;AACb,YAAM,OAAO,OAAO,GAAG;AACvB,UAAI,KAAK,WAAW,KAAK,QAAQ,SAAS,KAAK,CAAC,KAAK,QAAQ,SAAS,IAAI,GAAG;AAC3E,eAAO,EAAE,OAAO,SAAS,KAAK,IAAI,qBAAqB,KAAK,QAAQ,KAAK,IAAI,CAAC,GAAG;AAAA,MACnF;AACA,aAAO,EAAE,OAAO,KAAK;AAAA,IACvB;AAAA,IAEA,KAAK,QAAQ;AACX,YAAM,OAAO,eAAe,OAAO,MAAM,IAAI,KAAK,OAAO,QAAQ,WAAW,MAAM,OAAO,GAAG,CAAC;AAC7F,aAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,IAC9B,EAAE,OAAO,SAAS,KAAK,IAAI,yBAAyB,IACpD,EAAE,OAAO,KAAK,YAAY,EAAE;AAAA,IAClC;AAAA,IAEA;AACE,aAAO,EAAE,OAAO,IAAI;AAAA,EACxB;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,89 @@
1
+ import { findWithDecryption } from "@open-mercato/shared/lib/encryption/find";
2
+ import { CustomerUser } from "@open-mercato/core/modules/customer_accounts/data/entities";
3
+ import {
4
+ decideTaskVisibility
5
+ } from "./task-visibility.js";
6
+ import { toTaskFacts } from "./task-visibility-request.js";
7
+ const PORTAL_TASKS_VIEW_FEATURE = "portal.tasks.view";
8
+ const PORTAL_TASKS_COMPLETE_FEATURE = "portal.tasks.complete";
9
+ const PORTAL_ENTITY_ACCESS = /* @__PURE__ */ new Map();
10
+ const PORTAL_POLICY = { businessContextEnabled: true };
11
+ const PORTAL_NO_COMPANY_BODY = {
12
+ ok: false,
13
+ error: "No company association"
14
+ };
15
+ const PORTAL_TASK_NOT_FOUND_BODY = {
16
+ ok: false,
17
+ error: "Task not found"
18
+ };
19
+ function pushIfPresent(target, value) {
20
+ if (typeof value === "string" && value.length > 0) target.add(value);
21
+ }
22
+ async function resolvePortalTaskPrincipal(input) {
23
+ const { auth, em, isPortalAdmin } = input;
24
+ if (!auth.customerEntityId) {
25
+ return { ok: false, status: 403, body: PORTAL_NO_COMPANY_BODY };
26
+ }
27
+ const ownedRecordIds = /* @__PURE__ */ new Set();
28
+ pushIfPresent(ownedRecordIds, auth.customerEntityId);
29
+ pushIfPresent(ownedRecordIds, auth.personEntityId);
30
+ const assigneeIds = /* @__PURE__ */ new Set([auth.sub]);
31
+ if (isPortalAdmin) {
32
+ const members = await findWithDecryption(
33
+ em,
34
+ CustomerUser,
35
+ {
36
+ customerEntityId: auth.customerEntityId,
37
+ tenantId: auth.tenantId,
38
+ deletedAt: null
39
+ },
40
+ { fields: ["id", "personEntityId", "customerEntityId"] },
41
+ { tenantId: auth.tenantId, organizationId: auth.orgId }
42
+ );
43
+ for (const member of members) {
44
+ assigneeIds.add(member.id);
45
+ pushIfPresent(ownedRecordIds, member.personEntityId);
46
+ pushIfPresent(ownedRecordIds, member.customerEntityId);
47
+ }
48
+ }
49
+ return {
50
+ ok: true,
51
+ principal: {
52
+ kind: "portal",
53
+ principalId: auth.sub,
54
+ tenantId: auth.tenantId,
55
+ organizationId: auth.orgId,
56
+ ownedRecordIds,
57
+ isPortalAdmin
58
+ },
59
+ assigneeIds: [...assigneeIds]
60
+ };
61
+ }
62
+ function buildPortalTaskConditions(input) {
63
+ return {
64
+ tenantId: input.principal.tenantId,
65
+ organizationId: input.principal.organizationId,
66
+ assigneeKind: "customer",
67
+ assignedTo: { $in: [...input.assigneeIds] },
68
+ entityTypes: { $ne: null }
69
+ };
70
+ }
71
+ function decidePortalTaskAccess(principal, task) {
72
+ return decideTaskVisibility(principal, toTaskFacts(task), PORTAL_ENTITY_ACCESS, PORTAL_POLICY);
73
+ }
74
+ function filterVisiblePortalTasks(principal, tasks) {
75
+ return tasks.filter((task) => decidePortalTaskAccess(principal, task).visible);
76
+ }
77
+ const PORTAL_TASK_REFUSAL = { status: 404, body: PORTAL_TASK_NOT_FOUND_BODY };
78
+ export {
79
+ PORTAL_NO_COMPANY_BODY,
80
+ PORTAL_TASKS_COMPLETE_FEATURE,
81
+ PORTAL_TASKS_VIEW_FEATURE,
82
+ PORTAL_TASK_NOT_FOUND_BODY,
83
+ PORTAL_TASK_REFUSAL,
84
+ buildPortalTaskConditions,
85
+ decidePortalTaskAccess,
86
+ filterVisiblePortalTasks,
87
+ resolvePortalTaskPrincipal
88
+ };
89
+ //# sourceMappingURL=portal-task-access.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/workflows/lib/portal-task-access.ts"],
4
+ "sourcesContent": ["/**\n * Per-request wiring for the \u00A76.4 rule on the PORTAL side.\n *\n * The counterpart to `lib/task-visibility-request.ts`. Same contract: the pure\n * predicate (`lib/task-visibility.ts`) decides, this module only assembles its\n * inputs and turns the expressible half into a `WHERE`. A second copy of the\n * rule anywhere is a review failure.\n *\n * ## Three things this file exists to get exactly right\n *\n * **1. A task with no bindings DENIES.** The backoffice branch passes an empty\n * binding set vacuously, because a backoffice principal already carries an\n * org-membership grant and being assigned a task inside your own tenant is a\n * complete authorization story. A portal principal carries no such grant: the\n * binding to their own record *is* the entire authorization, so with no binding\n * there is nothing to authorize against. The predicate answers\n * `denied:portal-unbound`; this module additionally excludes those rows in SQL\n * (`entity_types IS NOT NULL`) so `pagination.total` does not count rows the\n * predicate then drops.\n *\n * **2. `isPortalAdmin` buys nothing.** `customerAuth.ts` replaces a portal\n * admin's grants with the literal `['*']`, and `CustomerRbacService` short-\n * circuits `userHasAllFeatures` before any matching, so *every* feature check\n * passes for them. Therefore no feature check may take part in the ownership\n * decision: `PortalTaskPrincipal` carries no feature array at all, ownership is\n * a `Set.has` against `ownedRecordIds`, and `isPortalAdmin` is consulted last\n * and only to widen `visible` \u2014 never `actable`, never ownership.\n *\n * **3. The two id spaces are not interchangeable.** `assignedTo` on a portal\n * task names a `CustomerUser.id` (the JWT `sub`). A binding's `entityId` names a\n * customer/person ENTITY RECORD. They are resolved from the same company query\n * and used in different places: user ids drive the SQL assignee arm, record ids\n * drive the ownership `Set.has`. Feeding one where the other belongs would make\n * a portal admin's own user id \"own\" a record.\n *\n * ## Company scoping\n *\n * Copied from `customer_accounts/api/portal/users.ts` verbatim, including its\n * hard precondition: no `customerEntityId` \u21D2 403 \"No company association\" and\n * an empty owned set. A portal user who belongs to no company owns nothing, so\n * they see nothing, admin or not.\n *\n * Note `customerEntityId` / `personEntityId` are JWT claims read straight off\n * the token and not re-verified per request, so a user moved between companies\n * keeps stale ownership until their token turns over (design \u00A79 item 8).\n */\n\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport { findWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport type { CustomerAuthContext } from '@open-mercato/core/modules/customer_accounts/lib/customerAuth'\nimport { CustomerUser } from '@open-mercato/core/modules/customer_accounts/data/entities'\nimport { UserTask } from '../data/entities'\nimport {\n decideTaskVisibility,\n type PortalTaskPrincipal,\n type TaskEntityAccessMap,\n type TaskVisibilityDecision,\n type TaskVisibilityPolicy,\n} from './task-visibility'\nimport { toTaskFacts } from './task-visibility-request'\n\n/** Portal ACL features. New ids on an ADDITIVE-ONLY surface \u2014 nothing renamed. */\nexport const PORTAL_TASKS_VIEW_FEATURE = 'portal.tasks.view'\nexport const PORTAL_TASKS_COMPLETE_FEATURE = 'portal.tasks.complete'\n\n/**\n * The portal branch reads NEITHER of these \u2014 it decides on structure, tenant,\n * organization, `assignee_kind` and record ownership alone. They exist because\n * `decideTaskVisibility` takes one shape for both principals. Frozen here so no\n * route invents a map that could accidentally start meaning something.\n */\nconst PORTAL_ENTITY_ACCESS: TaskEntityAccessMap = new Map()\nconst PORTAL_POLICY: TaskVisibilityPolicy = { businessContextEnabled: true }\n\nexport type PortalTaskPrincipalResolution =\n | { ok: true; principal: PortalTaskPrincipal; assigneeIds: readonly string[] }\n | { ok: false; status: 403; body: Record<string, unknown> }\n\n/**\n * Refusal body copied verbatim from `portal/users.ts` so the whole portal\n * answers a company-less principal the same way.\n */\nexport const PORTAL_NO_COMPANY_BODY: Record<string, unknown> = {\n ok: false,\n error: 'No company association',\n}\n\nexport const PORTAL_TASK_NOT_FOUND_BODY: Record<string, unknown> = {\n ok: false,\n error: 'Task not found',\n}\n\nfunction pushIfPresent(target: Set<string>, value: string | null | undefined): void {\n if (typeof value === 'string' && value.length > 0) target.add(value)\n}\n\n/**\n * Assemble the portal principal for this request.\n *\n * `assigneeIds` is the set of `CustomerUser.id` values whose tasks this\n * principal may be shown \u2014 themselves, plus every company member when they are\n * a portal admin. It is the SQL arm; `ownedRecordIds` is the ownership check.\n * Both come from the one company query.\n */\nexport async function resolvePortalTaskPrincipal(input: {\n auth: CustomerAuthContext\n em: EntityManager\n isPortalAdmin: boolean\n}): Promise<PortalTaskPrincipalResolution> {\n const { auth, em, isPortalAdmin } = input\n\n if (!auth.customerEntityId) {\n return { ok: false, status: 403, body: PORTAL_NO_COMPANY_BODY }\n }\n\n const ownedRecordIds = new Set<string>()\n pushIfPresent(ownedRecordIds, auth.customerEntityId)\n pushIfPresent(ownedRecordIds, auth.personEntityId)\n\n const assigneeIds = new Set<string>([auth.sub])\n\n if (isPortalAdmin) {\n // The exact filter `portal/users.ts` uses, so \"my company\" means the same\n // thing on both surfaces.\n const members = await findWithDecryption<CustomerUser>(\n em,\n CustomerUser,\n {\n customerEntityId: auth.customerEntityId,\n tenantId: auth.tenantId,\n deletedAt: null,\n },\n { fields: ['id', 'personEntityId', 'customerEntityId'] },\n { tenantId: auth.tenantId, organizationId: auth.orgId },\n )\n for (const member of members) {\n assigneeIds.add(member.id)\n pushIfPresent(ownedRecordIds, member.personEntityId)\n pushIfPresent(ownedRecordIds, member.customerEntityId)\n }\n }\n\n return {\n ok: true,\n principal: {\n kind: 'portal',\n principalId: auth.sub,\n tenantId: auth.tenantId,\n organizationId: auth.orgId,\n ownedRecordIds,\n isPortalAdmin,\n },\n assigneeIds: [...assigneeIds],\n }\n}\n\n/**\n * The expressible half of the portal rule as ORM conditions.\n *\n * Three structural filters and no fourth:\n *\n * - `assignee_kind = 'customer'` keeps every backoffice row out of the portal\n * result set entirely, independent of the predicate. It is defence 3 of 4\n * against the `['*']` wildcard.\n * - `assigned_to IN (\u2026)` narrows to this principal (plus their company members\n * for an admin). Ownership is still checked afterwards by the predicate \u2014 this\n * only avoids fetching rows that cannot survive it.\n * - `entity_types IS NOT NULL` drops unbound rows, which the predicate denies\n * anyway. Doing it in SQL is what keeps `pagination.total` honest.\n *\n * Ownership itself is NOT expressible: it is a containment test over the\n * `entity_bindings` jsonb against a per-principal id set. The predicate answers\n * it, and any row it drops that SQL admitted is an authoring anomaly, not a\n * routine case.\n */\nexport function buildPortalTaskConditions(input: {\n principal: PortalTaskPrincipal\n assigneeIds: readonly string[]\n}): Record<string, unknown> {\n return {\n tenantId: input.principal.tenantId,\n organizationId: input.principal.organizationId,\n assigneeKind: 'customer',\n assignedTo: { $in: [...input.assigneeIds] },\n entityTypes: { $ne: null },\n }\n}\n\n/** The predicate's answer for one already-loaded row, portal side. */\nexport function decidePortalTaskAccess(\n principal: PortalTaskPrincipal,\n task: UserTask,\n): TaskVisibilityDecision {\n return decideTaskVisibility(principal, toTaskFacts(task), PORTAL_ENTITY_ACCESS, PORTAL_POLICY)\n}\n\n/**\n * The rows of an already-filtered page the predicate agrees are visible.\n *\n * The SQL above is not the whole rule \u2014 ownership is not expressible \u2014 so unlike\n * the backoffice list this genuinely drops rows: a task assigned to a company\n * member but bound to a record outside the company. Dropping is the correct\n * direction, and the caller logs the divergence rather than hiding it.\n */\nexport function filterVisiblePortalTasks(\n principal: PortalTaskPrincipal,\n tasks: readonly UserTask[],\n): UserTask[] {\n return tasks.filter((task) => decidePortalTaskAccess(principal, task).visible)\n}\n\n/**\n * Every portal refusal is the same 404 with the same body.\n *\n * There is no portal analogue of the backoffice `view_all` diagnostic: no portal\n * principal has a legitimate reason to learn that a row they cannot read exists,\n * and a portal admin least of all \u2014 telling them \"this task exists but is not\n * yours\" is precisely the cross-customer disclosure the ownership check prevents.\n */\nexport const PORTAL_TASK_REFUSAL = { status: 404 as const, body: PORTAL_TASK_NOT_FOUND_BODY }\n"],
5
+ "mappings": "AAgDA,SAAS,0BAA0B;AAEnC,SAAS,oBAAoB;AAE7B;AAAA,EACE;AAAA,OAKK;AACP,SAAS,mBAAmB;AAGrB,MAAM,4BAA4B;AAClC,MAAM,gCAAgC;AAQ7C,MAAM,uBAA4C,oBAAI,IAAI;AAC1D,MAAM,gBAAsC,EAAE,wBAAwB,KAAK;AAUpE,MAAM,yBAAkD;AAAA,EAC7D,IAAI;AAAA,EACJ,OAAO;AACT;AAEO,MAAM,6BAAsD;AAAA,EACjE,IAAI;AAAA,EACJ,OAAO;AACT;AAEA,SAAS,cAAc,QAAqB,OAAwC;AAClF,MAAI,OAAO,UAAU,YAAY,MAAM,SAAS,EAAG,QAAO,IAAI,KAAK;AACrE;AAUA,eAAsB,2BAA2B,OAIN;AACzC,QAAM,EAAE,MAAM,IAAI,cAAc,IAAI;AAEpC,MAAI,CAAC,KAAK,kBAAkB;AAC1B,WAAO,EAAE,IAAI,OAAO,QAAQ,KAAK,MAAM,uBAAuB;AAAA,EAChE;AAEA,QAAM,iBAAiB,oBAAI,IAAY;AACvC,gBAAc,gBAAgB,KAAK,gBAAgB;AACnD,gBAAc,gBAAgB,KAAK,cAAc;AAEjD,QAAM,cAAc,oBAAI,IAAY,CAAC,KAAK,GAAG,CAAC;AAE9C,MAAI,eAAe;AAGjB,UAAM,UAAU,MAAM;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,QACE,kBAAkB,KAAK;AAAA,QACvB,UAAU,KAAK;AAAA,QACf,WAAW;AAAA,MACb;AAAA,MACA,EAAE,QAAQ,CAAC,MAAM,kBAAkB,kBAAkB,EAAE;AAAA,MACvD,EAAE,UAAU,KAAK,UAAU,gBAAgB,KAAK,MAAM;AAAA,IACxD;AACA,eAAW,UAAU,SAAS;AAC5B,kBAAY,IAAI,OAAO,EAAE;AACzB,oBAAc,gBAAgB,OAAO,cAAc;AACnD,oBAAc,gBAAgB,OAAO,gBAAgB;AAAA,IACvD;AAAA,EACF;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,WAAW;AAAA,MACT,MAAM;AAAA,MACN,aAAa,KAAK;AAAA,MAClB,UAAU,KAAK;AAAA,MACf,gBAAgB,KAAK;AAAA,MACrB;AAAA,MACA;AAAA,IACF;AAAA,IACA,aAAa,CAAC,GAAG,WAAW;AAAA,EAC9B;AACF;AAqBO,SAAS,0BAA0B,OAGd;AAC1B,SAAO;AAAA,IACL,UAAU,MAAM,UAAU;AAAA,IAC1B,gBAAgB,MAAM,UAAU;AAAA,IAChC,cAAc;AAAA,IACd,YAAY,EAAE,KAAK,CAAC,GAAG,MAAM,WAAW,EAAE;AAAA,IAC1C,aAAa,EAAE,KAAK,KAAK;AAAA,EAC3B;AACF;AAGO,SAAS,uBACd,WACA,MACwB;AACxB,SAAO,qBAAqB,WAAW,YAAY,IAAI,GAAG,sBAAsB,aAAa;AAC/F;AAUO,SAAS,yBACd,WACA,OACY;AACZ,SAAO,MAAM,OAAO,CAAC,SAAS,uBAAuB,WAAW,IAAI,EAAE,OAAO;AAC/E;AAUO,MAAM,sBAAsB,EAAE,QAAQ,KAAc,MAAM,2BAA2B;",
6
+ "names": []
7
+ }
@@ -0,0 +1,65 @@
1
+ const TERMINAL_STEP_STATUSES = /* @__PURE__ */ new Set(["COMPLETED", "FAILED", "SKIPPED", "CANCELLED"]);
2
+ const RERUNNABLE_INSTANCE_STATUSES = /* @__PURE__ */ new Set(["FAILED", "PAUSED"]);
3
+ function orderKey(execution) {
4
+ const raw = execution.enteredAt ?? execution.createdAt;
5
+ if (!raw) return 0;
6
+ const parsed = raw instanceof Date ? raw.getTime() : new Date(raw).getTime();
7
+ return Number.isNaN(parsed) ? 0 : parsed;
8
+ }
9
+ function resolveRerunEligibility(input) {
10
+ if (!RERUNNABLE_INSTANCE_STATUSES.has(input.instanceStatus)) {
11
+ return {
12
+ ok: false,
13
+ code: "WORKFLOW_INSTANCE_NOT_RERUNNABLE",
14
+ message: `Cannot rerun a step of a ${input.instanceStatus} instance. Only FAILED or PAUSED instances can be rerun.`
15
+ };
16
+ }
17
+ const definitionStep = input.definitionSteps.find((step) => step.stepId === input.stepId);
18
+ if (!definitionStep) {
19
+ return {
20
+ ok: false,
21
+ code: "WORKFLOW_STEP_NOT_IN_DEFINITION",
22
+ message: `Step ${input.stepId} is no longer part of this workflow definition.`
23
+ };
24
+ }
25
+ const executions = input.stepExecutions.filter((execution) => execution.stepId === input.stepId);
26
+ if (executions.length === 0) {
27
+ return {
28
+ ok: false,
29
+ code: "WORKFLOW_STEP_NEVER_EXECUTED",
30
+ message: `Step ${input.stepId} has not executed in this run, so there is nothing to rerun.`
31
+ };
32
+ }
33
+ const latest = [...executions].sort((left, right) => orderKey(right) - orderKey(left))[0];
34
+ if (!TERMINAL_STEP_STATUSES.has(latest.status)) {
35
+ return {
36
+ ok: false,
37
+ code: "WORKFLOW_STEP_STILL_PARKED",
38
+ message: `Step ${input.stepId} is still ${latest.status}. Cancel or resolve the pending attempt before rerunning it.`
39
+ };
40
+ }
41
+ if (latest.stepType !== definitionStep.stepType) {
42
+ return {
43
+ ok: false,
44
+ code: "WORKFLOW_STEP_TYPE_CHANGED",
45
+ message: `Step ${input.stepId} changed from ${latest.stepType} to ${definitionStep.stepType} since this run started. Start a new instance instead.`
46
+ };
47
+ }
48
+ return { ok: true, supersededStepInstanceId: latest.id, stepType: latest.stepType };
49
+ }
50
+ function computeContextDiff(before, patch) {
51
+ const diff = {};
52
+ if (!patch) return diff;
53
+ const source = before ?? {};
54
+ for (const [key, next] of Object.entries(patch)) {
55
+ const current = source[key];
56
+ if (JSON.stringify(current) === JSON.stringify(next)) continue;
57
+ diff[key] = { from: current ?? null, to: next };
58
+ }
59
+ return diff;
60
+ }
61
+ export {
62
+ computeContextDiff,
63
+ resolveRerunEligibility
64
+ };
65
+ //# sourceMappingURL=rerun-from-step.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/workflows/lib/rerun-from-step.ts"],
4
+ "sourcesContent": ["/**\n * Rerun from step (spec \u00A78.4) \u2014 the eligibility decision, PURE.\n *\n * > \"**Rerun from failed step**, optionally with edited context \u2014 audited as\n * > `STEP_RERUN { editedContextDiff, by }`, gated by its own ACL feature.\"\n *\n * **This does NOT change the step state machine.** `workflows/AGENTS.md` says a\n * step goes `PENDING \u2192 ACTIVE \u2192 COMPLETED|FAILED|SKIPPED|CANCELLED` and is\n * never set out of order, so reviving the terminal `StepInstance` is out of the\n * question. It never happens here: the terminal row is read for its recorded\n * `stepType` and then left exactly as it is, and the new attempt gets a FRESH\n * row \u2014 which is what the engine already does on every step entry\n * (`lib/step-handler.ts` `enterStep` unconditionally\n * `em.create(StepInstance, { \u2026 status: 'ACTIVE' \u2026 })`). Both attempts stay in\n * the audit trail, and no status transition is invented.\n *\n * The cursor move plus `executeStep` is the same shape the definition-level\n * error handler already uses (`enterErrorHandlerStep` in\n * `lib/workflow-executor.ts`), so no transition record is invented either.\n */\n\n/** Step-instance statuses that mean the attempt is over and a new one is safe. */\nconst TERMINAL_STEP_STATUSES = new Set(['COMPLETED', 'FAILED', 'SKIPPED', 'CANCELLED'])\n\n/**\n * Instance statuses a rerun may act on. A RUNNING instance is excluded on\n * purpose: the engine is mid-advance and moving its cursor underneath it would\n * race the execution loop.\n */\nconst RERUNNABLE_INSTANCE_STATUSES = new Set(['FAILED', 'PAUSED'])\n\nexport type RerunRefusalCode =\n | 'WORKFLOW_INSTANCE_NOT_RERUNNABLE'\n | 'WORKFLOW_STEP_NOT_IN_DEFINITION'\n | 'WORKFLOW_STEP_TYPE_CHANGED'\n | 'WORKFLOW_STEP_NEVER_EXECUTED'\n | 'WORKFLOW_STEP_STILL_PARKED'\n\nexport type RerunStepExecutionInput = {\n id: string\n stepId: string\n stepType: string\n status: string\n enteredAt?: string | Date | null\n createdAt?: string | Date | null\n}\n\nexport type RerunEligibility =\n | { ok: true; supersededStepInstanceId: string; stepType: string }\n | { ok: false; code: RerunRefusalCode; message: string }\n\nfunction orderKey(execution: RerunStepExecutionInput): number {\n const raw = execution.enteredAt ?? execution.createdAt\n if (!raw) return 0\n const parsed = raw instanceof Date ? raw.getTime() : new Date(raw).getTime()\n return Number.isNaN(parsed) ? 0 : parsed\n}\n\nexport function resolveRerunEligibility(input: {\n instanceStatus: string\n stepId: string\n definitionSteps: ReadonlyArray<{ stepId: string; stepType: string }>\n stepExecutions: ReadonlyArray<RerunStepExecutionInput>\n}): RerunEligibility {\n if (!RERUNNABLE_INSTANCE_STATUSES.has(input.instanceStatus)) {\n return {\n ok: false,\n code: 'WORKFLOW_INSTANCE_NOT_RERUNNABLE',\n message: `Cannot rerun a step of a ${input.instanceStatus} instance. Only FAILED or PAUSED instances can be rerun.`,\n }\n }\n\n const definitionStep = input.definitionSteps.find((step) => step.stepId === input.stepId)\n if (!definitionStep) {\n return {\n ok: false,\n code: 'WORKFLOW_STEP_NOT_IN_DEFINITION',\n message: `Step ${input.stepId} is no longer part of this workflow definition.`,\n }\n }\n\n const executions = input.stepExecutions.filter((execution) => execution.stepId === input.stepId)\n if (executions.length === 0) {\n return {\n ok: false,\n code: 'WORKFLOW_STEP_NEVER_EXECUTED',\n message: `Step ${input.stepId} has not executed in this run, so there is nothing to rerun.`,\n }\n }\n\n const latest = [...executions].sort((left, right) => orderKey(right) - orderKey(left))[0]\n\n if (!TERMINAL_STEP_STATUSES.has(latest.status)) {\n // The step is still parked: a queue job and, for an agent step, a pending\n // proposal are still addressed to THIS attempt. Rerunning would leave both\n // orphaned and able to resume the run a second time. Lifting this needs\n // \u00A77.4's addressable resume token.\n return {\n ok: false,\n code: 'WORKFLOW_STEP_STILL_PARKED',\n message: `Step ${input.stepId} is still ${latest.status}. Cancel or resolve the pending attempt before rerunning it.`,\n }\n }\n\n if (latest.stepType !== definitionStep.stepType) {\n // The instance pins `definitionId` and the engine re-reads that row, so a\n // FAILED instance's definition can be edited in place \u2014 the structural-edit\n // guard only refuses while instances are ACTIVE. Replaying a step whose\n // type changed underneath would execute something the run never ran.\n return {\n ok: false,\n code: 'WORKFLOW_STEP_TYPE_CHANGED',\n message: `Step ${input.stepId} changed from ${latest.stepType} to ${definitionStep.stepType} since this run started. Start a new instance instead.`,\n }\n }\n\n return { ok: true, supersededStepInstanceId: latest.id, stepType: latest.stepType }\n}\n\nexport type ContextDiffEntry = { from: unknown; to: unknown }\n\n/**\n * The `editedContextDiff` the `STEP_RERUN` event records. Only the keys the\n * caller actually changed appear \u2014 a patch that re-sends an identical value is\n * not an edit, and recording it would make the audit unreadable.\n */\nexport function computeContextDiff(\n before: Record<string, unknown> | null | undefined,\n patch: Record<string, unknown> | null | undefined\n): Record<string, ContextDiffEntry> {\n const diff: Record<string, ContextDiffEntry> = {}\n if (!patch) return diff\n const source = before ?? {}\n for (const [key, next] of Object.entries(patch)) {\n const current = source[key]\n if (JSON.stringify(current) === JSON.stringify(next)) continue\n diff[key] = { from: current ?? null, to: next }\n }\n return diff\n}\n"],
5
+ "mappings": "AAsBA,MAAM,yBAAyB,oBAAI,IAAI,CAAC,aAAa,UAAU,WAAW,WAAW,CAAC;AAOtF,MAAM,+BAA+B,oBAAI,IAAI,CAAC,UAAU,QAAQ,CAAC;AAsBjE,SAAS,SAAS,WAA4C;AAC5D,QAAM,MAAM,UAAU,aAAa,UAAU;AAC7C,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,SAAS,eAAe,OAAO,IAAI,QAAQ,IAAI,IAAI,KAAK,GAAG,EAAE,QAAQ;AAC3E,SAAO,OAAO,MAAM,MAAM,IAAI,IAAI;AACpC;AAEO,SAAS,wBAAwB,OAKnB;AACnB,MAAI,CAAC,6BAA6B,IAAI,MAAM,cAAc,GAAG;AAC3D,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,SAAS,4BAA4B,MAAM,cAAc;AAAA,IAC3D;AAAA,EACF;AAEA,QAAM,iBAAiB,MAAM,gBAAgB,KAAK,CAAC,SAAS,KAAK,WAAW,MAAM,MAAM;AACxF,MAAI,CAAC,gBAAgB;AACnB,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,SAAS,QAAQ,MAAM,MAAM;AAAA,IAC/B;AAAA,EACF;AAEA,QAAM,aAAa,MAAM,eAAe,OAAO,CAAC,cAAc,UAAU,WAAW,MAAM,MAAM;AAC/F,MAAI,WAAW,WAAW,GAAG;AAC3B,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,SAAS,QAAQ,MAAM,MAAM;AAAA,IAC/B;AAAA,EACF;AAEA,QAAM,SAAS,CAAC,GAAG,UAAU,EAAE,KAAK,CAAC,MAAM,UAAU,SAAS,KAAK,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;AAExF,MAAI,CAAC,uBAAuB,IAAI,OAAO,MAAM,GAAG;AAK9C,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,SAAS,QAAQ,MAAM,MAAM,aAAa,OAAO,MAAM;AAAA,IACzD;AAAA,EACF;AAEA,MAAI,OAAO,aAAa,eAAe,UAAU;AAK/C,WAAO;AAAA,MACL,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,SAAS,QAAQ,MAAM,MAAM,iBAAiB,OAAO,QAAQ,OAAO,eAAe,QAAQ;AAAA,IAC7F;AAAA,EACF;AAEA,SAAO,EAAE,IAAI,MAAM,0BAA0B,OAAO,IAAI,UAAU,OAAO,SAAS;AACpF;AASO,SAAS,mBACd,QACA,OACkC;AAClC,QAAM,OAAyC,CAAC;AAChD,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,SAAS,UAAU,CAAC;AAC1B,aAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC/C,UAAM,UAAU,OAAO,GAAG;AAC1B,QAAI,KAAK,UAAU,OAAO,MAAM,KAAK,UAAU,IAAI,EAAG;AACtD,SAAK,GAAG,IAAI,EAAE,MAAM,WAAW,MAAM,IAAI,KAAK;AAAA,EAChD;AACA,SAAO;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1,23 @@
1
+ const WORKFLOW_ROUTE_CHIP_EVENT = "workflow-route-chip:open";
2
+ function requestRouteChipSection(edgeId, section) {
3
+ if (typeof window === "undefined") return;
4
+ window.dispatchEvent(
5
+ new CustomEvent(WORKFLOW_ROUTE_CHIP_EVENT, { detail: { edgeId, section } })
6
+ );
7
+ }
8
+ const WORKFLOW_ROUTE_ACTIVITY_EVENT = "workflow-route-activity:open";
9
+ function requestRouteActivityEdit(edgeId, activityId) {
10
+ if (typeof window === "undefined") return;
11
+ window.dispatchEvent(
12
+ new CustomEvent(WORKFLOW_ROUTE_ACTIVITY_EVENT, {
13
+ detail: { edgeId, activityId }
14
+ })
15
+ );
16
+ }
17
+ export {
18
+ WORKFLOW_ROUTE_ACTIVITY_EVENT,
19
+ WORKFLOW_ROUTE_CHIP_EVENT,
20
+ requestRouteActivityEdit,
21
+ requestRouteChipSection
22
+ };
23
+ //# sourceMappingURL=route-chip-events.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/workflows/lib/route-chip-events.ts"],
4
+ "sourcesContent": ["/**\n * Workflows Module - Route Chip Events\n *\n * Chips live inside React Flow's `EdgeLabelRenderer` portal, so a chip click\n * never reaches the canvas' `onEdgeClick`. The chip therefore announces itself\n * on `window` and the visual editor listens \u2014 the same decoupling the inline\n * node-delete button uses (`WORKFLOW_NODE_DELETE_EVENT`), so no callback has to\n * be threaded through the edge-data transform.\n */\n\nimport type { RouteChipSection } from './route-chips'\n\nexport const WORKFLOW_ROUTE_CHIP_EVENT = 'workflow-route-chip:open'\n\nexport interface RouteChipEventDetail {\n edgeId: string\n section: RouteChipSection\n}\n\nexport function requestRouteChipSection(edgeId: string, section: RouteChipSection): void {\n if (typeof window === 'undefined') return\n window.dispatchEvent(\n new CustomEvent<RouteChipEventDetail>(WORKFLOW_ROUTE_CHIP_EVENT, { detail: { edgeId, section } }),\n )\n}\n\n/**\n * A single activity chip announces which activity it is, so the editor can open\n * a focused single-activity modal instead of the whole transition inspector.\n */\nexport const WORKFLOW_ROUTE_ACTIVITY_EVENT = 'workflow-route-activity:open'\n\nexport interface RouteActivityEventDetail {\n edgeId: string\n activityId: string\n}\n\nexport function requestRouteActivityEdit(edgeId: string, activityId: string): void {\n if (typeof window === 'undefined') return\n window.dispatchEvent(\n new CustomEvent<RouteActivityEventDetail>(WORKFLOW_ROUTE_ACTIVITY_EVENT, {\n detail: { edgeId, activityId },\n }),\n )\n}\n"],
5
+ "mappings": "AAYO,MAAM,4BAA4B;AAOlC,SAAS,wBAAwB,QAAgB,SAAiC;AACvF,MAAI,OAAO,WAAW,YAAa;AACnC,SAAO;AAAA,IACL,IAAI,YAAkC,2BAA2B,EAAE,QAAQ,EAAE,QAAQ,QAAQ,EAAE,CAAC;AAAA,EAClG;AACF;AAMO,MAAM,gCAAgC;AAOtC,SAAS,yBAAyB,QAAgB,YAA0B;AACjF,MAAI,OAAO,WAAW,YAAa;AACnC,SAAO;AAAA,IACL,IAAI,YAAsC,+BAA+B;AAAA,MACvE,QAAQ,EAAE,QAAQ,WAAW;AAAA,IAC/B,CAAC;AAAA,EACH;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,91 @@
1
+ const ROUTE_CHIP_LIMIT = 3;
2
+ const ROUTE_CHIP_ZOOM_THRESHOLD = 0.6;
3
+ const CONDITION_SUMMARY_MAX_LENGTH = 28;
4
+ const VALUELESS_OPERATORS = /* @__PURE__ */ new Set(["IS_EMPTY", "IS_NOT_EMPTY"]);
5
+ function isGroupLike(value) {
6
+ return Boolean(
7
+ value && typeof value === "object" && typeof value.operator === "string" && Array.isArray(value.rules)
8
+ );
9
+ }
10
+ function isSimpleLike(value) {
11
+ return Boolean(
12
+ value && typeof value === "object" && typeof value.field === "string" && typeof value.operator === "string"
13
+ );
14
+ }
15
+ function formatValue(value) {
16
+ if (value === null || value === void 0) return "";
17
+ if (Array.isArray(value)) return value.map((entry) => formatValue(entry)).join(",");
18
+ if (typeof value === "object") return "{\u2026}";
19
+ return String(value);
20
+ }
21
+ function truncate(text, max) {
22
+ if (text.length <= max) return text;
23
+ return `${text.slice(0, Math.max(0, max - 1)).trimEnd()}\u2026`;
24
+ }
25
+ function summarizeSimple(condition) {
26
+ const operator = condition.operator === "==" ? "=" : condition.operator;
27
+ if (VALUELESS_OPERATORS.has(condition.operator)) {
28
+ return `${condition.field} ${operator}`;
29
+ }
30
+ const right = condition.valueField ? condition.valueField : formatValue(condition.value);
31
+ return right ? `${condition.field} ${operator} ${right}` : `${condition.field} ${operator}`;
32
+ }
33
+ function summarizeConditionExpression(condition, maxLength = CONDITION_SUMMARY_MAX_LENGTH) {
34
+ if (isSimpleLike(condition)) return truncate(summarizeSimple(condition), maxLength);
35
+ if (isGroupLike(condition)) {
36
+ const rules = condition.rules;
37
+ const first = rules.find((rule) => isSimpleLike(rule) || isGroupLike(rule));
38
+ if (!first) return null;
39
+ const head = summarizeConditionExpression(first, maxLength);
40
+ if (!head) return null;
41
+ const remaining = rules.length - 1;
42
+ if (remaining <= 0) return head;
43
+ return truncate(`${head} +${remaining}`, maxLength + 4);
44
+ }
45
+ return null;
46
+ }
47
+ function readActivities(raw) {
48
+ if (!Array.isArray(raw)) return [];
49
+ const chips = [];
50
+ raw.forEach((entry, index) => {
51
+ if (!entry || typeof entry !== "object") return;
52
+ const activityType = entry.activityType;
53
+ if (typeof activityType !== "string" || activityType.length === 0) return;
54
+ const activityId = entry.activityId;
55
+ chips.push({
56
+ activityId: typeof activityId === "string" && activityId ? activityId : `${activityType}-${index}`,
57
+ activityType
58
+ });
59
+ });
60
+ return chips;
61
+ }
62
+ function hasRuleReference(raw) {
63
+ return Array.isArray(raw) && raw.length > 0;
64
+ }
65
+ function buildRouteChipModel(input) {
66
+ const conditionSummary = summarizeConditionExpression(input.condition);
67
+ const allActivities = readActivities(input.activities);
68
+ const activities = allActivities.slice(0, ROUTE_CHIP_LIMIT);
69
+ const overflowCount = Math.max(0, allActivities.length - activities.length);
70
+ const carriesCondition = conditionSummary !== null || hasRuleReference(input.preConditions);
71
+ const isOtherwise = !carriesCondition && Boolean(input.hasConditionedSibling);
72
+ return {
73
+ conditionSummary,
74
+ activities,
75
+ overflowCount,
76
+ isOtherwise,
77
+ isEmpty: conditionSummary === null && allActivities.length === 0 && !isOtherwise
78
+ };
79
+ }
80
+ function routeCarriesCondition(input) {
81
+ return summarizeConditionExpression(input.condition) !== null || hasRuleReference(input.preConditions);
82
+ }
83
+ export {
84
+ CONDITION_SUMMARY_MAX_LENGTH,
85
+ ROUTE_CHIP_LIMIT,
86
+ ROUTE_CHIP_ZOOM_THRESHOLD,
87
+ buildRouteChipModel,
88
+ routeCarriesCondition,
89
+ summarizeConditionExpression
90
+ };
91
+ //# sourceMappingURL=route-chips.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/workflows/lib/route-chips.ts"],
4
+ "sourcesContent": ["/**\n * Workflows Module - Route Chips (pure)\n *\n * Derives what a transition renders ALONG its edge (spec\n * 2026-07-26-workflows-ux-redesign.md section 4.4, issue #4244): a compact\n * condition summary, the activities that run on the route as icon chips, and\n * the `otherwise` marker for the one unconditioned route of a branching node.\n *\n * The model is DERIVED, never stored: nothing here writes back into edge data\n * or the definition, so chips can never change the saved shape of a workflow.\n * PURE \u2014 no React, no xyflow, no registry: the caller supplies already-read\n * edge data and the activity icon lookup.\n */\n\n/** Activity chips beyond this cap collapse into a single `+N` badge. */\nexport const ROUTE_CHIP_LIMIT = 3\n\n/**\n * Below this canvas zoom the chip row collapses to dots (semantic zoom). Picked\n * so a 60-node flow zoomed out to fit stays readable as structure rather than\n * as a wall of text.\n */\nexport const ROUTE_CHIP_ZOOM_THRESHOLD = 0.6\n\n/** Longest condition summary rendered before it is elided. */\nexport const CONDITION_SUMMARY_MAX_LENGTH = 28\n\nexport type RouteChipSection = 'condition' | 'activities'\n\nexport interface RouteActivityChip {\n activityId: string\n activityType: string\n}\n\nexport interface RouteChipModel {\n conditionSummary: string | null\n activities: RouteActivityChip[]\n overflowCount: number\n isOtherwise: boolean\n isEmpty: boolean\n}\n\nexport interface RouteChipInput {\n condition?: unknown\n preConditions?: unknown\n activities?: unknown\n /** True when a sibling route leaving the same step carries a condition. */\n hasConditionedSibling?: boolean\n}\n\ninterface SimpleConditionLike {\n field: string\n operator: string\n value?: unknown\n valueField?: string\n}\n\ninterface GroupConditionLike {\n operator: string\n rules: unknown[]\n}\n\n/** Operators that read as a complete predicate on their own. */\nconst VALUELESS_OPERATORS = new Set(['IS_EMPTY', 'IS_NOT_EMPTY'])\n\nfunction isGroupLike(value: unknown): value is GroupConditionLike {\n return Boolean(\n value &&\n typeof value === 'object' &&\n typeof (value as GroupConditionLike).operator === 'string' &&\n Array.isArray((value as GroupConditionLike).rules),\n )\n}\n\nfunction isSimpleLike(value: unknown): value is SimpleConditionLike {\n return Boolean(\n value &&\n typeof value === 'object' &&\n typeof (value as SimpleConditionLike).field === 'string' &&\n typeof (value as SimpleConditionLike).operator === 'string',\n )\n}\n\nfunction formatValue(value: unknown): string {\n if (value === null || value === undefined) return ''\n if (Array.isArray(value)) return value.map((entry) => formatValue(entry)).join(',')\n if (typeof value === 'object') return '{\u2026}'\n return String(value)\n}\n\nfunction truncate(text: string, max: number): string {\n if (text.length <= max) return text\n return `${text.slice(0, Math.max(0, max - 1)).trimEnd()}\u2026`\n}\n\nfunction summarizeSimple(condition: SimpleConditionLike): string {\n const operator = condition.operator === '==' ? '=' : condition.operator\n if (VALUELESS_OPERATORS.has(condition.operator)) {\n return `${condition.field} ${operator}`\n }\n const right = condition.valueField ? condition.valueField : formatValue(condition.value)\n return right ? `${condition.field} ${operator} ${right}` : `${condition.field} ${operator}`\n}\n\n/**\n * Compact `field op value` rendering of a business_rules `ConditionExpression`.\n * A group summarises to its first rule plus a `+N` suffix for the rest, which is\n * what makes the chip readable at a glance; the full expression stays one click\n * away in the condition editor. Returns null when there is nothing to show.\n */\nexport function summarizeConditionExpression(\n condition: unknown,\n maxLength: number = CONDITION_SUMMARY_MAX_LENGTH,\n): string | null {\n if (isSimpleLike(condition)) return truncate(summarizeSimple(condition), maxLength)\n\n if (isGroupLike(condition)) {\n const rules = condition.rules\n const first = rules.find((rule) => isSimpleLike(rule) || isGroupLike(rule))\n if (!first) return null\n const head = summarizeConditionExpression(first, maxLength)\n if (!head) return null\n const remaining = rules.length - 1\n if (remaining <= 0) return head\n return truncate(`${head} +${remaining}`, maxLength + 4)\n }\n\n return null\n}\n\nfunction readActivities(raw: unknown): RouteActivityChip[] {\n if (!Array.isArray(raw)) return []\n const chips: RouteActivityChip[] = []\n raw.forEach((entry, index) => {\n if (!entry || typeof entry !== 'object') return\n const activityType = (entry as { activityType?: unknown }).activityType\n if (typeof activityType !== 'string' || activityType.length === 0) return\n const activityId = (entry as { activityId?: unknown }).activityId\n chips.push({\n activityId: typeof activityId === 'string' && activityId ? activityId : `${activityType}-${index}`,\n activityType,\n })\n })\n return chips\n}\n\nfunction hasRuleReference(raw: unknown): boolean {\n return Array.isArray(raw) && raw.length > 0\n}\n\n/**\n * The chip row for one transition. `isOtherwise` marks the default route: it\n * carries no condition of its own while a sibling leaving the same step does \u2014\n * exactly the `ensureOtherwiseRoute` reading used by branching nodes, computed\n * here from the live graph so it stays true for hand-wired routes too.\n */\nexport function buildRouteChipModel(input: RouteChipInput): RouteChipModel {\n const conditionSummary = summarizeConditionExpression(input.condition)\n const allActivities = readActivities(input.activities)\n const activities = allActivities.slice(0, ROUTE_CHIP_LIMIT)\n const overflowCount = Math.max(0, allActivities.length - activities.length)\n const carriesCondition = conditionSummary !== null || hasRuleReference(input.preConditions)\n const isOtherwise = !carriesCondition && Boolean(input.hasConditionedSibling)\n\n return {\n conditionSummary,\n activities,\n overflowCount,\n isOtherwise,\n isEmpty: conditionSummary === null && allActivities.length === 0 && !isOtherwise,\n }\n}\n\n/** Route data carries a condition (inline expression or business-rule reference). */\nexport function routeCarriesCondition(input: { condition?: unknown; preConditions?: unknown }): boolean {\n return summarizeConditionExpression(input.condition) !== null || hasRuleReference(input.preConditions)\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,17 @@
1
+ const WORKFLOW_TRANSITION_EDGE_TYPE = "workflowTransition";
2
+ function buildWorkflowRouteEdge(input) {
3
+ return {
4
+ id: input.id,
5
+ source: input.source,
6
+ target: input.target,
7
+ type: WORKFLOW_TRANSITION_EDGE_TYPE,
8
+ ...input.sourceHandle ? { sourceHandle: input.sourceHandle } : {},
9
+ ...input.targetHandle ? { targetHandle: input.targetHandle } : {},
10
+ data: input.data ?? {}
11
+ };
12
+ }
13
+ export {
14
+ WORKFLOW_TRANSITION_EDGE_TYPE,
15
+ buildWorkflowRouteEdge
16
+ };
17
+ //# sourceMappingURL=route-edge.js.map