@solidxai/core 0.1.13-beta.2 → 0.1.13-beta.21

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 (517) hide show
  1. package/CHANGELOG.md +10107 -0
  2. package/CLAUDE.md +5 -6
  3. package/README.md +19 -0
  4. package/dist/commands/run-tests.command.d.ts +9 -1
  5. package/dist/commands/run-tests.command.d.ts.map +1 -1
  6. package/dist/commands/run-tests.command.js +69 -6
  7. package/dist/commands/run-tests.command.js.map +1 -1
  8. package/dist/commands/seed.command.d.ts +2 -0
  9. package/dist/commands/seed.command.d.ts.map +1 -1
  10. package/dist/commands/seed.command.js +21 -0
  11. package/dist/commands/seed.command.js.map +1 -1
  12. package/dist/config/cache.options.d.ts.map +1 -1
  13. package/dist/config/cache.options.js +2 -2
  14. package/dist/config/cache.options.js.map +1 -1
  15. package/dist/constants/chatter-message.constants.d.ts +1 -0
  16. package/dist/constants/chatter-message.constants.d.ts.map +1 -1
  17. package/dist/constants/chatter-message.constants.js +3 -1
  18. package/dist/constants/chatter-message.constants.js.map +1 -1
  19. package/dist/constants/draft-publish-fields.d.ts +2 -0
  20. package/dist/constants/draft-publish-fields.d.ts.map +1 -0
  21. package/dist/constants/draft-publish-fields.js +5 -0
  22. package/dist/constants/draft-publish-fields.js.map +1 -0
  23. package/dist/constants/error-messages.d.ts +7 -0
  24. package/dist/constants/error-messages.d.ts.map +1 -1
  25. package/dist/constants/error-messages.js +7 -0
  26. package/dist/constants/error-messages.js.map +1 -1
  27. package/dist/constants/media-file-types.d.ts +12 -0
  28. package/dist/constants/media-file-types.d.ts.map +1 -1
  29. package/dist/constants/media-file-types.js +66 -1
  30. package/dist/constants/media-file-types.js.map +1 -1
  31. package/dist/constants/success-messages.d.ts +3 -0
  32. package/dist/constants/success-messages.d.ts.map +1 -1
  33. package/dist/constants/success-messages.js +3 -0
  34. package/dist/constants/success-messages.js.map +1 -1
  35. package/dist/constants/user.constants.d.ts +2 -0
  36. package/dist/constants/user.constants.d.ts.map +1 -0
  37. package/dist/constants/user.constants.js +5 -0
  38. package/dist/constants/user.constants.js.map +1 -0
  39. package/dist/controllers/action-metadata.controller.d.ts +1 -1
  40. package/dist/controllers/action-metadata.controller.js +1 -1
  41. package/dist/controllers/agent-event.controller.d.ts +1 -1
  42. package/dist/controllers/agent-event.controller.js +1 -1
  43. package/dist/controllers/agent-session.controller.d.ts +1 -1
  44. package/dist/controllers/agent-session.controller.js +1 -1
  45. package/dist/controllers/authentication.controller.d.ts +1 -1
  46. package/dist/controllers/authentication.controller.d.ts.map +1 -1
  47. package/dist/controllers/authentication.controller.js +4 -3
  48. package/dist/controllers/authentication.controller.js.map +1 -1
  49. package/dist/controllers/chatter-message.controller.d.ts +5 -0
  50. package/dist/controllers/chatter-message.controller.d.ts.map +1 -1
  51. package/dist/controllers/chatter-message.controller.js +14 -0
  52. package/dist/controllers/chatter-message.controller.js.map +1 -1
  53. package/dist/controllers/dashboard-user-layout.controller.d.ts +1 -1
  54. package/dist/controllers/dashboard-user-layout.controller.js +1 -1
  55. package/dist/controllers/email-template.controller.d.ts +1 -1
  56. package/dist/controllers/email-template.controller.js +1 -1
  57. package/dist/controllers/export-template.controller.d.ts +1 -1
  58. package/dist/controllers/export-template.controller.d.ts.map +1 -1
  59. package/dist/controllers/export-template.controller.js +6 -4
  60. package/dist/controllers/export-template.controller.js.map +1 -1
  61. package/dist/controllers/export-transaction.controller.d.ts +1 -1
  62. package/dist/controllers/export-transaction.controller.js +1 -1
  63. package/dist/controllers/field-metadata.controller.d.ts +2 -2
  64. package/dist/controllers/import-transaction-error-log.controller.d.ts +1 -1
  65. package/dist/controllers/import-transaction-error-log.controller.js +1 -1
  66. package/dist/controllers/import-transaction.controller.d.ts +1 -1
  67. package/dist/controllers/import-transaction.controller.d.ts.map +1 -1
  68. package/dist/controllers/import-transaction.controller.js +7 -7
  69. package/dist/controllers/import-transaction.controller.js.map +1 -1
  70. package/dist/controllers/list-of-values.controller.d.ts +1 -1
  71. package/dist/controllers/list-of-values.controller.js +1 -1
  72. package/dist/controllers/locale.controller.d.ts +1 -1
  73. package/dist/controllers/locale.controller.js +1 -1
  74. package/dist/controllers/mcp-audit-log.controller.d.ts +1 -1
  75. package/dist/controllers/mcp-audit-log.controller.js +1 -1
  76. package/dist/controllers/media.controller.d.ts +2 -2
  77. package/dist/controllers/media.controller.d.ts.map +1 -1
  78. package/dist/controllers/media.controller.js +13 -8
  79. package/dist/controllers/media.controller.js.map +1 -1
  80. package/dist/controllers/menu-item-metadata.controller.d.ts +1 -1
  81. package/dist/controllers/menu-item-metadata.controller.js +1 -1
  82. package/dist/controllers/model-sequence.controller.d.ts +1 -1
  83. package/dist/controllers/model-sequence.controller.js +1 -1
  84. package/dist/controllers/module-package.controller.d.ts.map +1 -1
  85. package/dist/controllers/module-package.controller.js +2 -3
  86. package/dist/controllers/module-package.controller.js.map +1 -1
  87. package/dist/controllers/mpin-authentication.controller.d.ts +44 -0
  88. package/dist/controllers/mpin-authentication.controller.d.ts.map +1 -0
  89. package/dist/controllers/mpin-authentication.controller.js +102 -0
  90. package/dist/controllers/mpin-authentication.controller.js.map +1 -0
  91. package/dist/controllers/mq-message-queue.controller.d.ts +1 -1
  92. package/dist/controllers/mq-message-queue.controller.js +1 -1
  93. package/dist/controllers/mq-message.controller.d.ts +1 -1
  94. package/dist/controllers/mq-message.controller.js +1 -1
  95. package/dist/controllers/permission-metadata.controller.d.ts +1 -1
  96. package/dist/controllers/permission-metadata.controller.js +1 -1
  97. package/dist/controllers/role-metadata.controller.d.ts +1 -1
  98. package/dist/controllers/role-metadata.controller.js +1 -1
  99. package/dist/controllers/saved-filters.controller.d.ts +1 -1
  100. package/dist/controllers/saved-filters.controller.js +1 -1
  101. package/dist/controllers/scheduled-job.controller.d.ts +1 -1
  102. package/dist/controllers/scheduled-job.controller.js +1 -1
  103. package/dist/controllers/security-rule.controller.d.ts +1 -1
  104. package/dist/controllers/security-rule.controller.js +1 -1
  105. package/dist/controllers/sms-template.controller.d.ts +1 -1
  106. package/dist/controllers/sms-template.controller.js +1 -1
  107. package/dist/controllers/user-activity-history.controller.d.ts +1 -1
  108. package/dist/controllers/user-activity-history.controller.js +1 -1
  109. package/dist/controllers/user-view-metadata.controller.d.ts +1 -1
  110. package/dist/controllers/user-view-metadata.controller.js +1 -1
  111. package/dist/controllers/user.controller.d.ts +2 -2
  112. package/dist/controllers/user.controller.js +2 -2
  113. package/dist/controllers/view-metadata.controller.d.ts +2 -2
  114. package/dist/controllers/view-metadata.controller.js +1 -1
  115. package/dist/controllers/workflow-definition.controller.d.ts +1 -1
  116. package/dist/controllers/workflow-definition.controller.js +1 -1
  117. package/dist/controllers/workflow-execution-artifact.controller.d.ts +1 -1
  118. package/dist/controllers/workflow-execution-artifact.controller.js +1 -1
  119. package/dist/controllers/workflow-execution-log.controller.d.ts +1 -1
  120. package/dist/controllers/workflow-execution-log.controller.js +1 -1
  121. package/dist/controllers/workflow-execution.controller.d.ts +1 -1
  122. package/dist/controllers/workflow-execution.controller.js +1 -1
  123. package/dist/controllers/workflow-secret.controller.d.ts +1 -1
  124. package/dist/controllers/workflow-secret.controller.js +1 -1
  125. package/dist/controllers/workflow-step-execution.controller.d.ts +1 -1
  126. package/dist/controllers/workflow-step-execution.controller.js +1 -1
  127. package/dist/controllers/workflow-trigger-execution.controller.d.ts +1 -1
  128. package/dist/controllers/workflow-trigger-execution.controller.js +1 -1
  129. package/dist/dtos/basic-filters.dto.d.ts +0 -1
  130. package/dist/dtos/basic-filters.dto.d.ts.map +1 -1
  131. package/dist/dtos/basic-filters.dto.js +1 -6
  132. package/dist/dtos/basic-filters.dto.js.map +1 -1
  133. package/dist/dtos/change-mpin.dto.d.ts +6 -0
  134. package/dist/dtos/change-mpin.dto.d.ts.map +1 -0
  135. package/dist/dtos/change-mpin.dto.js +39 -0
  136. package/dist/dtos/change-mpin.dto.js.map +1 -0
  137. package/dist/dtos/create-field-metadata.dto.d.ts +3 -6
  138. package/dist/dtos/create-field-metadata.dto.d.ts.map +1 -1
  139. package/dist/dtos/create-field-metadata.dto.js +15 -10
  140. package/dist/dtos/create-field-metadata.dto.js.map +1 -1
  141. package/dist/dtos/create-model-sequence.dto.d.ts +1 -1
  142. package/dist/dtos/create-model-sequence.dto.d.ts.map +1 -1
  143. package/dist/dtos/create-model-sequence.dto.js +1 -1
  144. package/dist/dtos/create-model-sequence.dto.js.map +1 -1
  145. package/dist/dtos/mpin-login.dto.d.ts +5 -0
  146. package/dist/dtos/mpin-login.dto.d.ts.map +1 -0
  147. package/dist/dtos/mpin-login.dto.js +33 -0
  148. package/dist/dtos/mpin-login.dto.js.map +1 -0
  149. package/dist/dtos/setup-mpin.dto.d.ts +7 -0
  150. package/dist/dtos/setup-mpin.dto.d.ts.map +1 -0
  151. package/dist/dtos/setup-mpin.dto.js +47 -0
  152. package/dist/dtos/setup-mpin.dto.js.map +1 -0
  153. package/dist/entities/common.entity.d.ts +4 -0
  154. package/dist/entities/common.entity.d.ts.map +1 -1
  155. package/dist/entities/common.entity.js +25 -1
  156. package/dist/entities/common.entity.js.map +1 -1
  157. package/dist/entities/dashboard-user-layout.entity.js +2 -2
  158. package/dist/entities/dashboard-user-layout.entity.js.map +1 -1
  159. package/dist/entities/field-metadata.entity.d.ts +1 -0
  160. package/dist/entities/field-metadata.entity.d.ts.map +1 -1
  161. package/dist/entities/field-metadata.entity.js +5 -1
  162. package/dist/entities/field-metadata.entity.js.map +1 -1
  163. package/dist/entities/saved-filters.entity.js +3 -3
  164. package/dist/entities/saved-filters.entity.js.map +1 -1
  165. package/dist/entities/user-device-credential.entity.d.ts +18 -0
  166. package/dist/entities/user-device-credential.entity.d.ts.map +1 -0
  167. package/dist/entities/user-device-credential.entity.js +91 -0
  168. package/dist/entities/user-device-credential.entity.js.map +1 -0
  169. package/dist/entities/user.entity.d.ts.map +1 -1
  170. package/dist/entities/user.entity.js +36 -0
  171. package/dist/entities/user.entity.js.map +1 -1
  172. package/dist/entities/view-metadata.entity.js.map +1 -1
  173. package/dist/entities/workflow-execution-artifact.entity.d.ts.map +1 -1
  174. package/dist/entities/workflow-execution-artifact.entity.js +4 -3
  175. package/dist/entities/workflow-execution-artifact.entity.js.map +1 -1
  176. package/dist/entities/workflow-execution-log.entity.d.ts.map +1 -1
  177. package/dist/entities/workflow-execution-log.entity.js +4 -3
  178. package/dist/entities/workflow-execution-log.entity.js.map +1 -1
  179. package/dist/entities/workflow-execution.entity.d.ts.map +1 -1
  180. package/dist/entities/workflow-execution.entity.js +3 -2
  181. package/dist/entities/workflow-execution.entity.js.map +1 -1
  182. package/dist/entities/workflow-secret.entity.d.ts.map +1 -1
  183. package/dist/entities/workflow-secret.entity.js +3 -2
  184. package/dist/entities/workflow-secret.entity.js.map +1 -1
  185. package/dist/entities/workflow-step-execution.entity.d.ts.map +1 -1
  186. package/dist/entities/workflow-step-execution.entity.js +3 -2
  187. package/dist/entities/workflow-step-execution.entity.js.map +1 -1
  188. package/dist/entities/workflow-trigger-execution.entity.d.ts.map +1 -1
  189. package/dist/entities/workflow-trigger-execution.entity.js +7 -6
  190. package/dist/entities/workflow-trigger-execution.entity.js.map +1 -1
  191. package/dist/factories/mail.factory.d.ts.map +1 -1
  192. package/dist/factories/mail.factory.js +4 -0
  193. package/dist/factories/mail.factory.js.map +1 -1
  194. package/dist/filters/http-exception.filter.d.ts.map +1 -1
  195. package/dist/filters/http-exception.filter.js +5 -1
  196. package/dist/filters/http-exception.filter.js.map +1 -1
  197. package/dist/helpers/bootstrap.helper.d.ts +5 -2
  198. package/dist/helpers/bootstrap.helper.d.ts.map +1 -1
  199. package/dist/helpers/bootstrap.helper.js +7 -3
  200. package/dist/helpers/bootstrap.helper.js.map +1 -1
  201. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.d.ts +7 -0
  202. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.d.ts.map +1 -1
  203. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.js +66 -32
  204. package/dist/helpers/field-crud-managers/MediaFieldCrudManager.js.map +1 -1
  205. package/dist/helpers/file-download.helper.d.ts +9 -0
  206. package/dist/helpers/file-download.helper.d.ts.map +1 -0
  207. package/dist/helpers/file-download.helper.js +19 -0
  208. package/dist/helpers/file-download.helper.js.map +1 -0
  209. package/dist/helpers/model-metadata-helper.service.d.ts.map +1 -1
  210. package/dist/helpers/model-metadata-helper.service.js +30 -1
  211. package/dist/helpers/model-metadata-helper.service.js.map +1 -1
  212. package/dist/helpers/security.helper.d.ts +5 -1
  213. package/dist/helpers/security.helper.d.ts.map +1 -1
  214. package/dist/helpers/security.helper.js +15 -4
  215. package/dist/helpers/security.helper.js.map +1 -1
  216. package/dist/helpers/solid-core-error-codes-provider.service.d.ts.map +1 -1
  217. package/dist/helpers/solid-core-error-codes-provider.service.js +45 -0
  218. package/dist/helpers/solid-core-error-codes-provider.service.js.map +1 -1
  219. package/dist/helpers/solid-microservice-adapter.service.d.ts.map +1 -1
  220. package/dist/helpers/solid-microservice-adapter.service.js +1 -1
  221. package/dist/helpers/solid-microservice-adapter.service.js.map +1 -1
  222. package/dist/helpers/solid-registry.js +1 -1
  223. package/dist/helpers/solid-registry.js.map +1 -1
  224. package/dist/helpers/typeorm-db-helper.d.ts.map +1 -1
  225. package/dist/helpers/typeorm-db-helper.js +9 -0
  226. package/dist/helpers/typeorm-db-helper.js.map +1 -1
  227. package/dist/index.d.ts +10 -0
  228. package/dist/index.d.ts.map +1 -1
  229. package/dist/index.js +10 -0
  230. package/dist/index.js.map +1 -1
  231. package/dist/interfaces/active-user-data.interface.d.ts +1 -0
  232. package/dist/interfaces/active-user-data.interface.d.ts.map +1 -1
  233. package/dist/interfaces/active-user-data.interface.js.map +1 -1
  234. package/dist/interfaces.d.ts +1 -0
  235. package/dist/interfaces.d.ts.map +1 -1
  236. package/dist/interfaces.js.map +1 -1
  237. package/dist/repository/user-device-credential.repository.d.ts +12 -0
  238. package/dist/repository/user-device-credential.repository.d.ts.map +1 -0
  239. package/dist/repository/user-device-credential.repository.js +34 -0
  240. package/dist/repository/user-device-credential.repository.js.map +1 -0
  241. package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
  242. package/dist/seeders/module-metadata-seeder.service.js +51 -30
  243. package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
  244. package/dist/seeders/module-test-data.service.d.ts +3 -1
  245. package/dist/seeders/module-test-data.service.d.ts.map +1 -1
  246. package/dist/seeders/module-test-data.service.js +8 -2
  247. package/dist/seeders/module-test-data.service.js.map +1 -1
  248. package/dist/seeders/seed-data/solid-core-metadata.json +290 -78
  249. package/dist/services/api-key.service.d.ts.map +1 -1
  250. package/dist/services/api-key.service.js +1 -1
  251. package/dist/services/api-key.service.js.map +1 -1
  252. package/dist/services/authentication.service.d.ts +9 -5
  253. package/dist/services/authentication.service.d.ts.map +1 -1
  254. package/dist/services/authentication.service.js +102 -23
  255. package/dist/services/authentication.service.js.map +1 -1
  256. package/dist/services/chatter-message.service.d.ts +16 -1
  257. package/dist/services/chatter-message.service.d.ts.map +1 -1
  258. package/dist/services/chatter-message.service.js +100 -16
  259. package/dist/services/chatter-message.service.js.map +1 -1
  260. package/dist/services/crud-helper.service.d.ts +6 -4
  261. package/dist/services/crud-helper.service.d.ts.map +1 -1
  262. package/dist/services/crud-helper.service.js +32 -48
  263. package/dist/services/crud-helper.service.js.map +1 -1
  264. package/dist/services/crud.service.d.ts +13 -1
  265. package/dist/services/crud.service.d.ts.map +1 -1
  266. package/dist/services/crud.service.js +94 -68
  267. package/dist/services/crud.service.js.map +1 -1
  268. package/dist/services/datasource-introspection.service.d.ts.map +1 -1
  269. package/dist/services/datasource-introspection.service.js.map +1 -1
  270. package/dist/services/draft-publish-helper.service.d.ts +53 -0
  271. package/dist/services/draft-publish-helper.service.d.ts.map +1 -0
  272. package/dist/services/draft-publish-helper.service.js +402 -0
  273. package/dist/services/draft-publish-helper.service.js.map +1 -0
  274. package/dist/services/field-metadata.service.d.ts +2 -2
  275. package/dist/services/field-metadata.service.d.ts.map +1 -1
  276. package/dist/services/field-metadata.service.js +4 -1
  277. package/dist/services/field-metadata.service.js.map +1 -1
  278. package/dist/services/internationalisation-helper.service.d.ts +19 -0
  279. package/dist/services/internationalisation-helper.service.d.ts.map +1 -0
  280. package/dist/services/internationalisation-helper.service.js +107 -0
  281. package/dist/services/internationalisation-helper.service.js.map +1 -0
  282. package/dist/services/locale.service.d.ts +1 -1
  283. package/dist/services/media-storage.utils.d.ts +1 -0
  284. package/dist/services/media-storage.utils.d.ts.map +1 -1
  285. package/dist/services/media-storage.utils.js +12 -1
  286. package/dist/services/media-storage.utils.js.map +1 -1
  287. package/dist/services/media.service.d.ts +3 -2
  288. package/dist/services/media.service.d.ts.map +1 -1
  289. package/dist/services/media.service.js +45 -29
  290. package/dist/services/media.service.js.map +1 -1
  291. package/dist/services/metadata-validation.service.d.ts +7 -0
  292. package/dist/services/metadata-validation.service.d.ts.map +1 -0
  293. package/dist/services/metadata-validation.service.js +42 -0
  294. package/dist/services/metadata-validation.service.js.map +1 -0
  295. package/dist/services/model-metadata.service.d.ts.map +1 -1
  296. package/dist/services/model-metadata.service.js +2 -1
  297. package/dist/services/model-metadata.service.js.map +1 -1
  298. package/dist/services/module-metadata.service.d.ts.map +1 -1
  299. package/dist/services/module-metadata.service.js +9 -1
  300. package/dist/services/module-metadata.service.js.map +1 -1
  301. package/dist/services/mpin.service.d.ts +67 -0
  302. package/dist/services/mpin.service.d.ts.map +1 -0
  303. package/dist/services/mpin.service.js +282 -0
  304. package/dist/services/mpin.service.js.map +1 -0
  305. package/dist/services/object.utils.d.ts +2 -0
  306. package/dist/services/object.utils.d.ts.map +1 -0
  307. package/dist/services/object.utils.js +11 -0
  308. package/dist/services/object.utils.js.map +1 -0
  309. package/dist/services/refresh-token-ids-storage.service.d.ts +25 -6
  310. package/dist/services/refresh-token-ids-storage.service.d.ts.map +1 -1
  311. package/dist/services/refresh-token-ids-storage.service.js +80 -42
  312. package/dist/services/refresh-token-ids-storage.service.js.map +1 -1
  313. package/dist/services/setting.service.d.ts.map +1 -1
  314. package/dist/services/setting.service.js +6 -1
  315. package/dist/services/setting.service.js.map +1 -1
  316. package/dist/services/settings/default-settings-provider.service.d.ts +248 -12
  317. package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -1
  318. package/dist/services/settings/default-settings-provider.service.js +143 -6
  319. package/dist/services/settings/default-settings-provider.service.js.map +1 -1
  320. package/dist/services/user.service.d.ts +2 -2
  321. package/dist/services/user.service.d.ts.map +1 -1
  322. package/dist/services/user.service.js +9 -3
  323. package/dist/services/user.service.js.map +1 -1
  324. package/dist/services/view-metadata.service.d.ts +1 -2
  325. package/dist/services/view-metadata.service.d.ts.map +1 -1
  326. package/dist/services/view-metadata.service.js +3 -55
  327. package/dist/services/view-metadata.service.js.map +1 -1
  328. package/dist/services/workflow/nodes/execution-fail.node.d.ts +6 -0
  329. package/dist/services/workflow/nodes/execution-fail.node.d.ts.map +1 -0
  330. package/dist/services/workflow/nodes/execution-fail.node.js +81 -0
  331. package/dist/services/workflow/nodes/execution-fail.node.js.map +1 -0
  332. package/dist/services/workflow/nodes/for-each.node.d.ts +2 -0
  333. package/dist/services/workflow/nodes/for-each.node.d.ts.map +1 -1
  334. package/dist/services/workflow/nodes/for-each.node.js +114 -5
  335. package/dist/services/workflow/nodes/for-each.node.js.map +1 -1
  336. package/dist/services/workflow/nodes/if.node.d.ts.map +1 -1
  337. package/dist/services/workflow/nodes/if.node.js +7 -0
  338. package/dist/services/workflow/nodes/if.node.js.map +1 -1
  339. package/dist/services/workflow/nodes/log-write.node.d.ts.map +1 -1
  340. package/dist/services/workflow/nodes/log-write.node.js +2 -0
  341. package/dist/services/workflow/nodes/log-write.node.js.map +1 -1
  342. package/dist/services/workflow/nodes/loop-until.node.d.ts +12 -0
  343. package/dist/services/workflow/nodes/loop-until.node.d.ts.map +1 -0
  344. package/dist/services/workflow/nodes/loop-until.node.js +281 -0
  345. package/dist/services/workflow/nodes/loop-until.node.js.map +1 -0
  346. package/dist/services/workflow/nodes/parallel.node.d.ts.map +1 -1
  347. package/dist/services/workflow/nodes/parallel.node.js +7 -0
  348. package/dist/services/workflow/nodes/parallel.node.js.map +1 -1
  349. package/dist/services/workflow/nodes/sequential.node.d.ts.map +1 -1
  350. package/dist/services/workflow/nodes/sequential.node.js +7 -0
  351. package/dist/services/workflow/nodes/sequential.node.js.map +1 -1
  352. package/dist/services/workflow/nodes/switch.node.d.ts.map +1 -1
  353. package/dist/services/workflow/nodes/switch.node.js +7 -0
  354. package/dist/services/workflow/nodes/switch.node.js.map +1 -1
  355. package/dist/services/workflow/workflow-definition-validator.service.d.ts.map +1 -1
  356. package/dist/services/workflow/workflow-definition-validator.service.js +5 -2
  357. package/dist/services/workflow/workflow-definition-validator.service.js.map +1 -1
  358. package/dist/services/workflow/workflow-expression.service.d.ts.map +1 -1
  359. package/dist/services/workflow/workflow-expression.service.js +5 -0
  360. package/dist/services/workflow/workflow-expression.service.js.map +1 -1
  361. package/dist/services/workflow/workflow-node-registry.service.d.ts +2 -1
  362. package/dist/services/workflow/workflow-node-registry.service.d.ts.map +1 -1
  363. package/dist/services/workflow/workflow-node-registry.service.js +7 -0
  364. package/dist/services/workflow/workflow-node-registry.service.js.map +1 -1
  365. package/dist/services/workflow/workflow-runtime.service.d.ts +8 -0
  366. package/dist/services/workflow/workflow-runtime.service.d.ts.map +1 -1
  367. package/dist/services/workflow/workflow-runtime.service.js +197 -32
  368. package/dist/services/workflow/workflow-runtime.service.js.map +1 -1
  369. package/dist/services/workflow-definition.service.d.ts +1 -1
  370. package/dist/solid-core.module.d.ts +1 -3
  371. package/dist/solid-core.module.d.ts.map +1 -1
  372. package/dist/solid-core.module.js +28 -40
  373. package/dist/solid-core.module.js.map +1 -1
  374. package/dist/testing/adapters/ui/playwright-adapter.d.ts +5 -0
  375. package/dist/testing/adapters/ui/playwright-adapter.d.ts.map +1 -1
  376. package/dist/testing/adapters/ui/playwright-adapter.js +17 -1
  377. package/dist/testing/adapters/ui/playwright-adapter.js.map +1 -1
  378. package/dist/testing/adapters/ui/ui.types.d.ts +2 -0
  379. package/dist/testing/adapters/ui/ui.types.d.ts.map +1 -1
  380. package/dist/testing/adapters/ui/ui.types.js.map +1 -1
  381. package/dist/testing/reporter/console-reporter.d.ts +3 -0
  382. package/dist/testing/reporter/console-reporter.d.ts.map +1 -1
  383. package/dist/testing/reporter/console-reporter.js +2 -0
  384. package/dist/testing/reporter/console-reporter.js.map +1 -1
  385. package/dist/testing/reporter/progress-reporter.d.ts +64 -0
  386. package/dist/testing/reporter/progress-reporter.d.ts.map +1 -0
  387. package/dist/testing/reporter/progress-reporter.js +224 -0
  388. package/dist/testing/reporter/progress-reporter.js.map +1 -0
  389. package/dist/testing/reporter/reporter.types.d.ts +3 -0
  390. package/dist/testing/reporter/reporter.types.d.ts.map +1 -1
  391. package/dist/testing/reporter/reporter.types.js.map +1 -1
  392. package/dist/testing/runner/run-from-metadata.d.ts.map +1 -1
  393. package/dist/testing/runner/run-from-metadata.js +1 -0
  394. package/dist/testing/runner/run-from-metadata.js.map +1 -1
  395. package/dist/testing/steps/ui/actions.step.d.ts.map +1 -1
  396. package/dist/testing/steps/ui/actions.step.js +6 -2
  397. package/dist/testing/steps/ui/actions.step.js.map +1 -1
  398. package/dist/testing/steps/ui/assertions.step.d.ts.map +1 -1
  399. package/dist/testing/steps/ui/assertions.step.js +11 -3
  400. package/dist/testing/steps/ui/assertions.step.js.map +1 -1
  401. package/dist/testing/steps/ui/form.step.d.ts.map +1 -1
  402. package/dist/testing/steps/ui/form.step.js +9 -3
  403. package/dist/testing/steps/ui/form.step.js.map +1 -1
  404. package/dist/testing/steps/ui/manual.step.js +1 -1
  405. package/dist/testing/steps/ui/manual.step.js.map +1 -1
  406. package/dist/testing/steps/ui/navigation.step.d.ts.map +1 -1
  407. package/dist/testing/steps/ui/navigation.step.js +3 -1
  408. package/dist/testing/steps/ui/navigation.step.js.map +1 -1
  409. package/dist/theme/theme-registry.d.ts +14 -0
  410. package/dist/theme/theme-registry.d.ts.map +1 -0
  411. package/dist/theme/theme-registry.js +147 -0
  412. package/dist/theme/theme-registry.js.map +1 -0
  413. package/dist/types/workflow-dsl.types.d.ts +14 -0
  414. package/dist/types/workflow-dsl.types.d.ts.map +1 -1
  415. package/dist/types/workflow-dsl.types.js.map +1 -1
  416. package/package.json +2 -2
  417. package/src/commands/run-tests.command.ts +64 -4
  418. package/src/commands/seed.command.ts +19 -0
  419. package/src/config/cache.options.ts +9 -1
  420. package/src/constants/chatter-message.constants.ts +12 -0
  421. package/src/constants/draft-publish-fields.ts +5 -0
  422. package/src/constants/error-messages.ts +14 -0
  423. package/src/constants/media-file-types.ts +128 -0
  424. package/src/constants/success-messages.ts +5 -0
  425. package/src/constants/user.constants.ts +13 -0
  426. package/src/controllers/authentication.controller.ts +5 -2
  427. package/src/controllers/chatter-message.controller.ts +8 -0
  428. package/src/controllers/export-template.controller.ts +5 -3
  429. package/src/controllers/import-transaction.controller.ts +6 -6
  430. package/src/controllers/media.controller.ts +17 -6
  431. package/src/controllers/module-package.controller.ts +2 -3
  432. package/src/controllers/mpin-authentication.controller.ts +67 -0
  433. package/src/dtos/basic-filters.dto.ts +0 -4
  434. package/src/dtos/change-mpin.dto.ts +18 -0
  435. package/src/dtos/create-field-metadata.dto.ts +17 -9
  436. package/src/dtos/create-model-sequence.dto.ts +1 -1
  437. package/src/dtos/mpin-login.dto.ts +24 -0
  438. package/src/dtos/setup-mpin.dto.ts +51 -0
  439. package/src/entities/common.entity.ts +24 -0
  440. package/src/entities/dashboard-user-layout.entity.ts +2 -2
  441. package/src/entities/field-metadata.entity.ts +3 -0
  442. package/src/entities/saved-filters.entity.ts +3 -3
  443. package/src/entities/user-device-credential.entity.ts +130 -0
  444. package/src/entities/user.entity.ts +53 -36
  445. package/src/entities/view-metadata.entity.ts +2 -2
  446. package/src/entities/workflow-execution-artifact.entity.ts +4 -3
  447. package/src/entities/workflow-execution-log.entity.ts +4 -3
  448. package/src/entities/workflow-execution.entity.ts +3 -2
  449. package/src/entities/workflow-secret.entity.ts +3 -2
  450. package/src/entities/workflow-step-execution.entity.ts +3 -2
  451. package/src/entities/workflow-trigger-execution.entity.ts +7 -6
  452. package/src/factories/mail.factory.ts +7 -1
  453. package/src/filters/http-exception.filter.ts +11 -1
  454. package/src/helpers/bootstrap.helper.ts +43 -6
  455. package/src/helpers/field-crud-managers/MediaFieldCrudManager.ts +90 -37
  456. package/src/helpers/file-download.helper.ts +45 -0
  457. package/src/helpers/model-metadata-helper.service.ts +32 -1
  458. package/src/helpers/security.helper.ts +35 -8
  459. package/src/helpers/solid-core-error-codes-provider.service.ts +53 -0
  460. package/src/helpers/solid-microservice-adapter.service.ts +6 -1
  461. package/src/helpers/solid-registry.ts +1 -1
  462. package/src/helpers/typeorm-db-helper.ts +12 -1
  463. package/src/index.ts +10 -0
  464. package/src/interfaces/active-user-data.interface.ts +9 -0
  465. package/src/interfaces.ts +1 -0
  466. package/src/repository/user-device-credential.repository.ts +17 -0
  467. package/src/seeders/module-metadata-seeder.service.ts +61 -39
  468. package/src/seeders/module-test-data.service.ts +6 -0
  469. package/src/seeders/seed-data/solid-core-metadata.json +290 -78
  470. package/src/services/api-key.service.ts +13 -1
  471. package/src/services/authentication.service.ts +203 -41
  472. package/src/services/chatter-message.service.ts +180 -19
  473. package/src/services/crud-helper.service.ts +35 -50
  474. package/src/services/crud.service.ts +132 -105
  475. package/src/services/datasource-introspection.service.ts +5 -0
  476. package/src/services/draft-publish-helper.service.ts +581 -0
  477. package/src/services/field-metadata.service.ts +5 -2
  478. package/src/services/internationalisation-helper.service.ts +148 -0
  479. package/src/services/media-storage.utils.ts +26 -1
  480. package/src/services/media.service.ts +68 -36
  481. package/src/services/metadata-validation.service.ts +39 -0
  482. package/src/services/model-metadata.service.ts +4 -1
  483. package/src/services/module-metadata.service.ts +10 -1
  484. package/src/services/mpin.service.ts +447 -0
  485. package/src/services/object.utils.ts +10 -0
  486. package/src/services/refresh-token-ids-storage.service.ts +229 -90
  487. package/src/services/setting.service.ts +8 -1
  488. package/src/services/settings/default-settings-provider.service.ts +154 -6
  489. package/src/services/user.service.ts +18 -3
  490. package/src/services/view-metadata.service.ts +5 -145
  491. package/src/services/workflow/nodes/execution-fail.node.ts +82 -0
  492. package/src/services/workflow/nodes/for-each.node.ts +140 -6
  493. package/src/services/workflow/nodes/if.node.ts +7 -0
  494. package/src/services/workflow/nodes/log-write.node.ts +2 -0
  495. package/src/services/workflow/nodes/loop-until.node.ts +343 -0
  496. package/src/services/workflow/nodes/parallel.node.ts +7 -0
  497. package/src/services/workflow/nodes/sequential.node.ts +7 -0
  498. package/src/services/workflow/nodes/switch.node.ts +7 -0
  499. package/src/services/workflow/workflow-definition-validator.service.ts +5 -2
  500. package/src/services/workflow/workflow-expression.service.ts +5 -0
  501. package/src/services/workflow/workflow-node-registry.service.ts +11 -0
  502. package/src/services/workflow/workflow-runtime.service.ts +274 -39
  503. package/src/solid-core.module.ts +46 -15
  504. package/src/testing/README.md +75 -3
  505. package/src/testing/adapters/ui/playwright-adapter.ts +25 -0
  506. package/src/testing/adapters/ui/ui.types.ts +2 -0
  507. package/src/testing/reporter/console-reporter.ts +4 -0
  508. package/src/testing/reporter/progress-reporter.ts +251 -0
  509. package/src/testing/reporter/reporter.types.ts +3 -0
  510. package/src/testing/runner/run-from-metadata.ts +1 -0
  511. package/src/testing/steps/ui/actions.step.ts +8 -4
  512. package/src/testing/steps/ui/assertions.step.ts +18 -5
  513. package/src/testing/steps/ui/form.step.ts +16 -6
  514. package/src/testing/steps/ui/manual.step.ts +1 -1
  515. package/src/testing/steps/ui/navigation.step.ts +4 -2
  516. package/src/theme/theme-registry.ts +181 -0
  517. package/src/types/workflow-dsl.types.ts +43 -0
@@ -4,8 +4,6 @@ import { InjectEntityManager } from '@nestjs/typeorm';
4
4
  import { CRUDService } from 'src/services/crud.service';
5
5
  import { EntityManager } from 'typeorm';
6
6
 
7
- import { classify } from '../helpers/string.helper';
8
- import { Locale } from 'src/entities/locale.entity';
9
7
  import { ModelMetadataHelperService } from 'src/helpers/model-metadata-helper.service';
10
8
  import { SolidRegistry } from 'src/helpers/solid-registry';
11
9
  import { ModelMetadataRepository } from 'src/repository/model-metadata.repository';
@@ -197,64 +195,6 @@ export class ViewMetadataService extends CRUDService<ViewMetadata> {
197
195
  return this.getDefaultWorkflowFieldData(workflowField, workflowFieldName, fieldsMap);
198
196
  }
199
197
 
200
- //for locales
201
- private async getEntityRecordsInAllLocales(
202
- modelName: string,
203
- id: string,
204
- defaultEntityLocaleIdFromQuery?: string
205
- ): Promise<{ records: any[], defaultEntityLocaleId: string | null }> {
206
- const solidRegistry = await this.moduleRef.get(SolidRegistry, { strict: false });
207
- // const currentEntityTarget = solidRegistry.getEntityTarget(this.entityManager, classify(modelName));
208
- const currentEntityRepository = this.entityManager.getRepository(classify(modelName));
209
-
210
- // Case 1: Creating a new record with no defaultEntityLocaleId to clone
211
- if (id === 'new' && !defaultEntityLocaleIdFromQuery) {
212
- this.logger.debug(`Creating new record without cloning from any defaultEntityLocaleId.`);
213
- return { records: [], defaultEntityLocaleId: null };
214
- }
215
-
216
- // Case 2: Creating a new record and cloning from an existing defaultEntityLocaleId
217
- if (id === 'new' && defaultEntityLocaleIdFromQuery) {
218
- this.logger.debug(`Creating new record by cloning translations from defaultEntityLocaleId: ${defaultEntityLocaleIdFromQuery}`);
219
-
220
- const records = await currentEntityRepository.find({
221
- where: [
222
- { defaultEntityLocaleId: defaultEntityLocaleIdFromQuery },
223
- { id: defaultEntityLocaleIdFromQuery }
224
- ]
225
- });
226
-
227
- this.logger.debug(`Found ${records.length} cloned records for new entity.`);
228
- return { records, defaultEntityLocaleId: defaultEntityLocaleIdFromQuery };
229
- }
230
-
231
- // Case 3: Editing an existing entity
232
- const entityRecord = await currentEntityRepository.findOne({ where: { id } });
233
-
234
- if (!entityRecord) {
235
- this.logger.warn(`No entity found for id ${id}`);
236
- return { records: [], defaultEntityLocaleId: null };
237
- }
238
-
239
- const defaultEntityLocaleId = entityRecord.defaultEntityLocaleId || entityRecord.id;
240
- if (entityRecord.defaultEntityLocaleId) {
241
- this.logger.debug(`Editing translated locale record. Translation root id: ${defaultEntityLocaleId}`);
242
- } else {
243
- this.logger.debug(`Editing translation root record with id ${defaultEntityLocaleId}`);
244
- }
245
-
246
- const records = await currentEntityRepository.find({
247
- where: [
248
- { defaultEntityLocaleId: defaultEntityLocaleId },
249
- { id: defaultEntityLocaleId }
250
- ]
251
- });
252
-
253
- this.logger.debug(`Found ${records.length} records in all locales for existing entity.`);
254
-
255
- return { records, defaultEntityLocaleId };
256
- }
257
-
258
198
  // START: Custom Service Methods
259
199
  async getLayout(query, activeUser) {
260
200
  let { modelName, moduleName, viewType, id, populate, menuItemId, menuItemName, actionId, actionName } = query;
@@ -432,92 +372,12 @@ export class ViewMetadataService extends CRUDService<ViewMetadata> {
432
372
  * ]
433
373
  */
434
374
 
435
- const applicableLocales: any = []
436
- // if (entity.model.internationalisation) {
437
- // const allLocales = await this.entityManager.getRepository(Locale).find({});
438
-
439
- // if (id === 'new') {
440
- // allLocales.forEach(locale => {
441
- // applicableLocales.push({
442
- // locale: locale.locale,
443
- // displayName: locale.displayName,
444
- // isDefault: locale.isDefault ? 'yes' : 'no',
445
- // defaultEntityLocaleId: null,
446
- // entityId: null
447
- // });
448
- // });
449
- // }
450
- // else {
451
- // const defaultLocale = allLocales.find(locale => locale.isDefault);
452
- // this.logger.debug(`Default locale is: ${defaultLocale.locale}`);
453
-
454
- // // Get hold of the repository for the current model
455
- // const solidRegistry = await this.moduleRef.get(SolidRegistry, { strict: false });
456
- // const currentEntityTarget = solidRegistry.getEntityTarget(this.entityManager, classify(modelName));
457
- // const currentEntityRepository = this.entityManager.getRepository(currentEntityTarget);
458
-
459
- // // We are in edit mode, the id that is being edited could be a record tagged with the default locale or it could be tagged with a non-default locale.
460
- // const entityRecord = await currentEntityRepository.findOne({
461
- // where: {
462
- // id: id,
463
- // }
464
- // });
465
- // if(entityRecord){
466
- // // Resolve the default entity locale id....
467
- // let defaultEntityLocaleId = null;
468
- // if (entityRecord.localeName === defaultLocale.locale) {
469
- // defaultEntityLocaleId = entityRecord.id;
470
- // this.logger.debug(`You are editing a record tagged with the default locale: ${entityRecord.localeName}.`);
471
- // }
472
- // else {
473
- // defaultEntityLocaleId = entityRecord.defaultEntityLocaleId;
474
- // this.logger.debug(`You are editing a record tagged with the non-default locale: ${entityRecord.localeName}. `);
475
- // }
476
- // this.logger.debug(`Identified default Entity Locale Id: ${defaultEntityLocaleId}`);
477
-
478
- // // Now we query for all records in the same model matching the defaultEntityLocaleId
479
- // // Get all records mathcing the defaultEntityLocaleId or where the id is same as the defaultEntityLocaleId
480
- // const entityRecordsInAllLocales = await currentEntityRepository.find({
481
- // where: [
482
- // { defaultEntityLocaleId: defaultEntityLocaleId },
483
- // { id: defaultEntityLocaleId }
484
- // ],
485
- // });
486
- // this.logger.debug(`Found ${entityRecordsInAllLocales.length} records in all locales for the defaultEntityLocaleId: ${defaultEntityLocaleId}`);
487
-
488
- // // Loop over all locales and populate the applicableLocales array
489
- // for (const locale of allLocales) {
490
- // // Find the record in the entityRecordsInAllLocales that matches the current locale
491
- // const matchingRecord = entityRecordsInAllLocales.find(record => record.localeName === locale.locale);
492
-
493
- // applicableLocales.push({
494
- // locale: locale.locale,
495
- // displayName: locale.displayName,
496
- // isDefault: locale.isDefault ? 'yes' : 'no',
497
- // defaultEntityLocaleId: defaultEntityLocaleId,
498
- // entityId: (matchingRecord ? matchingRecord.id : null)
499
- // });
500
- // }
501
- // }else{
502
- // this.logger.warn(`No record found for id: ${id} in model: ${modelName}. Cannot determine applicable locales.`);
503
- // }
504
- // }
505
- // }
375
+ let applicableLocales: any[] = [];
506
376
  if (entity.model.internationalisation) {
507
- const defaultEntityLocaleIdFromQuery = query?.defaultEntityLocaleId;
508
- const { records: entityRecordsInAllLocales, defaultEntityLocaleId } =
509
- await this.getEntityRecordsInAllLocales(modelName, id, defaultEntityLocaleIdFromQuery);
510
- const allLocales = await this.entityManager.getRepository(Locale).find({});
511
- for (const locale of allLocales) {
512
- const matchingRecord = entityRecordsInAllLocales.find(record => record.localeName === locale.locale);
513
- applicableLocales.push({
514
- locale: locale.locale,
515
- displayName: locale.displayName,
516
- isDefault: locale.isDefault ? 'yes' : 'no',
517
- defaultEntityLocaleId: defaultEntityLocaleId,
518
- entityId: matchingRecord ? matchingRecord.id : null
519
- });
520
- }
377
+ const draftPublishEnabled = entity.model.draftPublishWorkflow === true;
378
+ applicableLocales = await this.internationalisationHelperService.buildApplicableLocales(
379
+ this.entityManager, modelName, id, query?.defaultEntityLocaleId, draftPublishEnabled,
380
+ );
521
381
  }
522
382
 
523
383
  const r = {
@@ -0,0 +1,82 @@
1
+ import { BadRequestException } from '@nestjs/common';
2
+ import { WorkflowNodeProvider } from '../../../decorators/workflow-node-provider.decorator';
3
+ import { WorkflowNodeHandler } from '../../../interfaces/workflow-node-handler.interface';
4
+ import {
5
+ WorkflowNodeExecutionContext,
6
+ WorkflowNodeHandlerResult,
7
+ } from '../../../types/workflow-dsl.types';
8
+
9
+ @WorkflowNodeProvider({
10
+ type: 'execution.fail',
11
+ kind: 'task',
12
+ version: '1.0.0',
13
+ category: 'core',
14
+ subcategory: 'execution',
15
+ label: 'Fail Execution',
16
+ description: 'Fails intentionally with a configured message.',
17
+ tags: ['failure', 'error', 'testing'],
18
+ aliases: ['fail'],
19
+ configSchema: {
20
+ type: 'object',
21
+ properties: {
22
+ message: {
23
+ type: 'string',
24
+ default: 'Execution failed intentionally.',
25
+ },
26
+ },
27
+ },
28
+ authoring: {
29
+ defaultConfiguration: {
30
+ message: 'Execution failed intentionally.',
31
+ },
32
+ configurationFields: [
33
+ {
34
+ key: 'message',
35
+ label: 'Message',
36
+ description: 'Failure message. Expressions are allowed.',
37
+ valueType: 'string',
38
+ expressionAllowed: true,
39
+ group: 'General',
40
+ },
41
+ ],
42
+ supportsExpressions: true,
43
+ supportsDisableToggle: true,
44
+ supportsName: true,
45
+ supportsDescription: true,
46
+ searchableText: ['fail', 'failure', 'error', 'testing'],
47
+ },
48
+ runtime: {
49
+ emitsLogs: false,
50
+ emitsArtifacts: false,
51
+ deterministicOutputs: true,
52
+ executionMode: 'task',
53
+ successStatuses: [],
54
+ },
55
+ documentation: {
56
+ summary:
57
+ 'Use this node in reference workflows and tests to intentionally exercise failure paths and error handlers.',
58
+ },
59
+ ui: {
60
+ icon: 'si-x-circle',
61
+ iconColor: '#dc2626',
62
+ iconBackgroundColor: '#fee2e2',
63
+ iconBorderColor: '#fecaca',
64
+ modalSize: 'lg',
65
+ layoutHints: {
66
+ groupOrder: ['General'],
67
+ },
68
+ },
69
+ })
70
+ export class ExecutionFailNode implements WorkflowNodeHandler {
71
+ async execute(
72
+ context: WorkflowNodeExecutionContext,
73
+ ): Promise<WorkflowNodeHandlerResult> {
74
+ const configuration = context.expression.interpolate(
75
+ context.node.configuration ?? {},
76
+ context,
77
+ );
78
+ throw new BadRequestException(
79
+ configuration.message ?? 'Execution failed intentionally.',
80
+ );
81
+ }
82
+ }
@@ -16,6 +16,8 @@ import {
16
16
  authoring: {
17
17
  defaultConfiguration: {
18
18
  items: '',
19
+ concurrencyLimit: 1,
20
+ aggregateOutputs: false,
19
21
  },
20
22
  configurationFields: [
21
23
  {
@@ -32,6 +34,35 @@ import {
32
34
  },
33
35
  },
34
36
  },
37
+ {
38
+ key: 'concurrencyLimit',
39
+ label: 'Concurrency Limit',
40
+ description:
41
+ 'Maximum number of loop iterations to run at once. Use 1 for sequential execution and 0 for unlimited concurrency.',
42
+ valueType: 'number',
43
+ defaultValue: 1,
44
+ expressionAllowed: true,
45
+ group: 'General',
46
+ },
47
+ {
48
+ key: 'aggregateOutputs',
49
+ label: 'Aggregate Outputs',
50
+ description:
51
+ 'Adds per-iteration child outputs to this forEach node output for downstream expressions.',
52
+ valueType: 'boolean',
53
+ defaultValue: false,
54
+ expressionAllowed: true,
55
+ group: 'General',
56
+ },
57
+ {
58
+ key: 'outputKey',
59
+ label: 'Output Key',
60
+ description:
61
+ 'Optional expression used as the per-iteration key when aggregate outputs is enabled.',
62
+ valueType: 'string',
63
+ expressionAllowed: true,
64
+ group: 'General',
65
+ },
35
66
  ],
36
67
  childSlots: [
37
68
  {
@@ -42,6 +73,13 @@ import {
42
73
  layout: 'sequential',
43
74
  required: true,
44
75
  },
76
+ {
77
+ key: 'errors',
78
+ label: 'Errors',
79
+ description: 'Nodes that run sequentially if this loop fails.',
80
+ kind: 'sequence',
81
+ layout: 'sequential',
82
+ },
45
83
  ],
46
84
  supportsDescription: true,
47
85
  supportsName: true,
@@ -66,32 +104,128 @@ export class ForEachNode implements WorkflowNodeHandler {
66
104
  ): Promise<WorkflowNodeHandlerResult> {
67
105
  const configuration = context.node.configuration ?? {};
68
106
  const items = context.expression.interpolate(configuration.items ?? [], context);
107
+ const concurrencyLimit = this.resolveConcurrencyLimit(
108
+ context.expression.interpolate(configuration.concurrencyLimit ?? 1, context),
109
+ );
110
+ const aggregateOutputs = Boolean(
111
+ context.expression.interpolate(configuration.aggregateOutputs ?? false, context),
112
+ );
69
113
 
70
114
  if (!Array.isArray(items)) {
71
115
  throw new BadRequestException('forEach requires configuration.items array.');
72
116
  }
73
117
 
74
118
  const childNodes = context.node.tasks ?? [];
119
+ const iterationsByIndex: Record<number, any> = {};
120
+ const iterationsByKey: Record<string, any> = {};
121
+ const shouldAggregateByKey =
122
+ aggregateOutputs && configuration.outputKey !== undefined && configuration.outputKey !== null;
75
123
 
76
- for (let index = 0; index < items.length; index++) {
124
+ await this.runIterations(items, concurrencyLimit, async (item, index) => {
77
125
  const inheritedOutputs = context.outputs ?? {};
78
126
  const iterationOutputs = { ...inheritedOutputs };
79
-
80
- await context.runNodes(childNodes, {
81
- item: items[index],
127
+ const parentLoops = context.loops ?? [];
128
+ const currentLoop = {
129
+ item,
130
+ index,
131
+ nodeId: context.node.id,
132
+ stepExecutionKey: context.stepExecution.stepExecutionKey,
133
+ };
134
+ const loopContext = {
135
+ item,
82
136
  index,
137
+ parent: parentLoops[parentLoops.length - 1],
138
+ parents: [...parentLoops].reverse(),
139
+ loops: [...parentLoops, currentLoop],
140
+ };
141
+ const outputKey = shouldAggregateByKey
142
+ ? String(context.expression.interpolate(configuration.outputKey, {
143
+ ...context,
144
+ ...loopContext,
145
+ outputs: iterationOutputs,
146
+ }))
147
+ : undefined;
148
+
149
+ const childOutputs = await context.runNodes(childNodes, {
150
+ ...loopContext,
83
151
  outputs: iterationOutputs,
84
152
  });
85
- }
153
+
154
+ if (aggregateOutputs) {
155
+ const iterationResult = {
156
+ item,
157
+ index,
158
+ outputs: childOutputs,
159
+ };
160
+
161
+ iterationsByIndex[index] = iterationResult;
162
+ if (outputKey !== undefined) {
163
+ iterationsByKey[outputKey] = iterationResult;
164
+ }
165
+ }
166
+ });
86
167
 
87
168
  return {
88
169
  output: {
89
170
  count: items.length,
90
171
  childNodeIds: childNodes.map((childNode) => childNode.id),
172
+ concurrencyLimit,
91
173
  // Keep the control-node output intentionally small. Per-iteration
92
174
  // outputs are already stored on the child workflowStepExecution rows.
93
- iterationOutputsStoredOnSteps: true,
175
+ iterationOutputsStoredOnSteps: !aggregateOutputs,
176
+ ...(aggregateOutputs
177
+ ? {
178
+ iterations: {
179
+ byIndex: iterationsByIndex,
180
+ ...(shouldAggregateByKey
181
+ ? {
182
+ byKey: iterationsByKey,
183
+ }
184
+ : {}),
185
+ },
186
+ }
187
+ : {}),
94
188
  },
95
189
  };
96
190
  }
191
+
192
+ private resolveConcurrencyLimit(value: any): number {
193
+ const parsed = Number(value === '' || value === null || value === undefined ? 1 : value);
194
+ if (!Number.isFinite(parsed) || parsed < 0) {
195
+ throw new BadRequestException(
196
+ 'forEach configuration.concurrencyLimit must be 0 or a positive number.',
197
+ );
198
+ }
199
+
200
+ return Math.floor(parsed);
201
+ }
202
+
203
+ private async runIterations<T>(
204
+ items: T[],
205
+ concurrencyLimit: number,
206
+ handler: (item: T, index: number) => Promise<void>,
207
+ ): Promise<void> {
208
+ if (concurrencyLimit === 1 || items.length <= 1) {
209
+ for (let index = 0; index < items.length; index++) {
210
+ await handler(items[index], index);
211
+ }
212
+ return;
213
+ }
214
+
215
+ const limit = concurrencyLimit === 0 ? items.length : concurrencyLimit;
216
+ let nextIndex = 0;
217
+
218
+ const workers = Array.from(
219
+ { length: Math.min(limit, items.length) },
220
+ async () => {
221
+ while (nextIndex < items.length) {
222
+ const index = nextIndex;
223
+ nextIndex += 1;
224
+ await handler(items[index], index);
225
+ }
226
+ },
227
+ );
228
+
229
+ await Promise.all(workers);
230
+ }
97
231
  }
@@ -42,6 +42,13 @@ import {
42
42
  description: 'Nodes that run when the condition evaluates to false.',
43
43
  kind: 'sequence',
44
44
  },
45
+ {
46
+ key: 'errors',
47
+ label: 'Errors',
48
+ description: 'Nodes that run sequentially if the selected branch fails.',
49
+ kind: 'sequence',
50
+ layout: 'sequential',
51
+ },
45
52
  ],
46
53
  supportsDescription: true,
47
54
  supportsName: true,
@@ -162,6 +162,7 @@ import {
162
162
  description: 'The resolved log level.',
163
163
  valueType: 'string',
164
164
  path: 'level',
165
+ includeInRuntimeContext: false,
165
166
  },
166
167
  {
167
168
  key: 'message',
@@ -169,6 +170,7 @@ import {
169
170
  description: 'The rendered log message.',
170
171
  valueType: 'string',
171
172
  path: 'message',
173
+ includeInRuntimeContext: false,
172
174
  },
173
175
  ],
174
176
  supportsExpressions: true,