@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,121 @@
|
|
|
1
|
+
import type { ApprovalRequirement } from '@flowdular/sdk/kernel';
|
|
2
|
+
import { APPROVAL_LIMITS } from '../domain/capability.ts';
|
|
3
|
+
import type {
|
|
4
|
+
ApprovalMember,
|
|
5
|
+
ApprovalRequirementRecord,
|
|
6
|
+
} from '../domain/types.ts';
|
|
7
|
+
import {
|
|
8
|
+
ApprovalsServiceError,
|
|
9
|
+
bounded,
|
|
10
|
+
boundedInteger,
|
|
11
|
+
} from './service-error.ts';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* The kernel requirement with both optional numbers resolved, so a stored row
|
|
15
|
+
* never has to be read back through a partially specified shape. A requirement
|
|
16
|
+
* naming neither a role nor a scope has no answer to who may decide, which is a
|
|
17
|
+
* rejection rather than a request nobody can resolve.
|
|
18
|
+
*/
|
|
19
|
+
export function normalizeRequirement(
|
|
20
|
+
requirement: ApprovalRequirement,
|
|
21
|
+
defaultExpiryDays: number,
|
|
22
|
+
): ApprovalRequirementRecord {
|
|
23
|
+
const roleKey =
|
|
24
|
+
requirement.roleKey === undefined || requirement.roleKey === ''
|
|
25
|
+
? null
|
|
26
|
+
: bounded(requirement.roleKey, 'requirement.roleKey', 1, 64);
|
|
27
|
+
const scope =
|
|
28
|
+
requirement.scope === undefined || requirement.scope === ''
|
|
29
|
+
? null
|
|
30
|
+
: bounded(requirement.scope, 'requirement.scope', 1, 96);
|
|
31
|
+
if (roleKey === null && scope === null) {
|
|
32
|
+
throw new ApprovalsServiceError(
|
|
33
|
+
'APPROVAL_REQUIREMENT_INVALID',
|
|
34
|
+
'A requirement must name a role key or a scope.',
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
roleKey,
|
|
39
|
+
scope,
|
|
40
|
+
decisions: boundedInteger(
|
|
41
|
+
requirement.decisions ?? 1,
|
|
42
|
+
'requirement.decisions',
|
|
43
|
+
1,
|
|
44
|
+
APPROVAL_LIMITS.decisions,
|
|
45
|
+
),
|
|
46
|
+
expiresInDays: boundedInteger(
|
|
47
|
+
requirement.expiresInDays ?? defaultExpiryDays,
|
|
48
|
+
'requirement.expiresInDays',
|
|
49
|
+
1,
|
|
50
|
+
APPROVAL_LIMITS.expiryDays,
|
|
51
|
+
),
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Whether one member satisfies the requirement now. A requirement that names
|
|
57
|
+
* both a role and a scope asks for both: the narrower reading is the one that
|
|
58
|
+
* cannot widen who decides. The requester never decides their own request.
|
|
59
|
+
*/
|
|
60
|
+
export function memberSatisfies(
|
|
61
|
+
requirement: ApprovalRequirementRecord,
|
|
62
|
+
member: ApprovalMember,
|
|
63
|
+
requesterAccountId: string,
|
|
64
|
+
): boolean {
|
|
65
|
+
if (member.accountId === requesterAccountId) return false;
|
|
66
|
+
if (requirement.roleKey !== null && member.roleKey !== requirement.roleKey) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
if (
|
|
70
|
+
requirement.scope !== null &&
|
|
71
|
+
!member.scopes.includes(requirement.scope)
|
|
72
|
+
) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* The snapshot taken when the request opens. It is what a screen shows and what
|
|
80
|
+
* the inbox filters on; a decision is checked again against live membership, so
|
|
81
|
+
* a member who lost the role after the request cannot decide even though the
|
|
82
|
+
* snapshot still names them.
|
|
83
|
+
*/
|
|
84
|
+
export function resolveEligible(
|
|
85
|
+
requirement: ApprovalRequirementRecord,
|
|
86
|
+
members: readonly ApprovalMember[],
|
|
87
|
+
requesterAccountId: string,
|
|
88
|
+
): readonly string[] {
|
|
89
|
+
const eligible = members
|
|
90
|
+
.filter((member) =>
|
|
91
|
+
memberSatisfies(requirement, member, requesterAccountId),
|
|
92
|
+
)
|
|
93
|
+
.map((member) => member.accountId)
|
|
94
|
+
.sort();
|
|
95
|
+
const unique = [...new Set(eligible)];
|
|
96
|
+
if (unique.length === 0) {
|
|
97
|
+
throw new ApprovalsServiceError(
|
|
98
|
+
'APPROVAL_NO_ELIGIBLE_DECIDER',
|
|
99
|
+
'No member of this workspace satisfies the requirement.',
|
|
100
|
+
409,
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
if (unique.length < requirement.decisions) {
|
|
104
|
+
throw new ApprovalsServiceError(
|
|
105
|
+
'APPROVAL_ELIGIBLE_INSUFFICIENT',
|
|
106
|
+
`The requirement needs ${requirement.decisions} decisions and ${unique.length} members can give one.`,
|
|
107
|
+
409,
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
/* The snapshot decides whose inbox the request appears in, so truncating it
|
|
111
|
+
would hide the request from a member who may decide. A requirement this
|
|
112
|
+
wide is refused instead. */
|
|
113
|
+
if (unique.length > APPROVAL_LIMITS.eligible) {
|
|
114
|
+
throw new ApprovalsServiceError(
|
|
115
|
+
'APPROVAL_ELIGIBLE_TOO_MANY',
|
|
116
|
+
`A requirement may name at most ${APPROVAL_LIMITS.eligible} deciders.`,
|
|
117
|
+
409,
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
return unique;
|
|
121
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createJobRunner,
|
|
3
|
+
createJobTraceSink,
|
|
4
|
+
jobBackoff,
|
|
5
|
+
serverLogger,
|
|
6
|
+
type JobEvent,
|
|
7
|
+
type JobRunner,
|
|
8
|
+
type Tracer,
|
|
9
|
+
} from '@flowdular/sdk/server';
|
|
10
|
+
import type { ApprovalRouting } from '../domain/types.ts';
|
|
11
|
+
import type { ApprovalsService } from './approvals-service.ts';
|
|
12
|
+
import type { ApprovalsRepository } from './repository.ts';
|
|
13
|
+
|
|
14
|
+
/** Requests one expiry pass claims, and the page its routing read answers. */
|
|
15
|
+
export const EXPIRY_BATCH = 100;
|
|
16
|
+
|
|
17
|
+
export interface ApprovalsExpiryRunnerOptions {
|
|
18
|
+
readonly repository: () => Promise<ApprovalsRepository>;
|
|
19
|
+
readonly service: () => Promise<ApprovalsService>;
|
|
20
|
+
/** The platform setting, read once when the loop starts. */
|
|
21
|
+
readonly intervalMs: number;
|
|
22
|
+
readonly now?: (() => number) | undefined;
|
|
23
|
+
/** Absent turns every pass into spans; a sink of its own replaces that. */
|
|
24
|
+
readonly onEvent?: ((event: JobEvent) => void) | undefined;
|
|
25
|
+
/** Defaults to the process tracer, which is the one `context.tracer` carries. */
|
|
26
|
+
readonly tracer?: Tracer | undefined;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* The expiry pass as the platform runner sees it: a claim over routing columns
|
|
31
|
+
* and one request expired per claim. The loop, its bound, the guard against
|
|
32
|
+
* overlapping passes, the isolation of one request from the next and the drain
|
|
33
|
+
* are the runner's (`@flowdular/sdk/server`); the routing read and the transition
|
|
34
|
+
* under the workspace stay here.
|
|
35
|
+
*/
|
|
36
|
+
export function createApprovalsExpiryRunner(
|
|
37
|
+
options: ApprovalsExpiryRunnerOptions,
|
|
38
|
+
): JobRunner {
|
|
39
|
+
/* The routing read crosses workspaces on the background role and answers
|
|
40
|
+
routing columns alone. It refills only once the page it filled is drained,
|
|
41
|
+
and a page shorter than the bound means nothing further was due, so a pass
|
|
42
|
+
reads it at most twice however many requests it expires. */
|
|
43
|
+
let queue: ApprovalRouting[] = [];
|
|
44
|
+
let refillable = true;
|
|
45
|
+
|
|
46
|
+
return createJobRunner<ApprovalRouting>({
|
|
47
|
+
name: 'approvals.core',
|
|
48
|
+
intervalMs: options.intervalMs,
|
|
49
|
+
/* Expiry claims nothing: the pending status the transition compares and
|
|
50
|
+
swaps is its own fence, so no lease is held and no renewal runs. */
|
|
51
|
+
staleAfterMs: options.intervalMs,
|
|
52
|
+
backoff: jobBackoff(options.intervalMs),
|
|
53
|
+
batchLimit: EXPIRY_BATCH,
|
|
54
|
+
logger: serverLogger,
|
|
55
|
+
now: options.now,
|
|
56
|
+
onEvent:
|
|
57
|
+
options.onEvent ??
|
|
58
|
+
createJobTraceSink(options.tracer ? { tracer: options.tracer } : {}),
|
|
59
|
+
claim: async (at) => {
|
|
60
|
+
if (queue.length === 0) {
|
|
61
|
+
if (!refillable) {
|
|
62
|
+
refillable = true;
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
const repository = await options.repository();
|
|
66
|
+
const page = await repository.listDueExpiries(at, EXPIRY_BATCH);
|
|
67
|
+
refillable = page.length === EXPIRY_BATCH;
|
|
68
|
+
queue = [...page];
|
|
69
|
+
}
|
|
70
|
+
const routing = queue.shift();
|
|
71
|
+
if (!routing) {
|
|
72
|
+
refillable = true;
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
return routing;
|
|
76
|
+
},
|
|
77
|
+
perform: async (routing) => {
|
|
78
|
+
await (await options.service()).expireRequest(routing);
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export { ApprovalsService, APPROVALS_PAGE_LIMIT } from './approvals-service.ts';
|
|
2
|
+
export type { ApprovalsServiceOptions } from './approvals-service.ts';
|
|
3
|
+
export { createApprovalsExpiryRunner, EXPIRY_BATCH } from './expiry-runner.ts';
|
|
4
|
+
export type { ApprovalsExpiryRunnerOptions } from './expiry-runner.ts';
|
|
5
|
+
export { createApprovalCallbackRegistry } from './callbacks.ts';
|
|
6
|
+
export type {
|
|
7
|
+
ApprovalCallbackRegistry,
|
|
8
|
+
ApprovalResolvedCallback,
|
|
9
|
+
} from './callbacks.ts';
|
|
10
|
+
export {
|
|
11
|
+
memberSatisfies,
|
|
12
|
+
normalizeRequirement,
|
|
13
|
+
resolveEligible,
|
|
14
|
+
} from './eligibility.ts';
|
|
15
|
+
export { publishApprovalEvent } from './notifications.ts';
|
|
16
|
+
export type {
|
|
17
|
+
NotificationPublisher,
|
|
18
|
+
NotificationPublisherResolver,
|
|
19
|
+
} from './notifications.ts';
|
|
20
|
+
export type {
|
|
21
|
+
ApprovalRequestFilters,
|
|
22
|
+
ApprovalsRepository,
|
|
23
|
+
CreateApprovalResult,
|
|
24
|
+
DecideApprovalInput,
|
|
25
|
+
DecideApprovalResult,
|
|
26
|
+
} from './repository.ts';
|
|
27
|
+
export {
|
|
28
|
+
DatabaseApprovalsRepository,
|
|
29
|
+
migrateApprovalsDatabase,
|
|
30
|
+
} from './database-repository.ts';
|
|
31
|
+
export { ApprovalsServiceError } from './service-error.ts';
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import type { DatabaseMigration } from '@flowdular/sdk/database';
|
|
2
|
+
import {
|
|
3
|
+
migrationObjectState,
|
|
4
|
+
postgresTenantTableState,
|
|
5
|
+
} from '@flowdular/sdk/database';
|
|
6
|
+
|
|
7
|
+
/* Mirrors migrations/0001_approvals_core.up.sql byte for byte. */
|
|
8
|
+
export const APPROVALS_MIGRATION_001 = `CREATE TABLE IF NOT EXISTS approvals_requests (
|
|
9
|
+
id TEXT PRIMARY KEY,
|
|
10
|
+
tenant_id TEXT NOT NULL,
|
|
11
|
+
subject_module TEXT NOT NULL,
|
|
12
|
+
subject_ref TEXT NOT NULL,
|
|
13
|
+
permission TEXT NOT NULL,
|
|
14
|
+
action TEXT NOT NULL,
|
|
15
|
+
title TEXT NOT NULL,
|
|
16
|
+
summary TEXT,
|
|
17
|
+
requester_account_id TEXT NOT NULL,
|
|
18
|
+
requirement_json TEXT NOT NULL,
|
|
19
|
+
decisions_needed BIGINT NOT NULL CHECK (decisions_needed >= 1),
|
|
20
|
+
status TEXT NOT NULL CHECK (status IN ('pending', 'approved', 'rejected', 'expired', 'cancelled')),
|
|
21
|
+
expires_at BIGINT NOT NULL,
|
|
22
|
+
resolved_at BIGINT,
|
|
23
|
+
created_at BIGINT NOT NULL
|
|
24
|
+
);
|
|
25
|
+
-- A subject module that reopens after a crash has to find the request it
|
|
26
|
+
-- already opened instead of asking the same question twice. One pending
|
|
27
|
+
-- request per subject reference is what makes opening idempotent.
|
|
28
|
+
CREATE UNIQUE INDEX IF NOT EXISTS approvals_requests_pending_subject_idx
|
|
29
|
+
ON approvals_requests (tenant_id, subject_module, subject_ref)
|
|
30
|
+
WHERE status = 'pending';
|
|
31
|
+
CREATE INDEX IF NOT EXISTS approvals_requests_tenant_status_idx
|
|
32
|
+
ON approvals_requests (tenant_id, status, created_at DESC, id);
|
|
33
|
+
CREATE INDEX IF NOT EXISTS approvals_requests_requester_idx
|
|
34
|
+
ON approvals_requests (tenant_id, requester_account_id, created_at DESC, id);
|
|
35
|
+
-- The cross-tenant expiry poll reads in this order and stops at the first
|
|
36
|
+
-- request that is not due yet.
|
|
37
|
+
CREATE INDEX IF NOT EXISTS approvals_requests_routing_idx
|
|
38
|
+
ON approvals_requests (status, expires_at, tenant_id, id);
|
|
39
|
+
ALTER TABLE approvals_requests ENABLE ROW LEVEL SECURITY;
|
|
40
|
+
ALTER TABLE approvals_requests FORCE ROW LEVEL SECURITY;
|
|
41
|
+
CREATE POLICY approvals_requests_tenant_policy ON approvals_requests
|
|
42
|
+
USING (tenant_id = current_setting('coreloom.tenant_id', true))
|
|
43
|
+
WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
|
|
44
|
+
-- The eligibility snapshot taken when the request opened. It decides whose
|
|
45
|
+
-- inbox the request appears in, so it is a row per decider with its own index
|
|
46
|
+
-- rather than a list inside the request: the screen asks "what may I decide"
|
|
47
|
+
-- once per open workspace and that question has to stay one index lookup.
|
|
48
|
+
CREATE TABLE IF NOT EXISTS approvals_eligible (
|
|
49
|
+
tenant_id TEXT NOT NULL,
|
|
50
|
+
request_id TEXT NOT NULL,
|
|
51
|
+
account_id TEXT NOT NULL,
|
|
52
|
+
PRIMARY KEY (tenant_id, request_id, account_id)
|
|
53
|
+
);
|
|
54
|
+
CREATE INDEX IF NOT EXISTS approvals_eligible_account_idx
|
|
55
|
+
ON approvals_eligible (tenant_id, account_id, request_id);
|
|
56
|
+
ALTER TABLE approvals_eligible ENABLE ROW LEVEL SECURITY;
|
|
57
|
+
ALTER TABLE approvals_eligible FORCE ROW LEVEL SECURITY;
|
|
58
|
+
CREATE POLICY approvals_eligible_tenant_policy ON approvals_eligible
|
|
59
|
+
USING (tenant_id = current_setting('coreloom.tenant_id', true))
|
|
60
|
+
WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
|
|
61
|
+
CREATE TABLE IF NOT EXISTS approvals_decisions (
|
|
62
|
+
id TEXT PRIMARY KEY,
|
|
63
|
+
tenant_id TEXT NOT NULL,
|
|
64
|
+
request_id TEXT NOT NULL,
|
|
65
|
+
decider_account_id TEXT,
|
|
66
|
+
decision TEXT NOT NULL CHECK (decision IN ('approve', 'reject', 'expire', 'cancel')),
|
|
67
|
+
comment TEXT,
|
|
68
|
+
decided_at BIGINT NOT NULL,
|
|
69
|
+
-- Expiry is the one decision no member makes. Every other row names the
|
|
70
|
+
-- account answerable for it, and the pair is checked here rather than only
|
|
71
|
+
-- in the service that writes it.
|
|
72
|
+
CHECK ((decision = 'expire') = (decider_account_id IS NULL))
|
|
73
|
+
);
|
|
74
|
+
-- One approval or rejection per member per request. The service checks first,
|
|
75
|
+
-- but this index is what actually guarantees the conflict it reports.
|
|
76
|
+
CREATE UNIQUE INDEX IF NOT EXISTS approvals_decisions_decider_idx
|
|
77
|
+
ON approvals_decisions (tenant_id, request_id, decider_account_id)
|
|
78
|
+
WHERE decision IN ('approve', 'reject');
|
|
79
|
+
CREATE INDEX IF NOT EXISTS approvals_decisions_request_idx
|
|
80
|
+
ON approvals_decisions (tenant_id, request_id, decided_at, id);
|
|
81
|
+
ALTER TABLE approvals_decisions ENABLE ROW LEVEL SECURITY;
|
|
82
|
+
ALTER TABLE approvals_decisions FORCE ROW LEVEL SECURITY;
|
|
83
|
+
CREATE POLICY approvals_decisions_tenant_policy ON approvals_decisions
|
|
84
|
+
USING (tenant_id = current_setting('coreloom.tenant_id', true))
|
|
85
|
+
WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
|
|
86
|
+
`;
|
|
87
|
+
|
|
88
|
+
/* Mirrors migrations/0002_approvals_expiry_routing_role.up.sql byte for byte. */
|
|
89
|
+
export const APPROVALS_MIGRATION_002_EXPIRY_ROUTING_ROLE = `-- The expiry loop has to find due pending requests before it knows whose they
|
|
90
|
+
-- are, and the requests table is invisible to the cross-tenant role: it carries
|
|
91
|
+
-- no background policy and the role holds no default table grant. This adds the
|
|
92
|
+
-- four routing columns and nothing else. The subject, the requester, the
|
|
93
|
+
-- requirement, the eligibility snapshot and the title stay unreadable on this
|
|
94
|
+
-- connection, and every request it names is read again under its own tenant
|
|
95
|
+
-- before anything about it is written.
|
|
96
|
+
DO $$
|
|
97
|
+
BEGIN
|
|
98
|
+
IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'coreloom_background') THEN
|
|
99
|
+
RAISE EXCEPTION 'The coreloom_background role must exist before this migration.';
|
|
100
|
+
END IF;
|
|
101
|
+
END
|
|
102
|
+
$$;
|
|
103
|
+
CREATE POLICY approvals_requests_background_policy ON approvals_requests
|
|
104
|
+
FOR SELECT TO coreloom_background
|
|
105
|
+
USING (true);
|
|
106
|
+
REVOKE SELECT ON approvals_requests FROM coreloom_background;
|
|
107
|
+
GRANT SELECT (tenant_id, id, expires_at, status) ON approvals_requests TO coreloom_background;
|
|
108
|
+
`;
|
|
109
|
+
|
|
110
|
+
/* Mirrors migrations/0003_approvals_retention_indexes.up.sql byte for byte. */
|
|
111
|
+
export const APPROVALS_MIGRATION_003_RETENTION_INDEXES = `-- The retention sweep of approvals.core.requests asks one workspace for its
|
|
112
|
+
-- oldest resolved requests, the export walks every request of a workspace in
|
|
113
|
+
-- id order, and a subject erasure asks it for the decisions one account made.
|
|
114
|
+
-- None of the three is covered by what the module already carries: the status
|
|
115
|
+
-- index orders by creation rather than by resolution, the requester index
|
|
116
|
+
-- answers who asked rather than who decided, and no index carries the export's
|
|
117
|
+
-- own key order. All three are bounded batches, so all three need a range scan
|
|
118
|
+
-- rather than a pass over the workspace's requests.
|
|
119
|
+
CREATE INDEX IF NOT EXISTS approvals_requests_resolved_idx
|
|
120
|
+
ON approvals_requests (tenant_id, status, resolved_at, id);
|
|
121
|
+
CREATE INDEX IF NOT EXISTS approvals_requests_export_idx
|
|
122
|
+
ON approvals_requests (tenant_id, id);
|
|
123
|
+
CREATE INDEX IF NOT EXISTS approvals_decisions_decider_account_idx
|
|
124
|
+
ON approvals_decisions (tenant_id, decider_account_id, id);
|
|
125
|
+
`;
|
|
126
|
+
|
|
127
|
+
/* Mirrors migrations/0004_approvals_inbox_keyset_indexes.up.sql byte for byte. */
|
|
128
|
+
export const APPROVALS_MIGRATION_004_INBOX_KEYSET_INDEXES = `-- The inbox pages by keyset on (created_at, id) in one direction, under a
|
|
129
|
+
-- status filter, a requester filter, or neither. The two indexes 0001 carries
|
|
130
|
+
-- order created_at DESC with id ASC, so a page walked in either direction ends
|
|
131
|
+
-- in a sort, and a workspace-wide page has no index at all. These three carry
|
|
132
|
+
-- both keys ascending: a newest-first page is a backward scan of the same
|
|
133
|
+
-- index, and a page continued from a cursor starts where the cursor names.
|
|
134
|
+
CREATE INDEX IF NOT EXISTS approvals_requests_status_created_idx
|
|
135
|
+
ON approvals_requests (tenant_id, status, created_at, id);
|
|
136
|
+
CREATE INDEX IF NOT EXISTS approvals_requests_requester_created_idx
|
|
137
|
+
ON approvals_requests (tenant_id, requester_account_id, created_at, id);
|
|
138
|
+
CREATE INDEX IF NOT EXISTS approvals_requests_created_idx
|
|
139
|
+
ON approvals_requests (tenant_id, created_at, id);
|
|
140
|
+
`;
|
|
141
|
+
|
|
142
|
+
/* Mirrors migrations/0005_approvals_grant_audit.up.sql byte for byte. */
|
|
143
|
+
export const APPROVALS_MIGRATION_005_GRANT_AUDIT = `-- The grant an approved request yields is derived from the row and the key on
|
|
144
|
+
-- every read, so nothing about the token itself is stored. What is stored is
|
|
145
|
+
-- the fact of its issuance: one row per resolved request whose subject names
|
|
146
|
+
-- a capability, with the capability, the input digest, the key that signs and
|
|
147
|
+
-- the moment the grant stops verifying, written in the deciding transaction.
|
|
148
|
+
CREATE TABLE IF NOT EXISTS approvals_audit (
|
|
149
|
+
id TEXT PRIMARY KEY,
|
|
150
|
+
tenant_id TEXT NOT NULL,
|
|
151
|
+
request_id TEXT NOT NULL,
|
|
152
|
+
action TEXT NOT NULL,
|
|
153
|
+
metadata_json TEXT NOT NULL,
|
|
154
|
+
occurred_at BIGINT NOT NULL
|
|
155
|
+
);
|
|
156
|
+
CREATE INDEX IF NOT EXISTS approvals_audit_request_idx
|
|
157
|
+
ON approvals_audit (tenant_id, request_id, occurred_at, id);
|
|
158
|
+
ALTER TABLE approvals_audit ENABLE ROW LEVEL SECURITY;
|
|
159
|
+
ALTER TABLE approvals_audit FORCE ROW LEVEL SECURITY;
|
|
160
|
+
CREATE POLICY approvals_audit_tenant_policy ON approvals_audit
|
|
161
|
+
USING (tenant_id = current_setting('coreloom.tenant_id', true))
|
|
162
|
+
WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
|
|
163
|
+
`;
|
|
164
|
+
|
|
165
|
+
export const databaseMigrations: readonly DatabaseMigration[] = [
|
|
166
|
+
{
|
|
167
|
+
id: '0001_approvals_core',
|
|
168
|
+
sql: { postgresql: APPROVALS_MIGRATION_001 },
|
|
169
|
+
/* One migration creates three tables, so a schema carrying only some of
|
|
170
|
+
them is partial and the runner refuses it rather than patching it. */
|
|
171
|
+
inspectExisting: async (database) => {
|
|
172
|
+
const states = await Promise.all([
|
|
173
|
+
postgresTenantTableState(
|
|
174
|
+
database,
|
|
175
|
+
'approvals_requests',
|
|
176
|
+
'approvals_requests_tenant_policy',
|
|
177
|
+
[
|
|
178
|
+
() =>
|
|
179
|
+
database.schema.hasIndex(
|
|
180
|
+
'approvals_requests_pending_subject_idx',
|
|
181
|
+
),
|
|
182
|
+
() =>
|
|
183
|
+
database.schema.hasIndex('approvals_requests_tenant_status_idx'),
|
|
184
|
+
() => database.schema.hasIndex('approvals_requests_requester_idx'),
|
|
185
|
+
() => database.schema.hasIndex('approvals_requests_routing_idx'),
|
|
186
|
+
],
|
|
187
|
+
),
|
|
188
|
+
postgresTenantTableState(
|
|
189
|
+
database,
|
|
190
|
+
'approvals_eligible',
|
|
191
|
+
'approvals_eligible_tenant_policy',
|
|
192
|
+
[() => database.schema.hasIndex('approvals_eligible_account_idx')],
|
|
193
|
+
),
|
|
194
|
+
postgresTenantTableState(
|
|
195
|
+
database,
|
|
196
|
+
'approvals_decisions',
|
|
197
|
+
'approvals_decisions_tenant_policy',
|
|
198
|
+
[
|
|
199
|
+
() => database.schema.hasIndex('approvals_decisions_decider_idx'),
|
|
200
|
+
() => database.schema.hasIndex('approvals_decisions_request_idx'),
|
|
201
|
+
],
|
|
202
|
+
),
|
|
203
|
+
]);
|
|
204
|
+
if (states.every((state) => state === 'complete')) return 'complete';
|
|
205
|
+
if (states.every((state) => state === 'absent')) return 'absent';
|
|
206
|
+
return 'partial';
|
|
207
|
+
},
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
id: '0002_approvals_expiry_routing_role',
|
|
211
|
+
sql: { postgresql: APPROVALS_MIGRATION_002_EXPIRY_ROUTING_ROLE },
|
|
212
|
+
/* A policy and a column grant leave no schema object behind, so the
|
|
213
|
+
privilege itself is what proves this migration ran. */
|
|
214
|
+
inspectExisting: async (database) => {
|
|
215
|
+
const result = await database.query<{ granted: boolean }>({
|
|
216
|
+
text: `SELECT CASE WHEN to_regclass('approvals_requests') IS NOT NULL THEN
|
|
217
|
+
has_column_privilege('coreloom_background', 'approvals_requests', 'expires_at', 'SELECT')
|
|
218
|
+
ELSE false END AS granted`,
|
|
219
|
+
});
|
|
220
|
+
return result.rows[0]?.granted === true ? 'complete' : 'absent';
|
|
221
|
+
},
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
id: '0003_approvals_retention_indexes',
|
|
225
|
+
sql: { postgresql: APPROVALS_MIGRATION_003_RETENTION_INDEXES },
|
|
226
|
+
inspectExisting: (database) =>
|
|
227
|
+
migrationObjectState([
|
|
228
|
+
() => database.schema.hasIndex('approvals_requests_resolved_idx'),
|
|
229
|
+
() => database.schema.hasIndex('approvals_requests_export_idx'),
|
|
230
|
+
() =>
|
|
231
|
+
database.schema.hasIndex('approvals_decisions_decider_account_idx'),
|
|
232
|
+
]),
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
id: '0004_approvals_inbox_keyset_indexes',
|
|
236
|
+
sql: { postgresql: APPROVALS_MIGRATION_004_INBOX_KEYSET_INDEXES },
|
|
237
|
+
inspectExisting: (database) =>
|
|
238
|
+
migrationObjectState([
|
|
239
|
+
() => database.schema.hasIndex('approvals_requests_status_created_idx'),
|
|
240
|
+
() =>
|
|
241
|
+
database.schema.hasIndex('approvals_requests_requester_created_idx'),
|
|
242
|
+
() => database.schema.hasIndex('approvals_requests_created_idx'),
|
|
243
|
+
]),
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
id: '0005_approvals_grant_audit',
|
|
247
|
+
sql: { postgresql: APPROVALS_MIGRATION_005_GRANT_AUDIT },
|
|
248
|
+
inspectExisting: (database) =>
|
|
249
|
+
postgresTenantTableState(
|
|
250
|
+
database,
|
|
251
|
+
'approvals_audit',
|
|
252
|
+
'approvals_audit_tenant_policy',
|
|
253
|
+
[() => database.schema.hasIndex('approvals_audit_request_idx')],
|
|
254
|
+
),
|
|
255
|
+
},
|
|
256
|
+
];
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/* The notifications.core publish contract, declared here rather than imported.
|
|
2
|
+
notifications.core is optional: approvals.core composes, opens and resolves
|
|
3
|
+
requests with that module absent, so it is not a package dependency. This
|
|
4
|
+
mirror carries only the two kinds this module publishes; notifications.core
|
|
5
|
+
owns the full set and this must not drift from the shape it accepts. */
|
|
6
|
+
export const NOTIFICATIONS_PUBLISH_CAPABILITY = 'notifications.publish.v1';
|
|
7
|
+
|
|
8
|
+
export type ApprovalNotificationKind =
|
|
9
|
+
| 'approval-requested'
|
|
10
|
+
| 'approval-decided';
|
|
11
|
+
|
|
12
|
+
export interface NotificationPublishInput {
|
|
13
|
+
readonly tenantId: string;
|
|
14
|
+
readonly kind: ApprovalNotificationKind;
|
|
15
|
+
readonly sourceModule: string;
|
|
16
|
+
readonly sourceRef: string;
|
|
17
|
+
readonly title: string;
|
|
18
|
+
readonly body?: string;
|
|
19
|
+
readonly recipients: readonly string[];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface NotificationPublishResult {
|
|
23
|
+
readonly inboxItemIds: readonly string[];
|
|
24
|
+
readonly deliveryIds: readonly string[];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface NotificationPublisher {
|
|
28
|
+
publish(input: NotificationPublishInput): Promise<NotificationPublishResult>;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/* Read at the point of use, never at composition time: the platform may
|
|
32
|
+
register notifications.core after approvals.core, or never. */
|
|
33
|
+
export type NotificationPublisherResolver = () => NotificationPublisher | null;
|
|
34
|
+
|
|
35
|
+
const LIMITS = {
|
|
36
|
+
sourceModule: 64,
|
|
37
|
+
sourceRef: 200,
|
|
38
|
+
title: 200,
|
|
39
|
+
body: 4_000,
|
|
40
|
+
recipients: 64,
|
|
41
|
+
recipientId: 128,
|
|
42
|
+
} as const;
|
|
43
|
+
|
|
44
|
+
function clamp(value: string, limit: number): string {
|
|
45
|
+
return value.length > limit ? value.slice(0, limit) : value;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Advisory and post-commit. An absent notifications module, nobody to notify,
|
|
50
|
+
* or a publisher that throws never changes a recorded decision, so this never
|
|
51
|
+
* rejects. The caller passes the request id as `sourceRef`, which makes a
|
|
52
|
+
* repeated publication of the same event idempotent on the receiving side.
|
|
53
|
+
*
|
|
54
|
+
* A requirement may name more deciders than notifications.core accepts in one
|
|
55
|
+
* call, so the recipients are published in batches of that size. Every batch
|
|
56
|
+
* carries the same `sourceRef`, which is what makes them one event on the
|
|
57
|
+
* receiving side; truncating instead would leave deciders unasked.
|
|
58
|
+
*/
|
|
59
|
+
export async function publishApprovalEvent(
|
|
60
|
+
resolve: NotificationPublisherResolver | undefined,
|
|
61
|
+
input: NotificationPublishInput,
|
|
62
|
+
): Promise<void> {
|
|
63
|
+
if (input.recipients.length === 0) return;
|
|
64
|
+
try {
|
|
65
|
+
const publisher = resolve?.();
|
|
66
|
+
if (!publisher) return;
|
|
67
|
+
const event = {
|
|
68
|
+
tenantId: input.tenantId,
|
|
69
|
+
kind: input.kind,
|
|
70
|
+
sourceModule: clamp(input.sourceModule, LIMITS.sourceModule),
|
|
71
|
+
sourceRef: clamp(input.sourceRef, LIMITS.sourceRef),
|
|
72
|
+
title: clamp(input.title, LIMITS.title),
|
|
73
|
+
...(input.body === undefined
|
|
74
|
+
? {}
|
|
75
|
+
: { body: clamp(input.body, LIMITS.body) }),
|
|
76
|
+
};
|
|
77
|
+
for (
|
|
78
|
+
let index = 0;
|
|
79
|
+
index < input.recipients.length;
|
|
80
|
+
index += LIMITS.recipients
|
|
81
|
+
) {
|
|
82
|
+
await publisher.publish({
|
|
83
|
+
...event,
|
|
84
|
+
recipients: input.recipients
|
|
85
|
+
.slice(index, index + LIMITS.recipients)
|
|
86
|
+
.map((recipient) => clamp(recipient, LIMITS.recipientId)),
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
} catch (error) {
|
|
90
|
+
console.warn(
|
|
91
|
+
`[approvals] notification publish for request ${input.sourceRef} failed:`,
|
|
92
|
+
error instanceof Error ? error.message : error,
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
}
|