@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,249 @@
|
|
|
1
|
+
import type { AuthPrincipal, TenantMember } from '@flowdular/sdk/modules/auth';
|
|
2
|
+
import type { AuthRuntime } from '@flowdular/sdk/modules/auth/server';
|
|
3
|
+
import {
|
|
4
|
+
AuthServiceError,
|
|
5
|
+
TENANT_MEMBER_LOOKUP_LIMIT,
|
|
6
|
+
} from '@flowdular/sdk/modules/auth/server';
|
|
7
|
+
import type {
|
|
8
|
+
ImportPort,
|
|
9
|
+
ImportRow,
|
|
10
|
+
ImportValidateInput,
|
|
11
|
+
ImportValidation,
|
|
12
|
+
ImportWriteInput,
|
|
13
|
+
ImportWriteOutcome,
|
|
14
|
+
} from '@flowdular/sdk/modules/import';
|
|
15
|
+
import { USER_PERMISSIONS } from '../acl/permissions.ts';
|
|
16
|
+
import { UsersService } from './users-service.ts';
|
|
17
|
+
|
|
18
|
+
/** The port key; import.core composes the target id `users.core.members`. */
|
|
19
|
+
export const MEMBER_IMPORT_PORT_KEY = 'members';
|
|
20
|
+
|
|
21
|
+
/** A row that names no role joins on the least privileged built-in role. */
|
|
22
|
+
export const MEMBER_IMPORT_DEFAULT_ROLE = 'member';
|
|
23
|
+
|
|
24
|
+
const EMAIL = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
25
|
+
|
|
26
|
+
/* The address rule auth.core applies, so the natural key this port looks up is
|
|
27
|
+
the same string auth.core stored. */
|
|
28
|
+
function address(value: string | undefined): string {
|
|
29
|
+
return (value ?? '').trim().normalize('NFKC').toLowerCase();
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function text(value: string | undefined): string | undefined {
|
|
33
|
+
const trimmed = value?.trim();
|
|
34
|
+
return trimmed === undefined || trimmed === '' ? undefined : trimmed;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function refusal(row: number, field: string, reason: string): ImportValidation {
|
|
38
|
+
return { row, verdict: 'invalid', field, reason };
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Refusals only, as the port contract asks: a row this says nothing about is
|
|
43
|
+
* taken as valid. Whether a member already exists is not one of them, because
|
|
44
|
+
* the job's mode decides what an existing member means, and that is read at
|
|
45
|
+
* write time.
|
|
46
|
+
*/
|
|
47
|
+
async function validateRows(
|
|
48
|
+
auth: AuthRuntime,
|
|
49
|
+
{ tenantId, rows }: ImportValidateInput,
|
|
50
|
+
): Promise<readonly ImportValidation[]> {
|
|
51
|
+
const roles = new Set(
|
|
52
|
+
(await (await auth.service()).listRoles(tenantId)).map((role) => role.key),
|
|
53
|
+
);
|
|
54
|
+
const refusals: ImportValidation[] = [];
|
|
55
|
+
const seen = new Set<string>();
|
|
56
|
+
for (const entry of rows) {
|
|
57
|
+
const email = address(entry.values.email);
|
|
58
|
+
if (email.length > 254 || !EMAIL.test(email)) {
|
|
59
|
+
refusals.push(refusal(entry.row, 'email', 'EMAIL_INVALID'));
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
const displayName = text(entry.values.displayName);
|
|
63
|
+
if (
|
|
64
|
+
displayName === undefined ||
|
|
65
|
+
displayName.length < 2 ||
|
|
66
|
+
displayName.length > 80
|
|
67
|
+
) {
|
|
68
|
+
refusals.push(refusal(entry.row, 'displayName', 'DISPLAY_NAME_INVALID'));
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
const role = text(entry.values.role);
|
|
72
|
+
if (role !== undefined && !roles.has(role)) {
|
|
73
|
+
refusals.push(refusal(entry.row, 'role', 'ROLE_UNKNOWN'));
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
/* The first row carrying an address is the one that writes it, so a
|
|
77
|
+
repeat further down the file would write over this import's own row.
|
|
78
|
+
A repeat in a later batch meets the natural key at write instead. */
|
|
79
|
+
if (seen.has(email)) {
|
|
80
|
+
refusals.push(refusal(entry.row, 'email', 'EMAIL_DUPLICATE'));
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
seen.add(email);
|
|
84
|
+
}
|
|
85
|
+
return refusals;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/* No credential at all: auth.core stores its unusable marker, so nothing has to
|
|
89
|
+
be drawn, kept, or thrown away here. The member reaches the workspace through
|
|
90
|
+
the public reset flow or an administrative temporary password. */
|
|
91
|
+
async function createMember(
|
|
92
|
+
users: UsersService,
|
|
93
|
+
principal: AuthPrincipal,
|
|
94
|
+
entry: ImportRow,
|
|
95
|
+
email: string,
|
|
96
|
+
): Promise<ImportWriteOutcome> {
|
|
97
|
+
const created = await users.createWithoutPassword(principal, {
|
|
98
|
+
email,
|
|
99
|
+
displayName: text(entry.values.displayName) ?? '',
|
|
100
|
+
role: text(entry.values.role) ?? MEMBER_IMPORT_DEFAULT_ROLE,
|
|
101
|
+
});
|
|
102
|
+
return { row: entry.row, outcome: 'created', recordRef: created.accountId };
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
async function applyExisting(
|
|
106
|
+
users: UsersService,
|
|
107
|
+
principal: AuthPrincipal,
|
|
108
|
+
entry: ImportRow,
|
|
109
|
+
member: TenantMember,
|
|
110
|
+
mode: ImportWriteInput['mode'],
|
|
111
|
+
): Promise<ImportWriteOutcome> {
|
|
112
|
+
if (mode === 'create-only') {
|
|
113
|
+
return { row: entry.row, outcome: 'failed', reason: 'ALREADY_EXISTS' };
|
|
114
|
+
}
|
|
115
|
+
if (mode === 'skip-existing') {
|
|
116
|
+
return { row: entry.row, outcome: 'skipped', recordRef: member.accountId };
|
|
117
|
+
}
|
|
118
|
+
/* There is no transaction across the two writes, so the display name goes
|
|
119
|
+
first: it is the bounded one, refused only for its own shape, while the
|
|
120
|
+
role meets the owner cap, the acting principal and the assignable set. A
|
|
121
|
+
value the member already holds is not written at all, so a repeat leaves
|
|
122
|
+
no audit event for a change that did not happen. */
|
|
123
|
+
const displayName = text(entry.values.displayName);
|
|
124
|
+
let renamed = false;
|
|
125
|
+
if (displayName !== undefined && displayName !== member.displayName) {
|
|
126
|
+
await users.rename(principal, member.accountId, displayName);
|
|
127
|
+
renamed = true;
|
|
128
|
+
}
|
|
129
|
+
const role = text(entry.values.role);
|
|
130
|
+
if (role !== undefined && role !== member.role) {
|
|
131
|
+
try {
|
|
132
|
+
await users.assignRole(principal, member.accountId, role);
|
|
133
|
+
} catch (error) {
|
|
134
|
+
/* The rename already landed. Failing the whole row here would report a
|
|
135
|
+
change that did happen as one that did not, so the row is updated and
|
|
136
|
+
names what the role write met. */
|
|
137
|
+
if (!renamed) throw error;
|
|
138
|
+
return {
|
|
139
|
+
row: entry.row,
|
|
140
|
+
outcome: 'updated',
|
|
141
|
+
recordRef: member.accountId,
|
|
142
|
+
reason: `ROLE_UNCHANGED:${
|
|
143
|
+
error instanceof AuthServiceError ? error.code : 'WRITE_FAILED'
|
|
144
|
+
}`,
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return { row: entry.row, outcome: 'updated', recordRef: member.accountId };
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* The batch's natural keys, resolved by the addresses the batch names rather
|
|
153
|
+
* than by listing the workspace: the cost is the rows the file asks about, not
|
|
154
|
+
* the workspace's member count. auth.core bounds one lookup, and an import
|
|
155
|
+
* batch is a setting a deployment raises, so the addresses are split into
|
|
156
|
+
* chunks of that bound.
|
|
157
|
+
*/
|
|
158
|
+
async function existingMembers(
|
|
159
|
+
auth: AuthRuntime,
|
|
160
|
+
tenantId: string,
|
|
161
|
+
addresses: readonly string[],
|
|
162
|
+
): Promise<Map<string, TenantMember>> {
|
|
163
|
+
const service = await auth.service();
|
|
164
|
+
const found = new Map<string, TenantMember>();
|
|
165
|
+
const wanted = [...new Set(addresses)];
|
|
166
|
+
for (
|
|
167
|
+
let start = 0;
|
|
168
|
+
start < wanted.length;
|
|
169
|
+
start += TENANT_MEMBER_LOOKUP_LIMIT
|
|
170
|
+
) {
|
|
171
|
+
for (const member of await service.findTenantMembersByEmail(
|
|
172
|
+
tenantId,
|
|
173
|
+
wanted.slice(start, start + TENANT_MEMBER_LOOKUP_LIMIT),
|
|
174
|
+
)) {
|
|
175
|
+
found.set(address(member.email), member);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return found;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* One outcome per row. The read names the job's workspace while every write
|
|
183
|
+
* pins the tenant to the principal, so a disagreement between the two fails the
|
|
184
|
+
* row in auth.core instead of reaching another workspace.
|
|
185
|
+
*/
|
|
186
|
+
async function writeRows(
|
|
187
|
+
auth: AuthRuntime,
|
|
188
|
+
users: UsersService,
|
|
189
|
+
{ tenantId, principal, rows, mode }: ImportWriteInput,
|
|
190
|
+
): Promise<readonly ImportWriteOutcome[]> {
|
|
191
|
+
const existing = await existingMembers(
|
|
192
|
+
auth,
|
|
193
|
+
tenantId,
|
|
194
|
+
rows.map((entry) => address(entry.values.email)).filter(Boolean),
|
|
195
|
+
);
|
|
196
|
+
const outcomes: ImportWriteOutcome[] = [];
|
|
197
|
+
for (const entry of rows) {
|
|
198
|
+
const email = address(entry.values.email);
|
|
199
|
+
const member = existing.get(email);
|
|
200
|
+
try {
|
|
201
|
+
outcomes.push(
|
|
202
|
+
member === undefined
|
|
203
|
+
? await createMember(users, principal, entry, email)
|
|
204
|
+
: await applyExisting(users, principal, entry, member, mode),
|
|
205
|
+
);
|
|
206
|
+
} catch (error) {
|
|
207
|
+
/* One row never fails the batch, and only the stable code is reported:
|
|
208
|
+
an auth.core message can name the member it refused. */
|
|
209
|
+
outcomes.push({
|
|
210
|
+
row: entry.row,
|
|
211
|
+
outcome: 'failed',
|
|
212
|
+
reason: error instanceof AuthServiceError ? error.code : 'WRITE_FAILED',
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return outcomes;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* The workspace's members as an import target. Every read and write goes
|
|
221
|
+
* through the auth administration port with the principal that started the job
|
|
222
|
+
* as the actor, so the owner cap, the last-owner rule and the audit trail hold
|
|
223
|
+
* for an imported row exactly as they do for the Users screen.
|
|
224
|
+
*/
|
|
225
|
+
export function createMemberImportPort(auth: AuthRuntime): ImportPort {
|
|
226
|
+
const users = new UsersService(auth);
|
|
227
|
+
return {
|
|
228
|
+
key: MEMBER_IMPORT_PORT_KEY,
|
|
229
|
+
label: 'Members',
|
|
230
|
+
permission: USER_PERMISSIONS.manage,
|
|
231
|
+
fields: [
|
|
232
|
+
{ id: 'email', label: 'Email', required: true, type: 'email' },
|
|
233
|
+
{
|
|
234
|
+
id: 'displayName',
|
|
235
|
+
label: 'Display name',
|
|
236
|
+
required: true,
|
|
237
|
+
type: 'string',
|
|
238
|
+
},
|
|
239
|
+
{ id: 'role', label: 'Role', required: false, type: 'string' },
|
|
240
|
+
],
|
|
241
|
+
naturalKey: ['email'],
|
|
242
|
+
/* The address rule auth.core stores under, so two rows naming one member
|
|
243
|
+
in different case are one natural key for the whole file, not only
|
|
244
|
+
inside the batch the port happens to see them in. */
|
|
245
|
+
naturalKeyOf: (values) => address(values.email),
|
|
246
|
+
validate: (input) => validateRows(auth, input),
|
|
247
|
+
write: (input) => writeRows(auth, users, input),
|
|
248
|
+
};
|
|
249
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import type { TenantMember } from '@flowdular/sdk/modules/auth';
|
|
2
|
+
import type { AuthRuntime } from '@flowdular/sdk/modules/auth/server';
|
|
3
|
+
import type {
|
|
4
|
+
SearchHit,
|
|
5
|
+
SearchProvider,
|
|
6
|
+
SearchProviderPage,
|
|
7
|
+
SearchProviderQuery,
|
|
8
|
+
} from '@flowdular/sdk/modules/search';
|
|
9
|
+
import { USER_PERMISSIONS } from '../acl/permissions.ts';
|
|
10
|
+
|
|
11
|
+
export const MEMBER_SEARCH_PROVIDER_KEY = 'users.members';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Members one query may read. auth.core applies both the predicate and this
|
|
15
|
+
* limit in SQL, so the read is the matching rows rather than the workspace.
|
|
16
|
+
* Ranking and the multi-term rule still run here, over that bounded set.
|
|
17
|
+
*/
|
|
18
|
+
export const MEMBER_SEARCH_SCAN_LIMIT = 500;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Terms of one query the provider may push down. auth.core matches a prefix,
|
|
22
|
+
* so a term that opens no name and no address answers nothing and the next one
|
|
23
|
+
* has to be asked for; the cap keeps a long query to a bounded number of reads
|
|
24
|
+
* of at most `MEMBER_SEARCH_SCAN_LIMIT` rows each, at the price of not finding
|
|
25
|
+
* a member only the fourth term or later opens.
|
|
26
|
+
*/
|
|
27
|
+
export const MEMBER_SEARCH_PUSHDOWN_LIMIT = 3;
|
|
28
|
+
|
|
29
|
+
/** The view a hit opens, as the users client contribution registers it. */
|
|
30
|
+
const MEMBER_VIEW_ID = 'users';
|
|
31
|
+
|
|
32
|
+
function aborted(signal: AbortSignal | undefined): boolean {
|
|
33
|
+
return signal?.aborted === true;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* The terms the query names, in the order they were typed. A query of only
|
|
38
|
+
* whitespace names none and reads nothing.
|
|
39
|
+
*/
|
|
40
|
+
function searchTerms(query: string): readonly string[] {
|
|
41
|
+
return query.split(' ').filter((term) => term.length > 0);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* How well one member answers the query. Only compared against other members,
|
|
46
|
+
* so the scale is this provider's own: an exact address beats a name that
|
|
47
|
+
* starts with the term, which beats a term found anywhere.
|
|
48
|
+
*/
|
|
49
|
+
export function memberScore(member: TenantMember, term: string): number {
|
|
50
|
+
const name = member.displayName.toLowerCase();
|
|
51
|
+
const email = member.email.toLowerCase();
|
|
52
|
+
if (email === term) return 1;
|
|
53
|
+
if (name === term) return 0.9;
|
|
54
|
+
if (name.startsWith(term)) return 0.8;
|
|
55
|
+
if (email.startsWith(term)) return 0.7;
|
|
56
|
+
if (name.includes(term)) return 0.5;
|
|
57
|
+
if (email.includes(term)) return 0.4;
|
|
58
|
+
return 0;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Every term has to land somewhere, so "ada lovelace" does not match "ada". */
|
|
62
|
+
export function matchMembers(
|
|
63
|
+
members: readonly TenantMember[],
|
|
64
|
+
query: string,
|
|
65
|
+
): readonly { readonly member: TenantMember; readonly score: number }[] {
|
|
66
|
+
const terms = query.toLowerCase().split(' ').filter(Boolean);
|
|
67
|
+
if (terms.length === 0) return [];
|
|
68
|
+
const matched: { member: TenantMember; score: number }[] = [];
|
|
69
|
+
for (const member of members) {
|
|
70
|
+
let best = 0;
|
|
71
|
+
let all = true;
|
|
72
|
+
for (const term of terms) {
|
|
73
|
+
const score = memberScore(member, term);
|
|
74
|
+
if (score === 0) {
|
|
75
|
+
all = false;
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
if (score > best) best = score;
|
|
79
|
+
}
|
|
80
|
+
if (all) matched.push({ member, score: best });
|
|
81
|
+
}
|
|
82
|
+
matched.sort(
|
|
83
|
+
(left, right) =>
|
|
84
|
+
right.score - left.score ||
|
|
85
|
+
left.member.displayName.localeCompare(right.member.displayName) ||
|
|
86
|
+
left.member.accountId.localeCompare(right.member.accountId),
|
|
87
|
+
);
|
|
88
|
+
return matched;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function toHit(member: TenantMember, score: number): SearchHit {
|
|
92
|
+
return {
|
|
93
|
+
ref: member.accountId,
|
|
94
|
+
title: member.displayName,
|
|
95
|
+
snippet: member.email,
|
|
96
|
+
viewId: MEMBER_VIEW_ID,
|
|
97
|
+
route: '/users?member=' + encodeURIComponent(member.accountId),
|
|
98
|
+
score,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* The workspace's members as a search provider. Every read goes through the
|
|
104
|
+
* auth administration port with the tenant of the principal search.core
|
|
105
|
+
* resolved, so this module still opens no table of another one.
|
|
106
|
+
*/
|
|
107
|
+
export function createMemberSearchProvider(auth: AuthRuntime): SearchProvider {
|
|
108
|
+
return {
|
|
109
|
+
key: MEMBER_SEARCH_PROVIDER_KEY,
|
|
110
|
+
label: 'Members',
|
|
111
|
+
permission: USER_PERMISSIONS.read,
|
|
112
|
+
async search(input: SearchProviderQuery): Promise<SearchProviderPage> {
|
|
113
|
+
if (aborted(input.signal)) return { hits: [], nextCursor: null };
|
|
114
|
+
const terms = searchTerms(input.query);
|
|
115
|
+
if (terms.length === 0) return { hits: [], nextCursor: null };
|
|
116
|
+
const service = await auth.service();
|
|
117
|
+
const pushdowns = Math.min(terms.length, MEMBER_SEARCH_PUSHDOWN_LIMIT);
|
|
118
|
+
/* The port matches a prefix, so the term typed first is not
|
|
119
|
+
necessarily the one that opens the member: "lovelace ada" has to
|
|
120
|
+
fall through to "ada" to reach Ada Lovelace. Each term is pushed
|
|
121
|
+
in turn until one answers rows, and `matchMembers` still requires
|
|
122
|
+
every term over what came back. */
|
|
123
|
+
let members: readonly TenantMember[] = [];
|
|
124
|
+
for (let index = 0; index < pushdowns; index += 1) {
|
|
125
|
+
members = await service.searchTenantMembers(input.tenantId, {
|
|
126
|
+
query: terms[index]!,
|
|
127
|
+
limit: MEMBER_SEARCH_SCAN_LIMIT,
|
|
128
|
+
});
|
|
129
|
+
if (members.length > 0) break;
|
|
130
|
+
if (aborted(input.signal)) return { hits: [], nextCursor: null };
|
|
131
|
+
}
|
|
132
|
+
if (aborted(input.signal)) return { hits: [], nextCursor: null };
|
|
133
|
+
const matched = matchMembers(members, input.query);
|
|
134
|
+
const offset = Number(input.cursor ?? '0');
|
|
135
|
+
const start =
|
|
136
|
+
Number.isSafeInteger(offset) && offset >= 0 ? offset : matched.length;
|
|
137
|
+
const page = matched.slice(start, start + input.limit);
|
|
138
|
+
const next = start + page.length;
|
|
139
|
+
return {
|
|
140
|
+
hits: page.map((entry) => toHit(entry.member, entry.score)),
|
|
141
|
+
nextCursor: next < matched.length ? String(next) : null,
|
|
142
|
+
};
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
}
|
|
@@ -2,10 +2,15 @@ import type {
|
|
|
2
2
|
AuthActor,
|
|
3
3
|
AuthPrincipal,
|
|
4
4
|
CreateTenantMemberInput,
|
|
5
|
+
CreateTenantMemberWithoutPasswordInput,
|
|
5
6
|
TenantMember,
|
|
7
|
+
TenantMemberKeyset,
|
|
8
|
+
TenantMemberSort,
|
|
9
|
+
TenantMemberSortedPage,
|
|
6
10
|
TenantRole,
|
|
7
11
|
} from '@flowdular/sdk/modules/auth';
|
|
8
12
|
import type { AuthRuntime } from '@flowdular/sdk/modules/auth/server';
|
|
13
|
+
import { AuthServiceError } from '@flowdular/sdk/modules/auth/server';
|
|
9
14
|
|
|
10
15
|
export interface CreateUserInput {
|
|
11
16
|
readonly email: string;
|
|
@@ -14,8 +19,30 @@ export interface CreateUserInput {
|
|
|
14
19
|
readonly role: string;
|
|
15
20
|
}
|
|
16
21
|
|
|
17
|
-
export
|
|
18
|
-
|
|
22
|
+
export type MemberStatusFilter = 'active' | 'disabled' | null;
|
|
23
|
+
|
|
24
|
+
export interface MemberListInput {
|
|
25
|
+
readonly sort: TenantMemberSort;
|
|
26
|
+
readonly direction: 'asc' | 'desc';
|
|
27
|
+
readonly limit: number;
|
|
28
|
+
/** A prefix of the display name or the address; empty narrows nothing. */
|
|
29
|
+
readonly query: string;
|
|
30
|
+
readonly status: MemberStatusFilter;
|
|
31
|
+
readonly after: TenantMemberKeyset | null;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Ids one bulk member action may name. */
|
|
35
|
+
export const MEMBER_BULK_LIMIT = 100;
|
|
36
|
+
|
|
37
|
+
export interface MemberBulkOutcome {
|
|
38
|
+
readonly accountId: string;
|
|
39
|
+
readonly outcome: 'updated' | 'not-found' | 'refused';
|
|
40
|
+
/** The stable auth.core code behind a refusal. */
|
|
41
|
+
readonly reason?: string;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** What the Members screen needs beside the page it shows. */
|
|
45
|
+
export interface UsersContext {
|
|
19
46
|
readonly roles: readonly Pick<
|
|
20
47
|
TenantRole,
|
|
21
48
|
'id' | 'key' | 'name' | 'builtin'
|
|
@@ -25,6 +52,8 @@ export interface UserDirectory {
|
|
|
25
52
|
readonly actor: { readonly accountId: string; readonly role: string };
|
|
26
53
|
/** Shared auth.core setting, read through the declared dependency. */
|
|
27
54
|
readonly passwordMinLength: number;
|
|
55
|
+
/** Every membership of the workspace, counted in the database. */
|
|
56
|
+
readonly memberCount: number;
|
|
28
57
|
}
|
|
29
58
|
|
|
30
59
|
function actor(principal: AuthPrincipal): AuthActor {
|
|
@@ -47,16 +76,35 @@ export class UsersService {
|
|
|
47
76
|
this.#auth = auth;
|
|
48
77
|
}
|
|
49
78
|
|
|
50
|
-
|
|
79
|
+
/* One page, sorted, narrowed and cut by auth.core; the screen shows it as
|
|
80
|
+
it arrives. */
|
|
81
|
+
async list(
|
|
82
|
+
principal: AuthPrincipal,
|
|
83
|
+
input: MemberListInput,
|
|
84
|
+
): Promise<TenantMemberSortedPage> {
|
|
85
|
+
return (await this.#auth.service()).listTenantMembersSorted(
|
|
86
|
+
principal.tenantId,
|
|
87
|
+
{
|
|
88
|
+
sort: input.sort,
|
|
89
|
+
direction: input.direction,
|
|
90
|
+
limit: input.limit,
|
|
91
|
+
query: input.query,
|
|
92
|
+
membershipStatus: input.status,
|
|
93
|
+
after: input.after,
|
|
94
|
+
},
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
async context(principal: AuthPrincipal): Promise<UsersContext> {
|
|
51
99
|
const service = await this.#auth.service();
|
|
52
100
|
return {
|
|
53
|
-
users: await service.listTenantMembers(principal.tenantId),
|
|
54
101
|
roles: (await service.listRoles(principal.tenantId)).map(
|
|
55
102
|
({ id, key, name, builtin }) => ({ id, key, name, builtin }),
|
|
56
103
|
),
|
|
57
104
|
grantableScopes: await service.listGrantableScopes(principal.tenantId),
|
|
58
105
|
actor: { accountId: principal.accountId, role: principal.role },
|
|
59
106
|
passwordMinLength: this.#auth.settings.passwordMinLength,
|
|
107
|
+
memberCount: await service.countTenantMembers(principal.tenantId),
|
|
60
108
|
};
|
|
61
109
|
}
|
|
62
110
|
|
|
@@ -74,6 +122,22 @@ export class UsersService {
|
|
|
74
122
|
);
|
|
75
123
|
}
|
|
76
124
|
|
|
125
|
+
/* A member who holds no password: auth.core stores its unusable credential
|
|
126
|
+
marker, so no secret is drawn here and none has to be delivered. */
|
|
127
|
+
async createWithoutPassword(
|
|
128
|
+
principal: AuthPrincipal,
|
|
129
|
+
input: Omit<CreateUserInput, 'password'>,
|
|
130
|
+
): Promise<TenantMember> {
|
|
131
|
+
const record: CreateTenantMemberWithoutPasswordInput = {
|
|
132
|
+
...input,
|
|
133
|
+
tenantId: principal.tenantId,
|
|
134
|
+
};
|
|
135
|
+
return (await this.#auth.service()).createTenantMemberWithoutPassword(
|
|
136
|
+
record,
|
|
137
|
+
actor(principal),
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
|
|
77
141
|
async rename(
|
|
78
142
|
principal: AuthPrincipal,
|
|
79
143
|
accountId: string,
|
|
@@ -110,6 +174,55 @@ export class UsersService {
|
|
|
110
174
|
);
|
|
111
175
|
}
|
|
112
176
|
|
|
177
|
+
/* Workspace access for several members at once: the membership path the
|
|
178
|
+
drawer's switch uses, once per id, so every row keeps its own audit event
|
|
179
|
+
and its own refusal (the acting principal, the last owner, an owner
|
|
180
|
+
touched by a non-owner) and a missing or foreign id costs nobody else. */
|
|
181
|
+
setMembershipStatusMany(
|
|
182
|
+
principal: AuthPrincipal,
|
|
183
|
+
accountIds: readonly string[],
|
|
184
|
+
status: 'active' | 'disabled',
|
|
185
|
+
): Promise<readonly MemberBulkOutcome[]> {
|
|
186
|
+
return this.#each(accountIds, async (accountId) => {
|
|
187
|
+
await (
|
|
188
|
+
await this.#auth.service()
|
|
189
|
+
).setMembershipStatus(actor(principal), accountId, status);
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
assignRoleMany(
|
|
194
|
+
principal: AuthPrincipal,
|
|
195
|
+
accountIds: readonly string[],
|
|
196
|
+
roleKey: string,
|
|
197
|
+
): Promise<readonly MemberBulkOutcome[]> {
|
|
198
|
+
return this.#each(accountIds, async (accountId) => {
|
|
199
|
+
await (
|
|
200
|
+
await this.#auth.service()
|
|
201
|
+
).assignMemberRole(actor(principal), accountId, roleKey);
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
async #each(
|
|
206
|
+
accountIds: readonly string[],
|
|
207
|
+
write: (accountId: string) => Promise<void>,
|
|
208
|
+
): Promise<readonly MemberBulkOutcome[]> {
|
|
209
|
+
const outcomes: MemberBulkOutcome[] = [];
|
|
210
|
+
for (const accountId of accountIds) {
|
|
211
|
+
try {
|
|
212
|
+
await write(accountId);
|
|
213
|
+
outcomes.push({ accountId, outcome: 'updated' });
|
|
214
|
+
} catch (error) {
|
|
215
|
+
if (!(error instanceof AuthServiceError)) throw error;
|
|
216
|
+
outcomes.push(
|
|
217
|
+
error.code === 'ACCOUNT_NOT_FOUND'
|
|
218
|
+
? { accountId, outcome: 'not-found' }
|
|
219
|
+
: { accountId, outcome: 'refused', reason: error.code },
|
|
220
|
+
);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return outcomes;
|
|
224
|
+
}
|
|
225
|
+
|
|
113
226
|
async remove(principal: AuthPrincipal, accountId: string): Promise<void> {
|
|
114
227
|
await (
|
|
115
228
|
await this.#auth.service()
|
|
@@ -19,6 +19,10 @@
|
|
|
19
19
|
"invite.sending": "Sending…",
|
|
20
20
|
"invite.sent": "Invitation sent to {email}.",
|
|
21
21
|
"invite.error": "The invitation could not be sent.",
|
|
22
|
+
"export.action": "Export CSV",
|
|
23
|
+
"export.started": "The member export started. It appears on the Exports screen as soon as the file is ready.",
|
|
24
|
+
"export.link": "Open Exports",
|
|
25
|
+
"export.error": "The export could not be started.",
|
|
22
26
|
"action.manage": "Manage",
|
|
23
27
|
"action.cancel": "Cancel",
|
|
24
28
|
"action.close": "Close",
|
|
@@ -31,10 +35,11 @@
|
|
|
31
35
|
"denied.members": "Reading the user directory needs the users.members.read scope.",
|
|
32
36
|
"table.title": "Members",
|
|
33
37
|
"table.caption": "Workspace users",
|
|
34
|
-
"table.count": "{
|
|
38
|
+
"table.count": "{accounts} accounts",
|
|
35
39
|
"table.user": "User",
|
|
40
|
+
"table.email": "Email",
|
|
36
41
|
"table.role": "Role",
|
|
37
|
-
"table.status": "
|
|
42
|
+
"table.status": "Workspace access",
|
|
38
43
|
"table.scopes": "Scopes",
|
|
39
44
|
"table.actions": "User actions",
|
|
40
45
|
"table.loading": "Loading workspace accounts…",
|
|
@@ -42,11 +47,36 @@
|
|
|
42
47
|
"table.emptyHint": "Create the first account for this workspace.",
|
|
43
48
|
"table.emptyFilteredTitle": "No matching accounts",
|
|
44
49
|
"table.emptyFilteredHint": "No account in this workspace matches the current filter.",
|
|
50
|
+
"selection.label": "Select all members on screen",
|
|
51
|
+
"selection.rowLabel": "Select {name}",
|
|
52
|
+
"selection.clear": "Clear selection",
|
|
53
|
+
"selection.summary": "{count} selected",
|
|
54
|
+
"action.deactivateSelected": "Deactivate selected",
|
|
55
|
+
"action.assignRoleSelected": "Assign role",
|
|
56
|
+
"action.bulkRefused": "Select at least one member other than yourself.",
|
|
57
|
+
"deactivateMany.title": "Deactivate the selected members?",
|
|
58
|
+
"deactivateMany.description": "{count} members lose access to this workspace; their sessions and API tokens here are revoked. Their other workspaces are untouched.",
|
|
59
|
+
"roleMany.title": "Assign a role to the selected members",
|
|
60
|
+
"roleMany.description": "The role replaces the scopes of {count} members.",
|
|
61
|
+
"notice.deactivatedMany": "Deactivated {updated}, missing {missing}, refused {refused}.",
|
|
62
|
+
"notice.roleAssignedMany": "Role assigned to {updated}, missing {missing}, refused {refused}.",
|
|
63
|
+
"error.deactivateMany": "Could not deactivate the selected members.",
|
|
64
|
+
"error.roleMany": "Could not assign the role to the selected members.",
|
|
65
|
+
"common.messages": "Messages",
|
|
45
66
|
"table.note": "Roles decide what an account may reach. Owners administer the workspace; every other role carries exactly the scopes it lists.",
|
|
46
|
-
"search.placeholder": "
|
|
67
|
+
"search.placeholder": "Starts with name or email",
|
|
47
68
|
"search.label": "Filter members",
|
|
69
|
+
"filter.label": "Filters",
|
|
70
|
+
"filter.status": "Workspace access",
|
|
71
|
+
"filter.allStatuses": "All",
|
|
72
|
+
"pagination.label": "Member pages",
|
|
73
|
+
"pagination.previous": "Previous",
|
|
74
|
+
"pagination.next": "Next",
|
|
75
|
+
"pagination.size": "Members per page",
|
|
76
|
+
"pagination.summary": "Page {page} · from member {from}",
|
|
48
77
|
"status.active": "Active",
|
|
49
78
|
"status.disabled": "Disabled",
|
|
79
|
+
"status.blocked": "Operator block",
|
|
50
80
|
"status.passwordResetPending": "Password reset pending",
|
|
51
81
|
"drawer.newTitle": "New account",
|
|
52
82
|
"drawer.newSubtitle": "Direct workspace access",
|
|
@@ -68,28 +98,47 @@
|
|
|
68
98
|
"member.saveName": "Save name",
|
|
69
99
|
"member.roleDescription": "A role sets the scopes below; custom roles live on the Roles screen.",
|
|
70
100
|
"member.assignRole": "Assign role",
|
|
101
|
+
"member.access": "Access to this workspace",
|
|
102
|
+
"member.accessDescription": "Turns this membership on or off. It never touches the person's other workspaces or their account.",
|
|
103
|
+
"membership.active": "Active in this workspace",
|
|
104
|
+
"membership.disabled": "Disabled in this workspace",
|
|
105
|
+
"membership.reasonActive": "The member signs in to this workspace normally. Other workspaces are unaffected either way.",
|
|
106
|
+
"membership.reasonDisabled": "Sign-in to this workspace is refused and its sessions and API tokens are revoked. Other workspaces keep working.",
|
|
107
|
+
"membership.disable": "Disable access",
|
|
108
|
+
"membership.confirmTitle": "Disable access for {name}?",
|
|
109
|
+
"membership.confirmDescription": "Sessions and API tokens for this workspace are revoked at once and sign-in here is refused. Other workspaces stay untouched. Turning access back on restores sign-in, not the revoked tokens.",
|
|
110
|
+
"membership.error": "Workspace access could not be changed.",
|
|
111
|
+
"membership.errorSelf": "You cannot change your own access to this workspace. Ask another owner.",
|
|
112
|
+
"membership.errorLastOwner": "This is the last active owner of the workspace. Give another member the owner role first.",
|
|
113
|
+
"membership.errorOwnerRequired": "Only an owner can change another owner's access to this workspace.",
|
|
114
|
+
"membership.errorNotFound": "This member is no longer in the workspace. Refresh the list.",
|
|
71
115
|
"member.account": "Account",
|
|
72
|
-
"member.accountDescription": "
|
|
73
|
-
"member.
|
|
74
|
-
"member.enable": "Enable account",
|
|
116
|
+
"member.accountDescription": "The global account state an operator owns. Signing out ends every session of this account, in every workspace.",
|
|
117
|
+
"member.accountReadOnly": "Blocking or unblocking an account is a deployment operator action and cannot be done here. Use the workspace access switch above to end access to this workspace.",
|
|
75
118
|
"member.signOutEverywhere": "Sign out everywhere",
|
|
76
119
|
"member.temporaryPassword": "Temporary password",
|
|
77
120
|
"member.temporaryPasswordHelp": "At least {min} characters. The member picks a new one at the next sign-in.",
|
|
78
121
|
"member.resetPassword": "Reset password",
|
|
122
|
+
"member.mfa": "Multi-factor authentication",
|
|
123
|
+
"member.mfaDescription": "Clear the enrolled authenticator when a member loses the device. The member enrols again from account security.",
|
|
124
|
+
"member.resetMfa": "Reset MFA",
|
|
79
125
|
"member.removeTitle": "Remove from workspace",
|
|
80
126
|
"member.removeDescription": "Ends the membership with its sessions and tokens; the account stays if it belongs to another workspace.",
|
|
81
127
|
"member.remove": "Remove member",
|
|
82
128
|
"notice.nameSaved": "Display name saved.",
|
|
83
129
|
"notice.roleAssigned": "Role assigned.",
|
|
84
130
|
"notice.scopesSaved": "Scopes saved.",
|
|
85
|
-
"notice.
|
|
86
|
-
"notice.
|
|
131
|
+
"notice.membershipDisabled": "Access to this workspace disabled.",
|
|
132
|
+
"notice.membershipEnabled": "Access to this workspace enabled.",
|
|
87
133
|
"notice.passwordSet": "Temporary password set. The member must change it at sign-in.",
|
|
134
|
+
"notice.mfaReset": "Multi-factor authentication cleared. The member must enrol again.",
|
|
88
135
|
"notice.sessionsCount": "Sessions ended: {count}.",
|
|
89
136
|
"notice.sessionsEnded": "Sessions ended.",
|
|
90
137
|
"remove.title": "Remove this member?",
|
|
91
138
|
"remove.fallbackName": "The member",
|
|
92
139
|
"remove.description": "{name} loses access to this workspace immediately. Sessions and API tokens for this membership are revoked.",
|
|
140
|
+
"mfaReset.title": "Reset multi-factor authentication?",
|
|
141
|
+
"mfaReset.description": "{name} loses the enrolled authenticator and every recovery code, and must enrol again before the next sign-in that asks for a second factor.",
|
|
93
142
|
"roles.title": "Roles",
|
|
94
143
|
"roles.description": "Built-in and custom roles with the exact scopes they grant.",
|
|
95
144
|
"roles.new": "New role",
|