@flowdular/sdk 0.2.3 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.ai/agents/sandbox/business-manager.md +5 -1
- package/.ai/blueprints/author-spec/README.md +1 -1
- package/.ai/blueprints/author-spec/spec-requirements.yaml +44 -0
- package/.ai/blueprints/author-spec/steps.yaml +5 -5
- package/.ai/blueprints/author-spec/templates/module.yaml +99 -3
- package/.ai/blueprints/edit-module/gates.yaml +4 -0
- package/.ai/blueprints/edit-module/required-files.yaml +9 -0
- package/.ai/blueprints/new-module/gates.yaml +4 -0
- package/.ai/blueprints/new-module/spec-requirements.yaml +2 -2
- package/.ai/blueprints/release/gates.yaml +4 -0
- package/.ai/platform-capabilities.md +128 -0
- package/.ai/policies/capabilities.yaml +100 -0
- package/.ai/policies/path-ownership.yaml +5 -2
- package/.ai/policies/task-budgets.yaml +5 -3
- package/.ai/references/catalog/module.json +4 -4
- package/.ai/references/catalog/package.json +2 -2
- package/.ai/references/catalog/spec/module.yaml +5 -3
- package/.ai/references/catalog/src/platform.ts +2 -0
- package/.ai/references/catalog/src/services/catalog-service.ts +89 -1
- package/.ai/references/catalog/src/services/data-classes.ts +47 -0
- package/.ai/references/catalog/src/services/database-repository.ts +98 -1
- package/.ai/references/catalog/src/services/repository.ts +22 -1
- package/.ai/references/catalog/tests/data-classes.test.ts +157 -0
- package/.ai/references/catalog.provenance.json +12 -10
- package/.ai/skills/README.md +10 -0
- package/.ai/skills/agent-tool-design/SKILL.md +1 -2
- package/.ai/skills/auth-security-review/SKILL.md +1 -1
- package/.ai/skills/business-agent-design/SKILL.md +0 -1
- package/.ai/skills/deploy-operate/SKILL.md +114 -0
- package/.ai/skills/module-new/SKILL.md +29 -3
- package/.ai/skills/module-update/SKILL.md +9 -3
- package/.ai/skills/perf-audit/SKILL.md +0 -1
- package/.ai/skills/release-eject-pr/SKILL.md +0 -1
- package/.ai/skills/spec-interview/SKILL.md +120 -0
- package/.ai/skills/test-hardening/SKILL.md +1 -0
- package/.ai/skills/ux-design/SKILL.md +34 -3
- package/.ai/skills/variables/SKILL.md +0 -2
- package/.ai/skills/workflow-development/SKILL.md +0 -1
- package/AGENTS.md +4 -0
- package/docs/agent-contract.md +2 -2
- package/docs/design-system.md +185 -31
- package/modules/access/migrations/0001_access_core.down.sql +1 -0
- package/modules/access/migrations/0001_access_core.up.sql +28 -0
- package/modules/access/migrations/README.md +3 -0
- package/modules/access/module.json +33 -0
- package/modules/access/package.json +43 -0
- package/modules/access/spec/module.yaml +225 -0
- package/modules/access/src/acl/permissions.ts +6 -0
- package/modules/access/src/api/endpoints.ts +244 -0
- package/modules/access/src/client/ActivityView.tsrx +245 -0
- package/modules/access/src/client/AttestationsView.tsrx +176 -0
- package/modules/access/src/client/ReviewView.tsrx +586 -0
- package/modules/access/src/client/api.ts +132 -0
- package/modules/access/src/client/contribution.tsrx +41 -0
- package/modules/access/src/client/index.ts +41 -0
- package/modules/access/src/client/navigation.ts +57 -0
- package/modules/access/src/client/presentation.ts +69 -0
- package/modules/access/src/client/state.ts +72 -0
- package/modules/access/src/domain/types.ts +189 -0
- package/modules/access/src/index.ts +38 -0
- package/modules/access/src/platform.ts +60 -0
- package/modules/access/src/server/index.ts +42 -0
- package/modules/access/src/server/runtime.ts +105 -0
- package/modules/access/src/services/access-service.ts +298 -0
- package/modules/access/src/services/audit-window.ts +78 -0
- package/modules/access/src/services/auth-directory.ts +72 -0
- package/modules/access/src/services/changes.ts +91 -0
- package/modules/access/src/services/data-classes.ts +28 -0
- package/modules/access/src/services/database-repository.ts +185 -0
- package/modules/access/src/services/directory.ts +102 -0
- package/modules/access/src/services/index.ts +33 -0
- package/modules/access/src/services/list-exports.ts +150 -0
- package/modules/access/src/services/migration.ts +54 -0
- package/modules/access/src/services/repository.ts +30 -0
- package/modules/access/src/services/review.ts +178 -0
- package/modules/access/translations/en.json +155 -0
- package/modules/access/translations/pl.json +155 -0
- package/modules/agents/migrations/0022_credential_rotation_inventory.down.sql +2 -0
- package/modules/agents/migrations/0022_credential_rotation_inventory.up.sql +7 -0
- package/modules/agents/migrations/0023_agents_retention_indexes.down.sql +2 -0
- package/modules/agents/migrations/0023_agents_retention_indexes.up.sql +9 -0
- package/modules/agents/migrations/0024_agent_meter_refusals.down.sql +3 -0
- package/modules/agents/migrations/0024_agent_meter_refusals.up.sql +22 -0
- package/modules/agents/migrations/0025_agent_list_indexes.down.sql +3 -0
- package/modules/agents/migrations/0025_agent_list_indexes.up.sql +11 -0
- package/modules/agents/module.json +30 -4
- package/modules/agents/package.json +3 -2
- package/modules/agents/spec/module.yaml +63 -5
- package/modules/agents/src/api/endpoints.ts +291 -33
- package/modules/agents/src/cli/commands.json +11 -0
- package/modules/agents/src/cli/index.ts +45 -0
- package/modules/agents/src/client/AgentDashboardWidget.tsrx +19 -11
- package/modules/agents/src/client/AgentDefinitionList.tsrx +53 -10
- package/modules/agents/src/client/AgentPlaygroundView.tsrx +4 -4
- package/modules/agents/src/client/AgentProceduresView.tsrx +2 -2
- package/modules/agents/src/client/AgentRunsView.tsrx +143 -40
- package/modules/agents/src/client/AgentsView.tsrx +109 -33
- package/modules/agents/src/client/api.ts +99 -21
- package/modules/agents/src/client/state.ts +97 -0
- package/modules/agents/src/domain/types.ts +44 -4
- package/modules/agents/src/platform.ts +42 -0
- package/modules/agents/src/server/action-execution.ts +201 -106
- package/modules/agents/src/server/runtime.ts +32 -0
- package/modules/agents/src/services/agent-service.ts +158 -30
- package/modules/agents/src/services/credential-rotation.ts +185 -0
- package/modules/agents/src/services/credential-vault.ts +71 -46
- package/modules/agents/src/services/data-classes.ts +176 -0
- package/modules/agents/src/services/database-repository.ts +393 -101
- package/modules/agents/src/services/metering.ts +111 -0
- package/modules/agents/src/services/migration.ts +109 -0
- package/modules/agents/src/services/module-agent-preflight.ts +17 -9
- package/modules/agents/src/services/notifications.ts +98 -0
- package/modules/agents/src/services/provider-repository.ts +9 -18
- package/modules/agents/src/services/provider-service.ts +1 -9
- package/modules/agents/src/services/reports.ts +107 -0
- package/modules/agents/src/services/repository.ts +86 -6
- package/modules/agents/src/services/usage-service.ts +2 -0
- package/modules/agents/src/services/worker.ts +114 -4
- package/modules/agents/src/settings.ts +14 -3
- package/modules/agents/translations/en.json +14 -4
- package/modules/agents/translations/pl.json +14 -4
- package/modules/approvals/migrations/0001_approvals_core.down.sql +3 -0
- package/modules/approvals/migrations/0001_approvals_core.up.sql +78 -0
- package/modules/approvals/migrations/0002_approvals_expiry_routing_role.down.sql +2 -0
- package/modules/approvals/migrations/0002_approvals_expiry_routing_role.up.sql +19 -0
- package/modules/approvals/migrations/0003_approvals_retention_indexes.down.sql +6 -0
- package/modules/approvals/migrations/0003_approvals_retention_indexes.up.sql +14 -0
- package/modules/approvals/migrations/0004_approvals_inbox_keyset_indexes.down.sql +5 -0
- package/modules/approvals/migrations/0004_approvals_inbox_keyset_indexes.up.sql +12 -0
- package/modules/approvals/migrations/README.md +3 -0
- package/modules/approvals/module.json +34 -0
- package/modules/approvals/package.json +43 -0
- package/modules/approvals/spec/module.yaml +318 -0
- package/modules/approvals/src/acl/permissions.ts +7 -0
- package/modules/approvals/src/api/endpoints.ts +457 -0
- package/modules/approvals/src/client/ApprovalRequestDrawer.tsrx +138 -0
- package/modules/approvals/src/client/ApprovalsView.tsrx +562 -0
- package/modules/approvals/src/client/PendingCountWidget.tsrx +52 -0
- package/modules/approvals/src/client/api.ts +203 -0
- package/modules/approvals/src/client/approvals.css +51 -0
- package/modules/approvals/src/client/contribution.tsrx +44 -0
- package/modules/approvals/src/client/index.ts +26 -0
- package/modules/approvals/src/client/navigation.ts +39 -0
- package/modules/approvals/src/client/pending-count.ts +26 -0
- package/modules/approvals/src/client/presentation.ts +52 -0
- package/modules/approvals/src/client/state.ts +141 -0
- package/modules/approvals/src/domain/capability.ts +95 -0
- package/modules/approvals/src/domain/types.ts +154 -0
- package/modules/approvals/src/index.ts +52 -0
- package/modules/approvals/src/platform.ts +128 -0
- package/modules/approvals/src/server/index.ts +42 -0
- package/modules/approvals/src/server/runtime.ts +181 -0
- package/modules/approvals/src/services/approvals-service.ts +557 -0
- package/modules/approvals/src/services/callbacks.ts +75 -0
- package/modules/approvals/src/services/data-classes.ts +167 -0
- package/modules/approvals/src/services/database-repository.ts +724 -0
- package/modules/approvals/src/services/eligibility.ts +121 -0
- package/modules/approvals/src/services/expiry-runner.ts +81 -0
- package/modules/approvals/src/services/index.ts +31 -0
- package/modules/approvals/src/services/migration.ts +222 -0
- package/modules/approvals/src/services/notifications.ts +95 -0
- package/modules/approvals/src/services/repository.ts +161 -0
- package/modules/approvals/src/services/service-error.ts +70 -0
- package/modules/approvals/src/settings.ts +102 -0
- package/modules/approvals/translations/en.json +104 -0
- package/modules/approvals/translations/pl.json +104 -0
- package/modules/audit/migrations/0001_audit_core.down.sql +8 -0
- package/modules/audit/migrations/0001_audit_core.up.sql +107 -0
- package/modules/audit/migrations/0002_audit_sweep_routing_role.down.sql +2 -0
- package/modules/audit/migrations/0002_audit_sweep_routing_role.up.sql +21 -0
- package/modules/audit/migrations/0003_audit_export_request.down.sql +12 -0
- package/modules/audit/migrations/0003_audit_export_request.up.sql +40 -0
- package/modules/audit/migrations/0004_audit_hold_seal_erasure.down.sql +17 -0
- package/modules/audit/migrations/0004_audit_hold_seal_erasure.up.sql +192 -0
- package/modules/audit/migrations/0005_audit_event_format.down.sql +17 -0
- package/modules/audit/migrations/0005_audit_event_format.up.sql +60 -0
- package/modules/audit/migrations/0006_audit_own_class_walks.down.sql +3 -0
- package/modules/audit/migrations/0006_audit_own_class_walks.up.sql +14 -0
- package/modules/audit/migrations/README.md +3 -0
- package/modules/audit/module.json +32 -0
- package/modules/audit/package.json +49 -0
- package/modules/audit/spec/module.yaml +809 -0
- package/modules/audit/src/acl/permissions.ts +7 -0
- package/modules/audit/src/api/endpoints.ts +315 -0
- package/modules/audit/src/cli/commands.json +95 -0
- package/modules/audit/src/cli/index.ts +658 -0
- package/modules/audit/src/client/DataClassesView.tsrx +420 -0
- package/modules/audit/src/client/ExportsView.tsrx +256 -0
- package/modules/audit/src/client/HoldsView.tsrx +604 -0
- package/modules/audit/src/client/SweepsView.tsrx +251 -0
- package/modules/audit/src/client/api.ts +185 -0
- package/modules/audit/src/client/contribution.tsrx +52 -0
- package/modules/audit/src/client/index.ts +23 -0
- package/modules/audit/src/client/navigation.ts +74 -0
- package/modules/audit/src/client/presentation.ts +105 -0
- package/modules/audit/src/client/state.ts +86 -0
- package/modules/audit/src/domain/data-classes.ts +16 -0
- package/modules/audit/src/domain/types.ts +339 -0
- package/modules/audit/src/index.ts +76 -0
- package/modules/audit/src/platform.ts +44 -0
- package/modules/audit/src/server/index.ts +177 -0
- package/modules/audit/src/server/runtime.ts +303 -0
- package/modules/audit/src/services/anchor-key.ts +143 -0
- package/modules/audit/src/services/anchor-rotation.ts +147 -0
- package/modules/audit/src/services/audit-runners.ts +278 -0
- package/modules/audit/src/services/backup-guard.ts +95 -0
- package/modules/audit/src/services/database-repository.ts +1946 -0
- package/modules/audit/src/services/declared-classes.ts +64 -0
- package/modules/audit/src/services/erasure-port.ts +126 -0
- package/modules/audit/src/services/erasure-service.ts +770 -0
- package/modules/audit/src/services/export-directory.ts +106 -0
- package/modules/audit/src/services/export-service.ts +714 -0
- package/modules/audit/src/services/hold-service.ts +295 -0
- package/modules/audit/src/services/index.ts +17 -0
- package/modules/audit/src/services/migration.ts +658 -0
- package/modules/audit/src/services/own-classes.ts +318 -0
- package/modules/audit/src/services/platform-version.ts +23 -0
- package/modules/audit/src/services/repository.ts +495 -0
- package/modules/audit/src/services/retention-service.ts +191 -0
- package/modules/audit/src/services/seal-service.ts +769 -0
- package/modules/audit/src/services/service-error.ts +61 -0
- package/modules/audit/src/services/subject-keys.ts +90 -0
- package/modules/audit/src/services/sweep-service.ts +298 -0
- package/modules/audit/src/services/zip.ts +217 -0
- package/modules/audit/src/settings.ts +69 -0
- package/modules/audit/translations/en.json +210 -0
- package/modules/audit/translations/pl.json +210 -0
- package/modules/auth/README.md +77 -29
- package/modules/auth/migrations/0016_external_identities.up.sql +16 -0
- package/modules/auth/migrations/0017_mfa_key_id.up.sql +8 -0
- package/modules/auth/migrations/0018_retire_bundled_module_scopes.up.sql +29 -0
- package/modules/auth/migrations/0019_notifications_member_scopes.up.sql +44 -0
- package/modules/auth/migrations/0020_identity_providers.up.sql +61 -0
- package/modules/auth/migrations/0021_membership_status.up.sql +19 -0
- package/modules/auth/migrations/0022_auth_provider_scopes.up.sql +45 -0
- package/modules/auth/migrations/0023_enterprise_module_scopes.down.sql +19 -0
- package/modules/auth/migrations/0023_enterprise_module_scopes.up.sql +71 -0
- package/modules/auth/migrations/0024_approvals_member_scopes.down.sql +22 -0
- package/modules/auth/migrations/0024_approvals_member_scopes.up.sql +48 -0
- package/modules/auth/migrations/0025_audit_holds_owner_scope.down.sql +21 -0
- package/modules/auth/migrations/0025_audit_holds_owner_scope.up.sql +47 -0
- package/modules/auth/migrations/0026_auth_export_keyset_indexes.down.sql +6 -0
- package/modules/auth/migrations/0026_auth_export_keyset_indexes.up.sql +15 -0
- package/modules/auth/migrations/0027_workflow_automation_profile_scopes.down.sql +34 -0
- package/modules/auth/migrations/0027_workflow_automation_profile_scopes.up.sql +72 -0
- package/modules/auth/migrations/0028_auth_member_search_prefix_indexes.down.sql +6 -0
- package/modules/auth/migrations/0028_auth_member_search_prefix_indexes.up.sql +21 -0
- package/modules/auth/migrations/0029_reports_exports_access_scopes.down.sql +22 -0
- package/modules/auth/migrations/0029_reports_exports_access_scopes.up.sql +56 -0
- package/modules/auth/migrations/0030_auth_membership_keyset_index.down.sql +4 -0
- package/modules/auth/migrations/0030_auth_membership_keyset_index.up.sql +10 -0
- package/modules/auth/migrations/0031_membership_scope_backfills_under_rls.down.sql +4 -0
- package/modules/auth/migrations/0031_membership_scope_backfills_under_rls.up.sql +31 -0
- package/modules/auth/migrations/0032_audit_actor_service.down.sql +9 -0
- package/modules/auth/migrations/0032_audit_actor_service.up.sql +10 -0
- package/modules/auth/migrations/0033_auth_account_keyset_indexes.down.sql +5 -0
- package/modules/auth/migrations/0033_auth_account_keyset_indexes.up.sql +23 -0
- package/modules/auth/module.json +3 -3
- package/modules/auth/package.json +3 -2
- package/modules/auth/spec/module.yaml +372 -3
- package/modules/auth/src/acl/scopes.ts +50 -6
- package/modules/auth/src/cli/commands.json +11 -0
- package/modules/auth/src/cli/greenfield.ts +2 -2
- package/modules/auth/src/cli/index.ts +14 -0
- package/modules/auth/src/cli/secrets.ts +114 -0
- package/modules/auth/src/client/AuthenticationCore.tsrx +61 -8
- package/modules/auth/src/client/api.ts +72 -6
- package/modules/auth/src/client/contribution.tsrx +23 -0
- package/modules/auth/src/client/index.ts +6 -0
- package/modules/auth/src/client/providers/IdentityProviderForm.tsrx +191 -0
- package/modules/auth/src/client/providers/IdentityProvidersView.tsrx +358 -0
- package/modules/auth/src/client/providers/api.ts +128 -0
- package/modules/auth/src/client/providers/provider-columns.tsrx +60 -0
- package/modules/auth/src/client/providers/state.ts +35 -0
- package/modules/auth/src/client/security/SecurityView.tsrx +9 -1
- package/modules/auth/src/client/state.ts +15 -1
- package/modules/auth/src/domain/types.ts +55 -0
- package/modules/auth/src/index.ts +11 -1
- package/modules/auth/src/middleware/authentication.ts +4 -0
- package/modules/auth/src/server/endpoints.ts +467 -171
- package/modules/auth/src/server/http.ts +3 -2
- package/modules/auth/src/server/index.ts +22 -1
- package/modules/auth/src/server/membership-endpoints.ts +62 -0
- package/modules/auth/src/server/mfa-enforcement.ts +156 -0
- package/modules/auth/src/server/oidc.ts +389 -0
- package/modules/auth/src/server/provider-endpoints.ts +246 -0
- package/modules/auth/src/server/provider-host.ts +77 -0
- package/modules/auth/src/server/runtime.ts +231 -55
- package/modules/auth/src/services/auth-service-error.ts +7 -2
- package/modules/auth/src/services/auth-service.ts +948 -51
- package/modules/auth/src/services/data-classes.ts +236 -0
- package/modules/auth/src/services/database-repository.ts +853 -71
- package/modules/auth/src/services/identity-provider-service.ts +571 -0
- package/modules/auth/src/services/mail-delivery.ts +16 -16
- package/modules/auth/src/services/mail-message.ts +54 -0
- package/modules/auth/src/services/mail-port.ts +24 -0
- package/modules/auth/src/services/mail-smtp.ts +85 -0
- package/modules/auth/src/services/mfa-rotation.ts +144 -0
- package/modules/auth/src/services/migration.ts +810 -0
- package/modules/auth/src/services/password.ts +14 -0
- package/modules/auth/src/services/provider-secret-rotation.ts +169 -0
- package/modules/auth/src/services/provider-secrets.ts +136 -0
- package/modules/auth/src/services/repository.ts +321 -5
- package/modules/auth/src/services/session-sweep-runner.ts +73 -0
- package/modules/auth/src/services/settings-store.ts +10 -83
- package/modules/auth/src/services/totp.ts +88 -62
- package/modules/auth/src/services/validation.ts +194 -7
- package/modules/auth/src/settings.ts +18 -0
- package/modules/auth/translations/en.json +84 -1
- package/modules/auth/translations/pl.json +84 -1
- package/modules/automations/migrations/0005_secret_rotation_inventory.down.sql +1 -0
- package/modules/automations/migrations/0005_secret_rotation_inventory.up.sql +6 -0
- package/modules/automations/migrations/0006_automations_list_sort_indexes.down.sql +4 -0
- package/modules/automations/migrations/0006_automations_list_sort_indexes.up.sql +11 -0
- package/modules/automations/module.json +24 -6
- package/modules/automations/package.json +5 -2
- package/modules/automations/spec/module.yaml +81 -7
- package/modules/automations/src/api/endpoints.ts +202 -28
- package/modules/automations/src/cli/commands.json +17 -0
- package/modules/automations/src/cli/index.ts +114 -0
- package/modules/automations/src/client/AutomationScheduleForm.tsrx +77 -19
- package/modules/automations/src/client/AutomationSchedulesView.tsrx +144 -40
- package/modules/automations/src/client/AutomationTriggersView.tsrx +131 -32
- package/modules/automations/src/client/api.ts +62 -19
- package/modules/automations/src/client/presentation.ts +20 -2
- package/modules/automations/src/client/state.ts +84 -0
- package/modules/automations/src/domain/cadence.ts +99 -3
- package/modules/automations/src/domain/cron.ts +366 -0
- package/modules/automations/src/domain/time-zone.ts +61 -0
- package/modules/automations/src/platform.ts +38 -4
- package/modules/automations/src/server/index.ts +11 -0
- package/modules/automations/src/server/runtime.ts +46 -22
- package/modules/{automations-workflows-integration/src/server/adapter.ts → automations/src/server/workflow-target.ts} +13 -14
- package/modules/{automations-workflows-integration/src/server/tools.ts → automations/src/server/workflow-tools.ts} +0 -0
- package/modules/automations/src/services/data-classes.ts +62 -0
- package/modules/automations/src/services/database-repository.ts +152 -38
- package/modules/automations/src/services/migration.ts +119 -9
- package/modules/automations/src/services/repository.ts +52 -1
- package/modules/automations/src/services/schedule-runner.ts +84 -0
- package/modules/automations/src/services/schedule-service.ts +152 -26
- package/modules/automations/src/services/secret-rotation.ts +176 -0
- package/modules/automations/src/services/secret-vault.ts +68 -41
- package/modules/automations/src/services/trigger-service.ts +13 -10
- package/modules/automations/translations/en.json +15 -2
- package/modules/automations/translations/pl.json +15 -2
- package/modules/connectors/migrations/0001_connectors_core.down.sql +3 -0
- package/modules/connectors/migrations/0001_connectors_core.up.sql +72 -0
- package/modules/connectors/migrations/0002_connectors_call_keys.down.sql +3 -0
- package/modules/connectors/migrations/0002_connectors_call_keys.up.sql +18 -0
- package/modules/connectors/migrations/README.md +3 -0
- package/modules/connectors/module.json +28 -0
- package/modules/{automations-workflows-integration → connectors}/package.json +27 -26
- package/modules/connectors/spec/module.yaml +447 -0
- package/modules/connectors/src/acl/permissions.ts +6 -0
- package/modules/connectors/src/agent/tools.ts +180 -0
- package/modules/connectors/src/api/endpoints.ts +572 -0
- package/modules/connectors/src/client/ConnectorCallsView.tsrx +358 -0
- package/modules/connectors/src/client/ConnectorForm.tsrx +424 -0
- package/modules/connectors/src/client/ConnectorsView.tsrx +711 -0
- package/modules/connectors/src/client/api.ts +281 -0
- package/modules/connectors/src/client/consent.ts +48 -0
- package/modules/connectors/src/client/contribution.tsrx +37 -0
- package/modules/connectors/src/client/index.ts +22 -0
- package/modules/connectors/src/client/navigation.ts +42 -0
- package/modules/connectors/src/client/presentation.ts +38 -0
- package/modules/connectors/src/client/state.ts +175 -0
- package/modules/connectors/src/domain/calls.ts +70 -0
- package/modules/connectors/src/domain/definitions.ts +190 -0
- package/modules/connectors/src/domain/http-json.ts +68 -0
- package/modules/connectors/src/domain/types.ts +185 -0
- package/modules/connectors/src/index.ts +64 -0
- package/modules/connectors/src/platform.ts +56 -0
- package/modules/connectors/src/server/index.ts +66 -0
- package/modules/connectors/src/server/runtime.ts +163 -0
- package/modules/connectors/src/services/call-service.ts +903 -0
- package/modules/connectors/src/services/connectors-service.ts +653 -0
- package/modules/connectors/src/services/credential-vault.ts +188 -0
- package/modules/connectors/src/services/data-classes.ts +158 -0
- package/modules/connectors/src/services/database-repository.ts +897 -0
- package/modules/connectors/src/services/egress.ts +261 -0
- package/modules/connectors/src/services/index.ts +19 -0
- package/modules/connectors/src/services/migration.ts +166 -0
- package/modules/connectors/src/services/repository.ts +175 -0
- package/modules/connectors/src/services/service-error.ts +46 -0
- package/modules/connectors/src/settings.ts +69 -0
- package/modules/connectors/translations/en.json +191 -0
- package/modules/connectors/translations/pl.json +191 -0
- package/modules/directory/migrations/0001_directory_core.down.sql +5 -0
- package/modules/directory/migrations/0001_directory_core.up.sql +111 -0
- package/modules/directory/migrations/README.md +3 -0
- package/modules/directory/module.json +27 -0
- package/modules/directory/package.json +46 -0
- package/modules/directory/spec/module.yaml +351 -0
- package/modules/directory/src/acl/permissions.ts +7 -0
- package/modules/directory/src/api/endpoints.ts +478 -0
- package/modules/directory/src/api/scim-endpoints.ts +516 -0
- package/modules/directory/src/client/GroupMappingsView.tsrx +430 -0
- package/modules/directory/src/client/ProvisioningLogView.tsrx +248 -0
- package/modules/directory/src/client/ScimTokensView.tsrx +587 -0
- package/modules/directory/src/client/api.ts +222 -0
- package/modules/directory/src/client/contribution.tsrx +46 -0
- package/modules/directory/src/client/index.ts +22 -0
- package/modules/directory/src/client/navigation.ts +57 -0
- package/modules/directory/src/client/presentation.ts +143 -0
- package/modules/directory/src/client/state.ts +173 -0
- package/modules/directory/src/domain/scim.ts +346 -0
- package/modules/directory/src/domain/types.ts +166 -0
- package/modules/directory/src/index.ts +44 -0
- package/modules/directory/src/platform.ts +43 -0
- package/modules/directory/src/server/index.ts +17 -0
- package/modules/directory/src/server/runtime.ts +124 -0
- package/modules/directory/src/services/auth-port.ts +127 -0
- package/modules/directory/src/services/data-classes.ts +41 -0
- package/modules/directory/src/services/database-repository.ts +1067 -0
- package/modules/directory/src/services/directory-service.ts +311 -0
- package/modules/directory/src/services/index.ts +43 -0
- package/modules/directory/src/services/migration.ts +146 -0
- package/modules/directory/src/services/provisioning-service.ts +1420 -0
- package/modules/directory/src/services/rate-limiter.ts +103 -0
- package/modules/directory/src/services/repository.ts +208 -0
- package/modules/directory/src/services/service-error.ts +42 -0
- package/modules/directory/src/services/token-service.ts +215 -0
- package/modules/directory/src/settings.ts +86 -0
- package/modules/directory/translations/en.json +185 -0
- package/modules/directory/translations/pl.json +185 -0
- package/modules/documents/migrations/0001_documents_core.down.sql +1 -0
- package/modules/documents/migrations/0001_documents_core.up.sql +35 -0
- package/modules/documents/migrations/0002_documents_files_page.down.sql +1 -0
- package/modules/documents/migrations/0002_documents_files_page.up.sql +6 -0
- package/modules/documents/migrations/README.md +3 -0
- package/modules/documents/module.json +28 -0
- package/modules/documents/package.json +49 -0
- package/modules/documents/spec/module.yaml +247 -0
- package/modules/documents/src/acl/permissions.ts +6 -0
- package/modules/documents/src/api/endpoints.ts +401 -0
- package/modules/documents/src/client/DocumentUploader.tsrx +148 -0
- package/modules/documents/src/client/DocumentsView.tsrx +540 -0
- package/modules/documents/src/client/api.ts +209 -0
- package/modules/documents/src/client/contribution.tsrx +29 -0
- package/modules/documents/src/client/download.ts +70 -0
- package/modules/documents/src/client/index.ts +22 -0
- package/modules/documents/src/client/navigation.ts +25 -0
- package/modules/documents/src/client/presentation.ts +110 -0
- package/modules/documents/src/client/state.ts +117 -0
- package/modules/documents/src/domain/attachments.ts +84 -0
- package/modules/documents/src/domain/types.ts +80 -0
- package/modules/documents/src/index.ts +46 -0
- package/modules/documents/src/platform.ts +61 -0
- package/modules/documents/src/server/index.ts +30 -0
- package/modules/documents/src/server/runtime.ts +107 -0
- package/modules/documents/src/services/attachments.ts +39 -0
- package/modules/documents/src/services/data-classes.ts +25 -0
- package/modules/documents/src/services/database-repository.ts +259 -0
- package/modules/documents/src/services/documents-service.ts +586 -0
- package/modules/documents/src/services/index.ts +18 -0
- package/modules/documents/src/services/migration.ts +82 -0
- package/modules/documents/src/services/repository.ts +48 -0
- package/modules/documents/src/settings.ts +107 -0
- package/modules/documents/translations/en.json +111 -0
- package/modules/documents/translations/pl.json +111 -0
- package/modules/exports/migrations/0001_exports_core.down.sql +2 -0
- package/modules/exports/migrations/0001_exports_core.up.sql +28 -0
- package/modules/exports/migrations/0002_exports_job_routing_role.down.sql +4 -0
- package/modules/exports/migrations/0002_exports_job_routing_role.up.sql +21 -0
- package/modules/exports/migrations/README.md +3 -0
- package/modules/exports/module.json +28 -0
- package/modules/exports/package.json +44 -0
- package/modules/exports/spec/module.yaml +229 -0
- package/modules/exports/src/acl/permissions.ts +6 -0
- package/modules/exports/src/api/endpoints.ts +211 -0
- package/modules/exports/src/client/ExportsView.tsrx +327 -0
- package/modules/exports/src/client/api.ts +133 -0
- package/modules/exports/src/client/contribution.tsrx +31 -0
- package/modules/exports/src/client/index.ts +20 -0
- package/modules/exports/src/client/navigation.ts +25 -0
- package/modules/exports/src/client/presentation.ts +53 -0
- package/modules/exports/src/client/state.ts +56 -0
- package/modules/exports/src/domain/lists.ts +29 -0
- package/modules/exports/src/domain/types.ts +120 -0
- package/modules/exports/src/index.ts +41 -0
- package/modules/exports/src/platform.ts +80 -0
- package/modules/exports/src/server/index.ts +51 -0
- package/modules/exports/src/server/runtime.ts +160 -0
- package/modules/exports/src/services/data-classes.ts +56 -0
- package/modules/exports/src/services/database-repository.ts +405 -0
- package/modules/exports/src/services/export-runner.ts +123 -0
- package/modules/exports/src/services/export-service.ts +356 -0
- package/modules/exports/src/services/index.ts +6 -0
- package/modules/exports/src/services/list-registry.ts +105 -0
- package/modules/exports/src/services/migration.ts +89 -0
- package/modules/exports/src/services/repository.ts +97 -0
- package/modules/exports/src/settings.ts +70 -0
- package/modules/exports/translations/en.json +69 -0
- package/modules/exports/translations/pl.json +69 -0
- package/modules/import/migrations/0001_import_core.down.sql +6 -0
- package/modules/import/migrations/0001_import_core.up.sql +61 -0
- package/modules/import/migrations/0002_import_job_routing_role.down.sql +4 -0
- package/modules/import/migrations/0002_import_job_routing_role.up.sql +20 -0
- package/modules/import/migrations/0003_import_jobs_export_index.down.sql +1 -0
- package/modules/import/migrations/0003_import_jobs_export_index.up.sql +7 -0
- package/modules/import/migrations/0004_import_jobs_traceparent.down.sql +1 -0
- package/modules/import/migrations/0004_import_jobs_traceparent.up.sql +7 -0
- package/modules/import/migrations/README.md +3 -0
- package/modules/import/module.json +37 -0
- package/modules/import/package.json +50 -0
- package/modules/import/spec/module.yaml +335 -0
- package/modules/import/src/acl/permissions.ts +6 -0
- package/modules/import/src/api/endpoints.ts +400 -0
- package/modules/import/src/client/ImportJobDrawer.tsrx +229 -0
- package/modules/import/src/client/ImportsView.tsrx +455 -0
- package/modules/import/src/client/NewImportForm.tsrx +274 -0
- package/modules/import/src/client/api.ts +243 -0
- package/modules/import/src/client/contribution.tsrx +29 -0
- package/modules/import/src/client/index.ts +23 -0
- package/modules/import/src/client/navigation.ts +25 -0
- package/modules/import/src/client/presentation.ts +59 -0
- package/modules/import/src/client/state.ts +43 -0
- package/modules/import/src/domain/csv.ts +258 -0
- package/modules/import/src/domain/ports.ts +157 -0
- package/modules/import/src/domain/types.ts +179 -0
- package/modules/import/src/index.ts +58 -0
- package/modules/import/src/platform.ts +60 -0
- package/modules/import/src/server/index.ts +49 -0
- package/modules/import/src/server/runtime.ts +158 -0
- package/modules/import/src/services/csv-source.ts +121 -0
- package/modules/import/src/services/data-classes.ts +63 -0
- package/modules/import/src/services/database-repository.ts +780 -0
- package/modules/import/src/services/import-runner.ts +127 -0
- package/modules/import/src/services/import-service.ts +872 -0
- package/modules/import/src/services/index.ts +6 -0
- package/modules/import/src/services/migration.ts +156 -0
- package/modules/import/src/services/port-registry.ts +158 -0
- package/modules/import/src/services/repository.ts +147 -0
- package/modules/import/src/settings.ts +70 -0
- package/modules/import/translations/en.json +175 -0
- package/modules/import/translations/pl.json +175 -0
- package/modules/metering/migrations/0001_metering_core.down.sql +6 -0
- package/modules/metering/migrations/0001_metering_core.up.sql +119 -0
- package/modules/metering/migrations/0002_metering_bucket_export.down.sql +3 -0
- package/modules/metering/migrations/0002_metering_bucket_export.up.sql +5 -0
- package/modules/metering/migrations/README.md +3 -0
- package/modules/metering/module.json +46 -0
- package/modules/metering/package.json +50 -0
- package/modules/metering/spec/module.yaml +269 -0
- package/modules/metering/src/acl/permissions.ts +5 -0
- package/modules/metering/src/api/endpoints.ts +104 -0
- package/modules/metering/src/cli/commands.json +28 -0
- package/modules/metering/src/cli/index.ts +246 -0
- package/modules/metering/src/client/LimitsView.tsrx +170 -0
- package/modules/metering/src/client/UsageSummaryWidget.tsrx +63 -0
- package/modules/metering/src/client/UsageView.tsrx +205 -0
- package/modules/metering/src/client/api.ts +91 -0
- package/modules/metering/src/client/contribution.tsrx +42 -0
- package/modules/metering/src/client/index.ts +26 -0
- package/modules/metering/src/client/navigation.ts +54 -0
- package/modules/metering/src/client/presentation.ts +63 -0
- package/modules/metering/src/client/state.ts +31 -0
- package/modules/metering/src/domain/meters.ts +100 -0
- package/modules/metering/src/domain/types.ts +71 -0
- package/modules/metering/src/index.ts +51 -0
- package/modules/metering/src/platform.ts +84 -0
- package/modules/metering/src/server/index.ts +40 -0
- package/modules/metering/src/server/runtime.ts +165 -0
- package/modules/metering/src/services/data-classes.ts +34 -0
- package/modules/metering/src/services/database-repository.ts +574 -0
- package/modules/metering/src/services/index.ts +9 -0
- package/modules/metering/src/services/meter-registry.ts +145 -0
- package/modules/metering/src/services/metering-service.ts +441 -0
- package/modules/metering/src/services/migration.ts +183 -0
- package/modules/metering/src/services/notifications.ts +75 -0
- package/modules/metering/src/services/reports.ts +105 -0
- package/modules/metering/src/services/repository.ts +132 -0
- package/modules/metering/src/services/service-error.ts +46 -0
- package/modules/metering/src/settings.ts +47 -0
- package/modules/metering/translations/en.json +68 -0
- package/modules/metering/translations/pl.json +68 -0
- package/modules/notifications/migrations/0001_notifications_core.down.sql +1 -0
- package/modules/notifications/migrations/0001_notifications_core.up.sql +26 -0
- package/modules/notifications/migrations/0002_notifications_preferences.down.sql +1 -0
- package/modules/notifications/migrations/0002_notifications_preferences.up.sql +17 -0
- package/modules/notifications/migrations/0003_notifications_webhook_subscriptions.down.sql +1 -0
- package/modules/notifications/migrations/0003_notifications_webhook_subscriptions.up.sql +30 -0
- package/modules/notifications/migrations/0004_notifications_deliveries.down.sql +1 -0
- package/modules/notifications/migrations/0004_notifications_deliveries.up.sql +35 -0
- package/modules/notifications/migrations/0005_notifications_delivery_routing_role.down.sql +2 -0
- package/modules/notifications/migrations/0005_notifications_delivery_routing_role.up.sql +17 -0
- package/modules/notifications/migrations/0006_notifications_delivery_title.down.sql +1 -0
- package/modules/notifications/migrations/0006_notifications_delivery_title.up.sql +11 -0
- package/modules/notifications/migrations/0007_notifications_secret_rotation_inventory.down.sql +2 -0
- package/modules/notifications/migrations/0007_notifications_secret_rotation_inventory.up.sql +19 -0
- package/modules/notifications/migrations/0008_notifications_delivery_claim.down.sql +8 -0
- package/modules/notifications/migrations/0008_notifications_delivery_claim.up.sql +19 -0
- package/modules/notifications/migrations/0009_notifications_kind_approvals.down.sql +16 -0
- package/modules/notifications/migrations/0009_notifications_kind_approvals.up.sql +18 -0
- package/modules/notifications/migrations/0010_notifications_kind_meter_threshold.down.sql +16 -0
- package/modules/notifications/migrations/0010_notifications_kind_meter_threshold.up.sql +18 -0
- package/modules/notifications/migrations/0011_notifications_retention_keyset.down.sql +5 -0
- package/modules/notifications/migrations/0011_notifications_retention_keyset.up.sql +15 -0
- package/modules/notifications/migrations/0012_notifications_email_channel.down.sql +12 -0
- package/modules/notifications/migrations/0012_notifications_email_channel.up.sql +38 -0
- package/modules/notifications/migrations/0013_notifications_list_pages.down.sql +5 -0
- package/modules/notifications/migrations/0013_notifications_list_pages.up.sql +13 -0
- package/modules/notifications/migrations/README.md +3 -0
- package/modules/notifications/module.json +32 -0
- package/modules/notifications/package.json +49 -0
- package/modules/notifications/spec/module.yaml +718 -0
- package/modules/notifications/src/acl/permissions.ts +11 -0
- package/modules/notifications/src/api/endpoints.ts +814 -0
- package/modules/notifications/src/cli/commands.json +17 -0
- package/modules/notifications/src/cli/index.ts +126 -0
- package/modules/notifications/src/client/DeliveriesView.tsrx +483 -0
- package/modules/notifications/src/client/FactList.tsrx +24 -0
- package/modules/notifications/src/client/NotificationPreferencesView.tsrx +240 -0
- package/modules/notifications/src/client/NotificationsInboxView.tsrx +592 -0
- package/modules/notifications/src/client/UnreadCountWidget.tsrx +62 -0
- package/modules/notifications/src/client/WebhookForm.tsrx +297 -0
- package/modules/notifications/src/client/WebhooksView.tsrx +637 -0
- package/modules/notifications/src/client/api.ts +382 -0
- package/modules/notifications/src/client/contribution.tsrx +83 -0
- package/modules/notifications/src/client/inbox.ts +41 -0
- package/modules/notifications/src/client/index.ts +29 -0
- package/modules/notifications/src/client/navigation.ts +92 -0
- package/modules/notifications/src/client/notifications.css +70 -0
- package/modules/notifications/src/client/presentation.ts +81 -0
- package/modules/notifications/src/client/state.ts +246 -0
- package/modules/notifications/src/client/unread-count.ts +26 -0
- package/modules/notifications/src/domain/locale.ts +47 -0
- package/modules/notifications/src/domain/publish.ts +46 -0
- package/modules/notifications/src/domain/types.ts +186 -0
- package/modules/notifications/src/index.ts +62 -0
- package/modules/notifications/src/platform.ts +85 -0
- package/modules/notifications/src/server/index.ts +82 -0
- package/modules/notifications/src/server/runtime.ts +251 -0
- package/modules/notifications/src/services/data-classes.ts +139 -0
- package/modules/notifications/src/services/database-repository.ts +1334 -0
- package/modules/notifications/src/services/delivery-payload.ts +93 -0
- package/modules/notifications/src/services/delivery-runner.ts +170 -0
- package/modules/notifications/src/services/delivery-service.ts +811 -0
- package/modules/notifications/src/services/egress.ts +239 -0
- package/modules/notifications/src/services/email-channel.ts +93 -0
- package/modules/notifications/src/services/index.ts +23 -0
- package/modules/notifications/src/services/migration.ts +572 -0
- package/modules/notifications/src/services/notifications-service.ts +297 -0
- package/modules/notifications/src/services/paging.ts +60 -0
- package/modules/notifications/src/services/publish-service.ts +133 -0
- package/modules/notifications/src/services/repository.ts +342 -0
- package/modules/notifications/src/services/secret-rotation.ts +177 -0
- package/modules/notifications/src/services/secret-vault.ts +168 -0
- package/modules/notifications/src/services/service-error.ts +67 -0
- package/modules/notifications/src/services/signature.ts +81 -0
- package/modules/notifications/src/services/webhook-service.ts +307 -0
- package/modules/notifications/src/settings.ts +130 -0
- package/modules/notifications/translations/en.json +255 -0
- package/modules/notifications/translations/pl.json +255 -0
- package/modules/profile/module.json +3 -3
- package/modules/profile/package.json +2 -2
- package/modules/profile/spec/module.yaml +3 -3
- package/modules/profile/src/services/database-repository.ts +3 -13
- package/modules/reports/module.json +28 -0
- package/modules/reports/package.json +42 -0
- package/modules/reports/spec/module.yaml +231 -0
- package/modules/reports/src/acl/permissions.ts +5 -0
- package/modules/reports/src/api/endpoints.ts +72 -0
- package/modules/reports/src/client/ReportsSummaryWidget.tsrx +52 -0
- package/modules/reports/src/client/ReportsView.tsrx +246 -0
- package/modules/reports/src/client/api.ts +65 -0
- package/modules/reports/src/client/contribution.tsrx +36 -0
- package/modules/reports/src/client/index.ts +18 -0
- package/modules/reports/src/client/navigation.ts +39 -0
- package/modules/reports/src/client/presentation.ts +123 -0
- package/modules/reports/src/client/state.ts +28 -0
- package/modules/reports/src/domain/providers.ts +115 -0
- package/modules/reports/src/domain/types.ts +44 -0
- package/modules/reports/src/index.ts +47 -0
- package/modules/reports/src/platform.ts +37 -0
- package/modules/reports/src/server/index.ts +21 -0
- package/modules/reports/src/server/runtime.ts +40 -0
- package/modules/reports/src/services/index.ts +17 -0
- package/modules/reports/src/services/provider-registry.ts +144 -0
- package/modules/reports/src/services/range.ts +65 -0
- package/modules/reports/src/services/reports-service.ts +316 -0
- package/modules/reports/src/services/service-error.ts +26 -0
- package/modules/reports/src/settings.ts +49 -0
- package/modules/reports/translations/en.json +35 -0
- package/modules/reports/translations/pl.json +35 -0
- package/modules/sandbox/module.json +4 -4
- package/modules/sandbox/package.json +2 -2
- package/modules/sandbox/spec/module.yaml +3 -3
- package/modules/sandbox/src/services/database-repository.ts +14 -23
- package/modules/sandbox/src/services/directory.ts +16 -0
- package/modules/sandbox/src/services/sandbox-service.ts +13 -11
- package/modules/search/migrations/0001_search_core.down.sql +1 -0
- package/modules/search/migrations/0001_search_core.up.sql +22 -0
- package/modules/search/migrations/0002_search_recent_export.down.sql +3 -0
- package/modules/search/migrations/0002_search_recent_export.up.sql +5 -0
- package/modules/search/migrations/README.md +3 -0
- package/modules/search/module.json +28 -0
- package/modules/search/package.json +43 -0
- package/modules/search/spec/module.yaml +177 -0
- package/modules/search/src/acl/permissions.ts +5 -0
- package/modules/search/src/api/endpoints.ts +221 -0
- package/modules/search/src/client/SearchView.tsrx +346 -0
- package/modules/search/src/client/api.ts +157 -0
- package/modules/search/src/client/contribution.tsrx +31 -0
- package/modules/search/src/client/index.ts +17 -0
- package/modules/search/src/client/navigation.ts +97 -0
- package/modules/search/src/client/search.css +56 -0
- package/modules/search/src/client/state.ts +113 -0
- package/modules/search/src/domain/data-classes.ts +73 -0
- package/modules/search/src/domain/providers.ts +88 -0
- package/modules/search/src/domain/types.ts +56 -0
- package/modules/search/src/index.ts +46 -0
- package/modules/search/src/platform.ts +42 -0
- package/modules/search/src/server/index.ts +25 -0
- package/modules/search/src/server/runtime.ts +123 -0
- package/modules/search/src/services/database-repository.ts +163 -0
- package/modules/search/src/services/index.ts +21 -0
- package/modules/search/src/services/migration.ts +65 -0
- package/modules/search/src/services/provider-registry.ts +137 -0
- package/modules/search/src/services/repository.ts +43 -0
- package/modules/search/src/services/search-service.ts +442 -0
- package/modules/search/src/services/service-error.ts +35 -0
- package/modules/search/src/settings.ts +68 -0
- package/modules/search/translations/en.json +45 -0
- package/modules/search/translations/pl.json +45 -0
- package/modules/system/module.json +2 -2
- package/modules/system/package.json +2 -2
- package/modules/system/spec/module.yaml +30 -3
- package/modules/system/src/client/FlagsPanel.tsrx +127 -0
- package/modules/system/src/client/ModuleSettingRow.tsrx +17 -7
- package/modules/system/src/client/ModuleSettingsSection.tsrx +10 -71
- package/modules/system/src/client/ModulesView.tsrx +91 -65
- package/modules/system/src/client/flags.ts +35 -0
- package/modules/system/src/client/index.ts +8 -0
- package/modules/system/src/client/navigation.ts +8 -0
- package/modules/system/src/client/settings-state.ts +159 -0
- package/modules/system/src/client/state.ts +2 -0
- package/modules/system/src/domain/time-zone.ts +105 -0
- package/modules/system/src/index.ts +12 -0
- package/modules/system/src/platform.ts +5 -1
- package/modules/system/src/server/endpoints.ts +72 -21
- package/modules/system/src/settings.ts +28 -0
- package/modules/system/translations/en.json +17 -0
- package/modules/system/translations/pl.json +17 -0
- package/modules/users/module.json +30 -4
- package/modules/users/package.json +5 -2
- package/modules/users/spec/module.yaml +290 -7
- package/modules/users/src/api/endpoints.ts +228 -15
- package/modules/users/src/client/InviteMemberForm.tsrx +2 -2
- package/modules/users/src/client/MemberDrawer.tsrx +142 -26
- package/modules/users/src/client/UserAccountForm.tsrx +2 -2
- package/modules/users/src/client/UsersView.tsrx +432 -71
- package/modules/users/src/client/api.ts +106 -12
- package/modules/users/src/client/contribution.tsrx +5 -0
- package/modules/users/src/client/member-columns.tsrx +22 -9
- package/modules/users/src/client/state.ts +172 -7
- package/modules/users/src/domain/lists.ts +9 -0
- package/modules/users/src/index.ts +11 -0
- package/modules/users/src/platform.ts +50 -1
- package/modules/users/src/services/member-export.ts +51 -0
- package/modules/users/src/services/member-import.ts +249 -0
- package/modules/users/src/services/member-search.ts +145 -0
- package/modules/users/src/services/users-service.ts +117 -4
- package/modules/users/translations/en.json +57 -8
- package/modules/users/translations/pl.json +57 -8
- package/modules/workflows/migrations/0004_payload_rotation_inventory.up.sql +17 -0
- package/modules/workflows/migrations/0005_workflows_human_approval.up.sql +28 -0
- package/modules/workflows/migrations/0006_workflows_retention_indexes.up.sql +11 -0
- package/modules/workflows/migrations/0007_workflows_erasure_subject_indexes.up.sql +17 -0
- package/modules/workflows/migrations/0008_workflows_subject_account.up.sql +24 -0
- package/modules/workflows/migrations/0009_workflows_definition_list_indexes.up.sql +9 -0
- package/modules/workflows/module.json +34 -6
- package/modules/workflows/package.json +3 -2
- package/modules/workflows/spec/module.yaml +26 -9
- package/modules/workflows/src/api/endpoints.ts +131 -25
- package/modules/workflows/src/cli/commands.json +17 -0
- package/modules/workflows/src/cli/index.ts +114 -0
- package/modules/workflows/src/client/WorkflowExecutionHistory.tsrx +36 -27
- package/modules/workflows/src/client/WorkflowInspector.tsrx +116 -0
- package/modules/workflows/src/client/WorkflowNodePalette.tsrx +1 -0
- package/modules/workflows/src/client/WorkflowsView.tsrx +236 -99
- package/modules/workflows/src/client/api.ts +54 -34
- package/modules/workflows/src/client/canvas-model.ts +12 -0
- package/modules/workflows/src/client/state.ts +95 -0
- package/modules/workflows/src/domain/events.ts +25 -11
- package/modules/workflows/src/domain/graph.ts +135 -1
- package/modules/workflows/src/domain/types.ts +91 -4
- package/modules/workflows/src/platform.ts +12 -0
- package/modules/workflows/src/server/runtime.ts +78 -5
- package/modules/workflows/src/services/approvals.ts +62 -0
- package/modules/workflows/src/services/cursors.ts +37 -0
- package/modules/workflows/src/services/data-classes.ts +232 -0
- package/modules/workflows/src/services/database-repository.ts +660 -171
- package/modules/workflows/src/services/migration.ts +240 -0
- package/modules/workflows/src/services/notifications.ts +98 -0
- package/modules/workflows/src/services/payload-codec.ts +51 -28
- package/modules/workflows/src/services/payload-rotation.ts +171 -0
- package/modules/workflows/src/services/repository.ts +123 -8
- package/modules/workflows/src/services/simulation.ts +7 -0
- package/modules/workflows/src/services/worker.ts +446 -25
- package/modules/workflows/src/services/workflows-service.ts +264 -103
- package/modules/workflows/translations/en.json +12 -4
- package/modules/workflows/translations/pl.json +12 -4
- package/modules.json +48 -4
- package/package.json +66 -7
- package/packages/client/package.json +2 -1
- package/packages/client/src/ApplicationShell.tsrx +43 -0
- package/packages/client/src/contributions.ts +55 -0
- package/packages/client/src/i18n/locales/en.json +5 -0
- package/packages/client/src/i18n/locales/pl.json +5 -0
- package/packages/client/src/index.ts +13 -1
- package/packages/client/src/routing.ts +22 -0
- package/packages/client/src/shell/CommandPalette.tsrx +223 -11
- package/packages/client/src/shell/command-search.ts +126 -0
- package/packages/client/src/shell/command.ts +30 -0
- package/packages/client/src/shell/navigation.ts +12 -0
- package/packages/client/src/shell/palette-keys.ts +27 -0
- package/packages/client/src/shell/shell.css +7 -0
- package/packages/contracts/schemas/module-spec.schema.json +287 -1
- package/packages/contracts/schemas/module.schema.json +25 -0
- package/packages/contracts/src/index.ts +144 -1
- package/packages/database/src/backup.ts +179 -0
- package/packages/database/src/decoders.ts +25 -0
- package/packages/database/src/index.ts +17 -0
- package/packages/database/src/record-history.ts +5 -14
- package/packages/dev-console/package.json +2 -1
- package/packages/dev-console/src/brand.d.mts +8 -0
- package/packages/dev-console/src/brand.mjs +33 -0
- package/packages/dev-console/src/index.mjs +2 -1
- package/packages/harness/src/index.ts +2 -0
- package/packages/harness/src/runtime.ts +218 -1
- package/packages/harness/src/tool-adapters.ts +19 -1
- package/packages/kernel/src/acl.ts +179 -0
- package/packages/kernel/src/capability-registry.ts +69 -2
- package/packages/kernel/src/data-class-registry.ts +354 -0
- package/packages/kernel/src/index.ts +65 -4
- package/packages/kernel/src/keyring.ts +208 -0
- package/packages/kernel/src/module-compatibility.ts +35 -4
- package/packages/kernel/src/module-registry.ts +49 -2
- package/packages/kernel/src/module-settings.ts +189 -27
- package/packages/server/package.json +2 -1
- package/packages/server/src/composition.ts +38 -0
- package/packages/server/src/endpoint.ts +104 -47
- package/packages/server/src/export/csv.ts +34 -0
- package/packages/server/src/export/definition.ts +346 -0
- package/packages/server/src/export/index.ts +61 -0
- package/packages/server/src/export/run.ts +116 -0
- package/packages/server/src/index.ts +155 -0
- package/packages/server/src/jobs/index.ts +93 -0
- package/packages/server/src/jobs/runner.ts +486 -0
- package/packages/server/src/log.ts +291 -0
- package/packages/server/src/mail/config.ts +184 -0
- package/packages/server/src/mail/contracts.ts +251 -0
- package/packages/server/src/mail/index.ts +31 -0
- package/packages/server/src/mail/port.ts +101 -0
- package/packages/server/src/mail/smtp.ts +191 -0
- package/packages/server/src/mail/template.ts +105 -0
- package/packages/server/src/metrics.ts +447 -0
- package/packages/server/src/pagination.ts +246 -0
- package/packages/server/src/trace/context.ts +103 -0
- package/packages/server/src/trace/egress.ts +66 -0
- package/packages/server/src/trace/error-sink.ts +296 -0
- package/packages/server/src/trace/exporter.ts +295 -0
- package/packages/server/src/trace/index.ts +60 -0
- package/packages/server/src/trace/job-sink.ts +172 -0
- package/packages/server/src/trace/tracer.ts +338 -0
- package/packages/server/src/web.ts +5 -1
- package/packages/storage/package.json +40 -0
- package/packages/storage/src/config.ts +189 -0
- package/packages/storage/src/content-type.ts +124 -0
- package/packages/storage/src/contracts.ts +112 -0
- package/packages/storage/src/envelope.ts +189 -0
- package/packages/storage/src/index.ts +43 -0
- package/packages/storage/src/local.ts +75 -0
- package/packages/storage/src/port.ts +251 -0
- package/packages/storage/src/read-token.ts +130 -0
- package/packages/storage/src/s3.ts +144 -0
- package/packages/storage/src/scanner.ts +22 -0
- package/packages/storage/src/sigv4.ts +104 -0
- package/packages/storage/src/store.ts +13 -0
- package/packages/ui/package.json +1 -0
- package/packages/ui/src/components/Button.tsrx +3 -0
- package/packages/ui/src/components/ConfirmDialog.tsrx +13 -2
- package/packages/ui/src/components/DateField.tsrx +92 -0
- package/packages/ui/src/components/DatePicker.tsrx +525 -0
- package/packages/ui/src/components/DateRangeField.tsrx +93 -0
- package/packages/ui/src/components/Drawer.tsrx +10 -1
- package/packages/ui/src/components/FileUpload.tsrx +158 -0
- package/packages/ui/src/components/Pagination.tsrx +130 -0
- package/packages/ui/src/components/Select.tsrx +78 -0
- package/packages/ui/src/components/Table.tsrx +498 -81
- package/packages/ui/src/components/Tabs.tsrx +53 -0
- package/packages/ui/src/components/ToastHost.tsrx +48 -0
- package/packages/ui/src/components/calendar.ts +243 -0
- package/packages/ui/src/components/date-field.ts +62 -0
- package/packages/ui/src/components/file-upload.ts +49 -0
- package/packages/ui/src/components/focus-trap.ts +62 -0
- package/packages/ui/src/components/pagination.ts +68 -0
- package/packages/ui/src/components/table-sorting.ts +49 -0
- package/packages/ui/src/components/tabs.ts +61 -0
- package/packages/ui/src/components/toast-store.ts +116 -0
- package/packages/ui/src/icons/Icon.tsrx +5 -0
- package/packages/ui/src/index.ts +45 -0
- package/packages/ui/src/styles/components.css +598 -0
- package/modules/automations-workflows-integration/module.json +0 -27
- package/modules/automations-workflows-integration/spec/module.yaml +0 -93
- package/modules/automations-workflows-integration/src/index.ts +0 -14
- package/modules/automations-workflows-integration/src/platform.ts +0 -24
- package/modules/automations-workflows-integration/src/server/index.ts +0 -11
- package/modules/automations-workflows-integration/translations/en.json +0 -21
- package/modules/automations-workflows-integration/translations/pl.json +0 -21
- 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
|
+
];
|