@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/metrics/definition-metrics.ts"],
4
+ "sourcesContent": ["/**\n * Per-definition operational KPIs (spec \u00A78.5) \u2014 the PURE arithmetic half.\n *\n * This module contains no ORM, DI, React or registry import, so every rule it\n * encodes is unit-testable without a database. `lib/metrics/rollup-service.ts`\n * owns the queries and the upsert; this file owns what the numbers MEAN.\n *\n * Three honesty rules govern what may appear here:\n *\n * 1. **A metric is computed only from a column the engine actually writes.**\n * `StepInstance.executionTimeMs` is deliberately NOT used: `exitStep` writes\n * it on the COMPLETED path only, while every FAILED path\n * (`step-handler`, `activity-worker-handler`, `condition-handler`) sets\n * `exitedAt` and leaves it null. A p95 over that column would silently be a\n * success-only latency wearing the name of a step latency. Run duration is\n * measured instead, from `startedAt` \u2192 the terminal timestamp, both of which\n * the engine always writes.\n * 2. **Dry runs never count.** `WorkflowInstance.isDryRun` is the flag\n * (spec \u00A78.2: \"excludes the instance from KPIs\"); the caller filters on it\n * and the shapes below carry only already-filtered rows.\n * 3. **A denominator is always reported next to a rate.** `successRate` without\n * `runsTerminal` and `taskSlaHitRate` without `tasksWithDeadline` are both\n * unreadable \u2014 100% over one run is not the same claim as 100% over 4,000.\n * 4. **A run that tolerated a failure is not a success.** `successRate` counts\n * the run's VERDICT, not its lifecycle status: a `partial_failure` reached\n * END but did not do everything it was asked to. It is reported as its own\n * number (`runsPartialFailure`) rather than folded into either bucket.\n */\n\nimport type { WorkflowRunOutcome } from '../run-outcome'\n\n/** Rollup window lengths, mirroring `AgentMetricRollup`'s window vocabulary. */\nexport const WORKFLOW_ROLLUP_WINDOW_MS = {\n '24h': 24 * 60 * 60 * 1000,\n '7d': 7 * 24 * 60 * 60 * 1000,\n '30d': 30 * 24 * 60 * 60 * 1000,\n} as const\n\nexport type WorkflowRollupWindowKey = keyof typeof WORKFLOW_ROLLUP_WINDOW_MS\n\nexport const WORKFLOW_ROLLUP_WINDOW_KEYS = Object.keys(\n WORKFLOW_ROLLUP_WINDOW_MS,\n) as WorkflowRollupWindowKey[]\n\n/**\n * Bucket the window boundaries snap to. Recomputing the SAME `windowStart` is\n * what makes a repeated rollup pass an overwrite rather than a second row, so\n * the bucket \u2014 not the wall clock \u2014 is the row's identity.\n */\nexport const WORKFLOW_ROLLUP_BUCKET_MS = 15 * 60 * 1000\n\n/** Snap a timestamp down to the rollup bucket grid. */\nexport function floorToRollupBucket(epochMs: number): number {\n return Math.floor(epochMs / WORKFLOW_ROLLUP_BUCKET_MS) * WORKFLOW_ROLLUP_BUCKET_MS\n}\n\n/**\n * Terminal statuses a run can reach.\n *\n * `COMPENSATED` used to be absent because the engine wrote it NO terminal\n * timestamp \u2014 `compensation-handler` flipped the status and `completeWorkflow`\n * returned before its own `completedAt` assignment \u2014 so a compensated run had\n * no instant to attribute to any window. The run-outcome write now stamps that\n * timestamp on the compensating path, so a compensated run finally belongs to\n * the window it terminated in. Rows compensated BEFORE that fix still carry a\n * null timestamp and, exactly as before, fall into no window at all: nothing is\n * backfilled.\n */\nexport const WORKFLOW_TERMINAL_STATUSES = ['COMPLETED', 'FAILED', 'CANCELLED', 'COMPENSATED'] as const\n\nexport type WorkflowTerminalStatus = (typeof WORKFLOW_TERMINAL_STATUSES)[number]\n\n/** One terminal run, already scoped and already dry-run filtered by the caller. */\nexport type TerminalRunSample = {\n status: string\n /**\n * The run's VERDICT (`WorkflowInstance.outcome`), or null for a row written\n * before outcomes existed. Null is NOT read as `success`: a pre-upgrade\n * COMPLETED run counts exactly as it did before, so upgrading does not\n * retroactively rewrite a window's history.\n */\n outcome?: WorkflowRunOutcome | null\n startedAt: Date | null\n /** `completedAt` for COMPLETED/FAILED/COMPENSATED, `cancelledAt` for CANCELLED. */\n terminalAt: Date | null\n}\n\n/** One completed task carrying an authored deadline. */\nexport type TaskDeadlineSample = {\n dueDate: Date | null\n completedAt: Date | null\n}\n\nexport type DefinitionMetrics = {\n /** Runs whose `startedAt` falls in the window. */\n runsStarted: number\n /** Runs whose terminal timestamp falls in the window \u2014 the rate denominator. */\n runsTerminal: number\n runsCompleted: number\n runsFailed: number\n runsCancelled: number\n /**\n * COMPLETED runs whose verdict is `partial_failure` \u2014 they reached END while\n * tolerating at least one activity or step failure.\n *\n * Its own number, folded into NEITHER bucket. It is not added to `runsFailed`\n * (the run did reach END, and a failure-queue count that included it would\n * disagree with the lifecycle) and it is excluded from `successRate`'s\n * numerator (the work it skipped never happened). It stays in `runsTerminal`,\n * so the denominators still add up.\n */\n runsPartialFailure: number\n /**\n * Runs rolled back by compensation. Its own number for the same reason\n * `runsPartialFailure` is: a compensated run is neither a success nor an\n * ordinary failure, and folding it into either would misstate both.\n */\n runsCompensated: number\n /**\n * `(runsCompleted - runsPartialFailure) / runsTerminal`, or null when nothing\n * terminated.\n */\n successRate: number | null\n /** Terminal runs that also had a usable `startedAt` \u2014 the duration denominator. */\n durationSampleCount: number\n avgDurationMs: number | null\n p50DurationMs: number | null\n p95DurationMs: number | null\n /** Completed tasks that carried a `dueDate` \u2014 the SLA denominator. */\n tasksWithDeadline: number\n tasksMetDeadline: number\n /** `tasksMetDeadline / tasksWithDeadline`, or null when no task had a deadline. */\n taskSlaHitRate: number | null\n}\n\nexport const EMPTY_DEFINITION_METRICS: DefinitionMetrics = {\n runsStarted: 0,\n runsTerminal: 0,\n runsCompleted: 0,\n runsFailed: 0,\n runsCancelled: 0,\n runsPartialFailure: 0,\n runsCompensated: 0,\n successRate: null,\n durationSampleCount: 0,\n avgDurationMs: null,\n p50DurationMs: null,\n p95DurationMs: null,\n tasksWithDeadline: 0,\n tasksMetDeadline: 0,\n taskSlaHitRate: null,\n}\n\n/**\n * Nearest-rank percentile over an unsorted sample; null when empty.\n *\n * Nearest rank (`percentile_disc` semantics) rather than interpolation, for the\n * same reason `agent_orchestrator`'s `percentileOf` chose it: every value it\n * returns is a duration some run actually took, which is what an operator\n * clicking through to that run needs to be true. It is also the variant that\n * behaves sanely on the small samples this rollup normally sees \u2014 a definition\n * with three runs a day has no meaningful interpolant.\n *\n * The rank is `ceil(fraction * n) - 1`, clamped into range, so p95 of a\n * one-element sample is that element and p95 of a 20-element sample is the\n * 19th-largest \u2014 never an off-by-one past the end of the array.\n */\nexport function percentileOf(values: number[], fraction: number): number | null {\n if (values.length === 0) return null\n const sorted = [...values].sort((left, right) => left - right)\n const rank = Math.min(sorted.length - 1, Math.max(0, Math.ceil(fraction * sorted.length) - 1))\n return sorted[rank]\n}\n\n/** Mean of a sample, rounded to whole milliseconds; null when empty. */\nexport function meanOf(values: number[]): number | null {\n if (values.length === 0) return null\n const total = values.reduce((sum, value) => sum + value, 0)\n return Math.round(total / values.length)\n}\n\n/**\n * A rate reported as a fraction in [0, 1], or null when the denominator is 0.\n *\n * Null rather than 0: \"no runs finished\" and \"every run failed\" are opposite\n * facts and a KPI card that paints both as 0% is worse than one that says it\n * has nothing to show.\n */\nexport function rateOf(numerator: number, denominator: number): number | null {\n if (denominator <= 0) return null\n return numerator / denominator\n}\n\n/**\n * Wall-clock run duration, or null when either end is missing or the pair is\n * inverted (a clock skew or a hand-edited row must not contribute a negative\n * sample that drags a mean below zero).\n */\nexport function runDurationMs(run: TerminalRunSample): number | null {\n if (!run.startedAt || !run.terminalAt) return null\n const durationMs = run.terminalAt.getTime() - run.startedAt.getTime()\n if (!Number.isFinite(durationMs) || durationMs < 0) return null\n return durationMs\n}\n\n/** True when a completed task landed on or before its authored deadline. */\nexport function taskMetDeadline(task: TaskDeadlineSample): boolean {\n if (!task.dueDate || !task.completedAt) return false\n return task.completedAt.getTime() <= task.dueDate.getTime()\n}\n\nexport type DefinitionMetricsInput = {\n runsStarted: number\n terminalRuns: TerminalRunSample[]\n completedTasks: TaskDeadlineSample[]\n}\n\n/**\n * Fold the sampled rows into one window's metrics.\n *\n * Pure and total: given the same input it returns the same output, which is\n * precisely what lets the rollup worker recompute a bucket instead of\n * incrementing it.\n */\nexport function buildDefinitionMetrics(input: DefinitionMetricsInput): DefinitionMetrics {\n const terminalRuns = input.terminalRuns\n let runsCompleted = 0\n let runsFailed = 0\n let runsCancelled = 0\n let runsPartialFailure = 0\n let runsCompensated = 0\n const durations: number[] = []\n\n for (const run of terminalRuns) {\n if (run.status === 'COMPLETED') {\n runsCompleted += 1\n if (run.outcome === 'partial_failure') runsPartialFailure += 1\n }\n else if (run.status === 'FAILED') runsFailed += 1\n else if (run.status === 'CANCELLED') runsCancelled += 1\n else if (run.status === 'COMPENSATED') runsCompensated += 1\n const duration = runDurationMs(run)\n if (duration !== null) durations.push(duration)\n }\n\n const tasksWithDeadline = input.completedTasks.filter((task) => task.dueDate !== null).length\n const tasksMetDeadline = input.completedTasks.filter(\n (task) => task.dueDate !== null && taskMetDeadline(task),\n ).length\n\n return {\n runsStarted: input.runsStarted,\n runsTerminal: terminalRuns.length,\n runsCompleted,\n runsFailed,\n runsCancelled,\n runsPartialFailure,\n runsCompensated,\n successRate: rateOf(runsCompleted - runsPartialFailure, terminalRuns.length),\n durationSampleCount: durations.length,\n avgDurationMs: meanOf(durations),\n p50DurationMs: percentileOf(durations, 0.5),\n p95DurationMs: percentileOf(durations, 0.95),\n tasksWithDeadline,\n tasksMetDeadline,\n taskSlaHitRate: rateOf(tasksMetDeadline, tasksWithDeadline),\n }\n}\n"],
5
+ "mappings": "AAgCO,MAAM,4BAA4B;AAAA,EACvC,OAAO,KAAK,KAAK,KAAK;AAAA,EACtB,MAAM,IAAI,KAAK,KAAK,KAAK;AAAA,EACzB,OAAO,KAAK,KAAK,KAAK,KAAK;AAC7B;AAIO,MAAM,8BAA8B,OAAO;AAAA,EAChD;AACF;AAOO,MAAM,4BAA4B,KAAK,KAAK;AAG5C,SAAS,oBAAoB,SAAyB;AAC3D,SAAO,KAAK,MAAM,UAAU,yBAAyB,IAAI;AAC3D;AAcO,MAAM,6BAA6B,CAAC,aAAa,UAAU,aAAa,aAAa;AAmErF,MAAM,2BAA8C;AAAA,EACzD,aAAa;AAAA,EACb,cAAc;AAAA,EACd,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,eAAe;AAAA,EACf,eAAe;AAAA,EACf,mBAAmB;AAAA,EACnB,kBAAkB;AAAA,EAClB,gBAAgB;AAClB;AAgBO,SAAS,aAAa,QAAkB,UAAiC;AAC9E,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,QAAM,SAAS,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,MAAM,UAAU,OAAO,KAAK;AAC7D,QAAM,OAAO,KAAK,IAAI,OAAO,SAAS,GAAG,KAAK,IAAI,GAAG,KAAK,KAAK,WAAW,OAAO,MAAM,IAAI,CAAC,CAAC;AAC7F,SAAO,OAAO,IAAI;AACpB;AAGO,SAAS,OAAO,QAAiC;AACtD,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,QAAM,QAAQ,OAAO,OAAO,CAAC,KAAK,UAAU,MAAM,OAAO,CAAC;AAC1D,SAAO,KAAK,MAAM,QAAQ,OAAO,MAAM;AACzC;AASO,SAAS,OAAO,WAAmB,aAAoC;AAC5E,MAAI,eAAe,EAAG,QAAO;AAC7B,SAAO,YAAY;AACrB;AAOO,SAAS,cAAc,KAAuC;AACnE,MAAI,CAAC,IAAI,aAAa,CAAC,IAAI,WAAY,QAAO;AAC9C,QAAM,aAAa,IAAI,WAAW,QAAQ,IAAI,IAAI,UAAU,QAAQ;AACpE,MAAI,CAAC,OAAO,SAAS,UAAU,KAAK,aAAa,EAAG,QAAO;AAC3D,SAAO;AACT;AAGO,SAAS,gBAAgB,MAAmC;AACjE,MAAI,CAAC,KAAK,WAAW,CAAC,KAAK,YAAa,QAAO;AAC/C,SAAO,KAAK,YAAY,QAAQ,KAAK,KAAK,QAAQ,QAAQ;AAC5D;AAeO,SAAS,uBAAuB,OAAkD;AACvF,QAAM,eAAe,MAAM;AAC3B,MAAI,gBAAgB;AACpB,MAAI,aAAa;AACjB,MAAI,gBAAgB;AACpB,MAAI,qBAAqB;AACzB,MAAI,kBAAkB;AACtB,QAAM,YAAsB,CAAC;AAE7B,aAAW,OAAO,cAAc;AAC9B,QAAI,IAAI,WAAW,aAAa;AAC9B,uBAAiB;AACjB,UAAI,IAAI,YAAY,kBAAmB,uBAAsB;AAAA,IAC/D,WACS,IAAI,WAAW,SAAU,eAAc;AAAA,aACvC,IAAI,WAAW,YAAa,kBAAiB;AAAA,aAC7C,IAAI,WAAW,cAAe,oBAAmB;AAC1D,UAAM,WAAW,cAAc,GAAG;AAClC,QAAI,aAAa,KAAM,WAAU,KAAK,QAAQ;AAAA,EAChD;AAEA,QAAM,oBAAoB,MAAM,eAAe,OAAO,CAAC,SAAS,KAAK,YAAY,IAAI,EAAE;AACvF,QAAM,mBAAmB,MAAM,eAAe;AAAA,IAC5C,CAAC,SAAS,KAAK,YAAY,QAAQ,gBAAgB,IAAI;AAAA,EACzD,EAAE;AAEF,SAAO;AAAA,IACL,aAAa,MAAM;AAAA,IACnB,cAAc,aAAa;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,OAAO,gBAAgB,oBAAoB,aAAa,MAAM;AAAA,IAC3E,qBAAqB,UAAU;AAAA,IAC/B,eAAe,OAAO,SAAS;AAAA,IAC/B,eAAe,aAAa,WAAW,GAAG;AAAA,IAC1C,eAAe,aAAa,WAAW,IAAI;AAAA,IAC3C;AAAA,IACA;AAAA,IACA,gBAAgB,OAAO,kBAAkB,iBAAiB;AAAA,EAC5D;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,26 @@
1
+ const METRIC_RATE_GOOD = 0.95;
2
+ const METRIC_RATE_FAIR = 0.8;
3
+ function rateTone(rate) {
4
+ if (rate === null) return "neutral";
5
+ if (rate >= METRIC_RATE_GOOD) return "success";
6
+ if (rate >= METRIC_RATE_FAIR) return "warning";
7
+ return "error";
8
+ }
9
+ function formatRate(rate) {
10
+ if (rate === null) return null;
11
+ return `${Math.round(rate * 100)}%`;
12
+ }
13
+ const METRIC_TONE_CLASS = {
14
+ success: "text-status-success-text",
15
+ warning: "text-status-warning-text",
16
+ error: "text-status-error-text",
17
+ neutral: "text-muted-foreground"
18
+ };
19
+ export {
20
+ METRIC_RATE_FAIR,
21
+ METRIC_RATE_GOOD,
22
+ METRIC_TONE_CLASS,
23
+ formatRate,
24
+ rateTone
25
+ };
26
+ //# sourceMappingURL=metrics-display.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/workflows/lib/metrics/metrics-display.ts"],
4
+ "sourcesContent": ["/**\n * Presentation rules for the per-definition KPIs (spec \u00A78.5) \u2014 PURE.\n *\n * Separate from the arithmetic so \"what does a 60% success rate LOOK like\" is\n * testable without a canvas, and separate from the cell component so the\n * thresholds live in one place rather than in three `className` ternaries.\n */\n\nexport type MetricTone = 'success' | 'warning' | 'error' | 'neutral'\n\n/**\n * Thresholds for the success-rate and SLA-hit-rate tones.\n *\n * Deliberately generous at the top: a workflow that fails one run in twenty is\n * not healthy, and painting 95% green would make the column decorative.\n */\nexport const METRIC_RATE_GOOD = 0.95\nexport const METRIC_RATE_FAIR = 0.8\n\n/**\n * Tone for a rate in [0, 1].\n *\n * `null` \u2014 no denominator \u2014 is NEUTRAL, never an error tone: \"nothing terminated in\n * this window\" is not a failure, and a red cell would send an operator hunting\n * for a problem that does not exist.\n */\nexport function rateTone(rate: number | null): MetricTone {\n if (rate === null) return 'neutral'\n if (rate >= METRIC_RATE_GOOD) return 'success'\n if (rate >= METRIC_RATE_FAIR) return 'warning'\n return 'error'\n}\n\n/**\n * A rate as a whole-percent string, or `null` when there is no denominator.\n *\n * Whole percents because the underlying sample is usually tens of runs, where a\n * decimal place implies a precision the sample does not have.\n */\nexport function formatRate(rate: number | null): string | null {\n if (rate === null) return null\n return `${Math.round(rate * 100)}%`\n}\n\n/**\n * DS token classes per tone.\n *\n * Colour is never the only carrier \u2014 every cell using these also renders the\n * number itself and an `sr-only` name \u2014 but the tone still has to come from\n * status tokens rather than raw Tailwind shades.\n */\nexport const METRIC_TONE_CLASS: Record<MetricTone, string> = {\n success: 'text-status-success-text',\n warning: 'text-status-warning-text',\n error: 'text-status-error-text',\n neutral: 'text-muted-foreground',\n}\n"],
5
+ "mappings": "AAgBO,MAAM,mBAAmB;AACzB,MAAM,mBAAmB;AASzB,SAAS,SAAS,MAAiC;AACxD,MAAI,SAAS,KAAM,QAAO;AAC1B,MAAI,QAAQ,iBAAkB,QAAO;AACrC,MAAI,QAAQ,iBAAkB,QAAO;AACrC,SAAO;AACT;AAQO,SAAS,WAAW,MAAoC;AAC7D,MAAI,SAAS,KAAM,QAAO;AAC1B,SAAO,GAAG,KAAK,MAAM,OAAO,GAAG,CAAC;AAClC;AASO,MAAM,oBAAgD;AAAA,EAC3D,SAAS;AAAA,EACT,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AACX;",
6
+ "names": []
7
+ }
@@ -0,0 +1,7 @@
1
+ const WORKFLOW_DEFINITION_METRIC_ROLLUP_QUEUE = "workflow-definition-metric-rollup";
2
+ const WORKFLOW_DEFINITION_METRIC_ROLLUP_INTERVAL = "900s";
3
+ export {
4
+ WORKFLOW_DEFINITION_METRIC_ROLLUP_INTERVAL,
5
+ WORKFLOW_DEFINITION_METRIC_ROLLUP_QUEUE
6
+ };
7
+ //# sourceMappingURL=rollup-schedule.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/workflows/lib/metrics/rollup-schedule.ts"],
4
+ "sourcesContent": ["/**\n * Scheduling constants for the per-definition KPI rollup (spec \u00A78.5).\n *\n * Kept in their own module so `setup.ts` can import them without dragging in\n * the ORM entities that `rollup-service.ts` pulls: tenant setup runs on a path\n * where importing the whole engine would be a needless cost.\n */\n\n/**\n * Queue the scheduled tick targets. Duplicated as a string literal in\n * `workers/workflow-definition-metric-rollup.worker.ts` because the generator's\n * AST extractor cannot resolve an imported queue name \u2014 see the NOTE there.\n * `workers/__tests__/definition-metric-rollup.worker.test.ts` asserts the two\n * spellings stay identical, so the duplication cannot drift.\n */\nexport const WORKFLOW_DEFINITION_METRIC_ROLLUP_QUEUE = 'workflow-definition-metric-rollup'\n\n/**\n * How often a rollup pass runs, as a `@open-mercato/scheduler` interval.\n *\n * Matched to `WORKFLOW_ROLLUP_BUCKET_MS` (15 minutes): ticking faster than the\n * bucket only rewrites the same row with the same numbers, and ticking slower\n * leaves buckets with no row at all, which the read route then has to\n * live-compute.\n */\nexport const WORKFLOW_DEFINITION_METRIC_ROLLUP_INTERVAL = '900s'\n"],
5
+ "mappings": "AAeO,MAAM,0CAA0C;AAUhD,MAAM,6CAA6C;",
6
+ "names": []
7
+ }
@@ -0,0 +1,160 @@
1
+ import { createLogger } from "@open-mercato/shared/lib/logger";
2
+ import { UserTask, WorkflowDefinitionMetricRollup, WorkflowInstance } from "../../data/entities.js";
3
+ import {
4
+ WORKFLOW_ROLLUP_WINDOW_KEYS,
5
+ WORKFLOW_ROLLUP_WINDOW_MS,
6
+ WORKFLOW_TERMINAL_STATUSES,
7
+ buildDefinitionMetrics,
8
+ floorToRollupBucket
9
+ } from "./definition-metrics.js";
10
+ const logger = createLogger("workflows");
11
+ function organizationFilter(scope) {
12
+ return scope.organizationIds ? { organizationId: { $in: scope.organizationIds } } : {};
13
+ }
14
+ const ROLLUP_DURATION_SAMPLE_LIMIT = 5e3;
15
+ const ROLLUP_TASK_SAMPLE_LIMIT = 5e3;
16
+ function resolveWindowBounds(nowMs) {
17
+ const windowEndMs = floorToRollupBucket(nowMs);
18
+ return WORKFLOW_ROLLUP_WINDOW_KEYS.map((windowKey) => ({
19
+ windowKey,
20
+ windowStart: new Date(windowEndMs - WORKFLOW_ROLLUP_WINDOW_MS[windowKey]),
21
+ windowEnd: new Date(windowEndMs)
22
+ }));
23
+ }
24
+ async function listActiveWorkflowIds(em, scope, since) {
25
+ const rows = await em.find(
26
+ WorkflowInstance,
27
+ {
28
+ tenantId: scope.tenantId,
29
+ organizationId: scope.organizationId,
30
+ isDryRun: false,
31
+ deletedAt: null,
32
+ startedAt: { $gte: since }
33
+ },
34
+ { fields: ["workflowId"] }
35
+ );
36
+ return Array.from(new Set(rows.map((row) => row.workflowId))).sort(
37
+ (left, right) => left.localeCompare(right)
38
+ );
39
+ }
40
+ async function computeDefinitionMetrics(em, scope, args) {
41
+ const baseScope = {
42
+ tenantId: scope.tenantId,
43
+ ...organizationFilter(scope),
44
+ workflowId: args.workflowId,
45
+ isDryRun: false,
46
+ deletedAt: null
47
+ };
48
+ const window = { $gte: args.windowStart, $lt: args.windowEnd };
49
+ const runsStarted = await em.count(WorkflowInstance, {
50
+ ...baseScope,
51
+ startedAt: window
52
+ });
53
+ const terminalInstances = await em.find(
54
+ WorkflowInstance,
55
+ {
56
+ ...baseScope,
57
+ status: { $in: [...WORKFLOW_TERMINAL_STATUSES] },
58
+ $or: [{ completedAt: window }, { cancelledAt: window }]
59
+ },
60
+ {
61
+ orderBy: { startedAt: "DESC" },
62
+ limit: ROLLUP_DURATION_SAMPLE_LIMIT,
63
+ fields: ["id", "status", "outcome", "startedAt", "completedAt", "cancelledAt"]
64
+ }
65
+ );
66
+ const terminalRuns = terminalInstances.map((instance) => ({
67
+ status: instance.status,
68
+ outcome: instance.outcome ?? null,
69
+ startedAt: instance.startedAt ?? null,
70
+ terminalAt: instance.completedAt ?? instance.cancelledAt ?? null
71
+ }));
72
+ const instanceIds = terminalInstances.map((instance) => instance.id);
73
+ const completedTasks = instanceIds.length ? await em.find(
74
+ UserTask,
75
+ {
76
+ tenantId: scope.tenantId,
77
+ ...organizationFilter(scope),
78
+ workflowInstanceId: { $in: instanceIds },
79
+ status: "COMPLETED",
80
+ dueDate: { $ne: null },
81
+ completedAt: window
82
+ },
83
+ { limit: ROLLUP_TASK_SAMPLE_LIMIT, fields: ["dueDate", "completedAt"] }
84
+ ) : [];
85
+ return buildDefinitionMetrics({
86
+ runsStarted,
87
+ terminalRuns,
88
+ completedTasks: completedTasks.map((task) => ({
89
+ dueDate: task.dueDate ?? null,
90
+ completedAt: task.completedAt ?? null
91
+ }))
92
+ });
93
+ }
94
+ async function upsertRollup(em, scope, args) {
95
+ const key = {
96
+ tenantId: scope.tenantId,
97
+ organizationId: scope.organizationId,
98
+ workflowId: args.workflowId,
99
+ windowKey: args.bounds.windowKey,
100
+ windowStart: args.bounds.windowStart
101
+ };
102
+ const existing = await em.findOne(WorkflowDefinitionMetricRollup, key);
103
+ if (existing) {
104
+ existing.windowEnd = args.bounds.windowEnd;
105
+ existing.computedAt = args.now;
106
+ existing.metrics = { ...args.metrics };
107
+ em.persist(existing);
108
+ return;
109
+ }
110
+ em.persist(
111
+ em.create(WorkflowDefinitionMetricRollup, {
112
+ ...key,
113
+ windowEnd: args.bounds.windowEnd,
114
+ computedAt: args.now,
115
+ metrics: { ...args.metrics },
116
+ createdAt: args.now
117
+ })
118
+ );
119
+ }
120
+ async function writeRollupsForScope(em, scope, options = {}) {
121
+ const now = options.now ?? /* @__PURE__ */ new Date();
122
+ const bounds = resolveWindowBounds(now.getTime());
123
+ const widest = bounds.reduce(
124
+ (oldest, candidate) => candidate.windowStart < oldest.windowStart ? candidate : oldest
125
+ );
126
+ const workflowIds = await listActiveWorkflowIds(em, scope, widest.windowStart);
127
+ let written = 0;
128
+ const readScope = {
129
+ tenantId: scope.tenantId,
130
+ organizationIds: [scope.organizationId]
131
+ };
132
+ for (const workflowId of workflowIds) {
133
+ for (const windowBounds of bounds) {
134
+ const metrics = await computeDefinitionMetrics(em, readScope, {
135
+ workflowId,
136
+ windowStart: windowBounds.windowStart,
137
+ windowEnd: windowBounds.windowEnd
138
+ });
139
+ await upsertRollup(em, scope, { workflowId, bounds: windowBounds, metrics, now });
140
+ written += 1;
141
+ }
142
+ }
143
+ await em.flush();
144
+ logger.debug("Wrote workflow definition metric rollups", {
145
+ tenantId: scope.tenantId,
146
+ organizationId: scope.organizationId,
147
+ workflowIds: workflowIds.length,
148
+ written
149
+ });
150
+ return { workflowIds: workflowIds.length, written };
151
+ }
152
+ export {
153
+ ROLLUP_DURATION_SAMPLE_LIMIT,
154
+ ROLLUP_TASK_SAMPLE_LIMIT,
155
+ computeDefinitionMetrics,
156
+ listActiveWorkflowIds,
157
+ resolveWindowBounds,
158
+ writeRollupsForScope
159
+ };
160
+ //# sourceMappingURL=rollup-service.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/workflows/lib/metrics/rollup-service.ts"],
4
+ "sourcesContent": ["/**\n * Per-definition KPI rollup (spec \u00A78.5) \u2014 the data-access half.\n *\n * The arithmetic lives in `./definition-metrics` and is pure; everything here is\n * about reading the right rows and writing the bucket exactly once.\n *\n * **Idempotency contract.** A pass never increments anything. It snaps the\n * window boundaries to `WORKFLOW_ROLLUP_BUCKET_MS`, RECOMPUTES the whole window\n * from the source rows, and writes the result at\n * `(tenantId, organizationId, workflowId, windowKey, windowStart)` \u2014 a key the\n * database enforces as unique. Running the same pass twice inside one bucket\n * therefore produces byte-identical rows and never a duplicate; running it after\n * the bucket rolls over produces a NEW row for the new bucket rather than\n * mutating history.\n *\n * **Scoping contract.** Every query below carries `tenantId` AND\n * `organizationId`. The worker enumerates scopes and calls this per scope; it\n * never widens a query to \"all tenants\" and then partitions in JS.\n *\n * **Dry-run contract.** `isDryRun: false` is on every instance query, and the\n * task query reaches tasks only through the ids of those instances \u2014 so a dry\n * run cannot contribute a run, a duration or an SLA sample by any path.\n */\n\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\nimport { UserTask, WorkflowDefinitionMetricRollup, WorkflowInstance } from '../../data/entities'\nimport {\n WORKFLOW_ROLLUP_WINDOW_KEYS,\n WORKFLOW_ROLLUP_WINDOW_MS,\n WORKFLOW_TERMINAL_STATUSES,\n buildDefinitionMetrics,\n floorToRollupBucket,\n type DefinitionMetrics,\n type WorkflowRollupWindowKey,\n} from './definition-metrics'\n\nconst logger = createLogger('workflows')\n\nexport type RollupScope = {\n tenantId: string\n organizationId: string\n}\n\n/**\n * Read-side scope.\n *\n * A rollup ROW is always per-organization, but a reader's organization scope can\n * legitimately cover several organizations (`filterIds`) or every organization in\n * the tenant (an unrestricted scope). Counts across organizations would sum, but\n * a percentile would not \u2014 a p95 cannot be recovered from three stored p95s \u2014 so\n * a multi-organization read is answered by live compute over the resolved set\n * rather than by pretending the rollup covers it. `organizationIds: undefined`\n * means \"every organization in this tenant\"; `tenantId` is never optional, so no\n * shape of this type can escape the tenant.\n */\nexport type MetricsReadScope = {\n tenantId: string\n organizationIds?: string[]\n}\n\nfunction organizationFilter(scope: MetricsReadScope): { organizationId?: { $in: string[] } } {\n return scope.organizationIds ? { organizationId: { $in: scope.organizationIds } } : {}\n}\n\nexport type RollupWindowBounds = {\n windowKey: WorkflowRollupWindowKey\n windowStart: Date\n windowEnd: Date\n}\n\n/**\n * How many instances one window's duration sample may draw from. A percentile\n * needs the values, not a count, so this is the one query that cannot be a\n * `COUNT(*)`; the cap keeps a pathological definition from pulling a month of\n * rows into memory. Exceeding it biases the sample toward the NEWEST runs,\n * which is the least misleading truncation available and is reported to the\n * reader through `durationSampleCount` sitting beside the percentile.\n */\nexport const ROLLUP_DURATION_SAMPLE_LIMIT = 5000\n\n/** How many tasks one window's SLA hit-rate may draw from, for the same reason. */\nexport const ROLLUP_TASK_SAMPLE_LIMIT = 5000\n\n/** Resolve the bucket-aligned bounds of every rollup window at `nowMs`. */\nexport function resolveWindowBounds(nowMs: number): RollupWindowBounds[] {\n const windowEndMs = floorToRollupBucket(nowMs)\n return WORKFLOW_ROLLUP_WINDOW_KEYS.map((windowKey) => ({\n windowKey,\n windowStart: new Date(windowEndMs - WORKFLOW_ROLLUP_WINDOW_MS[windowKey]),\n windowEnd: new Date(windowEndMs),\n }))\n}\n\n/**\n * Logical workflow ids that have any non-dry-run activity in the widest window.\n *\n * Bounded by the widest window rather than by all history so a workflow retired\n * a year ago stops costing a row every quarter of an hour.\n */\nexport async function listActiveWorkflowIds(\n em: EntityManager,\n scope: RollupScope,\n since: Date,\n): Promise<string[]> {\n const rows = await em.find(\n WorkflowInstance,\n {\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n isDryRun: false,\n deletedAt: null,\n startedAt: { $gte: since },\n },\n { fields: ['workflowId'] },\n )\n return Array.from(new Set(rows.map((row) => row.workflowId))).sort((left, right) =>\n left.localeCompare(right),\n )\n}\n\n/**\n * Compute one workflow's metrics for one window, straight from the source rows.\n *\n * Also the live-compute fallback the read route uses when no fresh rollup row\n * exists, which is what keeps the two paths from disagreeing: there is one\n * implementation of \"what do these numbers mean\", not two.\n */\nexport async function computeDefinitionMetrics(\n em: EntityManager,\n scope: MetricsReadScope,\n args: { workflowId: string; windowStart: Date; windowEnd: Date },\n): Promise<DefinitionMetrics> {\n const baseScope = {\n tenantId: scope.tenantId,\n ...organizationFilter(scope),\n workflowId: args.workflowId,\n isDryRun: false,\n deletedAt: null,\n } as const\n const window = { $gte: args.windowStart, $lt: args.windowEnd }\n\n const runsStarted = await em.count(WorkflowInstance, {\n ...baseScope,\n startedAt: window,\n })\n\n // A run is \"terminal in this window\" by its terminal TIMESTAMP, never by its\n // status alone \u2014 a run that failed last month is not this week's failure.\n // `completedAt` covers COMPLETED, FAILED and COMPENSATED, `cancelledAt`\n // covers CANCELLED. A run compensated before the engine started stamping a\n // terminal timestamp has neither, so it matches nothing here and falls into\n // no window \u2014 unchanged, and deliberately not backfilled.\n const terminalInstances = await em.find(\n WorkflowInstance,\n {\n ...baseScope,\n status: { $in: [...WORKFLOW_TERMINAL_STATUSES] },\n $or: [{ completedAt: window }, { cancelledAt: window }],\n },\n {\n orderBy: { startedAt: 'DESC' },\n limit: ROLLUP_DURATION_SAMPLE_LIMIT,\n fields: ['id', 'status', 'outcome', 'startedAt', 'completedAt', 'cancelledAt'],\n },\n )\n\n const terminalRuns = terminalInstances.map((instance) => ({\n status: instance.status,\n outcome: instance.outcome ?? null,\n startedAt: instance.startedAt ?? null,\n terminalAt: instance.completedAt ?? instance.cancelledAt ?? null,\n }))\n\n // Tasks carry no workflow id of their own, so they are reached through the\n // instances above. That indirection is also what excludes dry runs from the\n // SLA metric structurally rather than by a second flag: a dry run creates no\n // task row at all, and the instance ids fed in here are already dry-run free.\n const instanceIds = terminalInstances.map((instance) => instance.id)\n const completedTasks = instanceIds.length\n ? await em.find(\n UserTask,\n {\n tenantId: scope.tenantId,\n ...organizationFilter(scope),\n workflowInstanceId: { $in: instanceIds },\n status: 'COMPLETED',\n dueDate: { $ne: null },\n completedAt: window,\n },\n { limit: ROLLUP_TASK_SAMPLE_LIMIT, fields: ['dueDate', 'completedAt'] },\n )\n : []\n\n return buildDefinitionMetrics({\n runsStarted,\n terminalRuns,\n completedTasks: completedTasks.map((task) => ({\n dueDate: task.dueDate ?? null,\n completedAt: task.completedAt ?? null,\n })),\n })\n}\n\n/**\n * Write (or overwrite) one bucket's row.\n *\n * Read-then-write against the unique key. The constraint is the real guarantee;\n * this lookup only avoids the round trip through a conflict in the common case.\n */\nasync function upsertRollup(\n em: EntityManager,\n scope: RollupScope,\n args: { workflowId: string; bounds: RollupWindowBounds; metrics: DefinitionMetrics; now: Date },\n): Promise<void> {\n const key = {\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n workflowId: args.workflowId,\n windowKey: args.bounds.windowKey,\n windowStart: args.bounds.windowStart,\n }\n const existing = await em.findOne(WorkflowDefinitionMetricRollup, key)\n if (existing) {\n existing.windowEnd = args.bounds.windowEnd\n existing.computedAt = args.now\n existing.metrics = { ...args.metrics }\n em.persist(existing)\n return\n }\n em.persist(\n em.create(WorkflowDefinitionMetricRollup, {\n ...key,\n windowEnd: args.bounds.windowEnd,\n computedAt: args.now,\n metrics: { ...args.metrics },\n createdAt: args.now,\n }),\n )\n}\n\nexport type RollupPassResult = {\n workflowIds: number\n written: number\n}\n\n/**\n * One rollup pass for one tenant + organization.\n *\n * Returns counts rather than rows so the worker can log a one-line summary\n * without holding the whole result set.\n */\nexport async function writeRollupsForScope(\n em: EntityManager,\n scope: RollupScope,\n options: { now?: Date } = {},\n): Promise<RollupPassResult> {\n const now = options.now ?? new Date()\n const bounds = resolveWindowBounds(now.getTime())\n const widest = bounds.reduce((oldest, candidate) =>\n candidate.windowStart < oldest.windowStart ? candidate : oldest,\n )\n\n const workflowIds = await listActiveWorkflowIds(em, scope, widest.windowStart)\n let written = 0\n\n const readScope: MetricsReadScope = {\n tenantId: scope.tenantId,\n organizationIds: [scope.organizationId],\n }\n\n for (const workflowId of workflowIds) {\n for (const windowBounds of bounds) {\n const metrics = await computeDefinitionMetrics(em, readScope, {\n workflowId,\n windowStart: windowBounds.windowStart,\n windowEnd: windowBounds.windowEnd,\n })\n await upsertRollup(em, scope, { workflowId, bounds: windowBounds, metrics, now })\n written += 1\n }\n }\n\n await em.flush()\n logger.debug('Wrote workflow definition metric rollups', {\n tenantId: scope.tenantId,\n organizationId: scope.organizationId,\n workflowIds: workflowIds.length,\n written,\n })\n return { workflowIds: workflowIds.length, written }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,128 @@
1
+ const NODE_CONFIG_SUMMARY_SEPARATOR = " \xB7 ";
2
+ function text(value) {
3
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
4
+ }
5
+ function firstActivityConfig(data, activityType) {
6
+ const match = (data.activities ?? []).find(
7
+ (activity) => activity && activity.activityType === activityType
8
+ );
9
+ if (match?.config) return match.config;
10
+ if (data.activityType === activityType && data.activityConfig) return data.activityConfig;
11
+ return null;
12
+ }
13
+ function retrySegment(data) {
14
+ const attempts = data.retryPolicy?.maxAttempts;
15
+ if (typeof attempts !== "number" || attempts <= 1) return null;
16
+ return {
17
+ translationKey: "workflows.nodeSummary.retries",
18
+ translationParams: { count: attempts }
19
+ };
20
+ }
21
+ function automatedSummary(data) {
22
+ const segments = [];
23
+ const updateEntity = firstActivityConfig(data, "UPDATE_ENTITY");
24
+ const commandId = text(updateEntity?.commandId);
25
+ const executeFunction = firstActivityConfig(data, "EXECUTE_FUNCTION");
26
+ const functionName = text(executeFunction?.functionName);
27
+ const emitEvent = firstActivityConfig(data, "EMIT_EVENT");
28
+ const eventId = text(emitEvent?.eventId) ?? text(emitEvent?.event);
29
+ const identifier = commandId ?? functionName ?? eventId;
30
+ if (identifier) {
31
+ segments.push({ text: identifier, mono: true });
32
+ } else {
33
+ const activityType = text(data.activityType) ?? text((data.activities ?? []).find((activity) => activity?.activityType)?.activityType);
34
+ if (activityType) segments.push({ text: activityType, mono: true });
35
+ }
36
+ const retries = retrySegment(data);
37
+ if (retries) segments.push(retries);
38
+ return segments;
39
+ }
40
+ function invokeAgentSummary(data) {
41
+ const agentConfig = firstActivityConfig(data, "INVOKE_AGENT");
42
+ const agentId = text(data.agentId) ?? text(agentConfig?.agentId);
43
+ const segments = [];
44
+ if (agentId) segments.push({ text: agentId, mono: true });
45
+ const onResult = agentConfig?.onResult;
46
+ if (onResult?.alwaysAsk === true) {
47
+ segments.push({ translationKey: "workflows.nodeSummary.alwaysAsk" });
48
+ } else if (typeof onResult?.autoApproveThreshold === "number") {
49
+ segments.push({
50
+ translationKey: "workflows.nodeSummary.autoApproveThreshold",
51
+ translationParams: { threshold: onResult.autoApproveThreshold }
52
+ });
53
+ }
54
+ return segments;
55
+ }
56
+ function userTaskSummary(data) {
57
+ const segments = [];
58
+ const roles = (data.assignedToRoles ?? []).filter((role) => !!text(role));
59
+ if (roles.length > 0) {
60
+ segments.push({
61
+ translationKey: "workflows.nodeSummary.role",
62
+ translationParams: { roles: roles.join(", ") }
63
+ });
64
+ } else if (text(data.assignedTo)) {
65
+ segments.push({ translationKey: "workflows.nodeSummary.assigned" });
66
+ }
67
+ const bindings = data.entityBindings ?? [];
68
+ if (bindings.length > 0) {
69
+ segments.push({
70
+ translationKey: "workflows.nodeSummary.bound",
71
+ translationParams: { count: bindings.length }
72
+ });
73
+ }
74
+ const decisions = (data.decisions ?? []).length;
75
+ if (decisions > 0) {
76
+ segments.push({
77
+ translationKey: "workflows.nodeSummary.decisions",
78
+ translationParams: { count: decisions }
79
+ });
80
+ }
81
+ return segments;
82
+ }
83
+ function waitForSignalSummary(data) {
84
+ const signalName = text(data.signalName) ?? text(data.config?.signalName) ?? text(data.signalConfig?.signalName);
85
+ return signalName ? [{ text: signalName, mono: true }] : [];
86
+ }
87
+ function waitForTimerSummary(data) {
88
+ const duration = text(data.duration) ?? text(data.config?.duration);
89
+ if (duration) return [{ text: duration }];
90
+ const until = text(data.until) ?? text(data.config?.until);
91
+ return until ? [{
92
+ translationKey: "workflows.nodeSummary.until",
93
+ translationParams: { value: until }
94
+ }] : [];
95
+ }
96
+ function subWorkflowSummary(data) {
97
+ const subWorkflowId = text(data.subWorkflowId) ?? text(data.config?.subWorkflowId);
98
+ return subWorkflowId ? [{ text: subWorkflowId, mono: true }] : [];
99
+ }
100
+ const SUMMARY_BUILDERS = {
101
+ automated: automatedSummary,
102
+ invokeAgent: invokeAgentSummary,
103
+ userTask: userTaskSummary,
104
+ waitForSignal: waitForSignalSummary,
105
+ waitForTimer: waitForTimerSummary,
106
+ subWorkflow: subWorkflowSummary
107
+ };
108
+ function buildNodeConfigSummary(nodeType, data) {
109
+ const builder = SUMMARY_BUILDERS[nodeType];
110
+ if (!builder || !data) return [];
111
+ return builder(data);
112
+ }
113
+ function resolveNodeConfigSummarySegment(segment, translate) {
114
+ if (segment.translationKey) {
115
+ return translate(segment.translationKey, segment.translationParams);
116
+ }
117
+ return segment.text;
118
+ }
119
+ function formatNodeConfigSummary(segments, translate) {
120
+ return segments.map((segment) => resolveNodeConfigSummarySegment(segment, translate)).join(NODE_CONFIG_SUMMARY_SEPARATOR);
121
+ }
122
+ export {
123
+ NODE_CONFIG_SUMMARY_SEPARATOR,
124
+ buildNodeConfigSummary,
125
+ formatNodeConfigSummary,
126
+ resolveNodeConfigSummarySegment
127
+ };
128
+ //# sourceMappingURL=node-config-summary.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/workflows/lib/node-config-summary.ts"],
4
+ "sourcesContent": ["/**\n * Workflows Module - One-line node config summary (pure)\n *\n * Fidelity gap #6. The design's nodes are not bigger than ours \u2014 measured, ours\n * are WIDER \u2014 they are more informative, because the body line states the step's\n * CONFIGURATION (`customers.deals.update \u00B7 retries 3\u00D7`) instead of two clamped\n * lines of the author's prose, which truncate mid-word and cannot tell you which\n * command runs, which agent is invoked, or what the threshold is.\n *\n * The summary is derived, never authored: everything below already sits on the\n * step. `description` is not lost \u2014 it becomes the card's tooltip.\n *\n * PURE: no React, no `@xyflow/react`, no ORM, so the rule is testable without a\n * canvas and `graph-utils` could consume it if the layout ever needs to.\n */\n\nimport type { TranslateFn, TranslateParams } from '@open-mercato/shared/lib/i18n/context'\n\nexport type NodeConfigSummaryTranslationKey =\n | 'workflows.nodeSummary.alwaysAsk'\n | 'workflows.nodeSummary.assigned'\n | 'workflows.nodeSummary.autoApproveThreshold'\n | 'workflows.nodeSummary.bound'\n | 'workflows.nodeSummary.decisions'\n | 'workflows.nodeSummary.retries'\n | 'workflows.nodeSummary.role'\n | 'workflows.nodeSummary.until'\n\n/** A summary is segments so command ids can render monospaced and labels can be translated. */\nexport type NodeConfigSummarySegment =\n | {\n text: string\n translationKey?: never\n translationParams?: never\n mono?: boolean\n }\n | {\n text?: never\n translationKey: NodeConfigSummaryTranslationKey\n translationParams?: TranslateParams\n mono?: boolean\n }\n\nexport const NODE_CONFIG_SUMMARY_SEPARATOR = ' \u00B7 '\n\nexport interface NodeConfigSummarySource {\n activities?: Array<{ activityType?: string; config?: Record<string, unknown> } | null> | null\n activityType?: string\n activityId?: string\n activityConfig?: Record<string, unknown> | null\n retryPolicy?: { maxAttempts?: number } | null\n agentId?: string\n assignedTo?: string\n assignedToRoles?: string[] | null\n entityBindings?: Array<unknown> | null\n decisions?: Array<unknown> | null\n signalName?: string\n duration?: string\n until?: string\n config?: Record<string, unknown> | null\n subWorkflowId?: string\n [key: string]: unknown\n}\n\nfunction text(value: unknown): string | null {\n return typeof value === 'string' && value.trim().length > 0 ? value.trim() : null\n}\n\nfunction firstActivityConfig(\n data: NodeConfigSummarySource,\n activityType: string,\n): Record<string, unknown> | null {\n const match = (data.activities ?? []).find(\n (activity) => activity && activity.activityType === activityType,\n )\n if (match?.config) return match.config\n if (data.activityType === activityType && data.activityConfig) return data.activityConfig\n return null\n}\n\nfunction retrySegment(data: NodeConfigSummarySource): NodeConfigSummarySegment | null {\n const attempts = data.retryPolicy?.maxAttempts\n if (typeof attempts !== 'number' || attempts <= 1) return null\n return {\n translationKey: 'workflows.nodeSummary.retries',\n translationParams: { count: attempts },\n }\n}\n\nfunction automatedSummary(data: NodeConfigSummarySource): NodeConfigSummarySegment[] {\n const segments: NodeConfigSummarySegment[] = []\n\n const updateEntity = firstActivityConfig(data, 'UPDATE_ENTITY')\n const commandId = text(updateEntity?.commandId)\n const executeFunction = firstActivityConfig(data, 'EXECUTE_FUNCTION')\n const functionName = text(executeFunction?.functionName)\n const emitEvent = firstActivityConfig(data, 'EMIT_EVENT')\n const eventId = text(emitEvent?.eventId) ?? text(emitEvent?.event)\n\n const identifier = commandId ?? functionName ?? eventId\n if (identifier) {\n segments.push({ text: identifier, mono: true })\n } else {\n const activityType =\n text(data.activityType) ??\n text((data.activities ?? []).find((activity) => activity?.activityType)?.activityType)\n if (activityType) segments.push({ text: activityType, mono: true })\n }\n\n const retries = retrySegment(data)\n if (retries) segments.push(retries)\n return segments\n}\n\nfunction invokeAgentSummary(data: NodeConfigSummarySource): NodeConfigSummarySegment[] {\n const agentConfig = firstActivityConfig(data, 'INVOKE_AGENT')\n const agentId = text(data.agentId) ?? text(agentConfig?.agentId)\n const segments: NodeConfigSummarySegment[] = []\n if (agentId) segments.push({ text: agentId, mono: true })\n\n // The threshold is the single most consequential thing about an agent step \u2014\n // it decides whether a human ever sees the proposal \u2014 so it belongs on the\n // face rather than three clicks into the inspector.\n const onResult = agentConfig?.onResult as\n | { autoApproveThreshold?: unknown; alwaysAsk?: unknown }\n | undefined\n if (onResult?.alwaysAsk === true) {\n segments.push({ translationKey: 'workflows.nodeSummary.alwaysAsk' })\n } else if (typeof onResult?.autoApproveThreshold === 'number') {\n segments.push({\n translationKey: 'workflows.nodeSummary.autoApproveThreshold',\n translationParams: { threshold: onResult.autoApproveThreshold },\n })\n }\n return segments\n}\n\nfunction userTaskSummary(data: NodeConfigSummarySource): NodeConfigSummarySegment[] {\n const segments: NodeConfigSummarySegment[] = []\n const roles = (data.assignedToRoles ?? []).filter((role): role is string => !!text(role))\n if (roles.length > 0) {\n segments.push({\n translationKey: 'workflows.nodeSummary.role',\n translationParams: { roles: roles.join(', ') },\n })\n } else if (text(data.assignedTo)) {\n segments.push({ translationKey: 'workflows.nodeSummary.assigned' })\n }\n\n const bindings = data.entityBindings ?? []\n if (bindings.length > 0) {\n segments.push({\n translationKey: 'workflows.nodeSummary.bound',\n translationParams: { count: bindings.length },\n })\n }\n\n const decisions = (data.decisions ?? []).length\n if (decisions > 0) {\n segments.push({\n translationKey: 'workflows.nodeSummary.decisions',\n translationParams: { count: decisions },\n })\n }\n return segments\n}\n\nfunction waitForSignalSummary(data: NodeConfigSummarySource): NodeConfigSummarySegment[] {\n const signalName =\n text(data.signalName) ??\n text((data.config as { signalName?: unknown } | null)?.signalName) ??\n text((data as { signalConfig?: { signalName?: unknown } }).signalConfig?.signalName)\n return signalName ? [{ text: signalName, mono: true }] : []\n}\n\nfunction waitForTimerSummary(data: NodeConfigSummarySource): NodeConfigSummarySegment[] {\n const duration = text(data.duration) ?? text((data.config as { duration?: unknown } | null)?.duration)\n if (duration) return [{ text: duration }]\n const until = text(data.until) ?? text((data.config as { until?: unknown } | null)?.until)\n return until\n ? [{\n translationKey: 'workflows.nodeSummary.until',\n translationParams: { value: until },\n }]\n : []\n}\n\nfunction subWorkflowSummary(data: NodeConfigSummarySource): NodeConfigSummarySegment[] {\n const subWorkflowId =\n text(data.subWorkflowId) ?? text((data.config as { subWorkflowId?: unknown } | null)?.subWorkflowId)\n return subWorkflowId ? [{ text: subWorkflowId, mono: true }] : []\n}\n\nconst SUMMARY_BUILDERS: Record<string, (data: NodeConfigSummarySource) => NodeConfigSummarySegment[]> = {\n automated: automatedSummary,\n invokeAgent: invokeAgentSummary,\n userTask: userTaskSummary,\n waitForSignal: waitForSignalSummary,\n waitForTimer: waitForTimerSummary,\n subWorkflow: subWorkflowSummary,\n}\n\n/**\n * The card's body line for a node type, or an empty list when the step carries\n * nothing worth stating \u2014 in which case the card falls back to the author's\n * description exactly as it did before, so an unconfigured node never gets\n * emptier than it was.\n */\nexport function buildNodeConfigSummary(\n nodeType: string,\n data: NodeConfigSummarySource | null | undefined,\n): NodeConfigSummarySegment[] {\n const builder = SUMMARY_BUILDERS[nodeType]\n if (!builder || !data) return []\n return builder(data)\n}\n\nexport function resolveNodeConfigSummarySegment(\n segment: NodeConfigSummarySegment,\n translate: TranslateFn,\n): string {\n if (segment.translationKey) {\n return translate(segment.translationKey, segment.translationParams)\n }\n return segment.text\n}\n\nexport function formatNodeConfigSummary(\n segments: NodeConfigSummarySegment[],\n translate: TranslateFn,\n): string {\n return segments\n .map((segment) => resolveNodeConfigSummarySegment(segment, translate))\n .join(NODE_CONFIG_SUMMARY_SEPARATOR)\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,53 @@
1
+ const NODE_MIN_WIDTH = 180;
2
+ const NODE_MAX_WIDTH = 280;
3
+ const NODE_HEIGHT = 88;
4
+ const NODE_DESCRIPTION_HEIGHT = 24;
5
+ const NODE_OUTCOME_ROW_HEIGHT = 18;
6
+ const NODE_OUTCOME_FOOTER_CHROME_HEIGHT = 22;
7
+ const TERMINAL_NODE_MIN_WIDTH = 96;
8
+ const TERMINAL_NODE_HEIGHT = 36;
9
+ const TRIGGER_NODE_WIDTH = 200;
10
+ const TRIGGER_NODE_HEADER_HEIGHT = 32;
11
+ const TRIGGER_NODE_ROW_HEIGHT = 22;
12
+ const TRIGGER_NODE_GAP = 80;
13
+ const NODE_HANDLE_SIZE = 12;
14
+ const NODE_HANDLE_SIZE_CLASS = "!h-3 !w-3";
15
+ const NODE_HANDLE_BORDER_CLASS = "!border-2 !border-background";
16
+ const NODE_HANDLE_CLASS = `${NODE_HANDLE_SIZE_CLASS} ${NODE_HANDLE_BORDER_CLASS}`;
17
+ const NODE_HANDLE_EDGE_OFFSET = -(NODE_HANDLE_SIZE / 2);
18
+ const NODE_PORT_HANDLE_SIZE_CLASS = "!h-2.5 !w-2.5";
19
+ const NODE_PORT_HANDLE_CLASS = `${NODE_PORT_HANDLE_SIZE_CLASS} !border !border-background`;
20
+ const ROUTE_CHIP_ICON_SIZE = 20;
21
+ const ROUTE_CHIP_ICON_CLASS = "size-5";
22
+ const ROUTE_CHIP_LABEL_ICON_CLASS = "size-3.5";
23
+ const ROUTE_CHIP_PADDING_CLASS = "px-2 py-1";
24
+ const ROUTE_CHIP_HEIGHT = ROUTE_CHIP_ICON_SIZE + 8 + 2;
25
+ const ROUTE_CHIP_CLASS = `inline-flex items-center gap-1 rounded-md border bg-card ${ROUTE_CHIP_PADDING_CLASS} text-xs font-medium`;
26
+ export {
27
+ NODE_DESCRIPTION_HEIGHT,
28
+ NODE_HANDLE_BORDER_CLASS,
29
+ NODE_HANDLE_CLASS,
30
+ NODE_HANDLE_EDGE_OFFSET,
31
+ NODE_HANDLE_SIZE,
32
+ NODE_HANDLE_SIZE_CLASS,
33
+ NODE_HEIGHT,
34
+ NODE_MAX_WIDTH,
35
+ NODE_MIN_WIDTH,
36
+ NODE_OUTCOME_FOOTER_CHROME_HEIGHT,
37
+ NODE_OUTCOME_ROW_HEIGHT,
38
+ NODE_PORT_HANDLE_CLASS,
39
+ NODE_PORT_HANDLE_SIZE_CLASS,
40
+ ROUTE_CHIP_CLASS,
41
+ ROUTE_CHIP_HEIGHT,
42
+ ROUTE_CHIP_ICON_CLASS,
43
+ ROUTE_CHIP_ICON_SIZE,
44
+ ROUTE_CHIP_LABEL_ICON_CLASS,
45
+ ROUTE_CHIP_PADDING_CLASS,
46
+ TERMINAL_NODE_HEIGHT,
47
+ TERMINAL_NODE_MIN_WIDTH,
48
+ TRIGGER_NODE_GAP,
49
+ TRIGGER_NODE_HEADER_HEIGHT,
50
+ TRIGGER_NODE_ROW_HEIGHT,
51
+ TRIGGER_NODE_WIDTH
52
+ };
53
+ //# sourceMappingURL=node-geometry.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/workflows/lib/node-geometry.ts"],
4
+ "sourcesContent": ["/**\n * Rendered node geometry \u2014 the SINGLE source of truth for how much space a\n * workflow node occupies AND for how big its connection handles are.\n *\n * Two consumers need the same numbers and used to keep private copies in sync\n * behind a comment: `components/WorkflowNodeCard.tsx` (which renders the card)\n * and `lib/graph-utils.ts` (which reserves the footprint dagre lays out). Drift\n * between them is invisible until ranks silently overlap, so the numbers live\n * here instead. This module stays PURE \u2014 no React, no `lucide-react`, no\n * `@xyflow/react` \u2014 so the layout transform can import it in node and jest\n * contexts without pulling in the editor's render chain.\n *\n * The handle constants below joined it for the same reason: every node\n * component spelled its own `!w-3 !h-3 !border-2 !border-background` and the\n * outcome-row footer spelled a smaller one, so a footer dot and the source\n * handle floating beside it rendered at different diameters on the same card.\n * Tailwind scans this file (`@source \".../@open-mercato/core/src/**\\/*.{ts,tsx}\"`),\n * so the literals here are real utilities, not dead strings.\n */\n\n/** Narrowest a `w-fit` card may render. */\nexport const NODE_MIN_WIDTH = 180\n/** Widest a `w-fit` card may render before its content wraps. */\nexport const NODE_MAX_WIDTH = 280\n/**\n * Height of a title-only card: the type row plus the title row, plus the 4px\n * node-type accent cap (`border-t-4`) that replaced the card's 1px top border.\n * Under-estimating here is what makes dagre pack ranks tight enough to overlap,\n * so this errs toward the real footprint.\n */\nexport const NODE_HEIGHT = 88\n/** Extra height the two-line `line-clamp-2` description adds to a card. */\nexport const NODE_DESCRIPTION_HEIGHT = 24\n\n/**\n * Height one outcome row adds to a card's footer (fidelity gap #4): a 16px row\n * plus the 2px grid gap. An agent node with four wired outcomes is materially\n * taller than a bare one, and dagre reserves boxes from these numbers \u2014 under-\n * estimating is exactly what makes ranks overlap.\n */\nexport const NODE_OUTCOME_ROW_HEIGHT = 18\n\n/**\n * Fixed chrome the footer costs once it exists at all: the hairline rule plus\n * its 4px vertical padding, and the inheritance note an agent node states.\n */\nexport const NODE_OUTCOME_FOOTER_CHROME_HEIGHT = 22\n\n/**\n * Footprint of a terminal (START / END) node. Terminals render as compact\n * auto-width pills rather than full step cards, so reserving a card-sized box\n * for them would push the first and last rank apart for nothing.\n */\nexport const TERMINAL_NODE_MIN_WIDTH = 96\nexport const TERMINAL_NODE_HEIGHT = 36\n\n/**\n * Footprint of the canvas trigger node (fidelity gap #5) \u2014 the pill that states\n * how a definition is entered, drawn in the gutter BEFORE the START terminal.\n *\n * It is derived rather than measured for the same reason the outcome-row footer\n * is: the node is minted at render time from the definition's triggers and has\n * to be placed before React Flow has laid a single card out. It is never handed\n * to dagre (it is not a step and has no rank), so these numbers do not reserve a\n * box \u2014 they position one, and `TRIGGER_NODE_GAP` matches dagre's own `ranksep`\n * so the pill sits one rank-gap ahead of START rather than at some second\n * spacing nothing else on the canvas uses.\n */\nexport const TRIGGER_NODE_WIDTH = 200\n/** The pill itself: icon + label, at the terminal pills' vertical rhythm. */\nexport const TRIGGER_NODE_HEADER_HEIGHT = 32\n/** One dashed event tag (or the manual-start / overflow line) plus its gap. */\nexport const TRIGGER_NODE_ROW_HEIGHT = 22\n/** Horizontal clearance between the trigger pill and the START terminal. */\nexport const TRIGGER_NODE_GAP = 80\n\n/**\n * Diameter, in px, of a connection handle. One number for the target handle,\n * every source handle, the error handle and the terminal pills' handles: a\n * canvas where the dots differ in size reads as a rendering bug, and the\n * maintainer's report of \"different sizes\" was exactly a 10px footer dot next\n * to a 12px floating one.\n */\nexport const NODE_HANDLE_SIZE = 12\n\n/** Tailwind form of {@link NODE_HANDLE_SIZE}. */\nexport const NODE_HANDLE_SIZE_CLASS = '!h-3 !w-3'\n\n/**\n * The ring that lifts a handle off whatever it overlaps. Kept with the size so\n * a handle can never be resized without its border following.\n */\nexport const NODE_HANDLE_BORDER_CLASS = '!border-2 !border-background'\n\n/** Size + ring. Callers add only the DS colour token the handle speaks with. */\nexport const NODE_HANDLE_CLASS = `${NODE_HANDLE_SIZE_CLASS} ${NODE_HANDLE_BORDER_CLASS}`\n\n/**\n * How far a handle overhangs the edge it sits on \u2014 half its diameter, so it\n * straddles the border rather than floating beside it. React Flow positions\n * edge-anchored handles itself; this is for handles placed by a row's own\n * layout (the outcome footer), which have to reproduce the same overhang.\n */\nexport const NODE_HANDLE_EDGE_OFFSET = -(NODE_HANDLE_SIZE / 2)\n\n/**\n * Sub-workflow IO ports are deliberately smaller than a control-flow handle:\n * a sub-workflow fans out one per declared input/output along an edge a\n * control-flow handle owns alone. Registered here anyway so the two sizes are\n * a decision made in one file rather than a drift discovered on a card.\n */\nexport const NODE_PORT_HANDLE_SIZE_CLASS = '!h-2.5 !w-2.5'\nexport const NODE_PORT_HANDLE_CLASS = `${NODE_PORT_HANDLE_SIZE_CLASS} !border !border-background`\n\n/**\n * Geometry of the chips a route renders at its midpoint (`WorkflowRouteChips`,\n * #4244) \u2014 the condition summary, the activity icons and the `+N` overflow.\n *\n * They live here for the reason the handle constants do: a canvas element whose\n * size is spelled inline in the component that draws it drifts. The activity\n * chip was the drift's first casualty \u2014 an icon at `size-3` in `px-1.5 py-0.5`\n * padding rendered an ~18px box carrying a 12px glyph, which is the size of a\n * connection handle and unreadable at any canvas zoom below 1. A route chip is\n * something the author reads, not a dot they aim at, so it is sized against the\n * card it sits between rather than against the handle it sits near: the icon is\n * {@link ROUTE_CHIP_ICON_SIZE}px and the box lands near {@link ROUTE_CHIP_HEIGHT}px,\n * comfortably under half of {@link NODE_HEIGHT} so a chip never competes with the\n * steps it connects.\n *\n * The label stays `text-xs` \u2014 the DS floor the node config summaries already\n * hold \u2014 so a chip grows by its glyph and its padding, never by inventing a\n * type size the design system does not have.\n */\nexport const ROUTE_CHIP_ICON_SIZE = 20\n\n/**\n * Tailwind form of {@link ROUTE_CHIP_ICON_SIZE}. For the ICON-ONLY activity\n * chip, where the glyph is the whole chip and has to carry it alone.\n */\nexport const ROUTE_CHIP_ICON_CLASS = 'size-5'\n\n/**\n * The glyph on a chip that also carries text (the condition summary, the\n * `otherwise` marker). It sits on the label's optical line, so it is sized\n * against the `text-xs` next to it rather than against the canvas \u2014 at\n * {@link ROUTE_CHIP_ICON_SIZE} it would tower over its own label.\n */\nexport const ROUTE_CHIP_LABEL_ICON_CLASS = 'size-3.5'\n\n/** Breathing room around a chip's glyph, on the DS spacing scale. */\nexport const ROUTE_CHIP_PADDING_CLASS = 'px-2 py-1'\n\n/**\n * Rendered height of a chip: the glyph plus {@link ROUTE_CHIP_PADDING_CLASS}'s\n * 4px vertical padding on each side plus the 1px border on each side. Derived\n * so the ratio to the node card stays checkable.\n */\nexport const ROUTE_CHIP_HEIGHT = ROUTE_CHIP_ICON_SIZE + 8 + 2\n\n/**\n * Everything a chip shares regardless of what it says. Callers add only the DS\n * colour tokens and the interaction states their own chip speaks with.\n *\n * On the radius: the DS scale has no 4px step for a chip \u2014 it is either\n * `rounded-full` (pill) or `rounded-md`. Bare `rounded` was neither, and read as\n * a slightly squared-off box next to every other chip in the product.\n */\nexport const ROUTE_CHIP_CLASS = `inline-flex items-center gap-1 rounded-md border bg-card ${ROUTE_CHIP_PADDING_CLASS} text-xs font-medium`\n"],
5
+ "mappings": "AAqBO,MAAM,iBAAiB;AAEvB,MAAM,iBAAiB;AAOvB,MAAM,cAAc;AAEpB,MAAM,0BAA0B;AAQhC,MAAM,0BAA0B;AAMhC,MAAM,oCAAoC;AAO1C,MAAM,0BAA0B;AAChC,MAAM,uBAAuB;AAc7B,MAAM,qBAAqB;AAE3B,MAAM,6BAA6B;AAEnC,MAAM,0BAA0B;AAEhC,MAAM,mBAAmB;AASzB,MAAM,mBAAmB;AAGzB,MAAM,yBAAyB;AAM/B,MAAM,2BAA2B;AAGjC,MAAM,oBAAoB,GAAG,sBAAsB,IAAI,wBAAwB;AAQ/E,MAAM,0BAA0B,EAAE,mBAAmB;AAQrD,MAAM,8BAA8B;AACpC,MAAM,yBAAyB,GAAG,2BAA2B;AAqB7D,MAAM,uBAAuB;AAM7B,MAAM,wBAAwB;AAQ9B,MAAM,8BAA8B;AAGpC,MAAM,2BAA2B;AAOjC,MAAM,oBAAoB,uBAAuB,IAAI;AAUrD,MAAM,mBAAmB,4DAA4D,wBAAwB;",
6
+ "names": []
7
+ }
@@ -0,0 +1,44 @@
1
+ const NUDGE_STEP = 1;
2
+ const NUDGE_STEP_COARSE = 10;
3
+ const NUDGE_COMMIT_DELAY_MS = 400;
4
+ const NUDGE_KEYS = {
5
+ ArrowUp: "up",
6
+ ArrowDown: "down",
7
+ ArrowLeft: "left",
8
+ ArrowRight: "right"
9
+ };
10
+ function resolveNudgeDirection(key) {
11
+ return NUDGE_KEYS[key] ?? null;
12
+ }
13
+ function nudgeOffset(direction, coarse) {
14
+ const distance = coarse ? NUDGE_STEP_COARSE : NUDGE_STEP;
15
+ switch (direction) {
16
+ case "up":
17
+ return { x: 0, y: -distance };
18
+ case "down":
19
+ return { x: 0, y: distance };
20
+ case "left":
21
+ return { x: -distance, y: 0 };
22
+ default:
23
+ return { x: distance, y: 0 };
24
+ }
25
+ }
26
+ function nudgeSelectedNodes(nodes, offset) {
27
+ if (!nodes.some((node) => node.selected)) return nodes;
28
+ return nodes.map(
29
+ (node) => node.selected ? { ...node, position: { x: node.position.x + offset.x, y: node.position.y + offset.y } } : node
30
+ );
31
+ }
32
+ function selectedNodeIds(nodes) {
33
+ return nodes.filter((node) => node.selected).map((node) => node.id);
34
+ }
35
+ export {
36
+ NUDGE_COMMIT_DELAY_MS,
37
+ NUDGE_STEP,
38
+ NUDGE_STEP_COARSE,
39
+ nudgeOffset,
40
+ nudgeSelectedNodes,
41
+ resolveNudgeDirection,
42
+ selectedNodeIds
43
+ };
44
+ //# sourceMappingURL=node-nudge.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/workflows/lib/node-nudge.ts"],
4
+ "sourcesContent": ["/**\n * Arrow-key positioning for selected cards (spec section 4.6: \"arrows nudge\").\n *\n * Nudging is the keyboard's answer to dragging, so it obeys the same rule the\n * drag path does (#4248): many keystrokes are ONE arrangement. The page captures\n * the document before the first nudge of a burst and commits a single undo entry\n * plus a single autosave once the burst settles.\n *\n * PURE: nodes in, nodes out.\n */\n\nimport type { Node } from '@xyflow/react'\n\n/** One press moves a card a hair; Shift moves it a visible step. */\nexport const NUDGE_STEP = 1\nexport const NUDGE_STEP_COARSE = 10\n\n/** Milliseconds of no arrow key before a nudge burst counts as finished. */\nexport const NUDGE_COMMIT_DELAY_MS = 400\n\nexport type NudgeDirection = 'up' | 'down' | 'left' | 'right'\n\nconst NUDGE_KEYS: Record<string, NudgeDirection> = {\n ArrowUp: 'up',\n ArrowDown: 'down',\n ArrowLeft: 'left',\n ArrowRight: 'right',\n}\n\nexport function resolveNudgeDirection(key: string): NudgeDirection | null {\n return NUDGE_KEYS[key] ?? null\n}\n\nexport function nudgeOffset(direction: NudgeDirection, coarse: boolean): { x: number; y: number } {\n const distance = coarse ? NUDGE_STEP_COARSE : NUDGE_STEP\n switch (direction) {\n case 'up':\n return { x: 0, y: -distance }\n case 'down':\n return { x: 0, y: distance }\n case 'left':\n return { x: -distance, y: 0 }\n default:\n return { x: distance, y: 0 }\n }\n}\n\n/**\n * Move every selected node by the offset. Returns the SAME array when nothing is\n * selected so the caller can skip the commit and the autosave entirely.\n */\nexport function nudgeSelectedNodes(nodes: Node[], offset: { x: number; y: number }): Node[] {\n if (!nodes.some((node) => node.selected)) return nodes\n return nodes.map((node) =>\n node.selected\n ? { ...node, position: { x: node.position.x + offset.x, y: node.position.y + offset.y } }\n : node,\n )\n}\n\nexport function selectedNodeIds(nodes: Node[]): string[] {\n return nodes.filter((node) => node.selected).map((node) => node.id)\n}\n"],
5
+ "mappings": "AAcO,MAAM,aAAa;AACnB,MAAM,oBAAoB;AAG1B,MAAM,wBAAwB;AAIrC,MAAM,aAA6C;AAAA,EACjD,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AACd;AAEO,SAAS,sBAAsB,KAAoC;AACxE,SAAO,WAAW,GAAG,KAAK;AAC5B;AAEO,SAAS,YAAY,WAA2B,QAA2C;AAChG,QAAM,WAAW,SAAS,oBAAoB;AAC9C,UAAQ,WAAW;AAAA,IACjB,KAAK;AACH,aAAO,EAAE,GAAG,GAAG,GAAG,CAAC,SAAS;AAAA,IAC9B,KAAK;AACH,aAAO,EAAE,GAAG,GAAG,GAAG,SAAS;AAAA,IAC7B,KAAK;AACH,aAAO,EAAE,GAAG,CAAC,UAAU,GAAG,EAAE;AAAA,IAC9B;AACE,aAAO,EAAE,GAAG,UAAU,GAAG,EAAE;AAAA,EAC/B;AACF;AAMO,SAAS,mBAAmB,OAAe,QAA0C;AAC1F,MAAI,CAAC,MAAM,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAG,QAAO;AACjD,SAAO,MAAM;AAAA,IAAI,CAAC,SAChB,KAAK,WACD,EAAE,GAAG,MAAM,UAAU,EAAE,GAAG,KAAK,SAAS,IAAI,OAAO,GAAG,GAAG,KAAK,SAAS,IAAI,OAAO,EAAE,EAAE,IACtF;AAAA,EACN;AACF;AAEO,SAAS,gBAAgB,OAAyB;AACvD,SAAO,MAAM,OAAO,CAAC,SAAS,KAAK,QAAQ,EAAE,IAAI,CAAC,SAAS,KAAK,EAAE;AACpE;",
6
+ "names": []
7
+ }