@flowdular/sdk 0.2.4 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.ai/agents/sandbox/business-manager.md +5 -1
- package/.ai/blueprints/author-spec/README.md +1 -1
- package/.ai/blueprints/author-spec/spec-requirements.yaml +44 -0
- package/.ai/blueprints/author-spec/steps.yaml +5 -5
- package/.ai/blueprints/author-spec/templates/module.yaml +99 -3
- package/.ai/blueprints/edit-module/gates.yaml +4 -0
- package/.ai/blueprints/edit-module/required-files.yaml +9 -0
- package/.ai/blueprints/new-module/gates.yaml +4 -0
- package/.ai/blueprints/new-module/spec-requirements.yaml +2 -2
- package/.ai/blueprints/release/gates.yaml +4 -0
- package/.ai/platform-capabilities.md +128 -0
- package/.ai/policies/capabilities.yaml +130 -3
- package/.ai/policies/path-ownership.yaml +5 -2
- package/.ai/policies/task-budgets.yaml +5 -3
- package/.ai/references/catalog/module.json +4 -4
- package/.ai/references/catalog/package.json +2 -2
- package/.ai/references/catalog/spec/module.yaml +5 -3
- package/.ai/references/catalog/src/platform.ts +2 -0
- package/.ai/references/catalog/src/services/catalog-service.ts +89 -1
- package/.ai/references/catalog/src/services/data-classes.ts +47 -0
- package/.ai/references/catalog/src/services/database-repository.ts +98 -1
- package/.ai/references/catalog/src/services/repository.ts +22 -1
- package/.ai/references/catalog/tests/data-classes.test.ts +157 -0
- package/.ai/references/catalog.provenance.json +12 -10
- package/.ai/skills/README.md +10 -0
- package/.ai/skills/agent-tool-design/SKILL.md +1 -2
- package/.ai/skills/auth-security-review/SKILL.md +1 -1
- package/.ai/skills/business-agent-design/SKILL.md +0 -1
- package/.ai/skills/cli-extension/SKILL.md +1 -1
- package/.ai/skills/deploy-operate/SKILL.md +119 -0
- package/.ai/skills/module-new/SKILL.md +29 -3
- package/.ai/skills/module-update/SKILL.md +9 -3
- package/.ai/skills/perf-audit/SKILL.md +0 -1
- package/.ai/skills/release-eject-pr/SKILL.md +0 -1
- package/.ai/skills/spec-interview/SKILL.md +120 -0
- package/.ai/skills/test-hardening/SKILL.md +1 -0
- package/.ai/skills/ux-design/SKILL.md +34 -3
- package/.ai/skills/variables/SKILL.md +0 -2
- package/.ai/skills/workflow-development/SKILL.md +0 -1
- package/AGENTS.md +4 -0
- package/docs/agent-contract.md +2 -2
- package/docs/design-system.md +185 -31
- package/modules/access/migrations/0001_access_core.down.sql +1 -0
- package/modules/access/migrations/0001_access_core.up.sql +28 -0
- package/modules/access/migrations/README.md +3 -0
- package/modules/access/module.json +33 -0
- package/modules/access/package.json +43 -0
- package/modules/access/spec/module.yaml +225 -0
- package/modules/access/src/acl/permissions.ts +6 -0
- package/modules/access/src/api/endpoints.ts +244 -0
- package/modules/access/src/client/ActivityView.tsrx +245 -0
- package/modules/access/src/client/AttestationsView.tsrx +176 -0
- package/modules/access/src/client/ReviewView.tsrx +586 -0
- package/modules/access/src/client/api.ts +132 -0
- package/modules/access/src/client/contribution.tsrx +41 -0
- package/modules/access/src/client/index.ts +41 -0
- package/modules/access/src/client/navigation.ts +57 -0
- package/modules/access/src/client/presentation.ts +69 -0
- package/modules/access/src/client/state.ts +72 -0
- package/modules/access/src/domain/types.ts +189 -0
- package/modules/access/src/index.ts +38 -0
- package/modules/access/src/platform.ts +60 -0
- package/modules/access/src/server/index.ts +42 -0
- package/modules/access/src/server/runtime.ts +105 -0
- package/modules/access/src/services/access-service.ts +298 -0
- package/modules/access/src/services/audit-window.ts +78 -0
- package/modules/access/src/services/auth-directory.ts +72 -0
- package/modules/access/src/services/changes.ts +91 -0
- package/modules/access/src/services/data-classes.ts +28 -0
- package/modules/access/src/services/database-repository.ts +185 -0
- package/modules/access/src/services/directory.ts +102 -0
- package/modules/access/src/services/index.ts +33 -0
- package/modules/access/src/services/list-exports.ts +150 -0
- package/modules/access/src/services/migration.ts +54 -0
- package/modules/access/src/services/repository.ts +30 -0
- package/modules/access/src/services/review.ts +178 -0
- package/modules/access/translations/en.json +155 -0
- package/modules/access/translations/pl.json +155 -0
- package/modules/agents/migrations/0022_credential_rotation_inventory.down.sql +2 -0
- package/modules/agents/migrations/0022_credential_rotation_inventory.up.sql +7 -0
- package/modules/agents/migrations/0023_agents_retention_indexes.down.sql +2 -0
- package/modules/agents/migrations/0023_agents_retention_indexes.up.sql +9 -0
- package/modules/agents/migrations/0024_agent_meter_refusals.down.sql +3 -0
- package/modules/agents/migrations/0024_agent_meter_refusals.up.sql +22 -0
- package/modules/agents/migrations/0025_agent_list_indexes.down.sql +3 -0
- package/modules/agents/migrations/0025_agent_list_indexes.up.sql +11 -0
- package/modules/agents/module.json +30 -4
- package/modules/agents/package.json +2 -1
- package/modules/agents/spec/module.yaml +63 -5
- package/modules/agents/src/api/endpoints.ts +291 -33
- package/modules/agents/src/cli/commands.json +11 -0
- package/modules/agents/src/cli/index.ts +45 -0
- package/modules/agents/src/client/AgentDashboardWidget.tsrx +19 -11
- package/modules/agents/src/client/AgentDefinitionList.tsrx +53 -10
- package/modules/agents/src/client/AgentPlaygroundView.tsrx +4 -4
- package/modules/agents/src/client/AgentProceduresView.tsrx +2 -2
- package/modules/agents/src/client/AgentRunsView.tsrx +143 -40
- package/modules/agents/src/client/AgentsView.tsrx +109 -33
- package/modules/agents/src/client/api.ts +99 -21
- package/modules/agents/src/client/state.ts +97 -0
- package/modules/agents/src/domain/types.ts +44 -4
- package/modules/agents/src/platform.ts +42 -0
- package/modules/agents/src/server/action-execution.ts +201 -106
- package/modules/agents/src/server/runtime.ts +32 -0
- package/modules/agents/src/services/agent-service.ts +158 -30
- package/modules/agents/src/services/credential-rotation.ts +185 -0
- package/modules/agents/src/services/credential-vault.ts +71 -46
- package/modules/agents/src/services/data-classes.ts +176 -0
- package/modules/agents/src/services/database-repository.ts +393 -101
- package/modules/agents/src/services/metering.ts +111 -0
- package/modules/agents/src/services/migration.ts +109 -0
- package/modules/agents/src/services/module-agent-preflight.ts +17 -9
- package/modules/agents/src/services/notifications.ts +98 -0
- package/modules/agents/src/services/provider-repository.ts +9 -18
- package/modules/agents/src/services/provider-service.ts +1 -9
- package/modules/agents/src/services/reports.ts +107 -0
- package/modules/agents/src/services/repository.ts +86 -6
- package/modules/agents/src/services/usage-service.ts +2 -0
- package/modules/agents/src/services/worker.ts +114 -4
- package/modules/agents/src/settings.ts +14 -3
- package/modules/agents/translations/en.json +14 -4
- package/modules/agents/translations/pl.json +14 -4
- package/modules/approvals/migrations/0001_approvals_core.down.sql +3 -0
- package/modules/approvals/migrations/0001_approvals_core.up.sql +78 -0
- package/modules/approvals/migrations/0002_approvals_expiry_routing_role.down.sql +2 -0
- package/modules/approvals/migrations/0002_approvals_expiry_routing_role.up.sql +19 -0
- package/modules/approvals/migrations/0003_approvals_retention_indexes.down.sql +6 -0
- package/modules/approvals/migrations/0003_approvals_retention_indexes.up.sql +14 -0
- package/modules/approvals/migrations/0004_approvals_inbox_keyset_indexes.down.sql +5 -0
- package/modules/approvals/migrations/0004_approvals_inbox_keyset_indexes.up.sql +12 -0
- package/modules/approvals/migrations/0005_approvals_grant_audit.down.sql +4 -0
- package/modules/approvals/migrations/0005_approvals_grant_audit.up.sql +20 -0
- package/modules/approvals/migrations/README.md +3 -0
- package/modules/approvals/module.json +34 -0
- package/modules/approvals/package.json +43 -0
- package/modules/approvals/spec/module.yaml +327 -0
- package/modules/approvals/src/acl/permissions.ts +7 -0
- package/modules/approvals/src/api/endpoints.ts +457 -0
- package/modules/approvals/src/client/ApprovalRequestDrawer.tsrx +138 -0
- package/modules/approvals/src/client/ApprovalsView.tsrx +562 -0
- package/modules/approvals/src/client/PendingCountWidget.tsrx +52 -0
- package/modules/approvals/src/client/api.ts +203 -0
- package/modules/approvals/src/client/approvals.css +51 -0
- package/modules/approvals/src/client/contribution.tsrx +44 -0
- package/modules/approvals/src/client/index.ts +26 -0
- package/modules/approvals/src/client/navigation.ts +39 -0
- package/modules/approvals/src/client/pending-count.ts +26 -0
- package/modules/approvals/src/client/presentation.ts +52 -0
- package/modules/approvals/src/client/state.ts +141 -0
- package/modules/approvals/src/domain/capability.ts +107 -0
- package/modules/approvals/src/domain/grant.ts +69 -0
- package/modules/approvals/src/domain/types.ts +168 -0
- package/modules/approvals/src/index.ts +61 -0
- package/modules/approvals/src/platform.ts +136 -0
- package/modules/approvals/src/server/index.ts +42 -0
- package/modules/approvals/src/server/runtime.ts +185 -0
- package/modules/approvals/src/services/approvals-service.ts +637 -0
- package/modules/approvals/src/services/callbacks.ts +75 -0
- package/modules/approvals/src/services/data-classes.ts +167 -0
- package/modules/approvals/src/services/database-repository.ts +783 -0
- package/modules/approvals/src/services/eligibility.ts +121 -0
- package/modules/approvals/src/services/expiry-runner.ts +81 -0
- package/modules/approvals/src/services/index.ts +31 -0
- package/modules/approvals/src/services/migration.ts +256 -0
- package/modules/approvals/src/services/notifications.ts +95 -0
- package/modules/approvals/src/services/repository.ts +169 -0
- package/modules/approvals/src/services/service-error.ts +70 -0
- package/modules/approvals/src/settings.ts +102 -0
- package/modules/approvals/translations/en.json +104 -0
- package/modules/approvals/translations/pl.json +104 -0
- package/modules/audit/migrations/0001_audit_core.down.sql +8 -0
- package/modules/audit/migrations/0001_audit_core.up.sql +107 -0
- package/modules/audit/migrations/0002_audit_sweep_routing_role.down.sql +2 -0
- package/modules/audit/migrations/0002_audit_sweep_routing_role.up.sql +21 -0
- package/modules/audit/migrations/0003_audit_export_request.down.sql +12 -0
- package/modules/audit/migrations/0003_audit_export_request.up.sql +40 -0
- package/modules/audit/migrations/0004_audit_hold_seal_erasure.down.sql +17 -0
- package/modules/audit/migrations/0004_audit_hold_seal_erasure.up.sql +192 -0
- package/modules/audit/migrations/0005_audit_event_format.down.sql +17 -0
- package/modules/audit/migrations/0005_audit_event_format.up.sql +60 -0
- package/modules/audit/migrations/0006_audit_own_class_walks.down.sql +3 -0
- package/modules/audit/migrations/0006_audit_own_class_walks.up.sql +14 -0
- package/modules/audit/migrations/README.md +3 -0
- package/modules/audit/module.json +32 -0
- package/modules/audit/package.json +49 -0
- package/modules/audit/spec/module.yaml +809 -0
- package/modules/audit/src/acl/permissions.ts +7 -0
- package/modules/audit/src/api/endpoints.ts +315 -0
- package/modules/audit/src/cli/commands.json +95 -0
- package/modules/audit/src/cli/index.ts +658 -0
- package/modules/audit/src/client/DataClassesView.tsrx +420 -0
- package/modules/audit/src/client/ExportsView.tsrx +256 -0
- package/modules/audit/src/client/HoldsView.tsrx +604 -0
- package/modules/audit/src/client/SweepsView.tsrx +251 -0
- package/modules/audit/src/client/api.ts +185 -0
- package/modules/audit/src/client/contribution.tsrx +52 -0
- package/modules/audit/src/client/index.ts +23 -0
- package/modules/audit/src/client/navigation.ts +74 -0
- package/modules/audit/src/client/presentation.ts +105 -0
- package/modules/audit/src/client/state.ts +86 -0
- package/modules/audit/src/domain/data-classes.ts +16 -0
- package/modules/audit/src/domain/types.ts +339 -0
- package/modules/audit/src/index.ts +76 -0
- package/modules/audit/src/platform.ts +44 -0
- package/modules/audit/src/server/index.ts +177 -0
- package/modules/audit/src/server/runtime.ts +303 -0
- package/modules/audit/src/services/anchor-key.ts +143 -0
- package/modules/audit/src/services/anchor-rotation.ts +147 -0
- package/modules/audit/src/services/audit-runners.ts +278 -0
- package/modules/audit/src/services/backup-guard.ts +95 -0
- package/modules/audit/src/services/database-repository.ts +1946 -0
- package/modules/audit/src/services/declared-classes.ts +64 -0
- package/modules/audit/src/services/erasure-port.ts +126 -0
- package/modules/audit/src/services/erasure-service.ts +770 -0
- package/modules/audit/src/services/export-directory.ts +106 -0
- package/modules/audit/src/services/export-service.ts +714 -0
- package/modules/audit/src/services/hold-service.ts +295 -0
- package/modules/audit/src/services/index.ts +17 -0
- package/modules/audit/src/services/migration.ts +658 -0
- package/modules/audit/src/services/own-classes.ts +318 -0
- package/modules/audit/src/services/platform-version.ts +23 -0
- package/modules/audit/src/services/repository.ts +495 -0
- package/modules/audit/src/services/retention-service.ts +191 -0
- package/modules/audit/src/services/seal-service.ts +769 -0
- package/modules/audit/src/services/service-error.ts +61 -0
- package/modules/audit/src/services/subject-keys.ts +90 -0
- package/modules/audit/src/services/sweep-service.ts +298 -0
- package/modules/audit/src/services/zip.ts +217 -0
- package/modules/audit/src/settings.ts +69 -0
- package/modules/audit/translations/en.json +210 -0
- package/modules/audit/translations/pl.json +210 -0
- package/modules/auth/README.md +77 -29
- package/modules/auth/migrations/0016_external_identities.up.sql +16 -0
- package/modules/auth/migrations/0017_mfa_key_id.up.sql +8 -0
- package/modules/auth/migrations/0018_retire_bundled_module_scopes.up.sql +29 -0
- package/modules/auth/migrations/0019_notifications_member_scopes.up.sql +44 -0
- package/modules/auth/migrations/0020_identity_providers.up.sql +61 -0
- package/modules/auth/migrations/0021_membership_status.up.sql +19 -0
- package/modules/auth/migrations/0022_auth_provider_scopes.up.sql +45 -0
- package/modules/auth/migrations/0023_enterprise_module_scopes.down.sql +19 -0
- package/modules/auth/migrations/0023_enterprise_module_scopes.up.sql +71 -0
- package/modules/auth/migrations/0024_approvals_member_scopes.down.sql +22 -0
- package/modules/auth/migrations/0024_approvals_member_scopes.up.sql +48 -0
- package/modules/auth/migrations/0025_audit_holds_owner_scope.down.sql +21 -0
- package/modules/auth/migrations/0025_audit_holds_owner_scope.up.sql +47 -0
- package/modules/auth/migrations/0026_auth_export_keyset_indexes.down.sql +6 -0
- package/modules/auth/migrations/0026_auth_export_keyset_indexes.up.sql +15 -0
- package/modules/auth/migrations/0027_workflow_automation_profile_scopes.down.sql +34 -0
- package/modules/auth/migrations/0027_workflow_automation_profile_scopes.up.sql +72 -0
- package/modules/auth/migrations/0028_auth_member_search_prefix_indexes.down.sql +6 -0
- package/modules/auth/migrations/0028_auth_member_search_prefix_indexes.up.sql +21 -0
- package/modules/auth/migrations/0029_reports_exports_access_scopes.down.sql +22 -0
- package/modules/auth/migrations/0029_reports_exports_access_scopes.up.sql +56 -0
- package/modules/auth/migrations/0030_auth_membership_keyset_index.down.sql +4 -0
- package/modules/auth/migrations/0030_auth_membership_keyset_index.up.sql +10 -0
- package/modules/auth/migrations/0031_membership_scope_backfills_under_rls.down.sql +4 -0
- package/modules/auth/migrations/0031_membership_scope_backfills_under_rls.up.sql +31 -0
- package/modules/auth/migrations/0032_audit_actor_service.down.sql +9 -0
- package/modules/auth/migrations/0032_audit_actor_service.up.sql +10 -0
- package/modules/auth/migrations/0033_auth_account_keyset_indexes.down.sql +5 -0
- package/modules/auth/migrations/0033_auth_account_keyset_indexes.up.sql +23 -0
- package/modules/auth/module.json +3 -3
- package/modules/auth/package.json +2 -1
- package/modules/auth/spec/module.yaml +372 -3
- package/modules/auth/src/acl/scopes.ts +50 -6
- package/modules/auth/src/cli/commands.json +11 -0
- package/modules/auth/src/cli/greenfield.ts +2 -2
- package/modules/auth/src/cli/index.ts +14 -0
- package/modules/auth/src/cli/secrets.ts +114 -0
- package/modules/auth/src/client/AuthenticationCore.tsrx +61 -8
- package/modules/auth/src/client/api.ts +72 -6
- package/modules/auth/src/client/contribution.tsrx +23 -0
- package/modules/auth/src/client/index.ts +6 -0
- package/modules/auth/src/client/providers/IdentityProviderForm.tsrx +191 -0
- package/modules/auth/src/client/providers/IdentityProvidersView.tsrx +358 -0
- package/modules/auth/src/client/providers/api.ts +128 -0
- package/modules/auth/src/client/providers/provider-columns.tsrx +60 -0
- package/modules/auth/src/client/providers/state.ts +35 -0
- package/modules/auth/src/client/security/SecurityView.tsrx +9 -1
- package/modules/auth/src/client/state.ts +15 -1
- package/modules/auth/src/domain/types.ts +55 -0
- package/modules/auth/src/index.ts +11 -1
- package/modules/auth/src/middleware/authentication.ts +4 -0
- package/modules/auth/src/server/endpoints.ts +467 -171
- package/modules/auth/src/server/http.ts +3 -2
- package/modules/auth/src/server/index.ts +22 -1
- package/modules/auth/src/server/membership-endpoints.ts +62 -0
- package/modules/auth/src/server/mfa-enforcement.ts +156 -0
- package/modules/auth/src/server/oidc.ts +389 -0
- package/modules/auth/src/server/provider-endpoints.ts +246 -0
- package/modules/auth/src/server/provider-host.ts +77 -0
- package/modules/auth/src/server/runtime.ts +231 -55
- package/modules/auth/src/services/auth-service-error.ts +7 -2
- package/modules/auth/src/services/auth-service.ts +948 -51
- package/modules/auth/src/services/data-classes.ts +236 -0
- package/modules/auth/src/services/database-repository.ts +853 -71
- package/modules/auth/src/services/identity-provider-service.ts +571 -0
- package/modules/auth/src/services/mail-delivery.ts +16 -16
- package/modules/auth/src/services/mail-message.ts +54 -0
- package/modules/auth/src/services/mail-port.ts +24 -0
- package/modules/auth/src/services/mail-smtp.ts +85 -0
- package/modules/auth/src/services/mfa-rotation.ts +144 -0
- package/modules/auth/src/services/migration.ts +810 -0
- package/modules/auth/src/services/password.ts +14 -0
- package/modules/auth/src/services/provider-secret-rotation.ts +169 -0
- package/modules/auth/src/services/provider-secrets.ts +136 -0
- package/modules/auth/src/services/repository.ts +321 -5
- package/modules/auth/src/services/session-sweep-runner.ts +73 -0
- package/modules/auth/src/services/settings-store.ts +10 -83
- package/modules/auth/src/services/totp.ts +88 -62
- package/modules/auth/src/services/validation.ts +194 -7
- package/modules/auth/src/settings.ts +18 -0
- package/modules/auth/translations/en.json +84 -1
- package/modules/auth/translations/pl.json +84 -1
- package/modules/automations/migrations/0005_secret_rotation_inventory.down.sql +1 -0
- package/modules/automations/migrations/0005_secret_rotation_inventory.up.sql +6 -0
- package/modules/automations/migrations/0006_automations_list_sort_indexes.down.sql +4 -0
- package/modules/automations/migrations/0006_automations_list_sort_indexes.up.sql +11 -0
- package/modules/automations/module.json +24 -6
- package/modules/automations/package.json +4 -1
- package/modules/automations/spec/module.yaml +81 -7
- package/modules/automations/src/api/endpoints.ts +202 -28
- package/modules/automations/src/cli/commands.json +17 -0
- package/modules/automations/src/cli/index.ts +114 -0
- package/modules/automations/src/client/AutomationScheduleForm.tsrx +77 -19
- package/modules/automations/src/client/AutomationSchedulesView.tsrx +144 -40
- package/modules/automations/src/client/AutomationTriggersView.tsrx +131 -32
- package/modules/automations/src/client/api.ts +62 -19
- package/modules/automations/src/client/presentation.ts +20 -2
- package/modules/automations/src/client/state.ts +84 -0
- package/modules/automations/src/domain/cadence.ts +99 -3
- package/modules/automations/src/domain/cron.ts +366 -0
- package/modules/automations/src/domain/time-zone.ts +61 -0
- package/modules/automations/src/platform.ts +38 -4
- package/modules/automations/src/server/index.ts +11 -0
- package/modules/automations/src/server/runtime.ts +46 -22
- package/modules/{automations-workflows-integration/src/server/adapter.ts → automations/src/server/workflow-target.ts} +13 -14
- package/modules/{automations-workflows-integration/src/server/tools.ts → automations/src/server/workflow-tools.ts} +0 -0
- package/modules/automations/src/services/data-classes.ts +62 -0
- package/modules/automations/src/services/database-repository.ts +152 -38
- package/modules/automations/src/services/migration.ts +119 -9
- package/modules/automations/src/services/repository.ts +52 -1
- package/modules/automations/src/services/schedule-runner.ts +84 -0
- package/modules/automations/src/services/schedule-service.ts +152 -26
- package/modules/automations/src/services/secret-rotation.ts +176 -0
- package/modules/automations/src/services/secret-vault.ts +68 -41
- package/modules/automations/src/services/trigger-service.ts +13 -10
- package/modules/automations/translations/en.json +15 -2
- package/modules/automations/translations/pl.json +15 -2
- package/modules/connectors/migrations/0001_connectors_core.down.sql +3 -0
- package/modules/connectors/migrations/0001_connectors_core.up.sql +72 -0
- package/modules/connectors/migrations/0002_connectors_call_keys.down.sql +3 -0
- package/modules/connectors/migrations/0002_connectors_call_keys.up.sql +18 -0
- package/modules/connectors/migrations/0003_connectors_rotation_inventory.down.sql +2 -0
- package/modules/connectors/migrations/0003_connectors_rotation_inventory.up.sql +19 -0
- package/modules/connectors/migrations/README.md +3 -0
- package/modules/connectors/module.json +32 -0
- package/modules/{automations-workflows-integration → connectors}/package.json +28 -26
- package/modules/connectors/spec/module.yaml +448 -0
- package/modules/connectors/src/acl/permissions.ts +6 -0
- package/modules/connectors/src/agent/tools.ts +180 -0
- package/modules/connectors/src/api/endpoints.ts +572 -0
- package/modules/connectors/src/cli/commands.json +17 -0
- package/modules/connectors/src/cli/index.ts +126 -0
- package/modules/connectors/src/client/ConnectorCallsView.tsrx +358 -0
- package/modules/connectors/src/client/ConnectorForm.tsrx +424 -0
- package/modules/connectors/src/client/ConnectorsView.tsrx +711 -0
- package/modules/connectors/src/client/api.ts +281 -0
- package/modules/connectors/src/client/consent.ts +48 -0
- package/modules/connectors/src/client/contribution.tsrx +37 -0
- package/modules/connectors/src/client/index.ts +22 -0
- package/modules/connectors/src/client/navigation.ts +42 -0
- package/modules/connectors/src/client/presentation.ts +38 -0
- package/modules/connectors/src/client/state.ts +175 -0
- package/modules/connectors/src/domain/calls.ts +70 -0
- package/modules/connectors/src/domain/definitions.ts +190 -0
- package/modules/connectors/src/domain/http-json.ts +68 -0
- package/modules/connectors/src/domain/types.ts +185 -0
- package/modules/connectors/src/index.ts +64 -0
- package/modules/connectors/src/platform.ts +56 -0
- package/modules/connectors/src/server/index.ts +66 -0
- package/modules/connectors/src/server/runtime.ts +163 -0
- package/modules/connectors/src/services/call-service.ts +903 -0
- package/modules/connectors/src/services/connectors-service.ts +653 -0
- package/modules/connectors/src/services/credential-rotation.ts +221 -0
- package/modules/connectors/src/services/credential-vault.ts +194 -0
- package/modules/connectors/src/services/data-classes.ts +158 -0
- package/modules/connectors/src/services/database-repository.ts +897 -0
- package/modules/connectors/src/services/egress.ts +261 -0
- package/modules/connectors/src/services/index.ts +19 -0
- package/modules/connectors/src/services/migration.ts +202 -0
- package/modules/connectors/src/services/repository.ts +175 -0
- package/modules/connectors/src/services/service-error.ts +46 -0
- package/modules/connectors/src/settings.ts +69 -0
- package/modules/connectors/translations/en.json +191 -0
- package/modules/connectors/translations/pl.json +191 -0
- package/modules/directory/migrations/0001_directory_core.down.sql +5 -0
- package/modules/directory/migrations/0001_directory_core.up.sql +111 -0
- package/modules/directory/migrations/README.md +3 -0
- package/modules/directory/module.json +27 -0
- package/modules/directory/package.json +46 -0
- package/modules/directory/spec/module.yaml +351 -0
- package/modules/directory/src/acl/permissions.ts +7 -0
- package/modules/directory/src/api/endpoints.ts +478 -0
- package/modules/directory/src/api/scim-endpoints.ts +516 -0
- package/modules/directory/src/client/GroupMappingsView.tsrx +430 -0
- package/modules/directory/src/client/ProvisioningLogView.tsrx +248 -0
- package/modules/directory/src/client/ScimTokensView.tsrx +587 -0
- package/modules/directory/src/client/api.ts +222 -0
- package/modules/directory/src/client/contribution.tsrx +46 -0
- package/modules/directory/src/client/index.ts +22 -0
- package/modules/directory/src/client/navigation.ts +57 -0
- package/modules/directory/src/client/presentation.ts +143 -0
- package/modules/directory/src/client/state.ts +173 -0
- package/modules/directory/src/domain/scim.ts +346 -0
- package/modules/directory/src/domain/types.ts +166 -0
- package/modules/directory/src/index.ts +44 -0
- package/modules/directory/src/platform.ts +43 -0
- package/modules/directory/src/server/index.ts +17 -0
- package/modules/directory/src/server/runtime.ts +124 -0
- package/modules/directory/src/services/auth-port.ts +127 -0
- package/modules/directory/src/services/data-classes.ts +41 -0
- package/modules/directory/src/services/database-repository.ts +1067 -0
- package/modules/directory/src/services/directory-service.ts +311 -0
- package/modules/directory/src/services/index.ts +43 -0
- package/modules/directory/src/services/migration.ts +146 -0
- package/modules/directory/src/services/provisioning-service.ts +1420 -0
- package/modules/directory/src/services/rate-limiter.ts +103 -0
- package/modules/directory/src/services/repository.ts +208 -0
- package/modules/directory/src/services/service-error.ts +42 -0
- package/modules/directory/src/services/token-service.ts +215 -0
- package/modules/directory/src/settings.ts +86 -0
- package/modules/directory/translations/en.json +185 -0
- package/modules/directory/translations/pl.json +185 -0
- package/modules/documents/migrations/0001_documents_core.down.sql +1 -0
- package/modules/documents/migrations/0001_documents_core.up.sql +35 -0
- package/modules/documents/migrations/0002_documents_files_page.down.sql +1 -0
- package/modules/documents/migrations/0002_documents_files_page.up.sql +6 -0
- package/modules/documents/migrations/0003_documents_rotation_inventory.down.sql +2 -0
- package/modules/documents/migrations/0003_documents_rotation_inventory.up.sql +18 -0
- package/modules/documents/migrations/README.md +3 -0
- package/modules/documents/module.json +32 -0
- package/modules/documents/package.json +50 -0
- package/modules/documents/spec/module.yaml +248 -0
- package/modules/documents/src/acl/permissions.ts +6 -0
- package/modules/documents/src/api/endpoints.ts +401 -0
- package/modules/documents/src/cli/commands.json +17 -0
- package/modules/documents/src/cli/index.ts +145 -0
- package/modules/documents/src/client/DocumentUploader.tsrx +148 -0
- package/modules/documents/src/client/DocumentsView.tsrx +540 -0
- package/modules/documents/src/client/api.ts +209 -0
- package/modules/documents/src/client/contribution.tsrx +29 -0
- package/modules/documents/src/client/download.ts +70 -0
- package/modules/documents/src/client/index.ts +22 -0
- package/modules/documents/src/client/navigation.ts +25 -0
- package/modules/documents/src/client/presentation.ts +110 -0
- package/modules/documents/src/client/state.ts +117 -0
- package/modules/documents/src/domain/attachments.ts +84 -0
- package/modules/documents/src/domain/types.ts +80 -0
- package/modules/documents/src/index.ts +46 -0
- package/modules/documents/src/platform.ts +61 -0
- package/modules/documents/src/server/index.ts +30 -0
- package/modules/documents/src/server/runtime.ts +107 -0
- package/modules/documents/src/services/attachments.ts +39 -0
- package/modules/documents/src/services/data-classes.ts +25 -0
- package/modules/documents/src/services/database-repository.ts +270 -0
- package/modules/documents/src/services/documents-service.ts +590 -0
- package/modules/documents/src/services/index.ts +18 -0
- package/modules/documents/src/services/migration.ts +117 -0
- package/modules/documents/src/services/repository.ts +58 -0
- package/modules/documents/src/services/storage-rotation.ts +157 -0
- package/modules/documents/src/settings.ts +107 -0
- package/modules/documents/translations/en.json +111 -0
- package/modules/documents/translations/pl.json +111 -0
- package/modules/exports/migrations/0001_exports_core.down.sql +2 -0
- package/modules/exports/migrations/0001_exports_core.up.sql +28 -0
- package/modules/exports/migrations/0002_exports_job_routing_role.down.sql +4 -0
- package/modules/exports/migrations/0002_exports_job_routing_role.up.sql +21 -0
- package/modules/exports/migrations/0003_exports_rotation_inventory.down.sql +1 -0
- package/modules/exports/migrations/0003_exports_rotation_inventory.up.sql +9 -0
- package/modules/exports/migrations/README.md +3 -0
- package/modules/exports/module.json +32 -0
- package/modules/exports/package.json +45 -0
- package/modules/exports/spec/module.yaml +230 -0
- package/modules/exports/src/acl/permissions.ts +6 -0
- package/modules/exports/src/api/endpoints.ts +211 -0
- package/modules/exports/src/cli/commands.json +17 -0
- package/modules/exports/src/cli/index.ts +145 -0
- package/modules/exports/src/client/ExportsView.tsrx +327 -0
- package/modules/exports/src/client/api.ts +133 -0
- package/modules/exports/src/client/contribution.tsrx +31 -0
- package/modules/exports/src/client/index.ts +20 -0
- package/modules/exports/src/client/navigation.ts +25 -0
- package/modules/exports/src/client/presentation.ts +53 -0
- package/modules/exports/src/client/state.ts +56 -0
- package/modules/exports/src/domain/lists.ts +29 -0
- package/modules/exports/src/domain/types.ts +120 -0
- package/modules/exports/src/index.ts +41 -0
- package/modules/exports/src/platform.ts +80 -0
- package/modules/exports/src/server/index.ts +50 -0
- package/modules/exports/src/server/runtime.ts +160 -0
- package/modules/exports/src/services/data-classes.ts +59 -0
- package/modules/exports/src/services/database-repository.ts +403 -0
- package/modules/exports/src/services/export-runner.ts +123 -0
- package/modules/exports/src/services/export-service.ts +356 -0
- package/modules/exports/src/services/index.ts +6 -0
- package/modules/exports/src/services/list-registry.ts +105 -0
- package/modules/exports/src/services/migration.ts +116 -0
- package/modules/exports/src/services/repository.ts +96 -0
- package/modules/exports/src/services/storage-rotation.ts +138 -0
- package/modules/exports/src/settings.ts +70 -0
- package/modules/exports/translations/en.json +69 -0
- package/modules/exports/translations/pl.json +69 -0
- package/modules/import/migrations/0001_import_core.down.sql +6 -0
- package/modules/import/migrations/0001_import_core.up.sql +61 -0
- package/modules/import/migrations/0002_import_job_routing_role.down.sql +4 -0
- package/modules/import/migrations/0002_import_job_routing_role.up.sql +20 -0
- package/modules/import/migrations/0003_import_jobs_export_index.down.sql +1 -0
- package/modules/import/migrations/0003_import_jobs_export_index.up.sql +7 -0
- package/modules/import/migrations/0004_import_jobs_traceparent.down.sql +1 -0
- package/modules/import/migrations/0004_import_jobs_traceparent.up.sql +7 -0
- package/modules/import/migrations/README.md +3 -0
- package/modules/import/module.json +37 -0
- package/modules/import/package.json +50 -0
- package/modules/import/spec/module.yaml +335 -0
- package/modules/import/src/acl/permissions.ts +6 -0
- package/modules/import/src/api/endpoints.ts +400 -0
- package/modules/import/src/client/ImportJobDrawer.tsrx +229 -0
- package/modules/import/src/client/ImportsView.tsrx +455 -0
- package/modules/import/src/client/NewImportForm.tsrx +274 -0
- package/modules/import/src/client/api.ts +243 -0
- package/modules/import/src/client/contribution.tsrx +29 -0
- package/modules/import/src/client/index.ts +23 -0
- package/modules/import/src/client/navigation.ts +25 -0
- package/modules/import/src/client/presentation.ts +59 -0
- package/modules/import/src/client/state.ts +43 -0
- package/modules/import/src/domain/csv.ts +258 -0
- package/modules/import/src/domain/ports.ts +157 -0
- package/modules/import/src/domain/types.ts +179 -0
- package/modules/import/src/index.ts +58 -0
- package/modules/import/src/platform.ts +60 -0
- package/modules/import/src/server/index.ts +49 -0
- package/modules/import/src/server/runtime.ts +158 -0
- package/modules/import/src/services/csv-source.ts +121 -0
- package/modules/import/src/services/data-classes.ts +63 -0
- package/modules/import/src/services/database-repository.ts +780 -0
- package/modules/import/src/services/import-runner.ts +127 -0
- package/modules/import/src/services/import-service.ts +872 -0
- package/modules/import/src/services/index.ts +6 -0
- package/modules/import/src/services/migration.ts +156 -0
- package/modules/import/src/services/port-registry.ts +158 -0
- package/modules/import/src/services/repository.ts +147 -0
- package/modules/import/src/settings.ts +70 -0
- package/modules/import/translations/en.json +175 -0
- package/modules/import/translations/pl.json +175 -0
- package/modules/metering/migrations/0001_metering_core.down.sql +6 -0
- package/modules/metering/migrations/0001_metering_core.up.sql +119 -0
- package/modules/metering/migrations/0002_metering_bucket_export.down.sql +3 -0
- package/modules/metering/migrations/0002_metering_bucket_export.up.sql +5 -0
- package/modules/metering/migrations/README.md +3 -0
- package/modules/metering/module.json +46 -0
- package/modules/metering/package.json +50 -0
- package/modules/metering/spec/module.yaml +269 -0
- package/modules/metering/src/acl/permissions.ts +5 -0
- package/modules/metering/src/api/endpoints.ts +104 -0
- package/modules/metering/src/cli/commands.json +28 -0
- package/modules/metering/src/cli/index.ts +246 -0
- package/modules/metering/src/client/LimitsView.tsrx +170 -0
- package/modules/metering/src/client/UsageSummaryWidget.tsrx +63 -0
- package/modules/metering/src/client/UsageView.tsrx +205 -0
- package/modules/metering/src/client/api.ts +91 -0
- package/modules/metering/src/client/contribution.tsrx +42 -0
- package/modules/metering/src/client/index.ts +26 -0
- package/modules/metering/src/client/navigation.ts +54 -0
- package/modules/metering/src/client/presentation.ts +63 -0
- package/modules/metering/src/client/state.ts +31 -0
- package/modules/metering/src/domain/meters.ts +100 -0
- package/modules/metering/src/domain/types.ts +71 -0
- package/modules/metering/src/index.ts +51 -0
- package/modules/metering/src/platform.ts +84 -0
- package/modules/metering/src/server/index.ts +40 -0
- package/modules/metering/src/server/runtime.ts +165 -0
- package/modules/metering/src/services/data-classes.ts +34 -0
- package/modules/metering/src/services/database-repository.ts +574 -0
- package/modules/metering/src/services/index.ts +9 -0
- package/modules/metering/src/services/meter-registry.ts +145 -0
- package/modules/metering/src/services/metering-service.ts +441 -0
- package/modules/metering/src/services/migration.ts +183 -0
- package/modules/metering/src/services/notifications.ts +75 -0
- package/modules/metering/src/services/reports.ts +105 -0
- package/modules/metering/src/services/repository.ts +132 -0
- package/modules/metering/src/services/service-error.ts +46 -0
- package/modules/metering/src/settings.ts +47 -0
- package/modules/metering/translations/en.json +68 -0
- package/modules/metering/translations/pl.json +68 -0
- package/modules/notifications/migrations/0001_notifications_core.down.sql +1 -0
- package/modules/notifications/migrations/0001_notifications_core.up.sql +26 -0
- package/modules/notifications/migrations/0002_notifications_preferences.down.sql +1 -0
- package/modules/notifications/migrations/0002_notifications_preferences.up.sql +17 -0
- package/modules/notifications/migrations/0003_notifications_webhook_subscriptions.down.sql +1 -0
- package/modules/notifications/migrations/0003_notifications_webhook_subscriptions.up.sql +30 -0
- package/modules/notifications/migrations/0004_notifications_deliveries.down.sql +1 -0
- package/modules/notifications/migrations/0004_notifications_deliveries.up.sql +35 -0
- package/modules/notifications/migrations/0005_notifications_delivery_routing_role.down.sql +2 -0
- package/modules/notifications/migrations/0005_notifications_delivery_routing_role.up.sql +17 -0
- package/modules/notifications/migrations/0006_notifications_delivery_title.down.sql +1 -0
- package/modules/notifications/migrations/0006_notifications_delivery_title.up.sql +11 -0
- package/modules/notifications/migrations/0007_notifications_secret_rotation_inventory.down.sql +2 -0
- package/modules/notifications/migrations/0007_notifications_secret_rotation_inventory.up.sql +19 -0
- package/modules/notifications/migrations/0008_notifications_delivery_claim.down.sql +8 -0
- package/modules/notifications/migrations/0008_notifications_delivery_claim.up.sql +19 -0
- package/modules/notifications/migrations/0009_notifications_kind_approvals.down.sql +16 -0
- package/modules/notifications/migrations/0009_notifications_kind_approvals.up.sql +18 -0
- package/modules/notifications/migrations/0010_notifications_kind_meter_threshold.down.sql +16 -0
- package/modules/notifications/migrations/0010_notifications_kind_meter_threshold.up.sql +18 -0
- package/modules/notifications/migrations/0011_notifications_retention_keyset.down.sql +5 -0
- package/modules/notifications/migrations/0011_notifications_retention_keyset.up.sql +15 -0
- package/modules/notifications/migrations/0012_notifications_email_channel.down.sql +12 -0
- package/modules/notifications/migrations/0012_notifications_email_channel.up.sql +38 -0
- package/modules/notifications/migrations/0013_notifications_list_pages.down.sql +5 -0
- package/modules/notifications/migrations/0013_notifications_list_pages.up.sql +13 -0
- package/modules/notifications/migrations/README.md +3 -0
- package/modules/notifications/module.json +32 -0
- package/modules/notifications/package.json +49 -0
- package/modules/notifications/spec/module.yaml +718 -0
- package/modules/notifications/src/acl/permissions.ts +11 -0
- package/modules/notifications/src/api/endpoints.ts +814 -0
- package/modules/notifications/src/cli/commands.json +17 -0
- package/modules/notifications/src/cli/index.ts +126 -0
- package/modules/notifications/src/client/DeliveriesView.tsrx +483 -0
- package/modules/notifications/src/client/FactList.tsrx +24 -0
- package/modules/notifications/src/client/NotificationPreferencesView.tsrx +240 -0
- package/modules/notifications/src/client/NotificationsInboxView.tsrx +592 -0
- package/modules/notifications/src/client/UnreadCountWidget.tsrx +62 -0
- package/modules/notifications/src/client/WebhookForm.tsrx +297 -0
- package/modules/notifications/src/client/WebhooksView.tsrx +637 -0
- package/modules/notifications/src/client/api.ts +382 -0
- package/modules/notifications/src/client/contribution.tsrx +83 -0
- package/modules/notifications/src/client/inbox.ts +41 -0
- package/modules/notifications/src/client/index.ts +29 -0
- package/modules/notifications/src/client/navigation.ts +92 -0
- package/modules/notifications/src/client/notifications.css +70 -0
- package/modules/notifications/src/client/presentation.ts +81 -0
- package/modules/notifications/src/client/state.ts +246 -0
- package/modules/notifications/src/client/unread-count.ts +26 -0
- package/modules/notifications/src/domain/locale.ts +47 -0
- package/modules/notifications/src/domain/publish.ts +46 -0
- package/modules/notifications/src/domain/types.ts +186 -0
- package/modules/notifications/src/index.ts +62 -0
- package/modules/notifications/src/platform.ts +85 -0
- package/modules/notifications/src/server/index.ts +82 -0
- package/modules/notifications/src/server/runtime.ts +251 -0
- package/modules/notifications/src/services/data-classes.ts +139 -0
- package/modules/notifications/src/services/database-repository.ts +1334 -0
- package/modules/notifications/src/services/delivery-payload.ts +93 -0
- package/modules/notifications/src/services/delivery-runner.ts +170 -0
- package/modules/notifications/src/services/delivery-service.ts +811 -0
- package/modules/notifications/src/services/egress.ts +239 -0
- package/modules/notifications/src/services/email-channel.ts +93 -0
- package/modules/notifications/src/services/index.ts +23 -0
- package/modules/notifications/src/services/migration.ts +572 -0
- package/modules/notifications/src/services/notifications-service.ts +297 -0
- package/modules/notifications/src/services/paging.ts +60 -0
- package/modules/notifications/src/services/publish-service.ts +133 -0
- package/modules/notifications/src/services/repository.ts +342 -0
- package/modules/notifications/src/services/secret-rotation.ts +177 -0
- package/modules/notifications/src/services/secret-vault.ts +168 -0
- package/modules/notifications/src/services/service-error.ts +67 -0
- package/modules/notifications/src/services/signature.ts +81 -0
- package/modules/notifications/src/services/webhook-service.ts +307 -0
- package/modules/notifications/src/settings.ts +130 -0
- package/modules/notifications/translations/en.json +255 -0
- package/modules/notifications/translations/pl.json +255 -0
- package/modules/profile/module.json +3 -3
- package/modules/profile/package.json +1 -1
- package/modules/profile/spec/module.yaml +3 -3
- package/modules/profile/src/services/database-repository.ts +3 -13
- package/modules/reports/module.json +28 -0
- package/modules/reports/package.json +42 -0
- package/modules/reports/spec/module.yaml +231 -0
- package/modules/reports/src/acl/permissions.ts +5 -0
- package/modules/reports/src/api/endpoints.ts +72 -0
- package/modules/reports/src/client/ReportsSummaryWidget.tsrx +52 -0
- package/modules/reports/src/client/ReportsView.tsrx +246 -0
- package/modules/reports/src/client/api.ts +65 -0
- package/modules/reports/src/client/contribution.tsrx +36 -0
- package/modules/reports/src/client/index.ts +18 -0
- package/modules/reports/src/client/navigation.ts +39 -0
- package/modules/reports/src/client/presentation.ts +123 -0
- package/modules/reports/src/client/state.ts +28 -0
- package/modules/reports/src/domain/providers.ts +115 -0
- package/modules/reports/src/domain/types.ts +44 -0
- package/modules/reports/src/index.ts +47 -0
- package/modules/reports/src/platform.ts +37 -0
- package/modules/reports/src/server/index.ts +21 -0
- package/modules/reports/src/server/runtime.ts +40 -0
- package/modules/reports/src/services/index.ts +17 -0
- package/modules/reports/src/services/provider-registry.ts +144 -0
- package/modules/reports/src/services/range.ts +65 -0
- package/modules/reports/src/services/reports-service.ts +316 -0
- package/modules/reports/src/services/service-error.ts +26 -0
- package/modules/reports/src/settings.ts +49 -0
- package/modules/reports/translations/en.json +35 -0
- package/modules/reports/translations/pl.json +35 -0
- package/modules/sandbox/module.json +4 -4
- package/modules/sandbox/package.json +1 -1
- package/modules/sandbox/spec/module.yaml +3 -3
- package/modules/sandbox/src/services/database-repository.ts +14 -23
- package/modules/sandbox/src/services/directory.ts +16 -0
- package/modules/sandbox/src/services/sandbox-service.ts +13 -11
- package/modules/search/migrations/0001_search_core.down.sql +1 -0
- package/modules/search/migrations/0001_search_core.up.sql +22 -0
- package/modules/search/migrations/0002_search_recent_export.down.sql +3 -0
- package/modules/search/migrations/0002_search_recent_export.up.sql +5 -0
- package/modules/search/migrations/README.md +3 -0
- package/modules/search/module.json +28 -0
- package/modules/search/package.json +43 -0
- package/modules/search/spec/module.yaml +177 -0
- package/modules/search/src/acl/permissions.ts +5 -0
- package/modules/search/src/api/endpoints.ts +221 -0
- package/modules/search/src/client/SearchView.tsrx +346 -0
- package/modules/search/src/client/api.ts +157 -0
- package/modules/search/src/client/contribution.tsrx +31 -0
- package/modules/search/src/client/index.ts +17 -0
- package/modules/search/src/client/navigation.ts +97 -0
- package/modules/search/src/client/search.css +56 -0
- package/modules/search/src/client/state.ts +113 -0
- package/modules/search/src/domain/data-classes.ts +73 -0
- package/modules/search/src/domain/providers.ts +88 -0
- package/modules/search/src/domain/types.ts +56 -0
- package/modules/search/src/index.ts +46 -0
- package/modules/search/src/platform.ts +42 -0
- package/modules/search/src/server/index.ts +25 -0
- package/modules/search/src/server/runtime.ts +123 -0
- package/modules/search/src/services/database-repository.ts +163 -0
- package/modules/search/src/services/index.ts +21 -0
- package/modules/search/src/services/migration.ts +65 -0
- package/modules/search/src/services/provider-registry.ts +137 -0
- package/modules/search/src/services/repository.ts +43 -0
- package/modules/search/src/services/search-service.ts +442 -0
- package/modules/search/src/services/service-error.ts +35 -0
- package/modules/search/src/settings.ts +68 -0
- package/modules/search/translations/en.json +45 -0
- package/modules/search/translations/pl.json +45 -0
- package/modules/system/module.json +2 -2
- package/modules/system/package.json +1 -1
- package/modules/system/spec/module.yaml +30 -3
- package/modules/system/src/client/FlagsPanel.tsrx +127 -0
- package/modules/system/src/client/ModuleSettingRow.tsrx +17 -7
- package/modules/system/src/client/ModuleSettingsSection.tsrx +10 -71
- package/modules/system/src/client/ModulesView.tsrx +91 -65
- package/modules/system/src/client/flags.ts +35 -0
- package/modules/system/src/client/index.ts +8 -0
- package/modules/system/src/client/navigation.ts +8 -0
- package/modules/system/src/client/settings-state.ts +159 -0
- package/modules/system/src/client/state.ts +2 -0
- package/modules/system/src/domain/time-zone.ts +105 -0
- package/modules/system/src/index.ts +12 -0
- package/modules/system/src/platform.ts +5 -1
- package/modules/system/src/server/endpoints.ts +72 -21
- package/modules/system/src/settings.ts +28 -0
- package/modules/system/translations/en.json +17 -0
- package/modules/system/translations/pl.json +17 -0
- package/modules/users/module.json +30 -4
- package/modules/users/package.json +4 -1
- package/modules/users/spec/module.yaml +290 -7
- package/modules/users/src/api/endpoints.ts +228 -15
- package/modules/users/src/client/InviteMemberForm.tsrx +2 -2
- package/modules/users/src/client/MemberDrawer.tsrx +142 -26
- package/modules/users/src/client/UserAccountForm.tsrx +2 -2
- package/modules/users/src/client/UsersView.tsrx +432 -71
- package/modules/users/src/client/api.ts +106 -12
- package/modules/users/src/client/contribution.tsrx +5 -0
- package/modules/users/src/client/member-columns.tsrx +22 -9
- package/modules/users/src/client/state.ts +172 -7
- package/modules/users/src/domain/lists.ts +9 -0
- package/modules/users/src/index.ts +11 -0
- package/modules/users/src/platform.ts +50 -1
- package/modules/users/src/services/member-export.ts +51 -0
- package/modules/users/src/services/member-import.ts +249 -0
- package/modules/users/src/services/member-search.ts +145 -0
- package/modules/users/src/services/users-service.ts +117 -4
- package/modules/users/translations/en.json +57 -8
- package/modules/users/translations/pl.json +57 -8
- package/modules/workflows/migrations/0004_payload_rotation_inventory.up.sql +17 -0
- package/modules/workflows/migrations/0005_workflows_human_approval.up.sql +28 -0
- package/modules/workflows/migrations/0006_workflows_retention_indexes.up.sql +11 -0
- package/modules/workflows/migrations/0007_workflows_erasure_subject_indexes.up.sql +17 -0
- package/modules/workflows/migrations/0008_workflows_subject_account.up.sql +24 -0
- package/modules/workflows/migrations/0009_workflows_definition_list_indexes.up.sql +9 -0
- package/modules/workflows/module.json +34 -6
- package/modules/workflows/package.json +2 -1
- package/modules/workflows/spec/module.yaml +26 -9
- package/modules/workflows/src/api/endpoints.ts +131 -25
- package/modules/workflows/src/cli/commands.json +17 -0
- package/modules/workflows/src/cli/index.ts +114 -0
- package/modules/workflows/src/client/WorkflowExecutionHistory.tsrx +36 -27
- package/modules/workflows/src/client/WorkflowInspector.tsrx +116 -0
- package/modules/workflows/src/client/WorkflowNodePalette.tsrx +1 -0
- package/modules/workflows/src/client/WorkflowsView.tsrx +236 -99
- package/modules/workflows/src/client/api.ts +54 -34
- package/modules/workflows/src/client/canvas-model.ts +12 -0
- package/modules/workflows/src/client/state.ts +95 -0
- package/modules/workflows/src/domain/events.ts +25 -11
- package/modules/workflows/src/domain/graph.ts +135 -1
- package/modules/workflows/src/domain/types.ts +91 -4
- package/modules/workflows/src/platform.ts +12 -0
- package/modules/workflows/src/server/runtime.ts +78 -5
- package/modules/workflows/src/services/approvals.ts +62 -0
- package/modules/workflows/src/services/cursors.ts +37 -0
- package/modules/workflows/src/services/data-classes.ts +232 -0
- package/modules/workflows/src/services/database-repository.ts +660 -171
- package/modules/workflows/src/services/migration.ts +240 -0
- package/modules/workflows/src/services/notifications.ts +98 -0
- package/modules/workflows/src/services/payload-codec.ts +51 -28
- package/modules/workflows/src/services/payload-rotation.ts +171 -0
- package/modules/workflows/src/services/repository.ts +123 -8
- package/modules/workflows/src/services/simulation.ts +7 -0
- package/modules/workflows/src/services/worker.ts +446 -25
- package/modules/workflows/src/services/workflows-service.ts +264 -103
- package/modules/workflows/translations/en.json +12 -4
- package/modules/workflows/translations/pl.json +12 -4
- package/modules.json +48 -4
- package/package.json +64 -6
- package/packages/client/package.json +1 -0
- package/packages/client/src/ApplicationShell.tsrx +43 -0
- package/packages/client/src/contributions.ts +55 -0
- package/packages/client/src/i18n/locales/en.json +5 -0
- package/packages/client/src/i18n/locales/pl.json +5 -0
- package/packages/client/src/index.ts +13 -1
- package/packages/client/src/routing.ts +22 -0
- package/packages/client/src/shell/CommandPalette.tsrx +223 -11
- package/packages/client/src/shell/command-search.ts +126 -0
- package/packages/client/src/shell/command.ts +30 -0
- package/packages/client/src/shell/navigation.ts +12 -0
- package/packages/client/src/shell/palette-keys.ts +27 -0
- package/packages/client/src/shell/shell.css +7 -0
- package/packages/contracts/schemas/module-spec.schema.json +287 -1
- package/packages/contracts/schemas/module.schema.json +25 -0
- package/packages/contracts/src/index.ts +144 -1
- package/packages/database/src/backup.ts +180 -0
- package/packages/database/src/decoders.ts +25 -0
- package/packages/database/src/index.ts +17 -0
- package/packages/database/src/migrations.ts +7 -0
- package/packages/database/src/record-history.ts +5 -14
- package/packages/harness/src/index.ts +2 -0
- package/packages/harness/src/runtime.ts +378 -2
- package/packages/harness/src/tool-adapters.ts +20 -9
- package/packages/kernel/src/acl.ts +179 -0
- package/packages/kernel/src/approval-grant.ts +310 -0
- package/packages/kernel/src/capability-registry.ts +69 -2
- package/packages/kernel/src/data-class-registry.ts +354 -0
- package/packages/kernel/src/index.ts +85 -4
- package/packages/kernel/src/keyring.ts +208 -0
- package/packages/kernel/src/module-compatibility.ts +35 -4
- package/packages/kernel/src/module-registry.ts +49 -2
- package/packages/kernel/src/module-settings.ts +189 -27
- package/packages/server/package.json +2 -1
- package/packages/server/src/composition.ts +38 -0
- package/packages/server/src/endpoint.ts +104 -47
- package/packages/server/src/export/csv.ts +34 -0
- package/packages/server/src/export/definition.ts +346 -0
- package/packages/server/src/export/index.ts +61 -0
- package/packages/server/src/export/run.ts +116 -0
- package/packages/server/src/index.ts +155 -0
- package/packages/server/src/jobs/index.ts +93 -0
- package/packages/server/src/jobs/runner.ts +486 -0
- package/packages/server/src/log.ts +291 -0
- package/packages/server/src/mail/config.ts +184 -0
- package/packages/server/src/mail/contracts.ts +251 -0
- package/packages/server/src/mail/index.ts +31 -0
- package/packages/server/src/mail/port.ts +101 -0
- package/packages/server/src/mail/smtp.ts +191 -0
- package/packages/server/src/mail/template.ts +105 -0
- package/packages/server/src/metrics.ts +447 -0
- package/packages/server/src/pagination.ts +246 -0
- package/packages/server/src/trace/context.ts +103 -0
- package/packages/server/src/trace/egress.ts +66 -0
- package/packages/server/src/trace/error-sink.ts +296 -0
- package/packages/server/src/trace/exporter.ts +295 -0
- package/packages/server/src/trace/index.ts +60 -0
- package/packages/server/src/trace/job-sink.ts +172 -0
- package/packages/server/src/trace/tracer.ts +338 -0
- package/packages/server/src/web.ts +5 -1
- package/packages/storage/package.json +40 -0
- package/packages/storage/src/config.ts +189 -0
- package/packages/storage/src/content-type.ts +124 -0
- package/packages/storage/src/contracts.ts +112 -0
- package/packages/storage/src/envelope.ts +238 -0
- package/packages/storage/src/index.ts +49 -0
- package/packages/storage/src/local.ts +75 -0
- package/packages/storage/src/port.ts +262 -0
- package/packages/storage/src/read-token.ts +130 -0
- package/packages/storage/src/reseal.ts +128 -0
- package/packages/storage/src/s3.ts +144 -0
- package/packages/storage/src/scanner.ts +22 -0
- package/packages/storage/src/sigv4.ts +104 -0
- package/packages/storage/src/store.ts +13 -0
- package/packages/ui/package.json +1 -0
- package/packages/ui/src/components/Button.tsrx +3 -0
- package/packages/ui/src/components/ConfirmDialog.tsrx +13 -2
- package/packages/ui/src/components/DateField.tsrx +92 -0
- package/packages/ui/src/components/DatePicker.tsrx +525 -0
- package/packages/ui/src/components/DateRangeField.tsrx +93 -0
- package/packages/ui/src/components/Drawer.tsrx +10 -1
- package/packages/ui/src/components/FileUpload.tsrx +158 -0
- package/packages/ui/src/components/Pagination.tsrx +130 -0
- package/packages/ui/src/components/Select.tsrx +78 -0
- package/packages/ui/src/components/Table.tsrx +498 -81
- package/packages/ui/src/components/Tabs.tsrx +53 -0
- package/packages/ui/src/components/ToastHost.tsrx +48 -0
- package/packages/ui/src/components/calendar.ts +243 -0
- package/packages/ui/src/components/date-field.ts +62 -0
- package/packages/ui/src/components/file-upload.ts +49 -0
- package/packages/ui/src/components/focus-trap.ts +62 -0
- package/packages/ui/src/components/pagination.ts +68 -0
- package/packages/ui/src/components/table-sorting.ts +49 -0
- package/packages/ui/src/components/tabs.ts +61 -0
- package/packages/ui/src/components/toast-store.ts +116 -0
- package/packages/ui/src/icons/Icon.tsrx +5 -0
- package/packages/ui/src/index.ts +45 -0
- package/packages/ui/src/styles/components.css +598 -0
- package/modules/automations-workflows-integration/module.json +0 -27
- package/modules/automations-workflows-integration/spec/module.yaml +0 -93
- package/modules/automations-workflows-integration/src/index.ts +0 -14
- package/modules/automations-workflows-integration/src/platform.ts +0 -24
- package/modules/automations-workflows-integration/src/server/index.ts +0 -11
- package/modules/automations-workflows-integration/translations/en.json +0 -21
- package/modules/automations-workflows-integration/translations/pl.json +0 -21
- package/modules/workflows/src/services/cursor-codec.ts +0 -62
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { APPROVAL_GRANT_INPUT_DIGEST_LENGTH } from '@flowdular/sdk/kernel';
|
|
2
|
+
import { APPROVAL_LIMITS } from './capability.ts';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* How long after the approving decision the grant an approved request yields
|
|
6
|
+
* still verifies. The token is derived from the row and the key on every read,
|
|
7
|
+
* so the window is measured from `resolvedAt`, not from the read.
|
|
8
|
+
*/
|
|
9
|
+
export const APPROVAL_GRANT_TTL_MS = 60 * 60 * 1_000;
|
|
10
|
+
|
|
11
|
+
const SUBJECT_PREFIX = 'capability:';
|
|
12
|
+
const CAPABILITY_ID = /^[a-z][a-z0-9-]*(\.[a-z][a-z0-9-]*)+$/;
|
|
13
|
+
const INPUT_DIGEST = new RegExp(
|
|
14
|
+
`^[a-f0-9]{${APPROVAL_GRANT_INPUT_DIGEST_LENGTH}}$`,
|
|
15
|
+
);
|
|
16
|
+
/* Prefix, id, one separator and the digest have to fit the subjectRef bound. */
|
|
17
|
+
export const APPROVAL_GRANT_CAPABILITY_ID_LENGTH =
|
|
18
|
+
APPROVAL_LIMITS.subjectRef -
|
|
19
|
+
SUBJECT_PREFIX.length -
|
|
20
|
+
1 -
|
|
21
|
+
APPROVAL_GRANT_INPUT_DIGEST_LENGTH;
|
|
22
|
+
|
|
23
|
+
/** The capability and the exact input an approval is asked for. */
|
|
24
|
+
export interface CapabilitySubject {
|
|
25
|
+
readonly capabilityId: string;
|
|
26
|
+
/** `approvalInputDigest` of the invocation input, as the runner computes it. */
|
|
27
|
+
readonly inputDigest: string;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* A `subjectRef` of the form `capability:<capabilityId>:<inputDigest>`. A
|
|
32
|
+
* request opened with it yields, once approved, a signed grant for exactly
|
|
33
|
+
* that capability and that input.
|
|
34
|
+
*/
|
|
35
|
+
export function encodeCapabilitySubjectRef(subject: CapabilitySubject): string {
|
|
36
|
+
if (
|
|
37
|
+
!CAPABILITY_ID.test(subject.capabilityId) ||
|
|
38
|
+
subject.capabilityId.length > APPROVAL_GRANT_CAPABILITY_ID_LENGTH
|
|
39
|
+
) {
|
|
40
|
+
throw new RangeError(
|
|
41
|
+
`capabilityId must be a lowercase dot-separated identifier of at most ${APPROVAL_GRANT_CAPABILITY_ID_LENGTH} characters.`,
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
if (!INPUT_DIGEST.test(subject.inputDigest)) {
|
|
45
|
+
throw new RangeError(
|
|
46
|
+
`inputDigest must be ${APPROVAL_GRANT_INPUT_DIGEST_LENGTH} lowercase hex characters.`,
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
return `${SUBJECT_PREFIX}${subject.capabilityId}:${subject.inputDigest}`;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Null for a subject reference that names a record rather than a capability. */
|
|
53
|
+
export function decodeCapabilitySubjectRef(
|
|
54
|
+
subjectRef: string,
|
|
55
|
+
): CapabilitySubject | null {
|
|
56
|
+
if (!subjectRef.startsWith(SUBJECT_PREFIX)) return null;
|
|
57
|
+
const separator = subjectRef.lastIndexOf(':');
|
|
58
|
+
const capabilityId = subjectRef.slice(SUBJECT_PREFIX.length, separator);
|
|
59
|
+
const inputDigest = subjectRef.slice(separator + 1);
|
|
60
|
+
if (
|
|
61
|
+
separator <= SUBJECT_PREFIX.length ||
|
|
62
|
+
!CAPABILITY_ID.test(capabilityId) ||
|
|
63
|
+
capabilityId.length > APPROVAL_GRANT_CAPABILITY_ID_LENGTH ||
|
|
64
|
+
!INPUT_DIGEST.test(inputDigest)
|
|
65
|
+
) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
return { capabilityId, inputDigest };
|
|
69
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/** Every state a request can hold. Only `pending` accepts a decision. */
|
|
2
|
+
export const APPROVAL_STATUSES = [
|
|
3
|
+
'pending',
|
|
4
|
+
'approved',
|
|
5
|
+
'rejected',
|
|
6
|
+
'expired',
|
|
7
|
+
'cancelled',
|
|
8
|
+
] as const;
|
|
9
|
+
|
|
10
|
+
export type ApprovalStatus = (typeof APPROVAL_STATUSES)[number];
|
|
11
|
+
|
|
12
|
+
export const TERMINAL_APPROVAL_STATUSES = [
|
|
13
|
+
'approved',
|
|
14
|
+
'rejected',
|
|
15
|
+
'expired',
|
|
16
|
+
'cancelled',
|
|
17
|
+
] as const;
|
|
18
|
+
|
|
19
|
+
export type TerminalApprovalStatus =
|
|
20
|
+
(typeof TERMINAL_APPROVAL_STATUSES)[number];
|
|
21
|
+
|
|
22
|
+
/** Every row the append-only ledger can carry. */
|
|
23
|
+
export const APPROVAL_DECISIONS = [
|
|
24
|
+
'approve',
|
|
25
|
+
'reject',
|
|
26
|
+
'expire',
|
|
27
|
+
'cancel',
|
|
28
|
+
] as const;
|
|
29
|
+
|
|
30
|
+
export type ApprovalDecisionKind = (typeof APPROVAL_DECISIONS)[number];
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* One pending or resolved question of whether an action on a record may go
|
|
34
|
+
* ahead. The eligibility snapshot is not part of it: who may decide is answered
|
|
35
|
+
* by the snapshot rows behind `decidableBy`, and re-answered against live
|
|
36
|
+
* membership when a decision arrives.
|
|
37
|
+
*/
|
|
38
|
+
export interface ApprovalRequest {
|
|
39
|
+
readonly id: string;
|
|
40
|
+
readonly tenantId: string;
|
|
41
|
+
readonly subjectModule: string;
|
|
42
|
+
readonly subjectRef: string;
|
|
43
|
+
readonly permission: string;
|
|
44
|
+
readonly action: string;
|
|
45
|
+
readonly title: string;
|
|
46
|
+
readonly summary: string | null;
|
|
47
|
+
readonly requesterAccountId: string;
|
|
48
|
+
readonly requirement: ApprovalRequirementRecord;
|
|
49
|
+
readonly decisionsNeeded: number;
|
|
50
|
+
readonly status: ApprovalStatus;
|
|
51
|
+
readonly expiresAt: number;
|
|
52
|
+
readonly resolvedAt: number | null;
|
|
53
|
+
readonly createdAt: number;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* The requirement as it was opened. It mirrors the kernel `ApprovalRequirement`
|
|
58
|
+
* with the two optional fields resolved, so a stored row never has to be read
|
|
59
|
+
* back through a partially specified shape.
|
|
60
|
+
*/
|
|
61
|
+
export interface ApprovalRequirementRecord {
|
|
62
|
+
readonly roleKey: string | null;
|
|
63
|
+
readonly scope: string | null;
|
|
64
|
+
readonly decisions: number;
|
|
65
|
+
readonly expiresInDays: number;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export interface ApprovalDecision {
|
|
69
|
+
readonly id: string;
|
|
70
|
+
readonly tenantId: string;
|
|
71
|
+
readonly requestId: string;
|
|
72
|
+
/** Null for the expiry loop, which is the one decision no member makes. */
|
|
73
|
+
readonly deciderAccountId: string | null;
|
|
74
|
+
readonly decision: ApprovalDecisionKind;
|
|
75
|
+
readonly comment: string | null;
|
|
76
|
+
readonly decidedAt: number;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** What the ledger records about a request beyond its decisions. */
|
|
80
|
+
export const APPROVAL_AUDIT_ACTIONS = ['grant.issued'] as const;
|
|
81
|
+
|
|
82
|
+
export type ApprovalAuditAction = (typeof APPROVAL_AUDIT_ACTIONS)[number];
|
|
83
|
+
|
|
84
|
+
export interface ApprovalAuditEntry {
|
|
85
|
+
readonly id: string;
|
|
86
|
+
readonly tenantId: string;
|
|
87
|
+
readonly requestId: string;
|
|
88
|
+
readonly action: ApprovalAuditAction;
|
|
89
|
+
readonly metadata: Readonly<Record<string, string | number>>;
|
|
90
|
+
readonly occurredAt: number;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** What an erasure writes over the comment of a decision it keeps. */
|
|
94
|
+
export const ERASED_DECISION_COMMENT = '[erased]';
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Prefix of the account an erasure writes over a decision or an eligibility row
|
|
98
|
+
* it keeps. Something unique to the row follows it, because both tables are
|
|
99
|
+
* unique per request and account: one fixed value would collide the moment two
|
|
100
|
+
* erased subjects had answered, or been eligible for, the same request, and the
|
|
101
|
+
* erasure would fail instead of clearing either of them.
|
|
102
|
+
*/
|
|
103
|
+
export const ERASED_ACCOUNT_PREFIX = 'erased:';
|
|
104
|
+
|
|
105
|
+
/** Sort keys the inbox list accepts; each is backed by a keyset index. */
|
|
106
|
+
export const APPROVAL_LIST_SORTS = ['createdAt'] as const;
|
|
107
|
+
|
|
108
|
+
export type ApprovalListSort = (typeof APPROVAL_LIST_SORTS)[number];
|
|
109
|
+
|
|
110
|
+
export const APPROVAL_LIST_DIRECTIONS = ['asc', 'desc'] as const;
|
|
111
|
+
|
|
112
|
+
export type ApprovalListDirection = (typeof APPROVAL_LIST_DIRECTIONS)[number];
|
|
113
|
+
|
|
114
|
+
/** One keyset page of the inbox list. `after` is the last row of the page before it. */
|
|
115
|
+
export interface ApprovalListPage {
|
|
116
|
+
readonly limit: number;
|
|
117
|
+
readonly sort: ApprovalListSort;
|
|
118
|
+
readonly direction: ApprovalListDirection;
|
|
119
|
+
readonly after: { readonly createdAt: number; readonly id: string } | null;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** What one bulk decision did with one id; a refusal names the code the single decision would answer with. */
|
|
123
|
+
export interface ApprovalDecideOutcome {
|
|
124
|
+
readonly id: string;
|
|
125
|
+
readonly outcome: 'decided' | 'not-found' | 'refused';
|
|
126
|
+
readonly reason?: string;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/** A request with its ledger, as the drawer and the read endpoints return it. */
|
|
130
|
+
export interface ApprovalRequestDetail {
|
|
131
|
+
readonly request: ApprovalRequest;
|
|
132
|
+
readonly decisions: readonly ApprovalDecision[];
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* What the member reading a request may do with it, answered by the server so a
|
|
137
|
+
* screen never has to guess at eligibility it cannot see.
|
|
138
|
+
*/
|
|
139
|
+
export interface ApprovalViewerRights {
|
|
140
|
+
readonly accountId: string;
|
|
141
|
+
readonly canDecide: boolean;
|
|
142
|
+
readonly canCancel: boolean;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
export interface ApprovalRequestView extends ApprovalRequestDetail {
|
|
146
|
+
readonly viewer: ApprovalViewerRights;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/** What the cross-tenant expiry poll is allowed to learn. */
|
|
150
|
+
export interface ApprovalRouting {
|
|
151
|
+
readonly tenantId: string;
|
|
152
|
+
readonly id: string;
|
|
153
|
+
readonly expiresAt: number;
|
|
154
|
+
readonly status: ApprovalStatus;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/** A workspace member as eligibility is resolved against it. */
|
|
158
|
+
export interface ApprovalMember {
|
|
159
|
+
readonly accountId: string;
|
|
160
|
+
readonly roleKey: string;
|
|
161
|
+
readonly scopes: readonly string[];
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export function isTerminalApprovalStatus(
|
|
165
|
+
status: ApprovalStatus,
|
|
166
|
+
): status is TerminalApprovalStatus {
|
|
167
|
+
return status !== 'pending';
|
|
168
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { ModuleManifest, RegisteredModule } from '@flowdular/sdk/contracts';
|
|
2
|
+
import manifest from '../module.json' with { type: 'json' };
|
|
3
|
+
import { APPROVALS_PERMISSIONS } from './acl/permissions.ts';
|
|
4
|
+
|
|
5
|
+
export const moduleDefinition = {
|
|
6
|
+
manifest: manifest as ModuleManifest,
|
|
7
|
+
navigation: [
|
|
8
|
+
{
|
|
9
|
+
id: 'approvals.navigation',
|
|
10
|
+
label: 'Approvals',
|
|
11
|
+
href: '/approvals',
|
|
12
|
+
order: 50,
|
|
13
|
+
permission: APPROVALS_PERMISSIONS.read,
|
|
14
|
+
},
|
|
15
|
+
],
|
|
16
|
+
permissions: Object.values(APPROVALS_PERMISSIONS),
|
|
17
|
+
} satisfies RegisteredModule;
|
|
18
|
+
|
|
19
|
+
export { APPROVALS_PERMISSIONS } from './acl/permissions.ts';
|
|
20
|
+
|
|
21
|
+
/* The cross-module contract. A subject module imports the identifier and the
|
|
22
|
+
types from here and resolves the implementation through the capability
|
|
23
|
+
registry; nothing else in this module is meant to be imported by another one. */
|
|
24
|
+
export {
|
|
25
|
+
APPROVALS_REQUESTS_CAPABILITY,
|
|
26
|
+
APPROVAL_LIMITS,
|
|
27
|
+
} from './domain/capability.ts';
|
|
28
|
+
export type {
|
|
29
|
+
ApprovalRequestFilter,
|
|
30
|
+
ApprovalsRequests,
|
|
31
|
+
OpenApprovalInput,
|
|
32
|
+
} from './domain/capability.ts';
|
|
33
|
+
export {
|
|
34
|
+
APPROVAL_GRANT_CAPABILITY_ID_LENGTH,
|
|
35
|
+
APPROVAL_GRANT_TTL_MS,
|
|
36
|
+
decodeCapabilitySubjectRef,
|
|
37
|
+
encodeCapabilitySubjectRef,
|
|
38
|
+
} from './domain/grant.ts';
|
|
39
|
+
export type { CapabilitySubject } from './domain/grant.ts';
|
|
40
|
+
|
|
41
|
+
export {
|
|
42
|
+
APPROVAL_DECISIONS,
|
|
43
|
+
APPROVAL_STATUSES,
|
|
44
|
+
TERMINAL_APPROVAL_STATUSES,
|
|
45
|
+
isTerminalApprovalStatus,
|
|
46
|
+
} from './domain/types.ts';
|
|
47
|
+
export type {
|
|
48
|
+
ApprovalAuditAction,
|
|
49
|
+
ApprovalAuditEntry,
|
|
50
|
+
ApprovalDecision,
|
|
51
|
+
ApprovalDecisionKind,
|
|
52
|
+
ApprovalMember,
|
|
53
|
+
ApprovalRequest,
|
|
54
|
+
ApprovalRequestDetail,
|
|
55
|
+
ApprovalRequirementRecord,
|
|
56
|
+
ApprovalRouting,
|
|
57
|
+
ApprovalStatus,
|
|
58
|
+
TerminalApprovalStatus,
|
|
59
|
+
} from './domain/types.ts';
|
|
60
|
+
|
|
61
|
+
export { ApprovalsServiceError } from './services/service-error.ts';
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { approvalGrantKeyringFromEnvironment } from '@flowdular/sdk/kernel';
|
|
2
|
+
import type {
|
|
3
|
+
PlatformServerComposition,
|
|
4
|
+
PlatformServerContext,
|
|
5
|
+
} from '@flowdular/sdk/modules/auth/server';
|
|
6
|
+
import {
|
|
7
|
+
APPROVALS_REQUESTS_CAPABILITY,
|
|
8
|
+
type ApprovalsRequests,
|
|
9
|
+
} from './domain/capability.ts';
|
|
10
|
+
import type { ApprovalMember } from './domain/types.ts';
|
|
11
|
+
import {
|
|
12
|
+
createApprovalsRoutes,
|
|
13
|
+
createApprovalsRuntime,
|
|
14
|
+
} from './server/index.ts';
|
|
15
|
+
import { approvalsDataClasses } from './services/data-classes.ts';
|
|
16
|
+
import {
|
|
17
|
+
NOTIFICATIONS_PUBLISH_CAPABILITY,
|
|
18
|
+
type NotificationPublisher,
|
|
19
|
+
} from './services/notifications.ts';
|
|
20
|
+
import {
|
|
21
|
+
APPROVALS_MODULE_SETTINGS,
|
|
22
|
+
approvalsPrimedDefaultExpiryDays,
|
|
23
|
+
approvalsPrimedExpiryIntervalMs,
|
|
24
|
+
} from './settings.ts';
|
|
25
|
+
|
|
26
|
+
interface AuthMemberRecord {
|
|
27
|
+
readonly accountId: string;
|
|
28
|
+
readonly role: string;
|
|
29
|
+
readonly status: string;
|
|
30
|
+
readonly membershipStatus: string;
|
|
31
|
+
readonly scopes: readonly string[];
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/* A disabled account or a suspended membership decides nothing, so the two
|
|
35
|
+
reads apply the same filter and answer the same shape. */
|
|
36
|
+
function activeMember(member: AuthMemberRecord): ApprovalMember | null {
|
|
37
|
+
if (member.status !== 'active' || member.membershipStatus !== 'active') {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
accountId: member.accountId,
|
|
42
|
+
roleKey: member.role,
|
|
43
|
+
scopes: member.scopes,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/* Who may decide is auth.core's answer, and it is asked at the moment a request
|
|
48
|
+
opens and again at the moment a decision arrives, never cached, so a revoked
|
|
49
|
+
role stops producing decisions immediately. */
|
|
50
|
+
function tenantMembers(
|
|
51
|
+
context: PlatformServerContext,
|
|
52
|
+
): (tenantId: string) => Promise<readonly ApprovalMember[]> {
|
|
53
|
+
return async (tenantId) =>
|
|
54
|
+
(await (await context.auth.service()).listTenantMembers(tenantId)).flatMap(
|
|
55
|
+
(member) => {
|
|
56
|
+
const active = activeMember(member);
|
|
57
|
+
return active ? [active] : [];
|
|
58
|
+
},
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/* Judging one account reads one membership: the whole roll is auth.core's
|
|
63
|
+
answer only when the eligibility snapshot has to be resolved. */
|
|
64
|
+
function tenantMember(
|
|
65
|
+
context: PlatformServerContext,
|
|
66
|
+
): (tenantId: string, accountId: string) => Promise<ApprovalMember | null> {
|
|
67
|
+
return async (tenantId, accountId) => {
|
|
68
|
+
const member = await (
|
|
69
|
+
await context.auth.service()
|
|
70
|
+
).findTenantMember(tenantId, accountId);
|
|
71
|
+
return member ? activeMember(member) : null;
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function createServerComposition(
|
|
76
|
+
context: PlatformServerContext,
|
|
77
|
+
): PlatformServerComposition {
|
|
78
|
+
const runtime = createApprovalsRuntime({
|
|
79
|
+
databases: context.databases,
|
|
80
|
+
purpose:
|
|
81
|
+
context.environment.NODE_ENV === 'test'
|
|
82
|
+
? 'test'
|
|
83
|
+
: context.environment.NODE_ENV === 'production'
|
|
84
|
+
? 'runtime'
|
|
85
|
+
: 'preview',
|
|
86
|
+
members: tenantMembers(context),
|
|
87
|
+
member: tenantMember(context),
|
|
88
|
+
/* The open capability runs from the workflows worker and the loop from
|
|
89
|
+
the job runner, where no request middleware primed the workspace. */
|
|
90
|
+
defaultExpiryDays: (tenantId) =>
|
|
91
|
+
approvalsPrimedDefaultExpiryDays(context.settings, tenantId),
|
|
92
|
+
expiryIntervalMs: () => approvalsPrimedExpiryIntervalMs(context.settings),
|
|
93
|
+
/* notifications.core is optional. The lookup happens when an event is
|
|
94
|
+
published, so a module composed after this one is found and an absent
|
|
95
|
+
one is a no-op. */
|
|
96
|
+
notifications: () =>
|
|
97
|
+
context.capabilities.get<NotificationPublisher>(
|
|
98
|
+
NOTIFICATIONS_PUBLISH_CAPABILITY,
|
|
99
|
+
),
|
|
100
|
+
/* Without FD_APPROVAL_GRANT_KEY an approved capability request yields no
|
|
101
|
+
grant, and the runner and the harness keep refusing the capability. */
|
|
102
|
+
grants: approvalGrantKeyringFromEnvironment(context.environment),
|
|
103
|
+
});
|
|
104
|
+
/* The runtime opens its database leases lazily, so the capability is a
|
|
105
|
+
forwarder rather than a resolved object: registration must not force a
|
|
106
|
+
connection at composition time. */
|
|
107
|
+
context.capabilities.register<ApprovalsRequests>(
|
|
108
|
+
APPROVALS_REQUESTS_CAPABILITY,
|
|
109
|
+
{
|
|
110
|
+
open: async (input) => (await runtime.service()).capability().open(input),
|
|
111
|
+
get: async (tenantId, id) =>
|
|
112
|
+
(await runtime.service()).capability().get(tenantId, id),
|
|
113
|
+
grant: async (tenantId, id, subjectModule) =>
|
|
114
|
+
(await runtime.service())
|
|
115
|
+
.capability()
|
|
116
|
+
.grant(tenantId, id, subjectModule),
|
|
117
|
+
list: async (tenantId, filter) =>
|
|
118
|
+
(await runtime.service()).capability().list(tenantId, filter),
|
|
119
|
+
cancel: async (tenantId, id, actorAccountId) =>
|
|
120
|
+
(await runtime.service())
|
|
121
|
+
.capability()
|
|
122
|
+
.cancel(tenantId, id, actorAccountId),
|
|
123
|
+
},
|
|
124
|
+
);
|
|
125
|
+
/* The sweep, the export, the count and the erasure run here, on this
|
|
126
|
+
module's own lease and under its own tenant transaction; the platform only
|
|
127
|
+
holds the declaration. */
|
|
128
|
+
context.dataClasses.declare(approvalsDataClasses(() => runtime.repository()));
|
|
129
|
+
return {
|
|
130
|
+
routes: createApprovalsRoutes(context.auth, runtime),
|
|
131
|
+
settings: APPROVALS_MODULE_SETTINGS,
|
|
132
|
+
start: () => runtime.start(),
|
|
133
|
+
stop: () => runtime.quiesce(),
|
|
134
|
+
dispose: () => runtime.dispose(),
|
|
135
|
+
};
|
|
136
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export { createApprovalsRoutes, endpoints } from '../api/endpoints.ts';
|
|
2
|
+
export {
|
|
3
|
+
DatabaseApprovalsRepository,
|
|
4
|
+
migrateApprovalsDatabase,
|
|
5
|
+
} from '../services/database-repository.ts';
|
|
6
|
+
export type { ApprovalsDatabaseHandles } from '../services/database-repository.ts';
|
|
7
|
+
export { createApprovalsRuntime } from './runtime.ts';
|
|
8
|
+
export type { ApprovalsRuntime, ApprovalsRuntimeOptions } from './runtime.ts';
|
|
9
|
+
export {
|
|
10
|
+
ApprovalsService,
|
|
11
|
+
APPROVALS_PAGE_LIMIT,
|
|
12
|
+
} from '../services/approvals-service.ts';
|
|
13
|
+
export type { ApprovalsServiceOptions } from '../services/approvals-service.ts';
|
|
14
|
+
export {
|
|
15
|
+
createApprovalsExpiryRunner,
|
|
16
|
+
EXPIRY_BATCH,
|
|
17
|
+
} from '../services/expiry-runner.ts';
|
|
18
|
+
export type { ApprovalsExpiryRunnerOptions } from '../services/expiry-runner.ts';
|
|
19
|
+
export { createApprovalCallbackRegistry } from '../services/callbacks.ts';
|
|
20
|
+
export type {
|
|
21
|
+
ApprovalCallbackRegistry,
|
|
22
|
+
ApprovalResolvedCallback,
|
|
23
|
+
} from '../services/callbacks.ts';
|
|
24
|
+
export {
|
|
25
|
+
memberSatisfies,
|
|
26
|
+
normalizeRequirement,
|
|
27
|
+
resolveEligible,
|
|
28
|
+
} from '../services/eligibility.ts';
|
|
29
|
+
export type {
|
|
30
|
+
ApprovalRequestFilters,
|
|
31
|
+
ApprovalsRepository,
|
|
32
|
+
CreateApprovalResult,
|
|
33
|
+
DecideApprovalInput,
|
|
34
|
+
DecideApprovalResult,
|
|
35
|
+
} from '../services/repository.ts';
|
|
36
|
+
export { ApprovalsServiceError } from '../services/service-error.ts';
|
|
37
|
+
export {
|
|
38
|
+
APPROVALS_MODULE_ID,
|
|
39
|
+
APPROVALS_MODULE_SETTINGS,
|
|
40
|
+
approvalsDefaultExpiryDays,
|
|
41
|
+
approvalsExpiryIntervalMs,
|
|
42
|
+
} from '../settings.ts';
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
DatabaseAdapterLease,
|
|
3
|
+
DatabaseProvider,
|
|
4
|
+
DatabaseProviderRequest,
|
|
5
|
+
} from '@flowdular/sdk/database';
|
|
6
|
+
import {
|
|
7
|
+
DATABASE_CAPABILITY_IDS,
|
|
8
|
+
DATABASE_DIALECT_IDS,
|
|
9
|
+
} from '@flowdular/sdk/database';
|
|
10
|
+
import type { ApprovalGrantKeyring } from '@flowdular/sdk/kernel';
|
|
11
|
+
import type { JobRunner } from '@flowdular/sdk/server';
|
|
12
|
+
import type { ApprovalMember } from '../domain/types.ts';
|
|
13
|
+
import {
|
|
14
|
+
createApprovalCallbackRegistry,
|
|
15
|
+
type ApprovalCallbackRegistry,
|
|
16
|
+
} from '../services/callbacks.ts';
|
|
17
|
+
import {
|
|
18
|
+
DatabaseApprovalsRepository,
|
|
19
|
+
migrateApprovalsDatabase,
|
|
20
|
+
} from '../services/database-repository.ts';
|
|
21
|
+
import { createApprovalsExpiryRunner } from '../services/expiry-runner.ts';
|
|
22
|
+
import type { NotificationPublisherResolver } from '../services/notifications.ts';
|
|
23
|
+
import type { ApprovalsRepository } from '../services/repository.ts';
|
|
24
|
+
import { ApprovalsService } from '../services/approvals-service.ts';
|
|
25
|
+
|
|
26
|
+
export interface ApprovalsRuntimeOptions {
|
|
27
|
+
/** Platform-owned provider. Modules never receive a DSN or a pool. */
|
|
28
|
+
readonly databases: DatabaseProvider;
|
|
29
|
+
readonly purpose?:
|
|
30
|
+
| Exclude<DatabaseProviderRequest['purpose'], 'migration'>
|
|
31
|
+
| undefined;
|
|
32
|
+
/** Members and their current role and scopes, resolved through auth.core. */
|
|
33
|
+
readonly members: (tenantId: string) => Promise<readonly ApprovalMember[]>;
|
|
34
|
+
/** One member's current role and scopes, resolved through auth.core. */
|
|
35
|
+
readonly member: (
|
|
36
|
+
tenantId: string,
|
|
37
|
+
accountId: string,
|
|
38
|
+
) => Promise<ApprovalMember | null>;
|
|
39
|
+
/** Live tenant setting, read again for every request that needs it. */
|
|
40
|
+
readonly defaultExpiryDays: (tenantId: string) => number | Promise<number>;
|
|
41
|
+
/** Live platform setting, read when the loop starts. */
|
|
42
|
+
readonly expiryIntervalMs: () => number | Promise<number>;
|
|
43
|
+
readonly notifications?: NotificationPublisherResolver;
|
|
44
|
+
readonly callbacks?: ApprovalCallbackRegistry;
|
|
45
|
+
readonly repository?: ApprovalsRepository;
|
|
46
|
+
/** Signs the grant an approved capability request yields; absent means none. */
|
|
47
|
+
readonly grants?: ApprovalGrantKeyring | undefined;
|
|
48
|
+
readonly now?: () => number;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export interface ApprovalsRuntime {
|
|
52
|
+
service(): Promise<ApprovalsService>;
|
|
53
|
+
/** The open repository, for the operations behind the declared data class. */
|
|
54
|
+
repository(): Promise<ApprovalsRepository>;
|
|
55
|
+
start(): void;
|
|
56
|
+
stop(): void;
|
|
57
|
+
quiesce(): Promise<void>;
|
|
58
|
+
dispose(): Promise<void>;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function createApprovalsRuntime(
|
|
62
|
+
options: ApprovalsRuntimeOptions,
|
|
63
|
+
): ApprovalsRuntime {
|
|
64
|
+
const callbacks = options.callbacks ?? createApprovalCallbackRegistry();
|
|
65
|
+
let repositoryPromise: Promise<ApprovalsRepository> | undefined;
|
|
66
|
+
let leases: readonly DatabaseAdapterLease[] = [];
|
|
67
|
+
let service: ApprovalsService | undefined;
|
|
68
|
+
let jobs: JobRunner | undefined;
|
|
69
|
+
let jobsPromise: Promise<JobRunner> | undefined;
|
|
70
|
+
let starting: Promise<void> | undefined;
|
|
71
|
+
let disposed = false;
|
|
72
|
+
|
|
73
|
+
const acquire = (purpose: DatabaseProviderRequest['purpose']) =>
|
|
74
|
+
options.databases.acquire({
|
|
75
|
+
namespace: 'approvals.core',
|
|
76
|
+
purpose,
|
|
77
|
+
requirements: {
|
|
78
|
+
dialectIds: [DATABASE_DIALECT_IDS.postgresql],
|
|
79
|
+
capabilities: [DATABASE_CAPABILITY_IDS.TRANSACTIONS],
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
const openRepository = async (): Promise<ApprovalsRepository> => {
|
|
84
|
+
if (options.repository) return options.repository;
|
|
85
|
+
/* Schema work runs on the migrator role and that lease is released before
|
|
86
|
+
the runtime one is taken, so request handling never holds a schema owner. */
|
|
87
|
+
const migration = await options.databases.acquire({
|
|
88
|
+
namespace: 'approvals.core',
|
|
89
|
+
purpose: 'migration',
|
|
90
|
+
requirements: {
|
|
91
|
+
dialectIds: [DATABASE_DIALECT_IDS.postgresql],
|
|
92
|
+
capabilities: [
|
|
93
|
+
DATABASE_CAPABILITY_IDS.MIGRATION_LOCK,
|
|
94
|
+
DATABASE_CAPABILITY_IDS.SCHEMA_INTROSPECTION,
|
|
95
|
+
DATABASE_CAPABILITY_IDS.TRANSACTIONAL_DDL,
|
|
96
|
+
],
|
|
97
|
+
},
|
|
98
|
+
});
|
|
99
|
+
try {
|
|
100
|
+
await migrateApprovalsDatabase(migration.database);
|
|
101
|
+
} finally {
|
|
102
|
+
await migration.release();
|
|
103
|
+
}
|
|
104
|
+
const runtimeLease = await acquire(options.purpose ?? 'runtime');
|
|
105
|
+
/* The expiry poll reads across tenants; every write that follows uses the
|
|
106
|
+
tenant carried by the routing row it returned. */
|
|
107
|
+
const backgroundLease = await acquire('background');
|
|
108
|
+
leases = [runtimeLease, backgroundLease];
|
|
109
|
+
return new DatabaseApprovalsRepository({
|
|
110
|
+
runtime: runtimeLease.database,
|
|
111
|
+
background: backgroundLease.database,
|
|
112
|
+
});
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
const repositoryInstance = (): Promise<ApprovalsRepository> =>
|
|
116
|
+
(repositoryPromise ??= openRepository());
|
|
117
|
+
|
|
118
|
+
const resolved = async (): Promise<ApprovalsService> =>
|
|
119
|
+
(service ??= new ApprovalsService({
|
|
120
|
+
repository: await repositoryInstance(),
|
|
121
|
+
members: options.members,
|
|
122
|
+
member: options.member,
|
|
123
|
+
defaultExpiryDays: options.defaultExpiryDays,
|
|
124
|
+
callbacks,
|
|
125
|
+
...(options.notifications
|
|
126
|
+
? { notifications: options.notifications }
|
|
127
|
+
: {}),
|
|
128
|
+
...(options.grants ? { grants: options.grants } : {}),
|
|
129
|
+
...(options.now ? { now: options.now } : {}),
|
|
130
|
+
}));
|
|
131
|
+
|
|
132
|
+
/* The platform runner owns the loop: the interval and its unref, the guard
|
|
133
|
+
against overlapping passes, the bound on claims, the isolation of one
|
|
134
|
+
request from the next, and the drain. This module keeps its routing read
|
|
135
|
+
and its transition. The interval is the platform setting as it reads when
|
|
136
|
+
the loop starts, so the runner is built there rather than while the
|
|
137
|
+
platform composes, before the setting is declared. */
|
|
138
|
+
const runner = (): Promise<JobRunner> =>
|
|
139
|
+
(jobsPromise ??= (async () =>
|
|
140
|
+
(jobs = createApprovalsExpiryRunner({
|
|
141
|
+
repository: repositoryInstance,
|
|
142
|
+
service: resolved,
|
|
143
|
+
intervalMs: await options.expiryIntervalMs(),
|
|
144
|
+
...(options.now ? { now: options.now } : {}),
|
|
145
|
+
})))());
|
|
146
|
+
|
|
147
|
+
return {
|
|
148
|
+
service: resolved,
|
|
149
|
+
repository: repositoryInstance,
|
|
150
|
+
start() {
|
|
151
|
+
if (disposed) return;
|
|
152
|
+
/* The interval is a settings read that may have to prime the platform
|
|
153
|
+
tenant first, so the loop starts once that read settles. */
|
|
154
|
+
starting ??= runner().then(
|
|
155
|
+
(loop) => {
|
|
156
|
+
if (!disposed) loop.start();
|
|
157
|
+
},
|
|
158
|
+
(error: unknown) => {
|
|
159
|
+
jobsPromise = undefined;
|
|
160
|
+
starting = undefined;
|
|
161
|
+
console.warn('approvals.core: the expiry loop did not start.', error);
|
|
162
|
+
},
|
|
163
|
+
);
|
|
164
|
+
},
|
|
165
|
+
stop: () => jobs?.stop(),
|
|
166
|
+
async quiesce() {
|
|
167
|
+
await starting;
|
|
168
|
+
await jobs?.quiesce();
|
|
169
|
+
},
|
|
170
|
+
async dispose() {
|
|
171
|
+
if (disposed) return;
|
|
172
|
+
disposed = true;
|
|
173
|
+
await starting;
|
|
174
|
+
await jobs?.dispose();
|
|
175
|
+
/* An open still in flight would assign its leases after this read, so
|
|
176
|
+
settle it first; a failed open must not surface as an unhandled
|
|
177
|
+
rejection during teardown. */
|
|
178
|
+
await repositoryPromise?.catch(() => undefined);
|
|
179
|
+
for (const lease of leases) await lease.release();
|
|
180
|
+
leases = [];
|
|
181
|
+
repositoryPromise = undefined;
|
|
182
|
+
service = undefined;
|
|
183
|
+
},
|
|
184
|
+
};
|
|
185
|
+
}
|