@flowdular/sdk 0.2.4 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +130 -3
- 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/cli-extension/SKILL.md +1 -1
- package/.ai/skills/deploy-operate/SKILL.md +119 -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 +2 -1
- 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/0005_approvals_grant_audit.down.sql +4 -0
- package/modules/approvals/migrations/0005_approvals_grant_audit.up.sql +20 -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 +327 -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 +107 -0
- package/modules/approvals/src/domain/grant.ts +69 -0
- package/modules/approvals/src/domain/types.ts +168 -0
- package/modules/approvals/src/index.ts +61 -0
- package/modules/approvals/src/platform.ts +136 -0
- package/modules/approvals/src/server/index.ts +42 -0
- package/modules/approvals/src/server/runtime.ts +185 -0
- package/modules/approvals/src/services/approvals-service.ts +637 -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 +783 -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 +256 -0
- package/modules/approvals/src/services/notifications.ts +95 -0
- package/modules/approvals/src/services/repository.ts +169 -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 +2 -1
- 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 +4 -1
- 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/0003_connectors_rotation_inventory.down.sql +2 -0
- package/modules/connectors/migrations/0003_connectors_rotation_inventory.up.sql +19 -0
- package/modules/connectors/migrations/README.md +3 -0
- package/modules/connectors/module.json +32 -0
- package/modules/{automations-workflows-integration → connectors}/package.json +28 -26
- package/modules/connectors/spec/module.yaml +448 -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/cli/commands.json +17 -0
- package/modules/connectors/src/cli/index.ts +126 -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-rotation.ts +221 -0
- package/modules/connectors/src/services/credential-vault.ts +194 -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 +202 -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/0003_documents_rotation_inventory.down.sql +2 -0
- package/modules/documents/migrations/0003_documents_rotation_inventory.up.sql +18 -0
- package/modules/documents/migrations/README.md +3 -0
- package/modules/documents/module.json +32 -0
- package/modules/documents/package.json +50 -0
- package/modules/documents/spec/module.yaml +248 -0
- package/modules/documents/src/acl/permissions.ts +6 -0
- package/modules/documents/src/api/endpoints.ts +401 -0
- package/modules/documents/src/cli/commands.json +17 -0
- package/modules/documents/src/cli/index.ts +145 -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 +270 -0
- package/modules/documents/src/services/documents-service.ts +590 -0
- package/modules/documents/src/services/index.ts +18 -0
- package/modules/documents/src/services/migration.ts +117 -0
- package/modules/documents/src/services/repository.ts +58 -0
- package/modules/documents/src/services/storage-rotation.ts +157 -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/0003_exports_rotation_inventory.down.sql +1 -0
- package/modules/exports/migrations/0003_exports_rotation_inventory.up.sql +9 -0
- package/modules/exports/migrations/README.md +3 -0
- package/modules/exports/module.json +32 -0
- package/modules/exports/package.json +45 -0
- package/modules/exports/spec/module.yaml +230 -0
- package/modules/exports/src/acl/permissions.ts +6 -0
- package/modules/exports/src/api/endpoints.ts +211 -0
- package/modules/exports/src/cli/commands.json +17 -0
- package/modules/exports/src/cli/index.ts +145 -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 +50 -0
- package/modules/exports/src/server/runtime.ts +160 -0
- package/modules/exports/src/services/data-classes.ts +59 -0
- package/modules/exports/src/services/database-repository.ts +403 -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 +116 -0
- package/modules/exports/src/services/repository.ts +96 -0
- package/modules/exports/src/services/storage-rotation.ts +138 -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 +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +4 -1
- 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 +2 -1
- 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 +64 -6
- package/packages/client/package.json +1 -0
- 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 +180 -0
- package/packages/database/src/decoders.ts +25 -0
- package/packages/database/src/index.ts +17 -0
- package/packages/database/src/migrations.ts +7 -0
- package/packages/database/src/record-history.ts +5 -14
- package/packages/harness/src/index.ts +2 -0
- package/packages/harness/src/runtime.ts +378 -2
- package/packages/harness/src/tool-adapters.ts +20 -9
- package/packages/kernel/src/acl.ts +179 -0
- package/packages/kernel/src/approval-grant.ts +310 -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 +85 -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 +238 -0
- package/packages/storage/src/index.ts +49 -0
- package/packages/storage/src/local.ts +75 -0
- package/packages/storage/src/port.ts +262 -0
- package/packages/storage/src/read-token.ts +130 -0
- package/packages/storage/src/reseal.ts +128 -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,572 @@
|
|
|
1
|
+
import type { DatabaseMigration } from '@flowdular/sdk/database';
|
|
2
|
+
import {
|
|
3
|
+
migrationObjectState,
|
|
4
|
+
postgresTenantTableState,
|
|
5
|
+
} from '@flowdular/sdk/database';
|
|
6
|
+
|
|
7
|
+
/* Mirrors migrations/0001_notifications_core.up.sql byte for byte. */
|
|
8
|
+
export const NOTIFICATIONS_MIGRATION_001 = `CREATE TABLE IF NOT EXISTS notifications_inbox (
|
|
9
|
+
id TEXT PRIMARY KEY,
|
|
10
|
+
tenant_id TEXT NOT NULL,
|
|
11
|
+
recipient_account_id TEXT NOT NULL,
|
|
12
|
+
kind TEXT NOT NULL CHECK (kind IN ('agent-run-completed', 'agent-run-failed', 'workflow-run-completed', 'workflow-run-failed', 'webhook-dead-letter')),
|
|
13
|
+
title TEXT NOT NULL,
|
|
14
|
+
body TEXT,
|
|
15
|
+
source_module TEXT NOT NULL,
|
|
16
|
+
source_ref TEXT NOT NULL,
|
|
17
|
+
status TEXT NOT NULL CHECK (status IN ('unread', 'read', 'archived')),
|
|
18
|
+
read_at TIMESTAMPTZ,
|
|
19
|
+
created_at BIGINT NOT NULL
|
|
20
|
+
);
|
|
21
|
+
CREATE INDEX IF NOT EXISTS notifications_inbox_tenant_recipient_account_id_idx
|
|
22
|
+
ON notifications_inbox (tenant_id, recipient_account_id, id);
|
|
23
|
+
-- Publishing is idempotent on the source reference. The capability checks first,
|
|
24
|
+
-- but this index is what actually guarantees one item per member per event.
|
|
25
|
+
CREATE UNIQUE INDEX IF NOT EXISTS notifications_inbox_source_idx
|
|
26
|
+
ON notifications_inbox (tenant_id, recipient_account_id, kind, source_ref);
|
|
27
|
+
CREATE INDEX IF NOT EXISTS notifications_inbox_member_status_idx
|
|
28
|
+
ON notifications_inbox (tenant_id, recipient_account_id, status, created_at DESC, id);
|
|
29
|
+
ALTER TABLE notifications_inbox ENABLE ROW LEVEL SECURITY;
|
|
30
|
+
ALTER TABLE notifications_inbox FORCE ROW LEVEL SECURITY;
|
|
31
|
+
CREATE POLICY notifications_inbox_tenant_policy ON notifications_inbox
|
|
32
|
+
USING (tenant_id = current_setting('coreloom.tenant_id', true))
|
|
33
|
+
WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
|
|
34
|
+
`;
|
|
35
|
+
|
|
36
|
+
/* Mirrors migrations/0002_notifications_preferences.up.sql byte for byte. */
|
|
37
|
+
export const NOTIFICATIONS_MIGRATION_002_PREFERENCES = `CREATE TABLE IF NOT EXISTS notifications_preferences (
|
|
38
|
+
id TEXT PRIMARY KEY,
|
|
39
|
+
tenant_id TEXT NOT NULL,
|
|
40
|
+
recipient_account_id TEXT NOT NULL,
|
|
41
|
+
kind TEXT NOT NULL CHECK (kind IN ('agent-run-completed', 'agent-run-failed', 'workflow-run-completed', 'workflow-run-failed', 'webhook-dead-letter')),
|
|
42
|
+
enabled SMALLINT NOT NULL CHECK (enabled IN (0, 1)),
|
|
43
|
+
created_at BIGINT NOT NULL,
|
|
44
|
+
updated_at BIGINT NOT NULL
|
|
45
|
+
);
|
|
46
|
+
-- An absent row means enabled, so one row per member and kind is the whole rule.
|
|
47
|
+
CREATE UNIQUE INDEX IF NOT EXISTS notifications_preferences_member_kind_idx
|
|
48
|
+
ON notifications_preferences (tenant_id, recipient_account_id, kind);
|
|
49
|
+
ALTER TABLE notifications_preferences ENABLE ROW LEVEL SECURITY;
|
|
50
|
+
ALTER TABLE notifications_preferences FORCE ROW LEVEL SECURITY;
|
|
51
|
+
CREATE POLICY notifications_preferences_tenant_policy ON notifications_preferences
|
|
52
|
+
USING (tenant_id = current_setting('coreloom.tenant_id', true))
|
|
53
|
+
WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
|
|
54
|
+
`;
|
|
55
|
+
|
|
56
|
+
/* Mirrors migrations/0003_notifications_webhook_subscriptions.up.sql byte for byte. */
|
|
57
|
+
export const NOTIFICATIONS_MIGRATION_003_WEBHOOK_SUBSCRIPTIONS = `CREATE TABLE IF NOT EXISTS notifications_webhook_subscriptions (
|
|
58
|
+
id TEXT PRIMARY KEY,
|
|
59
|
+
tenant_id TEXT NOT NULL,
|
|
60
|
+
name TEXT NOT NULL,
|
|
61
|
+
url TEXT NOT NULL,
|
|
62
|
+
events_json TEXT NOT NULL,
|
|
63
|
+
secret_key_id TEXT NOT NULL,
|
|
64
|
+
secret_iv TEXT NOT NULL,
|
|
65
|
+
secret_tag TEXT NOT NULL,
|
|
66
|
+
secret_ciphertext TEXT NOT NULL,
|
|
67
|
+
secret_fingerprint TEXT NOT NULL,
|
|
68
|
+
secret_revision BIGINT NOT NULL,
|
|
69
|
+
status TEXT NOT NULL CHECK (status IN ('active', 'paused', 'disabled')),
|
|
70
|
+
description TEXT,
|
|
71
|
+
last_delivery_at BIGINT,
|
|
72
|
+
created_at BIGINT NOT NULL,
|
|
73
|
+
updated_at BIGINT NOT NULL,
|
|
74
|
+
created_by TEXT NOT NULL
|
|
75
|
+
);
|
|
76
|
+
-- The name is compared normalized, so the index has to normalize too or a
|
|
77
|
+
-- duplicate would only be caught by the service it is meant to back up.
|
|
78
|
+
CREATE UNIQUE INDEX IF NOT EXISTS notifications_webhook_subscriptions_name_idx
|
|
79
|
+
ON notifications_webhook_subscriptions (tenant_id, lower(name));
|
|
80
|
+
CREATE INDEX IF NOT EXISTS notifications_webhook_subscriptions_status_idx
|
|
81
|
+
ON notifications_webhook_subscriptions (tenant_id, status, lower(name), id);
|
|
82
|
+
ALTER TABLE notifications_webhook_subscriptions ENABLE ROW LEVEL SECURITY;
|
|
83
|
+
ALTER TABLE notifications_webhook_subscriptions FORCE ROW LEVEL SECURITY;
|
|
84
|
+
CREATE POLICY notifications_webhook_subscriptions_tenant_policy ON notifications_webhook_subscriptions
|
|
85
|
+
USING (tenant_id = current_setting('coreloom.tenant_id', true))
|
|
86
|
+
WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
|
|
87
|
+
`;
|
|
88
|
+
|
|
89
|
+
/* Mirrors migrations/0004_notifications_deliveries.up.sql byte for byte. */
|
|
90
|
+
export const NOTIFICATIONS_MIGRATION_004_DELIVERIES = `CREATE TABLE IF NOT EXISTS notifications_deliveries (
|
|
91
|
+
id TEXT PRIMARY KEY,
|
|
92
|
+
tenant_id TEXT NOT NULL,
|
|
93
|
+
subscription_id TEXT NOT NULL,
|
|
94
|
+
kind TEXT NOT NULL CHECK (kind IN ('agent-run-completed', 'agent-run-failed', 'workflow-run-completed', 'workflow-run-failed', 'webhook-dead-letter')),
|
|
95
|
+
source_module TEXT NOT NULL,
|
|
96
|
+
source_ref TEXT NOT NULL,
|
|
97
|
+
sequence BIGINT NOT NULL,
|
|
98
|
+
attempt_number BIGINT NOT NULL,
|
|
99
|
+
status TEXT NOT NULL CHECK (status IN ('pending', 'succeeded', 'failed', 'dead-letter')),
|
|
100
|
+
scheduled_for BIGINT NOT NULL,
|
|
101
|
+
completed_at BIGINT,
|
|
102
|
+
response_status BIGINT,
|
|
103
|
+
error_class TEXT,
|
|
104
|
+
payload_digest TEXT NOT NULL,
|
|
105
|
+
payload_bytes BIGINT NOT NULL,
|
|
106
|
+
occurred_at BIGINT NOT NULL,
|
|
107
|
+
created_at BIGINT NOT NULL
|
|
108
|
+
);
|
|
109
|
+
-- One row per attempt. The sequence separates the original attempt run from the
|
|
110
|
+
-- ones a replay starts, so publishing the same event twice collides on attempt
|
|
111
|
+
-- one of sequence one while a replay still numbers its own attempts from one.
|
|
112
|
+
CREATE UNIQUE INDEX IF NOT EXISTS notifications_deliveries_attempt_idx
|
|
113
|
+
ON notifications_deliveries (tenant_id, subscription_id, kind, source_ref, sequence, attempt_number);
|
|
114
|
+
CREATE INDEX IF NOT EXISTS notifications_deliveries_routing_idx
|
|
115
|
+
ON notifications_deliveries (status, scheduled_for, tenant_id, id);
|
|
116
|
+
CREATE INDEX IF NOT EXISTS notifications_deliveries_tenant_status_idx
|
|
117
|
+
ON notifications_deliveries (tenant_id, status, scheduled_for DESC, id);
|
|
118
|
+
CREATE INDEX IF NOT EXISTS notifications_deliveries_retention_idx
|
|
119
|
+
ON notifications_deliveries (tenant_id, completed_at);
|
|
120
|
+
ALTER TABLE notifications_deliveries ENABLE ROW LEVEL SECURITY;
|
|
121
|
+
ALTER TABLE notifications_deliveries FORCE ROW LEVEL SECURITY;
|
|
122
|
+
CREATE POLICY notifications_deliveries_tenant_policy ON notifications_deliveries
|
|
123
|
+
USING (tenant_id = current_setting('coreloom.tenant_id', true))
|
|
124
|
+
WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
|
|
125
|
+
`;
|
|
126
|
+
|
|
127
|
+
/* Mirrors migrations/0005_notifications_delivery_routing_role.up.sql byte for byte. */
|
|
128
|
+
export const NOTIFICATIONS_MIGRATION_005_DELIVERY_ROUTING_ROLE = `-- The delivery loop must find due attempts across tenants, and retention must
|
|
129
|
+
-- find the tenants that still hold attempts at all. It is granted exactly the
|
|
130
|
+
-- four routing columns: the subscription, the source reference, the digest and
|
|
131
|
+
-- the ledger outcome stay invisible to it, and every attempt is read again under
|
|
132
|
+
-- the tenant the routing row named before any request leaves the process.
|
|
133
|
+
DO $$
|
|
134
|
+
BEGIN
|
|
135
|
+
IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'coreloom_background') THEN
|
|
136
|
+
RAISE EXCEPTION 'The coreloom_background role must exist before this migration.';
|
|
137
|
+
END IF;
|
|
138
|
+
END
|
|
139
|
+
$$;
|
|
140
|
+
CREATE POLICY notifications_deliveries_background_policy ON notifications_deliveries
|
|
141
|
+
FOR SELECT TO coreloom_background
|
|
142
|
+
USING (true);
|
|
143
|
+
REVOKE SELECT ON notifications_deliveries FROM coreloom_background;
|
|
144
|
+
GRANT SELECT (tenant_id, id, scheduled_for, status) ON notifications_deliveries TO coreloom_background;
|
|
145
|
+
`;
|
|
146
|
+
|
|
147
|
+
/* Mirrors migrations/0006_notifications_delivery_title.up.sql byte for byte. */
|
|
148
|
+
export const NOTIFICATIONS_MIGRATION_006_DELIVERY_TITLE = `-- The payload carries the published title so a customer system can show the
|
|
149
|
+
-- event without calling back into the source module. It is part of the signed
|
|
150
|
+
-- body, so it has to live on the attempt row: a retry and a replay rebuild the
|
|
151
|
+
-- payload from the row alone and must produce the same bytes.
|
|
152
|
+
--
|
|
153
|
+
-- The default is empty rather than absent because the column is NOT NULL and a
|
|
154
|
+
-- deployment may already hold attempt rows. Such a row carries no title, so an
|
|
155
|
+
-- attempt left pending across this upgrade sends a body with an empty title
|
|
156
|
+
-- while the digest on it was taken before the field existed; the retry that
|
|
157
|
+
-- attempt schedules is digested from the row again and matches.
|
|
158
|
+
ALTER TABLE notifications_deliveries ADD COLUMN IF NOT EXISTS title TEXT NOT NULL DEFAULT '';
|
|
159
|
+
`;
|
|
160
|
+
|
|
161
|
+
/* Mirrors migrations/0007_notifications_secret_rotation_inventory.up.sql byte for byte. */
|
|
162
|
+
export const NOTIFICATIONS_MIGRATION_007_SECRET_ROTATION_INVENTORY = `-- The rotation command has to find the subscriptions still sealed with a
|
|
163
|
+
-- retired key before it knows whose they are, and the subscriptions table is
|
|
164
|
+
-- invisible to the cross-tenant role: it carries no background policy and the
|
|
165
|
+
-- role holds no default table grant. This adds the tenant id and the key id and
|
|
166
|
+
-- nothing else. The nonce, the tag, the ciphertext, the URL and the fingerprint
|
|
167
|
+
-- stay unreadable on this connection, and every row it re-seals is read again
|
|
168
|
+
-- under the tenant that row named.
|
|
169
|
+
DO $$
|
|
170
|
+
BEGIN
|
|
171
|
+
IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'coreloom_background') THEN
|
|
172
|
+
RAISE EXCEPTION 'The coreloom_background role must exist before this migration.';
|
|
173
|
+
END IF;
|
|
174
|
+
END
|
|
175
|
+
$$;
|
|
176
|
+
CREATE POLICY notifications_webhook_subscriptions_background_policy ON notifications_webhook_subscriptions
|
|
177
|
+
FOR SELECT TO coreloom_background
|
|
178
|
+
USING (true);
|
|
179
|
+
REVOKE SELECT ON notifications_webhook_subscriptions FROM coreloom_background;
|
|
180
|
+
GRANT SELECT (tenant_id, secret_key_id) ON notifications_webhook_subscriptions TO coreloom_background;
|
|
181
|
+
`;
|
|
182
|
+
|
|
183
|
+
/* Mirrors migrations/0008_notifications_delivery_claim.up.sql byte for byte. */
|
|
184
|
+
export const NOTIFICATIONS_MIGRATION_008_DELIVERY_CLAIM = `-- Two processes drain the same queue during a rolling update, and both see the
|
|
185
|
+
-- same due row. The row is claimed under its own tenant before the request
|
|
186
|
+
-- leaves: the winner moves it to 'sending' and stamps the claim, the loser's
|
|
187
|
+
-- update matches nothing and it moves on, so one pending attempt is one request.
|
|
188
|
+
--
|
|
189
|
+
-- The claim is a lease, not a ledger outcome. It leaves the attempt number, the
|
|
190
|
+
-- response and the error class untouched, and a claim older than the request
|
|
191
|
+
-- timeout plus its grace is taken over again so a process that died mid-send
|
|
192
|
+
-- strands nothing. 'sending' is why the routing page advances instead of
|
|
193
|
+
-- returning the rows another process is already holding.
|
|
194
|
+
--
|
|
195
|
+
-- The cross-tenant poll is the one that has to find a stranded claim, so
|
|
196
|
+
-- claimed_at joins the routing columns the background role may read. It carries
|
|
197
|
+
-- a clock reading and nothing about the tenant, the subscription or the payload.
|
|
198
|
+
ALTER TABLE notifications_deliveries ADD COLUMN IF NOT EXISTS claimed_at BIGINT;
|
|
199
|
+
ALTER TABLE notifications_deliveries DROP CONSTRAINT IF EXISTS notifications_deliveries_status_check;
|
|
200
|
+
ALTER TABLE notifications_deliveries ADD CONSTRAINT notifications_deliveries_status_check
|
|
201
|
+
CHECK (status IN ('pending', 'sending', 'succeeded', 'failed', 'dead-letter'));
|
|
202
|
+
GRANT SELECT (claimed_at) ON notifications_deliveries TO coreloom_background;
|
|
203
|
+
`;
|
|
204
|
+
|
|
205
|
+
/* Mirrors migrations/0009_notifications_kind_approvals.up.sql byte for byte. */
|
|
206
|
+
export const NOTIFICATIONS_MIGRATION_009_KIND_APPROVALS = `-- approvals.core publishes two kinds, so the closed set the inbox, the
|
|
207
|
+
-- preferences and the ledger all key off gains approval-requested and
|
|
208
|
+
-- approval-decided. Each check was written inline with its column, so it
|
|
209
|
+
-- carries the name PostgreSQL derived from it and is replaced under that name.
|
|
210
|
+
-- Widening a check reads no row and rewrites none.
|
|
211
|
+
--
|
|
212
|
+
-- A subscription's selected events are JSON text with no check behind them, so
|
|
213
|
+
-- an older subscription keeps exactly the kinds it was saved with and the
|
|
214
|
+
-- service is the only thing that decides which ones may be selected next.
|
|
215
|
+
ALTER TABLE notifications_inbox DROP CONSTRAINT IF EXISTS notifications_inbox_kind_check;
|
|
216
|
+
ALTER TABLE notifications_inbox ADD CONSTRAINT notifications_inbox_kind_check
|
|
217
|
+
CHECK (kind IN ('agent-run-completed', 'agent-run-failed', 'workflow-run-completed', 'workflow-run-failed', 'webhook-dead-letter', 'approval-requested', 'approval-decided'));
|
|
218
|
+
ALTER TABLE notifications_preferences DROP CONSTRAINT IF EXISTS notifications_preferences_kind_check;
|
|
219
|
+
ALTER TABLE notifications_preferences ADD CONSTRAINT notifications_preferences_kind_check
|
|
220
|
+
CHECK (kind IN ('agent-run-completed', 'agent-run-failed', 'workflow-run-completed', 'workflow-run-failed', 'webhook-dead-letter', 'approval-requested', 'approval-decided'));
|
|
221
|
+
ALTER TABLE notifications_deliveries DROP CONSTRAINT IF EXISTS notifications_deliveries_kind_check;
|
|
222
|
+
ALTER TABLE notifications_deliveries ADD CONSTRAINT notifications_deliveries_kind_check
|
|
223
|
+
CHECK (kind IN ('agent-run-completed', 'agent-run-failed', 'workflow-run-completed', 'workflow-run-failed', 'webhook-dead-letter', 'approval-requested', 'approval-decided'));
|
|
224
|
+
`;
|
|
225
|
+
|
|
226
|
+
/* Mirrors migrations/0010_notifications_kind_meter_threshold.up.sql byte for byte. */
|
|
227
|
+
export const NOTIFICATIONS_MIGRATION_010_KIND_METER_THRESHOLD = `-- metering.core publishes one kind, so the closed set the inbox, the
|
|
228
|
+
-- preferences and the ledger all key off gains meter-threshold. Each check was
|
|
229
|
+
-- written inline with its column, so it carries the name PostgreSQL derived
|
|
230
|
+
-- from it and is replaced under that name. Widening a check reads no row and
|
|
231
|
+
-- rewrites none.
|
|
232
|
+
--
|
|
233
|
+
-- A subscription's selected events are JSON text with no check behind them, so
|
|
234
|
+
-- an older subscription keeps exactly the kinds it was saved with and the
|
|
235
|
+
-- service is the only thing that decides which ones may be selected next.
|
|
236
|
+
ALTER TABLE notifications_inbox DROP CONSTRAINT IF EXISTS notifications_inbox_kind_check;
|
|
237
|
+
ALTER TABLE notifications_inbox ADD CONSTRAINT notifications_inbox_kind_check
|
|
238
|
+
CHECK (kind IN ('agent-run-completed', 'agent-run-failed', 'workflow-run-completed', 'workflow-run-failed', 'webhook-dead-letter', 'approval-requested', 'approval-decided', 'meter-threshold'));
|
|
239
|
+
ALTER TABLE notifications_preferences DROP CONSTRAINT IF EXISTS notifications_preferences_kind_check;
|
|
240
|
+
ALTER TABLE notifications_preferences ADD CONSTRAINT notifications_preferences_kind_check
|
|
241
|
+
CHECK (kind IN ('agent-run-completed', 'agent-run-failed', 'workflow-run-completed', 'workflow-run-failed', 'webhook-dead-letter', 'approval-requested', 'approval-decided', 'meter-threshold'));
|
|
242
|
+
ALTER TABLE notifications_deliveries DROP CONSTRAINT IF EXISTS notifications_deliveries_kind_check;
|
|
243
|
+
ALTER TABLE notifications_deliveries ADD CONSTRAINT notifications_deliveries_kind_check
|
|
244
|
+
CHECK (kind IN ('agent-run-completed', 'agent-run-failed', 'workflow-run-completed', 'workflow-run-failed', 'webhook-dead-letter', 'approval-requested', 'approval-decided', 'meter-threshold'));
|
|
245
|
+
`;
|
|
246
|
+
|
|
247
|
+
export const NOTIFICATIONS_MIGRATION_011_RETENTION_KEYSET = `-- The workspace data class registry sweeps and exports what this module holds,
|
|
248
|
+
-- and both walks key off (tenant_id, created_at, id). Without these indexes the
|
|
249
|
+
-- inbox sweep would scan every row of a workspace on every bounded pass and the
|
|
250
|
+
-- export keyset would sort the whole table per page, so the cost of one pass
|
|
251
|
+
-- would grow with the history rather than with the batch.
|
|
252
|
+
--
|
|
253
|
+
-- created_at and id never change after a row is written, so a walk over them
|
|
254
|
+
-- cannot revisit or skip a row while the table is still being written to. The
|
|
255
|
+
-- deliveries ledger already carries (tenant_id, completed_at) for the delivery
|
|
256
|
+
-- loop's own retention pass; that key is mutable until an attempt completes and
|
|
257
|
+
-- serves the sweep only, so the export gets its own immutable one here.
|
|
258
|
+
CREATE INDEX IF NOT EXISTS notifications_inbox_retention_idx
|
|
259
|
+
ON notifications_inbox (tenant_id, created_at, id);
|
|
260
|
+
CREATE INDEX IF NOT EXISTS notifications_deliveries_created_idx
|
|
261
|
+
ON notifications_deliveries (tenant_id, created_at, id);
|
|
262
|
+
`;
|
|
263
|
+
|
|
264
|
+
/* Mirrors migrations/0012_notifications_email_channel.up.sql byte for byte. */
|
|
265
|
+
export const NOTIFICATIONS_MIGRATION_012_EMAIL_CHANNEL = `-- A member asks for e-mail once, for the whole workspace, rather than per kind:
|
|
266
|
+
-- the per-kind switch already decides whether an inbox item exists at all, and
|
|
267
|
+
-- this decides whether the item that exists is also mailed. An absent row is
|
|
268
|
+
-- the default, e-mail off, so a member who never opened the screen is never
|
|
269
|
+
-- mailed by an upgrade.
|
|
270
|
+
CREATE TABLE IF NOT EXISTS notifications_member_preferences (
|
|
271
|
+
tenant_id TEXT NOT NULL,
|
|
272
|
+
recipient_account_id TEXT NOT NULL,
|
|
273
|
+
email_delivery SMALLINT NOT NULL CHECK (email_delivery IN (0, 1)),
|
|
274
|
+
created_at BIGINT NOT NULL,
|
|
275
|
+
updated_at BIGINT NOT NULL,
|
|
276
|
+
PRIMARY KEY (tenant_id, recipient_account_id)
|
|
277
|
+
);
|
|
278
|
+
ALTER TABLE notifications_member_preferences ENABLE ROW LEVEL SECURITY;
|
|
279
|
+
ALTER TABLE notifications_member_preferences FORCE ROW LEVEL SECURITY;
|
|
280
|
+
CREATE POLICY notifications_member_preferences_tenant_policy ON notifications_member_preferences
|
|
281
|
+
USING (tenant_id = current_setting('coreloom.tenant_id', true))
|
|
282
|
+
WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
|
|
283
|
+
|
|
284
|
+
-- The queue carries two channels now. A webhook attempt is addressed to a
|
|
285
|
+
-- subscription of the workspace, an e-mail attempt to one member, and the
|
|
286
|
+
-- constraint keeps a row from claiming both or neither. Every existing row is a
|
|
287
|
+
-- webhook, which is why the column defaults to it.
|
|
288
|
+
ALTER TABLE notifications_deliveries ADD COLUMN IF NOT EXISTS channel TEXT NOT NULL DEFAULT 'webhook';
|
|
289
|
+
ALTER TABLE notifications_deliveries ADD COLUMN IF NOT EXISTS recipient_account_id TEXT;
|
|
290
|
+
ALTER TABLE notifications_deliveries ALTER COLUMN subscription_id DROP NOT NULL;
|
|
291
|
+
ALTER TABLE notifications_deliveries DROP CONSTRAINT IF EXISTS notifications_deliveries_channel_check;
|
|
292
|
+
ALTER TABLE notifications_deliveries ADD CONSTRAINT notifications_deliveries_channel_check
|
|
293
|
+
CHECK (
|
|
294
|
+
(channel = 'webhook' AND subscription_id IS NOT NULL AND recipient_account_id IS NULL)
|
|
295
|
+
OR (channel = 'email' AND recipient_account_id IS NOT NULL AND subscription_id IS NULL)
|
|
296
|
+
);
|
|
297
|
+
-- One row per attempt, per target. The target is the subscription on a webhook
|
|
298
|
+
-- and the member on an e-mail, so the two channels of one event never collide
|
|
299
|
+
-- and publishing the same event twice still collides with itself.
|
|
300
|
+
DROP INDEX IF EXISTS notifications_deliveries_attempt_idx;
|
|
301
|
+
CREATE UNIQUE INDEX IF NOT EXISTS notifications_deliveries_attempt_idx
|
|
302
|
+
ON notifications_deliveries (tenant_id, channel, coalesce(subscription_id, recipient_account_id), kind, source_ref, sequence, attempt_number);
|
|
303
|
+
`;
|
|
304
|
+
|
|
305
|
+
/* Mirrors migrations/0013_notifications_list_pages.up.sql byte for byte. */
|
|
306
|
+
export const NOTIFICATIONS_MIGRATION_013_LIST_PAGES = `-- The three list screens page by keyset over their sort column and the id, both
|
|
307
|
+
-- in one direction, and the direction the reader asks for may be either. An
|
|
308
|
+
-- index that mixes directions, such as the member status index on
|
|
309
|
+
-- (created_at DESC, id), serves neither walk without a sort. Each index here
|
|
310
|
+
-- carries the scope of its list, then the sort column, then the id, all
|
|
311
|
+
-- ascending, so a page is a range read and the descending walk is the same
|
|
312
|
+
-- index read backwards.
|
|
313
|
+
CREATE INDEX IF NOT EXISTS notifications_inbox_member_page_idx
|
|
314
|
+
ON notifications_inbox (tenant_id, recipient_account_id, created_at, id);
|
|
315
|
+
CREATE INDEX IF NOT EXISTS notifications_webhook_subscriptions_page_idx
|
|
316
|
+
ON notifications_webhook_subscriptions (tenant_id, lower(name), id);
|
|
317
|
+
CREATE INDEX IF NOT EXISTS notifications_deliveries_page_idx
|
|
318
|
+
ON notifications_deliveries (tenant_id, scheduled_for, id);
|
|
319
|
+
`;
|
|
320
|
+
|
|
321
|
+
/* The three tables whose kind check 0009 and 0010 replace. */
|
|
322
|
+
const KIND_CHECK_TABLES = [
|
|
323
|
+
'notifications_inbox',
|
|
324
|
+
'notifications_preferences',
|
|
325
|
+
'notifications_deliveries',
|
|
326
|
+
] as const;
|
|
327
|
+
|
|
328
|
+
export const databaseMigrations: readonly DatabaseMigration[] = [
|
|
329
|
+
{
|
|
330
|
+
id: '0001_notifications_core',
|
|
331
|
+
sql: { postgresql: NOTIFICATIONS_MIGRATION_001 },
|
|
332
|
+
inspectExisting: (database) =>
|
|
333
|
+
postgresTenantTableState(
|
|
334
|
+
database,
|
|
335
|
+
'notifications_inbox',
|
|
336
|
+
'notifications_inbox_tenant_policy',
|
|
337
|
+
[
|
|
338
|
+
() =>
|
|
339
|
+
database.schema.hasIndex(
|
|
340
|
+
'notifications_inbox_tenant_recipient_account_id_idx',
|
|
341
|
+
),
|
|
342
|
+
() => database.schema.hasIndex('notifications_inbox_source_idx'),
|
|
343
|
+
() =>
|
|
344
|
+
database.schema.hasIndex('notifications_inbox_member_status_idx'),
|
|
345
|
+
],
|
|
346
|
+
),
|
|
347
|
+
},
|
|
348
|
+
{
|
|
349
|
+
id: '0002_notifications_preferences',
|
|
350
|
+
sql: { postgresql: NOTIFICATIONS_MIGRATION_002_PREFERENCES },
|
|
351
|
+
inspectExisting: (database) =>
|
|
352
|
+
postgresTenantTableState(
|
|
353
|
+
database,
|
|
354
|
+
'notifications_preferences',
|
|
355
|
+
'notifications_preferences_tenant_policy',
|
|
356
|
+
[
|
|
357
|
+
() =>
|
|
358
|
+
database.schema.hasIndex(
|
|
359
|
+
'notifications_preferences_member_kind_idx',
|
|
360
|
+
),
|
|
361
|
+
],
|
|
362
|
+
),
|
|
363
|
+
},
|
|
364
|
+
{
|
|
365
|
+
id: '0003_notifications_webhook_subscriptions',
|
|
366
|
+
sql: { postgresql: NOTIFICATIONS_MIGRATION_003_WEBHOOK_SUBSCRIPTIONS },
|
|
367
|
+
inspectExisting: (database) =>
|
|
368
|
+
postgresTenantTableState(
|
|
369
|
+
database,
|
|
370
|
+
'notifications_webhook_subscriptions',
|
|
371
|
+
'notifications_webhook_subscriptions_tenant_policy',
|
|
372
|
+
[
|
|
373
|
+
() =>
|
|
374
|
+
database.schema.hasIndex(
|
|
375
|
+
'notifications_webhook_subscriptions_name_idx',
|
|
376
|
+
),
|
|
377
|
+
() =>
|
|
378
|
+
database.schema.hasIndex(
|
|
379
|
+
'notifications_webhook_subscriptions_status_idx',
|
|
380
|
+
),
|
|
381
|
+
],
|
|
382
|
+
),
|
|
383
|
+
},
|
|
384
|
+
{
|
|
385
|
+
id: '0004_notifications_deliveries',
|
|
386
|
+
sql: { postgresql: NOTIFICATIONS_MIGRATION_004_DELIVERIES },
|
|
387
|
+
inspectExisting: (database) =>
|
|
388
|
+
postgresTenantTableState(
|
|
389
|
+
database,
|
|
390
|
+
'notifications_deliveries',
|
|
391
|
+
'notifications_deliveries_tenant_policy',
|
|
392
|
+
[
|
|
393
|
+
() =>
|
|
394
|
+
database.schema.hasIndex('notifications_deliveries_attempt_idx'),
|
|
395
|
+
() =>
|
|
396
|
+
database.schema.hasIndex('notifications_deliveries_routing_idx'),
|
|
397
|
+
() =>
|
|
398
|
+
database.schema.hasIndex(
|
|
399
|
+
'notifications_deliveries_tenant_status_idx',
|
|
400
|
+
),
|
|
401
|
+
() =>
|
|
402
|
+
database.schema.hasIndex('notifications_deliveries_retention_idx'),
|
|
403
|
+
],
|
|
404
|
+
),
|
|
405
|
+
},
|
|
406
|
+
{
|
|
407
|
+
id: '0005_notifications_delivery_routing_role',
|
|
408
|
+
sql: { postgresql: NOTIFICATIONS_MIGRATION_005_DELIVERY_ROUTING_ROLE },
|
|
409
|
+
/* A policy and a column grant leave no schema object behind, so the
|
|
410
|
+
privilege itself is what proves this migration ran. */
|
|
411
|
+
inspectExisting: async (database) => {
|
|
412
|
+
const result = await database.query<{ granted: boolean }>({
|
|
413
|
+
text: `SELECT CASE WHEN to_regclass('notifications_deliveries') IS NOT NULL THEN
|
|
414
|
+
has_column_privilege('coreloom_background', 'notifications_deliveries', 'scheduled_for', 'SELECT')
|
|
415
|
+
ELSE false END AS granted`,
|
|
416
|
+
});
|
|
417
|
+
return result.rows[0]?.granted === true ? 'complete' : 'absent';
|
|
418
|
+
},
|
|
419
|
+
},
|
|
420
|
+
{
|
|
421
|
+
id: '0006_notifications_delivery_title',
|
|
422
|
+
sql: { postgresql: NOTIFICATIONS_MIGRATION_006_DELIVERY_TITLE },
|
|
423
|
+
inspectExisting: (database) =>
|
|
424
|
+
migrationObjectState([
|
|
425
|
+
() => database.schema.hasColumn('notifications_deliveries', 'title'),
|
|
426
|
+
]),
|
|
427
|
+
},
|
|
428
|
+
{
|
|
429
|
+
id: '0007_notifications_secret_rotation_inventory',
|
|
430
|
+
sql: { postgresql: NOTIFICATIONS_MIGRATION_007_SECRET_ROTATION_INVENTORY },
|
|
431
|
+
/* A policy and a column grant leave no schema object behind, so the
|
|
432
|
+
privilege itself is what proves this migration ran. */
|
|
433
|
+
inspectExisting: async (database) => {
|
|
434
|
+
const result = await database.query<{ granted: boolean }>({
|
|
435
|
+
text: `SELECT CASE WHEN to_regclass('notifications_webhook_subscriptions') IS NOT NULL THEN
|
|
436
|
+
has_column_privilege('coreloom_background', 'notifications_webhook_subscriptions', 'secret_key_id', 'SELECT')
|
|
437
|
+
ELSE false END AS granted`,
|
|
438
|
+
});
|
|
439
|
+
return result.rows[0]?.granted === true ? 'complete' : 'absent';
|
|
440
|
+
},
|
|
441
|
+
},
|
|
442
|
+
{
|
|
443
|
+
id: '0008_notifications_delivery_claim',
|
|
444
|
+
sql: { postgresql: NOTIFICATIONS_MIGRATION_008_DELIVERY_CLAIM },
|
|
445
|
+
/* Only the column is a schema object; the widened check constraint and the
|
|
446
|
+
column grant leave none, so each is proved against the catalogue and a
|
|
447
|
+
schema carrying just some of the three is partial. */
|
|
448
|
+
inspectExisting: (database) =>
|
|
449
|
+
migrationObjectState([
|
|
450
|
+
() =>
|
|
451
|
+
database.schema.hasColumn('notifications_deliveries', 'claimed_at'),
|
|
452
|
+
async () =>
|
|
453
|
+
(
|
|
454
|
+
await database.query<{ present: boolean }>({
|
|
455
|
+
text: `SELECT EXISTS (
|
|
456
|
+
SELECT 1 FROM pg_constraint
|
|
457
|
+
WHERE conrelid = to_regclass('notifications_deliveries')
|
|
458
|
+
AND conname = 'notifications_deliveries_status_check'
|
|
459
|
+
AND pg_get_constraintdef(oid) LIKE '%sending%'
|
|
460
|
+
) AS present`,
|
|
461
|
+
})
|
|
462
|
+
).rows[0]?.present === true,
|
|
463
|
+
async () =>
|
|
464
|
+
(
|
|
465
|
+
await database.query<{ granted: boolean }>({
|
|
466
|
+
/* The privilege probe raises on a column that is not there yet,
|
|
467
|
+
so the column has to be proved before it is asked about. */
|
|
468
|
+
text: `SELECT CASE WHEN EXISTS (
|
|
469
|
+
SELECT 1 FROM pg_attribute
|
|
470
|
+
WHERE attrelid = to_regclass('notifications_deliveries')
|
|
471
|
+
AND attname = 'claimed_at' AND NOT attisdropped
|
|
472
|
+
) THEN
|
|
473
|
+
has_column_privilege('coreloom_background', 'notifications_deliveries', 'claimed_at', 'SELECT')
|
|
474
|
+
ELSE false END AS granted`,
|
|
475
|
+
})
|
|
476
|
+
).rows[0]?.granted === true,
|
|
477
|
+
]),
|
|
478
|
+
},
|
|
479
|
+
{
|
|
480
|
+
id: '0009_notifications_kind_approvals',
|
|
481
|
+
sql: { postgresql: NOTIFICATIONS_MIGRATION_009_KIND_APPROVALS },
|
|
482
|
+
/* A replaced check constraint leaves no new schema object behind, so each
|
|
483
|
+
of the three is proved against the catalogue and a schema carrying only
|
|
484
|
+
some of them is partial. */
|
|
485
|
+
inspectExisting: (database) =>
|
|
486
|
+
migrationObjectState(
|
|
487
|
+
KIND_CHECK_TABLES.map(
|
|
488
|
+
(table) => async () =>
|
|
489
|
+
(
|
|
490
|
+
await database.query<{ present: boolean }>({
|
|
491
|
+
text: `SELECT EXISTS (
|
|
492
|
+
SELECT 1 FROM pg_constraint
|
|
493
|
+
WHERE conrelid = to_regclass($1)
|
|
494
|
+
AND conname = $2
|
|
495
|
+
AND pg_get_constraintdef(oid) LIKE '%approval-decided%'
|
|
496
|
+
) AS present`,
|
|
497
|
+
parameters: [table, `${table}_kind_check`],
|
|
498
|
+
})
|
|
499
|
+
).rows[0]?.present === true,
|
|
500
|
+
),
|
|
501
|
+
),
|
|
502
|
+
},
|
|
503
|
+
{
|
|
504
|
+
id: '0010_notifications_kind_meter_threshold',
|
|
505
|
+
sql: { postgresql: NOTIFICATIONS_MIGRATION_010_KIND_METER_THRESHOLD },
|
|
506
|
+
/* A replaced check constraint leaves no new schema object behind, so each
|
|
507
|
+
of the three is proved against the catalogue and a schema carrying only
|
|
508
|
+
some of them is partial. */
|
|
509
|
+
inspectExisting: (database) =>
|
|
510
|
+
migrationObjectState(
|
|
511
|
+
KIND_CHECK_TABLES.map(
|
|
512
|
+
(table) => async () =>
|
|
513
|
+
(
|
|
514
|
+
await database.query<{ present: boolean }>({
|
|
515
|
+
text: `SELECT EXISTS (
|
|
516
|
+
SELECT 1 FROM pg_constraint
|
|
517
|
+
WHERE conrelid = to_regclass($1)
|
|
518
|
+
AND conname = $2
|
|
519
|
+
AND pg_get_constraintdef(oid) LIKE '%meter-threshold%'
|
|
520
|
+
) AS present`,
|
|
521
|
+
parameters: [table, `${table}_kind_check`],
|
|
522
|
+
})
|
|
523
|
+
).rows[0]?.present === true,
|
|
524
|
+
),
|
|
525
|
+
),
|
|
526
|
+
},
|
|
527
|
+
{
|
|
528
|
+
id: '0011_notifications_retention_keyset',
|
|
529
|
+
sql: { postgresql: NOTIFICATIONS_MIGRATION_011_RETENTION_KEYSET },
|
|
530
|
+
inspectExisting: (database) =>
|
|
531
|
+
migrationObjectState([
|
|
532
|
+
() => database.schema.hasIndex('notifications_inbox_retention_idx'),
|
|
533
|
+
() => database.schema.hasIndex('notifications_deliveries_created_idx'),
|
|
534
|
+
]),
|
|
535
|
+
},
|
|
536
|
+
{
|
|
537
|
+
id: '0012_notifications_email_channel',
|
|
538
|
+
sql: { postgresql: NOTIFICATIONS_MIGRATION_012_EMAIL_CHANNEL },
|
|
539
|
+
inspectExisting: (database) =>
|
|
540
|
+
postgresTenantTableState(
|
|
541
|
+
database,
|
|
542
|
+
'notifications_member_preferences',
|
|
543
|
+
'notifications_member_preferences_tenant_policy',
|
|
544
|
+
[
|
|
545
|
+
async () =>
|
|
546
|
+
(
|
|
547
|
+
await database.query<{ present: boolean }>({
|
|
548
|
+
text: `SELECT EXISTS (
|
|
549
|
+
SELECT 1 FROM information_schema.columns
|
|
550
|
+
WHERE table_name = 'notifications_deliveries'
|
|
551
|
+
AND column_name = 'channel'
|
|
552
|
+
) AS present`,
|
|
553
|
+
parameters: [],
|
|
554
|
+
})
|
|
555
|
+
).rows[0]?.present === true,
|
|
556
|
+
],
|
|
557
|
+
),
|
|
558
|
+
},
|
|
559
|
+
{
|
|
560
|
+
id: '0013_notifications_list_pages',
|
|
561
|
+
sql: { postgresql: NOTIFICATIONS_MIGRATION_013_LIST_PAGES },
|
|
562
|
+
inspectExisting: (database) =>
|
|
563
|
+
migrationObjectState([
|
|
564
|
+
() => database.schema.hasIndex('notifications_inbox_member_page_idx'),
|
|
565
|
+
() =>
|
|
566
|
+
database.schema.hasIndex(
|
|
567
|
+
'notifications_webhook_subscriptions_page_idx',
|
|
568
|
+
),
|
|
569
|
+
() => database.schema.hasIndex('notifications_deliveries_page_idx'),
|
|
570
|
+
]),
|
|
571
|
+
},
|
|
572
|
+
];
|