@flowdular/sdk 0.2.4 → 0.3.1

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 (930) 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 +130 -3
  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/cli-extension/SKILL.md +1 -1
  30. package/.ai/skills/deploy-operate/SKILL.md +119 -0
  31. package/.ai/skills/module-new/SKILL.md +29 -3
  32. package/.ai/skills/module-update/SKILL.md +9 -3
  33. package/.ai/skills/perf-audit/SKILL.md +0 -1
  34. package/.ai/skills/release-eject-pr/SKILL.md +0 -1
  35. package/.ai/skills/spec-interview/SKILL.md +120 -0
  36. package/.ai/skills/test-hardening/SKILL.md +1 -0
  37. package/.ai/skills/ux-design/SKILL.md +34 -3
  38. package/.ai/skills/variables/SKILL.md +0 -2
  39. package/.ai/skills/workflow-development/SKILL.md +0 -1
  40. package/AGENTS.md +4 -0
  41. package/docs/agent-contract.md +2 -2
  42. package/docs/design-system.md +185 -31
  43. package/modules/access/migrations/0001_access_core.down.sql +1 -0
  44. package/modules/access/migrations/0001_access_core.up.sql +28 -0
  45. package/modules/access/migrations/README.md +3 -0
  46. package/modules/access/module.json +33 -0
  47. package/modules/access/package.json +43 -0
  48. package/modules/access/spec/module.yaml +225 -0
  49. package/modules/access/src/acl/permissions.ts +6 -0
  50. package/modules/access/src/api/endpoints.ts +244 -0
  51. package/modules/access/src/client/ActivityView.tsrx +245 -0
  52. package/modules/access/src/client/AttestationsView.tsrx +176 -0
  53. package/modules/access/src/client/ReviewView.tsrx +586 -0
  54. package/modules/access/src/client/api.ts +132 -0
  55. package/modules/access/src/client/contribution.tsrx +41 -0
  56. package/modules/access/src/client/index.ts +41 -0
  57. package/modules/access/src/client/navigation.ts +57 -0
  58. package/modules/access/src/client/presentation.ts +69 -0
  59. package/modules/access/src/client/state.ts +72 -0
  60. package/modules/access/src/domain/types.ts +189 -0
  61. package/modules/access/src/index.ts +38 -0
  62. package/modules/access/src/platform.ts +60 -0
  63. package/modules/access/src/server/index.ts +42 -0
  64. package/modules/access/src/server/runtime.ts +105 -0
  65. package/modules/access/src/services/access-service.ts +298 -0
  66. package/modules/access/src/services/audit-window.ts +78 -0
  67. package/modules/access/src/services/auth-directory.ts +72 -0
  68. package/modules/access/src/services/changes.ts +91 -0
  69. package/modules/access/src/services/data-classes.ts +28 -0
  70. package/modules/access/src/services/database-repository.ts +185 -0
  71. package/modules/access/src/services/directory.ts +102 -0
  72. package/modules/access/src/services/index.ts +33 -0
  73. package/modules/access/src/services/list-exports.ts +150 -0
  74. package/modules/access/src/services/migration.ts +54 -0
  75. package/modules/access/src/services/repository.ts +30 -0
  76. package/modules/access/src/services/review.ts +178 -0
  77. package/modules/access/translations/en.json +155 -0
  78. package/modules/access/translations/pl.json +155 -0
  79. package/modules/agents/migrations/0022_credential_rotation_inventory.down.sql +2 -0
  80. package/modules/agents/migrations/0022_credential_rotation_inventory.up.sql +7 -0
  81. package/modules/agents/migrations/0023_agents_retention_indexes.down.sql +2 -0
  82. package/modules/agents/migrations/0023_agents_retention_indexes.up.sql +9 -0
  83. package/modules/agents/migrations/0024_agent_meter_refusals.down.sql +3 -0
  84. package/modules/agents/migrations/0024_agent_meter_refusals.up.sql +22 -0
  85. package/modules/agents/migrations/0025_agent_list_indexes.down.sql +3 -0
  86. package/modules/agents/migrations/0025_agent_list_indexes.up.sql +11 -0
  87. package/modules/agents/module.json +30 -4
  88. package/modules/agents/package.json +2 -1
  89. package/modules/agents/spec/module.yaml +63 -5
  90. package/modules/agents/src/api/endpoints.ts +291 -33
  91. package/modules/agents/src/cli/commands.json +11 -0
  92. package/modules/agents/src/cli/index.ts +45 -0
  93. package/modules/agents/src/client/AgentDashboardWidget.tsrx +19 -11
  94. package/modules/agents/src/client/AgentDefinitionList.tsrx +53 -10
  95. package/modules/agents/src/client/AgentPlaygroundView.tsrx +4 -4
  96. package/modules/agents/src/client/AgentProceduresView.tsrx +2 -2
  97. package/modules/agents/src/client/AgentRunsView.tsrx +143 -40
  98. package/modules/agents/src/client/AgentsView.tsrx +109 -33
  99. package/modules/agents/src/client/api.ts +99 -21
  100. package/modules/agents/src/client/state.ts +97 -0
  101. package/modules/agents/src/domain/types.ts +44 -4
  102. package/modules/agents/src/platform.ts +42 -0
  103. package/modules/agents/src/server/action-execution.ts +201 -106
  104. package/modules/agents/src/server/runtime.ts +32 -0
  105. package/modules/agents/src/services/agent-service.ts +158 -30
  106. package/modules/agents/src/services/credential-rotation.ts +185 -0
  107. package/modules/agents/src/services/credential-vault.ts +71 -46
  108. package/modules/agents/src/services/data-classes.ts +176 -0
  109. package/modules/agents/src/services/database-repository.ts +393 -101
  110. package/modules/agents/src/services/metering.ts +111 -0
  111. package/modules/agents/src/services/migration.ts +109 -0
  112. package/modules/agents/src/services/module-agent-preflight.ts +17 -9
  113. package/modules/agents/src/services/notifications.ts +98 -0
  114. package/modules/agents/src/services/provider-repository.ts +9 -18
  115. package/modules/agents/src/services/provider-service.ts +1 -9
  116. package/modules/agents/src/services/reports.ts +107 -0
  117. package/modules/agents/src/services/repository.ts +86 -6
  118. package/modules/agents/src/services/usage-service.ts +2 -0
  119. package/modules/agents/src/services/worker.ts +114 -4
  120. package/modules/agents/src/settings.ts +14 -3
  121. package/modules/agents/translations/en.json +14 -4
  122. package/modules/agents/translations/pl.json +14 -4
  123. package/modules/approvals/migrations/0001_approvals_core.down.sql +3 -0
  124. package/modules/approvals/migrations/0001_approvals_core.up.sql +78 -0
  125. package/modules/approvals/migrations/0002_approvals_expiry_routing_role.down.sql +2 -0
  126. package/modules/approvals/migrations/0002_approvals_expiry_routing_role.up.sql +19 -0
  127. package/modules/approvals/migrations/0003_approvals_retention_indexes.down.sql +6 -0
  128. package/modules/approvals/migrations/0003_approvals_retention_indexes.up.sql +14 -0
  129. package/modules/approvals/migrations/0004_approvals_inbox_keyset_indexes.down.sql +5 -0
  130. package/modules/approvals/migrations/0004_approvals_inbox_keyset_indexes.up.sql +12 -0
  131. package/modules/approvals/migrations/0005_approvals_grant_audit.down.sql +4 -0
  132. package/modules/approvals/migrations/0005_approvals_grant_audit.up.sql +20 -0
  133. package/modules/approvals/migrations/README.md +3 -0
  134. package/modules/approvals/module.json +34 -0
  135. package/modules/approvals/package.json +43 -0
  136. package/modules/approvals/spec/module.yaml +327 -0
  137. package/modules/approvals/src/acl/permissions.ts +7 -0
  138. package/modules/approvals/src/api/endpoints.ts +457 -0
  139. package/modules/approvals/src/client/ApprovalRequestDrawer.tsrx +138 -0
  140. package/modules/approvals/src/client/ApprovalsView.tsrx +562 -0
  141. package/modules/approvals/src/client/PendingCountWidget.tsrx +52 -0
  142. package/modules/approvals/src/client/api.ts +203 -0
  143. package/modules/approvals/src/client/approvals.css +51 -0
  144. package/modules/approvals/src/client/contribution.tsrx +44 -0
  145. package/modules/approvals/src/client/index.ts +26 -0
  146. package/modules/approvals/src/client/navigation.ts +39 -0
  147. package/modules/approvals/src/client/pending-count.ts +26 -0
  148. package/modules/approvals/src/client/presentation.ts +52 -0
  149. package/modules/approvals/src/client/state.ts +141 -0
  150. package/modules/approvals/src/domain/capability.ts +107 -0
  151. package/modules/approvals/src/domain/grant.ts +69 -0
  152. package/modules/approvals/src/domain/types.ts +168 -0
  153. package/modules/approvals/src/index.ts +61 -0
  154. package/modules/approvals/src/platform.ts +136 -0
  155. package/modules/approvals/src/server/index.ts +42 -0
  156. package/modules/approvals/src/server/runtime.ts +185 -0
  157. package/modules/approvals/src/services/approvals-service.ts +637 -0
  158. package/modules/approvals/src/services/callbacks.ts +75 -0
  159. package/modules/approvals/src/services/data-classes.ts +167 -0
  160. package/modules/approvals/src/services/database-repository.ts +783 -0
  161. package/modules/approvals/src/services/eligibility.ts +121 -0
  162. package/modules/approvals/src/services/expiry-runner.ts +81 -0
  163. package/modules/approvals/src/services/index.ts +31 -0
  164. package/modules/approvals/src/services/migration.ts +256 -0
  165. package/modules/approvals/src/services/notifications.ts +95 -0
  166. package/modules/approvals/src/services/repository.ts +169 -0
  167. package/modules/approvals/src/services/service-error.ts +70 -0
  168. package/modules/approvals/src/settings.ts +102 -0
  169. package/modules/approvals/translations/en.json +104 -0
  170. package/modules/approvals/translations/pl.json +104 -0
  171. package/modules/audit/migrations/0001_audit_core.down.sql +8 -0
  172. package/modules/audit/migrations/0001_audit_core.up.sql +107 -0
  173. package/modules/audit/migrations/0002_audit_sweep_routing_role.down.sql +2 -0
  174. package/modules/audit/migrations/0002_audit_sweep_routing_role.up.sql +21 -0
  175. package/modules/audit/migrations/0003_audit_export_request.down.sql +12 -0
  176. package/modules/audit/migrations/0003_audit_export_request.up.sql +40 -0
  177. package/modules/audit/migrations/0004_audit_hold_seal_erasure.down.sql +17 -0
  178. package/modules/audit/migrations/0004_audit_hold_seal_erasure.up.sql +192 -0
  179. package/modules/audit/migrations/0005_audit_event_format.down.sql +17 -0
  180. package/modules/audit/migrations/0005_audit_event_format.up.sql +60 -0
  181. package/modules/audit/migrations/0006_audit_own_class_walks.down.sql +3 -0
  182. package/modules/audit/migrations/0006_audit_own_class_walks.up.sql +14 -0
  183. package/modules/audit/migrations/README.md +3 -0
  184. package/modules/audit/module.json +32 -0
  185. package/modules/audit/package.json +49 -0
  186. package/modules/audit/spec/module.yaml +809 -0
  187. package/modules/audit/src/acl/permissions.ts +7 -0
  188. package/modules/audit/src/api/endpoints.ts +315 -0
  189. package/modules/audit/src/cli/commands.json +95 -0
  190. package/modules/audit/src/cli/index.ts +658 -0
  191. package/modules/audit/src/client/DataClassesView.tsrx +420 -0
  192. package/modules/audit/src/client/ExportsView.tsrx +256 -0
  193. package/modules/audit/src/client/HoldsView.tsrx +604 -0
  194. package/modules/audit/src/client/SweepsView.tsrx +251 -0
  195. package/modules/audit/src/client/api.ts +185 -0
  196. package/modules/audit/src/client/contribution.tsrx +52 -0
  197. package/modules/audit/src/client/index.ts +23 -0
  198. package/modules/audit/src/client/navigation.ts +74 -0
  199. package/modules/audit/src/client/presentation.ts +105 -0
  200. package/modules/audit/src/client/state.ts +86 -0
  201. package/modules/audit/src/domain/data-classes.ts +16 -0
  202. package/modules/audit/src/domain/types.ts +339 -0
  203. package/modules/audit/src/index.ts +76 -0
  204. package/modules/audit/src/platform.ts +44 -0
  205. package/modules/audit/src/server/index.ts +177 -0
  206. package/modules/audit/src/server/runtime.ts +303 -0
  207. package/modules/audit/src/services/anchor-key.ts +143 -0
  208. package/modules/audit/src/services/anchor-rotation.ts +147 -0
  209. package/modules/audit/src/services/audit-runners.ts +278 -0
  210. package/modules/audit/src/services/backup-guard.ts +95 -0
  211. package/modules/audit/src/services/database-repository.ts +1946 -0
  212. package/modules/audit/src/services/declared-classes.ts +64 -0
  213. package/modules/audit/src/services/erasure-port.ts +126 -0
  214. package/modules/audit/src/services/erasure-service.ts +770 -0
  215. package/modules/audit/src/services/export-directory.ts +106 -0
  216. package/modules/audit/src/services/export-service.ts +714 -0
  217. package/modules/audit/src/services/hold-service.ts +295 -0
  218. package/modules/audit/src/services/index.ts +17 -0
  219. package/modules/audit/src/services/migration.ts +658 -0
  220. package/modules/audit/src/services/own-classes.ts +318 -0
  221. package/modules/audit/src/services/platform-version.ts +23 -0
  222. package/modules/audit/src/services/repository.ts +495 -0
  223. package/modules/audit/src/services/retention-service.ts +191 -0
  224. package/modules/audit/src/services/seal-service.ts +769 -0
  225. package/modules/audit/src/services/service-error.ts +61 -0
  226. package/modules/audit/src/services/subject-keys.ts +90 -0
  227. package/modules/audit/src/services/sweep-service.ts +298 -0
  228. package/modules/audit/src/services/zip.ts +217 -0
  229. package/modules/audit/src/settings.ts +69 -0
  230. package/modules/audit/translations/en.json +210 -0
  231. package/modules/audit/translations/pl.json +210 -0
  232. package/modules/auth/README.md +77 -29
  233. package/modules/auth/migrations/0016_external_identities.up.sql +16 -0
  234. package/modules/auth/migrations/0017_mfa_key_id.up.sql +8 -0
  235. package/modules/auth/migrations/0018_retire_bundled_module_scopes.up.sql +29 -0
  236. package/modules/auth/migrations/0019_notifications_member_scopes.up.sql +44 -0
  237. package/modules/auth/migrations/0020_identity_providers.up.sql +61 -0
  238. package/modules/auth/migrations/0021_membership_status.up.sql +19 -0
  239. package/modules/auth/migrations/0022_auth_provider_scopes.up.sql +45 -0
  240. package/modules/auth/migrations/0023_enterprise_module_scopes.down.sql +19 -0
  241. package/modules/auth/migrations/0023_enterprise_module_scopes.up.sql +71 -0
  242. package/modules/auth/migrations/0024_approvals_member_scopes.down.sql +22 -0
  243. package/modules/auth/migrations/0024_approvals_member_scopes.up.sql +48 -0
  244. package/modules/auth/migrations/0025_audit_holds_owner_scope.down.sql +21 -0
  245. package/modules/auth/migrations/0025_audit_holds_owner_scope.up.sql +47 -0
  246. package/modules/auth/migrations/0026_auth_export_keyset_indexes.down.sql +6 -0
  247. package/modules/auth/migrations/0026_auth_export_keyset_indexes.up.sql +15 -0
  248. package/modules/auth/migrations/0027_workflow_automation_profile_scopes.down.sql +34 -0
  249. package/modules/auth/migrations/0027_workflow_automation_profile_scopes.up.sql +72 -0
  250. package/modules/auth/migrations/0028_auth_member_search_prefix_indexes.down.sql +6 -0
  251. package/modules/auth/migrations/0028_auth_member_search_prefix_indexes.up.sql +21 -0
  252. package/modules/auth/migrations/0029_reports_exports_access_scopes.down.sql +22 -0
  253. package/modules/auth/migrations/0029_reports_exports_access_scopes.up.sql +56 -0
  254. package/modules/auth/migrations/0030_auth_membership_keyset_index.down.sql +4 -0
  255. package/modules/auth/migrations/0030_auth_membership_keyset_index.up.sql +10 -0
  256. package/modules/auth/migrations/0031_membership_scope_backfills_under_rls.down.sql +4 -0
  257. package/modules/auth/migrations/0031_membership_scope_backfills_under_rls.up.sql +31 -0
  258. package/modules/auth/migrations/0032_audit_actor_service.down.sql +9 -0
  259. package/modules/auth/migrations/0032_audit_actor_service.up.sql +10 -0
  260. package/modules/auth/migrations/0033_auth_account_keyset_indexes.down.sql +5 -0
  261. package/modules/auth/migrations/0033_auth_account_keyset_indexes.up.sql +23 -0
  262. package/modules/auth/module.json +3 -3
  263. package/modules/auth/package.json +2 -1
  264. package/modules/auth/spec/module.yaml +372 -3
  265. package/modules/auth/src/acl/scopes.ts +50 -6
  266. package/modules/auth/src/cli/commands.json +11 -0
  267. package/modules/auth/src/cli/greenfield.ts +2 -2
  268. package/modules/auth/src/cli/index.ts +14 -0
  269. package/modules/auth/src/cli/secrets.ts +114 -0
  270. package/modules/auth/src/client/AuthenticationCore.tsrx +61 -8
  271. package/modules/auth/src/client/api.ts +72 -6
  272. package/modules/auth/src/client/contribution.tsrx +23 -0
  273. package/modules/auth/src/client/index.ts +6 -0
  274. package/modules/auth/src/client/providers/IdentityProviderForm.tsrx +191 -0
  275. package/modules/auth/src/client/providers/IdentityProvidersView.tsrx +358 -0
  276. package/modules/auth/src/client/providers/api.ts +128 -0
  277. package/modules/auth/src/client/providers/provider-columns.tsrx +60 -0
  278. package/modules/auth/src/client/providers/state.ts +35 -0
  279. package/modules/auth/src/client/security/SecurityView.tsrx +9 -1
  280. package/modules/auth/src/client/state.ts +15 -1
  281. package/modules/auth/src/domain/types.ts +55 -0
  282. package/modules/auth/src/index.ts +11 -1
  283. package/modules/auth/src/middleware/authentication.ts +4 -0
  284. package/modules/auth/src/server/endpoints.ts +467 -171
  285. package/modules/auth/src/server/http.ts +3 -2
  286. package/modules/auth/src/server/index.ts +22 -1
  287. package/modules/auth/src/server/membership-endpoints.ts +62 -0
  288. package/modules/auth/src/server/mfa-enforcement.ts +156 -0
  289. package/modules/auth/src/server/oidc.ts +389 -0
  290. package/modules/auth/src/server/provider-endpoints.ts +246 -0
  291. package/modules/auth/src/server/provider-host.ts +77 -0
  292. package/modules/auth/src/server/runtime.ts +231 -55
  293. package/modules/auth/src/services/auth-service-error.ts +7 -2
  294. package/modules/auth/src/services/auth-service.ts +948 -51
  295. package/modules/auth/src/services/data-classes.ts +236 -0
  296. package/modules/auth/src/services/database-repository.ts +853 -71
  297. package/modules/auth/src/services/identity-provider-service.ts +571 -0
  298. package/modules/auth/src/services/mail-delivery.ts +16 -16
  299. package/modules/auth/src/services/mail-message.ts +54 -0
  300. package/modules/auth/src/services/mail-port.ts +24 -0
  301. package/modules/auth/src/services/mail-smtp.ts +85 -0
  302. package/modules/auth/src/services/mfa-rotation.ts +144 -0
  303. package/modules/auth/src/services/migration.ts +810 -0
  304. package/modules/auth/src/services/password.ts +14 -0
  305. package/modules/auth/src/services/provider-secret-rotation.ts +169 -0
  306. package/modules/auth/src/services/provider-secrets.ts +136 -0
  307. package/modules/auth/src/services/repository.ts +321 -5
  308. package/modules/auth/src/services/session-sweep-runner.ts +73 -0
  309. package/modules/auth/src/services/settings-store.ts +10 -83
  310. package/modules/auth/src/services/totp.ts +88 -62
  311. package/modules/auth/src/services/validation.ts +194 -7
  312. package/modules/auth/src/settings.ts +18 -0
  313. package/modules/auth/translations/en.json +84 -1
  314. package/modules/auth/translations/pl.json +84 -1
  315. package/modules/automations/migrations/0005_secret_rotation_inventory.down.sql +1 -0
  316. package/modules/automations/migrations/0005_secret_rotation_inventory.up.sql +6 -0
  317. package/modules/automations/migrations/0006_automations_list_sort_indexes.down.sql +4 -0
  318. package/modules/automations/migrations/0006_automations_list_sort_indexes.up.sql +11 -0
  319. package/modules/automations/module.json +24 -6
  320. package/modules/automations/package.json +4 -1
  321. package/modules/automations/spec/module.yaml +81 -7
  322. package/modules/automations/src/api/endpoints.ts +202 -28
  323. package/modules/automations/src/cli/commands.json +17 -0
  324. package/modules/automations/src/cli/index.ts +114 -0
  325. package/modules/automations/src/client/AutomationScheduleForm.tsrx +77 -19
  326. package/modules/automations/src/client/AutomationSchedulesView.tsrx +144 -40
  327. package/modules/automations/src/client/AutomationTriggersView.tsrx +131 -32
  328. package/modules/automations/src/client/api.ts +62 -19
  329. package/modules/automations/src/client/presentation.ts +20 -2
  330. package/modules/automations/src/client/state.ts +84 -0
  331. package/modules/automations/src/domain/cadence.ts +99 -3
  332. package/modules/automations/src/domain/cron.ts +366 -0
  333. package/modules/automations/src/domain/time-zone.ts +61 -0
  334. package/modules/automations/src/platform.ts +38 -4
  335. package/modules/automations/src/server/index.ts +11 -0
  336. package/modules/automations/src/server/runtime.ts +46 -22
  337. package/modules/{automations-workflows-integration/src/server/adapter.ts → automations/src/server/workflow-target.ts} +13 -14
  338. package/modules/{automations-workflows-integration/src/server/tools.ts → automations/src/server/workflow-tools.ts} +0 -0
  339. package/modules/automations/src/services/data-classes.ts +62 -0
  340. package/modules/automations/src/services/database-repository.ts +152 -38
  341. package/modules/automations/src/services/migration.ts +119 -9
  342. package/modules/automations/src/services/repository.ts +52 -1
  343. package/modules/automations/src/services/schedule-runner.ts +84 -0
  344. package/modules/automations/src/services/schedule-service.ts +152 -26
  345. package/modules/automations/src/services/secret-rotation.ts +176 -0
  346. package/modules/automations/src/services/secret-vault.ts +68 -41
  347. package/modules/automations/src/services/trigger-service.ts +13 -10
  348. package/modules/automations/translations/en.json +15 -2
  349. package/modules/automations/translations/pl.json +15 -2
  350. package/modules/connectors/migrations/0001_connectors_core.down.sql +3 -0
  351. package/modules/connectors/migrations/0001_connectors_core.up.sql +72 -0
  352. package/modules/connectors/migrations/0002_connectors_call_keys.down.sql +3 -0
  353. package/modules/connectors/migrations/0002_connectors_call_keys.up.sql +18 -0
  354. package/modules/connectors/migrations/0003_connectors_rotation_inventory.down.sql +2 -0
  355. package/modules/connectors/migrations/0003_connectors_rotation_inventory.up.sql +19 -0
  356. package/modules/connectors/migrations/README.md +3 -0
  357. package/modules/connectors/module.json +32 -0
  358. package/modules/{automations-workflows-integration → connectors}/package.json +28 -26
  359. package/modules/connectors/spec/module.yaml +448 -0
  360. package/modules/connectors/src/acl/permissions.ts +6 -0
  361. package/modules/connectors/src/agent/tools.ts +180 -0
  362. package/modules/connectors/src/api/endpoints.ts +572 -0
  363. package/modules/connectors/src/cli/commands.json +17 -0
  364. package/modules/connectors/src/cli/index.ts +126 -0
  365. package/modules/connectors/src/client/ConnectorCallsView.tsrx +358 -0
  366. package/modules/connectors/src/client/ConnectorForm.tsrx +424 -0
  367. package/modules/connectors/src/client/ConnectorsView.tsrx +711 -0
  368. package/modules/connectors/src/client/api.ts +281 -0
  369. package/modules/connectors/src/client/consent.ts +48 -0
  370. package/modules/connectors/src/client/contribution.tsrx +37 -0
  371. package/modules/connectors/src/client/index.ts +22 -0
  372. package/modules/connectors/src/client/navigation.ts +42 -0
  373. package/modules/connectors/src/client/presentation.ts +38 -0
  374. package/modules/connectors/src/client/state.ts +175 -0
  375. package/modules/connectors/src/domain/calls.ts +70 -0
  376. package/modules/connectors/src/domain/definitions.ts +190 -0
  377. package/modules/connectors/src/domain/http-json.ts +68 -0
  378. package/modules/connectors/src/domain/types.ts +185 -0
  379. package/modules/connectors/src/index.ts +64 -0
  380. package/modules/connectors/src/platform.ts +56 -0
  381. package/modules/connectors/src/server/index.ts +66 -0
  382. package/modules/connectors/src/server/runtime.ts +163 -0
  383. package/modules/connectors/src/services/call-service.ts +903 -0
  384. package/modules/connectors/src/services/connectors-service.ts +653 -0
  385. package/modules/connectors/src/services/credential-rotation.ts +221 -0
  386. package/modules/connectors/src/services/credential-vault.ts +194 -0
  387. package/modules/connectors/src/services/data-classes.ts +158 -0
  388. package/modules/connectors/src/services/database-repository.ts +897 -0
  389. package/modules/connectors/src/services/egress.ts +261 -0
  390. package/modules/connectors/src/services/index.ts +19 -0
  391. package/modules/connectors/src/services/migration.ts +202 -0
  392. package/modules/connectors/src/services/repository.ts +175 -0
  393. package/modules/connectors/src/services/service-error.ts +46 -0
  394. package/modules/connectors/src/settings.ts +69 -0
  395. package/modules/connectors/translations/en.json +191 -0
  396. package/modules/connectors/translations/pl.json +191 -0
  397. package/modules/directory/migrations/0001_directory_core.down.sql +5 -0
  398. package/modules/directory/migrations/0001_directory_core.up.sql +111 -0
  399. package/modules/directory/migrations/README.md +3 -0
  400. package/modules/directory/module.json +27 -0
  401. package/modules/directory/package.json +46 -0
  402. package/modules/directory/spec/module.yaml +351 -0
  403. package/modules/directory/src/acl/permissions.ts +7 -0
  404. package/modules/directory/src/api/endpoints.ts +478 -0
  405. package/modules/directory/src/api/scim-endpoints.ts +516 -0
  406. package/modules/directory/src/client/GroupMappingsView.tsrx +430 -0
  407. package/modules/directory/src/client/ProvisioningLogView.tsrx +248 -0
  408. package/modules/directory/src/client/ScimTokensView.tsrx +587 -0
  409. package/modules/directory/src/client/api.ts +222 -0
  410. package/modules/directory/src/client/contribution.tsrx +46 -0
  411. package/modules/directory/src/client/index.ts +22 -0
  412. package/modules/directory/src/client/navigation.ts +57 -0
  413. package/modules/directory/src/client/presentation.ts +143 -0
  414. package/modules/directory/src/client/state.ts +173 -0
  415. package/modules/directory/src/domain/scim.ts +346 -0
  416. package/modules/directory/src/domain/types.ts +166 -0
  417. package/modules/directory/src/index.ts +44 -0
  418. package/modules/directory/src/platform.ts +43 -0
  419. package/modules/directory/src/server/index.ts +17 -0
  420. package/modules/directory/src/server/runtime.ts +124 -0
  421. package/modules/directory/src/services/auth-port.ts +127 -0
  422. package/modules/directory/src/services/data-classes.ts +41 -0
  423. package/modules/directory/src/services/database-repository.ts +1067 -0
  424. package/modules/directory/src/services/directory-service.ts +311 -0
  425. package/modules/directory/src/services/index.ts +43 -0
  426. package/modules/directory/src/services/migration.ts +146 -0
  427. package/modules/directory/src/services/provisioning-service.ts +1420 -0
  428. package/modules/directory/src/services/rate-limiter.ts +103 -0
  429. package/modules/directory/src/services/repository.ts +208 -0
  430. package/modules/directory/src/services/service-error.ts +42 -0
  431. package/modules/directory/src/services/token-service.ts +215 -0
  432. package/modules/directory/src/settings.ts +86 -0
  433. package/modules/directory/translations/en.json +185 -0
  434. package/modules/directory/translations/pl.json +185 -0
  435. package/modules/documents/migrations/0001_documents_core.down.sql +1 -0
  436. package/modules/documents/migrations/0001_documents_core.up.sql +35 -0
  437. package/modules/documents/migrations/0002_documents_files_page.down.sql +1 -0
  438. package/modules/documents/migrations/0002_documents_files_page.up.sql +6 -0
  439. package/modules/documents/migrations/0003_documents_rotation_inventory.down.sql +2 -0
  440. package/modules/documents/migrations/0003_documents_rotation_inventory.up.sql +18 -0
  441. package/modules/documents/migrations/README.md +3 -0
  442. package/modules/documents/module.json +32 -0
  443. package/modules/documents/package.json +50 -0
  444. package/modules/documents/spec/module.yaml +248 -0
  445. package/modules/documents/src/acl/permissions.ts +6 -0
  446. package/modules/documents/src/api/endpoints.ts +401 -0
  447. package/modules/documents/src/cli/commands.json +17 -0
  448. package/modules/documents/src/cli/index.ts +145 -0
  449. package/modules/documents/src/client/DocumentUploader.tsrx +148 -0
  450. package/modules/documents/src/client/DocumentsView.tsrx +540 -0
  451. package/modules/documents/src/client/api.ts +209 -0
  452. package/modules/documents/src/client/contribution.tsrx +29 -0
  453. package/modules/documents/src/client/download.ts +70 -0
  454. package/modules/documents/src/client/index.ts +22 -0
  455. package/modules/documents/src/client/navigation.ts +25 -0
  456. package/modules/documents/src/client/presentation.ts +110 -0
  457. package/modules/documents/src/client/state.ts +117 -0
  458. package/modules/documents/src/domain/attachments.ts +84 -0
  459. package/modules/documents/src/domain/types.ts +80 -0
  460. package/modules/documents/src/index.ts +46 -0
  461. package/modules/documents/src/platform.ts +61 -0
  462. package/modules/documents/src/server/index.ts +30 -0
  463. package/modules/documents/src/server/runtime.ts +107 -0
  464. package/modules/documents/src/services/attachments.ts +39 -0
  465. package/modules/documents/src/services/data-classes.ts +25 -0
  466. package/modules/documents/src/services/database-repository.ts +270 -0
  467. package/modules/documents/src/services/documents-service.ts +590 -0
  468. package/modules/documents/src/services/index.ts +18 -0
  469. package/modules/documents/src/services/migration.ts +117 -0
  470. package/modules/documents/src/services/repository.ts +58 -0
  471. package/modules/documents/src/services/storage-rotation.ts +157 -0
  472. package/modules/documents/src/settings.ts +107 -0
  473. package/modules/documents/translations/en.json +111 -0
  474. package/modules/documents/translations/pl.json +111 -0
  475. package/modules/exports/migrations/0001_exports_core.down.sql +2 -0
  476. package/modules/exports/migrations/0001_exports_core.up.sql +28 -0
  477. package/modules/exports/migrations/0002_exports_job_routing_role.down.sql +4 -0
  478. package/modules/exports/migrations/0002_exports_job_routing_role.up.sql +21 -0
  479. package/modules/exports/migrations/0003_exports_rotation_inventory.down.sql +1 -0
  480. package/modules/exports/migrations/0003_exports_rotation_inventory.up.sql +9 -0
  481. package/modules/exports/migrations/README.md +3 -0
  482. package/modules/exports/module.json +32 -0
  483. package/modules/exports/package.json +45 -0
  484. package/modules/exports/spec/module.yaml +230 -0
  485. package/modules/exports/src/acl/permissions.ts +6 -0
  486. package/modules/exports/src/api/endpoints.ts +211 -0
  487. package/modules/exports/src/cli/commands.json +17 -0
  488. package/modules/exports/src/cli/index.ts +145 -0
  489. package/modules/exports/src/client/ExportsView.tsrx +327 -0
  490. package/modules/exports/src/client/api.ts +133 -0
  491. package/modules/exports/src/client/contribution.tsrx +31 -0
  492. package/modules/exports/src/client/index.ts +20 -0
  493. package/modules/exports/src/client/navigation.ts +25 -0
  494. package/modules/exports/src/client/presentation.ts +53 -0
  495. package/modules/exports/src/client/state.ts +56 -0
  496. package/modules/exports/src/domain/lists.ts +29 -0
  497. package/modules/exports/src/domain/types.ts +120 -0
  498. package/modules/exports/src/index.ts +41 -0
  499. package/modules/exports/src/platform.ts +80 -0
  500. package/modules/exports/src/server/index.ts +50 -0
  501. package/modules/exports/src/server/runtime.ts +160 -0
  502. package/modules/exports/src/services/data-classes.ts +59 -0
  503. package/modules/exports/src/services/database-repository.ts +403 -0
  504. package/modules/exports/src/services/export-runner.ts +123 -0
  505. package/modules/exports/src/services/export-service.ts +356 -0
  506. package/modules/exports/src/services/index.ts +6 -0
  507. package/modules/exports/src/services/list-registry.ts +105 -0
  508. package/modules/exports/src/services/migration.ts +116 -0
  509. package/modules/exports/src/services/repository.ts +96 -0
  510. package/modules/exports/src/services/storage-rotation.ts +138 -0
  511. package/modules/exports/src/settings.ts +70 -0
  512. package/modules/exports/translations/en.json +69 -0
  513. package/modules/exports/translations/pl.json +69 -0
  514. package/modules/import/migrations/0001_import_core.down.sql +6 -0
  515. package/modules/import/migrations/0001_import_core.up.sql +61 -0
  516. package/modules/import/migrations/0002_import_job_routing_role.down.sql +4 -0
  517. package/modules/import/migrations/0002_import_job_routing_role.up.sql +20 -0
  518. package/modules/import/migrations/0003_import_jobs_export_index.down.sql +1 -0
  519. package/modules/import/migrations/0003_import_jobs_export_index.up.sql +7 -0
  520. package/modules/import/migrations/0004_import_jobs_traceparent.down.sql +1 -0
  521. package/modules/import/migrations/0004_import_jobs_traceparent.up.sql +7 -0
  522. package/modules/import/migrations/README.md +3 -0
  523. package/modules/import/module.json +37 -0
  524. package/modules/import/package.json +50 -0
  525. package/modules/import/spec/module.yaml +335 -0
  526. package/modules/import/src/acl/permissions.ts +6 -0
  527. package/modules/import/src/api/endpoints.ts +400 -0
  528. package/modules/import/src/client/ImportJobDrawer.tsrx +229 -0
  529. package/modules/import/src/client/ImportsView.tsrx +455 -0
  530. package/modules/import/src/client/NewImportForm.tsrx +274 -0
  531. package/modules/import/src/client/api.ts +243 -0
  532. package/modules/import/src/client/contribution.tsrx +29 -0
  533. package/modules/import/src/client/index.ts +23 -0
  534. package/modules/import/src/client/navigation.ts +25 -0
  535. package/modules/import/src/client/presentation.ts +59 -0
  536. package/modules/import/src/client/state.ts +43 -0
  537. package/modules/import/src/domain/csv.ts +258 -0
  538. package/modules/import/src/domain/ports.ts +157 -0
  539. package/modules/import/src/domain/types.ts +179 -0
  540. package/modules/import/src/index.ts +58 -0
  541. package/modules/import/src/platform.ts +60 -0
  542. package/modules/import/src/server/index.ts +49 -0
  543. package/modules/import/src/server/runtime.ts +158 -0
  544. package/modules/import/src/services/csv-source.ts +121 -0
  545. package/modules/import/src/services/data-classes.ts +63 -0
  546. package/modules/import/src/services/database-repository.ts +780 -0
  547. package/modules/import/src/services/import-runner.ts +127 -0
  548. package/modules/import/src/services/import-service.ts +872 -0
  549. package/modules/import/src/services/index.ts +6 -0
  550. package/modules/import/src/services/migration.ts +156 -0
  551. package/modules/import/src/services/port-registry.ts +158 -0
  552. package/modules/import/src/services/repository.ts +147 -0
  553. package/modules/import/src/settings.ts +70 -0
  554. package/modules/import/translations/en.json +175 -0
  555. package/modules/import/translations/pl.json +175 -0
  556. package/modules/metering/migrations/0001_metering_core.down.sql +6 -0
  557. package/modules/metering/migrations/0001_metering_core.up.sql +119 -0
  558. package/modules/metering/migrations/0002_metering_bucket_export.down.sql +3 -0
  559. package/modules/metering/migrations/0002_metering_bucket_export.up.sql +5 -0
  560. package/modules/metering/migrations/README.md +3 -0
  561. package/modules/metering/module.json +46 -0
  562. package/modules/metering/package.json +50 -0
  563. package/modules/metering/spec/module.yaml +269 -0
  564. package/modules/metering/src/acl/permissions.ts +5 -0
  565. package/modules/metering/src/api/endpoints.ts +104 -0
  566. package/modules/metering/src/cli/commands.json +28 -0
  567. package/modules/metering/src/cli/index.ts +246 -0
  568. package/modules/metering/src/client/LimitsView.tsrx +170 -0
  569. package/modules/metering/src/client/UsageSummaryWidget.tsrx +63 -0
  570. package/modules/metering/src/client/UsageView.tsrx +205 -0
  571. package/modules/metering/src/client/api.ts +91 -0
  572. package/modules/metering/src/client/contribution.tsrx +42 -0
  573. package/modules/metering/src/client/index.ts +26 -0
  574. package/modules/metering/src/client/navigation.ts +54 -0
  575. package/modules/metering/src/client/presentation.ts +63 -0
  576. package/modules/metering/src/client/state.ts +31 -0
  577. package/modules/metering/src/domain/meters.ts +100 -0
  578. package/modules/metering/src/domain/types.ts +71 -0
  579. package/modules/metering/src/index.ts +51 -0
  580. package/modules/metering/src/platform.ts +84 -0
  581. package/modules/metering/src/server/index.ts +40 -0
  582. package/modules/metering/src/server/runtime.ts +165 -0
  583. package/modules/metering/src/services/data-classes.ts +34 -0
  584. package/modules/metering/src/services/database-repository.ts +574 -0
  585. package/modules/metering/src/services/index.ts +9 -0
  586. package/modules/metering/src/services/meter-registry.ts +145 -0
  587. package/modules/metering/src/services/metering-service.ts +441 -0
  588. package/modules/metering/src/services/migration.ts +183 -0
  589. package/modules/metering/src/services/notifications.ts +75 -0
  590. package/modules/metering/src/services/reports.ts +105 -0
  591. package/modules/metering/src/services/repository.ts +132 -0
  592. package/modules/metering/src/services/service-error.ts +46 -0
  593. package/modules/metering/src/settings.ts +47 -0
  594. package/modules/metering/translations/en.json +68 -0
  595. package/modules/metering/translations/pl.json +68 -0
  596. package/modules/notifications/migrations/0001_notifications_core.down.sql +1 -0
  597. package/modules/notifications/migrations/0001_notifications_core.up.sql +26 -0
  598. package/modules/notifications/migrations/0002_notifications_preferences.down.sql +1 -0
  599. package/modules/notifications/migrations/0002_notifications_preferences.up.sql +17 -0
  600. package/modules/notifications/migrations/0003_notifications_webhook_subscriptions.down.sql +1 -0
  601. package/modules/notifications/migrations/0003_notifications_webhook_subscriptions.up.sql +30 -0
  602. package/modules/notifications/migrations/0004_notifications_deliveries.down.sql +1 -0
  603. package/modules/notifications/migrations/0004_notifications_deliveries.up.sql +35 -0
  604. package/modules/notifications/migrations/0005_notifications_delivery_routing_role.down.sql +2 -0
  605. package/modules/notifications/migrations/0005_notifications_delivery_routing_role.up.sql +17 -0
  606. package/modules/notifications/migrations/0006_notifications_delivery_title.down.sql +1 -0
  607. package/modules/notifications/migrations/0006_notifications_delivery_title.up.sql +11 -0
  608. package/modules/notifications/migrations/0007_notifications_secret_rotation_inventory.down.sql +2 -0
  609. package/modules/notifications/migrations/0007_notifications_secret_rotation_inventory.up.sql +19 -0
  610. package/modules/notifications/migrations/0008_notifications_delivery_claim.down.sql +8 -0
  611. package/modules/notifications/migrations/0008_notifications_delivery_claim.up.sql +19 -0
  612. package/modules/notifications/migrations/0009_notifications_kind_approvals.down.sql +16 -0
  613. package/modules/notifications/migrations/0009_notifications_kind_approvals.up.sql +18 -0
  614. package/modules/notifications/migrations/0010_notifications_kind_meter_threshold.down.sql +16 -0
  615. package/modules/notifications/migrations/0010_notifications_kind_meter_threshold.up.sql +18 -0
  616. package/modules/notifications/migrations/0011_notifications_retention_keyset.down.sql +5 -0
  617. package/modules/notifications/migrations/0011_notifications_retention_keyset.up.sql +15 -0
  618. package/modules/notifications/migrations/0012_notifications_email_channel.down.sql +12 -0
  619. package/modules/notifications/migrations/0012_notifications_email_channel.up.sql +38 -0
  620. package/modules/notifications/migrations/0013_notifications_list_pages.down.sql +5 -0
  621. package/modules/notifications/migrations/0013_notifications_list_pages.up.sql +13 -0
  622. package/modules/notifications/migrations/README.md +3 -0
  623. package/modules/notifications/module.json +32 -0
  624. package/modules/notifications/package.json +49 -0
  625. package/modules/notifications/spec/module.yaml +718 -0
  626. package/modules/notifications/src/acl/permissions.ts +11 -0
  627. package/modules/notifications/src/api/endpoints.ts +814 -0
  628. package/modules/notifications/src/cli/commands.json +17 -0
  629. package/modules/notifications/src/cli/index.ts +126 -0
  630. package/modules/notifications/src/client/DeliveriesView.tsrx +483 -0
  631. package/modules/notifications/src/client/FactList.tsrx +24 -0
  632. package/modules/notifications/src/client/NotificationPreferencesView.tsrx +240 -0
  633. package/modules/notifications/src/client/NotificationsInboxView.tsrx +592 -0
  634. package/modules/notifications/src/client/UnreadCountWidget.tsrx +62 -0
  635. package/modules/notifications/src/client/WebhookForm.tsrx +297 -0
  636. package/modules/notifications/src/client/WebhooksView.tsrx +637 -0
  637. package/modules/notifications/src/client/api.ts +382 -0
  638. package/modules/notifications/src/client/contribution.tsrx +83 -0
  639. package/modules/notifications/src/client/inbox.ts +41 -0
  640. package/modules/notifications/src/client/index.ts +29 -0
  641. package/modules/notifications/src/client/navigation.ts +92 -0
  642. package/modules/notifications/src/client/notifications.css +70 -0
  643. package/modules/notifications/src/client/presentation.ts +81 -0
  644. package/modules/notifications/src/client/state.ts +246 -0
  645. package/modules/notifications/src/client/unread-count.ts +26 -0
  646. package/modules/notifications/src/domain/locale.ts +47 -0
  647. package/modules/notifications/src/domain/publish.ts +46 -0
  648. package/modules/notifications/src/domain/types.ts +186 -0
  649. package/modules/notifications/src/index.ts +62 -0
  650. package/modules/notifications/src/platform.ts +85 -0
  651. package/modules/notifications/src/server/index.ts +82 -0
  652. package/modules/notifications/src/server/runtime.ts +251 -0
  653. package/modules/notifications/src/services/data-classes.ts +139 -0
  654. package/modules/notifications/src/services/database-repository.ts +1334 -0
  655. package/modules/notifications/src/services/delivery-payload.ts +93 -0
  656. package/modules/notifications/src/services/delivery-runner.ts +170 -0
  657. package/modules/notifications/src/services/delivery-service.ts +811 -0
  658. package/modules/notifications/src/services/egress.ts +239 -0
  659. package/modules/notifications/src/services/email-channel.ts +93 -0
  660. package/modules/notifications/src/services/index.ts +23 -0
  661. package/modules/notifications/src/services/migration.ts +572 -0
  662. package/modules/notifications/src/services/notifications-service.ts +297 -0
  663. package/modules/notifications/src/services/paging.ts +60 -0
  664. package/modules/notifications/src/services/publish-service.ts +133 -0
  665. package/modules/notifications/src/services/repository.ts +342 -0
  666. package/modules/notifications/src/services/secret-rotation.ts +177 -0
  667. package/modules/notifications/src/services/secret-vault.ts +168 -0
  668. package/modules/notifications/src/services/service-error.ts +67 -0
  669. package/modules/notifications/src/services/signature.ts +81 -0
  670. package/modules/notifications/src/services/webhook-service.ts +307 -0
  671. package/modules/notifications/src/settings.ts +130 -0
  672. package/modules/notifications/translations/en.json +255 -0
  673. package/modules/notifications/translations/pl.json +255 -0
  674. package/modules/profile/module.json +3 -3
  675. package/modules/profile/package.json +1 -1
  676. package/modules/profile/spec/module.yaml +3 -3
  677. package/modules/profile/src/services/database-repository.ts +3 -13
  678. package/modules/reports/module.json +28 -0
  679. package/modules/reports/package.json +42 -0
  680. package/modules/reports/spec/module.yaml +231 -0
  681. package/modules/reports/src/acl/permissions.ts +5 -0
  682. package/modules/reports/src/api/endpoints.ts +72 -0
  683. package/modules/reports/src/client/ReportsSummaryWidget.tsrx +52 -0
  684. package/modules/reports/src/client/ReportsView.tsrx +246 -0
  685. package/modules/reports/src/client/api.ts +65 -0
  686. package/modules/reports/src/client/contribution.tsrx +36 -0
  687. package/modules/reports/src/client/index.ts +18 -0
  688. package/modules/reports/src/client/navigation.ts +39 -0
  689. package/modules/reports/src/client/presentation.ts +123 -0
  690. package/modules/reports/src/client/state.ts +28 -0
  691. package/modules/reports/src/domain/providers.ts +115 -0
  692. package/modules/reports/src/domain/types.ts +44 -0
  693. package/modules/reports/src/index.ts +47 -0
  694. package/modules/reports/src/platform.ts +37 -0
  695. package/modules/reports/src/server/index.ts +21 -0
  696. package/modules/reports/src/server/runtime.ts +40 -0
  697. package/modules/reports/src/services/index.ts +17 -0
  698. package/modules/reports/src/services/provider-registry.ts +144 -0
  699. package/modules/reports/src/services/range.ts +65 -0
  700. package/modules/reports/src/services/reports-service.ts +316 -0
  701. package/modules/reports/src/services/service-error.ts +26 -0
  702. package/modules/reports/src/settings.ts +49 -0
  703. package/modules/reports/translations/en.json +35 -0
  704. package/modules/reports/translations/pl.json +35 -0
  705. package/modules/sandbox/module.json +4 -4
  706. package/modules/sandbox/package.json +1 -1
  707. package/modules/sandbox/spec/module.yaml +3 -3
  708. package/modules/sandbox/src/services/database-repository.ts +14 -23
  709. package/modules/sandbox/src/services/directory.ts +16 -0
  710. package/modules/sandbox/src/services/sandbox-service.ts +13 -11
  711. package/modules/search/migrations/0001_search_core.down.sql +1 -0
  712. package/modules/search/migrations/0001_search_core.up.sql +22 -0
  713. package/modules/search/migrations/0002_search_recent_export.down.sql +3 -0
  714. package/modules/search/migrations/0002_search_recent_export.up.sql +5 -0
  715. package/modules/search/migrations/README.md +3 -0
  716. package/modules/search/module.json +28 -0
  717. package/modules/search/package.json +43 -0
  718. package/modules/search/spec/module.yaml +177 -0
  719. package/modules/search/src/acl/permissions.ts +5 -0
  720. package/modules/search/src/api/endpoints.ts +221 -0
  721. package/modules/search/src/client/SearchView.tsrx +346 -0
  722. package/modules/search/src/client/api.ts +157 -0
  723. package/modules/search/src/client/contribution.tsrx +31 -0
  724. package/modules/search/src/client/index.ts +17 -0
  725. package/modules/search/src/client/navigation.ts +97 -0
  726. package/modules/search/src/client/search.css +56 -0
  727. package/modules/search/src/client/state.ts +113 -0
  728. package/modules/search/src/domain/data-classes.ts +73 -0
  729. package/modules/search/src/domain/providers.ts +88 -0
  730. package/modules/search/src/domain/types.ts +56 -0
  731. package/modules/search/src/index.ts +46 -0
  732. package/modules/search/src/platform.ts +42 -0
  733. package/modules/search/src/server/index.ts +25 -0
  734. package/modules/search/src/server/runtime.ts +123 -0
  735. package/modules/search/src/services/database-repository.ts +163 -0
  736. package/modules/search/src/services/index.ts +21 -0
  737. package/modules/search/src/services/migration.ts +65 -0
  738. package/modules/search/src/services/provider-registry.ts +137 -0
  739. package/modules/search/src/services/repository.ts +43 -0
  740. package/modules/search/src/services/search-service.ts +442 -0
  741. package/modules/search/src/services/service-error.ts +35 -0
  742. package/modules/search/src/settings.ts +68 -0
  743. package/modules/search/translations/en.json +45 -0
  744. package/modules/search/translations/pl.json +45 -0
  745. package/modules/system/module.json +2 -2
  746. package/modules/system/package.json +1 -1
  747. package/modules/system/spec/module.yaml +30 -3
  748. package/modules/system/src/client/FlagsPanel.tsrx +127 -0
  749. package/modules/system/src/client/ModuleSettingRow.tsrx +17 -7
  750. package/modules/system/src/client/ModuleSettingsSection.tsrx +10 -71
  751. package/modules/system/src/client/ModulesView.tsrx +91 -65
  752. package/modules/system/src/client/flags.ts +35 -0
  753. package/modules/system/src/client/index.ts +8 -0
  754. package/modules/system/src/client/navigation.ts +8 -0
  755. package/modules/system/src/client/settings-state.ts +159 -0
  756. package/modules/system/src/client/state.ts +2 -0
  757. package/modules/system/src/domain/time-zone.ts +105 -0
  758. package/modules/system/src/index.ts +12 -0
  759. package/modules/system/src/platform.ts +5 -1
  760. package/modules/system/src/server/endpoints.ts +72 -21
  761. package/modules/system/src/settings.ts +28 -0
  762. package/modules/system/translations/en.json +17 -0
  763. package/modules/system/translations/pl.json +17 -0
  764. package/modules/users/module.json +30 -4
  765. package/modules/users/package.json +4 -1
  766. package/modules/users/spec/module.yaml +290 -7
  767. package/modules/users/src/api/endpoints.ts +228 -15
  768. package/modules/users/src/client/InviteMemberForm.tsrx +2 -2
  769. package/modules/users/src/client/MemberDrawer.tsrx +142 -26
  770. package/modules/users/src/client/UserAccountForm.tsrx +2 -2
  771. package/modules/users/src/client/UsersView.tsrx +432 -71
  772. package/modules/users/src/client/api.ts +106 -12
  773. package/modules/users/src/client/contribution.tsrx +5 -0
  774. package/modules/users/src/client/member-columns.tsrx +22 -9
  775. package/modules/users/src/client/state.ts +172 -7
  776. package/modules/users/src/domain/lists.ts +9 -0
  777. package/modules/users/src/index.ts +11 -0
  778. package/modules/users/src/platform.ts +50 -1
  779. package/modules/users/src/services/member-export.ts +51 -0
  780. package/modules/users/src/services/member-import.ts +249 -0
  781. package/modules/users/src/services/member-search.ts +145 -0
  782. package/modules/users/src/services/users-service.ts +117 -4
  783. package/modules/users/translations/en.json +57 -8
  784. package/modules/users/translations/pl.json +57 -8
  785. package/modules/workflows/migrations/0004_payload_rotation_inventory.up.sql +17 -0
  786. package/modules/workflows/migrations/0005_workflows_human_approval.up.sql +28 -0
  787. package/modules/workflows/migrations/0006_workflows_retention_indexes.up.sql +11 -0
  788. package/modules/workflows/migrations/0007_workflows_erasure_subject_indexes.up.sql +17 -0
  789. package/modules/workflows/migrations/0008_workflows_subject_account.up.sql +24 -0
  790. package/modules/workflows/migrations/0009_workflows_definition_list_indexes.up.sql +9 -0
  791. package/modules/workflows/module.json +34 -6
  792. package/modules/workflows/package.json +2 -1
  793. package/modules/workflows/spec/module.yaml +26 -9
  794. package/modules/workflows/src/api/endpoints.ts +131 -25
  795. package/modules/workflows/src/cli/commands.json +17 -0
  796. package/modules/workflows/src/cli/index.ts +114 -0
  797. package/modules/workflows/src/client/WorkflowExecutionHistory.tsrx +36 -27
  798. package/modules/workflows/src/client/WorkflowInspector.tsrx +116 -0
  799. package/modules/workflows/src/client/WorkflowNodePalette.tsrx +1 -0
  800. package/modules/workflows/src/client/WorkflowsView.tsrx +236 -99
  801. package/modules/workflows/src/client/api.ts +54 -34
  802. package/modules/workflows/src/client/canvas-model.ts +12 -0
  803. package/modules/workflows/src/client/state.ts +95 -0
  804. package/modules/workflows/src/domain/events.ts +25 -11
  805. package/modules/workflows/src/domain/graph.ts +135 -1
  806. package/modules/workflows/src/domain/types.ts +91 -4
  807. package/modules/workflows/src/platform.ts +12 -0
  808. package/modules/workflows/src/server/runtime.ts +78 -5
  809. package/modules/workflows/src/services/approvals.ts +62 -0
  810. package/modules/workflows/src/services/cursors.ts +37 -0
  811. package/modules/workflows/src/services/data-classes.ts +232 -0
  812. package/modules/workflows/src/services/database-repository.ts +660 -171
  813. package/modules/workflows/src/services/migration.ts +240 -0
  814. package/modules/workflows/src/services/notifications.ts +98 -0
  815. package/modules/workflows/src/services/payload-codec.ts +51 -28
  816. package/modules/workflows/src/services/payload-rotation.ts +171 -0
  817. package/modules/workflows/src/services/repository.ts +123 -8
  818. package/modules/workflows/src/services/simulation.ts +7 -0
  819. package/modules/workflows/src/services/worker.ts +446 -25
  820. package/modules/workflows/src/services/workflows-service.ts +264 -103
  821. package/modules/workflows/translations/en.json +12 -4
  822. package/modules/workflows/translations/pl.json +12 -4
  823. package/modules.json +48 -4
  824. package/package.json +64 -6
  825. package/packages/client/package.json +1 -0
  826. package/packages/client/src/ApplicationShell.tsrx +43 -0
  827. package/packages/client/src/contributions.ts +55 -0
  828. package/packages/client/src/i18n/locales/en.json +5 -0
  829. package/packages/client/src/i18n/locales/pl.json +5 -0
  830. package/packages/client/src/index.ts +13 -1
  831. package/packages/client/src/routing.ts +22 -0
  832. package/packages/client/src/shell/CommandPalette.tsrx +223 -11
  833. package/packages/client/src/shell/command-search.ts +126 -0
  834. package/packages/client/src/shell/command.ts +30 -0
  835. package/packages/client/src/shell/navigation.ts +12 -0
  836. package/packages/client/src/shell/palette-keys.ts +27 -0
  837. package/packages/client/src/shell/shell.css +7 -0
  838. package/packages/contracts/schemas/module-spec.schema.json +287 -1
  839. package/packages/contracts/schemas/module.schema.json +25 -0
  840. package/packages/contracts/src/index.ts +144 -1
  841. package/packages/database/src/backup.ts +180 -0
  842. package/packages/database/src/decoders.ts +25 -0
  843. package/packages/database/src/index.ts +17 -0
  844. package/packages/database/src/migrations.ts +7 -0
  845. package/packages/database/src/record-history.ts +5 -14
  846. package/packages/harness/src/index.ts +2 -0
  847. package/packages/harness/src/runtime.ts +378 -2
  848. package/packages/harness/src/tool-adapters.ts +20 -9
  849. package/packages/kernel/src/acl.ts +179 -0
  850. package/packages/kernel/src/approval-grant.ts +310 -0
  851. package/packages/kernel/src/capability-registry.ts +69 -2
  852. package/packages/kernel/src/data-class-registry.ts +354 -0
  853. package/packages/kernel/src/index.ts +85 -4
  854. package/packages/kernel/src/keyring.ts +208 -0
  855. package/packages/kernel/src/module-compatibility.ts +35 -4
  856. package/packages/kernel/src/module-registry.ts +49 -2
  857. package/packages/kernel/src/module-settings.ts +189 -27
  858. package/packages/server/package.json +2 -1
  859. package/packages/server/src/composition.ts +38 -0
  860. package/packages/server/src/endpoint.ts +104 -47
  861. package/packages/server/src/export/csv.ts +34 -0
  862. package/packages/server/src/export/definition.ts +346 -0
  863. package/packages/server/src/export/index.ts +61 -0
  864. package/packages/server/src/export/run.ts +116 -0
  865. package/packages/server/src/index.ts +155 -0
  866. package/packages/server/src/jobs/index.ts +93 -0
  867. package/packages/server/src/jobs/runner.ts +486 -0
  868. package/packages/server/src/log.ts +291 -0
  869. package/packages/server/src/mail/config.ts +184 -0
  870. package/packages/server/src/mail/contracts.ts +251 -0
  871. package/packages/server/src/mail/index.ts +31 -0
  872. package/packages/server/src/mail/port.ts +101 -0
  873. package/packages/server/src/mail/smtp.ts +191 -0
  874. package/packages/server/src/mail/template.ts +105 -0
  875. package/packages/server/src/metrics.ts +447 -0
  876. package/packages/server/src/pagination.ts +246 -0
  877. package/packages/server/src/trace/context.ts +103 -0
  878. package/packages/server/src/trace/egress.ts +66 -0
  879. package/packages/server/src/trace/error-sink.ts +296 -0
  880. package/packages/server/src/trace/exporter.ts +295 -0
  881. package/packages/server/src/trace/index.ts +60 -0
  882. package/packages/server/src/trace/job-sink.ts +172 -0
  883. package/packages/server/src/trace/tracer.ts +338 -0
  884. package/packages/server/src/web.ts +5 -1
  885. package/packages/storage/package.json +40 -0
  886. package/packages/storage/src/config.ts +189 -0
  887. package/packages/storage/src/content-type.ts +124 -0
  888. package/packages/storage/src/contracts.ts +112 -0
  889. package/packages/storage/src/envelope.ts +238 -0
  890. package/packages/storage/src/index.ts +49 -0
  891. package/packages/storage/src/local.ts +75 -0
  892. package/packages/storage/src/port.ts +262 -0
  893. package/packages/storage/src/read-token.ts +130 -0
  894. package/packages/storage/src/reseal.ts +128 -0
  895. package/packages/storage/src/s3.ts +144 -0
  896. package/packages/storage/src/scanner.ts +22 -0
  897. package/packages/storage/src/sigv4.ts +104 -0
  898. package/packages/storage/src/store.ts +13 -0
  899. package/packages/ui/package.json +1 -0
  900. package/packages/ui/src/components/Button.tsrx +3 -0
  901. package/packages/ui/src/components/ConfirmDialog.tsrx +13 -2
  902. package/packages/ui/src/components/DateField.tsrx +92 -0
  903. package/packages/ui/src/components/DatePicker.tsrx +525 -0
  904. package/packages/ui/src/components/DateRangeField.tsrx +93 -0
  905. package/packages/ui/src/components/Drawer.tsrx +10 -1
  906. package/packages/ui/src/components/FileUpload.tsrx +158 -0
  907. package/packages/ui/src/components/Pagination.tsrx +130 -0
  908. package/packages/ui/src/components/Select.tsrx +78 -0
  909. package/packages/ui/src/components/Table.tsrx +498 -81
  910. package/packages/ui/src/components/Tabs.tsrx +53 -0
  911. package/packages/ui/src/components/ToastHost.tsrx +48 -0
  912. package/packages/ui/src/components/calendar.ts +243 -0
  913. package/packages/ui/src/components/date-field.ts +62 -0
  914. package/packages/ui/src/components/file-upload.ts +49 -0
  915. package/packages/ui/src/components/focus-trap.ts +62 -0
  916. package/packages/ui/src/components/pagination.ts +68 -0
  917. package/packages/ui/src/components/table-sorting.ts +49 -0
  918. package/packages/ui/src/components/tabs.ts +61 -0
  919. package/packages/ui/src/components/toast-store.ts +116 -0
  920. package/packages/ui/src/icons/Icon.tsrx +5 -0
  921. package/packages/ui/src/index.ts +45 -0
  922. package/packages/ui/src/styles/components.css +598 -0
  923. package/modules/automations-workflows-integration/module.json +0 -27
  924. package/modules/automations-workflows-integration/spec/module.yaml +0 -93
  925. package/modules/automations-workflows-integration/src/index.ts +0 -14
  926. package/modules/automations-workflows-integration/src/platform.ts +0 -24
  927. package/modules/automations-workflows-integration/src/server/index.ts +0 -11
  928. package/modules/automations-workflows-integration/translations/en.json +0 -21
  929. package/modules/automations-workflows-integration/translations/pl.json +0 -21
  930. package/modules/workflows/src/services/cursor-codec.ts +0 -62
@@ -0,0 +1,28 @@
1
+ CREATE TABLE IF NOT EXISTS exports_jobs (
2
+ id TEXT PRIMARY KEY,
3
+ tenant_id TEXT NOT NULL,
4
+ list_id TEXT NOT NULL CHECK (length(list_id) BETWEEN 3 AND 96),
5
+ status TEXT NOT NULL CHECK (status IN ('requested', 'running', 'completed', 'failed')),
6
+ row_count BIGINT NOT NULL CHECK (row_count >= 0),
7
+ byte_count BIGINT NOT NULL CHECK (byte_count >= 0),
8
+ object_id TEXT CHECK (object_id IS NULL OR length(object_id) BETWEEN 1 AND 128),
9
+ requester_account_id TEXT NOT NULL CHECK (length(requester_account_id) BETWEEN 1 AND 128),
10
+ requester_json TEXT NOT NULL CHECK (length(requester_json) <= 8192 AND requester_json::jsonb IS NOT NULL),
11
+ failure_code TEXT CHECK (failure_code IS NULL OR length(failure_code) BETWEEN 1 AND 64),
12
+ claimed_at BIGINT,
13
+ started_at BIGINT NOT NULL,
14
+ completed_at BIGINT,
15
+ UNIQUE (tenant_id, object_id),
16
+ CHECK ((status IN ('completed', 'failed')) = (completed_at IS NOT NULL)),
17
+ CHECK ((failure_code IS NOT NULL) = (status = 'failed')),
18
+ CHECK (object_id IS NULL OR status = 'completed')
19
+ );
20
+ CREATE INDEX IF NOT EXISTS exports_jobs_tenant_started_idx
21
+ ON exports_jobs (tenant_id, started_at DESC, id);
22
+ CREATE INDEX IF NOT EXISTS exports_jobs_tenant_export_idx
23
+ ON exports_jobs (tenant_id, started_at, id);
24
+ ALTER TABLE exports_jobs ENABLE ROW LEVEL SECURITY;
25
+ ALTER TABLE exports_jobs FORCE ROW LEVEL SECURITY;
26
+ CREATE POLICY exports_jobs_tenant_policy ON exports_jobs
27
+ USING (tenant_id = current_setting('coreloom.tenant_id', true))
28
+ WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
@@ -0,0 +1,4 @@
1
+ REVOKE SELECT (tenant_id, id, status, started_at)
2
+ ON exports_jobs FROM coreloom_background;
3
+ DROP POLICY IF EXISTS exports_jobs_background_policy ON exports_jobs;
4
+ DROP INDEX IF EXISTS exports_jobs_routing_idx;
@@ -0,0 +1,21 @@
1
+ -- The poll loop must find waiting jobs across workspaces before it knows whose
2
+ -- they are, so it reads the routing columns alone on the background role: the
3
+ -- list, the requester snapshot, the object and every count stay invisible to
4
+ -- it, and each job it picks is claimed and run again under the workspace the
5
+ -- routing row named. PostgreSQL checks column privileges in WHERE too, so
6
+ -- `status` is part of the grant. A job already running is routed as well, so a
7
+ -- claim whose process is gone is found again once its lease lapses.
8
+ CREATE INDEX IF NOT EXISTS exports_jobs_routing_idx
9
+ ON exports_jobs (status, started_at, tenant_id, id);
10
+ DO $$
11
+ BEGIN
12
+ IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'coreloom_background') THEN
13
+ RAISE EXCEPTION 'The coreloom_background role must exist before this migration.';
14
+ END IF;
15
+ END
16
+ $$;
17
+ CREATE POLICY exports_jobs_background_policy ON exports_jobs
18
+ FOR SELECT TO coreloom_background
19
+ USING (status IN ('requested', 'running'));
20
+ REVOKE SELECT ON exports_jobs FROM coreloom_background;
21
+ GRANT SELECT (tenant_id, id, status, started_at) ON exports_jobs TO coreloom_background;
@@ -0,0 +1 @@
1
+ DROP POLICY IF EXISTS exports_jobs_rotation_policy ON exports_jobs;
@@ -0,0 +1,9 @@
1
+ -- The storage key rotation has to find the workspaces that still hold export
2
+ -- files before it knows which files those are. The routing policy shows the
3
+ -- background role only waiting and running jobs; this one adds the completed
4
+ -- jobs under the same four routing columns, so the object id, the list, the
5
+ -- requester and every count stay invisible to it, and every file it names is
6
+ -- read again under the workspace that row named.
7
+ CREATE POLICY exports_jobs_rotation_policy ON exports_jobs
8
+ FOR SELECT TO coreloom_background
9
+ USING (status = 'completed');
@@ -0,0 +1,3 @@
1
+ # Migrations
2
+
3
+ Migrations in this directory are append-only after release.
@@ -0,0 +1,32 @@
1
+ {
2
+ "$schema": "../../packages/contracts/schemas/module.schema.json",
3
+ "schemaVersion": 1,
4
+ "id": "exports.core",
5
+ "package": "@flowdular/module-exports",
6
+ "version": "0.2.3",
7
+ "platformApi": "^0.1.2",
8
+ "profile": "full",
9
+ "capabilities": ["api", "database", "client", "translations", "cli"],
10
+ "platform": {
11
+ "server": true,
12
+ "client": true
13
+ },
14
+ "dependencies": [
15
+ {
16
+ "id": "system.core",
17
+ "range": "^0.7.0"
18
+ },
19
+ {
20
+ "id": "auth.core",
21
+ "range": "^0.13.0"
22
+ }
23
+ ],
24
+ "provides": ["exports.lists.v1"],
25
+ "tenancy": "required",
26
+ "locales": ["en", "pl"],
27
+ "stability": "experimental",
28
+ "cli": {
29
+ "catalog": "src/cli/commands.json",
30
+ "entry": "src/cli/index.ts"
31
+ }
32
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@flowdular/module-exports",
3
+ "version": "0.2.3",
4
+ "private": true,
5
+ "type": "module",
6
+ "exports": {
7
+ ".": "./src/index.ts",
8
+ "./client": "./src/client/index.ts",
9
+ "./server": "./src/server/index.ts",
10
+ "./platform": "./src/platform.ts",
11
+ "./module.json": "./module.json"
12
+ },
13
+ "files": [
14
+ "src",
15
+ "module.json",
16
+ "migrations",
17
+ "translations",
18
+ "spec",
19
+ "README.md"
20
+ ],
21
+ "scripts": {
22
+ "typecheck": "tsrx-tsc --noEmit -p tsconfig.json",
23
+ "test": "vitest run"
24
+ },
25
+ "dependencies": {
26
+ "@flowdular/cli-protocol": "workspace:*",
27
+ "@flowdular/client": "workspace:*",
28
+ "@flowdular/contracts": "workspace:*",
29
+ "@flowdular/database": "workspace:*",
30
+ "@flowdular/kernel": "workspace:*",
31
+ "@flowdular/module-auth": "workspace:*",
32
+ "@flowdular/server": "workspace:*",
33
+ "@flowdular/storage": "workspace:*",
34
+ "@flowdular/ui": "workspace:*",
35
+ "octane": "0.1.51",
36
+ "segment-state": "0.2.1"
37
+ },
38
+ "devDependencies": {
39
+ "@flowdular/database-testing": "workspace:*",
40
+ "@tsrx/typescript-plugin": "0.3.120",
41
+ "@types/node": "24.13.3",
42
+ "typescript": "5.9.3",
43
+ "vitest": "4.1.11"
44
+ }
45
+ }
@@ -0,0 +1,230 @@
1
+ schemaVersion: 2
2
+ id: exports.core
3
+ specVersion: 0.2.3
4
+ status: approved
5
+ name: Exports Core
6
+ description: Exports any list endpoint that already pages with the platform keyset helpers as one CSV file, through an export job that streams the list's own pages under the requester's grants, writes an RFC 4180 file with a UTF-8 byte order mark to the storage port, bounds the result by rows and by bytes, and answers a short-lived signed read URL; the list itself stays with the module that owns it and registers a declaration through the public capability exports.lists.v1.
7
+ profile: full
8
+ capabilities:
9
+ - api
10
+ - database
11
+ - client
12
+ - translations
13
+ - cli
14
+ dependencies:
15
+ - id: system.core
16
+ range: ^0.7.0
17
+ - id: auth.core
18
+ range: ^0.13.0
19
+ tenancy: required
20
+ locales:
21
+ - en
22
+ - pl
23
+ invariants:
24
+ - Persistence runs on the shared asynchronous database contract with explicit PostgreSQL SQL; the job table enables and forces row-level security with USING and WITH CHECK policies bound to the transaction-local tenant id, and the runtime role holds neither SUPERUSER nor BYPASSRLS.
25
+ - An exportable list is a declaration a module registers through the public capability exports.lists.v1 while the platform composes, built with defineListExport from the server package, carrying a dotted id prefixed by the registering module id, a label, the permission the list endpoint itself requires, 1 to 64 columns of key, header and value, and the same page(principal, cursor, limit) the list endpoint already implements. Registration is sealed before the first request, so the catalogue a job was started against cannot change under it, and a declaration naming a module other than the one registering it is refused where it is declared.
26
+ - exports.core reads no other module's database. Every row it writes into a file came back from that module's own page call, under the same cursor contract, the same ordering and the same tenant predicate the list endpoint applies, so an export can never carry a row the endpoint would not have returned.
27
+ - Starting an export needs exports.lists.manage and the declared permission of the list being exported, both checked on the live principal before a job row exists, so an export never widens what a member may read. What the background stage carries is a snapshot of the requester taken at start, bounded to 8 KB by the job row and refused at start with REQUESTER_TOO_LARGE when it would not fit; it carries the decision forward and never makes one, is left out of every API response and out of the data class export, and names the job's own workspace rather than any other membership the requester holds.
28
+ - The Exports screen is where an export is started. It reads the catalogue of registered lists behind exports.lists.read, which answers each list's id, label and registering module and whether the asking principal holds the permission that list declares, and never the permission id itself. The start control is rendered only for a reader holding exports.lists.manage and offers only the lists that reader may export, because a list they may not export could only be refused; both permissions are decided again on the live principal when the start is served, so the catalogue and the control are presentation and never the authorization.
29
+ - A job is claimed and run by one poll loop on the platform job runner, which owns the timer, the bound on claims per pass, the per-item isolation, the renewal timer and the drain; this module keeps its table, its routing read, its claim statement with its stale window, its renewal statement and every outcome it records. The cross-workspace routing read sees the routing columns alone on the background role, and each job it picks is claimed and run under the workspace that routing row named. A stage whose claim lapsed stops with CLAIM_LOST, records nothing and leaves the job to whoever holds it now.
30
+ - A file is RFC 4180, with fields separated by commas, records terminated by CRLF, a field quoted only when it carries a comma, a quotation mark, a carriage return or a line feed, and an embedded quotation mark doubled. The file opens with a UTF-8 byte order mark so a spreadsheet reads it as UTF-8 rather than as the reader's code page. Values are written as the declaration answered them and never rewritten, so a cell beginning with an equals sign is data, and this module neither prefixes nor escapes it as a formula.
31
+ - Neither bound truncates. A job that would cross maxRows fails with EXPORT_ROWS_EXCEEDED and a job that would cross maxBytes fails with EXPORT_BYTES_EXCEEDED, both before an object is written, because half a file that looks whole is worse than no file. The storage port carries its own object ceiling (25 MB by default) and refuses anything larger, so the effective byte bound of an export is the lower of maxBytes and that ceiling, and the refusal is recorded under the same EXPORT_BYTES_EXCEEDED code rather than as two bounds a reader would have to reconcile.
32
+ - A list that answers a next cursor answers at least one row with it and never answers the cursor it was given, so a walk over a list always ends; a page that breaks either rule fails the job with EXPORT_LIST_STALLED rather than looping. A page longer than the limit it was asked for fails with EXPORT_PAGE_OVERSIZE, and anything a foreign page or column value raises reaches the job as EXPORT_LIST_FAILED, so a defect in another module is recorded as one stable code and never as its own error shape.
33
+ - The file is written to the storage port under the module id exports.core with the tenant id taken from the job row, which took it from the authenticated principal; no row-level security reaches an object store, so the workspace prefix of the key is the only separation there is. A completed job carries exactly one object and one object belongs to exactly one job.
34
+ - A read URL is minted per request through the storage port's signed route, never stored on the job and never returned by a list or a plain read, so a signed credential does not reach a log line or a page of results. Minting one needs exports.lists.read, the exported list's own permission on the live principal and a CSRF proof, so a grant revoked after the export stops the download and a member who may see the job list can never open a file whose rows that list would not have shown them; it expires within the hour and answers EXPORT_OBJECT_GONE for a job whose object retention already removed.
35
+ - The job table is this module's own ledger and the only record it keeps; it writes no audit trail of its own and depends on no audit module.
36
+ - The data class exports.core.jobs holds the job rows for 30 days. One retention pass chooses its batch of settled jobs once, oldest by started_at then id, deletes each job's storage object before its row, and is bounded by the module's own limit on jobs whatever limit the platform asks for; deleting the object first means the worst outcome of an interrupted pass is a row naming an object that is gone, which the next pass removes, rather than an object nothing references and nothing can ever reclaim. The class export carries the job metadata alone, never the requester snapshot and never the exported file.
37
+ - Every stable code this module constructs carries a sentence in each declared locale, read out of the source rather than kept by hand, so a code added without copy fails the gate.
38
+ permissions:
39
+ - id: exports.lists.read
40
+ description: Read export jobs and open the file of a completed one in the active workspace.
41
+ - id: exports.lists.manage
42
+ description: Start an export of a list in the active workspace, alongside the permission that list itself requires.
43
+ dataOwnership:
44
+ - exports.core owns export jobs, the files it writes under its own module id in the storage port, and the registry of list declarations as recorded.
45
+ - The module that registered a list owns its rows, its ordering and its permission; the storage port owns the bytes and their encryption; auth.core owns the principal a job runs under.
46
+ entities:
47
+ - id: job
48
+ name: Export job
49
+ description: One export of one registered list into one CSV file.
50
+ fields:
51
+ - id: listId
52
+ type: string
53
+ required: true
54
+ maxLength: 96
55
+ description: The registered list id, module id first, for example users.core.members.
56
+ - id: status
57
+ type: enum
58
+ required: true
59
+ values:
60
+ - requested
61
+ - running
62
+ - completed
63
+ - failed
64
+ - id: rowCount
65
+ type: integer
66
+ required: true
67
+ description: Rows written, excluding the header record.
68
+ - id: byteCount
69
+ type: integer
70
+ required: true
71
+ - id: objectId
72
+ type: string
73
+ required: false
74
+ unique: tenant
75
+ maxLength: 128
76
+ description: The storage object holding the file; absent until the job completes, and one object belongs to one job.
77
+ - id: requesterAccountId
78
+ type: string
79
+ required: true
80
+ maxLength: 128
81
+ - id: failureCode
82
+ type: string
83
+ required: false
84
+ maxLength: 64
85
+ description: The stable code behind a failed job; absent in every other status.
86
+ - id: startedAt
87
+ type: datetime
88
+ required: true
89
+ - id: completedAt
90
+ type: datetime
91
+ required: false
92
+ states:
93
+ field: status
94
+ values:
95
+ - requested
96
+ - running
97
+ - completed
98
+ - failed
99
+ transitions:
100
+ - from: requested
101
+ to: running
102
+ - from: running
103
+ to: completed
104
+ - from: running
105
+ to: failed
106
+ screens:
107
+ - id: jobs
108
+ kind: list
109
+ entity: job
110
+ title: Exports
111
+ columns:
112
+ - listId
113
+ - status
114
+ - rowCount
115
+ - byteCount
116
+ - startedAt
117
+ - completedAt
118
+ filters:
119
+ - status
120
+ navigationGroup: Operations
121
+ actions:
122
+ - id: start
123
+ entity: job
124
+ permission: exports.lists.manage
125
+ kind: create
126
+ risk: workspace-write
127
+ idempotent: false
128
+ description: Start an export of a registered list; the request returns once the job is recorded and the poll loop has it.
129
+ - id: read-url
130
+ entity: job
131
+ permission: exports.lists.read
132
+ kind: custom
133
+ risk: read
134
+ idempotent: true
135
+ description: Mint a short-lived signed URL for the file of a completed job.
136
+ - id: lists
137
+ permission: exports.lists.read
138
+ kind: custom
139
+ risk: read
140
+ idempotent: true
141
+ description: Read the catalogue of registered lists, each with its label, its registering module and whether the asking principal may export it, so the Exports screen can offer a start.
142
+ widgets: []
143
+ settings:
144
+ - key: maxRows
145
+ type: integer
146
+ scope: platform
147
+ default: 100000
148
+ description: Rows one export may hold; 100 to 5000000. A list longer than this fails rather than being cut short.
149
+ - key: maxBytes
150
+ type: integer
151
+ scope: platform
152
+ default: 52428800
153
+ description: Bytes one export may hold; 1024 to 268435456. The storage port's own object ceiling still applies and is usually lower.
154
+ agentTools: []
155
+ outOfScope:
156
+ - Formats other than CSV. A spreadsheet workbook, a PDF and a JSON archive are not produced; a workspace archive is audit.core's export.
157
+ - Bulk actions over a selection. Acting on many rows at once is a screen concern and waits for the Table selection model; this module exports and does nothing else.
158
+ - Scheduling an export or mailing the file. An export is started by a person and the file is opened from the Exports screen.
159
+ - Choosing or reordering columns per export. The registering module declares the columns and every export of that list carries all of them.
160
+ - Exporting a list that does not page with the keyset helpers. A list that loads a whole set has no page to walk and registers no declaration until it is retrofitted.
161
+ decisions:
162
+ - id: D-EXPORTS-SCOPE
163
+ question: What does the first version contain?
164
+ answer: A CSV export of any registered list, a job with its own table and poll loop, a file in the storage port, a signed read URL and the Exports screen; bulk actions ship with the Table selection model instead.
165
+ decidedBy: user
166
+ - id: D-EXPORTS-REGISTRATION
167
+ question: How does a list become exportable?
168
+ answer: The module owning the list registers a defineListExport declaration through exports.lists.v1 while it composes; exports.core never reads another module's database and never guesses a column.
169
+ decidedBy: default
170
+ - id: D-EXPORTS-PERMISSIONS
171
+ question: Who may export?
172
+ answer: A member holding exports.lists.manage and the exported list's own permission, both checked on the live principal at start; reading the job list and opening a file needs exports.lists.read.
173
+ decidedBy: default
174
+ - id: D-EXPORTS-BOUNDS
175
+ question: What happens to an export that is too large?
176
+ answer: It fails with a stable code naming the bound it crossed and writes no file; maxRows defaults to 100000 rows and maxBytes to 50 MB, both platform settings, and the storage port's object ceiling applies underneath them.
177
+ decidedBy: user
178
+ - id: D-EXPORTS-DELIVERY
179
+ question: How does a reader get the file?
180
+ answer: A short-lived signed storage route minted per request behind exports.lists.read, the exported list's own permission and a CSRF proof, never stored on the job and never carried by a list response.
181
+ decidedBy: default
182
+ - id: D-EXPORTS-RETENTION
183
+ question: How long is an export kept?
184
+ answer: 30 days as the data class default; the retention pass deletes the storage object and then the job row, so no file outlives the job that names it.
185
+ decidedBy: default
186
+ acceptanceScenarios:
187
+ - id: EXPORTS-START
188
+ given: A registered list of five rows and a principal holding exports.lists.manage and that list's own permission.
189
+ when: The principal starts an export and the poll loop runs one pass.
190
+ then: The job completes, the stored file opens with a UTF-8 byte order mark, carries the header record and the five rows in list order with CRLF terminators, and the job records the row count and the byte count of what was written.
191
+ - id: EXPORTS-LIST-PERMISSION
192
+ given: A principal holding exports.lists.manage but not the permission the list declares.
193
+ when: The principal starts an export of that list.
194
+ then: The start is refused with 403 before a job row exists, and no file is written.
195
+ - id: EXPORTS-UNKNOWN-LIST
196
+ given: A list id no module registered.
197
+ when: A principal holding both permissions starts an export of it.
198
+ then: The start is refused with 404 and no job row exists.
199
+ - id: EXPORTS-ROW-BOUND
200
+ given: A registered list longer than maxRows.
201
+ when: An export of it runs.
202
+ then: The job fails with EXPORT_ROWS_EXCEEDED, no storage object is written, and the failure names the bound rather than cutting the file short.
203
+ - id: EXPORTS-BYTE-BOUND
204
+ given: A registered list whose rows would cross maxBytes before maxRows.
205
+ when: An export of it runs.
206
+ then: The job fails with EXPORT_BYTES_EXCEEDED and no storage object is written.
207
+ - id: EXPORTS-READ-URL
208
+ given: A completed export job.
209
+ when: A principal holding exports.lists.read and the exported list's own permission asks for its read URL, and then a principal holding only exports.lists.read asks for the same.
210
+ then: The first is answered with a signed storage route under the platform origin that expires within the hour, the second is refused with 403 before any route is minted, and the same request for a job whose object is gone answers EXPORT_OBJECT_GONE.
211
+ - id: EXPORTS-RETENTION
212
+ given: A completed export job older than the retention of exports.core.jobs.
213
+ when: The retention sweep runs for that workspace.
214
+ then: The storage object and the job row are both gone, and the class export of the workspace carries the remaining job metadata without the requester snapshot and without any file.
215
+ - id: EXPORTS-CATALOGUE
216
+ given: Two registered lists, one whose declared permission the principal holds and one it does not.
217
+ when: A principal holding exports.lists.read reads the catalogue of lists, and then a principal without that permission asks for it.
218
+ then: The first is answered both lists with their id, label and registering module, the list whose permission the principal holds marked as one it may export and the other not, and no permission id anywhere in the answer; the second is refused with 403.
219
+ - id: EXPORTS-START-CONTROL
220
+ given: A principal holding exports.lists.manage on the Exports screen, and a principal holding only exports.lists.read.
221
+ when: Each of them opens the screen, and the first starts an export of a list it may export.
222
+ then: The first sees a start control offering only the lists it may export, rendering its loading, empty, error, denied and populated states with copy in every declared locale, and the start records the job and reads the job table again under the filter in force; the second sees no start control at all.
223
+ - id: EXPORTS-DENY
224
+ given: A principal is unauthenticated or lacks the required permission.
225
+ when: The principal reads jobs, starts an export or asks for a read URL.
226
+ then: The server denies the operation before repository access, and a mutation without a CSRF proof is refused first.
227
+ - id: EXPORTS-TENANT-BOUNDARY
228
+ given: Two workspaces with export jobs.
229
+ when: A runtime transaction bound to one workspace reads or writes them, or the job routing read runs.
230
+ then: Only that workspace's rows are visible or mutable, the routing read sees routing columns alone on the background role, and a row carrying another tenant identifier is rejected by the forced policy.
@@ -0,0 +1,6 @@
1
+ export const EXPORTS_PERMISSIONS = {
2
+ read: 'exports.lists.read',
3
+ manage: 'exports.lists.manage',
4
+ } as const;
5
+
6
+ export const permissions = Object.freeze(Object.values(EXPORTS_PERMISSIONS));
@@ -0,0 +1,211 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import {
3
+ decodeCursor,
4
+ defineEndpoint,
5
+ encodeCursor,
6
+ HttpProblem,
7
+ jsonResponse,
8
+ pageResponse,
9
+ problemResponse,
10
+ readJsonObject,
11
+ readPageQuery,
12
+ requiredString,
13
+ } from '@flowdular/sdk/server';
14
+ import type { AuthRuntime } from '@flowdular/sdk/modules/auth/server';
15
+ import {
16
+ endpointIdentityFromContext,
17
+ principalFromContext,
18
+ sessionMutationDenial,
19
+ } from '@flowdular/sdk/modules/auth/server';
20
+ import { EXPORTS_PERMISSIONS } from '../acl/permissions.ts';
21
+ import {
22
+ EXPORT_JOB_STATUSES,
23
+ EXPORT_LIMITS,
24
+ exportJobView,
25
+ type ExportJobStatus,
26
+ } from '../domain/types.ts';
27
+ import type { ExportsRuntime } from '../server/runtime.ts';
28
+ import {
29
+ exportCatalogue,
30
+ ExportServiceError,
31
+ } from '../services/export-service.ts';
32
+ import { ExportListError } from '../services/list-registry.ts';
33
+ import type { ExportJobCursor } from '../services/repository.ts';
34
+
35
+ function failure(error: unknown): Response {
36
+ if (error instanceof ExportServiceError || error instanceof ExportListError) {
37
+ return jsonResponse(
38
+ { error: { code: error.code, message: error.message } },
39
+ error.status,
40
+ );
41
+ }
42
+ return problemResponse(error, 'The export operation failed.');
43
+ }
44
+
45
+ function invalid(message: string): HttpProblem {
46
+ return new HttpProblem('INVALID_INPUT', message, 400);
47
+ }
48
+
49
+ function queryStatus(url: URL): ExportJobStatus | undefined {
50
+ const raw = url.searchParams.get('status');
51
+ if (raw === null || raw === '') return undefined;
52
+ if (!(EXPORT_JOB_STATUSES as readonly string[]).includes(raw)) {
53
+ throw invalid(`status must be one of: ${EXPORT_JOB_STATUSES.join(', ')}.`);
54
+ }
55
+ return raw as ExportJobStatus;
56
+ }
57
+
58
+ function readJobCursor(
59
+ cursor: string | null,
60
+ secret: Uint8Array,
61
+ ): ExportJobCursor | undefined {
62
+ if (cursor === null) return undefined;
63
+ const decoded = decodeCursor(cursor, secret);
64
+ return { startedAt: Number(decoded['s']), id: String(decoded['i']) };
65
+ }
66
+
67
+ export function createExportRoutes(auth: AuthRuntime, runtime: ExportsRuntime) {
68
+ /* Module-owned and never stored: a cursor is short-lived, so a restart
69
+ invalidating one costs a client the first page, not correctness. */
70
+ const cursorSecret = randomBytes(32);
71
+
72
+ const listJobs = defineEndpoint({
73
+ id: 'exports.jobs.list',
74
+ path: '/api/exports/jobs',
75
+ methods: ['GET'],
76
+ access: { kind: 'permission', permission: EXPORTS_PERMISSIONS.read },
77
+ resolveIdentity: endpointIdentityFromContext,
78
+ handler: async ({ octane }) => {
79
+ try {
80
+ const url = new URL(octane.request.url);
81
+ const page = readPageQuery(url, { maxLimit: EXPORT_LIMITS.page });
82
+ const result = await (
83
+ await runtime.service()
84
+ ).jobs(principalFromContext(octane)!.tenantId, {
85
+ status: queryStatus(url),
86
+ limit: page.limit,
87
+ cursor: readJobCursor(page.cursor, cursorSecret),
88
+ });
89
+ return pageResponse({
90
+ items: result.items.map(exportJobView),
91
+ limit: page.limit,
92
+ nextCursor: result.nextCursor
93
+ ? encodeCursor(
94
+ { s: result.nextCursor.startedAt, i: result.nextCursor.id },
95
+ cursorSecret,
96
+ )
97
+ : null,
98
+ });
99
+ } catch (error) {
100
+ return failure(error);
101
+ }
102
+ },
103
+ });
104
+
105
+ /* What a reader may start, answered from the sealed catalogue rather than
106
+ from a list a screen hard-codes: a module that registers an export appears
107
+ here without exports.core or its screen knowing the list exists. */
108
+ const listCatalogue = defineEndpoint({
109
+ id: 'exports.lists.catalogue',
110
+ path: '/api/exports/lists',
111
+ methods: ['GET'],
112
+ access: { kind: 'permission', permission: EXPORTS_PERMISSIONS.read },
113
+ resolveIdentity: endpointIdentityFromContext,
114
+ handler: ({ octane }) =>
115
+ jsonResponse({
116
+ lists: exportCatalogue(runtime.lists, principalFromContext(octane)!),
117
+ }),
118
+ });
119
+
120
+ const getJob = defineEndpoint({
121
+ id: 'exports.jobs.get',
122
+ path: '/api/exports/jobs/:id',
123
+ methods: ['GET'],
124
+ access: { kind: 'permission', permission: EXPORTS_PERMISSIONS.read },
125
+ resolveIdentity: endpointIdentityFromContext,
126
+ handler: async ({ octane }) => {
127
+ try {
128
+ const service = await runtime.service();
129
+ return jsonResponse({
130
+ job: exportJobView(
131
+ await service.job(
132
+ principalFromContext(octane)!.tenantId,
133
+ octane.params.id ?? '',
134
+ ),
135
+ ),
136
+ });
137
+ } catch (error) {
138
+ return failure(error);
139
+ }
140
+ },
141
+ });
142
+
143
+ const start = defineEndpoint({
144
+ id: 'exports.jobs.start',
145
+ path: '/api/exports/start',
146
+ methods: ['POST'],
147
+ access: { kind: 'permission', permission: EXPORTS_PERMISSIONS.manage },
148
+ resolveIdentity: endpointIdentityFromContext,
149
+ handler: async ({ octane }) => {
150
+ const denial = sessionMutationDenial(octane);
151
+ if (denial) return denial;
152
+ try {
153
+ const value = await readJsonObject(octane.request);
154
+ const service = await runtime.service();
155
+ /* The list's own permission is checked inside `start`, on the live
156
+ principal, before a job row exists. */
157
+ const job = await service.start(
158
+ principalFromContext(octane)!,
159
+ requiredString(value, 'list', { max: EXPORT_LIMITS.listId }),
160
+ );
161
+ return jsonResponse({ job: exportJobView(job) }, 201);
162
+ } catch (error) {
163
+ return failure(error);
164
+ }
165
+ },
166
+ });
167
+
168
+ const readUrl = defineEndpoint({
169
+ id: 'exports.jobs.read-url',
170
+ path: '/api/exports/jobs/read-url',
171
+ methods: ['POST'],
172
+ access: { kind: 'permission', permission: EXPORTS_PERMISSIONS.read },
173
+ resolveIdentity: endpointIdentityFromContext,
174
+ handler: async ({ octane }) => {
175
+ const denial = sessionMutationDenial(octane);
176
+ if (denial) return denial;
177
+ try {
178
+ const value = await readJsonObject(octane.request);
179
+ const service = await runtime.service();
180
+ /* The exported list's own permission is checked inside `readUrl`,
181
+ on the live principal, before a signed route is minted. */
182
+ return jsonResponse({
183
+ url: await service.readUrl(
184
+ principalFromContext(octane)!,
185
+ requiredString(value, 'id', { max: EXPORT_LIMITS.id }),
186
+ ),
187
+ });
188
+ } catch (error) {
189
+ return failure(error);
190
+ }
191
+ },
192
+ });
193
+
194
+ /* The literal job route is declared before `/api/exports/jobs/:id`, so a
195
+ mutation path is never taken for a job id. */
196
+ return [
197
+ listJobs.serverRoute,
198
+ listCatalogue.serverRoute,
199
+ start.serverRoute,
200
+ readUrl.serverRoute,
201
+ getJob.serverRoute,
202
+ ] as const;
203
+ }
204
+
205
+ export const endpoints = [
206
+ 'exports.jobs.list',
207
+ 'exports.jobs.get',
208
+ 'exports.jobs.start',
209
+ 'exports.jobs.read-url',
210
+ 'exports.lists.catalogue',
211
+ ] as const;
@@ -0,0 +1,17 @@
1
+ {
2
+ "protocolVersion": 1,
3
+ "moduleId": "exports.core",
4
+ "commands": [
5
+ {
6
+ "path": ["exports", "secrets-rotate"],
7
+ "capability": {
8
+ "id": "exports.storage.rotate",
9
+ "version": 1,
10
+ "summary": "Re-seal stored export files with the current storage encryption key.",
11
+ "risk": "process",
12
+ "requiresApprovedSpec": false,
13
+ "supportsDryRun": true
14
+ }
15
+ }
16
+ ]
17
+ }