@flowdular/sdk 0.2.4 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (908) hide show
  1. package/.ai/agents/sandbox/business-manager.md +5 -1
  2. package/.ai/blueprints/author-spec/README.md +1 -1
  3. package/.ai/blueprints/author-spec/spec-requirements.yaml +44 -0
  4. package/.ai/blueprints/author-spec/steps.yaml +5 -5
  5. package/.ai/blueprints/author-spec/templates/module.yaml +99 -3
  6. package/.ai/blueprints/edit-module/gates.yaml +4 -0
  7. package/.ai/blueprints/edit-module/required-files.yaml +9 -0
  8. package/.ai/blueprints/new-module/gates.yaml +4 -0
  9. package/.ai/blueprints/new-module/spec-requirements.yaml +2 -2
  10. package/.ai/blueprints/release/gates.yaml +4 -0
  11. package/.ai/platform-capabilities.md +128 -0
  12. package/.ai/policies/capabilities.yaml +100 -0
  13. package/.ai/policies/path-ownership.yaml +5 -2
  14. package/.ai/policies/task-budgets.yaml +5 -3
  15. package/.ai/references/catalog/module.json +4 -4
  16. package/.ai/references/catalog/package.json +2 -2
  17. package/.ai/references/catalog/spec/module.yaml +5 -3
  18. package/.ai/references/catalog/src/platform.ts +2 -0
  19. package/.ai/references/catalog/src/services/catalog-service.ts +89 -1
  20. package/.ai/references/catalog/src/services/data-classes.ts +47 -0
  21. package/.ai/references/catalog/src/services/database-repository.ts +98 -1
  22. package/.ai/references/catalog/src/services/repository.ts +22 -1
  23. package/.ai/references/catalog/tests/data-classes.test.ts +157 -0
  24. package/.ai/references/catalog.provenance.json +12 -10
  25. package/.ai/skills/README.md +10 -0
  26. package/.ai/skills/agent-tool-design/SKILL.md +1 -2
  27. package/.ai/skills/auth-security-review/SKILL.md +1 -1
  28. package/.ai/skills/business-agent-design/SKILL.md +0 -1
  29. package/.ai/skills/deploy-operate/SKILL.md +114 -0
  30. package/.ai/skills/module-new/SKILL.md +29 -3
  31. package/.ai/skills/module-update/SKILL.md +9 -3
  32. package/.ai/skills/perf-audit/SKILL.md +0 -1
  33. package/.ai/skills/release-eject-pr/SKILL.md +0 -1
  34. package/.ai/skills/spec-interview/SKILL.md +120 -0
  35. package/.ai/skills/test-hardening/SKILL.md +1 -0
  36. package/.ai/skills/ux-design/SKILL.md +34 -3
  37. package/.ai/skills/variables/SKILL.md +0 -2
  38. package/.ai/skills/workflow-development/SKILL.md +0 -1
  39. package/AGENTS.md +4 -0
  40. package/docs/agent-contract.md +2 -2
  41. package/docs/design-system.md +185 -31
  42. package/modules/access/migrations/0001_access_core.down.sql +1 -0
  43. package/modules/access/migrations/0001_access_core.up.sql +28 -0
  44. package/modules/access/migrations/README.md +3 -0
  45. package/modules/access/module.json +33 -0
  46. package/modules/access/package.json +43 -0
  47. package/modules/access/spec/module.yaml +225 -0
  48. package/modules/access/src/acl/permissions.ts +6 -0
  49. package/modules/access/src/api/endpoints.ts +244 -0
  50. package/modules/access/src/client/ActivityView.tsrx +245 -0
  51. package/modules/access/src/client/AttestationsView.tsrx +176 -0
  52. package/modules/access/src/client/ReviewView.tsrx +586 -0
  53. package/modules/access/src/client/api.ts +132 -0
  54. package/modules/access/src/client/contribution.tsrx +41 -0
  55. package/modules/access/src/client/index.ts +41 -0
  56. package/modules/access/src/client/navigation.ts +57 -0
  57. package/modules/access/src/client/presentation.ts +69 -0
  58. package/modules/access/src/client/state.ts +72 -0
  59. package/modules/access/src/domain/types.ts +189 -0
  60. package/modules/access/src/index.ts +38 -0
  61. package/modules/access/src/platform.ts +60 -0
  62. package/modules/access/src/server/index.ts +42 -0
  63. package/modules/access/src/server/runtime.ts +105 -0
  64. package/modules/access/src/services/access-service.ts +298 -0
  65. package/modules/access/src/services/audit-window.ts +78 -0
  66. package/modules/access/src/services/auth-directory.ts +72 -0
  67. package/modules/access/src/services/changes.ts +91 -0
  68. package/modules/access/src/services/data-classes.ts +28 -0
  69. package/modules/access/src/services/database-repository.ts +185 -0
  70. package/modules/access/src/services/directory.ts +102 -0
  71. package/modules/access/src/services/index.ts +33 -0
  72. package/modules/access/src/services/list-exports.ts +150 -0
  73. package/modules/access/src/services/migration.ts +54 -0
  74. package/modules/access/src/services/repository.ts +30 -0
  75. package/modules/access/src/services/review.ts +178 -0
  76. package/modules/access/translations/en.json +155 -0
  77. package/modules/access/translations/pl.json +155 -0
  78. package/modules/agents/migrations/0022_credential_rotation_inventory.down.sql +2 -0
  79. package/modules/agents/migrations/0022_credential_rotation_inventory.up.sql +7 -0
  80. package/modules/agents/migrations/0023_agents_retention_indexes.down.sql +2 -0
  81. package/modules/agents/migrations/0023_agents_retention_indexes.up.sql +9 -0
  82. package/modules/agents/migrations/0024_agent_meter_refusals.down.sql +3 -0
  83. package/modules/agents/migrations/0024_agent_meter_refusals.up.sql +22 -0
  84. package/modules/agents/migrations/0025_agent_list_indexes.down.sql +3 -0
  85. package/modules/agents/migrations/0025_agent_list_indexes.up.sql +11 -0
  86. package/modules/agents/module.json +30 -4
  87. package/modules/agents/package.json +2 -1
  88. package/modules/agents/spec/module.yaml +63 -5
  89. package/modules/agents/src/api/endpoints.ts +291 -33
  90. package/modules/agents/src/cli/commands.json +11 -0
  91. package/modules/agents/src/cli/index.ts +45 -0
  92. package/modules/agents/src/client/AgentDashboardWidget.tsrx +19 -11
  93. package/modules/agents/src/client/AgentDefinitionList.tsrx +53 -10
  94. package/modules/agents/src/client/AgentPlaygroundView.tsrx +4 -4
  95. package/modules/agents/src/client/AgentProceduresView.tsrx +2 -2
  96. package/modules/agents/src/client/AgentRunsView.tsrx +143 -40
  97. package/modules/agents/src/client/AgentsView.tsrx +109 -33
  98. package/modules/agents/src/client/api.ts +99 -21
  99. package/modules/agents/src/client/state.ts +97 -0
  100. package/modules/agents/src/domain/types.ts +44 -4
  101. package/modules/agents/src/platform.ts +42 -0
  102. package/modules/agents/src/server/action-execution.ts +201 -106
  103. package/modules/agents/src/server/runtime.ts +32 -0
  104. package/modules/agents/src/services/agent-service.ts +158 -30
  105. package/modules/agents/src/services/credential-rotation.ts +185 -0
  106. package/modules/agents/src/services/credential-vault.ts +71 -46
  107. package/modules/agents/src/services/data-classes.ts +176 -0
  108. package/modules/agents/src/services/database-repository.ts +393 -101
  109. package/modules/agents/src/services/metering.ts +111 -0
  110. package/modules/agents/src/services/migration.ts +109 -0
  111. package/modules/agents/src/services/module-agent-preflight.ts +17 -9
  112. package/modules/agents/src/services/notifications.ts +98 -0
  113. package/modules/agents/src/services/provider-repository.ts +9 -18
  114. package/modules/agents/src/services/provider-service.ts +1 -9
  115. package/modules/agents/src/services/reports.ts +107 -0
  116. package/modules/agents/src/services/repository.ts +86 -6
  117. package/modules/agents/src/services/usage-service.ts +2 -0
  118. package/modules/agents/src/services/worker.ts +114 -4
  119. package/modules/agents/src/settings.ts +14 -3
  120. package/modules/agents/translations/en.json +14 -4
  121. package/modules/agents/translations/pl.json +14 -4
  122. package/modules/approvals/migrations/0001_approvals_core.down.sql +3 -0
  123. package/modules/approvals/migrations/0001_approvals_core.up.sql +78 -0
  124. package/modules/approvals/migrations/0002_approvals_expiry_routing_role.down.sql +2 -0
  125. package/modules/approvals/migrations/0002_approvals_expiry_routing_role.up.sql +19 -0
  126. package/modules/approvals/migrations/0003_approvals_retention_indexes.down.sql +6 -0
  127. package/modules/approvals/migrations/0003_approvals_retention_indexes.up.sql +14 -0
  128. package/modules/approvals/migrations/0004_approvals_inbox_keyset_indexes.down.sql +5 -0
  129. package/modules/approvals/migrations/0004_approvals_inbox_keyset_indexes.up.sql +12 -0
  130. package/modules/approvals/migrations/README.md +3 -0
  131. package/modules/approvals/module.json +34 -0
  132. package/modules/approvals/package.json +43 -0
  133. package/modules/approvals/spec/module.yaml +318 -0
  134. package/modules/approvals/src/acl/permissions.ts +7 -0
  135. package/modules/approvals/src/api/endpoints.ts +457 -0
  136. package/modules/approvals/src/client/ApprovalRequestDrawer.tsrx +138 -0
  137. package/modules/approvals/src/client/ApprovalsView.tsrx +562 -0
  138. package/modules/approvals/src/client/PendingCountWidget.tsrx +52 -0
  139. package/modules/approvals/src/client/api.ts +203 -0
  140. package/modules/approvals/src/client/approvals.css +51 -0
  141. package/modules/approvals/src/client/contribution.tsrx +44 -0
  142. package/modules/approvals/src/client/index.ts +26 -0
  143. package/modules/approvals/src/client/navigation.ts +39 -0
  144. package/modules/approvals/src/client/pending-count.ts +26 -0
  145. package/modules/approvals/src/client/presentation.ts +52 -0
  146. package/modules/approvals/src/client/state.ts +141 -0
  147. package/modules/approvals/src/domain/capability.ts +95 -0
  148. package/modules/approvals/src/domain/types.ts +154 -0
  149. package/modules/approvals/src/index.ts +52 -0
  150. package/modules/approvals/src/platform.ts +128 -0
  151. package/modules/approvals/src/server/index.ts +42 -0
  152. package/modules/approvals/src/server/runtime.ts +181 -0
  153. package/modules/approvals/src/services/approvals-service.ts +557 -0
  154. package/modules/approvals/src/services/callbacks.ts +75 -0
  155. package/modules/approvals/src/services/data-classes.ts +167 -0
  156. package/modules/approvals/src/services/database-repository.ts +724 -0
  157. package/modules/approvals/src/services/eligibility.ts +121 -0
  158. package/modules/approvals/src/services/expiry-runner.ts +81 -0
  159. package/modules/approvals/src/services/index.ts +31 -0
  160. package/modules/approvals/src/services/migration.ts +222 -0
  161. package/modules/approvals/src/services/notifications.ts +95 -0
  162. package/modules/approvals/src/services/repository.ts +161 -0
  163. package/modules/approvals/src/services/service-error.ts +70 -0
  164. package/modules/approvals/src/settings.ts +102 -0
  165. package/modules/approvals/translations/en.json +104 -0
  166. package/modules/approvals/translations/pl.json +104 -0
  167. package/modules/audit/migrations/0001_audit_core.down.sql +8 -0
  168. package/modules/audit/migrations/0001_audit_core.up.sql +107 -0
  169. package/modules/audit/migrations/0002_audit_sweep_routing_role.down.sql +2 -0
  170. package/modules/audit/migrations/0002_audit_sweep_routing_role.up.sql +21 -0
  171. package/modules/audit/migrations/0003_audit_export_request.down.sql +12 -0
  172. package/modules/audit/migrations/0003_audit_export_request.up.sql +40 -0
  173. package/modules/audit/migrations/0004_audit_hold_seal_erasure.down.sql +17 -0
  174. package/modules/audit/migrations/0004_audit_hold_seal_erasure.up.sql +192 -0
  175. package/modules/audit/migrations/0005_audit_event_format.down.sql +17 -0
  176. package/modules/audit/migrations/0005_audit_event_format.up.sql +60 -0
  177. package/modules/audit/migrations/0006_audit_own_class_walks.down.sql +3 -0
  178. package/modules/audit/migrations/0006_audit_own_class_walks.up.sql +14 -0
  179. package/modules/audit/migrations/README.md +3 -0
  180. package/modules/audit/module.json +32 -0
  181. package/modules/audit/package.json +49 -0
  182. package/modules/audit/spec/module.yaml +809 -0
  183. package/modules/audit/src/acl/permissions.ts +7 -0
  184. package/modules/audit/src/api/endpoints.ts +315 -0
  185. package/modules/audit/src/cli/commands.json +95 -0
  186. package/modules/audit/src/cli/index.ts +658 -0
  187. package/modules/audit/src/client/DataClassesView.tsrx +420 -0
  188. package/modules/audit/src/client/ExportsView.tsrx +256 -0
  189. package/modules/audit/src/client/HoldsView.tsrx +604 -0
  190. package/modules/audit/src/client/SweepsView.tsrx +251 -0
  191. package/modules/audit/src/client/api.ts +185 -0
  192. package/modules/audit/src/client/contribution.tsrx +52 -0
  193. package/modules/audit/src/client/index.ts +23 -0
  194. package/modules/audit/src/client/navigation.ts +74 -0
  195. package/modules/audit/src/client/presentation.ts +105 -0
  196. package/modules/audit/src/client/state.ts +86 -0
  197. package/modules/audit/src/domain/data-classes.ts +16 -0
  198. package/modules/audit/src/domain/types.ts +339 -0
  199. package/modules/audit/src/index.ts +76 -0
  200. package/modules/audit/src/platform.ts +44 -0
  201. package/modules/audit/src/server/index.ts +177 -0
  202. package/modules/audit/src/server/runtime.ts +303 -0
  203. package/modules/audit/src/services/anchor-key.ts +143 -0
  204. package/modules/audit/src/services/anchor-rotation.ts +147 -0
  205. package/modules/audit/src/services/audit-runners.ts +278 -0
  206. package/modules/audit/src/services/backup-guard.ts +95 -0
  207. package/modules/audit/src/services/database-repository.ts +1946 -0
  208. package/modules/audit/src/services/declared-classes.ts +64 -0
  209. package/modules/audit/src/services/erasure-port.ts +126 -0
  210. package/modules/audit/src/services/erasure-service.ts +770 -0
  211. package/modules/audit/src/services/export-directory.ts +106 -0
  212. package/modules/audit/src/services/export-service.ts +714 -0
  213. package/modules/audit/src/services/hold-service.ts +295 -0
  214. package/modules/audit/src/services/index.ts +17 -0
  215. package/modules/audit/src/services/migration.ts +658 -0
  216. package/modules/audit/src/services/own-classes.ts +318 -0
  217. package/modules/audit/src/services/platform-version.ts +23 -0
  218. package/modules/audit/src/services/repository.ts +495 -0
  219. package/modules/audit/src/services/retention-service.ts +191 -0
  220. package/modules/audit/src/services/seal-service.ts +769 -0
  221. package/modules/audit/src/services/service-error.ts +61 -0
  222. package/modules/audit/src/services/subject-keys.ts +90 -0
  223. package/modules/audit/src/services/sweep-service.ts +298 -0
  224. package/modules/audit/src/services/zip.ts +217 -0
  225. package/modules/audit/src/settings.ts +69 -0
  226. package/modules/audit/translations/en.json +210 -0
  227. package/modules/audit/translations/pl.json +210 -0
  228. package/modules/auth/README.md +77 -29
  229. package/modules/auth/migrations/0016_external_identities.up.sql +16 -0
  230. package/modules/auth/migrations/0017_mfa_key_id.up.sql +8 -0
  231. package/modules/auth/migrations/0018_retire_bundled_module_scopes.up.sql +29 -0
  232. package/modules/auth/migrations/0019_notifications_member_scopes.up.sql +44 -0
  233. package/modules/auth/migrations/0020_identity_providers.up.sql +61 -0
  234. package/modules/auth/migrations/0021_membership_status.up.sql +19 -0
  235. package/modules/auth/migrations/0022_auth_provider_scopes.up.sql +45 -0
  236. package/modules/auth/migrations/0023_enterprise_module_scopes.down.sql +19 -0
  237. package/modules/auth/migrations/0023_enterprise_module_scopes.up.sql +71 -0
  238. package/modules/auth/migrations/0024_approvals_member_scopes.down.sql +22 -0
  239. package/modules/auth/migrations/0024_approvals_member_scopes.up.sql +48 -0
  240. package/modules/auth/migrations/0025_audit_holds_owner_scope.down.sql +21 -0
  241. package/modules/auth/migrations/0025_audit_holds_owner_scope.up.sql +47 -0
  242. package/modules/auth/migrations/0026_auth_export_keyset_indexes.down.sql +6 -0
  243. package/modules/auth/migrations/0026_auth_export_keyset_indexes.up.sql +15 -0
  244. package/modules/auth/migrations/0027_workflow_automation_profile_scopes.down.sql +34 -0
  245. package/modules/auth/migrations/0027_workflow_automation_profile_scopes.up.sql +72 -0
  246. package/modules/auth/migrations/0028_auth_member_search_prefix_indexes.down.sql +6 -0
  247. package/modules/auth/migrations/0028_auth_member_search_prefix_indexes.up.sql +21 -0
  248. package/modules/auth/migrations/0029_reports_exports_access_scopes.down.sql +22 -0
  249. package/modules/auth/migrations/0029_reports_exports_access_scopes.up.sql +56 -0
  250. package/modules/auth/migrations/0030_auth_membership_keyset_index.down.sql +4 -0
  251. package/modules/auth/migrations/0030_auth_membership_keyset_index.up.sql +10 -0
  252. package/modules/auth/migrations/0031_membership_scope_backfills_under_rls.down.sql +4 -0
  253. package/modules/auth/migrations/0031_membership_scope_backfills_under_rls.up.sql +31 -0
  254. package/modules/auth/migrations/0032_audit_actor_service.down.sql +9 -0
  255. package/modules/auth/migrations/0032_audit_actor_service.up.sql +10 -0
  256. package/modules/auth/migrations/0033_auth_account_keyset_indexes.down.sql +5 -0
  257. package/modules/auth/migrations/0033_auth_account_keyset_indexes.up.sql +23 -0
  258. package/modules/auth/module.json +3 -3
  259. package/modules/auth/package.json +2 -1
  260. package/modules/auth/spec/module.yaml +372 -3
  261. package/modules/auth/src/acl/scopes.ts +50 -6
  262. package/modules/auth/src/cli/commands.json +11 -0
  263. package/modules/auth/src/cli/greenfield.ts +2 -2
  264. package/modules/auth/src/cli/index.ts +14 -0
  265. package/modules/auth/src/cli/secrets.ts +114 -0
  266. package/modules/auth/src/client/AuthenticationCore.tsrx +61 -8
  267. package/modules/auth/src/client/api.ts +72 -6
  268. package/modules/auth/src/client/contribution.tsrx +23 -0
  269. package/modules/auth/src/client/index.ts +6 -0
  270. package/modules/auth/src/client/providers/IdentityProviderForm.tsrx +191 -0
  271. package/modules/auth/src/client/providers/IdentityProvidersView.tsrx +358 -0
  272. package/modules/auth/src/client/providers/api.ts +128 -0
  273. package/modules/auth/src/client/providers/provider-columns.tsrx +60 -0
  274. package/modules/auth/src/client/providers/state.ts +35 -0
  275. package/modules/auth/src/client/security/SecurityView.tsrx +9 -1
  276. package/modules/auth/src/client/state.ts +15 -1
  277. package/modules/auth/src/domain/types.ts +55 -0
  278. package/modules/auth/src/index.ts +11 -1
  279. package/modules/auth/src/middleware/authentication.ts +4 -0
  280. package/modules/auth/src/server/endpoints.ts +467 -171
  281. package/modules/auth/src/server/http.ts +3 -2
  282. package/modules/auth/src/server/index.ts +22 -1
  283. package/modules/auth/src/server/membership-endpoints.ts +62 -0
  284. package/modules/auth/src/server/mfa-enforcement.ts +156 -0
  285. package/modules/auth/src/server/oidc.ts +389 -0
  286. package/modules/auth/src/server/provider-endpoints.ts +246 -0
  287. package/modules/auth/src/server/provider-host.ts +77 -0
  288. package/modules/auth/src/server/runtime.ts +231 -55
  289. package/modules/auth/src/services/auth-service-error.ts +7 -2
  290. package/modules/auth/src/services/auth-service.ts +948 -51
  291. package/modules/auth/src/services/data-classes.ts +236 -0
  292. package/modules/auth/src/services/database-repository.ts +853 -71
  293. package/modules/auth/src/services/identity-provider-service.ts +571 -0
  294. package/modules/auth/src/services/mail-delivery.ts +16 -16
  295. package/modules/auth/src/services/mail-message.ts +54 -0
  296. package/modules/auth/src/services/mail-port.ts +24 -0
  297. package/modules/auth/src/services/mail-smtp.ts +85 -0
  298. package/modules/auth/src/services/mfa-rotation.ts +144 -0
  299. package/modules/auth/src/services/migration.ts +810 -0
  300. package/modules/auth/src/services/password.ts +14 -0
  301. package/modules/auth/src/services/provider-secret-rotation.ts +169 -0
  302. package/modules/auth/src/services/provider-secrets.ts +136 -0
  303. package/modules/auth/src/services/repository.ts +321 -5
  304. package/modules/auth/src/services/session-sweep-runner.ts +73 -0
  305. package/modules/auth/src/services/settings-store.ts +10 -83
  306. package/modules/auth/src/services/totp.ts +88 -62
  307. package/modules/auth/src/services/validation.ts +194 -7
  308. package/modules/auth/src/settings.ts +18 -0
  309. package/modules/auth/translations/en.json +84 -1
  310. package/modules/auth/translations/pl.json +84 -1
  311. package/modules/automations/migrations/0005_secret_rotation_inventory.down.sql +1 -0
  312. package/modules/automations/migrations/0005_secret_rotation_inventory.up.sql +6 -0
  313. package/modules/automations/migrations/0006_automations_list_sort_indexes.down.sql +4 -0
  314. package/modules/automations/migrations/0006_automations_list_sort_indexes.up.sql +11 -0
  315. package/modules/automations/module.json +24 -6
  316. package/modules/automations/package.json +4 -1
  317. package/modules/automations/spec/module.yaml +81 -7
  318. package/modules/automations/src/api/endpoints.ts +202 -28
  319. package/modules/automations/src/cli/commands.json +17 -0
  320. package/modules/automations/src/cli/index.ts +114 -0
  321. package/modules/automations/src/client/AutomationScheduleForm.tsrx +77 -19
  322. package/modules/automations/src/client/AutomationSchedulesView.tsrx +144 -40
  323. package/modules/automations/src/client/AutomationTriggersView.tsrx +131 -32
  324. package/modules/automations/src/client/api.ts +62 -19
  325. package/modules/automations/src/client/presentation.ts +20 -2
  326. package/modules/automations/src/client/state.ts +84 -0
  327. package/modules/automations/src/domain/cadence.ts +99 -3
  328. package/modules/automations/src/domain/cron.ts +366 -0
  329. package/modules/automations/src/domain/time-zone.ts +61 -0
  330. package/modules/automations/src/platform.ts +38 -4
  331. package/modules/automations/src/server/index.ts +11 -0
  332. package/modules/automations/src/server/runtime.ts +46 -22
  333. package/modules/{automations-workflows-integration/src/server/adapter.ts → automations/src/server/workflow-target.ts} +13 -14
  334. package/modules/{automations-workflows-integration/src/server/tools.ts → automations/src/server/workflow-tools.ts} +0 -0
  335. package/modules/automations/src/services/data-classes.ts +62 -0
  336. package/modules/automations/src/services/database-repository.ts +152 -38
  337. package/modules/automations/src/services/migration.ts +119 -9
  338. package/modules/automations/src/services/repository.ts +52 -1
  339. package/modules/automations/src/services/schedule-runner.ts +84 -0
  340. package/modules/automations/src/services/schedule-service.ts +152 -26
  341. package/modules/automations/src/services/secret-rotation.ts +176 -0
  342. package/modules/automations/src/services/secret-vault.ts +68 -41
  343. package/modules/automations/src/services/trigger-service.ts +13 -10
  344. package/modules/automations/translations/en.json +15 -2
  345. package/modules/automations/translations/pl.json +15 -2
  346. package/modules/connectors/migrations/0001_connectors_core.down.sql +3 -0
  347. package/modules/connectors/migrations/0001_connectors_core.up.sql +72 -0
  348. package/modules/connectors/migrations/0002_connectors_call_keys.down.sql +3 -0
  349. package/modules/connectors/migrations/0002_connectors_call_keys.up.sql +18 -0
  350. package/modules/connectors/migrations/README.md +3 -0
  351. package/modules/connectors/module.json +28 -0
  352. package/modules/{automations-workflows-integration → connectors}/package.json +27 -26
  353. package/modules/connectors/spec/module.yaml +447 -0
  354. package/modules/connectors/src/acl/permissions.ts +6 -0
  355. package/modules/connectors/src/agent/tools.ts +180 -0
  356. package/modules/connectors/src/api/endpoints.ts +572 -0
  357. package/modules/connectors/src/client/ConnectorCallsView.tsrx +358 -0
  358. package/modules/connectors/src/client/ConnectorForm.tsrx +424 -0
  359. package/modules/connectors/src/client/ConnectorsView.tsrx +711 -0
  360. package/modules/connectors/src/client/api.ts +281 -0
  361. package/modules/connectors/src/client/consent.ts +48 -0
  362. package/modules/connectors/src/client/contribution.tsrx +37 -0
  363. package/modules/connectors/src/client/index.ts +22 -0
  364. package/modules/connectors/src/client/navigation.ts +42 -0
  365. package/modules/connectors/src/client/presentation.ts +38 -0
  366. package/modules/connectors/src/client/state.ts +175 -0
  367. package/modules/connectors/src/domain/calls.ts +70 -0
  368. package/modules/connectors/src/domain/definitions.ts +190 -0
  369. package/modules/connectors/src/domain/http-json.ts +68 -0
  370. package/modules/connectors/src/domain/types.ts +185 -0
  371. package/modules/connectors/src/index.ts +64 -0
  372. package/modules/connectors/src/platform.ts +56 -0
  373. package/modules/connectors/src/server/index.ts +66 -0
  374. package/modules/connectors/src/server/runtime.ts +163 -0
  375. package/modules/connectors/src/services/call-service.ts +903 -0
  376. package/modules/connectors/src/services/connectors-service.ts +653 -0
  377. package/modules/connectors/src/services/credential-vault.ts +188 -0
  378. package/modules/connectors/src/services/data-classes.ts +158 -0
  379. package/modules/connectors/src/services/database-repository.ts +897 -0
  380. package/modules/connectors/src/services/egress.ts +261 -0
  381. package/modules/connectors/src/services/index.ts +19 -0
  382. package/modules/connectors/src/services/migration.ts +166 -0
  383. package/modules/connectors/src/services/repository.ts +175 -0
  384. package/modules/connectors/src/services/service-error.ts +46 -0
  385. package/modules/connectors/src/settings.ts +69 -0
  386. package/modules/connectors/translations/en.json +191 -0
  387. package/modules/connectors/translations/pl.json +191 -0
  388. package/modules/directory/migrations/0001_directory_core.down.sql +5 -0
  389. package/modules/directory/migrations/0001_directory_core.up.sql +111 -0
  390. package/modules/directory/migrations/README.md +3 -0
  391. package/modules/directory/module.json +27 -0
  392. package/modules/directory/package.json +46 -0
  393. package/modules/directory/spec/module.yaml +351 -0
  394. package/modules/directory/src/acl/permissions.ts +7 -0
  395. package/modules/directory/src/api/endpoints.ts +478 -0
  396. package/modules/directory/src/api/scim-endpoints.ts +516 -0
  397. package/modules/directory/src/client/GroupMappingsView.tsrx +430 -0
  398. package/modules/directory/src/client/ProvisioningLogView.tsrx +248 -0
  399. package/modules/directory/src/client/ScimTokensView.tsrx +587 -0
  400. package/modules/directory/src/client/api.ts +222 -0
  401. package/modules/directory/src/client/contribution.tsrx +46 -0
  402. package/modules/directory/src/client/index.ts +22 -0
  403. package/modules/directory/src/client/navigation.ts +57 -0
  404. package/modules/directory/src/client/presentation.ts +143 -0
  405. package/modules/directory/src/client/state.ts +173 -0
  406. package/modules/directory/src/domain/scim.ts +346 -0
  407. package/modules/directory/src/domain/types.ts +166 -0
  408. package/modules/directory/src/index.ts +44 -0
  409. package/modules/directory/src/platform.ts +43 -0
  410. package/modules/directory/src/server/index.ts +17 -0
  411. package/modules/directory/src/server/runtime.ts +124 -0
  412. package/modules/directory/src/services/auth-port.ts +127 -0
  413. package/modules/directory/src/services/data-classes.ts +41 -0
  414. package/modules/directory/src/services/database-repository.ts +1067 -0
  415. package/modules/directory/src/services/directory-service.ts +311 -0
  416. package/modules/directory/src/services/index.ts +43 -0
  417. package/modules/directory/src/services/migration.ts +146 -0
  418. package/modules/directory/src/services/provisioning-service.ts +1420 -0
  419. package/modules/directory/src/services/rate-limiter.ts +103 -0
  420. package/modules/directory/src/services/repository.ts +208 -0
  421. package/modules/directory/src/services/service-error.ts +42 -0
  422. package/modules/directory/src/services/token-service.ts +215 -0
  423. package/modules/directory/src/settings.ts +86 -0
  424. package/modules/directory/translations/en.json +185 -0
  425. package/modules/directory/translations/pl.json +185 -0
  426. package/modules/documents/migrations/0001_documents_core.down.sql +1 -0
  427. package/modules/documents/migrations/0001_documents_core.up.sql +35 -0
  428. package/modules/documents/migrations/0002_documents_files_page.down.sql +1 -0
  429. package/modules/documents/migrations/0002_documents_files_page.up.sql +6 -0
  430. package/modules/documents/migrations/README.md +3 -0
  431. package/modules/documents/module.json +28 -0
  432. package/modules/documents/package.json +49 -0
  433. package/modules/documents/spec/module.yaml +247 -0
  434. package/modules/documents/src/acl/permissions.ts +6 -0
  435. package/modules/documents/src/api/endpoints.ts +401 -0
  436. package/modules/documents/src/client/DocumentUploader.tsrx +148 -0
  437. package/modules/documents/src/client/DocumentsView.tsrx +540 -0
  438. package/modules/documents/src/client/api.ts +209 -0
  439. package/modules/documents/src/client/contribution.tsrx +29 -0
  440. package/modules/documents/src/client/download.ts +70 -0
  441. package/modules/documents/src/client/index.ts +22 -0
  442. package/modules/documents/src/client/navigation.ts +25 -0
  443. package/modules/documents/src/client/presentation.ts +110 -0
  444. package/modules/documents/src/client/state.ts +117 -0
  445. package/modules/documents/src/domain/attachments.ts +84 -0
  446. package/modules/documents/src/domain/types.ts +80 -0
  447. package/modules/documents/src/index.ts +46 -0
  448. package/modules/documents/src/platform.ts +61 -0
  449. package/modules/documents/src/server/index.ts +30 -0
  450. package/modules/documents/src/server/runtime.ts +107 -0
  451. package/modules/documents/src/services/attachments.ts +39 -0
  452. package/modules/documents/src/services/data-classes.ts +25 -0
  453. package/modules/documents/src/services/database-repository.ts +259 -0
  454. package/modules/documents/src/services/documents-service.ts +586 -0
  455. package/modules/documents/src/services/index.ts +18 -0
  456. package/modules/documents/src/services/migration.ts +82 -0
  457. package/modules/documents/src/services/repository.ts +48 -0
  458. package/modules/documents/src/settings.ts +107 -0
  459. package/modules/documents/translations/en.json +111 -0
  460. package/modules/documents/translations/pl.json +111 -0
  461. package/modules/exports/migrations/0001_exports_core.down.sql +2 -0
  462. package/modules/exports/migrations/0001_exports_core.up.sql +28 -0
  463. package/modules/exports/migrations/0002_exports_job_routing_role.down.sql +4 -0
  464. package/modules/exports/migrations/0002_exports_job_routing_role.up.sql +21 -0
  465. package/modules/exports/migrations/README.md +3 -0
  466. package/modules/exports/module.json +28 -0
  467. package/modules/exports/package.json +44 -0
  468. package/modules/exports/spec/module.yaml +229 -0
  469. package/modules/exports/src/acl/permissions.ts +6 -0
  470. package/modules/exports/src/api/endpoints.ts +211 -0
  471. package/modules/exports/src/client/ExportsView.tsrx +327 -0
  472. package/modules/exports/src/client/api.ts +133 -0
  473. package/modules/exports/src/client/contribution.tsrx +31 -0
  474. package/modules/exports/src/client/index.ts +20 -0
  475. package/modules/exports/src/client/navigation.ts +25 -0
  476. package/modules/exports/src/client/presentation.ts +53 -0
  477. package/modules/exports/src/client/state.ts +56 -0
  478. package/modules/exports/src/domain/lists.ts +29 -0
  479. package/modules/exports/src/domain/types.ts +120 -0
  480. package/modules/exports/src/index.ts +41 -0
  481. package/modules/exports/src/platform.ts +80 -0
  482. package/modules/exports/src/server/index.ts +51 -0
  483. package/modules/exports/src/server/runtime.ts +160 -0
  484. package/modules/exports/src/services/data-classes.ts +56 -0
  485. package/modules/exports/src/services/database-repository.ts +405 -0
  486. package/modules/exports/src/services/export-runner.ts +123 -0
  487. package/modules/exports/src/services/export-service.ts +356 -0
  488. package/modules/exports/src/services/index.ts +6 -0
  489. package/modules/exports/src/services/list-registry.ts +105 -0
  490. package/modules/exports/src/services/migration.ts +89 -0
  491. package/modules/exports/src/services/repository.ts +97 -0
  492. package/modules/exports/src/settings.ts +70 -0
  493. package/modules/exports/translations/en.json +69 -0
  494. package/modules/exports/translations/pl.json +69 -0
  495. package/modules/import/migrations/0001_import_core.down.sql +6 -0
  496. package/modules/import/migrations/0001_import_core.up.sql +61 -0
  497. package/modules/import/migrations/0002_import_job_routing_role.down.sql +4 -0
  498. package/modules/import/migrations/0002_import_job_routing_role.up.sql +20 -0
  499. package/modules/import/migrations/0003_import_jobs_export_index.down.sql +1 -0
  500. package/modules/import/migrations/0003_import_jobs_export_index.up.sql +7 -0
  501. package/modules/import/migrations/0004_import_jobs_traceparent.down.sql +1 -0
  502. package/modules/import/migrations/0004_import_jobs_traceparent.up.sql +7 -0
  503. package/modules/import/migrations/README.md +3 -0
  504. package/modules/import/module.json +37 -0
  505. package/modules/import/package.json +50 -0
  506. package/modules/import/spec/module.yaml +335 -0
  507. package/modules/import/src/acl/permissions.ts +6 -0
  508. package/modules/import/src/api/endpoints.ts +400 -0
  509. package/modules/import/src/client/ImportJobDrawer.tsrx +229 -0
  510. package/modules/import/src/client/ImportsView.tsrx +455 -0
  511. package/modules/import/src/client/NewImportForm.tsrx +274 -0
  512. package/modules/import/src/client/api.ts +243 -0
  513. package/modules/import/src/client/contribution.tsrx +29 -0
  514. package/modules/import/src/client/index.ts +23 -0
  515. package/modules/import/src/client/navigation.ts +25 -0
  516. package/modules/import/src/client/presentation.ts +59 -0
  517. package/modules/import/src/client/state.ts +43 -0
  518. package/modules/import/src/domain/csv.ts +258 -0
  519. package/modules/import/src/domain/ports.ts +157 -0
  520. package/modules/import/src/domain/types.ts +179 -0
  521. package/modules/import/src/index.ts +58 -0
  522. package/modules/import/src/platform.ts +60 -0
  523. package/modules/import/src/server/index.ts +49 -0
  524. package/modules/import/src/server/runtime.ts +158 -0
  525. package/modules/import/src/services/csv-source.ts +121 -0
  526. package/modules/import/src/services/data-classes.ts +63 -0
  527. package/modules/import/src/services/database-repository.ts +780 -0
  528. package/modules/import/src/services/import-runner.ts +127 -0
  529. package/modules/import/src/services/import-service.ts +872 -0
  530. package/modules/import/src/services/index.ts +6 -0
  531. package/modules/import/src/services/migration.ts +156 -0
  532. package/modules/import/src/services/port-registry.ts +158 -0
  533. package/modules/import/src/services/repository.ts +147 -0
  534. package/modules/import/src/settings.ts +70 -0
  535. package/modules/import/translations/en.json +175 -0
  536. package/modules/import/translations/pl.json +175 -0
  537. package/modules/metering/migrations/0001_metering_core.down.sql +6 -0
  538. package/modules/metering/migrations/0001_metering_core.up.sql +119 -0
  539. package/modules/metering/migrations/0002_metering_bucket_export.down.sql +3 -0
  540. package/modules/metering/migrations/0002_metering_bucket_export.up.sql +5 -0
  541. package/modules/metering/migrations/README.md +3 -0
  542. package/modules/metering/module.json +46 -0
  543. package/modules/metering/package.json +50 -0
  544. package/modules/metering/spec/module.yaml +269 -0
  545. package/modules/metering/src/acl/permissions.ts +5 -0
  546. package/modules/metering/src/api/endpoints.ts +104 -0
  547. package/modules/metering/src/cli/commands.json +28 -0
  548. package/modules/metering/src/cli/index.ts +246 -0
  549. package/modules/metering/src/client/LimitsView.tsrx +170 -0
  550. package/modules/metering/src/client/UsageSummaryWidget.tsrx +63 -0
  551. package/modules/metering/src/client/UsageView.tsrx +205 -0
  552. package/modules/metering/src/client/api.ts +91 -0
  553. package/modules/metering/src/client/contribution.tsrx +42 -0
  554. package/modules/metering/src/client/index.ts +26 -0
  555. package/modules/metering/src/client/navigation.ts +54 -0
  556. package/modules/metering/src/client/presentation.ts +63 -0
  557. package/modules/metering/src/client/state.ts +31 -0
  558. package/modules/metering/src/domain/meters.ts +100 -0
  559. package/modules/metering/src/domain/types.ts +71 -0
  560. package/modules/metering/src/index.ts +51 -0
  561. package/modules/metering/src/platform.ts +84 -0
  562. package/modules/metering/src/server/index.ts +40 -0
  563. package/modules/metering/src/server/runtime.ts +165 -0
  564. package/modules/metering/src/services/data-classes.ts +34 -0
  565. package/modules/metering/src/services/database-repository.ts +574 -0
  566. package/modules/metering/src/services/index.ts +9 -0
  567. package/modules/metering/src/services/meter-registry.ts +145 -0
  568. package/modules/metering/src/services/metering-service.ts +441 -0
  569. package/modules/metering/src/services/migration.ts +183 -0
  570. package/modules/metering/src/services/notifications.ts +75 -0
  571. package/modules/metering/src/services/reports.ts +105 -0
  572. package/modules/metering/src/services/repository.ts +132 -0
  573. package/modules/metering/src/services/service-error.ts +46 -0
  574. package/modules/metering/src/settings.ts +47 -0
  575. package/modules/metering/translations/en.json +68 -0
  576. package/modules/metering/translations/pl.json +68 -0
  577. package/modules/notifications/migrations/0001_notifications_core.down.sql +1 -0
  578. package/modules/notifications/migrations/0001_notifications_core.up.sql +26 -0
  579. package/modules/notifications/migrations/0002_notifications_preferences.down.sql +1 -0
  580. package/modules/notifications/migrations/0002_notifications_preferences.up.sql +17 -0
  581. package/modules/notifications/migrations/0003_notifications_webhook_subscriptions.down.sql +1 -0
  582. package/modules/notifications/migrations/0003_notifications_webhook_subscriptions.up.sql +30 -0
  583. package/modules/notifications/migrations/0004_notifications_deliveries.down.sql +1 -0
  584. package/modules/notifications/migrations/0004_notifications_deliveries.up.sql +35 -0
  585. package/modules/notifications/migrations/0005_notifications_delivery_routing_role.down.sql +2 -0
  586. package/modules/notifications/migrations/0005_notifications_delivery_routing_role.up.sql +17 -0
  587. package/modules/notifications/migrations/0006_notifications_delivery_title.down.sql +1 -0
  588. package/modules/notifications/migrations/0006_notifications_delivery_title.up.sql +11 -0
  589. package/modules/notifications/migrations/0007_notifications_secret_rotation_inventory.down.sql +2 -0
  590. package/modules/notifications/migrations/0007_notifications_secret_rotation_inventory.up.sql +19 -0
  591. package/modules/notifications/migrations/0008_notifications_delivery_claim.down.sql +8 -0
  592. package/modules/notifications/migrations/0008_notifications_delivery_claim.up.sql +19 -0
  593. package/modules/notifications/migrations/0009_notifications_kind_approvals.down.sql +16 -0
  594. package/modules/notifications/migrations/0009_notifications_kind_approvals.up.sql +18 -0
  595. package/modules/notifications/migrations/0010_notifications_kind_meter_threshold.down.sql +16 -0
  596. package/modules/notifications/migrations/0010_notifications_kind_meter_threshold.up.sql +18 -0
  597. package/modules/notifications/migrations/0011_notifications_retention_keyset.down.sql +5 -0
  598. package/modules/notifications/migrations/0011_notifications_retention_keyset.up.sql +15 -0
  599. package/modules/notifications/migrations/0012_notifications_email_channel.down.sql +12 -0
  600. package/modules/notifications/migrations/0012_notifications_email_channel.up.sql +38 -0
  601. package/modules/notifications/migrations/0013_notifications_list_pages.down.sql +5 -0
  602. package/modules/notifications/migrations/0013_notifications_list_pages.up.sql +13 -0
  603. package/modules/notifications/migrations/README.md +3 -0
  604. package/modules/notifications/module.json +32 -0
  605. package/modules/notifications/package.json +49 -0
  606. package/modules/notifications/spec/module.yaml +718 -0
  607. package/modules/notifications/src/acl/permissions.ts +11 -0
  608. package/modules/notifications/src/api/endpoints.ts +814 -0
  609. package/modules/notifications/src/cli/commands.json +17 -0
  610. package/modules/notifications/src/cli/index.ts +126 -0
  611. package/modules/notifications/src/client/DeliveriesView.tsrx +483 -0
  612. package/modules/notifications/src/client/FactList.tsrx +24 -0
  613. package/modules/notifications/src/client/NotificationPreferencesView.tsrx +240 -0
  614. package/modules/notifications/src/client/NotificationsInboxView.tsrx +592 -0
  615. package/modules/notifications/src/client/UnreadCountWidget.tsrx +62 -0
  616. package/modules/notifications/src/client/WebhookForm.tsrx +297 -0
  617. package/modules/notifications/src/client/WebhooksView.tsrx +637 -0
  618. package/modules/notifications/src/client/api.ts +382 -0
  619. package/modules/notifications/src/client/contribution.tsrx +83 -0
  620. package/modules/notifications/src/client/inbox.ts +41 -0
  621. package/modules/notifications/src/client/index.ts +29 -0
  622. package/modules/notifications/src/client/navigation.ts +92 -0
  623. package/modules/notifications/src/client/notifications.css +70 -0
  624. package/modules/notifications/src/client/presentation.ts +81 -0
  625. package/modules/notifications/src/client/state.ts +246 -0
  626. package/modules/notifications/src/client/unread-count.ts +26 -0
  627. package/modules/notifications/src/domain/locale.ts +47 -0
  628. package/modules/notifications/src/domain/publish.ts +46 -0
  629. package/modules/notifications/src/domain/types.ts +186 -0
  630. package/modules/notifications/src/index.ts +62 -0
  631. package/modules/notifications/src/platform.ts +85 -0
  632. package/modules/notifications/src/server/index.ts +82 -0
  633. package/modules/notifications/src/server/runtime.ts +251 -0
  634. package/modules/notifications/src/services/data-classes.ts +139 -0
  635. package/modules/notifications/src/services/database-repository.ts +1334 -0
  636. package/modules/notifications/src/services/delivery-payload.ts +93 -0
  637. package/modules/notifications/src/services/delivery-runner.ts +170 -0
  638. package/modules/notifications/src/services/delivery-service.ts +811 -0
  639. package/modules/notifications/src/services/egress.ts +239 -0
  640. package/modules/notifications/src/services/email-channel.ts +93 -0
  641. package/modules/notifications/src/services/index.ts +23 -0
  642. package/modules/notifications/src/services/migration.ts +572 -0
  643. package/modules/notifications/src/services/notifications-service.ts +297 -0
  644. package/modules/notifications/src/services/paging.ts +60 -0
  645. package/modules/notifications/src/services/publish-service.ts +133 -0
  646. package/modules/notifications/src/services/repository.ts +342 -0
  647. package/modules/notifications/src/services/secret-rotation.ts +177 -0
  648. package/modules/notifications/src/services/secret-vault.ts +168 -0
  649. package/modules/notifications/src/services/service-error.ts +67 -0
  650. package/modules/notifications/src/services/signature.ts +81 -0
  651. package/modules/notifications/src/services/webhook-service.ts +307 -0
  652. package/modules/notifications/src/settings.ts +130 -0
  653. package/modules/notifications/translations/en.json +255 -0
  654. package/modules/notifications/translations/pl.json +255 -0
  655. package/modules/profile/module.json +3 -3
  656. package/modules/profile/package.json +1 -1
  657. package/modules/profile/spec/module.yaml +3 -3
  658. package/modules/profile/src/services/database-repository.ts +3 -13
  659. package/modules/reports/module.json +28 -0
  660. package/modules/reports/package.json +42 -0
  661. package/modules/reports/spec/module.yaml +231 -0
  662. package/modules/reports/src/acl/permissions.ts +5 -0
  663. package/modules/reports/src/api/endpoints.ts +72 -0
  664. package/modules/reports/src/client/ReportsSummaryWidget.tsrx +52 -0
  665. package/modules/reports/src/client/ReportsView.tsrx +246 -0
  666. package/modules/reports/src/client/api.ts +65 -0
  667. package/modules/reports/src/client/contribution.tsrx +36 -0
  668. package/modules/reports/src/client/index.ts +18 -0
  669. package/modules/reports/src/client/navigation.ts +39 -0
  670. package/modules/reports/src/client/presentation.ts +123 -0
  671. package/modules/reports/src/client/state.ts +28 -0
  672. package/modules/reports/src/domain/providers.ts +115 -0
  673. package/modules/reports/src/domain/types.ts +44 -0
  674. package/modules/reports/src/index.ts +47 -0
  675. package/modules/reports/src/platform.ts +37 -0
  676. package/modules/reports/src/server/index.ts +21 -0
  677. package/modules/reports/src/server/runtime.ts +40 -0
  678. package/modules/reports/src/services/index.ts +17 -0
  679. package/modules/reports/src/services/provider-registry.ts +144 -0
  680. package/modules/reports/src/services/range.ts +65 -0
  681. package/modules/reports/src/services/reports-service.ts +316 -0
  682. package/modules/reports/src/services/service-error.ts +26 -0
  683. package/modules/reports/src/settings.ts +49 -0
  684. package/modules/reports/translations/en.json +35 -0
  685. package/modules/reports/translations/pl.json +35 -0
  686. package/modules/sandbox/module.json +4 -4
  687. package/modules/sandbox/package.json +1 -1
  688. package/modules/sandbox/spec/module.yaml +3 -3
  689. package/modules/sandbox/src/services/database-repository.ts +14 -23
  690. package/modules/sandbox/src/services/directory.ts +16 -0
  691. package/modules/sandbox/src/services/sandbox-service.ts +13 -11
  692. package/modules/search/migrations/0001_search_core.down.sql +1 -0
  693. package/modules/search/migrations/0001_search_core.up.sql +22 -0
  694. package/modules/search/migrations/0002_search_recent_export.down.sql +3 -0
  695. package/modules/search/migrations/0002_search_recent_export.up.sql +5 -0
  696. package/modules/search/migrations/README.md +3 -0
  697. package/modules/search/module.json +28 -0
  698. package/modules/search/package.json +43 -0
  699. package/modules/search/spec/module.yaml +177 -0
  700. package/modules/search/src/acl/permissions.ts +5 -0
  701. package/modules/search/src/api/endpoints.ts +221 -0
  702. package/modules/search/src/client/SearchView.tsrx +346 -0
  703. package/modules/search/src/client/api.ts +157 -0
  704. package/modules/search/src/client/contribution.tsrx +31 -0
  705. package/modules/search/src/client/index.ts +17 -0
  706. package/modules/search/src/client/navigation.ts +97 -0
  707. package/modules/search/src/client/search.css +56 -0
  708. package/modules/search/src/client/state.ts +113 -0
  709. package/modules/search/src/domain/data-classes.ts +73 -0
  710. package/modules/search/src/domain/providers.ts +88 -0
  711. package/modules/search/src/domain/types.ts +56 -0
  712. package/modules/search/src/index.ts +46 -0
  713. package/modules/search/src/platform.ts +42 -0
  714. package/modules/search/src/server/index.ts +25 -0
  715. package/modules/search/src/server/runtime.ts +123 -0
  716. package/modules/search/src/services/database-repository.ts +163 -0
  717. package/modules/search/src/services/index.ts +21 -0
  718. package/modules/search/src/services/migration.ts +65 -0
  719. package/modules/search/src/services/provider-registry.ts +137 -0
  720. package/modules/search/src/services/repository.ts +43 -0
  721. package/modules/search/src/services/search-service.ts +442 -0
  722. package/modules/search/src/services/service-error.ts +35 -0
  723. package/modules/search/src/settings.ts +68 -0
  724. package/modules/search/translations/en.json +45 -0
  725. package/modules/search/translations/pl.json +45 -0
  726. package/modules/system/module.json +2 -2
  727. package/modules/system/package.json +1 -1
  728. package/modules/system/spec/module.yaml +30 -3
  729. package/modules/system/src/client/FlagsPanel.tsrx +127 -0
  730. package/modules/system/src/client/ModuleSettingRow.tsrx +17 -7
  731. package/modules/system/src/client/ModuleSettingsSection.tsrx +10 -71
  732. package/modules/system/src/client/ModulesView.tsrx +91 -65
  733. package/modules/system/src/client/flags.ts +35 -0
  734. package/modules/system/src/client/index.ts +8 -0
  735. package/modules/system/src/client/navigation.ts +8 -0
  736. package/modules/system/src/client/settings-state.ts +159 -0
  737. package/modules/system/src/client/state.ts +2 -0
  738. package/modules/system/src/domain/time-zone.ts +105 -0
  739. package/modules/system/src/index.ts +12 -0
  740. package/modules/system/src/platform.ts +5 -1
  741. package/modules/system/src/server/endpoints.ts +72 -21
  742. package/modules/system/src/settings.ts +28 -0
  743. package/modules/system/translations/en.json +17 -0
  744. package/modules/system/translations/pl.json +17 -0
  745. package/modules/users/module.json +30 -4
  746. package/modules/users/package.json +4 -1
  747. package/modules/users/spec/module.yaml +290 -7
  748. package/modules/users/src/api/endpoints.ts +228 -15
  749. package/modules/users/src/client/InviteMemberForm.tsrx +2 -2
  750. package/modules/users/src/client/MemberDrawer.tsrx +142 -26
  751. package/modules/users/src/client/UserAccountForm.tsrx +2 -2
  752. package/modules/users/src/client/UsersView.tsrx +432 -71
  753. package/modules/users/src/client/api.ts +106 -12
  754. package/modules/users/src/client/contribution.tsrx +5 -0
  755. package/modules/users/src/client/member-columns.tsrx +22 -9
  756. package/modules/users/src/client/state.ts +172 -7
  757. package/modules/users/src/domain/lists.ts +9 -0
  758. package/modules/users/src/index.ts +11 -0
  759. package/modules/users/src/platform.ts +50 -1
  760. package/modules/users/src/services/member-export.ts +51 -0
  761. package/modules/users/src/services/member-import.ts +249 -0
  762. package/modules/users/src/services/member-search.ts +145 -0
  763. package/modules/users/src/services/users-service.ts +117 -4
  764. package/modules/users/translations/en.json +57 -8
  765. package/modules/users/translations/pl.json +57 -8
  766. package/modules/workflows/migrations/0004_payload_rotation_inventory.up.sql +17 -0
  767. package/modules/workflows/migrations/0005_workflows_human_approval.up.sql +28 -0
  768. package/modules/workflows/migrations/0006_workflows_retention_indexes.up.sql +11 -0
  769. package/modules/workflows/migrations/0007_workflows_erasure_subject_indexes.up.sql +17 -0
  770. package/modules/workflows/migrations/0008_workflows_subject_account.up.sql +24 -0
  771. package/modules/workflows/migrations/0009_workflows_definition_list_indexes.up.sql +9 -0
  772. package/modules/workflows/module.json +34 -6
  773. package/modules/workflows/package.json +2 -1
  774. package/modules/workflows/spec/module.yaml +26 -9
  775. package/modules/workflows/src/api/endpoints.ts +131 -25
  776. package/modules/workflows/src/cli/commands.json +17 -0
  777. package/modules/workflows/src/cli/index.ts +114 -0
  778. package/modules/workflows/src/client/WorkflowExecutionHistory.tsrx +36 -27
  779. package/modules/workflows/src/client/WorkflowInspector.tsrx +116 -0
  780. package/modules/workflows/src/client/WorkflowNodePalette.tsrx +1 -0
  781. package/modules/workflows/src/client/WorkflowsView.tsrx +236 -99
  782. package/modules/workflows/src/client/api.ts +54 -34
  783. package/modules/workflows/src/client/canvas-model.ts +12 -0
  784. package/modules/workflows/src/client/state.ts +95 -0
  785. package/modules/workflows/src/domain/events.ts +25 -11
  786. package/modules/workflows/src/domain/graph.ts +135 -1
  787. package/modules/workflows/src/domain/types.ts +91 -4
  788. package/modules/workflows/src/platform.ts +12 -0
  789. package/modules/workflows/src/server/runtime.ts +78 -5
  790. package/modules/workflows/src/services/approvals.ts +62 -0
  791. package/modules/workflows/src/services/cursors.ts +37 -0
  792. package/modules/workflows/src/services/data-classes.ts +232 -0
  793. package/modules/workflows/src/services/database-repository.ts +660 -171
  794. package/modules/workflows/src/services/migration.ts +240 -0
  795. package/modules/workflows/src/services/notifications.ts +98 -0
  796. package/modules/workflows/src/services/payload-codec.ts +51 -28
  797. package/modules/workflows/src/services/payload-rotation.ts +171 -0
  798. package/modules/workflows/src/services/repository.ts +123 -8
  799. package/modules/workflows/src/services/simulation.ts +7 -0
  800. package/modules/workflows/src/services/worker.ts +446 -25
  801. package/modules/workflows/src/services/workflows-service.ts +264 -103
  802. package/modules/workflows/translations/en.json +12 -4
  803. package/modules/workflows/translations/pl.json +12 -4
  804. package/modules.json +48 -4
  805. package/package.json +64 -6
  806. package/packages/client/package.json +1 -0
  807. package/packages/client/src/ApplicationShell.tsrx +43 -0
  808. package/packages/client/src/contributions.ts +55 -0
  809. package/packages/client/src/i18n/locales/en.json +5 -0
  810. package/packages/client/src/i18n/locales/pl.json +5 -0
  811. package/packages/client/src/index.ts +13 -1
  812. package/packages/client/src/routing.ts +22 -0
  813. package/packages/client/src/shell/CommandPalette.tsrx +223 -11
  814. package/packages/client/src/shell/command-search.ts +126 -0
  815. package/packages/client/src/shell/command.ts +30 -0
  816. package/packages/client/src/shell/navigation.ts +12 -0
  817. package/packages/client/src/shell/palette-keys.ts +27 -0
  818. package/packages/client/src/shell/shell.css +7 -0
  819. package/packages/contracts/schemas/module-spec.schema.json +287 -1
  820. package/packages/contracts/schemas/module.schema.json +25 -0
  821. package/packages/contracts/src/index.ts +144 -1
  822. package/packages/database/src/backup.ts +179 -0
  823. package/packages/database/src/decoders.ts +25 -0
  824. package/packages/database/src/index.ts +17 -0
  825. package/packages/database/src/record-history.ts +5 -14
  826. package/packages/harness/src/index.ts +2 -0
  827. package/packages/harness/src/runtime.ts +218 -1
  828. package/packages/harness/src/tool-adapters.ts +19 -1
  829. package/packages/kernel/src/acl.ts +179 -0
  830. package/packages/kernel/src/capability-registry.ts +69 -2
  831. package/packages/kernel/src/data-class-registry.ts +354 -0
  832. package/packages/kernel/src/index.ts +65 -4
  833. package/packages/kernel/src/keyring.ts +208 -0
  834. package/packages/kernel/src/module-compatibility.ts +35 -4
  835. package/packages/kernel/src/module-registry.ts +49 -2
  836. package/packages/kernel/src/module-settings.ts +189 -27
  837. package/packages/server/package.json +2 -1
  838. package/packages/server/src/composition.ts +38 -0
  839. package/packages/server/src/endpoint.ts +104 -47
  840. package/packages/server/src/export/csv.ts +34 -0
  841. package/packages/server/src/export/definition.ts +346 -0
  842. package/packages/server/src/export/index.ts +61 -0
  843. package/packages/server/src/export/run.ts +116 -0
  844. package/packages/server/src/index.ts +155 -0
  845. package/packages/server/src/jobs/index.ts +93 -0
  846. package/packages/server/src/jobs/runner.ts +486 -0
  847. package/packages/server/src/log.ts +291 -0
  848. package/packages/server/src/mail/config.ts +184 -0
  849. package/packages/server/src/mail/contracts.ts +251 -0
  850. package/packages/server/src/mail/index.ts +31 -0
  851. package/packages/server/src/mail/port.ts +101 -0
  852. package/packages/server/src/mail/smtp.ts +191 -0
  853. package/packages/server/src/mail/template.ts +105 -0
  854. package/packages/server/src/metrics.ts +447 -0
  855. package/packages/server/src/pagination.ts +246 -0
  856. package/packages/server/src/trace/context.ts +103 -0
  857. package/packages/server/src/trace/egress.ts +66 -0
  858. package/packages/server/src/trace/error-sink.ts +296 -0
  859. package/packages/server/src/trace/exporter.ts +295 -0
  860. package/packages/server/src/trace/index.ts +60 -0
  861. package/packages/server/src/trace/job-sink.ts +172 -0
  862. package/packages/server/src/trace/tracer.ts +338 -0
  863. package/packages/server/src/web.ts +5 -1
  864. package/packages/storage/package.json +40 -0
  865. package/packages/storage/src/config.ts +189 -0
  866. package/packages/storage/src/content-type.ts +124 -0
  867. package/packages/storage/src/contracts.ts +112 -0
  868. package/packages/storage/src/envelope.ts +189 -0
  869. package/packages/storage/src/index.ts +43 -0
  870. package/packages/storage/src/local.ts +75 -0
  871. package/packages/storage/src/port.ts +251 -0
  872. package/packages/storage/src/read-token.ts +130 -0
  873. package/packages/storage/src/s3.ts +144 -0
  874. package/packages/storage/src/scanner.ts +22 -0
  875. package/packages/storage/src/sigv4.ts +104 -0
  876. package/packages/storage/src/store.ts +13 -0
  877. package/packages/ui/package.json +1 -0
  878. package/packages/ui/src/components/Button.tsrx +3 -0
  879. package/packages/ui/src/components/ConfirmDialog.tsrx +13 -2
  880. package/packages/ui/src/components/DateField.tsrx +92 -0
  881. package/packages/ui/src/components/DatePicker.tsrx +525 -0
  882. package/packages/ui/src/components/DateRangeField.tsrx +93 -0
  883. package/packages/ui/src/components/Drawer.tsrx +10 -1
  884. package/packages/ui/src/components/FileUpload.tsrx +158 -0
  885. package/packages/ui/src/components/Pagination.tsrx +130 -0
  886. package/packages/ui/src/components/Select.tsrx +78 -0
  887. package/packages/ui/src/components/Table.tsrx +498 -81
  888. package/packages/ui/src/components/Tabs.tsrx +53 -0
  889. package/packages/ui/src/components/ToastHost.tsrx +48 -0
  890. package/packages/ui/src/components/calendar.ts +243 -0
  891. package/packages/ui/src/components/date-field.ts +62 -0
  892. package/packages/ui/src/components/file-upload.ts +49 -0
  893. package/packages/ui/src/components/focus-trap.ts +62 -0
  894. package/packages/ui/src/components/pagination.ts +68 -0
  895. package/packages/ui/src/components/table-sorting.ts +49 -0
  896. package/packages/ui/src/components/tabs.ts +61 -0
  897. package/packages/ui/src/components/toast-store.ts +116 -0
  898. package/packages/ui/src/icons/Icon.tsrx +5 -0
  899. package/packages/ui/src/index.ts +45 -0
  900. package/packages/ui/src/styles/components.css +598 -0
  901. package/modules/automations-workflows-integration/module.json +0 -27
  902. package/modules/automations-workflows-integration/spec/module.yaml +0 -93
  903. package/modules/automations-workflows-integration/src/index.ts +0 -14
  904. package/modules/automations-workflows-integration/src/platform.ts +0 -24
  905. package/modules/automations-workflows-integration/src/server/index.ts +0 -11
  906. package/modules/automations-workflows-integration/translations/en.json +0 -21
  907. package/modules/automations-workflows-integration/translations/pl.json +0 -21
  908. package/modules/workflows/src/services/cursor-codec.ts +0 -62
@@ -0,0 +1,658 @@
1
+ import type {
2
+ DatabaseMigration,
3
+ DatabaseSession,
4
+ ExistingMigrationState,
5
+ } from '@flowdular/sdk/database';
6
+ import {
7
+ migrationObjectState,
8
+ postgresTenantTableState,
9
+ } from '@flowdular/sdk/database';
10
+
11
+ /* Mirrors migrations/0001_audit_core.up.sql byte for byte. */
12
+ export const AUDIT_MIGRATION_001 = `-- One row per workspace and declared class, materialised from the registry the
13
+ -- first time the workspace reads it and refreshed on every read afterwards. The
14
+ -- registry stays the truth about what a class is; this row carries only what
15
+ -- the workspace owns: its period and when the sweep last ran.
16
+ --
17
+ -- retention_mode separates the two absent states the period has: 'default'
18
+ -- follows the declaring module, 'none' keeps the rows until a person deletes
19
+ -- them, and 'days' is the workspace's own number. A single nullable integer
20
+ -- could not tell the first two apart.
21
+ CREATE TABLE IF NOT EXISTS audit_data_classes (
22
+ id TEXT PRIMARY KEY,
23
+ tenant_id TEXT NOT NULL,
24
+ class_id TEXT NOT NULL,
25
+ module_id TEXT NOT NULL,
26
+ label TEXT NOT NULL,
27
+ exportable SMALLINT NOT NULL CHECK (exportable IN (0, 1)),
28
+ sweepable SMALLINT NOT NULL CHECK (sweepable IN (0, 1)),
29
+ default_retention_days BIGINT,
30
+ retention_mode TEXT NOT NULL CHECK (retention_mode IN ('default', 'days', 'none')),
31
+ retention_days BIGINT CHECK (retention_days IS NULL OR retention_days > 0),
32
+ last_swept_at BIGINT,
33
+ created_at BIGINT NOT NULL,
34
+ updated_at BIGINT NOT NULL,
35
+ CHECK ((retention_mode = 'days') = (retention_days IS NOT NULL))
36
+ );
37
+ CREATE UNIQUE INDEX IF NOT EXISTS audit_data_classes_tenant_class_idx
38
+ ON audit_data_classes (tenant_id, class_id);
39
+ -- The sweep walks this index across tenants on the routing role. Ordering by
40
+ -- last_swept_at first makes the walk start at the classes waiting longest.
41
+ CREATE INDEX IF NOT EXISTS audit_data_classes_due_idx
42
+ ON audit_data_classes (sweepable, last_swept_at, tenant_id, class_id);
43
+ ALTER TABLE audit_data_classes ENABLE ROW LEVEL SECURITY;
44
+ ALTER TABLE audit_data_classes FORCE ROW LEVEL SECURITY;
45
+ CREATE POLICY audit_data_classes_tenant_policy ON audit_data_classes
46
+ USING (tenant_id = current_setting('coreloom.tenant_id', true))
47
+ WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
48
+
49
+ CREATE TABLE IF NOT EXISTS audit_sweep_runs (
50
+ id TEXT PRIMARY KEY,
51
+ tenant_id TEXT NOT NULL,
52
+ class_id TEXT NOT NULL,
53
+ cutoff BIGINT NOT NULL,
54
+ removed BIGINT NOT NULL CHECK (removed >= 0),
55
+ status TEXT NOT NULL CHECK (status IN ('completed', 'partial', 'refused')),
56
+ reason TEXT,
57
+ occurred_at BIGINT NOT NULL
58
+ );
59
+ CREATE INDEX IF NOT EXISTS audit_sweep_runs_tenant_time_idx
60
+ ON audit_sweep_runs (tenant_id, occurred_at DESC, id);
61
+ -- A refusal stands until it is answered, so the loop asks for the newest run of
62
+ -- one class instead of appending the same refusal every interval.
63
+ CREATE INDEX IF NOT EXISTS audit_sweep_runs_tenant_class_time_idx
64
+ ON audit_sweep_runs (tenant_id, class_id, occurred_at DESC, id);
65
+ ALTER TABLE audit_sweep_runs ENABLE ROW LEVEL SECURITY;
66
+ ALTER TABLE audit_sweep_runs FORCE ROW LEVEL SECURITY;
67
+ CREATE POLICY audit_sweep_runs_tenant_policy ON audit_sweep_runs
68
+ USING (tenant_id = current_setting('coreloom.tenant_id', true))
69
+ WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
70
+
71
+ -- row_count rather than "rows": ROWS is a PostgreSQL keyword and an unquoted
72
+ -- column of that name would have to be quoted at every use site.
73
+ CREATE TABLE IF NOT EXISTS audit_export_runs (
74
+ id TEXT PRIMARY KEY,
75
+ tenant_id TEXT NOT NULL,
76
+ format_version TEXT NOT NULL,
77
+ status TEXT NOT NULL CHECK (status IN ('started', 'completed', 'failed')),
78
+ classes BIGINT NOT NULL CHECK (classes >= 0),
79
+ row_count BIGINT NOT NULL CHECK (row_count >= 0),
80
+ archive_digest TEXT,
81
+ requested_by TEXT NOT NULL,
82
+ started_at BIGINT NOT NULL,
83
+ completed_at BIGINT
84
+ );
85
+ CREATE INDEX IF NOT EXISTS audit_export_runs_tenant_time_idx
86
+ ON audit_export_runs (tenant_id, started_at DESC, id);
87
+ ALTER TABLE audit_export_runs ENABLE ROW LEVEL SECURITY;
88
+ ALTER TABLE audit_export_runs FORCE ROW LEVEL SECURITY;
89
+ CREATE POLICY audit_export_runs_tenant_policy ON audit_export_runs
90
+ USING (tenant_id = current_setting('coreloom.tenant_id', true))
91
+ WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
92
+
93
+ -- auth.core keeps its trail private to its own service, and it registers no
94
+ -- public capability, so a module cannot append to it. This is audit.core's own
95
+ -- tamper-evident trail: one chain per workspace, each event sealing the hash of
96
+ -- the one before it, so a removed or edited row breaks every hash after it.
97
+ CREATE TABLE IF NOT EXISTS audit_events (
98
+ id TEXT PRIMARY KEY,
99
+ tenant_id TEXT NOT NULL,
100
+ sequence BIGINT NOT NULL CHECK (sequence > 0),
101
+ actor_id TEXT NOT NULL,
102
+ action TEXT NOT NULL,
103
+ subject_type TEXT NOT NULL CHECK (subject_type IN ('data-class', 'sweep-run', 'export-run')),
104
+ subject_id TEXT NOT NULL,
105
+ metadata_json TEXT NOT NULL,
106
+ occurred_at BIGINT NOT NULL,
107
+ previous_hash TEXT,
108
+ event_hash TEXT NOT NULL,
109
+ UNIQUE (tenant_id, sequence),
110
+ UNIQUE (tenant_id, event_hash)
111
+ );
112
+ CREATE INDEX IF NOT EXISTS audit_events_tenant_time_idx
113
+ ON audit_events (tenant_id, occurred_at DESC, sequence DESC);
114
+ ALTER TABLE audit_events ENABLE ROW LEVEL SECURITY;
115
+ ALTER TABLE audit_events FORCE ROW LEVEL SECURITY;
116
+ CREATE POLICY audit_events_tenant_policy ON audit_events
117
+ USING (tenant_id = current_setting('coreloom.tenant_id', true))
118
+ WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
119
+ `;
120
+
121
+ /* Mirrors migrations/0002_audit_sweep_routing_role.up.sql byte for byte. */
122
+ export const AUDIT_MIGRATION_002_SWEEP_ROUTING_ROLE = `-- The retention sweep must find the classes that are due across every
123
+ -- workspace before it knows whose they are. It is granted exactly the routing
124
+ -- and policy columns of audit_data_classes: the human label and the owning
125
+ -- module id stay invisible to it, and every class it picks is read again under
126
+ -- the workspace the routing row named before a single row is removed.
127
+ --
128
+ -- The retention columns are part of the routing set on purpose. Without them
129
+ -- the cross-tenant read cannot tell a class that is kept for ever from one that
130
+ -- is due, and the loop would re-read the same never-due classes every interval.
131
+ DO $$
132
+ BEGIN
133
+ IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'coreloom_background') THEN
134
+ RAISE EXCEPTION 'The coreloom_background role must exist before this migration.';
135
+ END IF;
136
+ END
137
+ $$;
138
+ CREATE POLICY audit_data_classes_background_policy ON audit_data_classes
139
+ FOR SELECT TO coreloom_background
140
+ USING (true);
141
+ REVOKE SELECT ON audit_data_classes FROM coreloom_background;
142
+ GRANT SELECT (tenant_id, class_id, sweepable, retention_mode, retention_days, default_retention_days, last_swept_at) ON audit_data_classes TO coreloom_background;
143
+ `;
144
+
145
+ /* Mirrors migrations/0003_audit_export_request.up.sql byte for byte. */
146
+ export const AUDIT_MIGRATION_003_EXPORT_REQUEST = `-- An export is a request the running platform answers. The operator command
147
+ -- records the row and waits; the platform process, the only one holding the
148
+ -- sealed data class registry with every owner port, performs the export and
149
+ -- records what it wrote. The request columns are what the operator asked for,
150
+ -- the result columns what the platform produced, and claimed_at is the lease
151
+ -- that keeps two platform processes from writing one archive twice.
152
+ ALTER TABLE audit_export_runs ADD COLUMN IF NOT EXISTS output_directory TEXT;
153
+ ALTER TABLE audit_export_runs ADD COLUMN IF NOT EXISTS dry_run SMALLINT NOT NULL DEFAULT 0;
154
+ ALTER TABLE audit_export_runs ADD COLUMN IF NOT EXISTS workspace_slug TEXT;
155
+ ALTER TABLE audit_export_runs ADD COLUMN IF NOT EXISTS workspace_name TEXT;
156
+ ALTER TABLE audit_export_runs ADD COLUMN IF NOT EXISTS archive_path TEXT;
157
+ ALTER TABLE audit_export_runs ADD COLUMN IF NOT EXISTS reason TEXT;
158
+ ALTER TABLE audit_export_runs ADD COLUMN IF NOT EXISTS summary_json TEXT;
159
+ ALTER TABLE audit_export_runs ADD COLUMN IF NOT EXISTS claimed_at BIGINT;
160
+ DO $$
161
+ BEGIN
162
+ IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'audit_export_runs_dry_run_check') THEN
163
+ ALTER TABLE audit_export_runs
164
+ ADD CONSTRAINT audit_export_runs_dry_run_check CHECK (dry_run IN (0, 1));
165
+ END IF;
166
+ END
167
+ $$;
168
+ -- The platform loop finds requested runs across workspaces before it knows
169
+ -- whose they are, so it reads the routing columns alone on the background
170
+ -- role; every run it picks is read again under the workspace the routing row
171
+ -- named before a single byte is written.
172
+ CREATE INDEX IF NOT EXISTS audit_export_runs_pending_idx
173
+ ON audit_export_runs (status, started_at, tenant_id, id);
174
+ DO $$
175
+ BEGIN
176
+ IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'coreloom_background') THEN
177
+ RAISE EXCEPTION 'The coreloom_background role must exist before this migration.';
178
+ END IF;
179
+ END
180
+ $$;
181
+ CREATE POLICY audit_export_runs_background_policy ON audit_export_runs
182
+ FOR SELECT TO coreloom_background
183
+ USING (true);
184
+ REVOKE SELECT ON audit_export_runs FROM coreloom_background;
185
+ GRANT SELECT (tenant_id, id, status, started_at) ON audit_export_runs TO coreloom_background;
186
+ `;
187
+
188
+ /* Mirrors migrations/0004_audit_hold_seal_erasure.up.sql byte for byte. */
189
+ export const AUDIT_MIGRATION_004_HOLD_SEAL_ERASURE = `-- Sealing, legal hold and erasure on request. Three tables and four columns.
190
+ --
191
+ -- audit_anchors closes segments of the per-workspace event chain. An anchor
192
+ -- seals the sequence range, the row count, the time range, the hash chain over
193
+ -- the segment continuing from the anchor before it, and the hash of that anchor
194
+ -- itself; the signature is HMAC-SHA256 over the anchor hash, so re-signing
195
+ -- under a rotated key changes the signature and the key id alone and every
196
+ -- segment file already written still verifies.
197
+ CREATE TABLE IF NOT EXISTS audit_anchors (
198
+ id TEXT PRIMARY KEY,
199
+ tenant_id TEXT NOT NULL,
200
+ anchor_sequence BIGINT NOT NULL CHECK (anchor_sequence > 0),
201
+ from_sequence BIGINT NOT NULL CHECK (from_sequence > 0),
202
+ to_sequence BIGINT NOT NULL,
203
+ row_count BIGINT NOT NULL CHECK (row_count > 0),
204
+ first_occurred_at BIGINT NOT NULL,
205
+ last_occurred_at BIGINT NOT NULL,
206
+ segment_hash TEXT NOT NULL,
207
+ previous_anchor_hash TEXT,
208
+ anchor_hash TEXT NOT NULL,
209
+ signature TEXT NOT NULL,
210
+ key_id TEXT NOT NULL,
211
+ segment_file TEXT NOT NULL,
212
+ sealed_by TEXT NOT NULL,
213
+ sealed_at BIGINT NOT NULL,
214
+ CHECK (to_sequence >= from_sequence),
215
+ UNIQUE (tenant_id, anchor_sequence),
216
+ UNIQUE (tenant_id, to_sequence),
217
+ UNIQUE (tenant_id, anchor_hash)
218
+ );
219
+ -- The newest anchor of a workspace is read before every seal and before every
220
+ -- sweep of the event class, so it is the one lookup that has to stay O(1).
221
+ CREATE INDEX IF NOT EXISTS audit_anchors_tenant_sequence_idx
222
+ ON audit_anchors (tenant_id, anchor_sequence DESC);
223
+ ALTER TABLE audit_anchors ENABLE ROW LEVEL SECURITY;
224
+ ALTER TABLE audit_anchors FORCE ROW LEVEL SECURITY;
225
+ CREATE POLICY audit_anchors_tenant_policy ON audit_anchors
226
+ USING (tenant_id = current_setting('coreloom.tenant_id', true))
227
+ WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
228
+
229
+ -- A hold is a standing instruction not to remove what it covers. scope_kind
230
+ -- names the dimension it was placed on and the nullable columns narrow it
231
+ -- further, so an account hold limited to one class and one date range is one
232
+ -- row rather than three. A lifted hold is kept: who lifted it and why is the
233
+ -- evidence that the data became removable again.
234
+ CREATE TABLE IF NOT EXISTS audit_legal_holds (
235
+ id TEXT PRIMARY KEY,
236
+ tenant_id TEXT NOT NULL,
237
+ scope_kind TEXT NOT NULL CHECK (scope_kind IN ('account', 'workspace', 'data-class', 'date-range')),
238
+ account_id TEXT,
239
+ class_id TEXT,
240
+ from_at BIGINT,
241
+ to_at BIGINT,
242
+ reason TEXT NOT NULL,
243
+ status TEXT NOT NULL CHECK (status IN ('active', 'lifted')),
244
+ placed_by TEXT NOT NULL,
245
+ placed_at BIGINT NOT NULL,
246
+ lifted_by TEXT,
247
+ lift_reason TEXT,
248
+ lifted_at BIGINT,
249
+ CHECK (scope_kind <> 'account' OR account_id IS NOT NULL),
250
+ CHECK (scope_kind <> 'data-class' OR class_id IS NOT NULL),
251
+ CHECK (scope_kind <> 'date-range' OR (from_at IS NOT NULL AND to_at IS NOT NULL)),
252
+ CHECK (scope_kind <> 'workspace' OR (account_id IS NULL AND class_id IS NULL
253
+ AND from_at IS NULL AND to_at IS NULL)),
254
+ CHECK (from_at IS NULL OR to_at IS NULL OR to_at >= from_at),
255
+ CHECK ((status = 'lifted') = (lifted_at IS NOT NULL))
256
+ );
257
+ -- The sweep and every erasure ask for the active holds of one workspace before
258
+ -- they touch a row, so that read walks an index instead of the table.
259
+ CREATE INDEX IF NOT EXISTS audit_legal_holds_tenant_status_idx
260
+ ON audit_legal_holds (tenant_id, status, placed_at DESC, id);
261
+ ALTER TABLE audit_legal_holds ENABLE ROW LEVEL SECURITY;
262
+ ALTER TABLE audit_legal_holds FORCE ROW LEVEL SECURITY;
263
+ CREATE POLICY audit_legal_holds_tenant_policy ON audit_legal_holds
264
+ USING (tenant_id = current_setting('coreloom.tenant_id', true))
265
+ WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
266
+
267
+ -- One data key per subject. Audit events are excluded from erasure because they
268
+ -- are the evidence the lifecycle happened, so the subject-identifying fields of
269
+ -- a new event are sealed under this key instead: destroying the key blanks the
270
+ -- material and the account it belonged to, and what is left is a tombstone that
271
+ -- proves an event existed and can never be read again. The row stays so the
272
+ -- events that point at it keep a target, and the chain hash covers the sealed
273
+ -- bytes rather than the plaintext, so destruction never breaks verification.
274
+ CREATE TABLE IF NOT EXISTS audit_subject_keys (
275
+ id TEXT PRIMARY KEY,
276
+ tenant_id TEXT NOT NULL,
277
+ subject TEXT,
278
+ material TEXT,
279
+ sealed_at BIGINT NOT NULL,
280
+ destroyed_at BIGINT,
281
+ CHECK ((subject IS NULL) = (material IS NULL)),
282
+ CHECK ((destroyed_at IS NULL) = (material IS NOT NULL))
283
+ );
284
+ -- Partial, because every destroyed key carries a null subject and two of them
285
+ -- would collide under a total unique index.
286
+ CREATE UNIQUE INDEX IF NOT EXISTS audit_subject_keys_tenant_subject_idx
287
+ ON audit_subject_keys (tenant_id, subject)
288
+ WHERE subject IS NOT NULL;
289
+ ALTER TABLE audit_subject_keys ENABLE ROW LEVEL SECURITY;
290
+ ALTER TABLE audit_subject_keys FORCE ROW LEVEL SECURITY;
291
+ CREATE POLICY audit_subject_keys_tenant_policy ON audit_subject_keys
292
+ USING (tenant_id = current_setting('coreloom.tenant_id', true))
293
+ WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
294
+
295
+ -- An erasure is a request the running platform answers, for the same reason an
296
+ -- export is: only the platform process holds the registrations every owning
297
+ -- module made, so only it can reach an erase operation. The operator command
298
+ -- records the row and waits. The subject is kept while the run needs it and
299
+ -- blanked when it finishes, so the history proves an erasure happened without
300
+ -- naming the person it erased; subject_marker is the same hash the certificate
301
+ -- file is named after, which is what ties the two together.
302
+ CREATE TABLE IF NOT EXISTS audit_erasure_runs (
303
+ id TEXT PRIMARY KEY,
304
+ tenant_id TEXT NOT NULL,
305
+ subject TEXT,
306
+ subject_marker TEXT NOT NULL,
307
+ status TEXT NOT NULL CHECK (status IN ('requested', 'completed', 'failed')),
308
+ dry_run SMALLINT NOT NULL CHECK (dry_run IN (0, 1)),
309
+ destroy_key SMALLINT NOT NULL CHECK (destroy_key IN (0, 1)),
310
+ requested_by TEXT NOT NULL,
311
+ output_directory TEXT,
312
+ workspace_slug TEXT,
313
+ workspace_name TEXT,
314
+ classes BIGINT NOT NULL CHECK (classes >= 0),
315
+ row_count BIGINT NOT NULL CHECK (row_count >= 0),
316
+ certificate_path TEXT,
317
+ outcome_json TEXT,
318
+ reason TEXT,
319
+ claimed_at BIGINT,
320
+ started_at BIGINT NOT NULL,
321
+ completed_at BIGINT
322
+ );
323
+ CREATE INDEX IF NOT EXISTS audit_erasure_runs_tenant_time_idx
324
+ ON audit_erasure_runs (tenant_id, started_at DESC, id);
325
+ CREATE INDEX IF NOT EXISTS audit_erasure_runs_pending_idx
326
+ ON audit_erasure_runs (status, started_at, tenant_id, id);
327
+ ALTER TABLE audit_erasure_runs ENABLE ROW LEVEL SECURITY;
328
+ ALTER TABLE audit_erasure_runs FORCE ROW LEVEL SECURITY;
329
+ CREATE POLICY audit_erasure_runs_tenant_policy ON audit_erasure_runs
330
+ USING (tenant_id = current_setting('coreloom.tenant_id', true))
331
+ WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
332
+
333
+ -- A sealed event keeps its actor and subject columns at a fixed marker and
334
+ -- carries the envelope beside them. The event hash reads the envelope in the
335
+ -- place the metadata used to sit, so the hash of a sealed row is a function of
336
+ -- the stored bytes alone and stays verifiable after the key is destroyed.
337
+ ALTER TABLE audit_events ADD COLUMN IF NOT EXISTS subject_key_id TEXT;
338
+ ALTER TABLE audit_events ADD COLUMN IF NOT EXISTS sealed_payload TEXT;
339
+ ALTER TABLE audit_sweep_runs ADD COLUMN IF NOT EXISTS held_back BIGINT;
340
+ ALTER TABLE audit_events DROP CONSTRAINT IF EXISTS audit_events_subject_type_check;
341
+ DO $$
342
+ BEGIN
343
+ IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'audit_events_subject_type_check') THEN
344
+ ALTER TABLE audit_events
345
+ ADD CONSTRAINT audit_events_subject_type_check
346
+ CHECK (subject_type IN ('data-class', 'sweep-run', 'export-run', 'legal-hold', 'erasure', 'chain-anchor'));
347
+ END IF;
348
+ IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'audit_events_sealed_check') THEN
349
+ ALTER TABLE audit_events
350
+ ADD CONSTRAINT audit_events_sealed_check
351
+ CHECK ((subject_key_id IS NULL) = (sealed_payload IS NULL));
352
+ END IF;
353
+ IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'audit_sweep_runs_held_back_check') THEN
354
+ ALTER TABLE audit_sweep_runs
355
+ ADD CONSTRAINT audit_sweep_runs_held_back_check
356
+ CHECK (held_back IS NULL OR held_back >= 0);
357
+ END IF;
358
+ END
359
+ $$;
360
+ -- The anchor rotation counts anchors per key across every workspace before it
361
+ -- knows whose they are, so it reads the routing columns alone on the background
362
+ -- role; every anchor it names is read and re-signed under the workspace the
363
+ -- routing row named. The hashes stay invisible to it.
364
+ DO $$
365
+ BEGIN
366
+ IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'coreloom_background') THEN
367
+ RAISE EXCEPTION 'The coreloom_background role must exist before this migration.';
368
+ END IF;
369
+ END
370
+ $$;
371
+ CREATE POLICY audit_anchors_background_policy ON audit_anchors
372
+ FOR SELECT TO coreloom_background
373
+ USING (true);
374
+ REVOKE SELECT ON audit_anchors FROM coreloom_background;
375
+ GRANT SELECT (tenant_id, id, key_id) ON audit_anchors TO coreloom_background;
376
+ CREATE POLICY audit_erasure_runs_background_policy ON audit_erasure_runs
377
+ FOR SELECT TO coreloom_background
378
+ USING (true);
379
+ REVOKE SELECT ON audit_erasure_runs FROM coreloom_background;
380
+ GRANT SELECT (tenant_id, id, status, started_at) ON audit_erasure_runs TO coreloom_background;
381
+ `;
382
+
383
+ /* Mirrors migrations/0005_audit_event_format.up.sql byte for byte. */
384
+ export const AUDIT_MIGRATION_005_EVENT_FORMAT = `-- The event format marker, the subject marker, a partial erasure run and the
385
+ -- indexes the ledger walks need.
386
+ --
387
+ -- seal_format names the writer of a row. A row without it was written before
388
+ -- audit.core recorded a format at all, which is exactly the set verify reports
389
+ -- as plaintext; a row that carries the marker and no sealed payload is an event
390
+ -- about nobody, not an unsealed person. Deriving that from sealed_payload alone
391
+ -- reported every platform event as pre-0.2.0.
392
+ ALTER TABLE audit_events ADD COLUMN IF NOT EXISTS seal_format TEXT;
393
+
394
+ -- The name a subject keeps once its key is gone. Destruction removes the
395
+ -- account the key belonged to, so without this column a destroyed key cannot be
396
+ -- found again and the next event naming that subject would create a new key and
397
+ -- put the account back in the clear. Active rows are named from the same hash
398
+ -- the certificate file already uses.
399
+ ALTER TABLE audit_subject_keys ADD COLUMN IF NOT EXISTS subject_marker TEXT;
400
+ UPDATE audit_subject_keys
401
+ SET subject_marker = substr(encode(sha256((tenant_id || ':' || subject)::bytea), 'hex'), 1, 12)
402
+ WHERE subject IS NOT NULL AND subject_marker IS NULL;
403
+ CREATE UNIQUE INDEX IF NOT EXISTS audit_subject_keys_tenant_marker_idx
404
+ ON audit_subject_keys (tenant_id, subject_marker)
405
+ WHERE subject_marker IS NOT NULL;
406
+
407
+ -- A run whose class was truncated or whose owner failed erased some of the
408
+ -- subject and not all of it. Recording that as completed would tell an operator
409
+ -- the subject is gone when a class still holds rows.
410
+ ALTER TABLE audit_erasure_runs DROP CONSTRAINT IF EXISTS audit_erasure_runs_status_check;
411
+ DO $$
412
+ BEGIN
413
+ IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'audit_erasure_runs_status_check') THEN
414
+ ALTER TABLE audit_erasure_runs
415
+ ADD CONSTRAINT audit_erasure_runs_status_check
416
+ CHECK (status IN ('requested', 'completed', 'partial', 'failed'));
417
+ END IF;
418
+ IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'audit_subject_keys_marker_check') THEN
419
+ ALTER TABLE audit_subject_keys
420
+ ADD CONSTRAINT audit_subject_keys_marker_check
421
+ CHECK (subject_marker IS NULL OR length(subject_marker) <= 32);
422
+ END IF;
423
+ END
424
+ $$;
425
+
426
+ -- The keyset walks the export takes over the three ledgers order by the primary
427
+ -- key inside one workspace, and the anchor rotation counts and pages anchors by
428
+ -- key. Without these each walk was a scan of every row of the table.
429
+ CREATE INDEX IF NOT EXISTS audit_events_tenant_id_idx
430
+ ON audit_events (tenant_id, id);
431
+ CREATE INDEX IF NOT EXISTS audit_sweep_runs_tenant_id_idx
432
+ ON audit_sweep_runs (tenant_id, id);
433
+ CREATE INDEX IF NOT EXISTS audit_export_runs_tenant_id_idx
434
+ ON audit_export_runs (tenant_id, id);
435
+ CREATE INDEX IF NOT EXISTS audit_anchors_key_id_idx
436
+ ON audit_anchors (key_id, id);
437
+
438
+ -- The routing read starts at the classes waiting longest, so it orders by
439
+ -- last_swept_at NULLS FIRST. The index migration 0001 created sorts nulls last,
440
+ -- which is the opposite end, so the walk sorted every due class on every pass.
441
+ CREATE INDEX IF NOT EXISTS audit_data_classes_due_nulls_first_idx
442
+ ON audit_data_classes (sweepable, last_swept_at NULLS FIRST, tenant_id, class_id);
443
+ DROP INDEX IF EXISTS audit_data_classes_due_idx;
444
+ `;
445
+
446
+ /* Mirrors migrations/0006_audit_own_class_walks.up.sql byte for byte. */
447
+ export const AUDIT_MIGRATION_006_OWN_CLASS_WALKS = `-- audit.core declares the rest of its own tenant tables as data classes, so the
448
+ -- legal holds and the erasure history are exported through the same keyset walk
449
+ -- as the chain and the two ledgers, and an erasure plan counts the holds that
450
+ -- name the subject. Each of those reads orders inside one workspace by the
451
+ -- primary key or filters by the account a hold covers; without these indexes
452
+ -- every page would be a pass over the workspace's rows.
453
+ CREATE INDEX IF NOT EXISTS audit_legal_holds_tenant_id_idx
454
+ ON audit_legal_holds (tenant_id, id);
455
+ CREATE INDEX IF NOT EXISTS audit_erasure_runs_tenant_id_idx
456
+ ON audit_erasure_runs (tenant_id, id);
457
+ -- Partial, because a hold that names no account is never counted for a subject.
458
+ CREATE INDEX IF NOT EXISTS audit_legal_holds_tenant_account_idx
459
+ ON audit_legal_holds (tenant_id, account_id)
460
+ WHERE account_id IS NOT NULL;
461
+ `;
462
+
463
+ /** The tables migration 0001 creates; its inspection has to prove all four. */
464
+ const AUDIT_0001_TABLES = [
465
+ 'audit_data_classes',
466
+ 'audit_sweep_runs',
467
+ 'audit_export_runs',
468
+ 'audit_events',
469
+ ] as const;
470
+
471
+ export const AUDIT_TENANT_TABLES = [
472
+ 'audit_data_classes',
473
+ 'audit_sweep_runs',
474
+ 'audit_export_runs',
475
+ 'audit_events',
476
+ 'audit_anchors',
477
+ 'audit_legal_holds',
478
+ 'audit_subject_keys',
479
+ 'audit_erasure_runs',
480
+ ] as const;
481
+
482
+ /** The tables migration 0004 adds; 0001 proves the four before them. */
483
+ export const AUDIT_0004_TABLES = [
484
+ 'audit_anchors',
485
+ 'audit_legal_holds',
486
+ 'audit_subject_keys',
487
+ 'audit_erasure_runs',
488
+ ] as const;
489
+
490
+ /**
491
+ * Adoption probes run inside the migration transaction, which is pinned to one
492
+ * connection, so every one of them is awaited in turn: eagerly created promises
493
+ * would issue overlapping queries on that single client.
494
+ */
495
+ async function everyTenantTable(
496
+ database: DatabaseSession,
497
+ tables: readonly string[],
498
+ extras: readonly (() => Promise<boolean>)[] = [],
499
+ ): Promise<ExistingMigrationState> {
500
+ const states: ExistingMigrationState[] = [];
501
+ for (const table of tables) {
502
+ states.push(
503
+ await postgresTenantTableState(database, table, table + '_tenant_policy'),
504
+ );
505
+ }
506
+ if (extras.length > 0) states.push(await migrationObjectState(extras));
507
+ if (states.every((state) => state === 'complete')) return 'complete';
508
+ return states.every((state) => state === 'absent') ? 'absent' : 'partial';
509
+ }
510
+
511
+ /**
512
+ * Whether a named constraint exists on a table of the current schema. The
513
+ * catalogue is not schema qualified by itself, so the join is what keeps a probe
514
+ * from reading a same-named constraint of another schema on the search path.
515
+ *
516
+ * Migrations 0003, 0004 and 0005 probe pg_constraint by name alone inside their
517
+ * own DO blocks. A same-named constraint on another schema of the search path
518
+ * would make one of those blocks skip an ALTER TABLE it should have run. Those
519
+ * files are applied and their checksums are the ledger's, so the bodies stay as
520
+ * they are; the adoption probes live here rather than in the applied SQL, which
521
+ * is why every constraint those migrations add is proved through this
522
+ * schema-scoped check before a schema is adopted as complete. A deployment that
523
+ * carries such a schema is reported partial and refused rather than adopted.
524
+ *
525
+ * `carries` is for a constraint a later migration replaced under the same name:
526
+ * PostgreSQL names an inline column check after the table and the column, so
527
+ * the name alone cannot tell the narrow one from the widened one and the text
528
+ * the widening added is what proves which of the two a schema holds.
529
+ */
530
+ function hasConstraint(
531
+ database: DatabaseSession,
532
+ table: string,
533
+ constraint: string,
534
+ carries: string | null = null,
535
+ ): () => Promise<boolean> {
536
+ return async () => {
537
+ const result = await database.query<{ present: boolean }>({
538
+ text: `SELECT EXISTS (
539
+ SELECT 1 FROM pg_constraint AS constraint_row
540
+ JOIN pg_class AS relation ON relation.oid = constraint_row.conrelid
541
+ JOIN pg_namespace AS namespace ON namespace.oid = relation.relnamespace
542
+ WHERE namespace.nspname = current_schema()
543
+ AND relation.relname = $1
544
+ AND constraint_row.conname = $2
545
+ AND ($3::text IS NULL
546
+ OR position($3 IN pg_get_constraintdef(constraint_row.oid)) > 0)
547
+ ) AS present`,
548
+ parameters: [table, constraint, carries],
549
+ });
550
+ return result.rows[0]?.present === true;
551
+ };
552
+ }
553
+
554
+ export const databaseMigrations: readonly DatabaseMigration[] = [
555
+ {
556
+ id: '0001_audit_core',
557
+ sql: { postgresql: AUDIT_MIGRATION_001 },
558
+ /* Every table of this migration has to be proved, not just the first:
559
+ a schema carrying only some of them is partial, never complete. */
560
+ inspectExisting: (database) =>
561
+ everyTenantTable(database, AUDIT_0001_TABLES),
562
+ },
563
+ {
564
+ id: '0002_audit_sweep_routing_role',
565
+ sql: { postgresql: AUDIT_MIGRATION_002_SWEEP_ROUTING_ROLE },
566
+ /* A policy and a column grant leave no schema object behind, so the
567
+ privilege itself is what proves this migration ran. */
568
+ inspectExisting: async (database) => {
569
+ const result = await database.query<{ granted: boolean }>({
570
+ text: `SELECT CASE WHEN to_regclass('audit_data_classes') IS NOT NULL THEN
571
+ has_column_privilege('coreloom_background', 'audit_data_classes', 'last_swept_at', 'SELECT')
572
+ ELSE false END AS granted`,
573
+ });
574
+ return result.rows[0]?.granted === true ? 'complete' : 'absent';
575
+ },
576
+ },
577
+ {
578
+ id: '0003_audit_export_request',
579
+ sql: { postgresql: AUDIT_MIGRATION_003_EXPORT_REQUEST },
580
+ /* The added column is what proves this migration ran: the grant and the
581
+ policy travel in the same transactional DDL, so a schema that carries
582
+ the column carries them too. The introspector scopes every probe to
583
+ current_schema(), so a same-named table on the search path cannot
584
+ answer for this one. */
585
+ inspectExisting: (database) =>
586
+ migrationObjectState([
587
+ () => database.schema.hasColumn('audit_export_runs', 'summary_json'),
588
+ () => database.schema.hasIndex('audit_export_runs_pending_idx'),
589
+ ]),
590
+ },
591
+ {
592
+ id: '0004_audit_hold_seal_erasure',
593
+ sql: { postgresql: AUDIT_MIGRATION_004_HOLD_SEAL_ERASURE },
594
+ /* Three tables, two columns on a fourth and one on a fifth, with the
595
+ indexes and the constraints that go with them: every object has to be
596
+ proved, because a schema carrying only some is partial, never
597
+ complete. */
598
+ inspectExisting: (database) =>
599
+ everyTenantTable(database, AUDIT_0004_TABLES, [
600
+ () => database.schema.hasColumn('audit_events', 'subject_key_id'),
601
+ () => database.schema.hasColumn('audit_events', 'sealed_payload'),
602
+ () => database.schema.hasColumn('audit_sweep_runs', 'held_back'),
603
+ () => database.schema.hasIndex('audit_anchors_tenant_sequence_idx'),
604
+ () => database.schema.hasIndex('audit_legal_holds_tenant_status_idx'),
605
+ () => database.schema.hasIndex('audit_subject_keys_tenant_subject_idx'),
606
+ () => database.schema.hasIndex('audit_erasure_runs_tenant_time_idx'),
607
+ () => database.schema.hasIndex('audit_erasure_runs_pending_idx'),
608
+ hasConstraint(database, 'audit_events', 'audit_events_sealed_check'),
609
+ hasConstraint(
610
+ database,
611
+ 'audit_sweep_runs',
612
+ 'audit_sweep_runs_held_back_check',
613
+ ),
614
+ ]),
615
+ },
616
+ {
617
+ id: '0005_audit_event_format',
618
+ sql: { postgresql: AUDIT_MIGRATION_005_EVENT_FORMAT },
619
+ /* Two columns, the marker index and the widened status constraint; the
620
+ ledger indexes travel in the same transactional DDL. Both constraints
621
+ are proved through the schema-scoped probe, because the DO block that
622
+ adds them reads pg_constraint by name alone. */
623
+ inspectExisting: (database) =>
624
+ migrationObjectState([
625
+ () => database.schema.hasColumn('audit_events', 'seal_format'),
626
+ () => database.schema.hasColumn('audit_subject_keys', 'subject_marker'),
627
+ () => database.schema.hasIndex('audit_subject_keys_tenant_marker_idx'),
628
+ () => database.schema.hasIndex('audit_events_tenant_id_idx'),
629
+ () =>
630
+ database.schema.hasIndex('audit_data_classes_due_nulls_first_idx'),
631
+ hasConstraint(
632
+ database,
633
+ 'audit_erasure_runs',
634
+ 'audit_erasure_runs_status_check',
635
+ /* Migration 0004 created the table with the same constraint name
636
+ and without this status, so the definition is what separates
637
+ the widened constraint from the one before it. */
638
+ 'partial',
639
+ ),
640
+ hasConstraint(
641
+ database,
642
+ 'audit_subject_keys',
643
+ 'audit_subject_keys_marker_check',
644
+ ),
645
+ ]),
646
+ },
647
+ {
648
+ id: '0006_audit_own_class_walks',
649
+ sql: { postgresql: AUDIT_MIGRATION_006_OWN_CLASS_WALKS },
650
+ /* Three indexes and nothing else, so each of them is the proof. */
651
+ inspectExisting: (database) =>
652
+ migrationObjectState([
653
+ () => database.schema.hasIndex('audit_legal_holds_tenant_id_idx'),
654
+ () => database.schema.hasIndex('audit_erasure_runs_tenant_id_idx'),
655
+ () => database.schema.hasIndex('audit_legal_holds_tenant_account_idx'),
656
+ ]),
657
+ },
658
+ ];