@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
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/workflows/lib/definition-json-locations.ts"],
4
+ "sourcesContent": ["/**\n * Workflows Module \u2014 Code-view issue locations (spec section 2.2, stage 2)\n *\n * Stage 2 is *\"two-way live sync with error squiggles that highlight the\n * corresponding node\"*. `collectValidationIssues` already carries `nodeId` /\n * `edgeId` on every issue, so the missing half is purely positional: WHERE in\n * the JSON text does the step or transition with that id live.\n *\n * The scan is a minimal JSON tokenizer rather than a regex over\n * `\"id\": \"<value>\"`, because the author is editing free text: a step id can\n * appear inside a `{{context.*}}` template, inside a transition's\n * `fromStepId`, or inside a note's markdown, and a regex would happily point\n * the squiggle at any of them. Tracking the container path is the only way to\n * mean \"the element of `steps` at index i\".\n *\n * PURE: no ORM, no DI, no React.\n */\n\nexport type JsonLineRange = {\n /** 1-based, inclusive. */\n startLine: number\n /** 1-based, inclusive. */\n endLine: number\n}\n\nexport type DefinitionJsonLocations = {\n steps: Map<string, JsonLineRange>\n transitions: Map<string, JsonLineRange>\n}\n\ntype ArrayElementRange = { index: number } & JsonLineRange\n\n/**\n * Line ranges of the elements of the top-level `steps` and `transitions`\n * arrays, by ARRAY INDEX. Ids are attached separately from the parsed document,\n * so a malformed id (missing, non-string, duplicated) cannot desynchronise the\n * scan.\n */\nfunction scanTopLevelArrayElements(text: string): {\n steps: ArrayElementRange[]\n transitions: ArrayElementRange[]\n} {\n const steps: ArrayElementRange[] = []\n const transitions: ArrayElementRange[] = []\n\n let line = 1\n let inString = false\n let escaped = false\n // Depth 1 is the document object. A tracked array's elements sit at depth 3.\n let depth = 0\n let pendingKey: string | null = null\n let currentStringStart = -1\n let trackedArray: 'steps' | 'transitions' | null = null\n let trackedArrayDepth = -1\n let elementIndex = 0\n let elementStartLine = -1\n let elementDepth = -1\n\n for (let position = 0; position < text.length; position += 1) {\n const char = text[position]\n\n if (char === '\\n') {\n line += 1\n // A newline cannot appear inside a valid JSON string literal, so this\n // also self-heals if the author is mid-edit.\n inString = false\n escaped = false\n continue\n }\n\n if (inString) {\n if (escaped) {\n escaped = false\n } else if (char === '\\\\') {\n escaped = true\n } else if (char === '\"') {\n inString = false\n const literal = text.slice(currentStringStart, position)\n // A string immediately followed by `:` is an object key.\n let lookahead = position + 1\n while (lookahead < text.length && /\\s/.test(text[lookahead])) lookahead += 1\n if (text[lookahead] === ':') pendingKey = literal\n }\n continue\n }\n\n if (char === '\"') {\n inString = true\n currentStringStart = position + 1\n continue\n }\n\n if (char === '[') {\n if (depth === 1 && (pendingKey === 'steps' || pendingKey === 'transitions')) {\n trackedArray = pendingKey\n trackedArrayDepth = depth\n elementIndex = 0\n }\n depth += 1\n pendingKey = null\n continue\n }\n\n if (char === '{') {\n if (trackedArray && depth === trackedArrayDepth + 1 && elementStartLine === -1) {\n elementStartLine = line\n elementDepth = depth\n }\n depth += 1\n pendingKey = null\n continue\n }\n\n if (char === '}') {\n depth -= 1\n if (trackedArray && elementStartLine !== -1 && depth === elementDepth) {\n const range: ArrayElementRange = { index: elementIndex, startLine: elementStartLine, endLine: line }\n if (trackedArray === 'steps') steps.push(range)\n else transitions.push(range)\n elementIndex += 1\n elementStartLine = -1\n elementDepth = -1\n }\n pendingKey = null\n continue\n }\n\n if (char === ']') {\n depth -= 1\n if (trackedArray && depth === trackedArrayDepth) {\n trackedArray = null\n trackedArrayDepth = -1\n elementStartLine = -1\n elementDepth = -1\n }\n pendingKey = null\n continue\n }\n }\n\n return { steps, transitions }\n}\n\nfunction readIdsAt(parsed: unknown, key: 'steps' | 'transitions', idField: string): Array<string | null> {\n if (!parsed || typeof parsed !== 'object') return []\n const collection = (parsed as Record<string, unknown>)[key]\n if (!Array.isArray(collection)) return []\n return collection.map((element) => {\n if (!element || typeof element !== 'object') return null\n const value = (element as Record<string, unknown>)[idField]\n return typeof value === 'string' && value.length > 0 ? value : null\n })\n}\n\n/**\n * Map every step id and transition id in `text` to its line range.\n *\n * `parsed` must be the result of `JSON.parse(text)`; the caller already has it\n * (it cannot decide whether to apply an edit without parsing) and passing it in\n * keeps this function from parsing the same text twice.\n */\nexport function locateDefinitionJsonEntities(text: string, parsed: unknown): DefinitionJsonLocations {\n const scanned = scanTopLevelArrayElements(text)\n const stepIds = readIdsAt(parsed, 'steps', 'stepId')\n const transitionIds = readIdsAt(parsed, 'transitions', 'transitionId')\n\n const steps = new Map<string, JsonLineRange>()\n for (const element of scanned.steps) {\n const id = stepIds[element.index]\n // First occurrence wins: a duplicated id is itself a validation error, and\n // pointing at the first one is more useful than at an arbitrary later one.\n if (id && !steps.has(id)) steps.set(id, { startLine: element.startLine, endLine: element.endLine })\n }\n\n const transitions = new Map<string, JsonLineRange>()\n for (const element of scanned.transitions) {\n const id = transitionIds[element.index]\n if (id && !transitions.has(id)) {\n transitions.set(id, { startLine: element.startLine, endLine: element.endLine })\n }\n }\n\n return { steps, transitions }\n}\n\nexport type LocatedIssue = {\n issueId: string\n severity: 'error' | 'warning'\n line: number\n}\n\n/**\n * Project issues onto lines. An issue whose node/edge is not in the text (or\n * which names neither) is simply not located \u2014 the issue list still shows it,\n * it just gets no gutter marker rather than a marker on a wrong line.\n */\nexport function locateIssues(\n issues: Array<{ id: string; severity: 'error' | 'warning'; nodeId?: string; edgeId?: string }>,\n locations: DefinitionJsonLocations,\n): LocatedIssue[] {\n const located: LocatedIssue[] = []\n for (const issue of issues) {\n const range = issue.nodeId\n ? locations.steps.get(issue.nodeId)\n : issue.edgeId\n ? locations.transitions.get(issue.edgeId)\n : undefined\n if (!range) continue\n located.push({ issueId: issue.id, severity: issue.severity, line: range.startLine })\n }\n return located\n}\n\n/**\n * Highest severity per line, so a line carrying both an error and a warning\n * paints as an error. Errors sort before warnings for the same reason.\n */\nexport function severityByLine(located: LocatedIssue[]): Map<number, 'error' | 'warning'> {\n const byLine = new Map<number, 'error' | 'warning'>()\n for (const issue of located) {\n const existing = byLine.get(issue.line)\n if (existing === 'error') continue\n byLine.set(issue.line, issue.severity)\n }\n return byLine\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,31 @@
1
+ import { writeEditorAnnotations } from "./editor-annotations.js";
2
+ import { resolveRequiredEngineVersion } from "./engine-version.js";
3
+ function buildDefinitionPayload({ graphDefinition, triggers, contextSchema, io, interpolation, errorHandler }) {
4
+ return {
5
+ ...graphDefinition,
6
+ triggers: triggers.length > 0 ? triggers : void 0,
7
+ contextSchema: contextSchema ?? void 0,
8
+ io: io ?? void 0,
9
+ interpolation: interpolation ?? void 0,
10
+ errorHandler: errorHandler ?? void 0
11
+ };
12
+ }
13
+ function buildMetadataPayload({ loadedMetadata, tags, category, icon, definition, annotations }) {
14
+ const base = annotations === void 0 ? loadedMetadata : writeEditorAnnotations(loadedMetadata, annotations);
15
+ const metadata = { ...base ?? {} };
16
+ if (category) metadata.category = category;
17
+ else delete metadata.category;
18
+ if (tags.length > 0) metadata.tags = [...tags];
19
+ else delete metadata.tags;
20
+ if (icon) metadata.icon = icon;
21
+ else delete metadata.icon;
22
+ const requiredEngineVersion = resolveRequiredEngineVersion(definition ?? null);
23
+ if (requiredEngineVersion > 1) metadata.minEngineVersion = requiredEngineVersion;
24
+ else delete metadata.minEngineVersion;
25
+ return Object.keys(metadata).length > 0 ? metadata : null;
26
+ }
27
+ export {
28
+ buildDefinitionPayload,
29
+ buildMetadataPayload
30
+ };
31
+ //# sourceMappingURL=definition-payload.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/workflows/lib/definition-payload.ts"],
4
+ "sourcesContent": ["/**\n * Pure payload builders for the visual editor's save and draft round trips.\n *\n * The editor rebuilds the definition from the graph and rebuilds metadata from\n * three edited fields on every save, so anything it does not explicitly carry\n * (the declared contextSchema, the sub-workflow io port contract, future\n * metadata.editor.* keys) would be silently dropped. These helpers centralize\n * that assembly: the definition payload re-attaches triggers, contextSchema,\n * and io next to the graph output, and the metadata payload spreads the\n * metadata object loaded from the server before overlaying the edited fields\n * so unknown keys survive load \u2192 save.\n */\n\nimport type {\n WorkflowContextSchema,\n WorkflowDefinitionData,\n WorkflowDefinitionTrigger,\n WorkflowIoContract,\n} from '../data/entities'\nimport type { WorkflowErrorHandlerConfig } from '../data/validators'\nimport { writeEditorAnnotations, type WorkflowEditorAnnotations } from './editor-annotations'\nimport { resolveRequiredEngineVersion, type EngineVersionedDefinition } from './engine-version'\nimport type { WorkflowInterpolationMode } from './interpolation-pipeline'\n\nexport type DefinitionPayloadInput = {\n graphDefinition: WorkflowDefinitionData\n triggers: WorkflowDefinitionTrigger[]\n contextSchema?: WorkflowContextSchema | null\n io?: WorkflowIoContract | null\n interpolation?: WorkflowInterpolationMode | null\n errorHandler?: WorkflowErrorHandlerConfig | null\n}\n\nexport function buildDefinitionPayload({ graphDefinition, triggers, contextSchema, io, interpolation, errorHandler }: DefinitionPayloadInput): WorkflowDefinitionData {\n return {\n ...graphDefinition,\n triggers: triggers.length > 0 ? triggers : undefined,\n contextSchema: contextSchema ?? undefined,\n io: io ?? undefined,\n interpolation: interpolation ?? undefined,\n errorHandler: errorHandler ?? undefined,\n }\n}\n\nexport type MetadataPayloadInput = {\n loadedMetadata: Record<string, unknown> | null\n tags: string[]\n category: string\n icon: string\n /**\n * Definition being saved. Used to stamp `minEngineVersion` when the graph\n * contains a step or transition capability older engines cannot execute\n * (spec section 5.8).\n * Definitions that need nothing beyond the baseline keep no such key, so\n * saving an existing workflow stays byte-identical.\n */\n definition?: EngineVersionedDefinition | null\n /**\n * Sticky notes and groups (spec section 4.5). The canvas owns them as nodes,\n * so they are derived back out of the node array on every persistence path and\n * written to `metadata.editor.annotations` here. Omitting the field leaves\n * whatever the loaded metadata carried untouched, which is what keeps callers\n * that never render a canvas (tests, migrations) byte-compatible.\n */\n annotations?: WorkflowEditorAnnotations | null\n}\n\nexport function buildMetadataPayload({ loadedMetadata, tags, category, icon, definition, annotations }: MetadataPayloadInput): Record<string, unknown> | null {\n const base = annotations === undefined ? loadedMetadata : writeEditorAnnotations(loadedMetadata, annotations)\n const metadata: Record<string, unknown> = { ...(base ?? {}) }\n if (category) metadata.category = category\n else delete metadata.category\n if (tags.length > 0) metadata.tags = [...tags]\n else delete metadata.tags\n if (icon) metadata.icon = icon\n else delete metadata.icon\n const requiredEngineVersion = resolveRequiredEngineVersion(definition ?? null)\n if (requiredEngineVersion > 1) metadata.minEngineVersion = requiredEngineVersion\n else delete metadata.minEngineVersion\n return Object.keys(metadata).length > 0 ? metadata : null\n}\n"],
5
+ "mappings": "AAoBA,SAAS,8BAA8D;AACvE,SAAS,oCAAoE;AAYtE,SAAS,uBAAuB,EAAE,iBAAiB,UAAU,eAAe,IAAI,eAAe,aAAa,GAAmD;AACpK,SAAO;AAAA,IACL,GAAG;AAAA,IACH,UAAU,SAAS,SAAS,IAAI,WAAW;AAAA,IAC3C,eAAe,iBAAiB;AAAA,IAChC,IAAI,MAAM;AAAA,IACV,eAAe,iBAAiB;AAAA,IAChC,cAAc,gBAAgB;AAAA,EAChC;AACF;AAyBO,SAAS,qBAAqB,EAAE,gBAAgB,MAAM,UAAU,MAAM,YAAY,YAAY,GAAyD;AAC5J,QAAM,OAAO,gBAAgB,SAAY,iBAAiB,uBAAuB,gBAAgB,WAAW;AAC5G,QAAM,WAAoC,EAAE,GAAI,QAAQ,CAAC,EAAG;AAC5D,MAAI,SAAU,UAAS,WAAW;AAAA,MAC7B,QAAO,SAAS;AACrB,MAAI,KAAK,SAAS,EAAG,UAAS,OAAO,CAAC,GAAG,IAAI;AAAA,MACxC,QAAO,SAAS;AACrB,MAAI,KAAM,UAAS,OAAO;AAAA,MACrB,QAAO,SAAS;AACrB,QAAM,wBAAwB,6BAA6B,cAAc,IAAI;AAC7E,MAAI,wBAAwB,EAAG,UAAS,mBAAmB;AAAA,MACtD,QAAO,SAAS;AACrB,SAAO,OAAO,KAAK,QAAQ,EAAE,SAAS,IAAI,WAAW;AACvD;",
6
+ "names": []
7
+ }
@@ -0,0 +1,49 @@
1
+ const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
2
+ function isServerDraftEligible(definitionId) {
3
+ if (!definitionId) return false;
4
+ return UUID_PATTERN.test(definitionId);
5
+ }
6
+ function stableSerializeValue(value) {
7
+ if (value === void 0) return void 0;
8
+ if (value === null || typeof value !== "object") return JSON.stringify(value);
9
+ if (Array.isArray(value)) {
10
+ const items = value.map((item) => stableSerializeValue(item) ?? "null");
11
+ return `[${items.join(",")}]`;
12
+ }
13
+ const record = value;
14
+ const entries = Object.keys(record).sort((left, right) => left.localeCompare(right)).map((key) => {
15
+ const serialized = stableSerializeValue(record[key]);
16
+ return serialized === void 0 ? void 0 : `${JSON.stringify(key)}:${serialized}`;
17
+ }).filter((entry) => entry !== void 0);
18
+ return `{${entries.join(",")}}`;
19
+ }
20
+ function stableSerializeDefinition(value) {
21
+ return stableSerializeValue(value) ?? "null";
22
+ }
23
+ function timestampsDiffer(base, current) {
24
+ if (!base || !current) return false;
25
+ const baseMs = Date.parse(base);
26
+ const currentMs = Date.parse(current);
27
+ if (Number.isNaN(baseMs) || Number.isNaN(currentMs)) return base !== current;
28
+ return baseMs !== currentMs;
29
+ }
30
+ function decideDraftRestore(input) {
31
+ if (input.draftDefinition === null || input.draftDefinition === void 0) {
32
+ return { offerRestore: false };
33
+ }
34
+ const draftSerialized = stableSerializeDefinition(input.draftDefinition);
35
+ const loadedSerialized = stableSerializeDefinition(input.loadedDefinition);
36
+ if (draftSerialized === loadedSerialized) {
37
+ return { offerRestore: false };
38
+ }
39
+ return {
40
+ offerRestore: true,
41
+ baseMismatch: timestampsDiffer(input.draftBaseUpdatedAt, input.definitionUpdatedAt)
42
+ };
43
+ }
44
+ export {
45
+ decideDraftRestore,
46
+ isServerDraftEligible,
47
+ stableSerializeDefinition
48
+ };
49
+ //# sourceMappingURL=draft-restore.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/workflows/lib/draft-restore.ts"],
4
+ "sourcesContent": ["/**\n * Draft restore decision helpers (spec \u00A74.7 save model, Step 8.3).\n *\n * Pure logic behind the visual editor's per-user draft layer: whether a\n * definition id can have a server draft at all, a stable (key-order\n * insensitive) serialization used to compare editor state against persisted\n * drafts, and the restore-banner decision (draft exists? differs from the\n * loaded definition? was it based on an older definition version?).\n */\n\nconst UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\n\nexport function isServerDraftEligible(definitionId: string | null | undefined): boolean {\n if (!definitionId) return false\n return UUID_PATTERN.test(definitionId)\n}\n\nfunction stableSerializeValue(value: unknown): string | undefined {\n if (value === undefined) return undefined\n if (value === null || typeof value !== 'object') return JSON.stringify(value)\n if (Array.isArray(value)) {\n const items = value.map((item) => stableSerializeValue(item) ?? 'null')\n return `[${items.join(',')}]`\n }\n const record = value as Record<string, unknown>\n const entries = Object.keys(record)\n .sort((left, right) => left.localeCompare(right))\n .map((key) => {\n const serialized = stableSerializeValue(record[key])\n return serialized === undefined ? undefined : `${JSON.stringify(key)}:${serialized}`\n })\n .filter((entry): entry is string => entry !== undefined)\n return `{${entries.join(',')}}`\n}\n\nexport function stableSerializeDefinition(value: unknown): string {\n return stableSerializeValue(value) ?? 'null'\n}\n\nexport type DraftRestoreDecision =\n | { offerRestore: false }\n | { offerRestore: true; baseMismatch: boolean }\n\nexport type DraftRestoreInput = {\n draftDefinition: unknown\n draftBaseUpdatedAt: string | null\n loadedDefinition: unknown\n definitionUpdatedAt: string | null\n}\n\nfunction timestampsDiffer(base: string | null, current: string | null): boolean {\n if (!base || !current) return false\n const baseMs = Date.parse(base)\n const currentMs = Date.parse(current)\n if (Number.isNaN(baseMs) || Number.isNaN(currentMs)) return base !== current\n return baseMs !== currentMs\n}\n\nexport function decideDraftRestore(input: DraftRestoreInput): DraftRestoreDecision {\n if (input.draftDefinition === null || input.draftDefinition === undefined) {\n return { offerRestore: false }\n }\n const draftSerialized = stableSerializeDefinition(input.draftDefinition)\n const loadedSerialized = stableSerializeDefinition(input.loadedDefinition)\n if (draftSerialized === loadedSerialized) {\n return { offerRestore: false }\n }\n return {\n offerRestore: true,\n baseMismatch: timestampsDiffer(input.draftBaseUpdatedAt, input.definitionUpdatedAt),\n }\n}\n"],
5
+ "mappings": "AAUA,MAAM,eAAe;AAEd,SAAS,sBAAsB,cAAkD;AACtF,MAAI,CAAC,aAAc,QAAO;AAC1B,SAAO,aAAa,KAAK,YAAY;AACvC;AAEA,SAAS,qBAAqB,OAAoC;AAChE,MAAI,UAAU,OAAW,QAAO;AAChC,MAAI,UAAU,QAAQ,OAAO,UAAU,SAAU,QAAO,KAAK,UAAU,KAAK;AAC5E,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,UAAM,QAAQ,MAAM,IAAI,CAAC,SAAS,qBAAqB,IAAI,KAAK,MAAM;AACtE,WAAO,IAAI,MAAM,KAAK,GAAG,CAAC;AAAA,EAC5B;AACA,QAAM,SAAS;AACf,QAAM,UAAU,OAAO,KAAK,MAAM,EAC/B,KAAK,CAAC,MAAM,UAAU,KAAK,cAAc,KAAK,CAAC,EAC/C,IAAI,CAAC,QAAQ;AACZ,UAAM,aAAa,qBAAqB,OAAO,GAAG,CAAC;AACnD,WAAO,eAAe,SAAY,SAAY,GAAG,KAAK,UAAU,GAAG,CAAC,IAAI,UAAU;AAAA,EACpF,CAAC,EACA,OAAO,CAAC,UAA2B,UAAU,MAAS;AACzD,SAAO,IAAI,QAAQ,KAAK,GAAG,CAAC;AAC9B;AAEO,SAAS,0BAA0B,OAAwB;AAChE,SAAO,qBAAqB,KAAK,KAAK;AACxC;AAaA,SAAS,iBAAiB,MAAqB,SAAiC;AAC9E,MAAI,CAAC,QAAQ,CAAC,QAAS,QAAO;AAC9B,QAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,QAAM,YAAY,KAAK,MAAM,OAAO;AACpC,MAAI,OAAO,MAAM,MAAM,KAAK,OAAO,MAAM,SAAS,EAAG,QAAO,SAAS;AACrE,SAAO,WAAW;AACpB;AAEO,SAAS,mBAAmB,OAAgD;AACjF,MAAI,MAAM,oBAAoB,QAAQ,MAAM,oBAAoB,QAAW;AACzE,WAAO,EAAE,cAAc,MAAM;AAAA,EAC/B;AACA,QAAM,kBAAkB,0BAA0B,MAAM,eAAe;AACvE,QAAM,mBAAmB,0BAA0B,MAAM,gBAAgB;AACzE,MAAI,oBAAoB,kBAAkB;AACxC,WAAO,EAAE,cAAc,MAAM;AAAA,EAC/B;AACA,SAAO;AAAA,IACL,cAAc;AAAA,IACd,cAAc,iBAAiB,MAAM,oBAAoB,MAAM,mBAAmB;AAAA,EACpF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,106 @@
1
+ function isDryRunInstance(instance) {
2
+ return instance?.isDryRun === true;
3
+ }
4
+ class WorkflowDryRunRefusalError extends Error {
5
+ constructor(activityType, reason, activityName) {
6
+ super(`[internal] dry run cannot simulate activity type ${activityType} (${reason})`);
7
+ this.activityType = activityType;
8
+ this.reason = reason;
9
+ this.activityName = activityName;
10
+ this.dryRunRefused = true;
11
+ this.name = "WorkflowDryRunRefusalError";
12
+ }
13
+ }
14
+ function isDryRunRefusal(error) {
15
+ if (!error || typeof error !== "object") return false;
16
+ return error.dryRunRefused === true;
17
+ }
18
+ const DRY_RUN_EVENT_TYPES = {
19
+ started: "DRY_RUN_STARTED",
20
+ activitySimulated: "ACTIVITY_SIMULATED",
21
+ activityRefused: "ACTIVITY_SIMULATION_REFUSED",
22
+ userTaskSimulated: "USER_TASK_SIMULATED",
23
+ businessRuleActionsSuppressed: "BUSINESS_RULE_ACTIONS_SUPPRESSED"
24
+ };
25
+ const asRecord = (value) => typeof value === "object" && value !== null ? value : {};
26
+ const asText = (value, fallback) => typeof value === "string" && value.length > 0 ? value : fallback;
27
+ function toIsoString(value) {
28
+ return value instanceof Date ? value.toISOString() : value;
29
+ }
30
+ function describeEvent(event) {
31
+ const data = asRecord(event.eventData);
32
+ switch (event.eventType) {
33
+ case DRY_RUN_EVENT_TYPES.activitySimulated:
34
+ return {
35
+ kind: "activity",
36
+ severity: "info",
37
+ subject: asText(data.activityType, "ACTIVITY"),
38
+ detail: {
39
+ activityName: data.activityName ?? null,
40
+ output: data.output ?? null
41
+ }
42
+ };
43
+ case DRY_RUN_EVENT_TYPES.activityRefused:
44
+ return {
45
+ kind: "refusal",
46
+ severity: "error",
47
+ subject: asText(data.activityType, "ACTIVITY"),
48
+ detail: { reason: asText(data.reason, "noMock") }
49
+ };
50
+ case DRY_RUN_EVENT_TYPES.userTaskSimulated:
51
+ return {
52
+ kind: "userTask",
53
+ severity: "warning",
54
+ subject: asText(data.taskName, "USER_TASK"),
55
+ detail: {
56
+ assignedTo: data.assignedTo ?? null,
57
+ assignedToRoles: data.assignedToRoles ?? null,
58
+ decisions: data.decisions ?? []
59
+ }
60
+ };
61
+ case DRY_RUN_EVENT_TYPES.businessRuleActionsSuppressed:
62
+ return {
63
+ kind: "businessRule",
64
+ severity: "warning",
65
+ subject: asText(data.ruleId, "BUSINESS_RULE"),
66
+ detail: { phase: asText(data.phase, "pre_transition") }
67
+ };
68
+ default:
69
+ return null;
70
+ }
71
+ }
72
+ function buildWouldDoReport(events) {
73
+ const decorated = [];
74
+ events.forEach((event, index) => {
75
+ const described = describeEvent(event);
76
+ if (!described) return;
77
+ decorated.push({
78
+ index,
79
+ entry: {
80
+ ...described,
81
+ id: event.id,
82
+ stepId: event.stepId ?? null,
83
+ occurredAt: toIsoString(event.occurredAt)
84
+ }
85
+ });
86
+ });
87
+ decorated.sort((left, right) => {
88
+ if (left.entry.occurredAt !== right.entry.occurredAt) {
89
+ return left.entry.occurredAt < right.entry.occurredAt ? -1 : 1;
90
+ }
91
+ return left.index - right.index;
92
+ });
93
+ const entries = decorated.map((item) => item.entry);
94
+ return {
95
+ entries,
96
+ stoppedByRefusal: entries.some((entry) => entry.kind === "refusal")
97
+ };
98
+ }
99
+ export {
100
+ DRY_RUN_EVENT_TYPES,
101
+ WorkflowDryRunRefusalError,
102
+ buildWouldDoReport,
103
+ isDryRunInstance,
104
+ isDryRunRefusal
105
+ };
106
+ //# sourceMappingURL=dry-run.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/workflows/lib/dry-run.ts"],
4
+ "sourcesContent": ["/**\n * Workflows Module \u2014 Dry-run (spec section 8.2)\n *\n * A dry run is a REAL instance (`WorkflowInstance.isDryRun`) executed by the\n * ordinary engine loop with every effector replaced by its registry `mock`.\n * There is deliberately no second simulation path: a parallel interpreter would\n * drift from the engine and the report would stop being evidence about the\n * workflow that actually runs.\n *\n * This module is PURE \u2014 no ORM, no DI, no React \u2014 so the isolation rules and\n * the \"Would do\" report are unit-testable without a database.\n */\n\nimport type { WorkflowValidationIssueSeverity } from './collect-validation-issues'\n\n/**\n * The subset of `WorkflowInstance` every isolation decision reads. Taking the\n * shape rather than the entity keeps this module free of the ORM import and\n * lets the engine pass a branch-scoped view where it has one.\n */\nexport type DryRunAwareInstance = {\n isDryRun?: boolean | null\n}\n\nexport function isDryRunInstance(instance: DryRunAwareInstance | null | undefined): boolean {\n return instance?.isDryRun === true\n}\n\n/**\n * Raised when a dry run reaches an activity type that refuses simulation\n * (`mock: 'refuse'`) or declares no mock at all.\n *\n * Spec section 8.2: *\"`mock: 'refuse'` types stop the dry-run at that node with\n * an explicit marker.\"* A refusal is NOT an activity failure \u2014 nothing was\n * attempted \u2014 so it must never be routed down the step's error route or\n * absorbed by its `errorDirective`. `isDryRunRefusal` is what the failure paths\n * check to keep that promise, and it is structural (a marker property) for the\n * same reason `isRetryableError` is: the check must survive an error crossing a\n * module boundary.\n */\nexport class WorkflowDryRunRefusalError extends Error {\n readonly dryRunRefused = true\n\n constructor(\n readonly activityType: string,\n readonly reason: DryRunRefusalReason,\n readonly activityName?: string,\n ) {\n super(`[internal] dry run cannot simulate activity type ${activityType} (${reason})`)\n this.name = 'WorkflowDryRunRefusalError'\n }\n}\n\nexport type DryRunRefusalReason = 'refused' | 'noMock'\n\nexport function isDryRunRefusal(error: unknown): error is WorkflowDryRunRefusalError {\n if (!error || typeof error !== 'object') return false\n return (error as { dryRunRefused?: unknown }).dryRunRefused === true\n}\n\n// ============================================================================\n// \"Would do\" report\n// ============================================================================\n\n/**\n * Event types a dry run writes in addition to the ordinary run log. They ride\n * the same `WorkflowEvent` table because the module's event-sourcing rule\n * already makes that the audit trail, and because the report then inherits the\n * run views' ordering, scoping and retention for free.\n */\nexport const DRY_RUN_EVENT_TYPES = {\n started: 'DRY_RUN_STARTED',\n activitySimulated: 'ACTIVITY_SIMULATED',\n activityRefused: 'ACTIVITY_SIMULATION_REFUSED',\n userTaskSimulated: 'USER_TASK_SIMULATED',\n businessRuleActionsSuppressed: 'BUSINESS_RULE_ACTIONS_SUPPRESSED',\n} as const\n\nexport type DryRunEventType = typeof DRY_RUN_EVENT_TYPES[keyof typeof DRY_RUN_EVENT_TYPES]\n\nexport type WouldDoEntryKind =\n | 'activity'\n | 'refusal'\n | 'userTask'\n | 'businessRule'\n\nexport type WouldDoEntry = {\n id: string\n kind: WouldDoEntryKind\n /** `error` marks the refusal that stopped the run; everything else is informational. */\n severity: WorkflowValidationIssueSeverity | 'info'\n stepId: string | null\n occurredAt: string\n /** Machine label \u2014 `SEND_EMAIL`, `INVOKE_AGENT`, `USER_TASK`, a rule id. */\n subject: string\n detail: Record<string, unknown>\n}\n\nexport type WouldDoSourceEvent = {\n id: string\n eventType: string\n stepId?: string | null\n occurredAt: string | Date\n eventData?: Record<string, unknown> | null\n}\n\nexport type WouldDoReport = {\n entries: WouldDoEntry[]\n /** True once a refusal stopped the run \u2014 the report is then not the whole graph. */\n stoppedByRefusal: boolean\n}\n\nconst asRecord = (value: unknown): Record<string, unknown> =>\n typeof value === 'object' && value !== null ? (value as Record<string, unknown>) : {}\n\nconst asText = (value: unknown, fallback: string): string =>\n typeof value === 'string' && value.length > 0 ? value : fallback\n\nfunction toIsoString(value: string | Date): string {\n return value instanceof Date ? value.toISOString() : value\n}\n\nfunction describeEvent(event: WouldDoSourceEvent): Omit<WouldDoEntry, 'id' | 'stepId' | 'occurredAt'> | null {\n const data = asRecord(event.eventData)\n switch (event.eventType) {\n case DRY_RUN_EVENT_TYPES.activitySimulated:\n return {\n kind: 'activity',\n severity: 'info',\n subject: asText(data.activityType, 'ACTIVITY'),\n detail: {\n activityName: data.activityName ?? null,\n output: data.output ?? null,\n },\n }\n case DRY_RUN_EVENT_TYPES.activityRefused:\n return {\n kind: 'refusal',\n severity: 'error',\n subject: asText(data.activityType, 'ACTIVITY'),\n detail: { reason: asText(data.reason, 'noMock') },\n }\n case DRY_RUN_EVENT_TYPES.userTaskSimulated:\n return {\n kind: 'userTask',\n severity: 'warning',\n subject: asText(data.taskName, 'USER_TASK'),\n detail: {\n assignedTo: data.assignedTo ?? null,\n assignedToRoles: data.assignedToRoles ?? null,\n decisions: data.decisions ?? [],\n },\n }\n case DRY_RUN_EVENT_TYPES.businessRuleActionsSuppressed:\n return {\n kind: 'businessRule',\n severity: 'warning',\n subject: asText(data.ruleId, 'BUSINESS_RULE'),\n detail: { phase: asText(data.phase, 'pre_transition') },\n }\n default:\n return null\n }\n}\n\n/**\n * Build the ordered \"Would do\" report from a run's events.\n *\n * Callers pass events in ANY order; the report sorts by `occurredAt` and falls\n * back to the caller's order for ties (an activity and its refusal can share a\n * millisecond), which is why the sort is explicit and stable rather than a bare\n * `.sort()`.\n */\nexport function buildWouldDoReport(events: WouldDoSourceEvent[]): WouldDoReport {\n const decorated: Array<{ entry: WouldDoEntry; index: number }> = []\n\n events.forEach((event, index) => {\n const described = describeEvent(event)\n if (!described) return\n decorated.push({\n index,\n entry: {\n ...described,\n id: event.id,\n stepId: event.stepId ?? null,\n occurredAt: toIsoString(event.occurredAt),\n },\n })\n })\n\n decorated.sort((left, right) => {\n if (left.entry.occurredAt !== right.entry.occurredAt) {\n return left.entry.occurredAt < right.entry.occurredAt ? -1 : 1\n }\n return left.index - right.index\n })\n\n const entries = decorated.map((item) => item.entry)\n return {\n entries,\n stoppedByRefusal: entries.some((entry) => entry.kind === 'refusal'),\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,31 +1,76 @@
1
+ const ISO_8601_DURATION_PATTERN = /^P(?=\d|T\d)(?:(\d+)Y)?(?:(\d+)M)?(?:(\d+)W)?(?:(\d+)D)?(?:T(?=\d)(?:(\d+)H)?(?:(\d+)M)?(?:(\d+)S)?)?$/;
2
+ const SIMPLE_DURATION_PATTERN = /^(\d+)(d|h|m|s)$/;
3
+ const MS_PER_SECOND = 1e3;
4
+ const MS_PER_MINUTE = 60 * MS_PER_SECOND;
5
+ const MS_PER_HOUR = 60 * MS_PER_MINUTE;
6
+ const MS_PER_DAY = 24 * MS_PER_HOUR;
7
+ function parseIso8601Duration(duration) {
8
+ const match = duration.match(ISO_8601_DURATION_PATTERN);
9
+ if (!match) return null;
10
+ return {
11
+ years: parseInt(match[1] || "0", 10),
12
+ months: parseInt(match[2] || "0", 10),
13
+ weeks: parseInt(match[3] || "0", 10),
14
+ days: parseInt(match[4] || "0", 10),
15
+ hours: parseInt(match[5] || "0", 10),
16
+ minutes: parseInt(match[6] || "0", 10),
17
+ seconds: parseInt(match[7] || "0", 10)
18
+ };
19
+ }
20
+ function addIso8601Duration(from, parts) {
21
+ const result = new Date(from.getTime());
22
+ if (parts.years) result.setFullYear(result.getFullYear() + parts.years);
23
+ if (parts.months) result.setMonth(result.getMonth() + parts.months);
24
+ const days = parts.weeks * 7 + parts.days;
25
+ if (days) result.setDate(result.getDate() + days);
26
+ const elapsedMs = parts.hours * MS_PER_HOUR + parts.minutes * MS_PER_MINUTE + parts.seconds * MS_PER_SECOND;
27
+ return elapsedMs ? new Date(result.getTime() + elapsedMs) : result;
28
+ }
1
29
  function parseDuration(duration) {
2
- const iso8601Regex = /P(?:(\d+)D)?(?:T(?:(\d+)H)?(?:(\d+)M)?(?:(\d+)S)?)?/;
3
- const iso8601Match = duration.match(iso8601Regex);
4
- if (iso8601Match && iso8601Match[0] === duration) {
5
- const days = parseInt(iso8601Match[1] || "0");
6
- const hours = parseInt(iso8601Match[2] || "0");
7
- const minutes = parseInt(iso8601Match[3] || "0");
8
- const seconds = parseInt(iso8601Match[4] || "0");
9
- return days * 24 * 60 * 60 * 1e3 + hours * 60 * 60 * 1e3 + minutes * 60 * 1e3 + seconds * 1e3;
30
+ const parts = parseIso8601Duration(duration);
31
+ if (parts) {
32
+ if (parts.years || parts.months) {
33
+ throw new Error(
34
+ `Duration ${duration} uses years or months, which have no fixed length in milliseconds`
35
+ );
36
+ }
37
+ return (parts.weeks * 7 + parts.days) * MS_PER_DAY + parts.hours * MS_PER_HOUR + parts.minutes * MS_PER_MINUTE + parts.seconds * MS_PER_SECOND;
10
38
  }
11
- const simpleRegex = /^(\d+)(d|h|m|s)$/;
12
- const simpleMatch = duration.match(simpleRegex);
39
+ const simpleMatch = duration.match(SIMPLE_DURATION_PATTERN);
13
40
  if (simpleMatch) {
14
- const value = parseInt(simpleMatch[1]);
15
- const unit = simpleMatch[2];
16
- switch (unit) {
41
+ const value = parseInt(simpleMatch[1], 10);
42
+ switch (simpleMatch[2]) {
17
43
  case "d":
18
- return value * 24 * 60 * 60 * 1e3;
44
+ return value * MS_PER_DAY;
19
45
  case "h":
20
- return value * 60 * 60 * 1e3;
46
+ return value * MS_PER_HOUR;
21
47
  case "m":
22
- return value * 60 * 1e3;
48
+ return value * MS_PER_MINUTE;
23
49
  case "s":
24
- return value * 1e3;
50
+ return value * MS_PER_SECOND;
25
51
  }
26
52
  }
27
53
  throw new Error(`Invalid duration format: ${duration}`);
28
54
  }
55
+ function calculateDueDate(duration, from = /* @__PURE__ */ new Date()) {
56
+ const parts = parseIso8601Duration(duration);
57
+ if (parts) return addIso8601Duration(from, parts);
58
+ return new Date(from.getTime() + parseDuration(duration));
59
+ }
60
+ function calculateWaitDelayMs(config) {
61
+ if (config.until) {
62
+ const targetDate = new Date(config.until);
63
+ if (isNaN(targetDate.getTime())) {
64
+ throw new Error(`WAIT activity: invalid "until" datetime: ${config.until}`);
65
+ }
66
+ const delayMs = targetDate.getTime() - Date.now();
67
+ return Math.max(0, delayMs);
68
+ }
69
+ if (config.duration) {
70
+ return parseDuration(config.duration);
71
+ }
72
+ throw new Error('WAIT activity requires "duration" (e.g., "PT5M", "1h") or "until" (ISO 8601 datetime)');
73
+ }
29
74
  function toTimeoutMs(value) {
30
75
  if (typeof value === "number") {
31
76
  return Number.isFinite(value) && value > 0 ? value : void 0;
@@ -45,7 +90,11 @@ function toTimeoutMs(value) {
45
90
  }
46
91
  }
47
92
  export {
93
+ addIso8601Duration,
94
+ calculateDueDate,
95
+ calculateWaitDelayMs,
48
96
  parseDuration,
97
+ parseIso8601Duration,
49
98
  toTimeoutMs
50
99
  };
51
100
  //# sourceMappingURL=duration.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/workflows/lib/duration.ts"],
4
- "sourcesContent": ["/**\n * Parse ISO 8601 duration to milliseconds\n *\n * Supports:\n * - ISO 8601: PT5M (5 minutes), PT1H (1 hour), P1D (1 day), P3D (3 days)\n * - Simple formats: 5m, 1h, 3d, 30s\n *\n * @param duration - Duration string\n * @returns Duration in milliseconds\n */\nexport function parseDuration(duration: string): number {\n // Try ISO 8601 format first: P[n]DT[n]H[n]M[n]S\n const iso8601Regex = /P(?:(\\d+)D)?(?:T(?:(\\d+)H)?(?:(\\d+)M)?(?:(\\d+)S)?)?/\n const iso8601Match = duration.match(iso8601Regex)\n\n if (iso8601Match && iso8601Match[0] === duration) {\n const days = parseInt(iso8601Match[1] || '0')\n const hours = parseInt(iso8601Match[2] || '0')\n const minutes = parseInt(iso8601Match[3] || '0')\n const seconds = parseInt(iso8601Match[4] || '0')\n\n return (\n days * 24 * 60 * 60 * 1000 +\n hours * 60 * 60 * 1000 +\n minutes * 60 * 1000 +\n seconds * 1000\n )\n }\n\n // Try simple format: 1d, 5h, 30m, 45s\n const simpleRegex = /^(\\d+)(d|h|m|s)$/\n const simpleMatch = duration.match(simpleRegex)\n\n if (simpleMatch) {\n const value = parseInt(simpleMatch[1])\n const unit = simpleMatch[2]\n\n switch (unit) {\n case 'd':\n return value * 24 * 60 * 60 * 1000\n case 'h':\n return value * 60 * 60 * 1000\n case 'm':\n return value * 60 * 1000\n case 's':\n return value * 1000\n }\n }\n\n throw new Error(`Invalid duration format: ${duration}`)\n}\n\n/**\n * Normalize a timeout value to milliseconds\n *\n * Accepts every shape the activity editors and stored definitions carry:\n * - a millisecond number (30000)\n * - a millisecond string (\"30000\") \u2014 what the CrudForm activity editor writes,\n * and what its own placeholder (\"PT30S or 30000\") tells the user to type\n * - a duration string (\"PT30S\", \"5m\")\n *\n * Returns undefined for an absent or unusable value rather than throwing, so a\n * malformed timeout never fails an activity that would otherwise succeed.\n *\n * @param value - Raw timeout value\n * @returns Milliseconds, or undefined when the value is absent or unusable\n */\nexport function toTimeoutMs(value: unknown): number | undefined {\n if (typeof value === 'number') {\n return Number.isFinite(value) && value > 0 ? value : undefined\n }\n if (typeof value !== 'string') return undefined\n\n const trimmed = value.trim()\n if (!trimmed) return undefined\n\n if (/^\\d+$/.test(trimmed)) {\n const milliseconds = Number(trimmed)\n return milliseconds > 0 ? milliseconds : undefined\n }\n\n try {\n const milliseconds = parseDuration(trimmed)\n return Number.isFinite(milliseconds) && milliseconds > 0 ? milliseconds : undefined\n } catch {\n return undefined\n }\n}\n"],
5
- "mappings": "AAUO,SAAS,cAAc,UAA0B;AAEtD,QAAM,eAAe;AACrB,QAAM,eAAe,SAAS,MAAM,YAAY;AAEhD,MAAI,gBAAgB,aAAa,CAAC,MAAM,UAAU;AAChD,UAAM,OAAO,SAAS,aAAa,CAAC,KAAK,GAAG;AAC5C,UAAM,QAAQ,SAAS,aAAa,CAAC,KAAK,GAAG;AAC7C,UAAM,UAAU,SAAS,aAAa,CAAC,KAAK,GAAG;AAC/C,UAAM,UAAU,SAAS,aAAa,CAAC,KAAK,GAAG;AAE/C,WACE,OAAO,KAAK,KAAK,KAAK,MACtB,QAAQ,KAAK,KAAK,MAClB,UAAU,KAAK,MACf,UAAU;AAAA,EAEd;AAGA,QAAM,cAAc;AACpB,QAAM,cAAc,SAAS,MAAM,WAAW;AAE9C,MAAI,aAAa;AACf,UAAM,QAAQ,SAAS,YAAY,CAAC,CAAC;AACrC,UAAM,OAAO,YAAY,CAAC;AAE1B,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO,QAAQ,KAAK,KAAK,KAAK;AAAA,MAChC,KAAK;AACH,eAAO,QAAQ,KAAK,KAAK;AAAA,MAC3B,KAAK;AACH,eAAO,QAAQ,KAAK;AAAA,MACtB,KAAK;AACH,eAAO,QAAQ;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,4BAA4B,QAAQ,EAAE;AACxD;AAiBO,SAAS,YAAY,OAAoC;AAC9D,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,OAAO,SAAS,KAAK,KAAK,QAAQ,IAAI,QAAQ;AAAA,EACvD;AACA,MAAI,OAAO,UAAU,SAAU,QAAO;AAEtC,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,CAAC,QAAS,QAAO;AAErB,MAAI,QAAQ,KAAK,OAAO,GAAG;AACzB,UAAM,eAAe,OAAO,OAAO;AACnC,WAAO,eAAe,IAAI,eAAe;AAAA,EAC3C;AAEA,MAAI;AACF,UAAM,eAAe,cAAc,OAAO;AAC1C,WAAO,OAAO,SAAS,YAAY,KAAK,eAAe,IAAI,eAAe;AAAA,EAC5E,QAAQ;AACN,WAAO;AAAA,EACT;AACF;",
4
+ "sourcesContent": ["export type Iso8601DurationParts = {\n years: number\n months: number\n weeks: number\n days: number\n hours: number\n minutes: number\n seconds: number\n}\n\n/**\n * Full ISO 8601 duration grammar: `P[nY][nM][nW][nD][T[nH][nM][nS]]`.\n *\n * The lookaheads reject the designator-only forms `P`, `PT` and `P1DT`, and the\n * anchors reject anything with trailing junk. `M` before `T` is months, `M`\n * after it is minutes \u2014 the distinction the hand-rolled parsers this replaces\n * could not make.\n */\nconst ISO_8601_DURATION_PATTERN =\n /^P(?=\\d|T\\d)(?:(\\d+)Y)?(?:(\\d+)M)?(?:(\\d+)W)?(?:(\\d+)D)?(?:T(?=\\d)(?:(\\d+)H)?(?:(\\d+)M)?(?:(\\d+)S)?)?$/\n\nconst SIMPLE_DURATION_PATTERN = /^(\\d+)(d|h|m|s)$/\n\nconst MS_PER_SECOND = 1000\nconst MS_PER_MINUTE = 60 * MS_PER_SECOND\nconst MS_PER_HOUR = 60 * MS_PER_MINUTE\nconst MS_PER_DAY = 24 * MS_PER_HOUR\n\n/**\n * Parse an ISO 8601 duration into its calendar components.\n *\n * Pure and total: returns `null` for anything that is not a valid ISO 8601\n * duration, so callers decide how to surface the problem.\n *\n * @param duration - Duration string (e.g. \"PT30M\", \"P1W\", \"P1DT12H\")\n * @returns Parsed components, or `null` when the string is not ISO 8601\n */\nexport function parseIso8601Duration(duration: string): Iso8601DurationParts | null {\n const match = duration.match(ISO_8601_DURATION_PATTERN)\n if (!match) return null\n\n return {\n years: parseInt(match[1] || '0', 10),\n months: parseInt(match[2] || '0', 10),\n weeks: parseInt(match[3] || '0', 10),\n days: parseInt(match[4] || '0', 10),\n hours: parseInt(match[5] || '0', 10),\n minutes: parseInt(match[6] || '0', 10),\n seconds: parseInt(match[7] || '0', 10),\n }\n}\n\n/**\n * Add an ISO 8601 duration to a date using calendar arithmetic.\n *\n * Years, months, weeks and days advance the calendar (so \"P1M\" lands on the\n * same day of the next month whatever its length), while hours, minutes and\n * seconds are added as elapsed time.\n *\n * @param from - Anchor date\n * @param parts - Parsed duration components\n * @returns A new date; `from` is never mutated\n */\nexport function addIso8601Duration(from: Date, parts: Iso8601DurationParts): Date {\n const result = new Date(from.getTime())\n\n if (parts.years) result.setFullYear(result.getFullYear() + parts.years)\n if (parts.months) result.setMonth(result.getMonth() + parts.months)\n\n const days = parts.weeks * 7 + parts.days\n if (days) result.setDate(result.getDate() + days)\n\n const elapsedMs =\n parts.hours * MS_PER_HOUR + parts.minutes * MS_PER_MINUTE + parts.seconds * MS_PER_SECOND\n\n return elapsedMs ? new Date(result.getTime() + elapsedMs) : result\n}\n\n/**\n * Parse a duration to milliseconds\n *\n * Supports:\n * - ISO 8601: PT30M (30 minutes), PT1H (1 hour), P1D (1 day), P1W (1 week), P1DT12H\n * - Simple formats: 5m, 1h, 3d, 30s\n *\n * Years and months are rejected here because they have no fixed millisecond\n * length \u2014 use `parseIso8601Duration` + `addIso8601Duration` when the duration\n * is anchored to a date.\n *\n * @param duration - Duration string\n * @returns Duration in milliseconds\n */\nexport function parseDuration(duration: string): number {\n const parts = parseIso8601Duration(duration)\n\n if (parts) {\n if (parts.years || parts.months) {\n throw new Error(\n `Duration ${duration} uses years or months, which have no fixed length in milliseconds`\n )\n }\n\n return (\n (parts.weeks * 7 + parts.days) * MS_PER_DAY +\n parts.hours * MS_PER_HOUR +\n parts.minutes * MS_PER_MINUTE +\n parts.seconds * MS_PER_SECOND\n )\n }\n\n const simpleMatch = duration.match(SIMPLE_DURATION_PATTERN)\n\n if (simpleMatch) {\n const value = parseInt(simpleMatch[1], 10)\n\n switch (simpleMatch[2]) {\n case 'd':\n return value * MS_PER_DAY\n case 'h':\n return value * MS_PER_HOUR\n case 'm':\n return value * MS_PER_MINUTE\n case 's':\n return value * MS_PER_SECOND\n }\n }\n\n throw new Error(`Invalid duration format: ${duration}`)\n}\n\n/**\n * Resolve a deadline from a duration anchored to a point in time.\n *\n * Accepts every format `parseDuration` accepts plus the calendar-only ISO 8601\n * components (years, months), which are applied as calendar arithmetic. Throws\n * on an unparseable duration \u2014 a deadline the author got wrong must surface,\n * never quietly become some default.\n *\n * @param duration - Duration string (e.g. \"PT30M\", \"P3D\", \"P1DT12H\")\n * @param from - Anchor date, defaults to now\n * @returns The resolved deadline\n */\nexport function calculateDueDate(duration: string, from: Date = new Date()): Date {\n const parts = parseIso8601Duration(duration)\n if (parts) return addIso8601Duration(from, parts)\n\n return new Date(from.getTime() + parseDuration(duration))\n}\n\nexport function calculateWaitDelayMs(config: { duration?: string; until?: string }): number {\n if (config.until) {\n const targetDate = new Date(config.until)\n if (isNaN(targetDate.getTime())) {\n throw new Error(`WAIT activity: invalid \"until\" datetime: ${config.until}`)\n }\n const delayMs = targetDate.getTime() - Date.now()\n return Math.max(0, delayMs)\n }\n\n if (config.duration) {\n return parseDuration(config.duration)\n }\n\n throw new Error('WAIT activity requires \"duration\" (e.g., \"PT5M\", \"1h\") or \"until\" (ISO 8601 datetime)')\n}\n\n/**\n * Normalize a timeout value to milliseconds\n *\n * Accepts every shape the activity editors and stored definitions carry:\n * - a millisecond number (30000)\n * - a millisecond string (\"30000\") \u2014 what the CrudForm activity editor writes,\n * and what its own placeholder (\"PT30S or 30000\") tells the user to type\n * - a duration string (\"PT30S\", \"5m\")\n *\n * Returns undefined for an absent or unusable value rather than throwing, so a\n * malformed timeout never fails an activity that would otherwise succeed.\n *\n * @param value - Raw timeout value\n * @returns Milliseconds, or undefined when the value is absent or unusable\n */\nexport function toTimeoutMs(value: unknown): number | undefined {\n if (typeof value === 'number') {\n return Number.isFinite(value) && value > 0 ? value : undefined\n }\n if (typeof value !== 'string') return undefined\n\n const trimmed = value.trim()\n if (!trimmed) return undefined\n\n if (/^\\d+$/.test(trimmed)) {\n const milliseconds = Number(trimmed)\n return milliseconds > 0 ? milliseconds : undefined\n }\n\n try {\n const milliseconds = parseDuration(trimmed)\n return Number.isFinite(milliseconds) && milliseconds > 0 ? milliseconds : undefined\n } catch {\n return undefined\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,79 @@
1
+ import { graphToDefinition, validateWorkflowGraph } from "./graph-utils.js";
2
+ import { isDataMappingEdge } from "./data-edge-mapping.js";
3
+ import { ERROR_TRANSITION_KIND } from "./error-routing.js";
4
+ import { SLA_BREACH_TRANSITION_KIND } from "./breach-routing.js";
5
+ import { OUTCOME_TRANSITION_KIND } from "./outcome-routing.js";
6
+ import { resolveEdgeRouteKind } from "./route-kinds.js";
7
+ import { validateParallelForkJoin } from "../data/validators.js";
8
+ const ERROR_ROUTE_SOURCE_NODE_TYPES = /* @__PURE__ */ new Set(["automated", "userTask", "subWorkflow", "invokeAgent"]);
9
+ const SLA_BREACH_ROUTE_SOURCE_NODE_TYPES = /* @__PURE__ */ new Set(["userTask"]);
10
+ const OUTCOME_ROUTE_SOURCE_NODE_TYPES = /* @__PURE__ */ new Set(["invokeAgent"]);
11
+ const ROUTE_KIND_SOURCE_NODE_TYPES = {
12
+ [ERROR_TRANSITION_KIND]: ERROR_ROUTE_SOURCE_NODE_TYPES,
13
+ [SLA_BREACH_TRANSITION_KIND]: SLA_BREACH_ROUTE_SOURCE_NODE_TYPES,
14
+ [OUTCOME_TRANSITION_KIND]: OUTCOME_ROUTE_SOURCE_NODE_TYPES
15
+ };
16
+ function routeKindOfEdge(edge) {
17
+ const data = edge.data;
18
+ return resolveEdgeRouteKind(data?.kind, edge.sourceHandle);
19
+ }
20
+ function sameHandle(left, right) {
21
+ return (left || null) === (right || null);
22
+ }
23
+ function errorMessages(nodes, edges) {
24
+ return new Set(
25
+ validateWorkflowGraph(nodes, edges).filter((issue) => issue.type === "error").map((issue) => issue.message)
26
+ );
27
+ }
28
+ function forkJoinMessages(nodes, edges) {
29
+ return new Set(validateParallelForkJoin(graphToDefinition(nodes, edges)).map((issue) => issue.message));
30
+ }
31
+ function firstAddition(before, after) {
32
+ for (const message of after) {
33
+ if (!before.has(message)) return message;
34
+ }
35
+ return void 0;
36
+ }
37
+ function reattachWorkflowEdge(nodes, edges, edgeId, connection) {
38
+ const existing = edges.find((edge) => edge.id === edgeId);
39
+ if (!existing) return { ok: false, code: "unknownRoute" };
40
+ if (isDataMappingEdge(existing)) return { ok: false, code: "dataMappingRoute" };
41
+ const source = connection.source ?? null;
42
+ const target = connection.target ?? null;
43
+ if (!source || !target) return { ok: false, code: "incompleteConnection" };
44
+ const sourceNode = nodes.find((node) => node.id === source);
45
+ const targetNode = nodes.find((node) => node.id === target);
46
+ if (!sourceNode || !targetNode) return { ok: false, code: "unknownStep" };
47
+ if (source === target) return { ok: false, code: "selfLoop" };
48
+ const routeKind = routeKindOfEdge(existing);
49
+ const allowedSourceTypes = routeKind ? ROUTE_KIND_SOURCE_NODE_TYPES[routeKind.kind] : void 0;
50
+ if (allowedSourceTypes && !allowedSourceTypes.has(sourceNode.type ?? "")) {
51
+ return {
52
+ ok: false,
53
+ code: routeKind?.kind === ERROR_TRANSITION_KIND ? "errorHandleUnsupported" : "kindHandleUnsupported"
54
+ };
55
+ }
56
+ const sourceHandle = routeKind ? routeKind.resolveSourceHandle(existing.data ?? {}) : connection.sourceHandle ?? null;
57
+ const targetHandle = connection.targetHandle ?? null;
58
+ const duplicate = edges.some(
59
+ (edge) => edge.id !== edgeId && !isDataMappingEdge(edge) && edge.source === source && edge.target === target && sameHandle(edge.sourceHandle, sourceHandle) && sameHandle(edge.targetHandle, targetHandle)
60
+ );
61
+ if (duplicate) return { ok: false, code: "duplicateRoute" };
62
+ const nextEdge = {
63
+ ...existing,
64
+ source,
65
+ target,
66
+ sourceHandle,
67
+ targetHandle
68
+ };
69
+ const nextEdges = edges.map((edge) => edge.id === edgeId ? nextEdge : edge);
70
+ const newGraphError = firstAddition(errorMessages(nodes, edges), errorMessages(nodes, nextEdges));
71
+ if (newGraphError) return { ok: false, code: "graphInvalid", detail: newGraphError };
72
+ const newForkJoinIssue = firstAddition(forkJoinMessages(nodes, edges), forkJoinMessages(nodes, nextEdges));
73
+ if (newForkJoinIssue) return { ok: false, code: "forkJoinInvalid", detail: newForkJoinIssue };
74
+ return { ok: true, edges: nextEdges, edge: nextEdge };
75
+ }
76
+ export {
77
+ reattachWorkflowEdge
78
+ };
79
+ //# sourceMappingURL=edge-reattachment.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/workflows/lib/edge-reattachment.ts"],
4
+ "sourcesContent": ["/**\n * Route reattachment (spec section 4.1, issue #4233).\n *\n * Dragging a route endpoint onto another node re-targets the route instead of\n * forcing the author to delete and redraw it. The route keeps its identity \u2014\n * the durable opaque `transitionId` minted by `generateTransitionId` \u2014 plus its\n * label, condition, activities, priority and kind, so nothing an author\n * configured is lost by moving an endpoint.\n *\n * Pure: the decision is taken over plain graph data and returns either the next\n * edge list or a machine-readable rejection code the editor translates. An\n * unaccepted reattachment simply leaves the edge list untouched, which is what\n * makes React Flow snap the dragged endpoint back to where it started.\n */\n\nimport type { Node, Edge } from '@xyflow/react'\nimport { graphToDefinition, validateWorkflowGraph } from './graph-utils'\nimport { isDataMappingEdge } from './data-edge-mapping'\nimport { ERROR_TRANSITION_KIND } from './error-routing'\nimport { SLA_BREACH_TRANSITION_KIND } from './breach-routing'\nimport { OUTCOME_TRANSITION_KIND } from './outcome-routing'\nimport { resolveEdgeRouteKind, type RouteKindDescriptor } from './route-kinds'\nimport { validateParallelForkJoin } from '../data/validators'\n\n/**\n * Node types that render an error output handle\n * (`components/nodes/ErrorOutputHandle.tsx`). An error route can only start at\n * one of them, so moving its source endpoint elsewhere is refused rather than\n * silently downgraded to a normal route.\n */\nconst ERROR_ROUTE_SOURCE_NODE_TYPES = new Set(['automated', 'userTask', 'subWorkflow', 'invokeAgent'])\n\n/**\n * Node types that can raise an SLA breach \u2014 only a USER_TASK carries a deadline,\n * so a breach route moved anywhere else would never be reachable.\n */\nconst SLA_BREACH_ROUTE_SOURCE_NODE_TYPES = new Set(['userTask'])\n\n/**\n * Only an agent step resolves a disposition, so an outcome route (spec 7.2) can\n * source nowhere else.\n */\nconst OUTCOME_ROUTE_SOURCE_NODE_TYPES = new Set(['invokeAgent'])\n\n/**\n * Which node types may source each kinded route. A kind absent from this table\n * is unrestricted; a kind present in it refuses a reattachment onto a node type\n * that cannot reach the route, rather than leaving a dead route behind.\n */\nconst ROUTE_KIND_SOURCE_NODE_TYPES: Record<string, Set<string>> = {\n [ERROR_TRANSITION_KIND]: ERROR_ROUTE_SOURCE_NODE_TYPES,\n [SLA_BREACH_TRANSITION_KIND]: SLA_BREACH_ROUTE_SOURCE_NODE_TYPES,\n [OUTCOME_TRANSITION_KIND]: OUTCOME_ROUTE_SOURCE_NODE_TYPES,\n}\n\nexport type EdgeReattachRejectionCode =\n | 'unknownRoute'\n | 'incompleteConnection'\n | 'unknownStep'\n | 'selfLoop'\n | 'duplicateRoute'\n | 'dataMappingRoute'\n | 'errorHandleUnsupported'\n | 'kindHandleUnsupported'\n | 'graphInvalid'\n | 'forkJoinInvalid'\n\nexport type EdgeReattachRejection = {\n ok: false\n code: EdgeReattachRejectionCode\n detail?: string\n}\n\nexport type EdgeReattachResult =\n | { ok: true; edges: Edge[]; edge: Edge }\n | EdgeReattachRejection\n\nexport interface EdgeReattachConnection {\n source?: string | null\n target?: string | null\n sourceHandle?: string | null\n targetHandle?: string | null\n}\n\nfunction routeKindOfEdge(edge: Edge): RouteKindDescriptor | null {\n const data = edge.data as { kind?: unknown } | undefined\n return resolveEdgeRouteKind(data?.kind, edge.sourceHandle)\n}\n\nfunction sameHandle(left: string | null | undefined, right: string | null | undefined): boolean {\n return (left || null) === (right || null)\n}\n\nfunction errorMessages(nodes: Node[], edges: Edge[]): Set<string> {\n return new Set(\n validateWorkflowGraph(nodes, edges)\n .filter((issue) => issue.type === 'error')\n .map((issue) => issue.message),\n )\n}\n\nfunction forkJoinMessages(nodes: Node[], edges: Edge[]): Set<string> {\n return new Set(validateParallelForkJoin(graphToDefinition(nodes, edges)).map((issue) => issue.message))\n}\n\nfunction firstAddition(before: Set<string>, after: Set<string>): string | undefined {\n for (const message of after) {\n if (!before.has(message)) return message\n }\n return undefined\n}\n\n/**\n * Re-target one route onto a new source and/or target step.\n *\n * Route identity and every configured field survive: only the endpoints (and\n * the handles they were dropped on) change. A reattachment is refused when it\n * would create a self-loop, duplicate an existing route, move an error route\n * off a step that can raise one, or introduce a graph or fork/join violation\n * the current graph does not already have.\n */\nexport function reattachWorkflowEdge(\n nodes: Node[],\n edges: Edge[],\n edgeId: string,\n connection: EdgeReattachConnection,\n): EdgeReattachResult {\n const existing = edges.find((edge) => edge.id === edgeId)\n if (!existing) return { ok: false, code: 'unknownRoute' }\n if (isDataMappingEdge(existing)) return { ok: false, code: 'dataMappingRoute' }\n\n const source = connection.source ?? null\n const target = connection.target ?? null\n if (!source || !target) return { ok: false, code: 'incompleteConnection' }\n\n const sourceNode = nodes.find((node) => node.id === source)\n const targetNode = nodes.find((node) => node.id === target)\n if (!sourceNode || !targetNode) return { ok: false, code: 'unknownStep' }\n if (source === target) return { ok: false, code: 'selfLoop' }\n\n const routeKind = routeKindOfEdge(existing)\n const allowedSourceTypes = routeKind ? ROUTE_KIND_SOURCE_NODE_TYPES[routeKind.kind] : undefined\n if (allowedSourceTypes && !allowedSourceTypes.has(sourceNode.type ?? '')) {\n return {\n ok: false,\n code: routeKind?.kind === ERROR_TRANSITION_KIND\n ? 'errorHandleUnsupported'\n : 'kindHandleUnsupported',\n }\n }\n\n // A kinded route keeps its own handle: dropping the endpoint on a node's\n // default port must not downgrade it to a normal route.\n const sourceHandle = routeKind\n ? routeKind.resolveSourceHandle((existing.data ?? {}) as Record<string, unknown>)\n : connection.sourceHandle ?? null\n const targetHandle = connection.targetHandle ?? null\n\n const duplicate = edges.some(\n (edge) =>\n edge.id !== edgeId &&\n !isDataMappingEdge(edge) &&\n edge.source === source &&\n edge.target === target &&\n sameHandle(edge.sourceHandle, sourceHandle) &&\n sameHandle(edge.targetHandle, targetHandle),\n )\n if (duplicate) return { ok: false, code: 'duplicateRoute' }\n\n const nextEdge: Edge = {\n ...existing,\n source,\n target,\n sourceHandle,\n targetHandle,\n }\n const nextEdges = edges.map((edge) => (edge.id === edgeId ? nextEdge : edge))\n\n const newGraphError = firstAddition(errorMessages(nodes, edges), errorMessages(nodes, nextEdges))\n if (newGraphError) return { ok: false, code: 'graphInvalid', detail: newGraphError }\n\n const newForkJoinIssue = firstAddition(forkJoinMessages(nodes, edges), forkJoinMessages(nodes, nextEdges))\n if (newForkJoinIssue) return { ok: false, code: 'forkJoinInvalid', detail: newForkJoinIssue }\n\n return { ok: true, edges: nextEdges, edge: nextEdge }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,5 +1,4 @@
1
- import { createLogger } from "@open-mercato/shared/lib/logger";
2
- const logger = createLogger("workflows");
1
+ import { parseAdvancedConfigValue } from "./advanced-config.js";
3
2
  function generateNameFromId(edgeId) {
4
3
  return edgeId.split("_to_").map((part) => part.split("_").map(
5
4
  (word) => word.charAt(0).toUpperCase() + word.slice(1)
@@ -32,8 +31,9 @@ function edgeToFormValues(edge) {
32
31
  continueOnActivityFailure: edgeData?.continueOnActivityFailure !== void 0 ? edgeData.continueOnActivityFailure : false,
33
32
  preConditions: normalizeConditions(edgeData?.preConditions || []),
34
33
  postConditions: normalizeConditions(edgeData?.postConditions || []),
34
+ condition: edgeData?.condition ?? null,
35
35
  activities: edgeData?.activities || [],
36
- advancedConfig: ""
36
+ advancedConfig: void 0
37
37
  // Advanced config is empty initially (can be populated from edgeData if needed)
38
38
  };
39
39
  }
@@ -47,16 +47,12 @@ function formValuesToEdgeUpdates(values, edge) {
47
47
  continueOnActivityFailure: values.continueOnActivityFailure,
48
48
  preConditions: values.preConditions.length > 0 ? values.preConditions : void 0,
49
49
  postConditions: values.postConditions.length > 0 ? values.postConditions : void 0,
50
+ condition: values.condition ?? void 0,
50
51
  activities: values.activities.length > 0 ? values.activities : void 0
51
52
  };
52
- if (values.advancedConfig && values.advancedConfig.trim()) {
53
- try {
54
- const parsed = JSON.parse(values.advancedConfig);
55
- Object.assign(updates, parsed);
56
- } catch (error) {
57
- logger.error("Invalid JSON in Advanced Configuration", { err: error });
58
- throw new Error("Invalid JSON in Advanced Configuration. Please check your syntax.");
59
- }
53
+ const advanced = parseAdvancedConfigValue(values.advancedConfig);
54
+ if (advanced) {
55
+ Object.assign(updates, advanced);
60
56
  }
61
57
  return updates;
62
58
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/modules/workflows/lib/edgeFormTransforms.ts"],
4
- "sourcesContent": ["/**\n * Edge Form Transforms\n *\n * Utilities to convert between React Flow edge data structures and CrudForm field values.\n * Handles bidirectional transformation for transitions/edges with proper type safety.\n */\n\nimport type { Edge } from '@xyflow/react'\nimport type { Activity } from '../components/fields/ActivityArrayEditor'\nimport type { TransitionCondition } from '../components/fields/BusinessRuleConditionsEditor'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\n\nconst logger = createLogger('workflows')\n\n/**\n * Normalized condition format (object only, no string)\n */\nexport interface NormalizedCondition {\n ruleId: string\n required: boolean\n}\n\n/**\n * Form values interface matching CrudForm field structure\n */\nexport interface EdgeFormValues {\n transitionName: string\n trigger: string\n priority: string // Number as string in form\n continueOnActivityFailure: boolean\n preConditions: NormalizedCondition[]\n postConditions: NormalizedCondition[]\n activities: Activity[]\n advancedConfig?: string\n}\n\n/**\n * Generate a readable name from edge ID\n * Example: \"start_to_cart\" -> \"Start \u2192 Cart\"\n */\nfunction generateNameFromId(edgeId: string): string {\n return edgeId\n .split('_to_')\n .map(part => part.split('_').map(word =>\n word.charAt(0).toUpperCase() + word.slice(1)\n ).join(' '))\n .join(' \u2192 ')\n}\n\n/**\n * Normalize legacy string format to object format\n */\nexport function normalizeCondition(raw: string | TransitionCondition): NormalizedCondition {\n if (typeof raw === 'string') {\n return { ruleId: raw, required: true }\n }\n return raw as NormalizedCondition\n}\n\n/**\n * Normalize array of conditions (handles both string and object formats)\n */\nexport function normalizeConditions(raw: any[]): NormalizedCondition[] {\n if (!Array.isArray(raw)) return []\n return raw.map(normalizeCondition)\n}\n\n/**\n * Convert Edge data to CrudForm values\n */\nexport function edgeToFormValues(edge: Edge): EdgeFormValues {\n const edgeData = edge.data as any\n\n // Try to get transition name from various sources\n let transitionName = ''\n if (edgeData?.transitionName && edgeData.transitionName !== '') {\n transitionName = edgeData.transitionName\n } else if (edgeData?.label && edgeData.label !== '' && edgeData.label !== undefined) {\n transitionName = edgeData.label\n } else {\n // Generate a name from the edge ID as fallback\n transitionName = generateNameFromId(edge.id)\n }\n\n return {\n transitionName,\n trigger: edgeData?.trigger || 'auto',\n priority: (edgeData?.priority || 100).toString(),\n continueOnActivityFailure: edgeData?.continueOnActivityFailure !== undefined\n ? edgeData.continueOnActivityFailure\n : false,\n preConditions: normalizeConditions(edgeData?.preConditions || []),\n postConditions: normalizeConditions(edgeData?.postConditions || []),\n activities: edgeData?.activities || [],\n advancedConfig: '', // Advanced config is empty initially (can be populated from edgeData if needed)\n }\n}\n\n/**\n * Convert CrudForm values back to Edge data updates\n *\n * Returns partial edge data to be merged with existing edge data.\n */\nexport function formValuesToEdgeUpdates(\n values: EdgeFormValues,\n edge: Edge\n): Partial<Edge['data']> {\n const updates: Partial<Edge['data']> = {\n transitionName: values.transitionName,\n label: values.transitionName, // Keep label for backward compatibility\n trigger: values.trigger,\n priority: parseInt(values.priority) || 100,\n continueOnActivityFailure: values.continueOnActivityFailure,\n preConditions: values.preConditions.length > 0 ? values.preConditions : undefined,\n postConditions: values.postConditions.length > 0 ? values.postConditions : undefined,\n activities: values.activities.length > 0 ? values.activities : undefined,\n }\n\n // Parse advanced config (JSON) and merge\n if (values.advancedConfig && values.advancedConfig.trim()) {\n try {\n const parsed = JSON.parse(values.advancedConfig)\n Object.assign(updates, parsed)\n } catch (error) {\n logger.error('Invalid JSON in Advanced Configuration', { err: error })\n throw new Error('Invalid JSON in Advanced Configuration. Please check your syntax.')\n }\n }\n\n return updates\n}\n\n/**\n * Get excluded rule IDs for business rule selector\n * (to avoid selecting the same rule twice)\n */\nexport function getExcludedPreConditionRuleIds(values: EdgeFormValues): string[] {\n return values.preConditions.map(c => {\n const normalized = normalizeCondition(c)\n return normalized.ruleId\n })\n}\n\n/**\n * Get excluded rule IDs for business rule selector\n * (to avoid selecting the same rule twice)\n */\nexport function getExcludedPostConditionRuleIds(values: EdgeFormValues): string[] {\n return values.postConditions.map(c => {\n const normalized = normalizeCondition(c)\n return normalized.ruleId\n })\n}\n"],
5
- "mappings": "AAUA,SAAS,oBAAoB;AAE7B,MAAM,SAAS,aAAa,WAAW;AA4BvC,SAAS,mBAAmB,QAAwB;AAClD,SAAO,OACJ,MAAM,MAAM,EACZ,IAAI,UAAQ,KAAK,MAAM,GAAG,EAAE;AAAA,IAAI,UAC/B,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC;AAAA,EAC7C,EAAE,KAAK,GAAG,CAAC,EACV,KAAK,UAAK;AACf;AAKO,SAAS,mBAAmB,KAAwD;AACzF,MAAI,OAAO,QAAQ,UAAU;AAC3B,WAAO,EAAE,QAAQ,KAAK,UAAU,KAAK;AAAA,EACvC;AACA,SAAO;AACT;AAKO,SAAS,oBAAoB,KAAmC;AACrE,MAAI,CAAC,MAAM,QAAQ,GAAG,EAAG,QAAO,CAAC;AACjC,SAAO,IAAI,IAAI,kBAAkB;AACnC;AAKO,SAAS,iBAAiB,MAA4B;AAC3D,QAAM,WAAW,KAAK;AAGtB,MAAI,iBAAiB;AACrB,MAAI,UAAU,kBAAkB,SAAS,mBAAmB,IAAI;AAC9D,qBAAiB,SAAS;AAAA,EAC5B,WAAW,UAAU,SAAS,SAAS,UAAU,MAAM,SAAS,UAAU,QAAW;AACnF,qBAAiB,SAAS;AAAA,EAC5B,OAAO;AAEL,qBAAiB,mBAAmB,KAAK,EAAE;AAAA,EAC7C;AAEA,SAAO;AAAA,IACL;AAAA,IACA,SAAS,UAAU,WAAW;AAAA,IAC9B,WAAW,UAAU,YAAY,KAAK,SAAS;AAAA,IAC/C,2BAA2B,UAAU,8BAA8B,SAC/D,SAAS,4BACT;AAAA,IACJ,eAAe,oBAAoB,UAAU,iBAAiB,CAAC,CAAC;AAAA,IAChE,gBAAgB,oBAAoB,UAAU,kBAAkB,CAAC,CAAC;AAAA,IAClE,YAAY,UAAU,cAAc,CAAC;AAAA,IACrC,gBAAgB;AAAA;AAAA,EAClB;AACF;AAOO,SAAS,wBACd,QACA,MACuB;AACvB,QAAM,UAAiC;AAAA,IACrC,gBAAgB,OAAO;AAAA,IACvB,OAAO,OAAO;AAAA;AAAA,IACd,SAAS,OAAO;AAAA,IAChB,UAAU,SAAS,OAAO,QAAQ,KAAK;AAAA,IACvC,2BAA2B,OAAO;AAAA,IAClC,eAAe,OAAO,cAAc,SAAS,IAAI,OAAO,gBAAgB;AAAA,IACxE,gBAAgB,OAAO,eAAe,SAAS,IAAI,OAAO,iBAAiB;AAAA,IAC3E,YAAY,OAAO,WAAW,SAAS,IAAI,OAAO,aAAa;AAAA,EACjE;AAGA,MAAI,OAAO,kBAAkB,OAAO,eAAe,KAAK,GAAG;AACzD,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,OAAO,cAAc;AAC/C,aAAO,OAAO,SAAS,MAAM;AAAA,IAC/B,SAAS,OAAO;AACd,aAAO,MAAM,0CAA0C,EAAE,KAAK,MAAM,CAAC;AACrE,YAAM,IAAI,MAAM,mEAAmE;AAAA,IACrF;AAAA,EACF;AAEA,SAAO;AACT;AAMO,SAAS,+BAA+B,QAAkC;AAC/E,SAAO,OAAO,cAAc,IAAI,OAAK;AACnC,UAAM,aAAa,mBAAmB,CAAC;AACvC,WAAO,WAAW;AAAA,EACpB,CAAC;AACH;AAMO,SAAS,gCAAgC,QAAkC;AAChF,SAAO,OAAO,eAAe,IAAI,OAAK;AACpC,UAAM,aAAa,mBAAmB,CAAC;AACvC,WAAO,WAAW;AAAA,EACpB,CAAC;AACH;",
4
+ "sourcesContent": ["/**\n * Edge Form Transforms\n *\n * Utilities to convert between React Flow edge data structures and CrudForm field values.\n * Handles bidirectional transformation for transitions/edges with proper type safety.\n */\n\nimport type { Edge } from '@xyflow/react'\nimport type { GroupCondition } from '@open-mercato/core/modules/business_rules/components/utils/conditionValidation'\nimport type { Activity } from '../components/fields/ActivityArrayEditor'\nimport type { TransitionCondition } from '../components/fields/BusinessRuleConditionsEditor'\nimport { parseAdvancedConfigValue } from './advanced-config'\n\n/**\n * Normalized condition format (object only, no string)\n */\nexport interface NormalizedCondition {\n ruleId: string\n required: boolean\n}\n\n/**\n * Form values interface matching CrudForm field structure\n */\nexport interface EdgeFormValues {\n transitionName: string\n trigger: string\n priority: string // Number as string in form\n continueOnActivityFailure: boolean\n preConditions: NormalizedCondition[]\n postConditions: NormalizedCondition[]\n // Inline routing condition in the business_rules expression language. Edited\n // through the same ConditionBuilder the branching inspectors use, so the\n // condition chip on the canvas has an editor to open.\n condition?: GroupCondition | null\n activities: Activity[]\n // JsonBuilder emits the parsed object; legacy callers may still provide a JSON string.\n advancedConfig?: Record<string, unknown> | string\n}\n\n/**\n * Generate a readable name from edge ID\n * Example: \"start_to_cart\" -> \"Start \u2192 Cart\"\n */\nfunction generateNameFromId(edgeId: string): string {\n return edgeId\n .split('_to_')\n .map(part => part.split('_').map(word =>\n word.charAt(0).toUpperCase() + word.slice(1)\n ).join(' '))\n .join(' \u2192 ')\n}\n\n/**\n * Normalize legacy string format to object format\n */\nexport function normalizeCondition(raw: string | TransitionCondition): NormalizedCondition {\n if (typeof raw === 'string') {\n return { ruleId: raw, required: true }\n }\n return raw as NormalizedCondition\n}\n\n/**\n * Normalize array of conditions (handles both string and object formats)\n */\nexport function normalizeConditions(raw: any[]): NormalizedCondition[] {\n if (!Array.isArray(raw)) return []\n return raw.map(normalizeCondition)\n}\n\n/**\n * Convert Edge data to CrudForm values\n */\nexport function edgeToFormValues(edge: Edge): EdgeFormValues {\n const edgeData = edge.data as any\n\n // Try to get transition name from various sources\n let transitionName = ''\n if (edgeData?.transitionName && edgeData.transitionName !== '') {\n transitionName = edgeData.transitionName\n } else if (edgeData?.label && edgeData.label !== '' && edgeData.label !== undefined) {\n transitionName = edgeData.label\n } else {\n // Generate a name from the edge ID as fallback\n transitionName = generateNameFromId(edge.id)\n }\n\n return {\n transitionName,\n trigger: edgeData?.trigger || 'auto',\n priority: (edgeData?.priority || 100).toString(),\n continueOnActivityFailure: edgeData?.continueOnActivityFailure !== undefined\n ? edgeData.continueOnActivityFailure\n : false,\n preConditions: normalizeConditions(edgeData?.preConditions || []),\n postConditions: normalizeConditions(edgeData?.postConditions || []),\n condition: (edgeData?.condition as GroupCondition | undefined) ?? null,\n activities: edgeData?.activities || [],\n advancedConfig: undefined, // Advanced config is empty initially (can be populated from edgeData if needed)\n }\n}\n\n/**\n * Convert CrudForm values back to Edge data updates\n *\n * Returns partial edge data to be merged with existing edge data.\n */\nexport function formValuesToEdgeUpdates(\n values: EdgeFormValues,\n edge: Edge\n): Partial<Edge['data']> {\n const updates: Partial<Edge['data']> = {\n transitionName: values.transitionName,\n label: values.transitionName, // Keep label for backward compatibility\n trigger: values.trigger,\n priority: parseInt(values.priority) || 100,\n continueOnActivityFailure: values.continueOnActivityFailure,\n preConditions: values.preConditions.length > 0 ? values.preConditions : undefined,\n postConditions: values.postConditions.length > 0 ? values.postConditions : undefined,\n condition: values.condition ?? undefined,\n activities: values.activities.length > 0 ? values.activities : undefined,\n }\n\n // Merge the advanced config (object from JsonBuilder, or legacy JSON string)\n const advanced = parseAdvancedConfigValue(values.advancedConfig)\n if (advanced) {\n Object.assign(updates, advanced)\n }\n\n return updates\n}\n\n/**\n * Get excluded rule IDs for business rule selector\n * (to avoid selecting the same rule twice)\n */\nexport function getExcludedPreConditionRuleIds(values: EdgeFormValues): string[] {\n return values.preConditions.map(c => {\n const normalized = normalizeCondition(c)\n return normalized.ruleId\n })\n}\n\n/**\n * Get excluded rule IDs for business rule selector\n * (to avoid selecting the same rule twice)\n */\nexport function getExcludedPostConditionRuleIds(values: EdgeFormValues): string[] {\n return values.postConditions.map(c => {\n const normalized = normalizeCondition(c)\n return normalized.ruleId\n })\n}\n"],
5
+ "mappings": "AAWA,SAAS,gCAAgC;AAiCzC,SAAS,mBAAmB,QAAwB;AAClD,SAAO,OACJ,MAAM,MAAM,EACZ,IAAI,UAAQ,KAAK,MAAM,GAAG,EAAE;AAAA,IAAI,UAC/B,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC;AAAA,EAC7C,EAAE,KAAK,GAAG,CAAC,EACV,KAAK,UAAK;AACf;AAKO,SAAS,mBAAmB,KAAwD;AACzF,MAAI,OAAO,QAAQ,UAAU;AAC3B,WAAO,EAAE,QAAQ,KAAK,UAAU,KAAK;AAAA,EACvC;AACA,SAAO;AACT;AAKO,SAAS,oBAAoB,KAAmC;AACrE,MAAI,CAAC,MAAM,QAAQ,GAAG,EAAG,QAAO,CAAC;AACjC,SAAO,IAAI,IAAI,kBAAkB;AACnC;AAKO,SAAS,iBAAiB,MAA4B;AAC3D,QAAM,WAAW,KAAK;AAGtB,MAAI,iBAAiB;AACrB,MAAI,UAAU,kBAAkB,SAAS,mBAAmB,IAAI;AAC9D,qBAAiB,SAAS;AAAA,EAC5B,WAAW,UAAU,SAAS,SAAS,UAAU,MAAM,SAAS,UAAU,QAAW;AACnF,qBAAiB,SAAS;AAAA,EAC5B,OAAO;AAEL,qBAAiB,mBAAmB,KAAK,EAAE;AAAA,EAC7C;AAEA,SAAO;AAAA,IACL;AAAA,IACA,SAAS,UAAU,WAAW;AAAA,IAC9B,WAAW,UAAU,YAAY,KAAK,SAAS;AAAA,IAC/C,2BAA2B,UAAU,8BAA8B,SAC/D,SAAS,4BACT;AAAA,IACJ,eAAe,oBAAoB,UAAU,iBAAiB,CAAC,CAAC;AAAA,IAChE,gBAAgB,oBAAoB,UAAU,kBAAkB,CAAC,CAAC;AAAA,IAClE,WAAY,UAAU,aAA4C;AAAA,IAClE,YAAY,UAAU,cAAc,CAAC;AAAA,IACrC,gBAAgB;AAAA;AAAA,EAClB;AACF;AAOO,SAAS,wBACd,QACA,MACuB;AACvB,QAAM,UAAiC;AAAA,IACrC,gBAAgB,OAAO;AAAA,IACvB,OAAO,OAAO;AAAA;AAAA,IACd,SAAS,OAAO;AAAA,IAChB,UAAU,SAAS,OAAO,QAAQ,KAAK;AAAA,IACvC,2BAA2B,OAAO;AAAA,IAClC,eAAe,OAAO,cAAc,SAAS,IAAI,OAAO,gBAAgB;AAAA,IACxE,gBAAgB,OAAO,eAAe,SAAS,IAAI,OAAO,iBAAiB;AAAA,IAC3E,WAAW,OAAO,aAAa;AAAA,IAC/B,YAAY,OAAO,WAAW,SAAS,IAAI,OAAO,aAAa;AAAA,EACjE;AAGA,QAAM,WAAW,yBAAyB,OAAO,cAAc;AAC/D,MAAI,UAAU;AACZ,WAAO,OAAO,SAAS,QAAQ;AAAA,EACjC;AAEA,SAAO;AACT;AAMO,SAAS,+BAA+B,QAAkC;AAC/E,SAAO,OAAO,cAAc,IAAI,OAAK;AACnC,UAAM,aAAa,mBAAmB,CAAC;AACvC,WAAO,WAAW;AAAA,EACpB,CAAC;AACH;AAMO,SAAS,gCAAgC,QAAkC;AAChF,SAAO,OAAO,eAAe,IAAI,OAAK;AACpC,UAAM,aAAa,mBAAmB,CAAC;AACvC,WAAO,WAAW;AAAA,EACpB,CAAC;AACH;",
6
6
  "names": []
7
7
  }