@flowdular/sdk 0.2.4 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.ai/agents/sandbox/business-manager.md +5 -1
- package/.ai/blueprints/author-spec/README.md +1 -1
- package/.ai/blueprints/author-spec/spec-requirements.yaml +44 -0
- package/.ai/blueprints/author-spec/steps.yaml +5 -5
- package/.ai/blueprints/author-spec/templates/module.yaml +99 -3
- package/.ai/blueprints/edit-module/gates.yaml +4 -0
- package/.ai/blueprints/edit-module/required-files.yaml +9 -0
- package/.ai/blueprints/new-module/gates.yaml +4 -0
- package/.ai/blueprints/new-module/spec-requirements.yaml +2 -2
- package/.ai/blueprints/release/gates.yaml +4 -0
- package/.ai/platform-capabilities.md +128 -0
- package/.ai/policies/capabilities.yaml +100 -0
- package/.ai/policies/path-ownership.yaml +5 -2
- package/.ai/policies/task-budgets.yaml +5 -3
- package/.ai/references/catalog/module.json +4 -4
- package/.ai/references/catalog/package.json +2 -2
- package/.ai/references/catalog/spec/module.yaml +5 -3
- package/.ai/references/catalog/src/platform.ts +2 -0
- package/.ai/references/catalog/src/services/catalog-service.ts +89 -1
- package/.ai/references/catalog/src/services/data-classes.ts +47 -0
- package/.ai/references/catalog/src/services/database-repository.ts +98 -1
- package/.ai/references/catalog/src/services/repository.ts +22 -1
- package/.ai/references/catalog/tests/data-classes.test.ts +157 -0
- package/.ai/references/catalog.provenance.json +12 -10
- package/.ai/skills/README.md +10 -0
- package/.ai/skills/agent-tool-design/SKILL.md +1 -2
- package/.ai/skills/auth-security-review/SKILL.md +1 -1
- package/.ai/skills/business-agent-design/SKILL.md +0 -1
- package/.ai/skills/deploy-operate/SKILL.md +114 -0
- package/.ai/skills/module-new/SKILL.md +29 -3
- package/.ai/skills/module-update/SKILL.md +9 -3
- package/.ai/skills/perf-audit/SKILL.md +0 -1
- package/.ai/skills/release-eject-pr/SKILL.md +0 -1
- package/.ai/skills/spec-interview/SKILL.md +120 -0
- package/.ai/skills/test-hardening/SKILL.md +1 -0
- package/.ai/skills/ux-design/SKILL.md +34 -3
- package/.ai/skills/variables/SKILL.md +0 -2
- package/.ai/skills/workflow-development/SKILL.md +0 -1
- package/AGENTS.md +4 -0
- package/docs/agent-contract.md +2 -2
- package/docs/design-system.md +185 -31
- package/modules/access/migrations/0001_access_core.down.sql +1 -0
- package/modules/access/migrations/0001_access_core.up.sql +28 -0
- package/modules/access/migrations/README.md +3 -0
- package/modules/access/module.json +33 -0
- package/modules/access/package.json +43 -0
- package/modules/access/spec/module.yaml +225 -0
- package/modules/access/src/acl/permissions.ts +6 -0
- package/modules/access/src/api/endpoints.ts +244 -0
- package/modules/access/src/client/ActivityView.tsrx +245 -0
- package/modules/access/src/client/AttestationsView.tsrx +176 -0
- package/modules/access/src/client/ReviewView.tsrx +586 -0
- package/modules/access/src/client/api.ts +132 -0
- package/modules/access/src/client/contribution.tsrx +41 -0
- package/modules/access/src/client/index.ts +41 -0
- package/modules/access/src/client/navigation.ts +57 -0
- package/modules/access/src/client/presentation.ts +69 -0
- package/modules/access/src/client/state.ts +72 -0
- package/modules/access/src/domain/types.ts +189 -0
- package/modules/access/src/index.ts +38 -0
- package/modules/access/src/platform.ts +60 -0
- package/modules/access/src/server/index.ts +42 -0
- package/modules/access/src/server/runtime.ts +105 -0
- package/modules/access/src/services/access-service.ts +298 -0
- package/modules/access/src/services/audit-window.ts +78 -0
- package/modules/access/src/services/auth-directory.ts +72 -0
- package/modules/access/src/services/changes.ts +91 -0
- package/modules/access/src/services/data-classes.ts +28 -0
- package/modules/access/src/services/database-repository.ts +185 -0
- package/modules/access/src/services/directory.ts +102 -0
- package/modules/access/src/services/index.ts +33 -0
- package/modules/access/src/services/list-exports.ts +150 -0
- package/modules/access/src/services/migration.ts +54 -0
- package/modules/access/src/services/repository.ts +30 -0
- package/modules/access/src/services/review.ts +178 -0
- package/modules/access/translations/en.json +155 -0
- package/modules/access/translations/pl.json +155 -0
- package/modules/agents/migrations/0022_credential_rotation_inventory.down.sql +2 -0
- package/modules/agents/migrations/0022_credential_rotation_inventory.up.sql +7 -0
- package/modules/agents/migrations/0023_agents_retention_indexes.down.sql +2 -0
- package/modules/agents/migrations/0023_agents_retention_indexes.up.sql +9 -0
- package/modules/agents/migrations/0024_agent_meter_refusals.down.sql +3 -0
- package/modules/agents/migrations/0024_agent_meter_refusals.up.sql +22 -0
- package/modules/agents/migrations/0025_agent_list_indexes.down.sql +3 -0
- package/modules/agents/migrations/0025_agent_list_indexes.up.sql +11 -0
- package/modules/agents/module.json +30 -4
- package/modules/agents/package.json +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/README.md +3 -0
- package/modules/approvals/module.json +34 -0
- package/modules/approvals/package.json +43 -0
- package/modules/approvals/spec/module.yaml +318 -0
- package/modules/approvals/src/acl/permissions.ts +7 -0
- package/modules/approvals/src/api/endpoints.ts +457 -0
- package/modules/approvals/src/client/ApprovalRequestDrawer.tsrx +138 -0
- package/modules/approvals/src/client/ApprovalsView.tsrx +562 -0
- package/modules/approvals/src/client/PendingCountWidget.tsrx +52 -0
- package/modules/approvals/src/client/api.ts +203 -0
- package/modules/approvals/src/client/approvals.css +51 -0
- package/modules/approvals/src/client/contribution.tsrx +44 -0
- package/modules/approvals/src/client/index.ts +26 -0
- package/modules/approvals/src/client/navigation.ts +39 -0
- package/modules/approvals/src/client/pending-count.ts +26 -0
- package/modules/approvals/src/client/presentation.ts +52 -0
- package/modules/approvals/src/client/state.ts +141 -0
- package/modules/approvals/src/domain/capability.ts +95 -0
- package/modules/approvals/src/domain/types.ts +154 -0
- package/modules/approvals/src/index.ts +52 -0
- package/modules/approvals/src/platform.ts +128 -0
- package/modules/approvals/src/server/index.ts +42 -0
- package/modules/approvals/src/server/runtime.ts +181 -0
- package/modules/approvals/src/services/approvals-service.ts +557 -0
- package/modules/approvals/src/services/callbacks.ts +75 -0
- package/modules/approvals/src/services/data-classes.ts +167 -0
- package/modules/approvals/src/services/database-repository.ts +724 -0
- package/modules/approvals/src/services/eligibility.ts +121 -0
- package/modules/approvals/src/services/expiry-runner.ts +81 -0
- package/modules/approvals/src/services/index.ts +31 -0
- package/modules/approvals/src/services/migration.ts +222 -0
- package/modules/approvals/src/services/notifications.ts +95 -0
- package/modules/approvals/src/services/repository.ts +161 -0
- package/modules/approvals/src/services/service-error.ts +70 -0
- package/modules/approvals/src/settings.ts +102 -0
- package/modules/approvals/translations/en.json +104 -0
- package/modules/approvals/translations/pl.json +104 -0
- package/modules/audit/migrations/0001_audit_core.down.sql +8 -0
- package/modules/audit/migrations/0001_audit_core.up.sql +107 -0
- package/modules/audit/migrations/0002_audit_sweep_routing_role.down.sql +2 -0
- package/modules/audit/migrations/0002_audit_sweep_routing_role.up.sql +21 -0
- package/modules/audit/migrations/0003_audit_export_request.down.sql +12 -0
- package/modules/audit/migrations/0003_audit_export_request.up.sql +40 -0
- package/modules/audit/migrations/0004_audit_hold_seal_erasure.down.sql +17 -0
- package/modules/audit/migrations/0004_audit_hold_seal_erasure.up.sql +192 -0
- package/modules/audit/migrations/0005_audit_event_format.down.sql +17 -0
- package/modules/audit/migrations/0005_audit_event_format.up.sql +60 -0
- package/modules/audit/migrations/0006_audit_own_class_walks.down.sql +3 -0
- package/modules/audit/migrations/0006_audit_own_class_walks.up.sql +14 -0
- package/modules/audit/migrations/README.md +3 -0
- package/modules/audit/module.json +32 -0
- package/modules/audit/package.json +49 -0
- package/modules/audit/spec/module.yaml +809 -0
- package/modules/audit/src/acl/permissions.ts +7 -0
- package/modules/audit/src/api/endpoints.ts +315 -0
- package/modules/audit/src/cli/commands.json +95 -0
- package/modules/audit/src/cli/index.ts +658 -0
- package/modules/audit/src/client/DataClassesView.tsrx +420 -0
- package/modules/audit/src/client/ExportsView.tsrx +256 -0
- package/modules/audit/src/client/HoldsView.tsrx +604 -0
- package/modules/audit/src/client/SweepsView.tsrx +251 -0
- package/modules/audit/src/client/api.ts +185 -0
- package/modules/audit/src/client/contribution.tsrx +52 -0
- package/modules/audit/src/client/index.ts +23 -0
- package/modules/audit/src/client/navigation.ts +74 -0
- package/modules/audit/src/client/presentation.ts +105 -0
- package/modules/audit/src/client/state.ts +86 -0
- package/modules/audit/src/domain/data-classes.ts +16 -0
- package/modules/audit/src/domain/types.ts +339 -0
- package/modules/audit/src/index.ts +76 -0
- package/modules/audit/src/platform.ts +44 -0
- package/modules/audit/src/server/index.ts +177 -0
- package/modules/audit/src/server/runtime.ts +303 -0
- package/modules/audit/src/services/anchor-key.ts +143 -0
- package/modules/audit/src/services/anchor-rotation.ts +147 -0
- package/modules/audit/src/services/audit-runners.ts +278 -0
- package/modules/audit/src/services/backup-guard.ts +95 -0
- package/modules/audit/src/services/database-repository.ts +1946 -0
- package/modules/audit/src/services/declared-classes.ts +64 -0
- package/modules/audit/src/services/erasure-port.ts +126 -0
- package/modules/audit/src/services/erasure-service.ts +770 -0
- package/modules/audit/src/services/export-directory.ts +106 -0
- package/modules/audit/src/services/export-service.ts +714 -0
- package/modules/audit/src/services/hold-service.ts +295 -0
- package/modules/audit/src/services/index.ts +17 -0
- package/modules/audit/src/services/migration.ts +658 -0
- package/modules/audit/src/services/own-classes.ts +318 -0
- package/modules/audit/src/services/platform-version.ts +23 -0
- package/modules/audit/src/services/repository.ts +495 -0
- package/modules/audit/src/services/retention-service.ts +191 -0
- package/modules/audit/src/services/seal-service.ts +769 -0
- package/modules/audit/src/services/service-error.ts +61 -0
- package/modules/audit/src/services/subject-keys.ts +90 -0
- package/modules/audit/src/services/sweep-service.ts +298 -0
- package/modules/audit/src/services/zip.ts +217 -0
- package/modules/audit/src/settings.ts +69 -0
- package/modules/audit/translations/en.json +210 -0
- package/modules/audit/translations/pl.json +210 -0
- package/modules/auth/README.md +77 -29
- package/modules/auth/migrations/0016_external_identities.up.sql +16 -0
- package/modules/auth/migrations/0017_mfa_key_id.up.sql +8 -0
- package/modules/auth/migrations/0018_retire_bundled_module_scopes.up.sql +29 -0
- package/modules/auth/migrations/0019_notifications_member_scopes.up.sql +44 -0
- package/modules/auth/migrations/0020_identity_providers.up.sql +61 -0
- package/modules/auth/migrations/0021_membership_status.up.sql +19 -0
- package/modules/auth/migrations/0022_auth_provider_scopes.up.sql +45 -0
- package/modules/auth/migrations/0023_enterprise_module_scopes.down.sql +19 -0
- package/modules/auth/migrations/0023_enterprise_module_scopes.up.sql +71 -0
- package/modules/auth/migrations/0024_approvals_member_scopes.down.sql +22 -0
- package/modules/auth/migrations/0024_approvals_member_scopes.up.sql +48 -0
- package/modules/auth/migrations/0025_audit_holds_owner_scope.down.sql +21 -0
- package/modules/auth/migrations/0025_audit_holds_owner_scope.up.sql +47 -0
- package/modules/auth/migrations/0026_auth_export_keyset_indexes.down.sql +6 -0
- package/modules/auth/migrations/0026_auth_export_keyset_indexes.up.sql +15 -0
- package/modules/auth/migrations/0027_workflow_automation_profile_scopes.down.sql +34 -0
- package/modules/auth/migrations/0027_workflow_automation_profile_scopes.up.sql +72 -0
- package/modules/auth/migrations/0028_auth_member_search_prefix_indexes.down.sql +6 -0
- package/modules/auth/migrations/0028_auth_member_search_prefix_indexes.up.sql +21 -0
- package/modules/auth/migrations/0029_reports_exports_access_scopes.down.sql +22 -0
- package/modules/auth/migrations/0029_reports_exports_access_scopes.up.sql +56 -0
- package/modules/auth/migrations/0030_auth_membership_keyset_index.down.sql +4 -0
- package/modules/auth/migrations/0030_auth_membership_keyset_index.up.sql +10 -0
- package/modules/auth/migrations/0031_membership_scope_backfills_under_rls.down.sql +4 -0
- package/modules/auth/migrations/0031_membership_scope_backfills_under_rls.up.sql +31 -0
- package/modules/auth/migrations/0032_audit_actor_service.down.sql +9 -0
- package/modules/auth/migrations/0032_audit_actor_service.up.sql +10 -0
- package/modules/auth/migrations/0033_auth_account_keyset_indexes.down.sql +5 -0
- package/modules/auth/migrations/0033_auth_account_keyset_indexes.up.sql +23 -0
- package/modules/auth/module.json +3 -3
- package/modules/auth/package.json +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/README.md +3 -0
- package/modules/connectors/module.json +28 -0
- package/modules/{automations-workflows-integration → connectors}/package.json +27 -26
- package/modules/connectors/spec/module.yaml +447 -0
- package/modules/connectors/src/acl/permissions.ts +6 -0
- package/modules/connectors/src/agent/tools.ts +180 -0
- package/modules/connectors/src/api/endpoints.ts +572 -0
- package/modules/connectors/src/client/ConnectorCallsView.tsrx +358 -0
- package/modules/connectors/src/client/ConnectorForm.tsrx +424 -0
- package/modules/connectors/src/client/ConnectorsView.tsrx +711 -0
- package/modules/connectors/src/client/api.ts +281 -0
- package/modules/connectors/src/client/consent.ts +48 -0
- package/modules/connectors/src/client/contribution.tsrx +37 -0
- package/modules/connectors/src/client/index.ts +22 -0
- package/modules/connectors/src/client/navigation.ts +42 -0
- package/modules/connectors/src/client/presentation.ts +38 -0
- package/modules/connectors/src/client/state.ts +175 -0
- package/modules/connectors/src/domain/calls.ts +70 -0
- package/modules/connectors/src/domain/definitions.ts +190 -0
- package/modules/connectors/src/domain/http-json.ts +68 -0
- package/modules/connectors/src/domain/types.ts +185 -0
- package/modules/connectors/src/index.ts +64 -0
- package/modules/connectors/src/platform.ts +56 -0
- package/modules/connectors/src/server/index.ts +66 -0
- package/modules/connectors/src/server/runtime.ts +163 -0
- package/modules/connectors/src/services/call-service.ts +903 -0
- package/modules/connectors/src/services/connectors-service.ts +653 -0
- package/modules/connectors/src/services/credential-vault.ts +188 -0
- package/modules/connectors/src/services/data-classes.ts +158 -0
- package/modules/connectors/src/services/database-repository.ts +897 -0
- package/modules/connectors/src/services/egress.ts +261 -0
- package/modules/connectors/src/services/index.ts +19 -0
- package/modules/connectors/src/services/migration.ts +166 -0
- package/modules/connectors/src/services/repository.ts +175 -0
- package/modules/connectors/src/services/service-error.ts +46 -0
- package/modules/connectors/src/settings.ts +69 -0
- package/modules/connectors/translations/en.json +191 -0
- package/modules/connectors/translations/pl.json +191 -0
- package/modules/directory/migrations/0001_directory_core.down.sql +5 -0
- package/modules/directory/migrations/0001_directory_core.up.sql +111 -0
- package/modules/directory/migrations/README.md +3 -0
- package/modules/directory/module.json +27 -0
- package/modules/directory/package.json +46 -0
- package/modules/directory/spec/module.yaml +351 -0
- package/modules/directory/src/acl/permissions.ts +7 -0
- package/modules/directory/src/api/endpoints.ts +478 -0
- package/modules/directory/src/api/scim-endpoints.ts +516 -0
- package/modules/directory/src/client/GroupMappingsView.tsrx +430 -0
- package/modules/directory/src/client/ProvisioningLogView.tsrx +248 -0
- package/modules/directory/src/client/ScimTokensView.tsrx +587 -0
- package/modules/directory/src/client/api.ts +222 -0
- package/modules/directory/src/client/contribution.tsrx +46 -0
- package/modules/directory/src/client/index.ts +22 -0
- package/modules/directory/src/client/navigation.ts +57 -0
- package/modules/directory/src/client/presentation.ts +143 -0
- package/modules/directory/src/client/state.ts +173 -0
- package/modules/directory/src/domain/scim.ts +346 -0
- package/modules/directory/src/domain/types.ts +166 -0
- package/modules/directory/src/index.ts +44 -0
- package/modules/directory/src/platform.ts +43 -0
- package/modules/directory/src/server/index.ts +17 -0
- package/modules/directory/src/server/runtime.ts +124 -0
- package/modules/directory/src/services/auth-port.ts +127 -0
- package/modules/directory/src/services/data-classes.ts +41 -0
- package/modules/directory/src/services/database-repository.ts +1067 -0
- package/modules/directory/src/services/directory-service.ts +311 -0
- package/modules/directory/src/services/index.ts +43 -0
- package/modules/directory/src/services/migration.ts +146 -0
- package/modules/directory/src/services/provisioning-service.ts +1420 -0
- package/modules/directory/src/services/rate-limiter.ts +103 -0
- package/modules/directory/src/services/repository.ts +208 -0
- package/modules/directory/src/services/service-error.ts +42 -0
- package/modules/directory/src/services/token-service.ts +215 -0
- package/modules/directory/src/settings.ts +86 -0
- package/modules/directory/translations/en.json +185 -0
- package/modules/directory/translations/pl.json +185 -0
- package/modules/documents/migrations/0001_documents_core.down.sql +1 -0
- package/modules/documents/migrations/0001_documents_core.up.sql +35 -0
- package/modules/documents/migrations/0002_documents_files_page.down.sql +1 -0
- package/modules/documents/migrations/0002_documents_files_page.up.sql +6 -0
- package/modules/documents/migrations/README.md +3 -0
- package/modules/documents/module.json +28 -0
- package/modules/documents/package.json +49 -0
- package/modules/documents/spec/module.yaml +247 -0
- package/modules/documents/src/acl/permissions.ts +6 -0
- package/modules/documents/src/api/endpoints.ts +401 -0
- package/modules/documents/src/client/DocumentUploader.tsrx +148 -0
- package/modules/documents/src/client/DocumentsView.tsrx +540 -0
- package/modules/documents/src/client/api.ts +209 -0
- package/modules/documents/src/client/contribution.tsrx +29 -0
- package/modules/documents/src/client/download.ts +70 -0
- package/modules/documents/src/client/index.ts +22 -0
- package/modules/documents/src/client/navigation.ts +25 -0
- package/modules/documents/src/client/presentation.ts +110 -0
- package/modules/documents/src/client/state.ts +117 -0
- package/modules/documents/src/domain/attachments.ts +84 -0
- package/modules/documents/src/domain/types.ts +80 -0
- package/modules/documents/src/index.ts +46 -0
- package/modules/documents/src/platform.ts +61 -0
- package/modules/documents/src/server/index.ts +30 -0
- package/modules/documents/src/server/runtime.ts +107 -0
- package/modules/documents/src/services/attachments.ts +39 -0
- package/modules/documents/src/services/data-classes.ts +25 -0
- package/modules/documents/src/services/database-repository.ts +259 -0
- package/modules/documents/src/services/documents-service.ts +586 -0
- package/modules/documents/src/services/index.ts +18 -0
- package/modules/documents/src/services/migration.ts +82 -0
- package/modules/documents/src/services/repository.ts +48 -0
- package/modules/documents/src/settings.ts +107 -0
- package/modules/documents/translations/en.json +111 -0
- package/modules/documents/translations/pl.json +111 -0
- package/modules/exports/migrations/0001_exports_core.down.sql +2 -0
- package/modules/exports/migrations/0001_exports_core.up.sql +28 -0
- package/modules/exports/migrations/0002_exports_job_routing_role.down.sql +4 -0
- package/modules/exports/migrations/0002_exports_job_routing_role.up.sql +21 -0
- package/modules/exports/migrations/README.md +3 -0
- package/modules/exports/module.json +28 -0
- package/modules/exports/package.json +44 -0
- package/modules/exports/spec/module.yaml +229 -0
- package/modules/exports/src/acl/permissions.ts +6 -0
- package/modules/exports/src/api/endpoints.ts +211 -0
- package/modules/exports/src/client/ExportsView.tsrx +327 -0
- package/modules/exports/src/client/api.ts +133 -0
- package/modules/exports/src/client/contribution.tsrx +31 -0
- package/modules/exports/src/client/index.ts +20 -0
- package/modules/exports/src/client/navigation.ts +25 -0
- package/modules/exports/src/client/presentation.ts +53 -0
- package/modules/exports/src/client/state.ts +56 -0
- package/modules/exports/src/domain/lists.ts +29 -0
- package/modules/exports/src/domain/types.ts +120 -0
- package/modules/exports/src/index.ts +41 -0
- package/modules/exports/src/platform.ts +80 -0
- package/modules/exports/src/server/index.ts +51 -0
- package/modules/exports/src/server/runtime.ts +160 -0
- package/modules/exports/src/services/data-classes.ts +56 -0
- package/modules/exports/src/services/database-repository.ts +405 -0
- package/modules/exports/src/services/export-runner.ts +123 -0
- package/modules/exports/src/services/export-service.ts +356 -0
- package/modules/exports/src/services/index.ts +6 -0
- package/modules/exports/src/services/list-registry.ts +105 -0
- package/modules/exports/src/services/migration.ts +89 -0
- package/modules/exports/src/services/repository.ts +97 -0
- package/modules/exports/src/settings.ts +70 -0
- package/modules/exports/translations/en.json +69 -0
- package/modules/exports/translations/pl.json +69 -0
- package/modules/import/migrations/0001_import_core.down.sql +6 -0
- package/modules/import/migrations/0001_import_core.up.sql +61 -0
- package/modules/import/migrations/0002_import_job_routing_role.down.sql +4 -0
- package/modules/import/migrations/0002_import_job_routing_role.up.sql +20 -0
- package/modules/import/migrations/0003_import_jobs_export_index.down.sql +1 -0
- package/modules/import/migrations/0003_import_jobs_export_index.up.sql +7 -0
- package/modules/import/migrations/0004_import_jobs_traceparent.down.sql +1 -0
- package/modules/import/migrations/0004_import_jobs_traceparent.up.sql +7 -0
- package/modules/import/migrations/README.md +3 -0
- package/modules/import/module.json +37 -0
- package/modules/import/package.json +50 -0
- package/modules/import/spec/module.yaml +335 -0
- package/modules/import/src/acl/permissions.ts +6 -0
- package/modules/import/src/api/endpoints.ts +400 -0
- package/modules/import/src/client/ImportJobDrawer.tsrx +229 -0
- package/modules/import/src/client/ImportsView.tsrx +455 -0
- package/modules/import/src/client/NewImportForm.tsrx +274 -0
- package/modules/import/src/client/api.ts +243 -0
- package/modules/import/src/client/contribution.tsrx +29 -0
- package/modules/import/src/client/index.ts +23 -0
- package/modules/import/src/client/navigation.ts +25 -0
- package/modules/import/src/client/presentation.ts +59 -0
- package/modules/import/src/client/state.ts +43 -0
- package/modules/import/src/domain/csv.ts +258 -0
- package/modules/import/src/domain/ports.ts +157 -0
- package/modules/import/src/domain/types.ts +179 -0
- package/modules/import/src/index.ts +58 -0
- package/modules/import/src/platform.ts +60 -0
- package/modules/import/src/server/index.ts +49 -0
- package/modules/import/src/server/runtime.ts +158 -0
- package/modules/import/src/services/csv-source.ts +121 -0
- package/modules/import/src/services/data-classes.ts +63 -0
- package/modules/import/src/services/database-repository.ts +780 -0
- package/modules/import/src/services/import-runner.ts +127 -0
- package/modules/import/src/services/import-service.ts +872 -0
- package/modules/import/src/services/index.ts +6 -0
- package/modules/import/src/services/migration.ts +156 -0
- package/modules/import/src/services/port-registry.ts +158 -0
- package/modules/import/src/services/repository.ts +147 -0
- package/modules/import/src/settings.ts +70 -0
- package/modules/import/translations/en.json +175 -0
- package/modules/import/translations/pl.json +175 -0
- package/modules/metering/migrations/0001_metering_core.down.sql +6 -0
- package/modules/metering/migrations/0001_metering_core.up.sql +119 -0
- package/modules/metering/migrations/0002_metering_bucket_export.down.sql +3 -0
- package/modules/metering/migrations/0002_metering_bucket_export.up.sql +5 -0
- package/modules/metering/migrations/README.md +3 -0
- package/modules/metering/module.json +46 -0
- package/modules/metering/package.json +50 -0
- package/modules/metering/spec/module.yaml +269 -0
- package/modules/metering/src/acl/permissions.ts +5 -0
- package/modules/metering/src/api/endpoints.ts +104 -0
- package/modules/metering/src/cli/commands.json +28 -0
- package/modules/metering/src/cli/index.ts +246 -0
- package/modules/metering/src/client/LimitsView.tsrx +170 -0
- package/modules/metering/src/client/UsageSummaryWidget.tsrx +63 -0
- package/modules/metering/src/client/UsageView.tsrx +205 -0
- package/modules/metering/src/client/api.ts +91 -0
- package/modules/metering/src/client/contribution.tsrx +42 -0
- package/modules/metering/src/client/index.ts +26 -0
- package/modules/metering/src/client/navigation.ts +54 -0
- package/modules/metering/src/client/presentation.ts +63 -0
- package/modules/metering/src/client/state.ts +31 -0
- package/modules/metering/src/domain/meters.ts +100 -0
- package/modules/metering/src/domain/types.ts +71 -0
- package/modules/metering/src/index.ts +51 -0
- package/modules/metering/src/platform.ts +84 -0
- package/modules/metering/src/server/index.ts +40 -0
- package/modules/metering/src/server/runtime.ts +165 -0
- package/modules/metering/src/services/data-classes.ts +34 -0
- package/modules/metering/src/services/database-repository.ts +574 -0
- package/modules/metering/src/services/index.ts +9 -0
- package/modules/metering/src/services/meter-registry.ts +145 -0
- package/modules/metering/src/services/metering-service.ts +441 -0
- package/modules/metering/src/services/migration.ts +183 -0
- package/modules/metering/src/services/notifications.ts +75 -0
- package/modules/metering/src/services/reports.ts +105 -0
- package/modules/metering/src/services/repository.ts +132 -0
- package/modules/metering/src/services/service-error.ts +46 -0
- package/modules/metering/src/settings.ts +47 -0
- package/modules/metering/translations/en.json +68 -0
- package/modules/metering/translations/pl.json +68 -0
- package/modules/notifications/migrations/0001_notifications_core.down.sql +1 -0
- package/modules/notifications/migrations/0001_notifications_core.up.sql +26 -0
- package/modules/notifications/migrations/0002_notifications_preferences.down.sql +1 -0
- package/modules/notifications/migrations/0002_notifications_preferences.up.sql +17 -0
- package/modules/notifications/migrations/0003_notifications_webhook_subscriptions.down.sql +1 -0
- package/modules/notifications/migrations/0003_notifications_webhook_subscriptions.up.sql +30 -0
- package/modules/notifications/migrations/0004_notifications_deliveries.down.sql +1 -0
- package/modules/notifications/migrations/0004_notifications_deliveries.up.sql +35 -0
- package/modules/notifications/migrations/0005_notifications_delivery_routing_role.down.sql +2 -0
- package/modules/notifications/migrations/0005_notifications_delivery_routing_role.up.sql +17 -0
- package/modules/notifications/migrations/0006_notifications_delivery_title.down.sql +1 -0
- package/modules/notifications/migrations/0006_notifications_delivery_title.up.sql +11 -0
- package/modules/notifications/migrations/0007_notifications_secret_rotation_inventory.down.sql +2 -0
- package/modules/notifications/migrations/0007_notifications_secret_rotation_inventory.up.sql +19 -0
- package/modules/notifications/migrations/0008_notifications_delivery_claim.down.sql +8 -0
- package/modules/notifications/migrations/0008_notifications_delivery_claim.up.sql +19 -0
- package/modules/notifications/migrations/0009_notifications_kind_approvals.down.sql +16 -0
- package/modules/notifications/migrations/0009_notifications_kind_approvals.up.sql +18 -0
- package/modules/notifications/migrations/0010_notifications_kind_meter_threshold.down.sql +16 -0
- package/modules/notifications/migrations/0010_notifications_kind_meter_threshold.up.sql +18 -0
- package/modules/notifications/migrations/0011_notifications_retention_keyset.down.sql +5 -0
- package/modules/notifications/migrations/0011_notifications_retention_keyset.up.sql +15 -0
- package/modules/notifications/migrations/0012_notifications_email_channel.down.sql +12 -0
- package/modules/notifications/migrations/0012_notifications_email_channel.up.sql +38 -0
- package/modules/notifications/migrations/0013_notifications_list_pages.down.sql +5 -0
- package/modules/notifications/migrations/0013_notifications_list_pages.up.sql +13 -0
- package/modules/notifications/migrations/README.md +3 -0
- package/modules/notifications/module.json +32 -0
- package/modules/notifications/package.json +49 -0
- package/modules/notifications/spec/module.yaml +718 -0
- package/modules/notifications/src/acl/permissions.ts +11 -0
- package/modules/notifications/src/api/endpoints.ts +814 -0
- package/modules/notifications/src/cli/commands.json +17 -0
- package/modules/notifications/src/cli/index.ts +126 -0
- package/modules/notifications/src/client/DeliveriesView.tsrx +483 -0
- package/modules/notifications/src/client/FactList.tsrx +24 -0
- package/modules/notifications/src/client/NotificationPreferencesView.tsrx +240 -0
- package/modules/notifications/src/client/NotificationsInboxView.tsrx +592 -0
- package/modules/notifications/src/client/UnreadCountWidget.tsrx +62 -0
- package/modules/notifications/src/client/WebhookForm.tsrx +297 -0
- package/modules/notifications/src/client/WebhooksView.tsrx +637 -0
- package/modules/notifications/src/client/api.ts +382 -0
- package/modules/notifications/src/client/contribution.tsrx +83 -0
- package/modules/notifications/src/client/inbox.ts +41 -0
- package/modules/notifications/src/client/index.ts +29 -0
- package/modules/notifications/src/client/navigation.ts +92 -0
- package/modules/notifications/src/client/notifications.css +70 -0
- package/modules/notifications/src/client/presentation.ts +81 -0
- package/modules/notifications/src/client/state.ts +246 -0
- package/modules/notifications/src/client/unread-count.ts +26 -0
- package/modules/notifications/src/domain/locale.ts +47 -0
- package/modules/notifications/src/domain/publish.ts +46 -0
- package/modules/notifications/src/domain/types.ts +186 -0
- package/modules/notifications/src/index.ts +62 -0
- package/modules/notifications/src/platform.ts +85 -0
- package/modules/notifications/src/server/index.ts +82 -0
- package/modules/notifications/src/server/runtime.ts +251 -0
- package/modules/notifications/src/services/data-classes.ts +139 -0
- package/modules/notifications/src/services/database-repository.ts +1334 -0
- package/modules/notifications/src/services/delivery-payload.ts +93 -0
- package/modules/notifications/src/services/delivery-runner.ts +170 -0
- package/modules/notifications/src/services/delivery-service.ts +811 -0
- package/modules/notifications/src/services/egress.ts +239 -0
- package/modules/notifications/src/services/email-channel.ts +93 -0
- package/modules/notifications/src/services/index.ts +23 -0
- package/modules/notifications/src/services/migration.ts +572 -0
- package/modules/notifications/src/services/notifications-service.ts +297 -0
- package/modules/notifications/src/services/paging.ts +60 -0
- package/modules/notifications/src/services/publish-service.ts +133 -0
- package/modules/notifications/src/services/repository.ts +342 -0
- package/modules/notifications/src/services/secret-rotation.ts +177 -0
- package/modules/notifications/src/services/secret-vault.ts +168 -0
- package/modules/notifications/src/services/service-error.ts +67 -0
- package/modules/notifications/src/services/signature.ts +81 -0
- package/modules/notifications/src/services/webhook-service.ts +307 -0
- package/modules/notifications/src/settings.ts +130 -0
- package/modules/notifications/translations/en.json +255 -0
- package/modules/notifications/translations/pl.json +255 -0
- package/modules/profile/module.json +3 -3
- package/modules/profile/package.json +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 +179 -0
- package/packages/database/src/decoders.ts +25 -0
- package/packages/database/src/index.ts +17 -0
- package/packages/database/src/record-history.ts +5 -14
- package/packages/harness/src/index.ts +2 -0
- package/packages/harness/src/runtime.ts +218 -1
- package/packages/harness/src/tool-adapters.ts +19 -1
- package/packages/kernel/src/acl.ts +179 -0
- package/packages/kernel/src/capability-registry.ts +69 -2
- package/packages/kernel/src/data-class-registry.ts +354 -0
- package/packages/kernel/src/index.ts +65 -4
- package/packages/kernel/src/keyring.ts +208 -0
- package/packages/kernel/src/module-compatibility.ts +35 -4
- package/packages/kernel/src/module-registry.ts +49 -2
- package/packages/kernel/src/module-settings.ts +189 -27
- package/packages/server/package.json +2 -1
- package/packages/server/src/composition.ts +38 -0
- package/packages/server/src/endpoint.ts +104 -47
- package/packages/server/src/export/csv.ts +34 -0
- package/packages/server/src/export/definition.ts +346 -0
- package/packages/server/src/export/index.ts +61 -0
- package/packages/server/src/export/run.ts +116 -0
- package/packages/server/src/index.ts +155 -0
- package/packages/server/src/jobs/index.ts +93 -0
- package/packages/server/src/jobs/runner.ts +486 -0
- package/packages/server/src/log.ts +291 -0
- package/packages/server/src/mail/config.ts +184 -0
- package/packages/server/src/mail/contracts.ts +251 -0
- package/packages/server/src/mail/index.ts +31 -0
- package/packages/server/src/mail/port.ts +101 -0
- package/packages/server/src/mail/smtp.ts +191 -0
- package/packages/server/src/mail/template.ts +105 -0
- package/packages/server/src/metrics.ts +447 -0
- package/packages/server/src/pagination.ts +246 -0
- package/packages/server/src/trace/context.ts +103 -0
- package/packages/server/src/trace/egress.ts +66 -0
- package/packages/server/src/trace/error-sink.ts +296 -0
- package/packages/server/src/trace/exporter.ts +295 -0
- package/packages/server/src/trace/index.ts +60 -0
- package/packages/server/src/trace/job-sink.ts +172 -0
- package/packages/server/src/trace/tracer.ts +338 -0
- package/packages/server/src/web.ts +5 -1
- package/packages/storage/package.json +40 -0
- package/packages/storage/src/config.ts +189 -0
- package/packages/storage/src/content-type.ts +124 -0
- package/packages/storage/src/contracts.ts +112 -0
- package/packages/storage/src/envelope.ts +189 -0
- package/packages/storage/src/index.ts +43 -0
- package/packages/storage/src/local.ts +75 -0
- package/packages/storage/src/port.ts +251 -0
- package/packages/storage/src/read-token.ts +130 -0
- package/packages/storage/src/s3.ts +144 -0
- package/packages/storage/src/scanner.ts +22 -0
- package/packages/storage/src/sigv4.ts +104 -0
- package/packages/storage/src/store.ts +13 -0
- package/packages/ui/package.json +1 -0
- package/packages/ui/src/components/Button.tsrx +3 -0
- package/packages/ui/src/components/ConfirmDialog.tsrx +13 -2
- package/packages/ui/src/components/DateField.tsrx +92 -0
- package/packages/ui/src/components/DatePicker.tsrx +525 -0
- package/packages/ui/src/components/DateRangeField.tsrx +93 -0
- package/packages/ui/src/components/Drawer.tsrx +10 -1
- package/packages/ui/src/components/FileUpload.tsrx +158 -0
- package/packages/ui/src/components/Pagination.tsrx +130 -0
- package/packages/ui/src/components/Select.tsrx +78 -0
- package/packages/ui/src/components/Table.tsrx +498 -81
- package/packages/ui/src/components/Tabs.tsrx +53 -0
- package/packages/ui/src/components/ToastHost.tsrx +48 -0
- package/packages/ui/src/components/calendar.ts +243 -0
- package/packages/ui/src/components/date-field.ts +62 -0
- package/packages/ui/src/components/file-upload.ts +49 -0
- package/packages/ui/src/components/focus-trap.ts +62 -0
- package/packages/ui/src/components/pagination.ts +68 -0
- package/packages/ui/src/components/table-sorting.ts +49 -0
- package/packages/ui/src/components/tabs.ts +61 -0
- package/packages/ui/src/components/toast-store.ts +116 -0
- package/packages/ui/src/icons/Icon.tsrx +5 -0
- package/packages/ui/src/index.ts +45 -0
- package/packages/ui/src/styles/components.css +598 -0
- package/modules/automations-workflows-integration/module.json +0 -27
- package/modules/automations-workflows-integration/spec/module.yaml +0 -93
- package/modules/automations-workflows-integration/src/index.ts +0 -14
- package/modules/automations-workflows-integration/src/platform.ts +0 -24
- package/modules/automations-workflows-integration/src/server/index.ts +0 -11
- package/modules/automations-workflows-integration/translations/en.json +0 -21
- package/modules/automations-workflows-integration/translations/pl.json +0 -21
- package/modules/workflows/src/services/cursor-codec.ts +0 -62
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/** How many of the oldest windows one eviction drops. */
|
|
2
|
+
const EVICTION_BATCH = 64;
|
|
3
|
+
|
|
4
|
+
interface Window {
|
|
5
|
+
count: number;
|
|
6
|
+
startedAt: number;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Fixed windows over two dimensions of one SCIM surface.
|
|
11
|
+
*
|
|
12
|
+
* `allow` budgets the credential itself, keyed by the fingerprint the caller's
|
|
13
|
+
* own token derives to, so the map never holds a secret. That window alone
|
|
14
|
+
* gives every invented credential a budget of its own, so `recordRefusal`
|
|
15
|
+
* budgets the caller behind them, keyed by the workspace and the remote
|
|
16
|
+
* address: a flood of invented tokens spends one window instead of one each.
|
|
17
|
+
* The caller window is charged and read only where a credential did not
|
|
18
|
+
* resolve, so a provider presenting a real token is never held back by someone
|
|
19
|
+
* else's flood, whatever the two have in common.
|
|
20
|
+
*
|
|
21
|
+
* Bounded: the map evicts once it reaches capacity, dropping expired windows
|
|
22
|
+
* first and the least recently used ones after them, so a flood of invented
|
|
23
|
+
* credentials cannot grow it without limit or push out a window in use. The
|
|
24
|
+
* limits are per process, so a deployment running several instances gives one
|
|
25
|
+
* token that budget on each of them.
|
|
26
|
+
*/
|
|
27
|
+
export class ScimRateLimiter {
|
|
28
|
+
readonly #windows = new Map<string, Window>();
|
|
29
|
+
|
|
30
|
+
constructor(
|
|
31
|
+
private readonly limit = 600,
|
|
32
|
+
private readonly windowMs = 60_000,
|
|
33
|
+
private readonly capacity = 1_000,
|
|
34
|
+
/** Credentials one caller may present unresolved before it is cut off. */
|
|
35
|
+
private readonly refusalLimit = 60,
|
|
36
|
+
) {}
|
|
37
|
+
|
|
38
|
+
allow(key: string, now: number): boolean {
|
|
39
|
+
const current = this.#live(key, now);
|
|
40
|
+
if (!current) {
|
|
41
|
+
this.#start(key, now);
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
current.count += 1;
|
|
45
|
+
return current.count <= this.limit;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Whether the caller has refusals left; asking never spends one. */
|
|
49
|
+
withinRefusalBudget(key: string, now: number): boolean {
|
|
50
|
+
return (this.#live(key, now)?.count ?? 0) < this.refusalLimit;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
recordRefusal(key: string, now: number): void {
|
|
54
|
+
const current = this.#live(key, now);
|
|
55
|
+
if (current) current.count += 1;
|
|
56
|
+
else this.#start(key, now);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* The window of `key` while it is still open, or null. Insertion order is
|
|
61
|
+
* the recency order eviction reads, so a live window is re-inserted on every
|
|
62
|
+
* touch and an expired one is dropped where it is found.
|
|
63
|
+
*/
|
|
64
|
+
#live(key: string, now: number): Window | null {
|
|
65
|
+
const current = this.#windows.get(key);
|
|
66
|
+
if (!current) return null;
|
|
67
|
+
this.#windows.delete(key);
|
|
68
|
+
if (now - current.startedAt >= this.windowMs) return null;
|
|
69
|
+
this.#windows.set(key, current);
|
|
70
|
+
return current;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
#start(key: string, now: number): void {
|
|
74
|
+
if (this.#windows.size >= this.capacity) this.#evict(now);
|
|
75
|
+
this.#windows.set(key, { count: 1, startedAt: now });
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/* One pass at most, and only once per batch of new windows after the map is
|
|
79
|
+
full, so the amortized cost of an insertion stays a small constant.
|
|
80
|
+
Expired windows fill the batch first because they hold no budget anyone
|
|
81
|
+
can spend; the least recently used open windows fill whatever is left. */
|
|
82
|
+
#evict(now: number): void {
|
|
83
|
+
let dropped = 0;
|
|
84
|
+
const idle: string[] = [];
|
|
85
|
+
for (const [key, window] of this.#windows) {
|
|
86
|
+
if (now - window.startedAt >= this.windowMs) {
|
|
87
|
+
this.#windows.delete(key);
|
|
88
|
+
dropped += 1;
|
|
89
|
+
if (dropped >= EVICTION_BATCH) return;
|
|
90
|
+
} else if (idle.length < EVICTION_BATCH) {
|
|
91
|
+
idle.push(key);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/* `idle` is in least-recently-used order and the map never empties, so
|
|
95
|
+
the window of whoever is using the surface right now is the last one
|
|
96
|
+
an eviction would ever reach. */
|
|
97
|
+
for (const key of idle) {
|
|
98
|
+
if (dropped >= EVICTION_BATCH || this.#windows.size <= 1) return;
|
|
99
|
+
this.#windows.delete(key);
|
|
100
|
+
dropped += 1;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
GroupListQuery,
|
|
3
|
+
ListPage,
|
|
4
|
+
ProvisioningEvent,
|
|
5
|
+
ProvisioningEventQuery,
|
|
6
|
+
ScimGroupMapping,
|
|
7
|
+
ScimToken,
|
|
8
|
+
ScimUserMapping,
|
|
9
|
+
TokenListQuery,
|
|
10
|
+
} from '../domain/types.ts';
|
|
11
|
+
|
|
12
|
+
/** A stored token with the secret material authentication compares against. */
|
|
13
|
+
export interface ScimTokenSecret extends ScimToken {
|
|
14
|
+
readonly tokenHash: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface ScimUserFilter {
|
|
18
|
+
readonly userName?: string | undefined;
|
|
19
|
+
readonly externalId?: string | undefined;
|
|
20
|
+
readonly id?: string | undefined;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface ScimGroupFilter {
|
|
24
|
+
readonly displayName?: string | undefined;
|
|
25
|
+
readonly externalId?: string | undefined;
|
|
26
|
+
readonly id?: string | undefined;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface ScimSlice<Record> {
|
|
30
|
+
readonly records: readonly Record[];
|
|
31
|
+
readonly totalResults: number;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface ScimPageRequest {
|
|
35
|
+
/** 1-based, as the SCIM protocol counts. */
|
|
36
|
+
readonly startIndex: number;
|
|
37
|
+
readonly count: number;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** One member of a group with the role its mapped groups currently resolve to. */
|
|
41
|
+
export interface ResolvedGroupMember {
|
|
42
|
+
readonly userId: string;
|
|
43
|
+
readonly accountId: string;
|
|
44
|
+
readonly roleKey: string | null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface GroupMemberRow {
|
|
48
|
+
readonly groupId: string;
|
|
49
|
+
readonly userId: string;
|
|
50
|
+
readonly userName: string;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export interface GroupMemberChange {
|
|
54
|
+
readonly added: readonly string[];
|
|
55
|
+
readonly removed: readonly string[];
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* One membership operation as the provider sent it. `set` replaces the whole
|
|
60
|
+
* membership; the steps of a request are applied in the order received, which
|
|
61
|
+
* is what makes two operations on the same member resolve the way SCIM says.
|
|
62
|
+
*/
|
|
63
|
+
export interface GroupMemberStep {
|
|
64
|
+
readonly kind: 'set' | 'add' | 'remove';
|
|
65
|
+
readonly members: readonly string[];
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Async and database-agnostic. Every method takes the trusted tenant id, which
|
|
70
|
+
* the transaction binds as the row-security context as well.
|
|
71
|
+
*/
|
|
72
|
+
export interface DirectoryRepository {
|
|
73
|
+
/** One screen page; the tokens of a workspace are never read whole. */
|
|
74
|
+
listTokenPage(
|
|
75
|
+
tenantId: string,
|
|
76
|
+
query: TokenListQuery,
|
|
77
|
+
): Promise<ListPage<ScimToken>>;
|
|
78
|
+
findTokenById(tenantId: string, id: string): Promise<ScimToken | null>;
|
|
79
|
+
findTokenByFingerprint(
|
|
80
|
+
tenantId: string,
|
|
81
|
+
fingerprint: string,
|
|
82
|
+
): Promise<ScimTokenSecret | null>;
|
|
83
|
+
insertToken(record: ScimTokenSecret): Promise<void>;
|
|
84
|
+
replaceTokenSecret(input: {
|
|
85
|
+
readonly tenantId: string;
|
|
86
|
+
readonly id: string;
|
|
87
|
+
readonly tokenFingerprint: string;
|
|
88
|
+
readonly tokenHash: string;
|
|
89
|
+
readonly expiresAt: number | null;
|
|
90
|
+
}): Promise<boolean>;
|
|
91
|
+
revokeToken(
|
|
92
|
+
tenantId: string,
|
|
93
|
+
id: string,
|
|
94
|
+
revokedAt: number,
|
|
95
|
+
): Promise<boolean>;
|
|
96
|
+
touchToken(tenantId: string, id: string, usedAt: number): Promise<void>;
|
|
97
|
+
|
|
98
|
+
listUsers(
|
|
99
|
+
tenantId: string,
|
|
100
|
+
filter: ScimUserFilter,
|
|
101
|
+
page: ScimPageRequest,
|
|
102
|
+
): Promise<ScimSlice<ScimUserMapping>>;
|
|
103
|
+
findUserById(tenantId: string, id: string): Promise<ScimUserMapping | null>;
|
|
104
|
+
/** One query for a bounded set of ids, so a member list costs one round trip. */
|
|
105
|
+
findUsersByIds(
|
|
106
|
+
tenantId: string,
|
|
107
|
+
ids: readonly string[],
|
|
108
|
+
): Promise<readonly ScimUserMapping[]>;
|
|
109
|
+
findUserByUserName(
|
|
110
|
+
tenantId: string,
|
|
111
|
+
userName: string,
|
|
112
|
+
): Promise<ScimUserMapping | null>;
|
|
113
|
+
insertUser(record: ScimUserMapping): Promise<void>;
|
|
114
|
+
updateUser(input: {
|
|
115
|
+
readonly tenantId: string;
|
|
116
|
+
readonly id: string;
|
|
117
|
+
readonly externalId: string | null;
|
|
118
|
+
readonly active: boolean;
|
|
119
|
+
readonly lastSyncedAt: number;
|
|
120
|
+
}): Promise<void>;
|
|
121
|
+
|
|
122
|
+
/** The SCIM listing: offset paged with a total, as the protocol reads. */
|
|
123
|
+
listGroups(
|
|
124
|
+
tenantId: string,
|
|
125
|
+
filter: ScimGroupFilter,
|
|
126
|
+
page: ScimPageRequest,
|
|
127
|
+
): Promise<ScimSlice<ScimGroupMapping>>;
|
|
128
|
+
/** The screen listing: one keyset page over the same rows. */
|
|
129
|
+
listGroupPage(
|
|
130
|
+
tenantId: string,
|
|
131
|
+
query: GroupListQuery,
|
|
132
|
+
): Promise<ListPage<ScimGroupMapping>>;
|
|
133
|
+
findGroupById(tenantId: string, id: string): Promise<ScimGroupMapping | null>;
|
|
134
|
+
insertGroup(record: Omit<ScimGroupMapping, 'memberCount'>): Promise<void>;
|
|
135
|
+
updateGroup(input: {
|
|
136
|
+
readonly tenantId: string;
|
|
137
|
+
readonly id: string;
|
|
138
|
+
readonly externalId: string | null;
|
|
139
|
+
readonly displayName: string;
|
|
140
|
+
readonly roleKey: string | null;
|
|
141
|
+
readonly precedence: number;
|
|
142
|
+
readonly updatedAt: number;
|
|
143
|
+
}): Promise<void>;
|
|
144
|
+
deleteGroup(tenantId: string, id: string): Promise<boolean>;
|
|
145
|
+
|
|
146
|
+
listGroupMemberIds(
|
|
147
|
+
tenantId: string,
|
|
148
|
+
groupId: string,
|
|
149
|
+
): Promise<readonly string[]>;
|
|
150
|
+
/**
|
|
151
|
+
* One query for a whole page of groups, bounded per group: a listing must
|
|
152
|
+
* not be able to load a workspace's entire membership into one response.
|
|
153
|
+
*/
|
|
154
|
+
listMembersOfGroups(
|
|
155
|
+
tenantId: string,
|
|
156
|
+
groupIds: readonly string[],
|
|
157
|
+
perGroupLimit: number,
|
|
158
|
+
): Promise<readonly GroupMemberRow[]>;
|
|
159
|
+
/**
|
|
160
|
+
* Applies the steps in order inside one transaction and returns what
|
|
161
|
+
* actually changed, so a repeat of the same state writes nothing.
|
|
162
|
+
*/
|
|
163
|
+
applyGroupMembers(input: {
|
|
164
|
+
readonly tenantId: string;
|
|
165
|
+
readonly groupId: string;
|
|
166
|
+
readonly steps: readonly GroupMemberStep[];
|
|
167
|
+
readonly now: number;
|
|
168
|
+
}): Promise<GroupMemberChange>;
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* The winning role of every member of the group, and of every named user,
|
|
172
|
+
* from one precedence rule: the mapped group with the lowest precedence, or
|
|
173
|
+
* null when none applies. A named user who belongs to no group answers with
|
|
174
|
+
* a null role rather than not at all.
|
|
175
|
+
*/
|
|
176
|
+
resolvedRolesForGroup(
|
|
177
|
+
tenantId: string,
|
|
178
|
+
groupId: string,
|
|
179
|
+
): Promise<readonly ResolvedGroupMember[]>;
|
|
180
|
+
resolvedRolesForUsers(
|
|
181
|
+
tenantId: string,
|
|
182
|
+
userIds: readonly string[],
|
|
183
|
+
): Promise<readonly ResolvedGroupMember[]>;
|
|
184
|
+
|
|
185
|
+
/** The sequence is assigned by storage, so a caller never supplies one. */
|
|
186
|
+
appendEvent(event: Omit<ProvisioningEvent, 'sequence'>): Promise<void>;
|
|
187
|
+
/** One workspace's events in as few statements as the batch size allows. */
|
|
188
|
+
appendEvents(
|
|
189
|
+
events: readonly Omit<ProvisioningEvent, 'sequence'>[],
|
|
190
|
+
): Promise<void>;
|
|
191
|
+
listEvents(
|
|
192
|
+
tenantId: string,
|
|
193
|
+
query: ProvisioningEventQuery,
|
|
194
|
+
): Promise<readonly ProvisioningEvent[]>;
|
|
195
|
+
|
|
196
|
+
/** Removes at most `limit` events that occurred strictly before `before`. */
|
|
197
|
+
sweepEvents(
|
|
198
|
+
tenantId: string,
|
|
199
|
+
before: number,
|
|
200
|
+
limit: number,
|
|
201
|
+
): Promise<{ readonly removed: number }>;
|
|
202
|
+
/** One export page, ordered by the storage sequence the log is written in. */
|
|
203
|
+
exportEventsPage(
|
|
204
|
+
tenantId: string,
|
|
205
|
+
afterSequence: number,
|
|
206
|
+
limit: number,
|
|
207
|
+
): Promise<readonly ProvisioningEvent[]>;
|
|
208
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/** Refusals of the administration API. The SCIM surface raises `ScimError`. */
|
|
2
|
+
export class DirectoryServiceError extends Error {
|
|
3
|
+
constructor(
|
|
4
|
+
readonly code: string,
|
|
5
|
+
message: string,
|
|
6
|
+
readonly status = 400,
|
|
7
|
+
) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.name = 'DirectoryServiceError';
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/* A control character reaching a label or a role key would travel into a table
|
|
14
|
+
cell, a log line and a SCIM response, so it is refused at the boundary. */
|
|
15
|
+
function printable(value: string): boolean {
|
|
16
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
17
|
+
if (value.charCodeAt(index) < 0x20) return false;
|
|
18
|
+
}
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function bounded(
|
|
23
|
+
value: string,
|
|
24
|
+
field: string,
|
|
25
|
+
minimum: number,
|
|
26
|
+
maximum: number,
|
|
27
|
+
): string {
|
|
28
|
+
const normalized = value.trim();
|
|
29
|
+
if (normalized.length < minimum || normalized.length > maximum) {
|
|
30
|
+
throw new DirectoryServiceError(
|
|
31
|
+
'INVALID_INPUT',
|
|
32
|
+
`${field} must contain between ${minimum} and ${maximum} characters.`,
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
if (!printable(normalized)) {
|
|
36
|
+
throw new DirectoryServiceError(
|
|
37
|
+
'INVALID_INPUT',
|
|
38
|
+
`${field} contains an unsupported character.`,
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
return normalized;
|
|
42
|
+
}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createHash,
|
|
3
|
+
randomBytes,
|
|
4
|
+
randomUUID,
|
|
5
|
+
timingSafeEqual,
|
|
6
|
+
} from 'node:crypto';
|
|
7
|
+
import type {
|
|
8
|
+
IssuedScimToken,
|
|
9
|
+
ListPage,
|
|
10
|
+
ScimToken,
|
|
11
|
+
TokenListQuery,
|
|
12
|
+
} from '../domain/types.ts';
|
|
13
|
+
import { DirectoryUniqueViolation } from './database-repository.ts';
|
|
14
|
+
import type { DirectoryRepository } from './repository.ts';
|
|
15
|
+
import { bounded, DirectoryServiceError } from './service-error.ts';
|
|
16
|
+
|
|
17
|
+
/** Hard ceiling of one screen page, whatever a caller asks for. */
|
|
18
|
+
export const MAX_LIST_PAGE = 200;
|
|
19
|
+
|
|
20
|
+
/** Distinct from the member API token prefix, so the two can never be confused. */
|
|
21
|
+
export const SCIM_TOKEN_PREFIX = 'fdscim_';
|
|
22
|
+
|
|
23
|
+
const SCIM_TOKEN_PATTERN = /^fdscim_[A-Za-z0-9_-]{43}$/;
|
|
24
|
+
const FINGERPRINT_LENGTH = 32;
|
|
25
|
+
const MAX_TOKEN_LIFETIME_MS = 365 * 24 * 60 * 60 * 1_000;
|
|
26
|
+
/** Bounds the write amplification of a busy provider to one row per minute. */
|
|
27
|
+
const TOUCH_INTERVAL_MS = 60_000;
|
|
28
|
+
|
|
29
|
+
export function hashScimToken(token: string): string {
|
|
30
|
+
return createHash('sha256').update(token).digest('hex');
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function scimTokenFingerprint(token: string): string {
|
|
34
|
+
return hashScimToken(token).slice(0, FINGERPRINT_LENGTH);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface CreateScimTokenInput {
|
|
38
|
+
readonly label: string;
|
|
39
|
+
readonly expiresAt: number | null;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export class ScimTokenService {
|
|
43
|
+
/* Compared against when no row matched, so an unknown credential costs the
|
|
44
|
+
same comparison as a real one and cannot be timed apart. */
|
|
45
|
+
readonly #decoyHash = randomBytes(32).toString('hex');
|
|
46
|
+
|
|
47
|
+
constructor(
|
|
48
|
+
private readonly repository: DirectoryRepository,
|
|
49
|
+
private readonly now: () => number = Date.now,
|
|
50
|
+
) {}
|
|
51
|
+
|
|
52
|
+
list(tenantId: string, query: TokenListQuery): Promise<ListPage<ScimToken>> {
|
|
53
|
+
return this.repository.listTokenPage(tenantId, {
|
|
54
|
+
...query,
|
|
55
|
+
limit: Math.min(Math.max(query.limit, 1), MAX_LIST_PAGE),
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async create(
|
|
60
|
+
tenantId: string,
|
|
61
|
+
createdBy: string,
|
|
62
|
+
input: CreateScimTokenInput,
|
|
63
|
+
): Promise<IssuedScimToken> {
|
|
64
|
+
const label = bounded(input.label, 'label', 2, 120);
|
|
65
|
+
const createdAt = this.now();
|
|
66
|
+
const expiresAt = this.#expiry(input.expiresAt, createdAt);
|
|
67
|
+
const token = mintToken();
|
|
68
|
+
const record = {
|
|
69
|
+
id: randomUUID(),
|
|
70
|
+
tenantId,
|
|
71
|
+
label,
|
|
72
|
+
tokenFingerprint: scimTokenFingerprint(token),
|
|
73
|
+
tokenHash: hashScimToken(token),
|
|
74
|
+
status: 'active' as const,
|
|
75
|
+
createdBy,
|
|
76
|
+
createdAt,
|
|
77
|
+
lastUsedAt: null,
|
|
78
|
+
expiresAt,
|
|
79
|
+
revokedAt: null,
|
|
80
|
+
};
|
|
81
|
+
try {
|
|
82
|
+
await this.repository.insertToken(record);
|
|
83
|
+
} catch (error) {
|
|
84
|
+
/* The unique index is the only authority on the label: a pre-read would
|
|
85
|
+
answer from a state another request can move before the insert. */
|
|
86
|
+
if (error instanceof DirectoryUniqueViolation) {
|
|
87
|
+
throw new DirectoryServiceError(
|
|
88
|
+
'TOKEN_LABEL_EXISTS',
|
|
89
|
+
'A token with this label already exists in the workspace.',
|
|
90
|
+
409,
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
throw error;
|
|
94
|
+
}
|
|
95
|
+
const { tokenHash: _hash, ...visible } = record;
|
|
96
|
+
return { record: visible, token };
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/* Rotation keeps the label and the identity of the credential so the log
|
|
100
|
+
stays readable, and replaces the secret, which revokes the old value.
|
|
101
|
+
Revocation is terminal: rotating a revoked token would put a working
|
|
102
|
+
credential back on a label an owner already stopped. */
|
|
103
|
+
async rotate(
|
|
104
|
+
tenantId: string,
|
|
105
|
+
id: string,
|
|
106
|
+
expiresAt: number | null,
|
|
107
|
+
): Promise<IssuedScimToken> {
|
|
108
|
+
const current = await this.#require(tenantId, id);
|
|
109
|
+
if (current.status !== 'active') throw this.#revoked();
|
|
110
|
+
const token = mintToken();
|
|
111
|
+
const replaced = await this.repository.replaceTokenSecret({
|
|
112
|
+
tenantId,
|
|
113
|
+
id: current.id,
|
|
114
|
+
tokenFingerprint: scimTokenFingerprint(token),
|
|
115
|
+
tokenHash: hashScimToken(token),
|
|
116
|
+
expiresAt: this.#expiry(expiresAt, this.now()),
|
|
117
|
+
});
|
|
118
|
+
if (!replaced) {
|
|
119
|
+
/* The statement writes only an active row, so a revoke that landed
|
|
120
|
+
between the read and the write answers the same refusal. */
|
|
121
|
+
const stored = await this.repository.findTokenById(tenantId, current.id);
|
|
122
|
+
throw stored && stored.status !== 'active'
|
|
123
|
+
? this.#revoked()
|
|
124
|
+
: this.#notFound();
|
|
125
|
+
}
|
|
126
|
+
const record = await this.repository.findTokenById(tenantId, current.id);
|
|
127
|
+
if (!record) throw this.#notFound();
|
|
128
|
+
return { record, token };
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
async revoke(tenantId: string, id: string): Promise<ScimToken> {
|
|
132
|
+
const current = await this.#require(tenantId, id);
|
|
133
|
+
if (current.status === 'revoked') return current;
|
|
134
|
+
await this.repository.revokeToken(tenantId, current.id, this.now());
|
|
135
|
+
return (await this.repository.findTokenById(tenantId, id)) ?? current;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Resolves a presented credential to the token that authorizes the request,
|
|
140
|
+
* or null. Every refusal answers the same way: the caller cannot tell an
|
|
141
|
+
* unknown token from a revoked, expired or foreign one.
|
|
142
|
+
*/
|
|
143
|
+
async authenticate(
|
|
144
|
+
tenantId: string,
|
|
145
|
+
presented: string,
|
|
146
|
+
): Promise<ScimToken | null> {
|
|
147
|
+
if (!SCIM_TOKEN_PATTERN.test(presented)) return null;
|
|
148
|
+
const digest = hashScimToken(presented);
|
|
149
|
+
const record = await this.repository.findTokenByFingerprint(
|
|
150
|
+
tenantId,
|
|
151
|
+
digest.slice(0, FINGERPRINT_LENGTH),
|
|
152
|
+
);
|
|
153
|
+
const matches = equalHex(record?.tokenHash ?? this.#decoyHash, digest);
|
|
154
|
+
if (!record || !matches || record.status !== 'active') return null;
|
|
155
|
+
const now = this.now();
|
|
156
|
+
if (record.expiresAt !== null && record.expiresAt <= now) return null;
|
|
157
|
+
if (
|
|
158
|
+
record.lastUsedAt === null ||
|
|
159
|
+
now - record.lastUsedAt > TOUCH_INTERVAL_MS
|
|
160
|
+
) {
|
|
161
|
+
await this.repository.touchToken(tenantId, record.id, now);
|
|
162
|
+
}
|
|
163
|
+
const { tokenHash: _hash, ...visible } = record;
|
|
164
|
+
return visible;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
async #require(tenantId: string, id: string): Promise<ScimToken> {
|
|
168
|
+
const record = await this.repository.findTokenById(
|
|
169
|
+
tenantId,
|
|
170
|
+
bounded(id, 'id', 1, 128),
|
|
171
|
+
);
|
|
172
|
+
if (!record) throw this.#notFound();
|
|
173
|
+
return record;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
#notFound(): DirectoryServiceError {
|
|
177
|
+
return new DirectoryServiceError(
|
|
178
|
+
'TOKEN_NOT_FOUND',
|
|
179
|
+
'The token does not exist in this workspace.',
|
|
180
|
+
404,
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
#revoked(): DirectoryServiceError {
|
|
185
|
+
return new DirectoryServiceError(
|
|
186
|
+
'TOKEN_REVOKED',
|
|
187
|
+
'A revoked token cannot be rotated; create a new one instead.',
|
|
188
|
+
409,
|
|
189
|
+
);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
#expiry(value: number | null, createdAt: number): number | null {
|
|
193
|
+
if (value === null) return null;
|
|
194
|
+
if (
|
|
195
|
+
!Number.isSafeInteger(value) ||
|
|
196
|
+
value <= createdAt ||
|
|
197
|
+
value - createdAt > MAX_TOKEN_LIFETIME_MS
|
|
198
|
+
) {
|
|
199
|
+
throw new DirectoryServiceError(
|
|
200
|
+
'INVALID_EXPIRY',
|
|
201
|
+
'Token expiry must be a future timestamp within one year.',
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
return value;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
function mintToken(): string {
|
|
209
|
+
return SCIM_TOKEN_PREFIX + randomBytes(32).toString('base64url');
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
function equalHex(left: string, right: string): boolean {
|
|
213
|
+
if (left.length !== right.length) return false;
|
|
214
|
+
return timingSafeEqual(Buffer.from(left, 'hex'), Buffer.from(right, 'hex'));
|
|
215
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import {
|
|
2
|
+
defineModuleSettings,
|
|
3
|
+
PLATFORM_SETTINGS_TENANT,
|
|
4
|
+
type ModuleSettingsRuntime,
|
|
5
|
+
} from '@flowdular/sdk/kernel';
|
|
6
|
+
|
|
7
|
+
export const DIRECTORY_MODULE_ID = 'directory.core';
|
|
8
|
+
|
|
9
|
+
export const DIRECTORY_DEFAULT_ROLE = 'member';
|
|
10
|
+
export const DIRECTORY_DEFAULT_PAGE_SIZE_MAX = 200;
|
|
11
|
+
|
|
12
|
+
export const DIRECTORY_MODULE_SETTINGS = defineModuleSettings({
|
|
13
|
+
moduleId: DIRECTORY_MODULE_ID,
|
|
14
|
+
settings: {
|
|
15
|
+
defaultRole: {
|
|
16
|
+
type: 'string',
|
|
17
|
+
defaultValue: DIRECTORY_DEFAULT_ROLE,
|
|
18
|
+
max: 32,
|
|
19
|
+
visibility: 'shared',
|
|
20
|
+
client: false,
|
|
21
|
+
scope: 'tenant',
|
|
22
|
+
labelKey: 'directory.settings.defaultRole.label',
|
|
23
|
+
label: 'Default provisioned role',
|
|
24
|
+
descriptionKey: 'directory.settings.defaultRole.description',
|
|
25
|
+
description:
|
|
26
|
+
'The workspace role a provisioned user receives when no mapped group applies. It is checked against the workspace roles at the moment it is used.',
|
|
27
|
+
},
|
|
28
|
+
pageSizeMax: {
|
|
29
|
+
type: 'number',
|
|
30
|
+
defaultValue: DIRECTORY_DEFAULT_PAGE_SIZE_MAX,
|
|
31
|
+
min: 1,
|
|
32
|
+
max: 1_000,
|
|
33
|
+
visibility: 'shared',
|
|
34
|
+
client: false,
|
|
35
|
+
scope: 'platform',
|
|
36
|
+
labelKey: 'directory.settings.pageSizeMax.label',
|
|
37
|
+
label: 'Maximum SCIM page size',
|
|
38
|
+
descriptionKey: 'directory.settings.pageSizeMax.description',
|
|
39
|
+
description:
|
|
40
|
+
'Upper bound of the SCIM count parameter. A larger request is clamped to this value rather than refused.',
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
/* A setting read must never take a SCIM request down, so each accessor falls
|
|
46
|
+
back to the declared default when the runtime has not registered it yet. */
|
|
47
|
+
function value<T extends string | number>(
|
|
48
|
+
settings: ModuleSettingsRuntime,
|
|
49
|
+
tenantId: string,
|
|
50
|
+
key: 'defaultRole' | 'pageSizeMax',
|
|
51
|
+
fallback: T,
|
|
52
|
+
): T {
|
|
53
|
+
try {
|
|
54
|
+
return settings.get<T>(tenantId, DIRECTORY_MODULE_ID, key);
|
|
55
|
+
} catch {
|
|
56
|
+
return fallback;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function directoryDefaultRole(
|
|
61
|
+
settings: ModuleSettingsRuntime,
|
|
62
|
+
tenantId: string,
|
|
63
|
+
): string {
|
|
64
|
+
const stored = value(
|
|
65
|
+
settings,
|
|
66
|
+
tenantId,
|
|
67
|
+
'defaultRole',
|
|
68
|
+
DIRECTORY_DEFAULT_ROLE,
|
|
69
|
+
)
|
|
70
|
+
.trim()
|
|
71
|
+
.toLowerCase();
|
|
72
|
+
return stored === '' ? DIRECTORY_DEFAULT_ROLE : stored;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function directoryPageSizeMax(settings: ModuleSettingsRuntime): number {
|
|
76
|
+
const stored = value(
|
|
77
|
+
settings,
|
|
78
|
+
PLATFORM_SETTINGS_TENANT,
|
|
79
|
+
'pageSizeMax',
|
|
80
|
+
DIRECTORY_DEFAULT_PAGE_SIZE_MAX,
|
|
81
|
+
);
|
|
82
|
+
if (!Number.isSafeInteger(stored) || stored < 1) {
|
|
83
|
+
return DIRECTORY_DEFAULT_PAGE_SIZE_MAX;
|
|
84
|
+
}
|
|
85
|
+
return Math.min(stored, 1_000);
|
|
86
|
+
}
|