@flowdular/sdk 0.2.3 → 0.3.0

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 (912) hide show
  1. package/.ai/agents/sandbox/business-manager.md +5 -1
  2. package/.ai/blueprints/author-spec/README.md +1 -1
  3. package/.ai/blueprints/author-spec/spec-requirements.yaml +44 -0
  4. package/.ai/blueprints/author-spec/steps.yaml +5 -5
  5. package/.ai/blueprints/author-spec/templates/module.yaml +99 -3
  6. package/.ai/blueprints/edit-module/gates.yaml +4 -0
  7. package/.ai/blueprints/edit-module/required-files.yaml +9 -0
  8. package/.ai/blueprints/new-module/gates.yaml +4 -0
  9. package/.ai/blueprints/new-module/spec-requirements.yaml +2 -2
  10. package/.ai/blueprints/release/gates.yaml +4 -0
  11. package/.ai/platform-capabilities.md +128 -0
  12. package/.ai/policies/capabilities.yaml +100 -0
  13. package/.ai/policies/path-ownership.yaml +5 -2
  14. package/.ai/policies/task-budgets.yaml +5 -3
  15. package/.ai/references/catalog/module.json +4 -4
  16. package/.ai/references/catalog/package.json +2 -2
  17. package/.ai/references/catalog/spec/module.yaml +5 -3
  18. package/.ai/references/catalog/src/platform.ts +2 -0
  19. package/.ai/references/catalog/src/services/catalog-service.ts +89 -1
  20. package/.ai/references/catalog/src/services/data-classes.ts +47 -0
  21. package/.ai/references/catalog/src/services/database-repository.ts +98 -1
  22. package/.ai/references/catalog/src/services/repository.ts +22 -1
  23. package/.ai/references/catalog/tests/data-classes.test.ts +157 -0
  24. package/.ai/references/catalog.provenance.json +12 -10
  25. package/.ai/skills/README.md +10 -0
  26. package/.ai/skills/agent-tool-design/SKILL.md +1 -2
  27. package/.ai/skills/auth-security-review/SKILL.md +1 -1
  28. package/.ai/skills/business-agent-design/SKILL.md +0 -1
  29. package/.ai/skills/deploy-operate/SKILL.md +114 -0
  30. package/.ai/skills/module-new/SKILL.md +29 -3
  31. package/.ai/skills/module-update/SKILL.md +9 -3
  32. package/.ai/skills/perf-audit/SKILL.md +0 -1
  33. package/.ai/skills/release-eject-pr/SKILL.md +0 -1
  34. package/.ai/skills/spec-interview/SKILL.md +120 -0
  35. package/.ai/skills/test-hardening/SKILL.md +1 -0
  36. package/.ai/skills/ux-design/SKILL.md +34 -3
  37. package/.ai/skills/variables/SKILL.md +0 -2
  38. package/.ai/skills/workflow-development/SKILL.md +0 -1
  39. package/AGENTS.md +4 -0
  40. package/docs/agent-contract.md +2 -2
  41. package/docs/design-system.md +185 -31
  42. package/modules/access/migrations/0001_access_core.down.sql +1 -0
  43. package/modules/access/migrations/0001_access_core.up.sql +28 -0
  44. package/modules/access/migrations/README.md +3 -0
  45. package/modules/access/module.json +33 -0
  46. package/modules/access/package.json +43 -0
  47. package/modules/access/spec/module.yaml +225 -0
  48. package/modules/access/src/acl/permissions.ts +6 -0
  49. package/modules/access/src/api/endpoints.ts +244 -0
  50. package/modules/access/src/client/ActivityView.tsrx +245 -0
  51. package/modules/access/src/client/AttestationsView.tsrx +176 -0
  52. package/modules/access/src/client/ReviewView.tsrx +586 -0
  53. package/modules/access/src/client/api.ts +132 -0
  54. package/modules/access/src/client/contribution.tsrx +41 -0
  55. package/modules/access/src/client/index.ts +41 -0
  56. package/modules/access/src/client/navigation.ts +57 -0
  57. package/modules/access/src/client/presentation.ts +69 -0
  58. package/modules/access/src/client/state.ts +72 -0
  59. package/modules/access/src/domain/types.ts +189 -0
  60. package/modules/access/src/index.ts +38 -0
  61. package/modules/access/src/platform.ts +60 -0
  62. package/modules/access/src/server/index.ts +42 -0
  63. package/modules/access/src/server/runtime.ts +105 -0
  64. package/modules/access/src/services/access-service.ts +298 -0
  65. package/modules/access/src/services/audit-window.ts +78 -0
  66. package/modules/access/src/services/auth-directory.ts +72 -0
  67. package/modules/access/src/services/changes.ts +91 -0
  68. package/modules/access/src/services/data-classes.ts +28 -0
  69. package/modules/access/src/services/database-repository.ts +185 -0
  70. package/modules/access/src/services/directory.ts +102 -0
  71. package/modules/access/src/services/index.ts +33 -0
  72. package/modules/access/src/services/list-exports.ts +150 -0
  73. package/modules/access/src/services/migration.ts +54 -0
  74. package/modules/access/src/services/repository.ts +30 -0
  75. package/modules/access/src/services/review.ts +178 -0
  76. package/modules/access/translations/en.json +155 -0
  77. package/modules/access/translations/pl.json +155 -0
  78. package/modules/agents/migrations/0022_credential_rotation_inventory.down.sql +2 -0
  79. package/modules/agents/migrations/0022_credential_rotation_inventory.up.sql +7 -0
  80. package/modules/agents/migrations/0023_agents_retention_indexes.down.sql +2 -0
  81. package/modules/agents/migrations/0023_agents_retention_indexes.up.sql +9 -0
  82. package/modules/agents/migrations/0024_agent_meter_refusals.down.sql +3 -0
  83. package/modules/agents/migrations/0024_agent_meter_refusals.up.sql +22 -0
  84. package/modules/agents/migrations/0025_agent_list_indexes.down.sql +3 -0
  85. package/modules/agents/migrations/0025_agent_list_indexes.up.sql +11 -0
  86. package/modules/agents/module.json +30 -4
  87. package/modules/agents/package.json +3 -2
  88. package/modules/agents/spec/module.yaml +63 -5
  89. package/modules/agents/src/api/endpoints.ts +291 -33
  90. package/modules/agents/src/cli/commands.json +11 -0
  91. package/modules/agents/src/cli/index.ts +45 -0
  92. package/modules/agents/src/client/AgentDashboardWidget.tsrx +19 -11
  93. package/modules/agents/src/client/AgentDefinitionList.tsrx +53 -10
  94. package/modules/agents/src/client/AgentPlaygroundView.tsrx +4 -4
  95. package/modules/agents/src/client/AgentProceduresView.tsrx +2 -2
  96. package/modules/agents/src/client/AgentRunsView.tsrx +143 -40
  97. package/modules/agents/src/client/AgentsView.tsrx +109 -33
  98. package/modules/agents/src/client/api.ts +99 -21
  99. package/modules/agents/src/client/state.ts +97 -0
  100. package/modules/agents/src/domain/types.ts +44 -4
  101. package/modules/agents/src/platform.ts +42 -0
  102. package/modules/agents/src/server/action-execution.ts +201 -106
  103. package/modules/agents/src/server/runtime.ts +32 -0
  104. package/modules/agents/src/services/agent-service.ts +158 -30
  105. package/modules/agents/src/services/credential-rotation.ts +185 -0
  106. package/modules/agents/src/services/credential-vault.ts +71 -46
  107. package/modules/agents/src/services/data-classes.ts +176 -0
  108. package/modules/agents/src/services/database-repository.ts +393 -101
  109. package/modules/agents/src/services/metering.ts +111 -0
  110. package/modules/agents/src/services/migration.ts +109 -0
  111. package/modules/agents/src/services/module-agent-preflight.ts +17 -9
  112. package/modules/agents/src/services/notifications.ts +98 -0
  113. package/modules/agents/src/services/provider-repository.ts +9 -18
  114. package/modules/agents/src/services/provider-service.ts +1 -9
  115. package/modules/agents/src/services/reports.ts +107 -0
  116. package/modules/agents/src/services/repository.ts +86 -6
  117. package/modules/agents/src/services/usage-service.ts +2 -0
  118. package/modules/agents/src/services/worker.ts +114 -4
  119. package/modules/agents/src/settings.ts +14 -3
  120. package/modules/agents/translations/en.json +14 -4
  121. package/modules/agents/translations/pl.json +14 -4
  122. package/modules/approvals/migrations/0001_approvals_core.down.sql +3 -0
  123. package/modules/approvals/migrations/0001_approvals_core.up.sql +78 -0
  124. package/modules/approvals/migrations/0002_approvals_expiry_routing_role.down.sql +2 -0
  125. package/modules/approvals/migrations/0002_approvals_expiry_routing_role.up.sql +19 -0
  126. package/modules/approvals/migrations/0003_approvals_retention_indexes.down.sql +6 -0
  127. package/modules/approvals/migrations/0003_approvals_retention_indexes.up.sql +14 -0
  128. package/modules/approvals/migrations/0004_approvals_inbox_keyset_indexes.down.sql +5 -0
  129. package/modules/approvals/migrations/0004_approvals_inbox_keyset_indexes.up.sql +12 -0
  130. package/modules/approvals/migrations/README.md +3 -0
  131. package/modules/approvals/module.json +34 -0
  132. package/modules/approvals/package.json +43 -0
  133. package/modules/approvals/spec/module.yaml +318 -0
  134. package/modules/approvals/src/acl/permissions.ts +7 -0
  135. package/modules/approvals/src/api/endpoints.ts +457 -0
  136. package/modules/approvals/src/client/ApprovalRequestDrawer.tsrx +138 -0
  137. package/modules/approvals/src/client/ApprovalsView.tsrx +562 -0
  138. package/modules/approvals/src/client/PendingCountWidget.tsrx +52 -0
  139. package/modules/approvals/src/client/api.ts +203 -0
  140. package/modules/approvals/src/client/approvals.css +51 -0
  141. package/modules/approvals/src/client/contribution.tsrx +44 -0
  142. package/modules/approvals/src/client/index.ts +26 -0
  143. package/modules/approvals/src/client/navigation.ts +39 -0
  144. package/modules/approvals/src/client/pending-count.ts +26 -0
  145. package/modules/approvals/src/client/presentation.ts +52 -0
  146. package/modules/approvals/src/client/state.ts +141 -0
  147. package/modules/approvals/src/domain/capability.ts +95 -0
  148. package/modules/approvals/src/domain/types.ts +154 -0
  149. package/modules/approvals/src/index.ts +52 -0
  150. package/modules/approvals/src/platform.ts +128 -0
  151. package/modules/approvals/src/server/index.ts +42 -0
  152. package/modules/approvals/src/server/runtime.ts +181 -0
  153. package/modules/approvals/src/services/approvals-service.ts +557 -0
  154. package/modules/approvals/src/services/callbacks.ts +75 -0
  155. package/modules/approvals/src/services/data-classes.ts +167 -0
  156. package/modules/approvals/src/services/database-repository.ts +724 -0
  157. package/modules/approvals/src/services/eligibility.ts +121 -0
  158. package/modules/approvals/src/services/expiry-runner.ts +81 -0
  159. package/modules/approvals/src/services/index.ts +31 -0
  160. package/modules/approvals/src/services/migration.ts +222 -0
  161. package/modules/approvals/src/services/notifications.ts +95 -0
  162. package/modules/approvals/src/services/repository.ts +161 -0
  163. package/modules/approvals/src/services/service-error.ts +70 -0
  164. package/modules/approvals/src/settings.ts +102 -0
  165. package/modules/approvals/translations/en.json +104 -0
  166. package/modules/approvals/translations/pl.json +104 -0
  167. package/modules/audit/migrations/0001_audit_core.down.sql +8 -0
  168. package/modules/audit/migrations/0001_audit_core.up.sql +107 -0
  169. package/modules/audit/migrations/0002_audit_sweep_routing_role.down.sql +2 -0
  170. package/modules/audit/migrations/0002_audit_sweep_routing_role.up.sql +21 -0
  171. package/modules/audit/migrations/0003_audit_export_request.down.sql +12 -0
  172. package/modules/audit/migrations/0003_audit_export_request.up.sql +40 -0
  173. package/modules/audit/migrations/0004_audit_hold_seal_erasure.down.sql +17 -0
  174. package/modules/audit/migrations/0004_audit_hold_seal_erasure.up.sql +192 -0
  175. package/modules/audit/migrations/0005_audit_event_format.down.sql +17 -0
  176. package/modules/audit/migrations/0005_audit_event_format.up.sql +60 -0
  177. package/modules/audit/migrations/0006_audit_own_class_walks.down.sql +3 -0
  178. package/modules/audit/migrations/0006_audit_own_class_walks.up.sql +14 -0
  179. package/modules/audit/migrations/README.md +3 -0
  180. package/modules/audit/module.json +32 -0
  181. package/modules/audit/package.json +49 -0
  182. package/modules/audit/spec/module.yaml +809 -0
  183. package/modules/audit/src/acl/permissions.ts +7 -0
  184. package/modules/audit/src/api/endpoints.ts +315 -0
  185. package/modules/audit/src/cli/commands.json +95 -0
  186. package/modules/audit/src/cli/index.ts +658 -0
  187. package/modules/audit/src/client/DataClassesView.tsrx +420 -0
  188. package/modules/audit/src/client/ExportsView.tsrx +256 -0
  189. package/modules/audit/src/client/HoldsView.tsrx +604 -0
  190. package/modules/audit/src/client/SweepsView.tsrx +251 -0
  191. package/modules/audit/src/client/api.ts +185 -0
  192. package/modules/audit/src/client/contribution.tsrx +52 -0
  193. package/modules/audit/src/client/index.ts +23 -0
  194. package/modules/audit/src/client/navigation.ts +74 -0
  195. package/modules/audit/src/client/presentation.ts +105 -0
  196. package/modules/audit/src/client/state.ts +86 -0
  197. package/modules/audit/src/domain/data-classes.ts +16 -0
  198. package/modules/audit/src/domain/types.ts +339 -0
  199. package/modules/audit/src/index.ts +76 -0
  200. package/modules/audit/src/platform.ts +44 -0
  201. package/modules/audit/src/server/index.ts +177 -0
  202. package/modules/audit/src/server/runtime.ts +303 -0
  203. package/modules/audit/src/services/anchor-key.ts +143 -0
  204. package/modules/audit/src/services/anchor-rotation.ts +147 -0
  205. package/modules/audit/src/services/audit-runners.ts +278 -0
  206. package/modules/audit/src/services/backup-guard.ts +95 -0
  207. package/modules/audit/src/services/database-repository.ts +1946 -0
  208. package/modules/audit/src/services/declared-classes.ts +64 -0
  209. package/modules/audit/src/services/erasure-port.ts +126 -0
  210. package/modules/audit/src/services/erasure-service.ts +770 -0
  211. package/modules/audit/src/services/export-directory.ts +106 -0
  212. package/modules/audit/src/services/export-service.ts +714 -0
  213. package/modules/audit/src/services/hold-service.ts +295 -0
  214. package/modules/audit/src/services/index.ts +17 -0
  215. package/modules/audit/src/services/migration.ts +658 -0
  216. package/modules/audit/src/services/own-classes.ts +318 -0
  217. package/modules/audit/src/services/platform-version.ts +23 -0
  218. package/modules/audit/src/services/repository.ts +495 -0
  219. package/modules/audit/src/services/retention-service.ts +191 -0
  220. package/modules/audit/src/services/seal-service.ts +769 -0
  221. package/modules/audit/src/services/service-error.ts +61 -0
  222. package/modules/audit/src/services/subject-keys.ts +90 -0
  223. package/modules/audit/src/services/sweep-service.ts +298 -0
  224. package/modules/audit/src/services/zip.ts +217 -0
  225. package/modules/audit/src/settings.ts +69 -0
  226. package/modules/audit/translations/en.json +210 -0
  227. package/modules/audit/translations/pl.json +210 -0
  228. package/modules/auth/README.md +77 -29
  229. package/modules/auth/migrations/0016_external_identities.up.sql +16 -0
  230. package/modules/auth/migrations/0017_mfa_key_id.up.sql +8 -0
  231. package/modules/auth/migrations/0018_retire_bundled_module_scopes.up.sql +29 -0
  232. package/modules/auth/migrations/0019_notifications_member_scopes.up.sql +44 -0
  233. package/modules/auth/migrations/0020_identity_providers.up.sql +61 -0
  234. package/modules/auth/migrations/0021_membership_status.up.sql +19 -0
  235. package/modules/auth/migrations/0022_auth_provider_scopes.up.sql +45 -0
  236. package/modules/auth/migrations/0023_enterprise_module_scopes.down.sql +19 -0
  237. package/modules/auth/migrations/0023_enterprise_module_scopes.up.sql +71 -0
  238. package/modules/auth/migrations/0024_approvals_member_scopes.down.sql +22 -0
  239. package/modules/auth/migrations/0024_approvals_member_scopes.up.sql +48 -0
  240. package/modules/auth/migrations/0025_audit_holds_owner_scope.down.sql +21 -0
  241. package/modules/auth/migrations/0025_audit_holds_owner_scope.up.sql +47 -0
  242. package/modules/auth/migrations/0026_auth_export_keyset_indexes.down.sql +6 -0
  243. package/modules/auth/migrations/0026_auth_export_keyset_indexes.up.sql +15 -0
  244. package/modules/auth/migrations/0027_workflow_automation_profile_scopes.down.sql +34 -0
  245. package/modules/auth/migrations/0027_workflow_automation_profile_scopes.up.sql +72 -0
  246. package/modules/auth/migrations/0028_auth_member_search_prefix_indexes.down.sql +6 -0
  247. package/modules/auth/migrations/0028_auth_member_search_prefix_indexes.up.sql +21 -0
  248. package/modules/auth/migrations/0029_reports_exports_access_scopes.down.sql +22 -0
  249. package/modules/auth/migrations/0029_reports_exports_access_scopes.up.sql +56 -0
  250. package/modules/auth/migrations/0030_auth_membership_keyset_index.down.sql +4 -0
  251. package/modules/auth/migrations/0030_auth_membership_keyset_index.up.sql +10 -0
  252. package/modules/auth/migrations/0031_membership_scope_backfills_under_rls.down.sql +4 -0
  253. package/modules/auth/migrations/0031_membership_scope_backfills_under_rls.up.sql +31 -0
  254. package/modules/auth/migrations/0032_audit_actor_service.down.sql +9 -0
  255. package/modules/auth/migrations/0032_audit_actor_service.up.sql +10 -0
  256. package/modules/auth/migrations/0033_auth_account_keyset_indexes.down.sql +5 -0
  257. package/modules/auth/migrations/0033_auth_account_keyset_indexes.up.sql +23 -0
  258. package/modules/auth/module.json +3 -3
  259. package/modules/auth/package.json +3 -2
  260. package/modules/auth/spec/module.yaml +372 -3
  261. package/modules/auth/src/acl/scopes.ts +50 -6
  262. package/modules/auth/src/cli/commands.json +11 -0
  263. package/modules/auth/src/cli/greenfield.ts +2 -2
  264. package/modules/auth/src/cli/index.ts +14 -0
  265. package/modules/auth/src/cli/secrets.ts +114 -0
  266. package/modules/auth/src/client/AuthenticationCore.tsrx +61 -8
  267. package/modules/auth/src/client/api.ts +72 -6
  268. package/modules/auth/src/client/contribution.tsrx +23 -0
  269. package/modules/auth/src/client/index.ts +6 -0
  270. package/modules/auth/src/client/providers/IdentityProviderForm.tsrx +191 -0
  271. package/modules/auth/src/client/providers/IdentityProvidersView.tsrx +358 -0
  272. package/modules/auth/src/client/providers/api.ts +128 -0
  273. package/modules/auth/src/client/providers/provider-columns.tsrx +60 -0
  274. package/modules/auth/src/client/providers/state.ts +35 -0
  275. package/modules/auth/src/client/security/SecurityView.tsrx +9 -1
  276. package/modules/auth/src/client/state.ts +15 -1
  277. package/modules/auth/src/domain/types.ts +55 -0
  278. package/modules/auth/src/index.ts +11 -1
  279. package/modules/auth/src/middleware/authentication.ts +4 -0
  280. package/modules/auth/src/server/endpoints.ts +467 -171
  281. package/modules/auth/src/server/http.ts +3 -2
  282. package/modules/auth/src/server/index.ts +22 -1
  283. package/modules/auth/src/server/membership-endpoints.ts +62 -0
  284. package/modules/auth/src/server/mfa-enforcement.ts +156 -0
  285. package/modules/auth/src/server/oidc.ts +389 -0
  286. package/modules/auth/src/server/provider-endpoints.ts +246 -0
  287. package/modules/auth/src/server/provider-host.ts +77 -0
  288. package/modules/auth/src/server/runtime.ts +231 -55
  289. package/modules/auth/src/services/auth-service-error.ts +7 -2
  290. package/modules/auth/src/services/auth-service.ts +948 -51
  291. package/modules/auth/src/services/data-classes.ts +236 -0
  292. package/modules/auth/src/services/database-repository.ts +853 -71
  293. package/modules/auth/src/services/identity-provider-service.ts +571 -0
  294. package/modules/auth/src/services/mail-delivery.ts +16 -16
  295. package/modules/auth/src/services/mail-message.ts +54 -0
  296. package/modules/auth/src/services/mail-port.ts +24 -0
  297. package/modules/auth/src/services/mail-smtp.ts +85 -0
  298. package/modules/auth/src/services/mfa-rotation.ts +144 -0
  299. package/modules/auth/src/services/migration.ts +810 -0
  300. package/modules/auth/src/services/password.ts +14 -0
  301. package/modules/auth/src/services/provider-secret-rotation.ts +169 -0
  302. package/modules/auth/src/services/provider-secrets.ts +136 -0
  303. package/modules/auth/src/services/repository.ts +321 -5
  304. package/modules/auth/src/services/session-sweep-runner.ts +73 -0
  305. package/modules/auth/src/services/settings-store.ts +10 -83
  306. package/modules/auth/src/services/totp.ts +88 -62
  307. package/modules/auth/src/services/validation.ts +194 -7
  308. package/modules/auth/src/settings.ts +18 -0
  309. package/modules/auth/translations/en.json +84 -1
  310. package/modules/auth/translations/pl.json +84 -1
  311. package/modules/automations/migrations/0005_secret_rotation_inventory.down.sql +1 -0
  312. package/modules/automations/migrations/0005_secret_rotation_inventory.up.sql +6 -0
  313. package/modules/automations/migrations/0006_automations_list_sort_indexes.down.sql +4 -0
  314. package/modules/automations/migrations/0006_automations_list_sort_indexes.up.sql +11 -0
  315. package/modules/automations/module.json +24 -6
  316. package/modules/automations/package.json +5 -2
  317. package/modules/automations/spec/module.yaml +81 -7
  318. package/modules/automations/src/api/endpoints.ts +202 -28
  319. package/modules/automations/src/cli/commands.json +17 -0
  320. package/modules/automations/src/cli/index.ts +114 -0
  321. package/modules/automations/src/client/AutomationScheduleForm.tsrx +77 -19
  322. package/modules/automations/src/client/AutomationSchedulesView.tsrx +144 -40
  323. package/modules/automations/src/client/AutomationTriggersView.tsrx +131 -32
  324. package/modules/automations/src/client/api.ts +62 -19
  325. package/modules/automations/src/client/presentation.ts +20 -2
  326. package/modules/automations/src/client/state.ts +84 -0
  327. package/modules/automations/src/domain/cadence.ts +99 -3
  328. package/modules/automations/src/domain/cron.ts +366 -0
  329. package/modules/automations/src/domain/time-zone.ts +61 -0
  330. package/modules/automations/src/platform.ts +38 -4
  331. package/modules/automations/src/server/index.ts +11 -0
  332. package/modules/automations/src/server/runtime.ts +46 -22
  333. package/modules/{automations-workflows-integration/src/server/adapter.ts → automations/src/server/workflow-target.ts} +13 -14
  334. package/modules/{automations-workflows-integration/src/server/tools.ts → automations/src/server/workflow-tools.ts} +0 -0
  335. package/modules/automations/src/services/data-classes.ts +62 -0
  336. package/modules/automations/src/services/database-repository.ts +152 -38
  337. package/modules/automations/src/services/migration.ts +119 -9
  338. package/modules/automations/src/services/repository.ts +52 -1
  339. package/modules/automations/src/services/schedule-runner.ts +84 -0
  340. package/modules/automations/src/services/schedule-service.ts +152 -26
  341. package/modules/automations/src/services/secret-rotation.ts +176 -0
  342. package/modules/automations/src/services/secret-vault.ts +68 -41
  343. package/modules/automations/src/services/trigger-service.ts +13 -10
  344. package/modules/automations/translations/en.json +15 -2
  345. package/modules/automations/translations/pl.json +15 -2
  346. package/modules/connectors/migrations/0001_connectors_core.down.sql +3 -0
  347. package/modules/connectors/migrations/0001_connectors_core.up.sql +72 -0
  348. package/modules/connectors/migrations/0002_connectors_call_keys.down.sql +3 -0
  349. package/modules/connectors/migrations/0002_connectors_call_keys.up.sql +18 -0
  350. package/modules/connectors/migrations/README.md +3 -0
  351. package/modules/connectors/module.json +28 -0
  352. package/modules/{automations-workflows-integration → connectors}/package.json +27 -26
  353. package/modules/connectors/spec/module.yaml +447 -0
  354. package/modules/connectors/src/acl/permissions.ts +6 -0
  355. package/modules/connectors/src/agent/tools.ts +180 -0
  356. package/modules/connectors/src/api/endpoints.ts +572 -0
  357. package/modules/connectors/src/client/ConnectorCallsView.tsrx +358 -0
  358. package/modules/connectors/src/client/ConnectorForm.tsrx +424 -0
  359. package/modules/connectors/src/client/ConnectorsView.tsrx +711 -0
  360. package/modules/connectors/src/client/api.ts +281 -0
  361. package/modules/connectors/src/client/consent.ts +48 -0
  362. package/modules/connectors/src/client/contribution.tsrx +37 -0
  363. package/modules/connectors/src/client/index.ts +22 -0
  364. package/modules/connectors/src/client/navigation.ts +42 -0
  365. package/modules/connectors/src/client/presentation.ts +38 -0
  366. package/modules/connectors/src/client/state.ts +175 -0
  367. package/modules/connectors/src/domain/calls.ts +70 -0
  368. package/modules/connectors/src/domain/definitions.ts +190 -0
  369. package/modules/connectors/src/domain/http-json.ts +68 -0
  370. package/modules/connectors/src/domain/types.ts +185 -0
  371. package/modules/connectors/src/index.ts +64 -0
  372. package/modules/connectors/src/platform.ts +56 -0
  373. package/modules/connectors/src/server/index.ts +66 -0
  374. package/modules/connectors/src/server/runtime.ts +163 -0
  375. package/modules/connectors/src/services/call-service.ts +903 -0
  376. package/modules/connectors/src/services/connectors-service.ts +653 -0
  377. package/modules/connectors/src/services/credential-vault.ts +188 -0
  378. package/modules/connectors/src/services/data-classes.ts +158 -0
  379. package/modules/connectors/src/services/database-repository.ts +897 -0
  380. package/modules/connectors/src/services/egress.ts +261 -0
  381. package/modules/connectors/src/services/index.ts +19 -0
  382. package/modules/connectors/src/services/migration.ts +166 -0
  383. package/modules/connectors/src/services/repository.ts +175 -0
  384. package/modules/connectors/src/services/service-error.ts +46 -0
  385. package/modules/connectors/src/settings.ts +69 -0
  386. package/modules/connectors/translations/en.json +191 -0
  387. package/modules/connectors/translations/pl.json +191 -0
  388. package/modules/directory/migrations/0001_directory_core.down.sql +5 -0
  389. package/modules/directory/migrations/0001_directory_core.up.sql +111 -0
  390. package/modules/directory/migrations/README.md +3 -0
  391. package/modules/directory/module.json +27 -0
  392. package/modules/directory/package.json +46 -0
  393. package/modules/directory/spec/module.yaml +351 -0
  394. package/modules/directory/src/acl/permissions.ts +7 -0
  395. package/modules/directory/src/api/endpoints.ts +478 -0
  396. package/modules/directory/src/api/scim-endpoints.ts +516 -0
  397. package/modules/directory/src/client/GroupMappingsView.tsrx +430 -0
  398. package/modules/directory/src/client/ProvisioningLogView.tsrx +248 -0
  399. package/modules/directory/src/client/ScimTokensView.tsrx +587 -0
  400. package/modules/directory/src/client/api.ts +222 -0
  401. package/modules/directory/src/client/contribution.tsrx +46 -0
  402. package/modules/directory/src/client/index.ts +22 -0
  403. package/modules/directory/src/client/navigation.ts +57 -0
  404. package/modules/directory/src/client/presentation.ts +143 -0
  405. package/modules/directory/src/client/state.ts +173 -0
  406. package/modules/directory/src/domain/scim.ts +346 -0
  407. package/modules/directory/src/domain/types.ts +166 -0
  408. package/modules/directory/src/index.ts +44 -0
  409. package/modules/directory/src/platform.ts +43 -0
  410. package/modules/directory/src/server/index.ts +17 -0
  411. package/modules/directory/src/server/runtime.ts +124 -0
  412. package/modules/directory/src/services/auth-port.ts +127 -0
  413. package/modules/directory/src/services/data-classes.ts +41 -0
  414. package/modules/directory/src/services/database-repository.ts +1067 -0
  415. package/modules/directory/src/services/directory-service.ts +311 -0
  416. package/modules/directory/src/services/index.ts +43 -0
  417. package/modules/directory/src/services/migration.ts +146 -0
  418. package/modules/directory/src/services/provisioning-service.ts +1420 -0
  419. package/modules/directory/src/services/rate-limiter.ts +103 -0
  420. package/modules/directory/src/services/repository.ts +208 -0
  421. package/modules/directory/src/services/service-error.ts +42 -0
  422. package/modules/directory/src/services/token-service.ts +215 -0
  423. package/modules/directory/src/settings.ts +86 -0
  424. package/modules/directory/translations/en.json +185 -0
  425. package/modules/directory/translations/pl.json +185 -0
  426. package/modules/documents/migrations/0001_documents_core.down.sql +1 -0
  427. package/modules/documents/migrations/0001_documents_core.up.sql +35 -0
  428. package/modules/documents/migrations/0002_documents_files_page.down.sql +1 -0
  429. package/modules/documents/migrations/0002_documents_files_page.up.sql +6 -0
  430. package/modules/documents/migrations/README.md +3 -0
  431. package/modules/documents/module.json +28 -0
  432. package/modules/documents/package.json +49 -0
  433. package/modules/documents/spec/module.yaml +247 -0
  434. package/modules/documents/src/acl/permissions.ts +6 -0
  435. package/modules/documents/src/api/endpoints.ts +401 -0
  436. package/modules/documents/src/client/DocumentUploader.tsrx +148 -0
  437. package/modules/documents/src/client/DocumentsView.tsrx +540 -0
  438. package/modules/documents/src/client/api.ts +209 -0
  439. package/modules/documents/src/client/contribution.tsrx +29 -0
  440. package/modules/documents/src/client/download.ts +70 -0
  441. package/modules/documents/src/client/index.ts +22 -0
  442. package/modules/documents/src/client/navigation.ts +25 -0
  443. package/modules/documents/src/client/presentation.ts +110 -0
  444. package/modules/documents/src/client/state.ts +117 -0
  445. package/modules/documents/src/domain/attachments.ts +84 -0
  446. package/modules/documents/src/domain/types.ts +80 -0
  447. package/modules/documents/src/index.ts +46 -0
  448. package/modules/documents/src/platform.ts +61 -0
  449. package/modules/documents/src/server/index.ts +30 -0
  450. package/modules/documents/src/server/runtime.ts +107 -0
  451. package/modules/documents/src/services/attachments.ts +39 -0
  452. package/modules/documents/src/services/data-classes.ts +25 -0
  453. package/modules/documents/src/services/database-repository.ts +259 -0
  454. package/modules/documents/src/services/documents-service.ts +586 -0
  455. package/modules/documents/src/services/index.ts +18 -0
  456. package/modules/documents/src/services/migration.ts +82 -0
  457. package/modules/documents/src/services/repository.ts +48 -0
  458. package/modules/documents/src/settings.ts +107 -0
  459. package/modules/documents/translations/en.json +111 -0
  460. package/modules/documents/translations/pl.json +111 -0
  461. package/modules/exports/migrations/0001_exports_core.down.sql +2 -0
  462. package/modules/exports/migrations/0001_exports_core.up.sql +28 -0
  463. package/modules/exports/migrations/0002_exports_job_routing_role.down.sql +4 -0
  464. package/modules/exports/migrations/0002_exports_job_routing_role.up.sql +21 -0
  465. package/modules/exports/migrations/README.md +3 -0
  466. package/modules/exports/module.json +28 -0
  467. package/modules/exports/package.json +44 -0
  468. package/modules/exports/spec/module.yaml +229 -0
  469. package/modules/exports/src/acl/permissions.ts +6 -0
  470. package/modules/exports/src/api/endpoints.ts +211 -0
  471. package/modules/exports/src/client/ExportsView.tsrx +327 -0
  472. package/modules/exports/src/client/api.ts +133 -0
  473. package/modules/exports/src/client/contribution.tsrx +31 -0
  474. package/modules/exports/src/client/index.ts +20 -0
  475. package/modules/exports/src/client/navigation.ts +25 -0
  476. package/modules/exports/src/client/presentation.ts +53 -0
  477. package/modules/exports/src/client/state.ts +56 -0
  478. package/modules/exports/src/domain/lists.ts +29 -0
  479. package/modules/exports/src/domain/types.ts +120 -0
  480. package/modules/exports/src/index.ts +41 -0
  481. package/modules/exports/src/platform.ts +80 -0
  482. package/modules/exports/src/server/index.ts +51 -0
  483. package/modules/exports/src/server/runtime.ts +160 -0
  484. package/modules/exports/src/services/data-classes.ts +56 -0
  485. package/modules/exports/src/services/database-repository.ts +405 -0
  486. package/modules/exports/src/services/export-runner.ts +123 -0
  487. package/modules/exports/src/services/export-service.ts +356 -0
  488. package/modules/exports/src/services/index.ts +6 -0
  489. package/modules/exports/src/services/list-registry.ts +105 -0
  490. package/modules/exports/src/services/migration.ts +89 -0
  491. package/modules/exports/src/services/repository.ts +97 -0
  492. package/modules/exports/src/settings.ts +70 -0
  493. package/modules/exports/translations/en.json +69 -0
  494. package/modules/exports/translations/pl.json +69 -0
  495. package/modules/import/migrations/0001_import_core.down.sql +6 -0
  496. package/modules/import/migrations/0001_import_core.up.sql +61 -0
  497. package/modules/import/migrations/0002_import_job_routing_role.down.sql +4 -0
  498. package/modules/import/migrations/0002_import_job_routing_role.up.sql +20 -0
  499. package/modules/import/migrations/0003_import_jobs_export_index.down.sql +1 -0
  500. package/modules/import/migrations/0003_import_jobs_export_index.up.sql +7 -0
  501. package/modules/import/migrations/0004_import_jobs_traceparent.down.sql +1 -0
  502. package/modules/import/migrations/0004_import_jobs_traceparent.up.sql +7 -0
  503. package/modules/import/migrations/README.md +3 -0
  504. package/modules/import/module.json +37 -0
  505. package/modules/import/package.json +50 -0
  506. package/modules/import/spec/module.yaml +335 -0
  507. package/modules/import/src/acl/permissions.ts +6 -0
  508. package/modules/import/src/api/endpoints.ts +400 -0
  509. package/modules/import/src/client/ImportJobDrawer.tsrx +229 -0
  510. package/modules/import/src/client/ImportsView.tsrx +455 -0
  511. package/modules/import/src/client/NewImportForm.tsrx +274 -0
  512. package/modules/import/src/client/api.ts +243 -0
  513. package/modules/import/src/client/contribution.tsrx +29 -0
  514. package/modules/import/src/client/index.ts +23 -0
  515. package/modules/import/src/client/navigation.ts +25 -0
  516. package/modules/import/src/client/presentation.ts +59 -0
  517. package/modules/import/src/client/state.ts +43 -0
  518. package/modules/import/src/domain/csv.ts +258 -0
  519. package/modules/import/src/domain/ports.ts +157 -0
  520. package/modules/import/src/domain/types.ts +179 -0
  521. package/modules/import/src/index.ts +58 -0
  522. package/modules/import/src/platform.ts +60 -0
  523. package/modules/import/src/server/index.ts +49 -0
  524. package/modules/import/src/server/runtime.ts +158 -0
  525. package/modules/import/src/services/csv-source.ts +121 -0
  526. package/modules/import/src/services/data-classes.ts +63 -0
  527. package/modules/import/src/services/database-repository.ts +780 -0
  528. package/modules/import/src/services/import-runner.ts +127 -0
  529. package/modules/import/src/services/import-service.ts +872 -0
  530. package/modules/import/src/services/index.ts +6 -0
  531. package/modules/import/src/services/migration.ts +156 -0
  532. package/modules/import/src/services/port-registry.ts +158 -0
  533. package/modules/import/src/services/repository.ts +147 -0
  534. package/modules/import/src/settings.ts +70 -0
  535. package/modules/import/translations/en.json +175 -0
  536. package/modules/import/translations/pl.json +175 -0
  537. package/modules/metering/migrations/0001_metering_core.down.sql +6 -0
  538. package/modules/metering/migrations/0001_metering_core.up.sql +119 -0
  539. package/modules/metering/migrations/0002_metering_bucket_export.down.sql +3 -0
  540. package/modules/metering/migrations/0002_metering_bucket_export.up.sql +5 -0
  541. package/modules/metering/migrations/README.md +3 -0
  542. package/modules/metering/module.json +46 -0
  543. package/modules/metering/package.json +50 -0
  544. package/modules/metering/spec/module.yaml +269 -0
  545. package/modules/metering/src/acl/permissions.ts +5 -0
  546. package/modules/metering/src/api/endpoints.ts +104 -0
  547. package/modules/metering/src/cli/commands.json +28 -0
  548. package/modules/metering/src/cli/index.ts +246 -0
  549. package/modules/metering/src/client/LimitsView.tsrx +170 -0
  550. package/modules/metering/src/client/UsageSummaryWidget.tsrx +63 -0
  551. package/modules/metering/src/client/UsageView.tsrx +205 -0
  552. package/modules/metering/src/client/api.ts +91 -0
  553. package/modules/metering/src/client/contribution.tsrx +42 -0
  554. package/modules/metering/src/client/index.ts +26 -0
  555. package/modules/metering/src/client/navigation.ts +54 -0
  556. package/modules/metering/src/client/presentation.ts +63 -0
  557. package/modules/metering/src/client/state.ts +31 -0
  558. package/modules/metering/src/domain/meters.ts +100 -0
  559. package/modules/metering/src/domain/types.ts +71 -0
  560. package/modules/metering/src/index.ts +51 -0
  561. package/modules/metering/src/platform.ts +84 -0
  562. package/modules/metering/src/server/index.ts +40 -0
  563. package/modules/metering/src/server/runtime.ts +165 -0
  564. package/modules/metering/src/services/data-classes.ts +34 -0
  565. package/modules/metering/src/services/database-repository.ts +574 -0
  566. package/modules/metering/src/services/index.ts +9 -0
  567. package/modules/metering/src/services/meter-registry.ts +145 -0
  568. package/modules/metering/src/services/metering-service.ts +441 -0
  569. package/modules/metering/src/services/migration.ts +183 -0
  570. package/modules/metering/src/services/notifications.ts +75 -0
  571. package/modules/metering/src/services/reports.ts +105 -0
  572. package/modules/metering/src/services/repository.ts +132 -0
  573. package/modules/metering/src/services/service-error.ts +46 -0
  574. package/modules/metering/src/settings.ts +47 -0
  575. package/modules/metering/translations/en.json +68 -0
  576. package/modules/metering/translations/pl.json +68 -0
  577. package/modules/notifications/migrations/0001_notifications_core.down.sql +1 -0
  578. package/modules/notifications/migrations/0001_notifications_core.up.sql +26 -0
  579. package/modules/notifications/migrations/0002_notifications_preferences.down.sql +1 -0
  580. package/modules/notifications/migrations/0002_notifications_preferences.up.sql +17 -0
  581. package/modules/notifications/migrations/0003_notifications_webhook_subscriptions.down.sql +1 -0
  582. package/modules/notifications/migrations/0003_notifications_webhook_subscriptions.up.sql +30 -0
  583. package/modules/notifications/migrations/0004_notifications_deliveries.down.sql +1 -0
  584. package/modules/notifications/migrations/0004_notifications_deliveries.up.sql +35 -0
  585. package/modules/notifications/migrations/0005_notifications_delivery_routing_role.down.sql +2 -0
  586. package/modules/notifications/migrations/0005_notifications_delivery_routing_role.up.sql +17 -0
  587. package/modules/notifications/migrations/0006_notifications_delivery_title.down.sql +1 -0
  588. package/modules/notifications/migrations/0006_notifications_delivery_title.up.sql +11 -0
  589. package/modules/notifications/migrations/0007_notifications_secret_rotation_inventory.down.sql +2 -0
  590. package/modules/notifications/migrations/0007_notifications_secret_rotation_inventory.up.sql +19 -0
  591. package/modules/notifications/migrations/0008_notifications_delivery_claim.down.sql +8 -0
  592. package/modules/notifications/migrations/0008_notifications_delivery_claim.up.sql +19 -0
  593. package/modules/notifications/migrations/0009_notifications_kind_approvals.down.sql +16 -0
  594. package/modules/notifications/migrations/0009_notifications_kind_approvals.up.sql +18 -0
  595. package/modules/notifications/migrations/0010_notifications_kind_meter_threshold.down.sql +16 -0
  596. package/modules/notifications/migrations/0010_notifications_kind_meter_threshold.up.sql +18 -0
  597. package/modules/notifications/migrations/0011_notifications_retention_keyset.down.sql +5 -0
  598. package/modules/notifications/migrations/0011_notifications_retention_keyset.up.sql +15 -0
  599. package/modules/notifications/migrations/0012_notifications_email_channel.down.sql +12 -0
  600. package/modules/notifications/migrations/0012_notifications_email_channel.up.sql +38 -0
  601. package/modules/notifications/migrations/0013_notifications_list_pages.down.sql +5 -0
  602. package/modules/notifications/migrations/0013_notifications_list_pages.up.sql +13 -0
  603. package/modules/notifications/migrations/README.md +3 -0
  604. package/modules/notifications/module.json +32 -0
  605. package/modules/notifications/package.json +49 -0
  606. package/modules/notifications/spec/module.yaml +718 -0
  607. package/modules/notifications/src/acl/permissions.ts +11 -0
  608. package/modules/notifications/src/api/endpoints.ts +814 -0
  609. package/modules/notifications/src/cli/commands.json +17 -0
  610. package/modules/notifications/src/cli/index.ts +126 -0
  611. package/modules/notifications/src/client/DeliveriesView.tsrx +483 -0
  612. package/modules/notifications/src/client/FactList.tsrx +24 -0
  613. package/modules/notifications/src/client/NotificationPreferencesView.tsrx +240 -0
  614. package/modules/notifications/src/client/NotificationsInboxView.tsrx +592 -0
  615. package/modules/notifications/src/client/UnreadCountWidget.tsrx +62 -0
  616. package/modules/notifications/src/client/WebhookForm.tsrx +297 -0
  617. package/modules/notifications/src/client/WebhooksView.tsrx +637 -0
  618. package/modules/notifications/src/client/api.ts +382 -0
  619. package/modules/notifications/src/client/contribution.tsrx +83 -0
  620. package/modules/notifications/src/client/inbox.ts +41 -0
  621. package/modules/notifications/src/client/index.ts +29 -0
  622. package/modules/notifications/src/client/navigation.ts +92 -0
  623. package/modules/notifications/src/client/notifications.css +70 -0
  624. package/modules/notifications/src/client/presentation.ts +81 -0
  625. package/modules/notifications/src/client/state.ts +246 -0
  626. package/modules/notifications/src/client/unread-count.ts +26 -0
  627. package/modules/notifications/src/domain/locale.ts +47 -0
  628. package/modules/notifications/src/domain/publish.ts +46 -0
  629. package/modules/notifications/src/domain/types.ts +186 -0
  630. package/modules/notifications/src/index.ts +62 -0
  631. package/modules/notifications/src/platform.ts +85 -0
  632. package/modules/notifications/src/server/index.ts +82 -0
  633. package/modules/notifications/src/server/runtime.ts +251 -0
  634. package/modules/notifications/src/services/data-classes.ts +139 -0
  635. package/modules/notifications/src/services/database-repository.ts +1334 -0
  636. package/modules/notifications/src/services/delivery-payload.ts +93 -0
  637. package/modules/notifications/src/services/delivery-runner.ts +170 -0
  638. package/modules/notifications/src/services/delivery-service.ts +811 -0
  639. package/modules/notifications/src/services/egress.ts +239 -0
  640. package/modules/notifications/src/services/email-channel.ts +93 -0
  641. package/modules/notifications/src/services/index.ts +23 -0
  642. package/modules/notifications/src/services/migration.ts +572 -0
  643. package/modules/notifications/src/services/notifications-service.ts +297 -0
  644. package/modules/notifications/src/services/paging.ts +60 -0
  645. package/modules/notifications/src/services/publish-service.ts +133 -0
  646. package/modules/notifications/src/services/repository.ts +342 -0
  647. package/modules/notifications/src/services/secret-rotation.ts +177 -0
  648. package/modules/notifications/src/services/secret-vault.ts +168 -0
  649. package/modules/notifications/src/services/service-error.ts +67 -0
  650. package/modules/notifications/src/services/signature.ts +81 -0
  651. package/modules/notifications/src/services/webhook-service.ts +307 -0
  652. package/modules/notifications/src/settings.ts +130 -0
  653. package/modules/notifications/translations/en.json +255 -0
  654. package/modules/notifications/translations/pl.json +255 -0
  655. package/modules/profile/module.json +3 -3
  656. package/modules/profile/package.json +2 -2
  657. package/modules/profile/spec/module.yaml +3 -3
  658. package/modules/profile/src/services/database-repository.ts +3 -13
  659. package/modules/reports/module.json +28 -0
  660. package/modules/reports/package.json +42 -0
  661. package/modules/reports/spec/module.yaml +231 -0
  662. package/modules/reports/src/acl/permissions.ts +5 -0
  663. package/modules/reports/src/api/endpoints.ts +72 -0
  664. package/modules/reports/src/client/ReportsSummaryWidget.tsrx +52 -0
  665. package/modules/reports/src/client/ReportsView.tsrx +246 -0
  666. package/modules/reports/src/client/api.ts +65 -0
  667. package/modules/reports/src/client/contribution.tsrx +36 -0
  668. package/modules/reports/src/client/index.ts +18 -0
  669. package/modules/reports/src/client/navigation.ts +39 -0
  670. package/modules/reports/src/client/presentation.ts +123 -0
  671. package/modules/reports/src/client/state.ts +28 -0
  672. package/modules/reports/src/domain/providers.ts +115 -0
  673. package/modules/reports/src/domain/types.ts +44 -0
  674. package/modules/reports/src/index.ts +47 -0
  675. package/modules/reports/src/platform.ts +37 -0
  676. package/modules/reports/src/server/index.ts +21 -0
  677. package/modules/reports/src/server/runtime.ts +40 -0
  678. package/modules/reports/src/services/index.ts +17 -0
  679. package/modules/reports/src/services/provider-registry.ts +144 -0
  680. package/modules/reports/src/services/range.ts +65 -0
  681. package/modules/reports/src/services/reports-service.ts +316 -0
  682. package/modules/reports/src/services/service-error.ts +26 -0
  683. package/modules/reports/src/settings.ts +49 -0
  684. package/modules/reports/translations/en.json +35 -0
  685. package/modules/reports/translations/pl.json +35 -0
  686. package/modules/sandbox/module.json +4 -4
  687. package/modules/sandbox/package.json +2 -2
  688. package/modules/sandbox/spec/module.yaml +3 -3
  689. package/modules/sandbox/src/services/database-repository.ts +14 -23
  690. package/modules/sandbox/src/services/directory.ts +16 -0
  691. package/modules/sandbox/src/services/sandbox-service.ts +13 -11
  692. package/modules/search/migrations/0001_search_core.down.sql +1 -0
  693. package/modules/search/migrations/0001_search_core.up.sql +22 -0
  694. package/modules/search/migrations/0002_search_recent_export.down.sql +3 -0
  695. package/modules/search/migrations/0002_search_recent_export.up.sql +5 -0
  696. package/modules/search/migrations/README.md +3 -0
  697. package/modules/search/module.json +28 -0
  698. package/modules/search/package.json +43 -0
  699. package/modules/search/spec/module.yaml +177 -0
  700. package/modules/search/src/acl/permissions.ts +5 -0
  701. package/modules/search/src/api/endpoints.ts +221 -0
  702. package/modules/search/src/client/SearchView.tsrx +346 -0
  703. package/modules/search/src/client/api.ts +157 -0
  704. package/modules/search/src/client/contribution.tsrx +31 -0
  705. package/modules/search/src/client/index.ts +17 -0
  706. package/modules/search/src/client/navigation.ts +97 -0
  707. package/modules/search/src/client/search.css +56 -0
  708. package/modules/search/src/client/state.ts +113 -0
  709. package/modules/search/src/domain/data-classes.ts +73 -0
  710. package/modules/search/src/domain/providers.ts +88 -0
  711. package/modules/search/src/domain/types.ts +56 -0
  712. package/modules/search/src/index.ts +46 -0
  713. package/modules/search/src/platform.ts +42 -0
  714. package/modules/search/src/server/index.ts +25 -0
  715. package/modules/search/src/server/runtime.ts +123 -0
  716. package/modules/search/src/services/database-repository.ts +163 -0
  717. package/modules/search/src/services/index.ts +21 -0
  718. package/modules/search/src/services/migration.ts +65 -0
  719. package/modules/search/src/services/provider-registry.ts +137 -0
  720. package/modules/search/src/services/repository.ts +43 -0
  721. package/modules/search/src/services/search-service.ts +442 -0
  722. package/modules/search/src/services/service-error.ts +35 -0
  723. package/modules/search/src/settings.ts +68 -0
  724. package/modules/search/translations/en.json +45 -0
  725. package/modules/search/translations/pl.json +45 -0
  726. package/modules/system/module.json +2 -2
  727. package/modules/system/package.json +2 -2
  728. package/modules/system/spec/module.yaml +30 -3
  729. package/modules/system/src/client/FlagsPanel.tsrx +127 -0
  730. package/modules/system/src/client/ModuleSettingRow.tsrx +17 -7
  731. package/modules/system/src/client/ModuleSettingsSection.tsrx +10 -71
  732. package/modules/system/src/client/ModulesView.tsrx +91 -65
  733. package/modules/system/src/client/flags.ts +35 -0
  734. package/modules/system/src/client/index.ts +8 -0
  735. package/modules/system/src/client/navigation.ts +8 -0
  736. package/modules/system/src/client/settings-state.ts +159 -0
  737. package/modules/system/src/client/state.ts +2 -0
  738. package/modules/system/src/domain/time-zone.ts +105 -0
  739. package/modules/system/src/index.ts +12 -0
  740. package/modules/system/src/platform.ts +5 -1
  741. package/modules/system/src/server/endpoints.ts +72 -21
  742. package/modules/system/src/settings.ts +28 -0
  743. package/modules/system/translations/en.json +17 -0
  744. package/modules/system/translations/pl.json +17 -0
  745. package/modules/users/module.json +30 -4
  746. package/modules/users/package.json +5 -2
  747. package/modules/users/spec/module.yaml +290 -7
  748. package/modules/users/src/api/endpoints.ts +228 -15
  749. package/modules/users/src/client/InviteMemberForm.tsrx +2 -2
  750. package/modules/users/src/client/MemberDrawer.tsrx +142 -26
  751. package/modules/users/src/client/UserAccountForm.tsrx +2 -2
  752. package/modules/users/src/client/UsersView.tsrx +432 -71
  753. package/modules/users/src/client/api.ts +106 -12
  754. package/modules/users/src/client/contribution.tsrx +5 -0
  755. package/modules/users/src/client/member-columns.tsrx +22 -9
  756. package/modules/users/src/client/state.ts +172 -7
  757. package/modules/users/src/domain/lists.ts +9 -0
  758. package/modules/users/src/index.ts +11 -0
  759. package/modules/users/src/platform.ts +50 -1
  760. package/modules/users/src/services/member-export.ts +51 -0
  761. package/modules/users/src/services/member-import.ts +249 -0
  762. package/modules/users/src/services/member-search.ts +145 -0
  763. package/modules/users/src/services/users-service.ts +117 -4
  764. package/modules/users/translations/en.json +57 -8
  765. package/modules/users/translations/pl.json +57 -8
  766. package/modules/workflows/migrations/0004_payload_rotation_inventory.up.sql +17 -0
  767. package/modules/workflows/migrations/0005_workflows_human_approval.up.sql +28 -0
  768. package/modules/workflows/migrations/0006_workflows_retention_indexes.up.sql +11 -0
  769. package/modules/workflows/migrations/0007_workflows_erasure_subject_indexes.up.sql +17 -0
  770. package/modules/workflows/migrations/0008_workflows_subject_account.up.sql +24 -0
  771. package/modules/workflows/migrations/0009_workflows_definition_list_indexes.up.sql +9 -0
  772. package/modules/workflows/module.json +34 -6
  773. package/modules/workflows/package.json +3 -2
  774. package/modules/workflows/spec/module.yaml +26 -9
  775. package/modules/workflows/src/api/endpoints.ts +131 -25
  776. package/modules/workflows/src/cli/commands.json +17 -0
  777. package/modules/workflows/src/cli/index.ts +114 -0
  778. package/modules/workflows/src/client/WorkflowExecutionHistory.tsrx +36 -27
  779. package/modules/workflows/src/client/WorkflowInspector.tsrx +116 -0
  780. package/modules/workflows/src/client/WorkflowNodePalette.tsrx +1 -0
  781. package/modules/workflows/src/client/WorkflowsView.tsrx +236 -99
  782. package/modules/workflows/src/client/api.ts +54 -34
  783. package/modules/workflows/src/client/canvas-model.ts +12 -0
  784. package/modules/workflows/src/client/state.ts +95 -0
  785. package/modules/workflows/src/domain/events.ts +25 -11
  786. package/modules/workflows/src/domain/graph.ts +135 -1
  787. package/modules/workflows/src/domain/types.ts +91 -4
  788. package/modules/workflows/src/platform.ts +12 -0
  789. package/modules/workflows/src/server/runtime.ts +78 -5
  790. package/modules/workflows/src/services/approvals.ts +62 -0
  791. package/modules/workflows/src/services/cursors.ts +37 -0
  792. package/modules/workflows/src/services/data-classes.ts +232 -0
  793. package/modules/workflows/src/services/database-repository.ts +660 -171
  794. package/modules/workflows/src/services/migration.ts +240 -0
  795. package/modules/workflows/src/services/notifications.ts +98 -0
  796. package/modules/workflows/src/services/payload-codec.ts +51 -28
  797. package/modules/workflows/src/services/payload-rotation.ts +171 -0
  798. package/modules/workflows/src/services/repository.ts +123 -8
  799. package/modules/workflows/src/services/simulation.ts +7 -0
  800. package/modules/workflows/src/services/worker.ts +446 -25
  801. package/modules/workflows/src/services/workflows-service.ts +264 -103
  802. package/modules/workflows/translations/en.json +12 -4
  803. package/modules/workflows/translations/pl.json +12 -4
  804. package/modules.json +48 -4
  805. package/package.json +66 -7
  806. package/packages/client/package.json +2 -1
  807. package/packages/client/src/ApplicationShell.tsrx +43 -0
  808. package/packages/client/src/contributions.ts +55 -0
  809. package/packages/client/src/i18n/locales/en.json +5 -0
  810. package/packages/client/src/i18n/locales/pl.json +5 -0
  811. package/packages/client/src/index.ts +13 -1
  812. package/packages/client/src/routing.ts +22 -0
  813. package/packages/client/src/shell/CommandPalette.tsrx +223 -11
  814. package/packages/client/src/shell/command-search.ts +126 -0
  815. package/packages/client/src/shell/command.ts +30 -0
  816. package/packages/client/src/shell/navigation.ts +12 -0
  817. package/packages/client/src/shell/palette-keys.ts +27 -0
  818. package/packages/client/src/shell/shell.css +7 -0
  819. package/packages/contracts/schemas/module-spec.schema.json +287 -1
  820. package/packages/contracts/schemas/module.schema.json +25 -0
  821. package/packages/contracts/src/index.ts +144 -1
  822. package/packages/database/src/backup.ts +179 -0
  823. package/packages/database/src/decoders.ts +25 -0
  824. package/packages/database/src/index.ts +17 -0
  825. package/packages/database/src/record-history.ts +5 -14
  826. package/packages/dev-console/package.json +2 -1
  827. package/packages/dev-console/src/brand.d.mts +8 -0
  828. package/packages/dev-console/src/brand.mjs +33 -0
  829. package/packages/dev-console/src/index.mjs +2 -1
  830. package/packages/harness/src/index.ts +2 -0
  831. package/packages/harness/src/runtime.ts +218 -1
  832. package/packages/harness/src/tool-adapters.ts +19 -1
  833. package/packages/kernel/src/acl.ts +179 -0
  834. package/packages/kernel/src/capability-registry.ts +69 -2
  835. package/packages/kernel/src/data-class-registry.ts +354 -0
  836. package/packages/kernel/src/index.ts +65 -4
  837. package/packages/kernel/src/keyring.ts +208 -0
  838. package/packages/kernel/src/module-compatibility.ts +35 -4
  839. package/packages/kernel/src/module-registry.ts +49 -2
  840. package/packages/kernel/src/module-settings.ts +189 -27
  841. package/packages/server/package.json +2 -1
  842. package/packages/server/src/composition.ts +38 -0
  843. package/packages/server/src/endpoint.ts +104 -47
  844. package/packages/server/src/export/csv.ts +34 -0
  845. package/packages/server/src/export/definition.ts +346 -0
  846. package/packages/server/src/export/index.ts +61 -0
  847. package/packages/server/src/export/run.ts +116 -0
  848. package/packages/server/src/index.ts +155 -0
  849. package/packages/server/src/jobs/index.ts +93 -0
  850. package/packages/server/src/jobs/runner.ts +486 -0
  851. package/packages/server/src/log.ts +291 -0
  852. package/packages/server/src/mail/config.ts +184 -0
  853. package/packages/server/src/mail/contracts.ts +251 -0
  854. package/packages/server/src/mail/index.ts +31 -0
  855. package/packages/server/src/mail/port.ts +101 -0
  856. package/packages/server/src/mail/smtp.ts +191 -0
  857. package/packages/server/src/mail/template.ts +105 -0
  858. package/packages/server/src/metrics.ts +447 -0
  859. package/packages/server/src/pagination.ts +246 -0
  860. package/packages/server/src/trace/context.ts +103 -0
  861. package/packages/server/src/trace/egress.ts +66 -0
  862. package/packages/server/src/trace/error-sink.ts +296 -0
  863. package/packages/server/src/trace/exporter.ts +295 -0
  864. package/packages/server/src/trace/index.ts +60 -0
  865. package/packages/server/src/trace/job-sink.ts +172 -0
  866. package/packages/server/src/trace/tracer.ts +338 -0
  867. package/packages/server/src/web.ts +5 -1
  868. package/packages/storage/package.json +40 -0
  869. package/packages/storage/src/config.ts +189 -0
  870. package/packages/storage/src/content-type.ts +124 -0
  871. package/packages/storage/src/contracts.ts +112 -0
  872. package/packages/storage/src/envelope.ts +189 -0
  873. package/packages/storage/src/index.ts +43 -0
  874. package/packages/storage/src/local.ts +75 -0
  875. package/packages/storage/src/port.ts +251 -0
  876. package/packages/storage/src/read-token.ts +130 -0
  877. package/packages/storage/src/s3.ts +144 -0
  878. package/packages/storage/src/scanner.ts +22 -0
  879. package/packages/storage/src/sigv4.ts +104 -0
  880. package/packages/storage/src/store.ts +13 -0
  881. package/packages/ui/package.json +1 -0
  882. package/packages/ui/src/components/Button.tsrx +3 -0
  883. package/packages/ui/src/components/ConfirmDialog.tsrx +13 -2
  884. package/packages/ui/src/components/DateField.tsrx +92 -0
  885. package/packages/ui/src/components/DatePicker.tsrx +525 -0
  886. package/packages/ui/src/components/DateRangeField.tsrx +93 -0
  887. package/packages/ui/src/components/Drawer.tsrx +10 -1
  888. package/packages/ui/src/components/FileUpload.tsrx +158 -0
  889. package/packages/ui/src/components/Pagination.tsrx +130 -0
  890. package/packages/ui/src/components/Select.tsrx +78 -0
  891. package/packages/ui/src/components/Table.tsrx +498 -81
  892. package/packages/ui/src/components/Tabs.tsrx +53 -0
  893. package/packages/ui/src/components/ToastHost.tsrx +48 -0
  894. package/packages/ui/src/components/calendar.ts +243 -0
  895. package/packages/ui/src/components/date-field.ts +62 -0
  896. package/packages/ui/src/components/file-upload.ts +49 -0
  897. package/packages/ui/src/components/focus-trap.ts +62 -0
  898. package/packages/ui/src/components/pagination.ts +68 -0
  899. package/packages/ui/src/components/table-sorting.ts +49 -0
  900. package/packages/ui/src/components/tabs.ts +61 -0
  901. package/packages/ui/src/components/toast-store.ts +116 -0
  902. package/packages/ui/src/icons/Icon.tsrx +5 -0
  903. package/packages/ui/src/index.ts +45 -0
  904. package/packages/ui/src/styles/components.css +598 -0
  905. package/modules/automations-workflows-integration/module.json +0 -27
  906. package/modules/automations-workflows-integration/spec/module.yaml +0 -93
  907. package/modules/automations-workflows-integration/src/index.ts +0 -14
  908. package/modules/automations-workflows-integration/src/platform.ts +0 -24
  909. package/modules/automations-workflows-integration/src/server/index.ts +0 -11
  910. package/modules/automations-workflows-integration/translations/en.json +0 -21
  911. package/modules/automations-workflows-integration/translations/pl.json +0 -21
  912. package/modules/workflows/src/services/cursor-codec.ts +0 -62
@@ -1,3 +1,4 @@
1
+ import type { TableSort } from '@flowdular/sdk/ui';
1
2
  import { cell, createStore } from 'segment-state';
2
3
  import type {
3
4
  WorkflowDefinition,
@@ -6,16 +7,110 @@ import type {
6
7
  WorkflowGraphV1,
7
8
  WorkflowRunDetail,
8
9
  WorkflowRunSummary,
10
+ WorkflowSortDirection,
9
11
  } from '../domain/types.ts';
10
12
  import type {
11
13
  WorkflowActionCatalogItem,
12
14
  WorkflowAgentCatalogItem,
13
15
  } from './api.ts';
14
16
 
17
+ /**
18
+ * The pages a reader has walked. `cursors[i]` is the cursor that opened page
19
+ * `i`; page 0 opens with none. `nextCursor` is what the page on screen handed
20
+ * back, null on the last page.
21
+ */
22
+ export interface PageCursors {
23
+ readonly pageIndex: number;
24
+ readonly cursors: readonly string[];
25
+ readonly nextCursor: string | null;
26
+ }
27
+
28
+ export const FIRST_PAGE: PageCursors = {
29
+ pageIndex: 0,
30
+ cursors: [],
31
+ nextCursor: null,
32
+ };
33
+
34
+ export interface PageRequest {
35
+ readonly pageIndex: number;
36
+ readonly cursor: string | null;
37
+ }
38
+
39
+ export const FIRST_PAGE_REQUEST: PageRequest = { pageIndex: 0, cursor: null };
40
+
41
+ /**
42
+ * How to reach `pageIndex` from the pages walked so far: an earlier page
43
+ * reopens with the cursor stored for it, the next page with the cursor the
44
+ * current one handed back. Null when no cursor leads there.
45
+ */
46
+ export function pageRequest(
47
+ pages: PageCursors,
48
+ pageIndex: number,
49
+ ): PageRequest | null {
50
+ if (pageIndex <= 0) return { pageIndex: 0, cursor: null };
51
+ if (pageIndex <= pages.pageIndex) {
52
+ const cursor = pages.cursors[pageIndex];
53
+ return cursor ? { pageIndex, cursor } : null;
54
+ }
55
+ if (pageIndex === pages.pageIndex + 1 && pages.nextCursor) {
56
+ return { pageIndex, cursor: pages.nextCursor };
57
+ }
58
+ return null;
59
+ }
60
+
61
+ /** The pages walked once the requested one arrived with `nextCursor` behind it. */
62
+ export function pageOpened(
63
+ pages: PageCursors,
64
+ request: PageRequest,
65
+ nextCursor: string | null,
66
+ ): PageCursors {
67
+ const cursors = pages.cursors.slice(0, request.pageIndex);
68
+ while (cursors.length < request.pageIndex) cursors.push('');
69
+ cursors.push(request.cursor ?? '');
70
+ return { pageIndex: request.pageIndex, cursors, nextCursor };
71
+ }
72
+
73
+ export interface ListOrder<Sort extends string> {
74
+ readonly sort: Sort;
75
+ readonly direction: WorkflowSortDirection;
76
+ }
77
+
78
+ /**
79
+ * The server order a table's sorting state asks for. `columns` maps a column
80
+ * key to the sort key it carries; a table sorted by nothing, or by a column
81
+ * the server does not sort on, asks for the default order.
82
+ */
83
+ export function listOrder<Sort extends string>(
84
+ sorts: readonly TableSort[],
85
+ columns: Readonly<Record<string, Sort>>,
86
+ fallback: ListOrder<Sort>,
87
+ ): ListOrder<Sort> {
88
+ const first = sorts[0];
89
+ const sort = first ? columns[first.key] : undefined;
90
+ return first && sort
91
+ ? { sort, direction: first.desc ? 'desc' : 'asc' }
92
+ : fallback;
93
+ }
94
+
95
+ /**
96
+ * Whether the typed term still has to reach the server. The rows on screen
97
+ * answer it only once a page was loaded with exactly this term.
98
+ */
99
+ export function searchPending(query: string, applied: string): boolean {
100
+ return query.trim() !== applied;
101
+ }
102
+
15
103
  export function createWorkflowsClientState() {
16
104
  const store = createStore({
17
105
  definitions: cell<readonly WorkflowDefinition[]>([]),
106
+ definitionSorts: cell<readonly TableSort[]>([]),
107
+ definitionPages: cell<PageCursors>(FIRST_PAGE),
108
+ /* The term the rows on screen were loaded with. */
109
+ appliedQuery: '',
18
110
  runs: cell<readonly WorkflowRunSummary[]>([]),
111
+ runSorts: cell<readonly TableSort[]>([]),
112
+ runPages: cell<PageCursors>(FIRST_PAGE),
113
+ appliedRunQuery: '',
19
114
  detail: cell<WorkflowDefinitionDetail | null>(null),
20
115
  graph: cell<WorkflowGraphV1 | null>(null),
21
116
  selectedNodeId: '',
@@ -83,6 +83,13 @@ const EVENT_REQUIREMENTS = {
83
83
  } as const satisfies Record<WorkflowRunEventTypeV1, readonly string[]>;
84
84
 
85
85
  const EVENT_TYPES = new Set<string>(Object.keys(EVENT_REQUIREMENTS));
86
+ /** Statuses a run may settle from; every one of them is a claimed live run. */
87
+ const SETTLEABLE: readonly string[] = [
88
+ 'running',
89
+ 'waiting-agent',
90
+ 'waiting-approval',
91
+ 'waiting-retry',
92
+ ];
86
93
  const TERMINAL = new Set<WorkflowRunStatus>([
87
94
  'succeeded',
88
95
  'failed',
@@ -237,9 +244,13 @@ export function projectWorkflowRunEvents(
237
244
  break;
238
245
  case 'run.claimed':
239
246
  if (
240
- !['queued', 'running', 'waiting-agent', 'waiting-retry'].includes(
241
- status,
242
- )
247
+ ![
248
+ 'queued',
249
+ 'running',
250
+ 'waiting-agent',
251
+ 'waiting-approval',
252
+ 'waiting-retry',
253
+ ].includes(status)
243
254
  )
244
255
  transitionError(event, status);
245
256
  status = 'running';
@@ -284,10 +295,15 @@ export function projectWorkflowRunEvents(
284
295
  outcomePort: null,
285
296
  });
286
297
  nodeStatuses.set(nodeId, 'waiting-child');
287
- status =
288
- requiredString(event.payload, 'childKind') === 'agent'
289
- ? 'waiting-agent'
290
- : 'running';
298
+ {
299
+ const childKind = requiredString(event.payload, 'childKind');
300
+ status =
301
+ childKind === 'agent'
302
+ ? 'waiting-agent'
303
+ : childKind === 'approval'
304
+ ? 'waiting-approval'
305
+ : 'running';
306
+ }
291
307
  break;
292
308
  }
293
309
  case 'node.attempt.settled': {
@@ -347,13 +363,11 @@ export function projectWorkflowRunEvents(
347
363
  status = 'cancel-requested';
348
364
  break;
349
365
  case 'run.succeeded':
350
- if (!['running', 'waiting-agent', 'waiting-retry'].includes(status))
351
- transitionError(event, status);
366
+ if (!SETTLEABLE.includes(status)) transitionError(event, status);
352
367
  status = 'succeeded';
353
368
  break;
354
369
  case 'run.failed':
355
- if (!['running', 'waiting-agent', 'waiting-retry'].includes(status))
356
- transitionError(event, status);
370
+ if (!SETTLEABLE.includes(status)) transitionError(event, status);
357
371
  status = 'failed';
358
372
  break;
359
373
  case 'run.refused':
@@ -5,13 +5,14 @@ import type {
5
5
  WorkflowDryRunResponseV1,
6
6
  WorkflowGateExpressionV1,
7
7
  WorkflowGraphV1,
8
+ WorkflowHumanApprovalNodeV1,
8
9
  WorkflowNodeV1,
9
10
  WorkflowPayloadEvidenceV1,
10
11
  WorkflowReferenceSummaryV1,
11
12
  WorkflowTargetMappingV1,
12
13
  WorkflowValidationIssueV1,
13
14
  } from './types.ts';
14
- import { WORKFLOW_LIMITS } from './types.ts';
15
+ import { APPROVAL_LIMITS, WORKFLOW_LIMITS } from './types.ts';
15
16
 
16
17
  const IDENTIFIER = /^[a-z][a-z0-9-]*(\.[a-z][a-z0-9-]*)+$/;
17
18
  const PORT = /^[a-z][a-z0-9-]*$/;
@@ -43,6 +44,16 @@ export interface WorkflowReferenceCatalog {
43
44
  readonly risk?: 'read' | 'workspace-write' | 'external' | 'destructive';
44
45
  readonly idempotency?: 'required' | 'none';
45
46
  };
47
+ /**
48
+ * approvals.core and the roles the workspace defines, resolved once before
49
+ * the compiler walks the graph. A catalog without this member reads as an
50
+ * absent approvals module, which is the answer a graph compiled with no
51
+ * catalog at all already gets.
52
+ */
53
+ approval?(): {
54
+ readonly available: boolean;
55
+ readonly roleKeys: readonly string[];
56
+ };
46
57
  }
47
58
 
48
59
  export const EMPTY_WORKFLOW_GRAPH: WorkflowGraphV1 = Object.freeze({
@@ -137,6 +148,7 @@ const EXPECTED_PORTS: Record<
137
148
  gate: { inputs: ['input'], outputs: ['pass', 'fail'] },
138
149
  validator: { inputs: ['input'], outputs: ['pass', 'fail'] },
139
150
  action: { inputs: ['input'], outputs: ['success', 'failure'] },
151
+ 'human-approval': { inputs: ['input'], outputs: ['approved'] },
140
152
  merge: { inputs: ['items'], outputs: ['data'] },
141
153
  output: { inputs: ['input'], outputs: [] },
142
154
  };
@@ -449,6 +461,112 @@ function stableTopologicalOrder(
449
461
  return { order, cyclic: order.length !== nodes.length };
450
462
  }
451
463
 
464
+ /**
465
+ * A human-approval node carries the whole requirement in the published graph,
466
+ * so publishing is where a role the workspace does not define has to be caught:
467
+ * a run that reached the node with an unresolvable requirement would pause on
468
+ * nobody. An absent approvals module is the same class of problem and gets its
469
+ * own stable code.
470
+ */
471
+ function approvalIssues(
472
+ node: WorkflowHumanApprovalNodeV1,
473
+ catalog: WorkflowReferenceCatalog | undefined,
474
+ ): readonly WorkflowValidationIssueV1[] {
475
+ const issues: WorkflowValidationIssueV1[] = [];
476
+ const at = { kind: 'node', nodeId: node.id } as const;
477
+ const approval = catalog?.approval?.();
478
+ if (!approval?.available) {
479
+ issues.push(
480
+ issue(
481
+ 'WORKFLOW_APPROVAL_CAPABILITY_UNAVAILABLE',
482
+ `Node "${node.id}" needs approvals.core, which is not composed.`,
483
+ at,
484
+ ),
485
+ );
486
+ }
487
+ /* approvals.core receives `prompt ?? label` as the request title and a
488
+ summary naming the label, so a value it would refuse has to fail the
489
+ publish rather than the run that reaches the node. The label carries the
490
+ title limit because it is the title whenever no prompt is set, and being
491
+ bounded there keeps the composed summary inside APPROVAL_LIMITS.summary. */
492
+ for (const [name, value] of [
493
+ ['prompt', node.prompt],
494
+ ['label', node.label],
495
+ ] as const) {
496
+ if (typeof value === 'string' && value.length > APPROVAL_LIMITS.title) {
497
+ issues.push(
498
+ issue(
499
+ 'WORKFLOW_LIMIT_EXCEEDED',
500
+ `Node "${node.id}" sets a ${name} of ${value.length} characters; approvals.core accepts ${APPROVAL_LIMITS.title}.`,
501
+ { ...at, path: `/${name}` },
502
+ ),
503
+ );
504
+ }
505
+ }
506
+ const requirement: unknown = node.requirement;
507
+ if (!isRecord(requirement)) {
508
+ issues.push(
509
+ issue(
510
+ 'WORKFLOW_APPROVAL_REQUIREMENT_INVALID',
511
+ `Node "${node.id}" declares no approval requirement.`,
512
+ { ...at, path: '/requirement' },
513
+ ),
514
+ );
515
+ return issues;
516
+ }
517
+ const roleKey = requirement.roleKey;
518
+ const scope = requirement.scope;
519
+ const hasRole = typeof roleKey === 'string' && roleKey !== '';
520
+ const hasScope = typeof scope === 'string' && scope !== '';
521
+ if (!hasRole && !hasScope) {
522
+ issues.push(
523
+ issue(
524
+ 'WORKFLOW_APPROVAL_REQUIREMENT_INVALID',
525
+ `Node "${node.id}" must name a role key or a scope.`,
526
+ { ...at, path: '/requirement' },
527
+ ),
528
+ );
529
+ }
530
+ const bound = (value: unknown, name: string, max: number): void => {
531
+ if (value === undefined) return;
532
+ if (
533
+ !Number.isSafeInteger(value) ||
534
+ (value as number) < 1 ||
535
+ (value as number) > max
536
+ ) {
537
+ issues.push(
538
+ issue(
539
+ 'WORKFLOW_APPROVAL_REQUIREMENT_INVALID',
540
+ `Node "${node.id}" must set ${name} between 1 and ${max}.`,
541
+ { ...at, path: `/requirement/${name}` },
542
+ ),
543
+ );
544
+ }
545
+ };
546
+ bound(
547
+ requirement.decisions,
548
+ 'decisions',
549
+ WORKFLOW_LIMITS.maxApprovalDecisions,
550
+ );
551
+ bound(
552
+ requirement.expiresInDays,
553
+ 'expiresInDays',
554
+ WORKFLOW_LIMITS.maxApprovalExpiryDays,
555
+ );
556
+ /* A scope requirement is shape-checked only: scopes come from every composed
557
+ module, and this compiler resolves the workspace's roles alone. */
558
+ if (hasRole && approval && !approval.roleKeys.includes(roleKey as string)) {
559
+ issues.push(
560
+ issue(
561
+ 'WORKFLOW_APPROVAL_ROLE_UNKNOWN',
562
+ `Node "${node.id}" names role "${roleKey as string}", which this workspace does not define.`,
563
+ { ...at, path: '/requirement/roleKey' },
564
+ ),
565
+ );
566
+ }
567
+ return issues;
568
+ }
569
+
452
570
  export function compileWorkflowGraph(
453
571
  graph: WorkflowGraphV1,
454
572
  catalog?: WorkflowReferenceCatalog,
@@ -623,6 +741,22 @@ export function compileWorkflowGraph(
623
741
  available,
624
742
  });
625
743
  }
744
+ if (node.type === 'human-approval') {
745
+ issues.push(...approvalIssues(node, catalog));
746
+ /* validate() accepts an unparsed graph, so the node may carry no
747
+ requirement at all. `approvalIssues` has already reported that;
748
+ the reference names nothing rather than throwing over it. */
749
+ const requirement: unknown = node.requirement;
750
+ const named = isRecord(requirement)
751
+ ? (requirement.roleKey ?? requirement.scope)
752
+ : undefined;
753
+ references.push({
754
+ kind: 'approval',
755
+ id: typeof named === 'string' ? named : '',
756
+ version: '1',
757
+ available: catalog?.approval?.().available === true,
758
+ });
759
+ }
626
760
  if (node.type === 'action') {
627
761
  const action = catalog?.action(
628
762
  node.action.actionId,
@@ -22,8 +22,34 @@ export const WORKFLOW_LIMITS = Object.freeze({
22
22
  maxRunEvents: 10_000,
23
23
  maxInteractivePage: 100,
24
24
  maxReplayEvents: 100,
25
+ /* What a node may ask approvals.core for, bounded where approvals.core
26
+ bounds it: a requirement it would refuse has to be a publish issue rather
27
+ than a run that reaches the node and refuses there. */
28
+ maxApprovalDecisions: 16,
29
+ maxApprovalExpiryDays: 90,
25
30
  });
26
31
 
32
+ /**
33
+ * Longest values approvals.core accepts on a request, mirrored so a node whose
34
+ * prompt or label it would refuse is caught at validation instead of at the
35
+ * node. It must not drift from `APPROVAL_LIMITS` in that module's
36
+ * `domain/capability.ts`.
37
+ */
38
+ export const APPROVAL_LIMITS = Object.freeze({
39
+ title: 200,
40
+ summary: 2_000,
41
+ });
42
+
43
+ /**
44
+ * How long a run paused on a human approval sleeps before it looks at the
45
+ * request again. approvals.core calls back in process when a decision lands, so
46
+ * this is what resumes a run whose callback never arrives: the process that
47
+ * opened the request restarted, or approvals.core dropped the callback to stay
48
+ * inside its own bound on the pending ones. Shorter costs one claim per pending
49
+ * approval per interval.
50
+ */
51
+ export const WORKFLOW_APPROVAL_RECHECK_MS = 5 * 60 * 1_000;
52
+
27
53
  export interface WorkflowPortV1 {
28
54
  readonly name: string;
29
55
  readonly schemaId: string;
@@ -128,6 +154,25 @@ export interface WorkflowActionNodeV1 extends WorkflowNodeBaseV1 {
128
154
  };
129
155
  }
130
156
 
157
+ /**
158
+ * The requirement a human-approval node carries. It is the kernel
159
+ * `ApprovalRequirement` pinned into the published graph: who has to agree, how
160
+ * many of them, and how long the run waits before the request expires.
161
+ */
162
+ export interface WorkflowApprovalRequirementV1 {
163
+ readonly roleKey?: string;
164
+ readonly scope?: string;
165
+ readonly decisions?: number;
166
+ readonly expiresInDays?: number;
167
+ }
168
+
169
+ export interface WorkflowHumanApprovalNodeV1 extends WorkflowNodeBaseV1 {
170
+ readonly type: 'human-approval';
171
+ readonly requirement: WorkflowApprovalRequirementV1;
172
+ /** Shown to the deciders; the node label is the fallback. */
173
+ readonly prompt?: string;
174
+ }
175
+
131
176
  export interface WorkflowMergeNodeV1 extends WorkflowNodeBaseV1 {
132
177
  readonly type: 'merge';
133
178
  readonly mode: 'all';
@@ -144,6 +189,7 @@ export type WorkflowNodeV1 =
144
189
  | WorkflowGateNodeV1
145
190
  | WorkflowValidatorNodeV1
146
191
  | WorkflowActionNodeV1
192
+ | WorkflowHumanApprovalNodeV1
147
193
  | WorkflowMergeNodeV1
148
194
  | WorkflowOutputNodeV1;
149
195
 
@@ -226,7 +272,7 @@ export interface WorkflowValidationIssueV1 {
226
272
  }
227
273
 
228
274
  export interface WorkflowReferenceSummaryV1 {
229
- readonly kind: 'agent' | 'action' | 'schema';
275
+ readonly kind: 'agent' | 'action' | 'schema' | 'approval';
230
276
  readonly id: string;
231
277
  readonly version: string;
232
278
  readonly available: boolean;
@@ -258,6 +304,10 @@ export type WorkflowRunStatus =
258
304
  | 'queued'
259
305
  | 'running'
260
306
  | 'waiting-agent'
307
+ /* A run asleep on a person. It leaves the worker's claim queue until the
308
+ approval resolves or its recheck falls due, so a request open for days
309
+ costs nothing and never starves a newly queued run. */
310
+ | 'waiting-approval'
261
311
  | 'waiting-retry'
262
312
  | 'cancel-requested'
263
313
  | 'succeeded'
@@ -355,7 +405,7 @@ export interface WorkflowNodeAttempt {
355
405
  readonly sideEffectIdempotencyKey: string;
356
406
  readonly input: WorkflowPayloadEvidenceV1;
357
407
  readonly output: WorkflowPayloadEvidenceV1;
358
- readonly childKind: 'agent' | 'action' | null;
408
+ readonly childKind: 'agent' | 'action' | 'approval' | null;
359
409
  readonly childId: string | null;
360
410
  readonly childObservationDeadlineAt: number | null;
361
411
  readonly failureCode: string | null;
@@ -438,21 +488,58 @@ export interface WorkflowRunDetail {
438
488
  readonly output: WorkflowPayloadEvidenceV1;
439
489
  }
440
490
 
491
+ export type WorkflowSortDirection = 'asc' | 'desc';
492
+
493
+ /** The page of a keyset list: `sort` and `direction` name an indexed order. */
494
+ export interface WorkflowListQuery<Sort extends string> {
495
+ readonly sort?: Sort;
496
+ readonly direction?: WorkflowSortDirection;
497
+ readonly limit?: number;
498
+ readonly cursor?: string | null;
499
+ }
500
+
501
+ export interface WorkflowDefinitionFilters {
502
+ readonly status?: WorkflowDefinition['status'];
503
+ /** Matched inside the name or the key, case-insensitively. */
504
+ readonly search?: string;
505
+ }
506
+
507
+ export type WorkflowDefinitionSort = 'name' | 'updatedAt';
508
+
509
+ export interface WorkflowDefinitionListQuery
510
+ extends WorkflowDefinitionFilters,
511
+ WorkflowListQuery<WorkflowDefinitionSort> {}
512
+
513
+ export interface WorkflowDefinitionPage {
514
+ readonly definitions: readonly WorkflowDefinition[];
515
+ readonly nextCursor: string | null;
516
+ }
517
+
441
518
  export interface WorkflowRunFilters {
442
519
  readonly workflowId?: string;
443
520
  readonly mode?: WorkflowRunMode;
444
521
  readonly status?: WorkflowRunStatus;
445
522
  readonly actorKind?: Actor['kind'];
446
523
  readonly originKind?: WorkflowExecutionOrigin['kind'];
447
- readonly limit?: number;
448
- readonly cursor?: string | null;
524
+ /** Matched inside the workflow name or key, the actor label or the run id. */
525
+ readonly search?: string;
449
526
  }
450
527
 
528
+ export type WorkflowRunSort = 'queuedAt';
529
+
530
+ export interface WorkflowRunListQuery
531
+ extends WorkflowRunFilters,
532
+ WorkflowListQuery<WorkflowRunSort> {}
533
+
451
534
  export interface WorkflowRunPage {
452
535
  readonly runs: readonly WorkflowRunSummary[];
453
536
  readonly nextCursor: string | null;
454
537
  }
455
538
 
539
+ export type WorkflowAuditSort = 'sequence' | 'occurredAt';
540
+
541
+ export type WorkflowAuditListQuery = WorkflowListQuery<WorkflowAuditSort>;
542
+
456
543
  export interface WorkflowSimulationFixture {
457
544
  readonly nodeId: string;
458
545
  readonly outcomePort?: string;
@@ -11,6 +11,7 @@ import {
11
11
  WORKFLOW_EXECUTION_CAPABILITY,
12
12
  type WorkflowExecutionCapability,
13
13
  } from './domain/types.ts';
14
+ import { workflowsDataClasses } from './services/data-classes.ts';
14
15
 
15
16
  export function createServerComposition(
16
17
  context: PlatformServerContext,
@@ -22,6 +23,13 @@ export function createServerComposition(
22
23
  ),
23
24
  databases: context.databases,
24
25
  capabilities: context.capabilities,
26
+ /* Which roles a workspace defines is auth.core's answer, asked when a
27
+ graph carrying a human-approval node is validated, never cached, so a
28
+ role deleted since the last publish is caught by the next one. */
29
+ roles: async (tenantId) =>
30
+ (await (await context.auth.service()).listRoles(tenantId)).map(
31
+ (role) => role.key,
32
+ ),
25
33
  });
26
34
  /* The runtime opens its database leases lazily, so the capability is a
27
35
  forwarder rather than a resolved object: registration must not force a
@@ -40,6 +48,10 @@ export function createServerComposition(
40
48
  cancel: async (runId, contextValue) =>
41
49
  (await capability()).cancel(runId, contextValue),
42
50
  } satisfies WorkflowExecutionCapability);
51
+ /* The sweep, the export and the erasure run here, on this module's own
52
+ leases and under its own tenant transaction; the platform only holds the
53
+ declaration. */
54
+ context.dataClasses.declare(workflowsDataClasses(() => runtime.repository()));
43
55
  return {
44
56
  routes: createWorkflowsRoutes(context.auth, runtime),
45
57
  start: () => runtime.start(),
@@ -8,12 +8,22 @@ import {
8
8
  } from '@flowdular/sdk/database';
9
9
  import {
10
10
  createPlatformCapabilityRegistry,
11
+ parsePreviousKeys,
11
12
  type PlatformCapabilityRegistry,
12
13
  } from '@flowdular/sdk/kernel';
13
- import { createWorkflowCursorCodec } from '../services/cursor-codec.ts';
14
+ import {
15
+ APPROVALS_REQUESTS_CAPABILITY,
16
+ type ApprovalsRequests,
17
+ type WorkspaceRolesResolver,
18
+ } from '../services/approvals.ts';
19
+ import {
20
+ NOTIFICATIONS_PUBLISH_CAPABILITY,
21
+ type NotificationPublisher,
22
+ } from '../services/notifications.ts';
14
23
  import {
15
24
  createWorkflowPayloadCodec,
16
25
  decodeWorkflowPayloadKey,
26
+ type WorkflowPayloadCodec,
17
27
  } from '../services/payload-codec.ts';
18
28
  import {
19
29
  DatabaseWorkflowsRepository,
@@ -37,8 +47,15 @@ export interface WorkflowsRuntimeOptions {
37
47
  | undefined;
38
48
  readonly repository?: WorkflowsRepository;
39
49
  readonly capabilities?: PlatformCapabilityRegistry;
50
+ /* Roles the workspace defines, read through auth.core when a graph carries a
51
+ human-approval node. */
52
+ readonly roles?: WorkspaceRolesResolver;
40
53
  readonly payloadKey?: Buffer;
54
+ /* Keys a rotation has not finished retiring. They open stored payloads and
55
+ verify outstanding cursors; nothing is ever written or signed with them. */
56
+ readonly previousPayloadKeys?: readonly Buffer[];
41
57
  readonly cursorKey?: Buffer;
58
+ readonly previousCursorKeys?: readonly Buffer[];
42
59
  readonly payloadRetentionMs?: number;
43
60
  readonly worker?: WorkflowWorkerOptions;
44
61
  readonly environment?: NodeJS.ProcessEnv;
@@ -47,6 +64,10 @@ export interface WorkflowsRuntimeOptions {
47
64
 
48
65
  export interface WorkflowsRuntime {
49
66
  service(): Promise<WorkflowsService>;
67
+ /* The store the declared data classes sweep, export and erase through. It
68
+ opens the runtime's own leases on first use, like the service does, so
69
+ declaring a class at composition opens no connection. */
70
+ repository(): Promise<WorkflowsRepository>;
50
71
  start(): void;
51
72
  stop(): void | Promise<void>;
52
73
  dispose(): void | Promise<void>;
@@ -109,9 +130,22 @@ export function workflowsRuntimeOptionsFromEnvironment(
109
130
  payloadKey: environment.FD_WORKFLOWS_PAYLOAD_KEY
110
131
  ? decodeWorkflowPayloadKey(environment.FD_WORKFLOWS_PAYLOAD_KEY)
111
132
  : derivedDevelopmentKey(workspaceRoot, 'payload'),
133
+ previousPayloadKeys: parsePreviousKeys(
134
+ environment.FD_WORKFLOWS_PAYLOAD_KEY_PREVIOUS,
135
+ (entry) =>
136
+ decodeWorkflowPayloadKey(entry, 'FD_WORKFLOWS_PAYLOAD_KEY_PREVIOUS'),
137
+ ),
112
138
  cursorKey: environment.FD_WORKFLOWS_CURSOR_KEY
113
- ? decodeWorkflowPayloadKey(environment.FD_WORKFLOWS_CURSOR_KEY)
139
+ ? decodeWorkflowPayloadKey(
140
+ environment.FD_WORKFLOWS_CURSOR_KEY,
141
+ 'FD_WORKFLOWS_CURSOR_KEY',
142
+ )
114
143
  : derivedDevelopmentKey(workspaceRoot, 'cursor'),
144
+ previousCursorKeys: parsePreviousKeys(
145
+ environment.FD_WORKFLOWS_CURSOR_KEY_PREVIOUS,
146
+ (entry) =>
147
+ decodeWorkflowPayloadKey(entry, 'FD_WORKFLOWS_CURSOR_KEY_PREVIOUS'),
148
+ ),
115
149
  worker: {
116
150
  leaseMs: environmentInteger(
117
151
  environment.FD_WORKFLOWS_WORKER_LEASE_MS,
@@ -140,6 +174,24 @@ export function workflowsRuntimeOptionsFromEnvironment(
140
174
  };
141
175
  }
142
176
 
177
+ /**
178
+ * The codec a process outside the runtime seals with: the same current key and
179
+ * retired keys the runtime itself would resolve from this environment.
180
+ */
181
+ export function workflowPayloadCodecFromEnvironment(
182
+ environment: NodeJS.ProcessEnv = process.env,
183
+ workspaceRoot = process.cwd(),
184
+ ): WorkflowPayloadCodec {
185
+ const options = workflowsRuntimeOptionsFromEnvironment(
186
+ environment,
187
+ workspaceRoot,
188
+ );
189
+ return createWorkflowPayloadCodec(
190
+ options.payloadKey ?? derivedDevelopmentKey(workspaceRoot, 'payload'),
191
+ options.previousPayloadKeys ?? [],
192
+ );
193
+ }
194
+
143
195
  export function createWorkflowsRuntime(
144
196
  options: WorkflowsRuntimeOptions,
145
197
  ): WorkflowsRuntime {
@@ -210,7 +262,7 @@ export function createWorkflowsRuntime(
210
262
  runtime: runtimeLease.database,
211
263
  background: backgroundLease.database,
212
264
  },
213
- createWorkflowPayloadCodec(payloadKey),
265
+ createWorkflowPayloadCodec(payloadKey, options.previousPayloadKeys ?? []),
214
266
  options.payloadRetentionMs,
215
267
  );
216
268
  };
@@ -221,7 +273,11 @@ export function createWorkflowsRuntime(
221
273
  if (!service) {
222
274
  const serviceOptions: WorkflowsServiceOptions = {
223
275
  capabilities,
224
- cursorCodec: createWorkflowCursorCodec(cursorKey),
276
+ cursorKeys: {
277
+ current: cursorKey,
278
+ previous: options.previousCursorKeys ?? [],
279
+ },
280
+ ...(options.roles ? { roles: options.roles } : {}),
225
281
  onRunQueued: () => worker?.kick(),
226
282
  };
227
283
  service = new WorkflowsService(repository, serviceOptions);
@@ -229,7 +285,20 @@ export function createWorkflowsRuntime(
229
285
  worker ??= new WorkflowWorker(
230
286
  repository,
231
287
  () => service?.executionDependencies() ?? null,
232
- options.worker,
288
+ {
289
+ ...options.worker,
290
+ /* notifications.core is optional and is not declared as a
291
+ dependency. The lookup happens when a run settles, so a module
292
+ composed after this one is found and an absent one is a no-op. */
293
+ notifications: () =>
294
+ capabilities.get<NotificationPublisher>(
295
+ NOTIFICATIONS_PUBLISH_CAPABILITY,
296
+ ),
297
+ /* approvals.core is optional too. A human-approval node refuses with
298
+ a stable code when it is absent; every other node is unaffected. */
299
+ approvals: () =>
300
+ capabilities.get<ApprovalsRequests>(APPROVALS_REQUESTS_CAPABILITY),
301
+ },
233
302
  );
234
303
  if (started) worker.start();
235
304
  return service;
@@ -240,6 +309,10 @@ export function createWorkflowsRuntime(
240
309
 
241
310
  return {
242
311
  service: resolved,
312
+ repository: async () => {
313
+ await resolved();
314
+ return repository!;
315
+ },
243
316
  start() {
244
317
  if (disposed) throw new Error('Workflows runtime is disposed.');
245
318
  started = true;