@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,90 @@
1
+ const NEUTRAL = {
2
+ badge: "bg-status-neutral-bg text-status-neutral-text",
3
+ icon: "text-status-neutral-icon",
4
+ text: "text-status-neutral-text"
5
+ };
6
+ const INFO = {
7
+ badge: "bg-status-info-bg text-status-info-text",
8
+ icon: "text-status-info-icon",
9
+ text: "text-status-info-text"
10
+ };
11
+ const WARNING = {
12
+ badge: "bg-status-warning-bg text-status-warning-text",
13
+ icon: "text-status-warning-icon",
14
+ text: "text-status-warning-text"
15
+ };
16
+ const SUCCESS = {
17
+ badge: "bg-status-success-bg text-status-success-text",
18
+ icon: "text-status-success-icon",
19
+ text: "text-status-success-text"
20
+ };
21
+ const ERROR = {
22
+ badge: "bg-status-error-bg text-status-error-text",
23
+ icon: "text-status-error-icon",
24
+ text: "text-status-error-text"
25
+ };
26
+ const STATUS_DESCRIPTORS = {
27
+ PENDING: { ...WARNING, iconName: "Clock" },
28
+ IN_PROGRESS: { ...INFO, iconName: "Loader" },
29
+ COMPLETED: { ...SUCCESS, iconName: "CheckCircle2" },
30
+ CANCELLED: { ...NEUTRAL, iconName: "XCircle" },
31
+ ESCALATED: { ...ERROR, iconName: "AlertTriangle" }
32
+ };
33
+ function describeWorkInboxStatus(status) {
34
+ return STATUS_DESCRIPTORS[status] ?? { ...NEUTRAL, iconName: "Circle" };
35
+ }
36
+ const PRIORITY_DESCRIPTORS = {
37
+ extreme: { ...ERROR, iconName: "Flame" },
38
+ high: { ...WARNING, iconName: "ArrowUp" },
39
+ medium: { ...INFO, iconName: "Minus" },
40
+ low: { ...NEUTRAL, iconName: "ArrowDown" }
41
+ };
42
+ function describeWorkInboxPriority(priority) {
43
+ return priority ? PRIORITY_DESCRIPTORS[priority] : null;
44
+ }
45
+ const WORK_INBOX_OVERDUE_TONE = {
46
+ ...ERROR,
47
+ iconName: "AlertTriangle"
48
+ };
49
+ const TASK_ACTION_BLOCK_DESCRIPTORS = {
50
+ "not-workable": {
51
+ ...INFO,
52
+ iconName: "CheckCircle2",
53
+ messageKey: "workflows.tasks.detail.cannotComplete",
54
+ remedy: null
55
+ },
56
+ "owned-by-another": {
57
+ ...WARNING,
58
+ iconName: "AlertTriangle",
59
+ messageKey: "workflows.tasks.detail.blocked.ownedByAnother",
60
+ remedy: "reassign"
61
+ },
62
+ "not-in-your-queue": {
63
+ ...WARNING,
64
+ iconName: "AlertTriangle",
65
+ messageKey: "workflows.tasks.detail.blocked.notInYourQueue",
66
+ remedy: "reassign"
67
+ },
68
+ unowned: {
69
+ ...WARNING,
70
+ iconName: "AlertTriangle",
71
+ messageKey: "workflows.tasks.detail.blocked.unowned",
72
+ remedy: "reassign"
73
+ },
74
+ unavailable: {
75
+ ...INFO,
76
+ iconName: "AlertTriangle",
77
+ messageKey: "workflows.tasks.detail.blocked.unavailable",
78
+ remedy: null
79
+ }
80
+ };
81
+ function describeTaskActionBlock(reason) {
82
+ return TASK_ACTION_BLOCK_DESCRIPTORS[reason] ?? TASK_ACTION_BLOCK_DESCRIPTORS.unavailable;
83
+ }
84
+ export {
85
+ WORK_INBOX_OVERDUE_TONE,
86
+ describeTaskActionBlock,
87
+ describeWorkInboxPriority,
88
+ describeWorkInboxStatus
89
+ };
90
+ //# sourceMappingURL=presentation.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/workflows/lib/work-inbox/presentation.ts"],
4
+ "sourcesContent": ["/**\n * Work Inbox \u2014 status and priority presentation (PURE).\n *\n * Two rules the module is held to live here rather than inside the page:\n *\n * 1. **Design-system tokens only.** The retired task list hard-coded\n * `bg-yellow-100` / `bg-blue-100` / `bg-green-100` badges and `text-red-600`\n * overdue markers, none of which are dark-mode aware.\n * 2. **Status is never colour-only** (workflows AGENTS.md \u2192 canvas/status rule,\n * spec \u00A74.6). Every descriptor therefore pairs its token with an icon name\n * AND keeps its own translated label, so the badge reads without colour.\n *\n * Icon *names* rather than components keep this file free of React so it can be\n * asserted as data.\n */\n\nimport type { TaskActionBlockReason } from '../../data/types'\nimport type { WorkInboxPriority } from './provider'\n\nexport type WorkInboxToneClasses = {\n badge: string\n icon: string\n text: string\n}\n\nexport type WorkInboxStatusDescriptor = WorkInboxToneClasses & {\n iconName: WorkInboxIconName\n}\n\nexport type WorkInboxIconName =\n | 'Clock'\n | 'Loader'\n | 'CheckCircle2'\n | 'XCircle'\n | 'AlertTriangle'\n | 'Flame'\n | 'ArrowUp'\n | 'Minus'\n | 'ArrowDown'\n | 'Circle'\n\nconst NEUTRAL: WorkInboxToneClasses = {\n badge: 'bg-status-neutral-bg text-status-neutral-text',\n icon: 'text-status-neutral-icon',\n text: 'text-status-neutral-text',\n}\n\nconst INFO: WorkInboxToneClasses = {\n badge: 'bg-status-info-bg text-status-info-text',\n icon: 'text-status-info-icon',\n text: 'text-status-info-text',\n}\n\nconst WARNING: WorkInboxToneClasses = {\n badge: 'bg-status-warning-bg text-status-warning-text',\n icon: 'text-status-warning-icon',\n text: 'text-status-warning-text',\n}\n\nconst SUCCESS: WorkInboxToneClasses = {\n badge: 'bg-status-success-bg text-status-success-text',\n icon: 'text-status-success-icon',\n text: 'text-status-success-text',\n}\n\nconst ERROR: WorkInboxToneClasses = {\n badge: 'bg-status-error-bg text-status-error-text',\n icon: 'text-status-error-icon',\n text: 'text-status-error-text',\n}\n\nconst STATUS_DESCRIPTORS: Record<string, WorkInboxStatusDescriptor> = {\n PENDING: { ...WARNING, iconName: 'Clock' },\n IN_PROGRESS: { ...INFO, iconName: 'Loader' },\n COMPLETED: { ...SUCCESS, iconName: 'CheckCircle2' },\n CANCELLED: { ...NEUTRAL, iconName: 'XCircle' },\n ESCALATED: { ...ERROR, iconName: 'AlertTriangle' },\n}\n\n/** An unknown status from a third-party source still renders, neutrally. */\nexport function describeWorkInboxStatus(status: string): WorkInboxStatusDescriptor {\n return STATUS_DESCRIPTORS[status] ?? { ...NEUTRAL, iconName: 'Circle' }\n}\n\nconst PRIORITY_DESCRIPTORS: Record<WorkInboxPriority, WorkInboxStatusDescriptor> = {\n extreme: { ...ERROR, iconName: 'Flame' },\n high: { ...WARNING, iconName: 'ArrowUp' },\n medium: { ...INFO, iconName: 'Minus' },\n low: { ...NEUTRAL, iconName: 'ArrowDown' },\n}\n\nexport function describeWorkInboxPriority(\n priority: WorkInboxPriority | null,\n): WorkInboxStatusDescriptor | null {\n return priority ? PRIORITY_DESCRIPTORS[priority] : null\n}\n\nexport const WORK_INBOX_OVERDUE_TONE: WorkInboxStatusDescriptor = {\n ...ERROR,\n iconName: 'AlertTriangle',\n}\n\nexport type TaskActionBlockDescriptor = WorkInboxToneClasses & {\n iconName: WorkInboxIconName\n /** Flat i18n key for the sentence a human can act on. */\n messageKey: string\n /**\n * The remedy \u00A76.4 names, when there is one. `reassign` is the ONLY remedy the\n * model offers for an ownership refusal \u2014 administration widens seeing, never\n * acting, so taking the row is the supported path.\n */\n remedy: 'reassign' | null\n}\n\n/**\n * How an act refusal reads to a human (PURE).\n *\n * The reason itself is the SERVER's (`lib/task-visibility.ts`); this only says\n * which sentence and which DS tone render it, so the page never decides whether\n * an action is allowed. `unavailable` stays deliberately vague \u2014 it stands for\n * the entity-gate refusal the act routes answer as a bare 404, and widening it\n * into \"binding X blocked you\" would leak exactly what that 404 withholds.\n */\nconst TASK_ACTION_BLOCK_DESCRIPTORS: Record<TaskActionBlockReason, TaskActionBlockDescriptor> = {\n 'not-workable': {\n ...INFO,\n iconName: 'CheckCircle2',\n messageKey: 'workflows.tasks.detail.cannotComplete',\n remedy: null,\n },\n 'owned-by-another': {\n ...WARNING,\n iconName: 'AlertTriangle',\n messageKey: 'workflows.tasks.detail.blocked.ownedByAnother',\n remedy: 'reassign',\n },\n 'not-in-your-queue': {\n ...WARNING,\n iconName: 'AlertTriangle',\n messageKey: 'workflows.tasks.detail.blocked.notInYourQueue',\n remedy: 'reassign',\n },\n unowned: {\n ...WARNING,\n iconName: 'AlertTriangle',\n messageKey: 'workflows.tasks.detail.blocked.unowned',\n remedy: 'reassign',\n },\n unavailable: {\n ...INFO,\n iconName: 'AlertTriangle',\n messageKey: 'workflows.tasks.detail.blocked.unavailable',\n remedy: null,\n },\n}\n\n/** An unknown reason from a newer server still renders, non-diagnostically. */\nexport function describeTaskActionBlock(reason: string): TaskActionBlockDescriptor {\n return (\n TASK_ACTION_BLOCK_DESCRIPTORS[reason as TaskActionBlockReason] ??\n TASK_ACTION_BLOCK_DESCRIPTORS.unavailable\n )\n}\n"],
5
+ "mappings": "AAyCA,MAAM,UAAgC;AAAA,EACpC,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AACR;AAEA,MAAM,OAA6B;AAAA,EACjC,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AACR;AAEA,MAAM,UAAgC;AAAA,EACpC,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AACR;AAEA,MAAM,UAAgC;AAAA,EACpC,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AACR;AAEA,MAAM,QAA8B;AAAA,EAClC,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAM;AACR;AAEA,MAAM,qBAAgE;AAAA,EACpE,SAAS,EAAE,GAAG,SAAS,UAAU,QAAQ;AAAA,EACzC,aAAa,EAAE,GAAG,MAAM,UAAU,SAAS;AAAA,EAC3C,WAAW,EAAE,GAAG,SAAS,UAAU,eAAe;AAAA,EAClD,WAAW,EAAE,GAAG,SAAS,UAAU,UAAU;AAAA,EAC7C,WAAW,EAAE,GAAG,OAAO,UAAU,gBAAgB;AACnD;AAGO,SAAS,wBAAwB,QAA2C;AACjF,SAAO,mBAAmB,MAAM,KAAK,EAAE,GAAG,SAAS,UAAU,SAAS;AACxE;AAEA,MAAM,uBAA6E;AAAA,EACjF,SAAS,EAAE,GAAG,OAAO,UAAU,QAAQ;AAAA,EACvC,MAAM,EAAE,GAAG,SAAS,UAAU,UAAU;AAAA,EACxC,QAAQ,EAAE,GAAG,MAAM,UAAU,QAAQ;AAAA,EACrC,KAAK,EAAE,GAAG,SAAS,UAAU,YAAY;AAC3C;AAEO,SAAS,0BACd,UACkC;AAClC,SAAO,WAAW,qBAAqB,QAAQ,IAAI;AACrD;AAEO,MAAM,0BAAqD;AAAA,EAChE,GAAG;AAAA,EACH,UAAU;AACZ;AAuBA,MAAM,gCAA0F;AAAA,EAC9F,gBAAgB;AAAA,IACd,GAAG;AAAA,IACH,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ;AAAA,EACV;AAAA,EACA,oBAAoB;AAAA,IAClB,GAAG;AAAA,IACH,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ;AAAA,EACV;AAAA,EACA,qBAAqB;AAAA,IACnB,GAAG;AAAA,IACH,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ;AAAA,EACV;AAAA,EACA,SAAS;AAAA,IACP,GAAG;AAAA,IACH,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ;AAAA,EACV;AAAA,EACA,aAAa;AAAA,IACX,GAAG;AAAA,IACH,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ;AAAA,EACV;AACF;AAGO,SAAS,wBAAwB,QAA2C;AACjF,SACE,8BAA8B,MAA+B,KAC7D,8BAA8B;AAElC;",
6
+ "names": []
7
+ }
@@ -0,0 +1,118 @@
1
+ import { hasFeature } from "@open-mercato/shared/security/features";
2
+ const WORK_INBOX_PRIORITIES = ["extreme", "high", "medium", "low"];
3
+ const WORK_INBOX_TERMINAL_STATUSES = ["COMPLETED", "CANCELLED"];
4
+ const GLOBAL_WORK_INBOX_SOURCES_KEY = "__openMercatoWorkInboxSources__";
5
+ let localEntries = null;
6
+ function readGlobalEntries() {
7
+ try {
8
+ const value = globalThis[GLOBAL_WORK_INBOX_SOURCES_KEY];
9
+ return Array.isArray(value) ? value : null;
10
+ } catch {
11
+ return null;
12
+ }
13
+ }
14
+ function writeGlobalEntries(entries) {
15
+ try {
16
+ ;
17
+ globalThis[GLOBAL_WORK_INBOX_SOURCES_KEY] = entries;
18
+ } catch {
19
+ }
20
+ }
21
+ function registerWorkInboxSources(entries) {
22
+ const replacedModuleIds = new Set(entries.map((entry) => entry.moduleId));
23
+ const kept = getWorkInboxSources().filter((entry) => !replacedModuleIds.has(entry.moduleId));
24
+ const added = [];
25
+ for (const entry of entries) {
26
+ for (const provider of entry.sources) {
27
+ added.push({ moduleId: entry.moduleId, provider });
28
+ }
29
+ }
30
+ const merged = [...kept, ...added];
31
+ localEntries = merged;
32
+ writeGlobalEntries(merged);
33
+ }
34
+ function getWorkInboxSources() {
35
+ const globalEntries = readGlobalEntries();
36
+ if (globalEntries) return globalEntries;
37
+ return localEntries ?? [];
38
+ }
39
+ function clearWorkInboxSources() {
40
+ localEntries = [];
41
+ writeGlobalEntries([]);
42
+ }
43
+ function isWorkInboxSourceAdmitted(provider, admission) {
44
+ const required = provider.administrativeQueueFeature;
45
+ if (!required) return true;
46
+ if (!admission) return true;
47
+ if (admission.isSuperAdmin) return true;
48
+ return hasFeature(admission.grantedFeatures, required);
49
+ }
50
+ function selectWorkInboxSources(query, admission) {
51
+ return getWorkInboxSources().filter((entry) => {
52
+ if (query.kinds && !query.kinds.includes(entry.provider.kind)) return false;
53
+ if (query.moduleIds && !query.moduleIds.includes(entry.moduleId)) return false;
54
+ return isWorkInboxSourceAdmitted(entry.provider, admission);
55
+ });
56
+ }
57
+ function isWorkInboxOpenStatus(status) {
58
+ return !WORK_INBOX_TERMINAL_STATUSES.includes(status);
59
+ }
60
+ function deriveWorkInboxOverdue(dueDate, status, now) {
61
+ if (!dueDate) return false;
62
+ if (!isWorkInboxOpenStatus(status)) return false;
63
+ const due = dueDate instanceof Date ? dueDate : new Date(dueDate);
64
+ const dueMs = due.getTime();
65
+ if (Number.isNaN(dueMs)) return false;
66
+ return dueMs < now.getTime();
67
+ }
68
+ function normalizeWorkInboxPriority(value) {
69
+ if (typeof value !== "string") return null;
70
+ const lowered = value.toLowerCase();
71
+ return WORK_INBOX_PRIORITIES.includes(lowered) ? lowered : null;
72
+ }
73
+ const UNSET_PRIORITY_RANK = WORK_INBOX_PRIORITIES.indexOf("medium");
74
+ function priorityRank(priority) {
75
+ if (!priority) return UNSET_PRIORITY_RANK;
76
+ return WORK_INBOX_PRIORITIES.indexOf(priority);
77
+ }
78
+ function dueRank(dueDate) {
79
+ if (!dueDate) return Number.POSITIVE_INFINITY;
80
+ const parsed = Date.parse(dueDate);
81
+ return Number.isNaN(parsed) ? Number.POSITIVE_INFINITY : parsed;
82
+ }
83
+ function createdRank(createdAt) {
84
+ const parsed = Date.parse(createdAt);
85
+ return Number.isNaN(parsed) ? Number.POSITIVE_INFINITY : parsed;
86
+ }
87
+ function compareWorkInboxRows(left, right) {
88
+ const byPriority = priorityRank(left.priority) - priorityRank(right.priority);
89
+ if (byPriority !== 0) return byPriority;
90
+ const byDue = dueRank(left.dueDate) - dueRank(right.dueDate);
91
+ if (byDue !== 0) return byDue;
92
+ const byCreated = createdRank(left.createdAt) - createdRank(right.createdAt);
93
+ if (byCreated !== 0) return byCreated;
94
+ return left.id < right.id ? -1 : left.id > right.id ? 1 : 0;
95
+ }
96
+ function sortWorkInboxRows(rows) {
97
+ return [...rows].sort(compareWorkInboxRows);
98
+ }
99
+ function serializeWorkInboxRow(row) {
100
+ const { details, ...common } = row;
101
+ return { ...details, ...common };
102
+ }
103
+ export {
104
+ WORK_INBOX_PRIORITIES,
105
+ WORK_INBOX_TERMINAL_STATUSES,
106
+ clearWorkInboxSources,
107
+ compareWorkInboxRows,
108
+ deriveWorkInboxOverdue,
109
+ getWorkInboxSources,
110
+ isWorkInboxOpenStatus,
111
+ isWorkInboxSourceAdmitted,
112
+ normalizeWorkInboxPriority,
113
+ registerWorkInboxSources,
114
+ selectWorkInboxSources,
115
+ serializeWorkInboxRow,
116
+ sortWorkInboxRows
117
+ };
118
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/workflows/lib/work-inbox/provider.ts"],
4
+ "sourcesContent": ["/**\n * Work Inbox \u2014 source-provider contract and registry (spec \u00A72.3, \u00A76.3).\n *\n * The inbox is a PROJECTION, not a table: phase 1 reads existing rows through\n * providers instead of migrating anything into a new `Task` entity. Core\n * registers the `user_task` provider; `agent_orchestrator` optionally registers\n * `agent_disposition`. Nothing here imports an optional peer \u2014 a provider that\n * is not registered simply does not contribute rows, so without enterprise the\n * inbox shows workflow tasks and no error is raised anywhere.\n *\n * The registry is modelled on `@open-mercato/shared/lib/crud/enricher-registry`\n * (many modules contributing to one merged list, HMR-safe `globalThis` storage)\n * with one deliberate difference: there is no generated work-inbox registry to\n * bootstrap from, so `registerWorkInboxSources` MERGES by `moduleId` instead of\n * replacing the whole set. Each module registers its own sources from its `di.ts`\n * at module-DI load time, re-registering the same module is idempotent, and the\n * modules stay independent of each other's load order.\n */\n\nimport { hasFeature } from '@open-mercato/shared/security/features'\nimport type {\n TaskEntityHiddenMarker,\n TaskVisibilityRequestContext,\n} from '../task-visibility-request'\n\n/** Mirrors the platform's priority labels (root AGENTS.md \u2192 PR Workflow). */\nexport const WORK_INBOX_PRIORITIES = ['extreme', 'high', 'medium', 'low'] as const\n\nexport type WorkInboxPriority = (typeof WORK_INBOX_PRIORITIES)[number]\n\n/**\n * Statuses a work item is still actionable in. Terminal statuses are listed\n * instead of open ones so a provider that introduces its own vocabulary is\n * treated as open rather than silently disappearing from the queue.\n */\nexport const WORK_INBOX_TERMINAL_STATUSES = ['COMPLETED', 'CANCELLED'] as const\n\nexport type WorkInboxEntityBinding = {\n entityType: string\n entityId: string\n label?: string | null\n}\n\n/**\n * Declarative action a provider offers on its rows. Kept serializable (an id, a\n * translation key, an endpoint template and a row predicate) so the page renders\n * every provider's actions through one code path and no provider ships UI code\n * into the inbox bundle.\n */\nexport type WorkInboxAction = {\n id: string\n labelKey: string\n /** POST endpoint; `{id}` is replaced with the row id. */\n endpoint: string\n appliesTo: WorkInboxActionPredicate\n}\n\nexport type WorkInboxActionPredicate = 'claimable' | 'claimed-by-me' | 'open' | 'always'\n\nexport type WorkInboxRow = {\n id: string\n /** Provider discriminator \u2014 `user_task`, `agent_disposition`, \u2026 */\n kind: string\n moduleId: string\n title: string\n description: string | null\n status: string\n priority: WorkInboxPriority | null\n dueDate: string | null\n overdue: boolean\n createdAt: string\n updatedAt: string\n assignedTo: string | null\n assignedToRoles: string[] | null\n claimedBy: string | null\n entityTypes: string[]\n entityBindings: WorkInboxEntityBinding[]\n detailHref: string | null\n actions: WorkInboxAction[]\n /**\n * Provider-specific payload. The API spreads it UNDER the common fields, so a\n * `user_task` row on the wire stays a strict superset of what\n * `GET /api/workflows/tasks` already returned \u2014 which is what keeps the\n * enterprise \"Review proposal\" row action (it reads `row.proposalId`) working\n * against the new table.\n */\n details: Record<string, unknown>\n}\n\nexport type WorkInboxQuery = {\n kinds: string[] | null\n moduleIds: string[] | null\n entityTypes: string[] | null\n roles: string[] | null\n priorities: WorkInboxPriority[] | null\n statuses: string[] | null\n overdueOnly: boolean\n myWork: boolean\n assignedTo: string | null\n workflowInstanceId: string | null\n limit: number\n offset: number\n now: Date\n}\n\n/**\n * Caller scope every provider MUST filter on. `organizationIds === null` is the\n * wildcard scope the directory helper returns for an unrestricted operator;\n * `tenantId` is never optional (module MUST #10).\n *\n * `visibility` carries the \u00A76.4 rule's per-request inputs \u2014 the principal, the\n * tenant policy and the entity-access map \u2014 resolved ONCE by the route. It is\n * required rather than optional on purpose: a provider that forgets to apply it\n * would silently serve every row in the organization, and a compile error is the\n * only reliable way to notice that.\n */\nexport type WorkInboxScope = {\n tenantId: string\n organizationIds: string[] | null\n userId: string\n roles: string[]\n visibility: TaskVisibilityRequestContext\n}\n\n/**\n * Runtime seam. Providers resolve their own services through it rather than\n * importing them, so a provider registered by another module never drags that\n * module's internals into this one. Structural on purpose \u2014 no awilix import.\n */\nexport type WorkInboxSourceContext = {\n scope: WorkInboxScope\n resolve: <T>(name: string) => T\n /**\n * The queue feature the source being invoked declared, handed back to it so a\n * provider that serves `UserTask` rows can pass it to the \u00A76.4 predicate\n * (`TaskFacts.administrativeQueueFeature`) without importing the registry it\n * is registered in.\n */\n administrativeQueueFeature?: string | null\n}\n\nexport type WorkInboxSourceResult = {\n rows: WorkInboxRow[]\n total: number\n /**\n * Rows this source refused on entity access to a caller entitled to know they\n * are there (design \u00A73.6). Optional and additive: a source that omits it\n * reports nothing, which is what every source did before.\n *\n * It carries ids and the blocking entity type, never row content \u2014 the point\n * is that an administrator can tell \"no such task\" from \"you cannot see its\n * record\", not that they can read the record anyway.\n */\n entityHidden?: TaskEntityHiddenMarker[]\n}\n\nexport type WorkInboxSourceProvider = {\n kind: string\n moduleId: string\n /** Injection spot id the detail view renders for this kind, when any. */\n render?: string\n actions?: WorkInboxAction[]\n /**\n * ACL feature that admits a principal to this source's UNASSIGNED rows,\n * declaring \"this kind is an administrative queue, not personal work\".\n *\n * \u00A76.4 makes a row visible to whoever it belongs to, and a queue item belongs\n * to nobody: it carries no assignee, no claimant and no role queue, because\n * the module that raised it cannot know a tenant's routing policy or role\n * vocabulary. Without a declaration such a row falls back to core's own\n * administrative grant (`workflows.tasks.view_all`); with one it is admitted\n * to exactly the population that could already act on that kind of work.\n *\n * It has two consumers, and both must agree or a row is counted in one place\n * and dropped in another:\n *\n * 1. **Source admission** \u2014 a source declaring a queue feature contributes\n * nothing at all to a caller who does not hold it, so the whole kind\n * disappears rather than answering an expensive query per request.\n * 2. **The \u00A76.4 predicate** \u2014 passed back to the provider through\n * `WorkInboxSourceContext.administrativeQueueFeature` so a provider serving\n * `UserTask` rows uses it as the unassigned-queue arm instead of\n * `workflows.tasks.view_all`.\n *\n * Absent (the core `user_task` source) leaves both behaviours exactly as they\n * were: no admission gate, `workflows.tasks.view_all` as the queue feature.\n */\n administrativeQueueFeature?: string\n list: (query: WorkInboxQuery, context: WorkInboxSourceContext) => Promise<WorkInboxSourceResult>\n}\n\nexport type WorkInboxSourceEntry = {\n moduleId: string\n provider: WorkInboxSourceProvider\n}\n\nconst GLOBAL_WORK_INBOX_SOURCES_KEY = '__openMercatoWorkInboxSources__'\n\nlet localEntries: WorkInboxSourceEntry[] | null = null\n\nfunction readGlobalEntries(): WorkInboxSourceEntry[] | null {\n try {\n const value = (globalThis as Record<string, unknown>)[GLOBAL_WORK_INBOX_SOURCES_KEY]\n return Array.isArray(value) ? (value as WorkInboxSourceEntry[]) : null\n } catch {\n return null\n }\n}\n\nfunction writeGlobalEntries(entries: WorkInboxSourceEntry[]): void {\n try {\n ;(globalThis as Record<string, unknown>)[GLOBAL_WORK_INBOX_SOURCES_KEY] = entries\n } catch {\n // ignore global assignment failures\n }\n}\n\n/**\n * Register (or re-register) one module's work-inbox sources.\n *\n * Additive across modules, replacing within a module: calling it again for the\n * same `moduleId` swaps that module's providers and leaves every other module's\n * untouched. Registration order between modules is therefore irrelevant, which\n * matters because each module registers from its own `di.ts`.\n */\nexport function registerWorkInboxSources(\n entries: Array<{ moduleId: string; sources: WorkInboxSourceProvider[] }>,\n): void {\n const replacedModuleIds = new Set(entries.map((entry) => entry.moduleId))\n const kept = getWorkInboxSources().filter((entry) => !replacedModuleIds.has(entry.moduleId))\n const added: WorkInboxSourceEntry[] = []\n for (const entry of entries) {\n for (const provider of entry.sources) {\n added.push({ moduleId: entry.moduleId, provider })\n }\n }\n const merged = [...kept, ...added]\n localEntries = merged\n writeGlobalEntries(merged)\n}\n\nexport function getWorkInboxSources(): WorkInboxSourceEntry[] {\n const globalEntries = readGlobalEntries()\n if (globalEntries) return globalEntries\n return localEntries ?? []\n}\n\n/** Test seam \u2014 drops every registration so a suite starts from a known set. */\nexport function clearWorkInboxSources(): void {\n localEntries = []\n writeGlobalEntries([])\n}\n\n/**\n * The caller facts source admission is decided from \u2014 the same principal the\n * \u00A76.4 predicate reads, narrowed to what this decision needs.\n */\nexport type WorkInboxSourceAdmission = {\n grantedFeatures: readonly string[]\n isSuperAdmin: boolean\n}\n\n/**\n * Whether this caller is admitted to an administrative-queue source at all.\n *\n * `hasFeature` rather than an array membership test, because a tenant `admin`\n * holds `agent_orchestrator.*` and not the concrete id \u2014 comparing raw strings\n * would lock every real administrator out of the queue the grant exists for.\n * A source that declares no queue feature is open to everyone the rows\n * themselves admit.\n */\nexport function isWorkInboxSourceAdmitted(\n provider: WorkInboxSourceProvider,\n admission: WorkInboxSourceAdmission | null | undefined,\n): boolean {\n const required = provider.administrativeQueueFeature\n if (!required) return true\n if (!admission) return true\n if (admission.isSuperAdmin) return true\n return hasFeature(admission.grantedFeatures, required)\n}\n\n/**\n * Providers that can contribute to this query. Kind and module narrowing is\n * answered here rather than inside each provider so a filtered request does not\n * pay for a query per excluded source.\n *\n * `admission` is optional so every existing caller keeps its behaviour; when it\n * is supplied, a source declaring an `administrativeQueueFeature` the caller\n * does not hold is dropped before it is ever asked for rows.\n */\nexport function selectWorkInboxSources(\n query: WorkInboxQuery,\n admission?: WorkInboxSourceAdmission | null,\n): WorkInboxSourceEntry[] {\n return getWorkInboxSources().filter((entry) => {\n if (query.kinds && !query.kinds.includes(entry.provider.kind)) return false\n if (query.moduleIds && !query.moduleIds.includes(entry.moduleId)) return false\n return isWorkInboxSourceAdmitted(entry.provider, admission)\n })\n}\n\nexport function isWorkInboxOpenStatus(status: string): boolean {\n return !(WORK_INBOX_TERMINAL_STATUSES as readonly string[]).includes(status)\n}\n\n/**\n * Overdue is DERIVED, never stored: a due date in the past on an item nobody has\n * finished yet. Terminal items are never overdue however late they were closed.\n */\nexport function deriveWorkInboxOverdue(\n dueDate: Date | string | null | undefined,\n status: string,\n now: Date,\n): boolean {\n if (!dueDate) return false\n if (!isWorkInboxOpenStatus(status)) return false\n const due = dueDate instanceof Date ? dueDate : new Date(dueDate)\n const dueMs = due.getTime()\n if (Number.isNaN(dueMs)) return false\n return dueMs < now.getTime()\n}\n\nexport function normalizeWorkInboxPriority(value: unknown): WorkInboxPriority | null {\n if (typeof value !== 'string') return null\n const lowered = value.toLowerCase()\n return (WORK_INBOX_PRIORITIES as readonly string[]).includes(lowered)\n ? (lowered as WorkInboxPriority)\n : null\n}\n\n/**\n * Unprioritized work sorts with `medium`, not last: an item nobody labelled is\n * ordinary work, and sinking it below every explicit `low` would bury the whole\n * pre-Phase-4 backlog under a handful of deliberately deprioritized rows.\n */\nconst UNSET_PRIORITY_RANK = WORK_INBOX_PRIORITIES.indexOf('medium')\n\nfunction priorityRank(priority: WorkInboxPriority | null): number {\n if (!priority) return UNSET_PRIORITY_RANK\n return WORK_INBOX_PRIORITIES.indexOf(priority)\n}\n\nfunction dueRank(dueDate: string | null): number {\n if (!dueDate) return Number.POSITIVE_INFINITY\n const parsed = Date.parse(dueDate)\n return Number.isNaN(parsed) ? Number.POSITIVE_INFINITY : parsed\n}\n\nfunction createdRank(createdAt: string): number {\n const parsed = Date.parse(createdAt)\n return Number.isNaN(parsed) ? Number.POSITIVE_INFINITY : parsed\n}\n\n/**\n * Canonical inbox ordering (spec \u00A76.2): priority first, then the nearest due\n * date, then oldest first. Every tier is compared explicitly and the row id\n * breaks the final tie, so the order is total and stable across providers.\n */\nexport function compareWorkInboxRows(left: WorkInboxRow, right: WorkInboxRow): number {\n const byPriority = priorityRank(left.priority) - priorityRank(right.priority)\n if (byPriority !== 0) return byPriority\n\n const byDue = dueRank(left.dueDate) - dueRank(right.dueDate)\n if (byDue !== 0) return byDue\n\n const byCreated = createdRank(left.createdAt) - createdRank(right.createdAt)\n if (byCreated !== 0) return byCreated\n\n return left.id < right.id ? -1 : left.id > right.id ? 1 : 0\n}\n\nexport function sortWorkInboxRows(rows: WorkInboxRow[]): WorkInboxRow[] {\n return [...rows].sort(compareWorkInboxRows)\n}\n\n/**\n * Flatten a row for the wire: the provider payload first, the common projection\n * on top. Spreading `details` UNDER the common fields is what makes a\n * `user_task` row a strict superset of the row `GET /api/workflows/tasks`\n * already returns \u2014 the enterprise \"Review proposal\" row action reads\n * `row.proposalId`, which lives only in the provider payload, and the common\n * fields still win wherever both define a key.\n */\nexport type WorkInboxWireRow = Omit<WorkInboxRow, 'details'> & Record<string, unknown>\n\nexport function serializeWorkInboxRow(row: WorkInboxRow): WorkInboxWireRow {\n const { details, ...common } = row\n return { ...details, ...common }\n}\n"],
5
+ "mappings": "AAmBA,SAAS,kBAAkB;AAOpB,MAAM,wBAAwB,CAAC,WAAW,QAAQ,UAAU,KAAK;AASjE,MAAM,+BAA+B,CAAC,aAAa,WAAW;AAiKrE,MAAM,gCAAgC;AAEtC,IAAI,eAA8C;AAElD,SAAS,oBAAmD;AAC1D,MAAI;AACF,UAAM,QAAS,WAAuC,6BAA6B;AACnF,WAAO,MAAM,QAAQ,KAAK,IAAK,QAAmC;AAAA,EACpE,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,mBAAmB,SAAuC;AACjE,MAAI;AACF;AAAC,IAAC,WAAuC,6BAA6B,IAAI;AAAA,EAC5E,QAAQ;AAAA,EAER;AACF;AAUO,SAAS,yBACd,SACM;AACN,QAAM,oBAAoB,IAAI,IAAI,QAAQ,IAAI,CAAC,UAAU,MAAM,QAAQ,CAAC;AACxE,QAAM,OAAO,oBAAoB,EAAE,OAAO,CAAC,UAAU,CAAC,kBAAkB,IAAI,MAAM,QAAQ,CAAC;AAC3F,QAAM,QAAgC,CAAC;AACvC,aAAW,SAAS,SAAS;AAC3B,eAAW,YAAY,MAAM,SAAS;AACpC,YAAM,KAAK,EAAE,UAAU,MAAM,UAAU,SAAS,CAAC;AAAA,IACnD;AAAA,EACF;AACA,QAAM,SAAS,CAAC,GAAG,MAAM,GAAG,KAAK;AACjC,iBAAe;AACf,qBAAmB,MAAM;AAC3B;AAEO,SAAS,sBAA8C;AAC5D,QAAM,gBAAgB,kBAAkB;AACxC,MAAI,cAAe,QAAO;AAC1B,SAAO,gBAAgB,CAAC;AAC1B;AAGO,SAAS,wBAA8B;AAC5C,iBAAe,CAAC;AAChB,qBAAmB,CAAC,CAAC;AACvB;AAoBO,SAAS,0BACd,UACA,WACS;AACT,QAAM,WAAW,SAAS;AAC1B,MAAI,CAAC,SAAU,QAAO;AACtB,MAAI,CAAC,UAAW,QAAO;AACvB,MAAI,UAAU,aAAc,QAAO;AACnC,SAAO,WAAW,UAAU,iBAAiB,QAAQ;AACvD;AAWO,SAAS,uBACd,OACA,WACwB;AACxB,SAAO,oBAAoB,EAAE,OAAO,CAAC,UAAU;AAC7C,QAAI,MAAM,SAAS,CAAC,MAAM,MAAM,SAAS,MAAM,SAAS,IAAI,EAAG,QAAO;AACtE,QAAI,MAAM,aAAa,CAAC,MAAM,UAAU,SAAS,MAAM,QAAQ,EAAG,QAAO;AACzE,WAAO,0BAA0B,MAAM,UAAU,SAAS;AAAA,EAC5D,CAAC;AACH;AAEO,SAAS,sBAAsB,QAAyB;AAC7D,SAAO,CAAE,6BAAmD,SAAS,MAAM;AAC7E;AAMO,SAAS,uBACd,SACA,QACA,KACS;AACT,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,CAAC,sBAAsB,MAAM,EAAG,QAAO;AAC3C,QAAM,MAAM,mBAAmB,OAAO,UAAU,IAAI,KAAK,OAAO;AAChE,QAAM,QAAQ,IAAI,QAAQ;AAC1B,MAAI,OAAO,MAAM,KAAK,EAAG,QAAO;AAChC,SAAO,QAAQ,IAAI,QAAQ;AAC7B;AAEO,SAAS,2BAA2B,OAA0C;AACnF,MAAI,OAAO,UAAU,SAAU,QAAO;AACtC,QAAM,UAAU,MAAM,YAAY;AAClC,SAAQ,sBAA4C,SAAS,OAAO,IAC/D,UACD;AACN;AAOA,MAAM,sBAAsB,sBAAsB,QAAQ,QAAQ;AAElE,SAAS,aAAa,UAA4C;AAChE,MAAI,CAAC,SAAU,QAAO;AACtB,SAAO,sBAAsB,QAAQ,QAAQ;AAC/C;AAEA,SAAS,QAAQ,SAAgC;AAC/C,MAAI,CAAC,QAAS,QAAO,OAAO;AAC5B,QAAM,SAAS,KAAK,MAAM,OAAO;AACjC,SAAO,OAAO,MAAM,MAAM,IAAI,OAAO,oBAAoB;AAC3D;AAEA,SAAS,YAAY,WAA2B;AAC9C,QAAM,SAAS,KAAK,MAAM,SAAS;AACnC,SAAO,OAAO,MAAM,MAAM,IAAI,OAAO,oBAAoB;AAC3D;AAOO,SAAS,qBAAqB,MAAoB,OAA6B;AACpF,QAAM,aAAa,aAAa,KAAK,QAAQ,IAAI,aAAa,MAAM,QAAQ;AAC5E,MAAI,eAAe,EAAG,QAAO;AAE7B,QAAM,QAAQ,QAAQ,KAAK,OAAO,IAAI,QAAQ,MAAM,OAAO;AAC3D,MAAI,UAAU,EAAG,QAAO;AAExB,QAAM,YAAY,YAAY,KAAK,SAAS,IAAI,YAAY,MAAM,SAAS;AAC3E,MAAI,cAAc,EAAG,QAAO;AAE5B,SAAO,KAAK,KAAK,MAAM,KAAK,KAAK,KAAK,KAAK,MAAM,KAAK,IAAI;AAC5D;AAEO,SAAS,kBAAkB,MAAsC;AACtE,SAAO,CAAC,GAAG,IAAI,EAAE,KAAK,oBAAoB;AAC5C;AAYO,SAAS,sBAAsB,KAAqC;AACzE,QAAM,EAAE,SAAS,GAAG,OAAO,IAAI;AAC/B,SAAO,EAAE,GAAG,SAAS,GAAG,OAAO;AACjC;",
6
+ "names": []
7
+ }
@@ -0,0 +1,70 @@
1
+ import { parseBooleanWithDefault } from "@open-mercato/shared/lib/boolean";
2
+ import { parseNumberWithDefault } from "@open-mercato/shared/lib/number";
3
+ import { parseCommaSeparatedList, trimToUndefined } from "@open-mercato/shared/lib/string";
4
+ import { normalizeWorkInboxPriority } from "./provider.js";
5
+ const WORK_INBOX_DEFAULT_LIMIT = 50;
6
+ const WORK_INBOX_MAX_LIMIT = 100;
7
+ function listOrNull(raw) {
8
+ const values = parseCommaSeparatedList(raw);
9
+ return values.length > 0 ? values : null;
10
+ }
11
+ function prioritiesOrNull(raw) {
12
+ const values = parseCommaSeparatedList(raw).map(normalizeWorkInboxPriority).filter((value) => value !== null);
13
+ return values.length > 0 ? values : null;
14
+ }
15
+ const WORK_INBOX_TEXT_FILTERS = [
16
+ "kind",
17
+ "module",
18
+ "entityType",
19
+ "role",
20
+ "priority",
21
+ "status"
22
+ ];
23
+ const WORK_INBOX_FLAG_FILTERS = ["overdue", "myWork"];
24
+ function buildWorkInboxListQueryParams(filters, pagination) {
25
+ const params = new URLSearchParams();
26
+ params.set("limit", String(Math.min(pagination.limit, WORK_INBOX_MAX_LIMIT)));
27
+ params.set("offset", String(pagination.offset));
28
+ for (const key of WORK_INBOX_TEXT_FILTERS) {
29
+ const value = filters[key];
30
+ if (typeof value === "string" && value.length > 0) params.set(key, value);
31
+ }
32
+ for (const key of WORK_INBOX_FLAG_FILTERS) {
33
+ if (filters[key] === "true") params.set(key, "true");
34
+ }
35
+ return params;
36
+ }
37
+ function parseWorkInboxQuery(searchParams, now) {
38
+ const limit = Math.min(
39
+ parseNumberWithDefault(searchParams.get("limit"), WORK_INBOX_DEFAULT_LIMIT, {
40
+ min: 1,
41
+ integer: true
42
+ }),
43
+ WORK_INBOX_MAX_LIMIT
44
+ );
45
+ const myWork = parseBooleanWithDefault(searchParams.get("myWork"), false) || parseBooleanWithDefault(searchParams.get("myTasks"), false);
46
+ return {
47
+ kinds: listOrNull(searchParams.get("kind")),
48
+ moduleIds: listOrNull(searchParams.get("module")),
49
+ entityTypes: listOrNull(searchParams.get("entityType")),
50
+ roles: listOrNull(searchParams.get("role")),
51
+ priorities: prioritiesOrNull(searchParams.get("priority")),
52
+ statuses: listOrNull(searchParams.get("status")),
53
+ overdueOnly: parseBooleanWithDefault(searchParams.get("overdue"), false),
54
+ myWork,
55
+ assignedTo: trimToUndefined(searchParams.get("assignedTo")) ?? null,
56
+ workflowInstanceId: trimToUndefined(searchParams.get("workflowInstanceId")) ?? null,
57
+ limit,
58
+ offset: parseNumberWithDefault(searchParams.get("offset"), 0, { min: 0, integer: true }),
59
+ now
60
+ };
61
+ }
62
+ export {
63
+ WORK_INBOX_DEFAULT_LIMIT,
64
+ WORK_INBOX_FLAG_FILTERS,
65
+ WORK_INBOX_MAX_LIMIT,
66
+ WORK_INBOX_TEXT_FILTERS,
67
+ buildWorkInboxListQueryParams,
68
+ parseWorkInboxQuery
69
+ };
70
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/workflows/lib/work-inbox/query.ts"],
4
+ "sourcesContent": ["/**\n * Work Inbox \u2014 query-string parsing (PURE).\n *\n * Kept out of the route handler so every filter, the limit clamp and the\n * priority vocabulary can be asserted without a request, a container or a\n * database. The route only supplies the caller scope.\n */\n\nimport { parseBooleanWithDefault } from '@open-mercato/shared/lib/boolean'\nimport { parseNumberWithDefault } from '@open-mercato/shared/lib/number'\nimport { parseCommaSeparatedList, trimToUndefined } from '@open-mercato/shared/lib/string'\nimport { normalizeWorkInboxPriority } from './provider'\nimport type { WorkInboxPriority, WorkInboxQuery } from './provider'\n\nexport const WORK_INBOX_DEFAULT_LIMIT = 50\n\n/** Project rule: `pageSize` never exceeds 100 (root AGENTS.md \u2192 UI & HTTP). */\nexport const WORK_INBOX_MAX_LIMIT = 100\n\nfunction listOrNull(raw: string | null): string[] | null {\n const values = parseCommaSeparatedList(raw)\n return values.length > 0 ? values : null\n}\n\nfunction prioritiesOrNull(raw: string | null): WorkInboxPriority[] | null {\n const values = parseCommaSeparatedList(raw)\n .map(normalizeWorkInboxPriority)\n .filter((value): value is WorkInboxPriority => value !== null)\n return values.length > 0 ? values : null\n}\n\n/**\n * `myWork` also answers to `myTasks`, the name the shipped task inbox has always\n * sent, so a bookmarked filter keeps meaning what it meant.\n */\n/** Filter ids the inbox page offers, in the order they appear in the filter bar. */\nexport const WORK_INBOX_TEXT_FILTERS = [\n 'kind',\n 'module',\n 'entityType',\n 'role',\n 'priority',\n 'status',\n] as const\n\nexport const WORK_INBOX_FLAG_FILTERS = ['overdue', 'myWork'] as const\n\nexport type WorkInboxFilterValues = Record<string, unknown>\n\n/**\n * Client \u2192 server filter forwarding, kept outside the page for the same reason\n * `lib/task-list-query.ts` is: forwarding only a subset is silent, and the view\n * then claims a narrowing it never asked the server for.\n */\nexport function buildWorkInboxListQueryParams(\n filters: WorkInboxFilterValues,\n pagination: { limit: number; offset: number },\n): URLSearchParams {\n const params = new URLSearchParams()\n params.set('limit', String(Math.min(pagination.limit, WORK_INBOX_MAX_LIMIT)))\n params.set('offset', String(pagination.offset))\n\n for (const key of WORK_INBOX_TEXT_FILTERS) {\n const value = filters[key]\n if (typeof value === 'string' && value.length > 0) params.set(key, value)\n }\n\n for (const key of WORK_INBOX_FLAG_FILTERS) {\n if (filters[key] === 'true') params.set(key, 'true')\n }\n\n return params\n}\n\nexport function parseWorkInboxQuery(searchParams: URLSearchParams, now: Date): WorkInboxQuery {\n const limit = Math.min(\n parseNumberWithDefault(searchParams.get('limit'), WORK_INBOX_DEFAULT_LIMIT, {\n min: 1,\n integer: true,\n }),\n WORK_INBOX_MAX_LIMIT,\n )\n\n const myWork =\n parseBooleanWithDefault(searchParams.get('myWork'), false) ||\n parseBooleanWithDefault(searchParams.get('myTasks'), false)\n\n return {\n kinds: listOrNull(searchParams.get('kind')),\n moduleIds: listOrNull(searchParams.get('module')),\n entityTypes: listOrNull(searchParams.get('entityType')),\n roles: listOrNull(searchParams.get('role')),\n priorities: prioritiesOrNull(searchParams.get('priority')),\n statuses: listOrNull(searchParams.get('status')),\n overdueOnly: parseBooleanWithDefault(searchParams.get('overdue'), false),\n myWork,\n assignedTo: trimToUndefined(searchParams.get('assignedTo')) ?? null,\n workflowInstanceId: trimToUndefined(searchParams.get('workflowInstanceId')) ?? null,\n limit,\n offset: parseNumberWithDefault(searchParams.get('offset'), 0, { min: 0, integer: true }),\n now,\n }\n}\n"],
5
+ "mappings": "AAQA,SAAS,+BAA+B;AACxC,SAAS,8BAA8B;AACvC,SAAS,yBAAyB,uBAAuB;AACzD,SAAS,kCAAkC;AAGpC,MAAM,2BAA2B;AAGjC,MAAM,uBAAuB;AAEpC,SAAS,WAAW,KAAqC;AACvD,QAAM,SAAS,wBAAwB,GAAG;AAC1C,SAAO,OAAO,SAAS,IAAI,SAAS;AACtC;AAEA,SAAS,iBAAiB,KAAgD;AACxE,QAAM,SAAS,wBAAwB,GAAG,EACvC,IAAI,0BAA0B,EAC9B,OAAO,CAAC,UAAsC,UAAU,IAAI;AAC/D,SAAO,OAAO,SAAS,IAAI,SAAS;AACtC;AAOO,MAAM,0BAA0B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,MAAM,0BAA0B,CAAC,WAAW,QAAQ;AASpD,SAAS,8BACd,SACA,YACiB;AACjB,QAAM,SAAS,IAAI,gBAAgB;AACnC,SAAO,IAAI,SAAS,OAAO,KAAK,IAAI,WAAW,OAAO,oBAAoB,CAAC,CAAC;AAC5E,SAAO,IAAI,UAAU,OAAO,WAAW,MAAM,CAAC;AAE9C,aAAW,OAAO,yBAAyB;AACzC,UAAM,QAAQ,QAAQ,GAAG;AACzB,QAAI,OAAO,UAAU,YAAY,MAAM,SAAS,EAAG,QAAO,IAAI,KAAK,KAAK;AAAA,EAC1E;AAEA,aAAW,OAAO,yBAAyB;AACzC,QAAI,QAAQ,GAAG,MAAM,OAAQ,QAAO,IAAI,KAAK,MAAM;AAAA,EACrD;AAEA,SAAO;AACT;AAEO,SAAS,oBAAoB,cAA+B,KAA2B;AAC5F,QAAM,QAAQ,KAAK;AAAA,IACjB,uBAAuB,aAAa,IAAI,OAAO,GAAG,0BAA0B;AAAA,MAC1E,KAAK;AAAA,MACL,SAAS;AAAA,IACX,CAAC;AAAA,IACD;AAAA,EACF;AAEA,QAAM,SACJ,wBAAwB,aAAa,IAAI,QAAQ,GAAG,KAAK,KACzD,wBAAwB,aAAa,IAAI,SAAS,GAAG,KAAK;AAE5D,SAAO;AAAA,IACL,OAAO,WAAW,aAAa,IAAI,MAAM,CAAC;AAAA,IAC1C,WAAW,WAAW,aAAa,IAAI,QAAQ,CAAC;AAAA,IAChD,aAAa,WAAW,aAAa,IAAI,YAAY,CAAC;AAAA,IACtD,OAAO,WAAW,aAAa,IAAI,MAAM,CAAC;AAAA,IAC1C,YAAY,iBAAiB,aAAa,IAAI,UAAU,CAAC;AAAA,IACzD,UAAU,WAAW,aAAa,IAAI,QAAQ,CAAC;AAAA,IAC/C,aAAa,wBAAwB,aAAa,IAAI,SAAS,GAAG,KAAK;AAAA,IACvE;AAAA,IACA,YAAY,gBAAgB,aAAa,IAAI,YAAY,CAAC,KAAK;AAAA,IAC/D,oBAAoB,gBAAgB,aAAa,IAAI,oBAAoB,CAAC,KAAK;AAAA,IAC/E;AAAA,IACA,QAAQ,uBAAuB,aAAa,IAAI,QAAQ,GAAG,GAAG,EAAE,KAAK,GAAG,SAAS,KAAK,CAAC;AAAA,IACvF;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,56 @@
1
+ import { createLogger } from "@open-mercato/shared/lib/logger";
2
+ import {
3
+ selectWorkInboxSources,
4
+ sortWorkInboxRows
5
+ } from "./provider.js";
6
+ const logger = createLogger("workflows");
7
+ async function listWorkInbox(query, context) {
8
+ const entries = selectWorkInboxSources(query, context.scope.visibility.principal);
9
+ const collected = [];
10
+ const entityHidden = [];
11
+ const kinds = [];
12
+ const degradedKinds = [];
13
+ let total = 0;
14
+ for (const entry of entries) {
15
+ try {
16
+ const result = await entry.provider.list(query, {
17
+ ...context,
18
+ administrativeQueueFeature: entry.provider.administrativeQueueFeature ?? null
19
+ });
20
+ collected.push(...result.rows);
21
+ if (result.entityHidden) entityHidden.push(...result.entityHidden);
22
+ total += result.total;
23
+ kinds.push(entry.provider.kind);
24
+ } catch (error) {
25
+ degradedKinds.push(entry.provider.kind);
26
+ logger.error("Work inbox source failed", {
27
+ component: "work-inbox",
28
+ moduleId: entry.moduleId,
29
+ kind: entry.provider.kind,
30
+ err: error
31
+ });
32
+ }
33
+ }
34
+ const ordered = sortWorkInboxRows(collected);
35
+ return {
36
+ rows: ordered.slice(query.offset, query.offset + query.limit),
37
+ total,
38
+ // NOT sliced with the page: a marker is a diagnosis about the whole result,
39
+ // and paging it would make an administrator hunt for the explanation of a
40
+ // gap they can already see.
41
+ entityHidden,
42
+ kinds,
43
+ degradedKinds
44
+ };
45
+ }
46
+ async function listClaimableWorkInbox(query, context) {
47
+ const result = await listWorkInbox(query, context);
48
+ return result.rows.filter(
49
+ (row) => row.status === "PENDING" && !row.assignedTo && !row.claimedBy && Array.isArray(row.assignedToRoles) && row.assignedToRoles.length > 0
50
+ );
51
+ }
52
+ export {
53
+ listClaimableWorkInbox,
54
+ listWorkInbox
55
+ };
56
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/workflows/lib/work-inbox/service.ts"],
4
+ "sourcesContent": ["/**\n * Work Inbox \u2014 the `workInboxService` DI implementation (BC \u00A79: new DI keys are\n * free to add).\n *\n * It merges every registered source into one queue. A source that throws is\n * logged and contributes nothing rather than failing the whole inbox: one\n * module's outage must not hide another module's work \u2014 the same fail-soft\n * stance the response-enricher registry takes.\n */\n\nimport { createLogger } from '@open-mercato/shared/lib/logger'\nimport {\n selectWorkInboxSources,\n sortWorkInboxRows,\n} from './provider'\nimport type {\n WorkInboxQuery,\n WorkInboxRow,\n WorkInboxSourceContext,\n} from './provider'\nimport type { TaskEntityHiddenMarker } from '../task-visibility-request'\n\nconst logger = createLogger('workflows')\n\nexport type WorkInboxListResult = {\n rows: WorkInboxRow[]\n total: number\n /** Entity-gated rows, merged across sources \u2014 see `WorkInboxSourceResult`. */\n entityHidden: TaskEntityHiddenMarker[]\n /** Kinds that actually answered \u2014 the UI offers exactly these as filters. */\n kinds: string[]\n /** Kinds whose provider failed, so the caller can say the view is partial. */\n degradedKinds: string[]\n}\n\n/**\n * Merge, sort, then page.\n *\n * Each source is asked for `offset + limit` rows and reports its own true\n * total; the merged window is ordered with the canonical comparator and sliced.\n * With one source that is exactly a normal page. With several it is the honest\n * phase-1 read-model behavior \u2014 a cross-source ordered index needs the `Task`\n * entity that resolved question #1 defers.\n */\nexport async function listWorkInbox(\n query: WorkInboxQuery,\n context: WorkInboxSourceContext,\n): Promise<WorkInboxListResult> {\n // Administrative-queue sources are dropped before they are asked for rows: a\n // caller without the declared feature must not pay for a query whose every row\n // the rule would then refuse.\n const entries = selectWorkInboxSources(query, context.scope.visibility.principal)\n\n const collected: WorkInboxRow[] = []\n const entityHidden: TaskEntityHiddenMarker[] = []\n const kinds: string[] = []\n const degradedKinds: string[] = []\n let total = 0\n\n for (const entry of entries) {\n try {\n // Each source is handed its OWN declaration, so a provider serving\n // `UserTask` rows applies its queue feature as the unassigned-queue arm\n // without importing the registry it is registered in.\n const result = await entry.provider.list(query, {\n ...context,\n administrativeQueueFeature: entry.provider.administrativeQueueFeature ?? null,\n })\n collected.push(...result.rows)\n if (result.entityHidden) entityHidden.push(...result.entityHidden)\n total += result.total\n kinds.push(entry.provider.kind)\n } catch (error) {\n degradedKinds.push(entry.provider.kind)\n logger.error('Work inbox source failed', {\n component: 'work-inbox',\n moduleId: entry.moduleId,\n kind: entry.provider.kind,\n err: error,\n })\n }\n }\n\n const ordered = sortWorkInboxRows(collected)\n\n return {\n rows: ordered.slice(query.offset, query.offset + query.limit),\n total,\n // NOT sliced with the page: a marker is a diagnosis about the whole result,\n // and paging it would make an administrator hunt for the explanation of a\n // gap they can already see.\n entityHidden,\n kinds,\n degradedKinds,\n }\n}\n\n/**\n * Claimable candidates for the caller, in inbox order \u2014 the queue the\n * claim-next affordance walks. Deliberately a read: the actual claim is a\n * compare-and-set inside `taskHandler`, so a candidate list that is already\n * stale by the time it is used is expected and safe.\n */\nexport async function listClaimableWorkInbox(\n query: WorkInboxQuery,\n context: WorkInboxSourceContext,\n): Promise<WorkInboxRow[]> {\n const result = await listWorkInbox(query, context)\n return result.rows.filter(\n (row) =>\n row.status === 'PENDING' &&\n !row.assignedTo &&\n !row.claimedBy &&\n Array.isArray(row.assignedToRoles) &&\n row.assignedToRoles.length > 0,\n )\n}\n\nexport type WorkInboxService = {\n listWorkInbox: typeof listWorkInbox\n listClaimableWorkInbox: typeof listClaimableWorkInbox\n}\n"],
5
+ "mappings": "AAUA,SAAS,oBAAoB;AAC7B;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAQP,MAAM,SAAS,aAAa,WAAW;AAsBvC,eAAsB,cACpB,OACA,SAC8B;AAI9B,QAAM,UAAU,uBAAuB,OAAO,QAAQ,MAAM,WAAW,SAAS;AAEhF,QAAM,YAA4B,CAAC;AACnC,QAAM,eAAyC,CAAC;AAChD,QAAM,QAAkB,CAAC;AACzB,QAAM,gBAA0B,CAAC;AACjC,MAAI,QAAQ;AAEZ,aAAW,SAAS,SAAS;AAC3B,QAAI;AAIF,YAAM,SAAS,MAAM,MAAM,SAAS,KAAK,OAAO;AAAA,QAC9C,GAAG;AAAA,QACH,4BAA4B,MAAM,SAAS,8BAA8B;AAAA,MAC3E,CAAC;AACD,gBAAU,KAAK,GAAG,OAAO,IAAI;AAC7B,UAAI,OAAO,aAAc,cAAa,KAAK,GAAG,OAAO,YAAY;AACjE,eAAS,OAAO;AAChB,YAAM,KAAK,MAAM,SAAS,IAAI;AAAA,IAChC,SAAS,OAAO;AACd,oBAAc,KAAK,MAAM,SAAS,IAAI;AACtC,aAAO,MAAM,4BAA4B;AAAA,QACvC,WAAW;AAAA,QACX,UAAU,MAAM;AAAA,QAChB,MAAM,MAAM,SAAS;AAAA,QACrB,KAAK;AAAA,MACP,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,UAAU,kBAAkB,SAAS;AAE3C,SAAO;AAAA,IACL,MAAM,QAAQ,MAAM,MAAM,QAAQ,MAAM,SAAS,MAAM,KAAK;AAAA,IAC5D;AAAA;AAAA;AAAA;AAAA,IAIA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAQA,eAAsB,uBACpB,OACA,SACyB;AACzB,QAAM,SAAS,MAAM,cAAc,OAAO,OAAO;AACjD,SAAO,OAAO,KAAK;AAAA,IACjB,CAAC,QACC,IAAI,WAAW,aACf,CAAC,IAAI,cACL,CAAC,IAAI,aACL,MAAM,QAAQ,IAAI,eAAe,KACjC,IAAI,gBAAgB,SAAS;AAAA,EACjC;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,149 @@
1
+ import { UserTask } from "../../data/entities.js";
2
+ import { serializeUserTask, USER_TASK_INBOX_KIND } from "../../api/tasks/serialize.js";
3
+ import {
4
+ WORK_INBOX_TERMINAL_STATUSES,
5
+ deriveWorkInboxOverdue,
6
+ normalizeWorkInboxPriority
7
+ } from "./provider.js";
8
+ import {
9
+ buildTaskVisibilityRequestConditions,
10
+ partitionTaskPage
11
+ } from "../task-visibility-request.js";
12
+ const WORKFLOWS_MODULE_ID = "workflows";
13
+ const USER_TASK_WORK_INBOX_ACTIONS = [
14
+ {
15
+ id: "claim",
16
+ labelKey: "workflows.tasks.actions.claim",
17
+ endpoint: "/api/workflows/tasks/{id}/claim",
18
+ appliesTo: "claimable"
19
+ },
20
+ {
21
+ id: "unclaim",
22
+ labelKey: "workflows.tasks.actions.unclaim",
23
+ endpoint: "/api/workflows/tasks/{id}/unclaim",
24
+ appliesTo: "claimed-by-me"
25
+ }
26
+ ];
27
+ function asBindings(value) {
28
+ if (!Array.isArray(value)) return [];
29
+ const bindings = [];
30
+ for (const item of value) {
31
+ if (!item || typeof item !== "object" || Array.isArray(item)) continue;
32
+ const record = item;
33
+ const entityType = record.entityType;
34
+ const entityId = record.entityId;
35
+ if (typeof entityType !== "string" || typeof entityId !== "string") continue;
36
+ const label = typeof record.label === "string" ? record.label : null;
37
+ bindings.push({ entityType, entityId, label });
38
+ }
39
+ return bindings;
40
+ }
41
+ function buildUserTaskWorkInboxWhere(query, scope, options = {}) {
42
+ const conditions = [];
43
+ if (query.statuses && query.statuses.length > 0) {
44
+ conditions.push({ status: { $in: query.statuses } });
45
+ }
46
+ if (query.overdueOnly) {
47
+ conditions.push({ dueDate: { $lt: query.now } });
48
+ conditions.push({ status: { $nin: [...WORK_INBOX_TERMINAL_STATUSES] } });
49
+ }
50
+ if (query.assignedTo) {
51
+ conditions.push({ assignedTo: query.assignedTo });
52
+ }
53
+ if (query.workflowInstanceId) {
54
+ conditions.push({ workflowInstanceId: query.workflowInstanceId });
55
+ }
56
+ if (query.priorities && query.priorities.length > 0) {
57
+ conditions.push({ priority: { $in: query.priorities } });
58
+ }
59
+ if (query.roles && query.roles.length > 0) {
60
+ conditions.push({ assignedToRoles: { $overlap: query.roles } });
61
+ }
62
+ if (query.entityTypes && query.entityTypes.length > 0) {
63
+ conditions.push({
64
+ $or: query.entityTypes.map((entityType) => ({
65
+ entityBindings: { $contains: [{ entityType }] }
66
+ }))
67
+ });
68
+ }
69
+ if (query.myWork) {
70
+ conditions.push({
71
+ $or: [
72
+ { assignedTo: scope.userId },
73
+ { claimedBy: scope.userId },
74
+ { assignedToRoles: { $overlap: scope.roles } }
75
+ ]
76
+ });
77
+ }
78
+ conditions.push(
79
+ ...buildTaskVisibilityRequestConditions(scope.visibility, {
80
+ administrativeQueueFeature: options.administrativeQueueFeature ?? null
81
+ })
82
+ );
83
+ const where = { tenantId: scope.tenantId };
84
+ if (scope.organizationIds) {
85
+ where.organizationId = { $in: scope.organizationIds };
86
+ }
87
+ if (conditions.length > 0) {
88
+ where.$and = conditions;
89
+ }
90
+ return where;
91
+ }
92
+ function toUserTaskWorkInboxRow(task, now) {
93
+ const details = serializeUserTask(task);
94
+ const bindings = asBindings(details.entityBindings);
95
+ return {
96
+ id: details.id,
97
+ kind: USER_TASK_INBOX_KIND,
98
+ moduleId: WORKFLOWS_MODULE_ID,
99
+ title: details.taskName,
100
+ description: details.description ?? null,
101
+ status: details.status,
102
+ priority: normalizeWorkInboxPriority(details.priority),
103
+ dueDate: details.dueDate ?? null,
104
+ overdue: deriveWorkInboxOverdue(details.dueDate ?? null, details.status, now),
105
+ createdAt: details.createdAt,
106
+ updatedAt: details.updatedAt,
107
+ assignedTo: details.assignedTo ?? null,
108
+ assignedToRoles: details.assignedToRoles ?? null,
109
+ claimedBy: details.claimedBy ?? null,
110
+ entityTypes: [...new Set(bindings.map((binding) => binding.entityType))],
111
+ entityBindings: bindings,
112
+ detailHref: `/backend/tasks/${details.id}`,
113
+ actions: USER_TASK_WORK_INBOX_ACTIONS,
114
+ details
115
+ };
116
+ }
117
+ async function listUserTaskWorkItems(query, context) {
118
+ const em = context.resolve("em");
119
+ const options = {
120
+ administrativeQueueFeature: context.administrativeQueueFeature ?? null
121
+ };
122
+ const where = buildUserTaskWorkInboxWhere(query, context.scope, options);
123
+ const [tasks, total] = await em.findAndCount(UserTask, where, {
124
+ orderBy: [{ dueDate: "ASC" }, { createdAt: "DESC" }],
125
+ limit: query.offset + query.limit,
126
+ offset: 0
127
+ });
128
+ const { visible, entityHidden } = partitionTaskPage(context.scope.visibility, tasks, options);
129
+ return {
130
+ rows: visible.map((task) => toUserTaskWorkInboxRow(task, query.now)),
131
+ total,
132
+ ...entityHidden.length > 0 ? { entityHidden } : {}
133
+ };
134
+ }
135
+ const userTaskWorkInboxSource = {
136
+ kind: USER_TASK_INBOX_KIND,
137
+ moduleId: WORKFLOWS_MODULE_ID,
138
+ render: "work-inbox:user_task:detail",
139
+ actions: USER_TASK_WORK_INBOX_ACTIONS,
140
+ list: listUserTaskWorkItems
141
+ };
142
+ export {
143
+ USER_TASK_WORK_INBOX_ACTIONS,
144
+ WORKFLOWS_MODULE_ID,
145
+ buildUserTaskWorkInboxWhere,
146
+ toUserTaskWorkInboxRow,
147
+ userTaskWorkInboxSource
148
+ };
149
+ //# sourceMappingURL=user-task-source.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/workflows/lib/work-inbox/user-task-source.ts"],
4
+ "sourcesContent": ["/**\n * Work Inbox \u2014 the core `user_task` source.\n *\n * A read-model over the existing `user_tasks` rows (spec \u00A76.3: \"phase 1: a\n * projection/read-model over existing `UserTask` \u2026 with no data migration\").\n * Nothing here writes; the inbox's mutations go through `taskHandler`.\n *\n * Rows are projected through the SAME `serializeUserTask` the task list route\n * uses and carried on the wire under `details`, so a work-inbox row remains a\n * strict superset of a task-list row.\n */\n\nimport type { EntityManager, FilterQuery } from '@mikro-orm/core'\nimport { UserTask } from '../../data/entities'\nimport { serializeUserTask, USER_TASK_INBOX_KIND } from '../../api/tasks/serialize'\nimport {\n WORK_INBOX_TERMINAL_STATUSES,\n deriveWorkInboxOverdue,\n normalizeWorkInboxPriority,\n} from './provider'\nimport {\n buildTaskVisibilityRequestConditions,\n partitionTaskPage,\n} from '../task-visibility-request'\nimport type {\n WorkInboxAction,\n WorkInboxEntityBinding,\n WorkInboxQuery,\n WorkInboxRow,\n WorkInboxScope,\n WorkInboxSourceContext,\n WorkInboxSourceProvider,\n WorkInboxSourceResult,\n} from './provider'\n\nexport const WORKFLOWS_MODULE_ID = 'workflows'\n\n/**\n * Declarative actions the inbox renders for a workflow task. `complete` points\n * at the task detail page rather than an endpoint because completing needs the\n * form; claim and unclaim are one-shot POSTs.\n */\nexport const USER_TASK_WORK_INBOX_ACTIONS: WorkInboxAction[] = [\n {\n id: 'claim',\n labelKey: 'workflows.tasks.actions.claim',\n endpoint: '/api/workflows/tasks/{id}/claim',\n appliesTo: 'claimable',\n },\n {\n id: 'unclaim',\n labelKey: 'workflows.tasks.actions.unclaim',\n endpoint: '/api/workflows/tasks/{id}/unclaim',\n appliesTo: 'claimed-by-me',\n },\n]\n\ntype WorkInboxWhere = FilterQuery<UserTask>\n\n/**\n * Per-source options a `UserTask`-serving provider passes through to the \u00A76.4\n * rule.\n *\n * `administrativeQueueFeature` is the source's own declaration, handed back by\n * `listWorkInbox`. Core's `user_task` source declares none, so an unassigned row\n * keeps falling back to `workflows.tasks.view_all` exactly as before; a\n * specialized source (an administrative queue raised by another module) supplies\n * its own, and the SQL filter and the predicate must be given the SAME value or\n * a row is counted in `pagination.total` and then dropped from the page.\n */\nexport type UserTaskWorkInboxOptions = {\n administrativeQueueFeature?: string | null\n}\n\nfunction asBindings(value: unknown): WorkInboxEntityBinding[] {\n if (!Array.isArray(value)) return []\n const bindings: WorkInboxEntityBinding[] = []\n for (const item of value) {\n if (!item || typeof item !== 'object' || Array.isArray(item)) continue\n const record = item as Record<string, unknown>\n const entityType = record.entityType\n const entityId = record.entityId\n if (typeof entityType !== 'string' || typeof entityId !== 'string') continue\n const label = typeof record.label === 'string' ? record.label : null\n bindings.push({ entityType, entityId, label })\n }\n return bindings\n}\n\n/**\n * Translate a work-inbox query into the ORM filter.\n *\n * Exported and pure so the tenant/organization scoping and every filter can be\n * asserted without a database. Independent predicates are pushed onto `$and`\n * rather than merged into one object, because several of them (`myWork`,\n * `entityTypes`) each need their own `$or` group and a single object can only\n * carry one.\n */\nexport function buildUserTaskWorkInboxWhere(\n query: WorkInboxQuery,\n scope: WorkInboxScope,\n options: UserTaskWorkInboxOptions = {},\n): WorkInboxWhere {\n const conditions: Record<string, unknown>[] = []\n\n if (query.statuses && query.statuses.length > 0) {\n conditions.push({ status: { $in: query.statuses } })\n }\n\n if (query.overdueOnly) {\n conditions.push({ dueDate: { $lt: query.now } })\n conditions.push({ status: { $nin: [...WORK_INBOX_TERMINAL_STATUSES] } })\n }\n\n if (query.assignedTo) {\n conditions.push({ assignedTo: query.assignedTo })\n }\n\n if (query.workflowInstanceId) {\n conditions.push({ workflowInstanceId: query.workflowInstanceId })\n }\n\n if (query.priorities && query.priorities.length > 0) {\n conditions.push({ priority: { $in: query.priorities } })\n }\n\n if (query.roles && query.roles.length > 0) {\n conditions.push({ assignedToRoles: { $overlap: query.roles } })\n }\n\n if (query.entityTypes && query.entityTypes.length > 0) {\n conditions.push({\n $or: query.entityTypes.map((entityType) => ({\n entityBindings: { $contains: [{ entityType }] },\n })),\n })\n }\n\n if (query.myWork) {\n conditions.push({\n $or: [\n { assignedTo: scope.userId },\n { claimedBy: scope.userId },\n { assignedToRoles: { $overlap: scope.roles } },\n ],\n })\n }\n\n // \u00A76.4. Pushed onto the SAME `$and` array as every other predicate, so the\n // relationship clause, the entity gate and the caller's own filters compose\n // rather than overwrite each other. Empty for an administrator, a superadmin,\n // or a tenant that has flipped the opt-out \u2014 the rule then adds nothing and\n // tenant/organization scoping below is still the floor.\n conditions.push(\n ...buildTaskVisibilityRequestConditions(scope.visibility, {\n administrativeQueueFeature: options.administrativeQueueFeature ?? null,\n }),\n )\n\n const where: Record<string, unknown> = { tenantId: scope.tenantId }\n if (scope.organizationIds) {\n where.organizationId = { $in: scope.organizationIds }\n }\n if (conditions.length > 0) {\n where.$and = conditions\n }\n\n return where as WorkInboxWhere\n}\n\nexport function toUserTaskWorkInboxRow(task: UserTask, now: Date): WorkInboxRow {\n const details = serializeUserTask(task)\n const bindings = asBindings(details.entityBindings)\n return {\n id: details.id,\n kind: USER_TASK_INBOX_KIND,\n moduleId: WORKFLOWS_MODULE_ID,\n title: details.taskName,\n description: details.description ?? null,\n status: details.status,\n priority: normalizeWorkInboxPriority(details.priority),\n dueDate: details.dueDate ?? null,\n overdue: deriveWorkInboxOverdue(details.dueDate ?? null, details.status, now),\n createdAt: details.createdAt,\n updatedAt: details.updatedAt,\n assignedTo: details.assignedTo ?? null,\n assignedToRoles: details.assignedToRoles ?? null,\n claimedBy: details.claimedBy ?? null,\n entityTypes: [...new Set(bindings.map((binding) => binding.entityType))],\n entityBindings: bindings,\n detailHref: `/backend/tasks/${details.id}`,\n actions: USER_TASK_WORK_INBOX_ACTIONS,\n details,\n }\n}\n\n/**\n * SQL orders by due date (Postgres puts NULLs last on ASC, which is what the\n * inbox wants) and then by recency; the canonical priority \u2192 due \u2192 created\n * ordering is applied by the merge service over the returned window, because\n * `priority` is an authored label with no ordinal column to sort on. Phase 1 is\n * a projection \u2014 a persisted sort key belongs with the `Task` entity, which\n * resolved question #1 defers to the next cycle.\n */\nasync function listUserTaskWorkItems(\n query: WorkInboxQuery,\n context: WorkInboxSourceContext,\n): Promise<WorkInboxSourceResult> {\n const em = context.resolve<EntityManager>('em')\n const options: UserTaskWorkInboxOptions = {\n administrativeQueueFeature: context.administrativeQueueFeature ?? null,\n }\n const where = buildUserTaskWorkInboxWhere(query, context.scope, options)\n\n const [tasks, total] = await em.findAndCount(UserTask, where, {\n orderBy: [{ dueDate: 'ASC' }, { createdAt: 'DESC' }],\n limit: query.offset + query.limit,\n offset: 0,\n })\n\n // The `WHERE` already IS the rule; running the predicate over the page keeps\n // this source routed through the single decision point and makes a\n // SQL/predicate divergence lose a row instead of leaking one. It is handed the\n // SAME queue feature the filter was built with, for exactly that reason.\n const { visible, entityHidden } = partitionTaskPage(context.scope.visibility, tasks, options)\n\n return {\n rows: visible.map((task) => toUserTaskWorkInboxRow(task, query.now)),\n total,\n ...(entityHidden.length > 0 ? { entityHidden } : {}),\n }\n}\n\nexport const userTaskWorkInboxSource: WorkInboxSourceProvider = {\n kind: USER_TASK_INBOX_KIND,\n moduleId: WORKFLOWS_MODULE_ID,\n render: 'work-inbox:user_task:detail',\n actions: USER_TASK_WORK_INBOX_ACTIONS,\n list: listUserTaskWorkItems,\n}\n"],
5
+ "mappings": "AAaA,SAAS,gBAAgB;AACzB,SAAS,mBAAmB,4BAA4B;AACxD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAYA,MAAM,sBAAsB;AAO5B,MAAM,+BAAkD;AAAA,EAC7D;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,UAAU;AAAA,IACV,WAAW;AAAA,EACb;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,UAAU;AAAA,IACV,UAAU;AAAA,IACV,WAAW;AAAA,EACb;AACF;AAmBA,SAAS,WAAW,OAA0C;AAC5D,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO,CAAC;AACnC,QAAM,WAAqC,CAAC;AAC5C,aAAW,QAAQ,OAAO;AACxB,QAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,MAAM,QAAQ,IAAI,EAAG;AAC9D,UAAM,SAAS;AACf,UAAM,aAAa,OAAO;AAC1B,UAAM,WAAW,OAAO;AACxB,QAAI,OAAO,eAAe,YAAY,OAAO,aAAa,SAAU;AACpE,UAAM,QAAQ,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ;AAChE,aAAS,KAAK,EAAE,YAAY,UAAU,MAAM,CAAC;AAAA,EAC/C;AACA,SAAO;AACT;AAWO,SAAS,4BACd,OACA,OACA,UAAoC,CAAC,GACrB;AAChB,QAAM,aAAwC,CAAC;AAE/C,MAAI,MAAM,YAAY,MAAM,SAAS,SAAS,GAAG;AAC/C,eAAW,KAAK,EAAE,QAAQ,EAAE,KAAK,MAAM,SAAS,EAAE,CAAC;AAAA,EACrD;AAEA,MAAI,MAAM,aAAa;AACrB,eAAW,KAAK,EAAE,SAAS,EAAE,KAAK,MAAM,IAAI,EAAE,CAAC;AAC/C,eAAW,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,4BAA4B,EAAE,EAAE,CAAC;AAAA,EACzE;AAEA,MAAI,MAAM,YAAY;AACpB,eAAW,KAAK,EAAE,YAAY,MAAM,WAAW,CAAC;AAAA,EAClD;AAEA,MAAI,MAAM,oBAAoB;AAC5B,eAAW,KAAK,EAAE,oBAAoB,MAAM,mBAAmB,CAAC;AAAA,EAClE;AAEA,MAAI,MAAM,cAAc,MAAM,WAAW,SAAS,GAAG;AACnD,eAAW,KAAK,EAAE,UAAU,EAAE,KAAK,MAAM,WAAW,EAAE,CAAC;AAAA,EACzD;AAEA,MAAI,MAAM,SAAS,MAAM,MAAM,SAAS,GAAG;AACzC,eAAW,KAAK,EAAE,iBAAiB,EAAE,UAAU,MAAM,MAAM,EAAE,CAAC;AAAA,EAChE;AAEA,MAAI,MAAM,eAAe,MAAM,YAAY,SAAS,GAAG;AACrD,eAAW,KAAK;AAAA,MACd,KAAK,MAAM,YAAY,IAAI,CAAC,gBAAgB;AAAA,QAC1C,gBAAgB,EAAE,WAAW,CAAC,EAAE,WAAW,CAAC,EAAE;AAAA,MAChD,EAAE;AAAA,IACJ,CAAC;AAAA,EACH;AAEA,MAAI,MAAM,QAAQ;AAChB,eAAW,KAAK;AAAA,MACd,KAAK;AAAA,QACH,EAAE,YAAY,MAAM,OAAO;AAAA,QAC3B,EAAE,WAAW,MAAM,OAAO;AAAA,QAC1B,EAAE,iBAAiB,EAAE,UAAU,MAAM,MAAM,EAAE;AAAA,MAC/C;AAAA,IACF,CAAC;AAAA,EACH;AAOA,aAAW;AAAA,IACT,GAAG,qCAAqC,MAAM,YAAY;AAAA,MACxD,4BAA4B,QAAQ,8BAA8B;AAAA,IACpE,CAAC;AAAA,EACH;AAEA,QAAM,QAAiC,EAAE,UAAU,MAAM,SAAS;AAClE,MAAI,MAAM,iBAAiB;AACzB,UAAM,iBAAiB,EAAE,KAAK,MAAM,gBAAgB;AAAA,EACtD;AACA,MAAI,WAAW,SAAS,GAAG;AACzB,UAAM,OAAO;AAAA,EACf;AAEA,SAAO;AACT;AAEO,SAAS,uBAAuB,MAAgB,KAAyB;AAC9E,QAAM,UAAU,kBAAkB,IAAI;AACtC,QAAM,WAAW,WAAW,QAAQ,cAAc;AAClD,SAAO;AAAA,IACL,IAAI,QAAQ;AAAA,IACZ,MAAM;AAAA,IACN,UAAU;AAAA,IACV,OAAO,QAAQ;AAAA,IACf,aAAa,QAAQ,eAAe;AAAA,IACpC,QAAQ,QAAQ;AAAA,IAChB,UAAU,2BAA2B,QAAQ,QAAQ;AAAA,IACrD,SAAS,QAAQ,WAAW;AAAA,IAC5B,SAAS,uBAAuB,QAAQ,WAAW,MAAM,QAAQ,QAAQ,GAAG;AAAA,IAC5E,WAAW,QAAQ;AAAA,IACnB,WAAW,QAAQ;AAAA,IACnB,YAAY,QAAQ,cAAc;AAAA,IAClC,iBAAiB,QAAQ,mBAAmB;AAAA,IAC5C,WAAW,QAAQ,aAAa;AAAA,IAChC,aAAa,CAAC,GAAG,IAAI,IAAI,SAAS,IAAI,CAAC,YAAY,QAAQ,UAAU,CAAC,CAAC;AAAA,IACvE,gBAAgB;AAAA,IAChB,YAAY,kBAAkB,QAAQ,EAAE;AAAA,IACxC,SAAS;AAAA,IACT;AAAA,EACF;AACF;AAUA,eAAe,sBACb,OACA,SACgC;AAChC,QAAM,KAAK,QAAQ,QAAuB,IAAI;AAC9C,QAAM,UAAoC;AAAA,IACxC,4BAA4B,QAAQ,8BAA8B;AAAA,EACpE;AACA,QAAM,QAAQ,4BAA4B,OAAO,QAAQ,OAAO,OAAO;AAEvE,QAAM,CAAC,OAAO,KAAK,IAAI,MAAM,GAAG,aAAa,UAAU,OAAO;AAAA,IAC5D,SAAS,CAAC,EAAE,SAAS,MAAM,GAAG,EAAE,WAAW,OAAO,CAAC;AAAA,IACnD,OAAO,MAAM,SAAS,MAAM;AAAA,IAC5B,QAAQ;AAAA,EACV,CAAC;AAMD,QAAM,EAAE,SAAS,aAAa,IAAI,kBAAkB,QAAQ,MAAM,YAAY,OAAO,OAAO;AAE5F,SAAO;AAAA,IACL,MAAM,QAAQ,IAAI,CAAC,SAAS,uBAAuB,MAAM,MAAM,GAAG,CAAC;AAAA,IACnE;AAAA,IACA,GAAI,aAAa,SAAS,IAAI,EAAE,aAAa,IAAI,CAAC;AAAA,EACpD;AACF;AAEO,MAAM,0BAAmD;AAAA,EAC9D,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,MAAM;AACR;",
6
+ "names": []
7
+ }