@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,261 @@
|
|
|
1
|
+
import { lookup } from 'node:dns/promises';
|
|
2
|
+
import { isIP } from 'node:net';
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
* The address classification below, blockedIpv4, blockedAddress and
|
|
6
|
+
* normalizeHost, is byte-for-byte the block notifications.core delivers
|
|
7
|
+
* webhooks under, and so is the pinned lookup further down. The policy around
|
|
8
|
+
* them is this module's own and deliberately differs: a call-time assertHttps
|
|
9
|
+
* for a base URL a workspace saved before the rule, and an allowlist built from
|
|
10
|
+
* the instance's own host list rather than a comma separated environment value.
|
|
11
|
+
* The shared parts are the promotion candidate for packages/server; they stay
|
|
12
|
+
* copied until the platform owns one egress policy both modules call.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
export type ConnectorEgressErrorCode =
|
|
16
|
+
| 'CONNECTOR_URL_INVALID'
|
|
17
|
+
| 'CONNECTOR_URL_BLOCKED'
|
|
18
|
+
| 'CONNECTOR_HOST_NOT_ALLOWLISTED'
|
|
19
|
+
| 'CONNECTOR_HOST_UNRESOLVED'
|
|
20
|
+
| 'CONNECTOR_HOST_RESOLVES_PRIVATE';
|
|
21
|
+
|
|
22
|
+
export class ConnectorEgressError extends Error {
|
|
23
|
+
constructor(
|
|
24
|
+
readonly code: ConnectorEgressErrorCode,
|
|
25
|
+
message: string,
|
|
26
|
+
) {
|
|
27
|
+
super(message);
|
|
28
|
+
this.name = 'ConnectorEgressError';
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function blockedIpv4(value: string): boolean {
|
|
33
|
+
const parts = value.split('.').map(Number);
|
|
34
|
+
if (parts.length !== 4 || parts.some((part) => !Number.isInteger(part))) {
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
const [a, b] = parts as [number, number, number, number];
|
|
38
|
+
return (
|
|
39
|
+
a === 0 ||
|
|
40
|
+
a === 10 ||
|
|
41
|
+
a === 127 ||
|
|
42
|
+
(a === 169 && b === 254) ||
|
|
43
|
+
(a === 172 && b >= 16 && b <= 31) ||
|
|
44
|
+
(a === 192 && b === 168) ||
|
|
45
|
+
(a === 100 && b >= 64 && b <= 127) ||
|
|
46
|
+
a >= 224
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** True for loopback, link-local, private, multicast and reserved addresses. */
|
|
51
|
+
export function blockedAddress(value: string): boolean {
|
|
52
|
+
if (isIP(value) === 4) return blockedIpv4(value);
|
|
53
|
+
if (isIP(value) !== 6) return true;
|
|
54
|
+
const normalized = value.toLowerCase();
|
|
55
|
+
if (normalized.startsWith('::ffff:')) {
|
|
56
|
+
const mapped = normalized.slice('::ffff:'.length);
|
|
57
|
+
return isIP(mapped) === 4 ? blockedIpv4(mapped) : true;
|
|
58
|
+
}
|
|
59
|
+
return (
|
|
60
|
+
normalized === '::' ||
|
|
61
|
+
normalized === '::1' ||
|
|
62
|
+
normalized.startsWith('fc') ||
|
|
63
|
+
normalized.startsWith('fd') ||
|
|
64
|
+
normalized.startsWith('fe8') ||
|
|
65
|
+
normalized.startsWith('fe9') ||
|
|
66
|
+
normalized.startsWith('fea') ||
|
|
67
|
+
normalized.startsWith('feb') ||
|
|
68
|
+
normalized.startsWith('ff')
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export function connectorHostAllowlist(
|
|
73
|
+
hosts: readonly string[],
|
|
74
|
+
): ReadonlySet<string> {
|
|
75
|
+
return new Set(
|
|
76
|
+
hosts.map((host) => host.trim().toLowerCase()).filter(Boolean),
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/* URL.hostname keeps the brackets around an IPv6 literal, and isIP does not
|
|
81
|
+
accept them, so both checks would miss `https://[::1]/` without this. */
|
|
82
|
+
export function normalizeHost(hostname: string): string {
|
|
83
|
+
const lowered = hostname.toLowerCase();
|
|
84
|
+
return lowered.startsWith('[') && lowered.endsWith(']')
|
|
85
|
+
? lowered.slice(1, -1)
|
|
86
|
+
: lowered;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export interface ResolvedAddress {
|
|
90
|
+
readonly address: string;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* How a hostname becomes addresses. The default asks the system resolver; a
|
|
95
|
+
* test injects its own so a local server can be reached without an environment
|
|
96
|
+
* flag ever weakening the check in a deployment.
|
|
97
|
+
*/
|
|
98
|
+
export type HostAddressResolver = (
|
|
99
|
+
hostname: string,
|
|
100
|
+
) => Promise<readonly ResolvedAddress[]>;
|
|
101
|
+
|
|
102
|
+
export const systemHostResolver: HostAddressResolver = (hostname) =>
|
|
103
|
+
lookup(hostname, { all: true, verbatim: true });
|
|
104
|
+
|
|
105
|
+
/* ---------------------------------------------------------------------------
|
|
106
|
+
* Pinned egress. This block is byte-for-byte identical in both modules that
|
|
107
|
+
* own this policy, connectors.core and notifications.core. Change both or
|
|
108
|
+
* neither: they run the same rule, and this block is the first piece to
|
|
109
|
+
* promote into packages/server once the platform owns one egress policy.
|
|
110
|
+
* ------------------------------------------------------------------------- */
|
|
111
|
+
|
|
112
|
+
/** What `net.connect` asks before it opens a socket. */
|
|
113
|
+
export type PinnedLookup = (
|
|
114
|
+
hostname: string,
|
|
115
|
+
options: { readonly all?: boolean | undefined },
|
|
116
|
+
callback: (
|
|
117
|
+
error: Error | null,
|
|
118
|
+
address: string | { address: string; family: number }[],
|
|
119
|
+
family?: number,
|
|
120
|
+
) => void,
|
|
121
|
+
) => void;
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Answers only the addresses the policy already accepted for this host name.
|
|
125
|
+
* A connection opened through it cannot reach an address a second resolution
|
|
126
|
+
* would return, which is what closes the window between the check and the
|
|
127
|
+
* socket: a name answering publicly once and privately a moment later is no
|
|
128
|
+
* longer reachable. The host name is untouched, so the Host header, the TLS
|
|
129
|
+
* server name and certificate verification stay exactly as they were.
|
|
130
|
+
*/
|
|
131
|
+
export function pinnedLookup(
|
|
132
|
+
hostname: string,
|
|
133
|
+
addresses: readonly ResolvedAddress[],
|
|
134
|
+
): PinnedLookup {
|
|
135
|
+
const expected = normalizeHost(hostname);
|
|
136
|
+
const pinned = addresses.map((entry) => ({
|
|
137
|
+
address: entry.address,
|
|
138
|
+
family: isIP(entry.address),
|
|
139
|
+
}));
|
|
140
|
+
return (asked, options, callback) => {
|
|
141
|
+
const first = pinned[0];
|
|
142
|
+
if (!first || normalizeHost(asked) !== expected) {
|
|
143
|
+
callback(new Error(`No verified address is pinned for ${asked}.`), '', 0);
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
if (options.all === true) {
|
|
147
|
+
callback(null, pinned);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
callback(null, first.address, first.family);
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/* ------------------------- end of the shared block ----------------------- */
|
|
155
|
+
|
|
156
|
+
export interface ConnectorEgressPolicy {
|
|
157
|
+
readonly allowlist: ReadonlySet<string>;
|
|
158
|
+
/** Save-time check: scheme, shape and allowlist. Throws on refusal. */
|
|
159
|
+
assertUrl(value: string): URL;
|
|
160
|
+
/**
|
|
161
|
+
* Call-time scheme check. The save-time rule already refused anything but
|
|
162
|
+
* https, so this catches a row written before that rule and a caller that
|
|
163
|
+
* reached the call path without one.
|
|
164
|
+
*/
|
|
165
|
+
assertHttps(url: URL): void;
|
|
166
|
+
/**
|
|
167
|
+
* Resolution check, repeated before every call. Throws on refusal, and
|
|
168
|
+
* answers the addresses it accepted so the connection can be pinned to
|
|
169
|
+
* exactly them.
|
|
170
|
+
*/
|
|
171
|
+
assertResolvable(hostname: string): Promise<readonly ResolvedAddress[]>;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
export interface ConnectorEgressPolicyOptions {
|
|
175
|
+
readonly allowlist?: ReadonlySet<string> | undefined;
|
|
176
|
+
readonly resolve?: HostAddressResolver | undefined;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
export function createConnectorEgressPolicy(
|
|
180
|
+
options: ConnectorEgressPolicyOptions = {},
|
|
181
|
+
): ConnectorEgressPolicy {
|
|
182
|
+
const allowlist = options.allowlist ?? new Set<string>();
|
|
183
|
+
const resolve = options.resolve ?? systemHostResolver;
|
|
184
|
+
return {
|
|
185
|
+
allowlist,
|
|
186
|
+
assertUrl(value) {
|
|
187
|
+
let url: URL;
|
|
188
|
+
try {
|
|
189
|
+
url = new URL(value);
|
|
190
|
+
} catch {
|
|
191
|
+
throw new ConnectorEgressError(
|
|
192
|
+
'CONNECTOR_URL_INVALID',
|
|
193
|
+
'The connector base URL is not a valid absolute URL.',
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
const hostname = normalizeHost(url.hostname);
|
|
197
|
+
if (
|
|
198
|
+
url.protocol !== 'https:' ||
|
|
199
|
+
url.username ||
|
|
200
|
+
url.password ||
|
|
201
|
+
!hostname ||
|
|
202
|
+
hostname === 'localhost' ||
|
|
203
|
+
hostname.endsWith('.local') ||
|
|
204
|
+
hostname.endsWith('.localhost') ||
|
|
205
|
+
isIP(hostname) !== 0
|
|
206
|
+
) {
|
|
207
|
+
throw new ConnectorEgressError(
|
|
208
|
+
'CONNECTOR_URL_BLOCKED',
|
|
209
|
+
'A connector base URL must be an https URL to a public host name.',
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
if (allowlist.size > 0 && !allowlist.has(hostname)) {
|
|
213
|
+
throw new ConnectorEgressError(
|
|
214
|
+
'CONNECTOR_HOST_NOT_ALLOWLISTED',
|
|
215
|
+
`Host ${hostname} is not on the connector host allowlist.`,
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
return url;
|
|
219
|
+
},
|
|
220
|
+
assertHttps(url) {
|
|
221
|
+
if (url.protocol !== 'https:') {
|
|
222
|
+
throw new ConnectorEgressError(
|
|
223
|
+
'CONNECTOR_URL_BLOCKED',
|
|
224
|
+
'A connector call must be an https request.',
|
|
225
|
+
);
|
|
226
|
+
}
|
|
227
|
+
},
|
|
228
|
+
async assertResolvable(hostname) {
|
|
229
|
+
const normalized = normalizeHost(hostname);
|
|
230
|
+
if (allowlist.size > 0 && !allowlist.has(normalized)) {
|
|
231
|
+
throw new ConnectorEgressError(
|
|
232
|
+
'CONNECTOR_HOST_NOT_ALLOWLISTED',
|
|
233
|
+
`Host ${normalized} is not on the connector host allowlist.`,
|
|
234
|
+
);
|
|
235
|
+
}
|
|
236
|
+
let addresses: readonly ResolvedAddress[];
|
|
237
|
+
try {
|
|
238
|
+
addresses = await resolve(normalized);
|
|
239
|
+
} catch {
|
|
240
|
+
/* A name that no longer resolves is a different operational fact from
|
|
241
|
+
one that resolves into a blocked range; the call log keeps them apart. */
|
|
242
|
+
throw new ConnectorEgressError(
|
|
243
|
+
'CONNECTOR_HOST_UNRESOLVED',
|
|
244
|
+
`Host ${normalized} could not be resolved.`,
|
|
245
|
+
);
|
|
246
|
+
}
|
|
247
|
+
/* Every returned address is checked, not just the first: a host that
|
|
248
|
+
answers with one public and one loopback address is still refused. */
|
|
249
|
+
if (
|
|
250
|
+
addresses.length === 0 ||
|
|
251
|
+
addresses.some((entry) => blockedAddress(entry.address))
|
|
252
|
+
) {
|
|
253
|
+
throw new ConnectorEgressError(
|
|
254
|
+
'CONNECTOR_HOST_RESOLVES_PRIVATE',
|
|
255
|
+
`Host ${normalized} resolves to a blocked network address.`,
|
|
256
|
+
);
|
|
257
|
+
}
|
|
258
|
+
return addresses;
|
|
259
|
+
},
|
|
260
|
+
};
|
|
261
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export { ConnectorsService } from './connectors-service.ts';
|
|
2
|
+
export type { ConnectorsServiceOptions } from './connectors-service.ts';
|
|
3
|
+
export { ConnectorCallService } from './call-service.ts';
|
|
4
|
+
export type {
|
|
5
|
+
ConnectorCallLimits,
|
|
6
|
+
ConnectorCallServiceOptions,
|
|
7
|
+
} from './call-service.ts';
|
|
8
|
+
export { ConnectorsServiceError } from './service-error.ts';
|
|
9
|
+
export {
|
|
10
|
+
DuplicateConnectorNameError,
|
|
11
|
+
type ConnectorCallFilters,
|
|
12
|
+
type ConnectorsRepository,
|
|
13
|
+
type PendingConnectorAuditEvent,
|
|
14
|
+
type StoredConnectorInstance,
|
|
15
|
+
} from './repository.ts';
|
|
16
|
+
export {
|
|
17
|
+
DatabaseConnectorsRepository,
|
|
18
|
+
migrateConnectorsDatabase,
|
|
19
|
+
} from './database-repository.ts';
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
DatabaseMigration,
|
|
3
|
+
ExistingMigrationState,
|
|
4
|
+
} from '@flowdular/sdk/database';
|
|
5
|
+
import { postgresTenantTableState } from '@flowdular/sdk/database';
|
|
6
|
+
|
|
7
|
+
/* Mirrors migrations/0001_connectors_core.up.sql byte for byte. */
|
|
8
|
+
export const CONNECTORS_MIGRATION_001 = `CREATE TABLE IF NOT EXISTS connectors_instances (
|
|
9
|
+
id TEXT PRIMARY KEY,
|
|
10
|
+
tenant_id TEXT NOT NULL,
|
|
11
|
+
definition_key TEXT NOT NULL,
|
|
12
|
+
name TEXT NOT NULL,
|
|
13
|
+
name_normalized TEXT NOT NULL,
|
|
14
|
+
base_url TEXT NOT NULL,
|
|
15
|
+
auth_kind TEXT NOT NULL CHECK (auth_kind IN ('none', 'api-key', 'bearer', 'oauth2-client-credentials')),
|
|
16
|
+
credential_key_id TEXT,
|
|
17
|
+
credential_iv TEXT,
|
|
18
|
+
credential_tag TEXT,
|
|
19
|
+
credential_ciphertext TEXT,
|
|
20
|
+
credential_fingerprint TEXT,
|
|
21
|
+
allowed_hosts_json TEXT NOT NULL,
|
|
22
|
+
allow_workflows SMALLINT NOT NULL DEFAULT 0 CHECK (allow_workflows IN (0, 1)),
|
|
23
|
+
allow_agents SMALLINT NOT NULL DEFAULT 0 CHECK (allow_agents IN (0, 1)),
|
|
24
|
+
status TEXT NOT NULL CHECK (status IN ('active', 'disabled')),
|
|
25
|
+
last_call_at BIGINT,
|
|
26
|
+
created_at BIGINT NOT NULL,
|
|
27
|
+
updated_at BIGINT NOT NULL
|
|
28
|
+
);
|
|
29
|
+
CREATE UNIQUE INDEX IF NOT EXISTS connectors_instances_name_normalized_idx
|
|
30
|
+
ON connectors_instances (tenant_id, name_normalized);
|
|
31
|
+
CREATE INDEX IF NOT EXISTS connectors_instances_tenant_status_idx
|
|
32
|
+
ON connectors_instances (tenant_id, status, name_normalized);
|
|
33
|
+
ALTER TABLE connectors_instances ENABLE ROW LEVEL SECURITY;
|
|
34
|
+
ALTER TABLE connectors_instances FORCE ROW LEVEL SECURITY;
|
|
35
|
+
CREATE POLICY connectors_instances_tenant_policy ON connectors_instances
|
|
36
|
+
USING (tenant_id = current_setting('coreloom.tenant_id', true))
|
|
37
|
+
WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
|
|
38
|
+
|
|
39
|
+
CREATE TABLE IF NOT EXISTS connectors_calls (
|
|
40
|
+
id TEXT PRIMARY KEY,
|
|
41
|
+
tenant_id TEXT NOT NULL,
|
|
42
|
+
instance_id TEXT NOT NULL,
|
|
43
|
+
operation TEXT NOT NULL,
|
|
44
|
+
caller TEXT NOT NULL CHECK (caller IN ('test', 'workflow', 'agent')),
|
|
45
|
+
caller_ref TEXT,
|
|
46
|
+
outcome TEXT NOT NULL CHECK (outcome IN ('succeeded', 'failed', 'refused')),
|
|
47
|
+
status INTEGER,
|
|
48
|
+
error_class TEXT,
|
|
49
|
+
duration_ms INTEGER NOT NULL,
|
|
50
|
+
request_bytes INTEGER NOT NULL,
|
|
51
|
+
response_bytes INTEGER NOT NULL,
|
|
52
|
+
occurred_at BIGINT NOT NULL
|
|
53
|
+
);
|
|
54
|
+
CREATE INDEX IF NOT EXISTS connectors_calls_tenant_time_idx
|
|
55
|
+
ON connectors_calls (tenant_id, occurred_at DESC, id DESC);
|
|
56
|
+
CREATE INDEX IF NOT EXISTS connectors_calls_instance_idx
|
|
57
|
+
ON connectors_calls (tenant_id, instance_id, occurred_at DESC);
|
|
58
|
+
ALTER TABLE connectors_calls ENABLE ROW LEVEL SECURITY;
|
|
59
|
+
ALTER TABLE connectors_calls FORCE ROW LEVEL SECURITY;
|
|
60
|
+
CREATE POLICY connectors_calls_tenant_policy ON connectors_calls
|
|
61
|
+
USING (tenant_id = current_setting('coreloom.tenant_id', true))
|
|
62
|
+
WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
|
|
63
|
+
|
|
64
|
+
CREATE TABLE IF NOT EXISTS connectors_audit (
|
|
65
|
+
id TEXT PRIMARY KEY,
|
|
66
|
+
tenant_id TEXT NOT NULL,
|
|
67
|
+
actor_id TEXT NOT NULL,
|
|
68
|
+
action TEXT NOT NULL CHECK (action IN ('instance.created', 'instance.updated', 'instance.consent-changed', 'instance.enabled', 'instance.disabled', 'instance.deleted')),
|
|
69
|
+
instance_id TEXT NOT NULL,
|
|
70
|
+
metadata_json TEXT NOT NULL,
|
|
71
|
+
occurred_at BIGINT NOT NULL
|
|
72
|
+
);
|
|
73
|
+
CREATE INDEX IF NOT EXISTS connectors_audit_tenant_time_idx
|
|
74
|
+
ON connectors_audit (tenant_id, occurred_at DESC, id DESC);
|
|
75
|
+
ALTER TABLE connectors_audit ENABLE ROW LEVEL SECURITY;
|
|
76
|
+
ALTER TABLE connectors_audit FORCE ROW LEVEL SECURITY;
|
|
77
|
+
CREATE POLICY connectors_audit_tenant_policy ON connectors_audit
|
|
78
|
+
USING (tenant_id = current_setting('coreloom.tenant_id', true))
|
|
79
|
+
WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
|
|
80
|
+
`;
|
|
81
|
+
|
|
82
|
+
/* Mirrors migrations/0002_connectors_call_keys.up.sql byte for byte. */
|
|
83
|
+
export const CONNECTORS_MIGRATION_002 = `CREATE TABLE IF NOT EXISTS connectors_call_keys (
|
|
84
|
+
id TEXT PRIMARY KEY,
|
|
85
|
+
tenant_id TEXT NOT NULL,
|
|
86
|
+
idempotency_key TEXT NOT NULL CHECK (length(idempotency_key) BETWEEN 8 AND 128),
|
|
87
|
+
operation_id TEXT NOT NULL CHECK (length(operation_id) BETWEEN 3 AND 200),
|
|
88
|
+
input_digest TEXT NOT NULL CHECK (length(input_digest) = 64),
|
|
89
|
+
call_id TEXT,
|
|
90
|
+
claimed_at BIGINT NOT NULL,
|
|
91
|
+
completed_at BIGINT,
|
|
92
|
+
UNIQUE (tenant_id, idempotency_key)
|
|
93
|
+
);
|
|
94
|
+
CREATE INDEX IF NOT EXISTS connectors_call_keys_tenant_claimed_idx
|
|
95
|
+
ON connectors_call_keys (tenant_id, claimed_at, id);
|
|
96
|
+
ALTER TABLE connectors_call_keys ENABLE ROW LEVEL SECURITY;
|
|
97
|
+
ALTER TABLE connectors_call_keys FORCE ROW LEVEL SECURITY;
|
|
98
|
+
CREATE POLICY connectors_call_keys_tenant_policy ON connectors_call_keys
|
|
99
|
+
USING (tenant_id = current_setting('coreloom.tenant_id', true))
|
|
100
|
+
WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
|
|
101
|
+
`;
|
|
102
|
+
|
|
103
|
+
/** Every tenant table of one migration must be adopted, or none of it is. */
|
|
104
|
+
async function combined(
|
|
105
|
+
states: readonly Promise<ExistingMigrationState>[],
|
|
106
|
+
): Promise<ExistingMigrationState> {
|
|
107
|
+
const resolved: ExistingMigrationState[] = [];
|
|
108
|
+
for (const state of states) resolved.push(await state);
|
|
109
|
+
if (resolved.every((state) => state === 'complete')) return 'complete';
|
|
110
|
+
if (resolved.every((state) => state === 'absent')) return 'absent';
|
|
111
|
+
return 'partial';
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/* Mirrors migrations/0003_connectors_rotation_inventory.up.sql byte for byte. */
|
|
115
|
+
export const CONNECTORS_MIGRATION_003 = `-- The credential key rotation has to find the instances still sealed with a
|
|
116
|
+
-- retired key before it knows whose they are, so the cross-tenant role may read
|
|
117
|
+
-- the key id of every row that holds an envelope and nothing else: the nonce,
|
|
118
|
+
-- the tag, the ciphertext and the fingerprint stay unreadable on this
|
|
119
|
+
-- connection, and every row it re-seals is read again under the workspace that
|
|
120
|
+
-- row named. PostgreSQL checks column privileges in WHERE too, so the key id is
|
|
121
|
+
-- part of the grant.
|
|
122
|
+
DO $$
|
|
123
|
+
BEGIN
|
|
124
|
+
IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'coreloom_background') THEN
|
|
125
|
+
RAISE EXCEPTION 'The coreloom_background role must exist before this migration.';
|
|
126
|
+
END IF;
|
|
127
|
+
END
|
|
128
|
+
$$;
|
|
129
|
+
CREATE POLICY connectors_instances_background_policy ON connectors_instances
|
|
130
|
+
FOR SELECT TO coreloom_background
|
|
131
|
+
USING (credential_key_id IS NOT NULL);
|
|
132
|
+
REVOKE SELECT ON connectors_instances FROM coreloom_background;
|
|
133
|
+
GRANT SELECT (tenant_id, credential_key_id) ON connectors_instances TO coreloom_background;
|
|
134
|
+
`;
|
|
135
|
+
|
|
136
|
+
export const databaseMigrations: readonly DatabaseMigration[] = [
|
|
137
|
+
{
|
|
138
|
+
id: '0001_connectors_core',
|
|
139
|
+
sql: { postgresql: CONNECTORS_MIGRATION_001 },
|
|
140
|
+
inspectExisting: (database) =>
|
|
141
|
+
combined([
|
|
142
|
+
postgresTenantTableState(
|
|
143
|
+
database,
|
|
144
|
+
'connectors_instances',
|
|
145
|
+
'connectors_instances_tenant_policy',
|
|
146
|
+
[
|
|
147
|
+
() =>
|
|
148
|
+
database.schema.hasIndex(
|
|
149
|
+
'connectors_instances_name_normalized_idx',
|
|
150
|
+
),
|
|
151
|
+
() =>
|
|
152
|
+
database.schema.hasIndex(
|
|
153
|
+
'connectors_instances_tenant_status_idx',
|
|
154
|
+
),
|
|
155
|
+
],
|
|
156
|
+
),
|
|
157
|
+
postgresTenantTableState(
|
|
158
|
+
database,
|
|
159
|
+
'connectors_calls',
|
|
160
|
+
'connectors_calls_tenant_policy',
|
|
161
|
+
[
|
|
162
|
+
() => database.schema.hasIndex('connectors_calls_tenant_time_idx'),
|
|
163
|
+
() => database.schema.hasIndex('connectors_calls_instance_idx'),
|
|
164
|
+
],
|
|
165
|
+
),
|
|
166
|
+
postgresTenantTableState(
|
|
167
|
+
database,
|
|
168
|
+
'connectors_audit',
|
|
169
|
+
'connectors_audit_tenant_policy',
|
|
170
|
+
[() => database.schema.hasIndex('connectors_audit_tenant_time_idx')],
|
|
171
|
+
),
|
|
172
|
+
]),
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
id: '0002_connectors_call_keys',
|
|
176
|
+
sql: { postgresql: CONNECTORS_MIGRATION_002 },
|
|
177
|
+
inspectExisting: (database) =>
|
|
178
|
+
postgresTenantTableState(
|
|
179
|
+
database,
|
|
180
|
+
'connectors_call_keys',
|
|
181
|
+
'connectors_call_keys_tenant_policy',
|
|
182
|
+
[
|
|
183
|
+
() =>
|
|
184
|
+
database.schema.hasIndex('connectors_call_keys_tenant_claimed_idx'),
|
|
185
|
+
],
|
|
186
|
+
),
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
id: '0003_connectors_rotation_inventory',
|
|
190
|
+
sql: { postgresql: CONNECTORS_MIGRATION_003 },
|
|
191
|
+
/* A policy and a column grant leave no schema object behind, so the
|
|
192
|
+
privilege itself is what proves this migration ran. */
|
|
193
|
+
inspectExisting: async (database) => {
|
|
194
|
+
const result = await database.query<{ granted: boolean }>({
|
|
195
|
+
text: `SELECT CASE WHEN to_regclass('connectors_instances') IS NOT NULL THEN
|
|
196
|
+
has_column_privilege('coreloom_background', 'connectors_instances', 'credential_key_id', 'SELECT')
|
|
197
|
+
ELSE false END AS granted`,
|
|
198
|
+
});
|
|
199
|
+
return result.rows[0]?.granted === true ? 'complete' : 'absent';
|
|
200
|
+
},
|
|
201
|
+
},
|
|
202
|
+
];
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
ConnectorAuditEvent,
|
|
3
|
+
ConnectorCall,
|
|
4
|
+
ConnectorCallListRow,
|
|
5
|
+
ConnectorCallOutcome,
|
|
6
|
+
ConnectorInstance,
|
|
7
|
+
ConnectorInstanceStatus,
|
|
8
|
+
} from '../domain/types.ts';
|
|
9
|
+
import type { SealedCredential } from './credential-vault.ts';
|
|
10
|
+
|
|
11
|
+
export class DuplicateConnectorNameError extends Error {
|
|
12
|
+
constructor() {
|
|
13
|
+
super('A connector instance with this name already exists in the tenant.');
|
|
14
|
+
this.name = 'DuplicateConnectorNameError';
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** The instance plus the sealed credential. Only the call path reads this. */
|
|
19
|
+
export interface StoredConnectorInstance extends ConnectorInstance {
|
|
20
|
+
readonly credential: SealedCredential | null;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface ConnectorCallFilters {
|
|
24
|
+
readonly outcome?: ConnectorCallOutcome | undefined;
|
|
25
|
+
readonly instanceId?: string | undefined;
|
|
26
|
+
/** A term the operation must contain, case-insensitive. */
|
|
27
|
+
readonly search?: string | undefined;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface ConnectorInstanceFilters {
|
|
31
|
+
readonly status?: ConnectorInstanceStatus | undefined;
|
|
32
|
+
readonly definitionKey?: string | undefined;
|
|
33
|
+
/** A term the name or the base URL must contain, case-insensitive. */
|
|
34
|
+
readonly search?: string | undefined;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export type ConnectorListDirection = 'asc' | 'desc';
|
|
38
|
+
|
|
39
|
+
/** The keyset the instance list orders by: the normalized name, then the id. */
|
|
40
|
+
export interface ConnectorInstanceKeyset {
|
|
41
|
+
readonly name: string;
|
|
42
|
+
readonly id: string;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** One keyset page of a list screen; `after` is the last row the caller saw. */
|
|
46
|
+
export interface ConnectorPageRequest<Keyset> {
|
|
47
|
+
readonly direction: ConnectorListDirection;
|
|
48
|
+
readonly after: Keyset | null;
|
|
49
|
+
readonly limit: number;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Written in the same transaction as the change it describes. */
|
|
53
|
+
export type PendingConnectorAuditEvent = Omit<ConnectorAuditEvent, 'id'>;
|
|
54
|
+
|
|
55
|
+
/** What one attempt wants to bind an idempotency key to. */
|
|
56
|
+
export interface ConnectorCallKeyClaim {
|
|
57
|
+
/** `<instanceId>:<operation>`; a key is never reused across operations. */
|
|
58
|
+
readonly operationId: string;
|
|
59
|
+
readonly inputDigest: string;
|
|
60
|
+
readonly claimedAt: number;
|
|
61
|
+
/** A claim older than this was abandoned and may be taken over. */
|
|
62
|
+
readonly staleBefore: number;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* `claimed` means this attempt owns the key and must make the call; `replay`
|
|
67
|
+
* names the call a previous attempt already produced; `in-flight` means another
|
|
68
|
+
* attempt still holds the claim; `conflict` means the key is bound to a
|
|
69
|
+
* different operation or input.
|
|
70
|
+
*/
|
|
71
|
+
export type ConnectorCallKeyDecision =
|
|
72
|
+
| { readonly state: 'claimed' }
|
|
73
|
+
| { readonly state: 'in-flight' }
|
|
74
|
+
| { readonly state: 'conflict' }
|
|
75
|
+
| { readonly state: 'replay'; readonly callId: string };
|
|
76
|
+
|
|
77
|
+
/** One keyset page of an export walk. */
|
|
78
|
+
export interface ConnectorExportCursor {
|
|
79
|
+
readonly occurredAt: number;
|
|
80
|
+
readonly id: string;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/** The database-agnostic business port. No driver type crosses it. */
|
|
84
|
+
export interface ConnectorsRepository {
|
|
85
|
+
listInstances(
|
|
86
|
+
tenantId: string,
|
|
87
|
+
filters: ConnectorInstanceFilters,
|
|
88
|
+
page: ConnectorPageRequest<ConnectorInstanceKeyset>,
|
|
89
|
+
): Promise<readonly ConnectorInstance[]>;
|
|
90
|
+
findInstance(
|
|
91
|
+
tenantId: string,
|
|
92
|
+
id: string,
|
|
93
|
+
): Promise<StoredConnectorInstance | null>;
|
|
94
|
+
createInstance(
|
|
95
|
+
record: StoredConnectorInstance,
|
|
96
|
+
audit: PendingConnectorAuditEvent,
|
|
97
|
+
): Promise<ConnectorInstance>;
|
|
98
|
+
updateInstance(
|
|
99
|
+
record: StoredConnectorInstance,
|
|
100
|
+
audit: PendingConnectorAuditEvent,
|
|
101
|
+
): Promise<ConnectorInstance>;
|
|
102
|
+
setConsent(
|
|
103
|
+
tenantId: string,
|
|
104
|
+
id: string,
|
|
105
|
+
consent: {
|
|
106
|
+
readonly allowWorkflows: boolean;
|
|
107
|
+
readonly allowAgents: boolean;
|
|
108
|
+
readonly updatedAt: number;
|
|
109
|
+
},
|
|
110
|
+
audit: PendingConnectorAuditEvent,
|
|
111
|
+
): Promise<ConnectorInstance | null>;
|
|
112
|
+
setStatus(
|
|
113
|
+
tenantId: string,
|
|
114
|
+
id: string,
|
|
115
|
+
status: ConnectorInstanceStatus,
|
|
116
|
+
updatedAt: number,
|
|
117
|
+
audit: PendingConnectorAuditEvent,
|
|
118
|
+
): Promise<ConnectorInstance | null>;
|
|
119
|
+
/** Refuses an instance that is not disabled; the call log is left behind. */
|
|
120
|
+
deleteInstance(
|
|
121
|
+
tenantId: string,
|
|
122
|
+
id: string,
|
|
123
|
+
audit: PendingConnectorAuditEvent,
|
|
124
|
+
): Promise<boolean>;
|
|
125
|
+
/**
|
|
126
|
+
* Binds an idempotency key to this workspace before the call is made. The
|
|
127
|
+
* caller makes the call only for `claimed`.
|
|
128
|
+
*/
|
|
129
|
+
claimCallKey(
|
|
130
|
+
tenantId: string,
|
|
131
|
+
key: string,
|
|
132
|
+
claim: ConnectorCallKeyClaim,
|
|
133
|
+
): Promise<ConnectorCallKeyDecision>;
|
|
134
|
+
findCall(tenantId: string, id: string): Promise<ConnectorCall | null>;
|
|
135
|
+
/**
|
|
136
|
+
* Appends the call, moves the instance's last call time and binds the
|
|
137
|
+
* claimed idempotency key to it, in one write.
|
|
138
|
+
*/
|
|
139
|
+
recordCall(call: ConnectorCall, idempotencyKey: string | null): Promise<void>;
|
|
140
|
+
/**
|
|
141
|
+
* Removes at most `limit` calls older than `before`, together with the
|
|
142
|
+
* idempotency keys claimed before it. A key is always claimed no later than
|
|
143
|
+
* its call, so this never leaves a key pointing at a call that is gone.
|
|
144
|
+
*/
|
|
145
|
+
deleteCallsBefore(
|
|
146
|
+
tenantId: string,
|
|
147
|
+
before: number,
|
|
148
|
+
limit: number,
|
|
149
|
+
): Promise<number>;
|
|
150
|
+
exportCallsPage(
|
|
151
|
+
tenantId: string,
|
|
152
|
+
after: ConnectorExportCursor | null,
|
|
153
|
+
limit: number,
|
|
154
|
+
): Promise<readonly ConnectorCall[]>;
|
|
155
|
+
exportAuditPage(
|
|
156
|
+
tenantId: string,
|
|
157
|
+
after: ConnectorExportCursor | null,
|
|
158
|
+
limit: number,
|
|
159
|
+
): Promise<readonly ConnectorAuditEvent[]>;
|
|
160
|
+
exportInstancesPage(
|
|
161
|
+
tenantId: string,
|
|
162
|
+
after: ConnectorExportCursor | null,
|
|
163
|
+
limit: number,
|
|
164
|
+
): Promise<readonly ConnectorInstance[]>;
|
|
165
|
+
listCalls(
|
|
166
|
+
tenantId: string,
|
|
167
|
+
filters: ConnectorCallFilters,
|
|
168
|
+
page: ConnectorPageRequest<ConnectorExportCursor>,
|
|
169
|
+
): Promise<readonly ConnectorCallListRow[]>;
|
|
170
|
+
listAudit(
|
|
171
|
+
tenantId: string,
|
|
172
|
+
instanceId: string,
|
|
173
|
+
limit: number,
|
|
174
|
+
): Promise<readonly ConnectorAuditEvent[]>;
|
|
175
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export class ConnectorsServiceError extends Error {
|
|
2
|
+
constructor(
|
|
3
|
+
readonly code: string,
|
|
4
|
+
message: string,
|
|
5
|
+
readonly status = 400,
|
|
6
|
+
) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.name = 'ConnectorsServiceError';
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function bounded(
|
|
13
|
+
value: string,
|
|
14
|
+
field: string,
|
|
15
|
+
minimum: number,
|
|
16
|
+
maximum: number,
|
|
17
|
+
): string {
|
|
18
|
+
const normalized = value.trim();
|
|
19
|
+
if (normalized.length < minimum || normalized.length > maximum) {
|
|
20
|
+
throw new ConnectorsServiceError(
|
|
21
|
+
'INVALID_INPUT',
|
|
22
|
+
`${field} must contain between ${minimum} and ${maximum} characters.`,
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
if (/[\u0000-\u001f\u007f]/.test(normalized)) {
|
|
26
|
+
throw new ConnectorsServiceError(
|
|
27
|
+
'INVALID_INPUT',
|
|
28
|
+
`${field} contains an unsupported character.`,
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
return normalized;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function oneOf<T extends string>(
|
|
35
|
+
value: string,
|
|
36
|
+
field: string,
|
|
37
|
+
allowed: readonly T[],
|
|
38
|
+
): T {
|
|
39
|
+
if (!(allowed as readonly string[]).includes(value)) {
|
|
40
|
+
throw new ConnectorsServiceError(
|
|
41
|
+
'INVALID_INPUT',
|
|
42
|
+
`${field} must be one of: ${allowed.join(', ')}.`,
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
return value as T;
|
|
46
|
+
}
|