@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,147 @@
|
|
|
1
|
+
import type { AnchorSigner } from './anchor-key.ts';
|
|
2
|
+
import type { AuditRepository } from './repository.ts';
|
|
3
|
+
|
|
4
|
+
/** Anchors re-signed per routing page. */
|
|
5
|
+
export const ANCHOR_ROTATION_BATCH = 200;
|
|
6
|
+
|
|
7
|
+
/** Anchor ids one report names, so a broken ring does not print a table. */
|
|
8
|
+
export const ANCHOR_ROTATION_REPORT_LIMIT = 50;
|
|
9
|
+
|
|
10
|
+
export interface AnchorKeyCountReport {
|
|
11
|
+
readonly keyId: string;
|
|
12
|
+
readonly anchors: number;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface AnchorRotationReport {
|
|
16
|
+
readonly table: string;
|
|
17
|
+
/** Key id every anchor should end on: the current key of the signer. */
|
|
18
|
+
readonly currentKeyId: string;
|
|
19
|
+
readonly counts: readonly AnchorKeyCountReport[];
|
|
20
|
+
/** Anchors on a retired key when the run started. */
|
|
21
|
+
readonly stale: number;
|
|
22
|
+
readonly rotated: number;
|
|
23
|
+
/** Anchors another process re-signed between the read and the update. */
|
|
24
|
+
readonly skipped: number;
|
|
25
|
+
/** Anchors whose recorded key is in no ring, which a re-sign cannot fix. */
|
|
26
|
+
readonly unknownKeys: readonly string[];
|
|
27
|
+
/**
|
|
28
|
+
* Anchors whose stored signature does not verify under the ring, by id and
|
|
29
|
+
* bounded by `ANCHOR_ROTATION_REPORT_LIMIT`. None of them is re-signed: a
|
|
30
|
+
* signature that does not verify is evidence, and signing the anchor hash
|
|
31
|
+
* again would replace that evidence with a valid signature of this
|
|
32
|
+
* deployment's own making.
|
|
33
|
+
*/
|
|
34
|
+
readonly unverified: readonly string[];
|
|
35
|
+
/** How many failed to verify, including the ones past the report limit. */
|
|
36
|
+
readonly unverifiedCount: number;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface AnchorRotationOptions {
|
|
40
|
+
readonly repository: AuditRepository;
|
|
41
|
+
readonly signer: AnchorSigner;
|
|
42
|
+
readonly apply?: boolean;
|
|
43
|
+
readonly batchSize?: number;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Re-signs every anchor that is not on the current key, once its stored
|
|
48
|
+
* signature verifies under the ring. Only the signature and the key id change:
|
|
49
|
+
* the anchor hash, the segment hash and the chain are what the segment files
|
|
50
|
+
* already carry, so a re-signed anchor still verifies against a file written
|
|
51
|
+
* years ago. It is idempotent, so a second run finds nothing.
|
|
52
|
+
*/
|
|
53
|
+
export async function rotateAnchorSignatures(
|
|
54
|
+
options: AnchorRotationOptions,
|
|
55
|
+
): Promise<AnchorRotationReport> {
|
|
56
|
+
const currentKeyId = options.signer.keyId;
|
|
57
|
+
const batchSize = options.batchSize ?? ANCHOR_ROTATION_BATCH;
|
|
58
|
+
const counts = await options.repository.countAnchorsByKey();
|
|
59
|
+
const stale = counts.reduce(
|
|
60
|
+
(total, entry) =>
|
|
61
|
+
entry.keyId === currentKeyId ? total : total + entry.anchors,
|
|
62
|
+
0,
|
|
63
|
+
);
|
|
64
|
+
const unknownKeys = counts
|
|
65
|
+
.filter(
|
|
66
|
+
(entry) =>
|
|
67
|
+
entry.keyId !== currentKeyId && !options.signer.knows(entry.keyId),
|
|
68
|
+
)
|
|
69
|
+
.map((entry) => entry.keyId);
|
|
70
|
+
const report = {
|
|
71
|
+
table: 'audit_anchors',
|
|
72
|
+
currentKeyId,
|
|
73
|
+
counts: counts.map((entry) => ({
|
|
74
|
+
keyId: entry.keyId,
|
|
75
|
+
anchors: entry.anchors,
|
|
76
|
+
})),
|
|
77
|
+
stale,
|
|
78
|
+
unknownKeys,
|
|
79
|
+
};
|
|
80
|
+
if (options.apply !== true) {
|
|
81
|
+
return {
|
|
82
|
+
...report,
|
|
83
|
+
rotated: 0,
|
|
84
|
+
skipped: 0,
|
|
85
|
+
unverified: [],
|
|
86
|
+
unverifiedCount: 0,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
let rotated = 0;
|
|
90
|
+
let skipped = 0;
|
|
91
|
+
let unverifiedCount = 0;
|
|
92
|
+
const unverified: string[] = [];
|
|
93
|
+
let cursor = '';
|
|
94
|
+
for (;;) {
|
|
95
|
+
/* Paged by primary key: an anchor the optimistic update skipped stays
|
|
96
|
+
stale, so a query that only asked for stale rows would return it for
|
|
97
|
+
ever. The routing read sees the tenant, the id and the key id alone. */
|
|
98
|
+
const page = await options.repository.listAnchorsNotOnKey(
|
|
99
|
+
currentKeyId,
|
|
100
|
+
cursor,
|
|
101
|
+
batchSize,
|
|
102
|
+
);
|
|
103
|
+
for (const routing of page) {
|
|
104
|
+
cursor = routing.id;
|
|
105
|
+
/* Read again under the workspace the routing row named; the anchor
|
|
106
|
+
hash it signs is never visible to the cross-tenant lease. */
|
|
107
|
+
const anchor = await options.repository.getAnchor(
|
|
108
|
+
routing.tenantId,
|
|
109
|
+
routing.id,
|
|
110
|
+
);
|
|
111
|
+
if (!anchor || anchor.keyId === currentKeyId) {
|
|
112
|
+
skipped += 1;
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
/* A signature is re-made only once the stored one is proved. A key the
|
|
116
|
+
ring does not hold, or an anchor whose signature does not verify
|
|
117
|
+
under the key it names, is reported and left exactly as it is: a new
|
|
118
|
+
signature over the same anchor hash would turn a row nobody can
|
|
119
|
+
account for into one this deployment vouches for. */
|
|
120
|
+
if (
|
|
121
|
+
!options.signer.knows(anchor.keyId) ||
|
|
122
|
+
!options.signer.verify(
|
|
123
|
+
anchor.anchorHash,
|
|
124
|
+
anchor.signature,
|
|
125
|
+
anchor.keyId,
|
|
126
|
+
)
|
|
127
|
+
) {
|
|
128
|
+
unverifiedCount += 1;
|
|
129
|
+
if (unverified.length < ANCHOR_ROTATION_REPORT_LIMIT) {
|
|
130
|
+
unverified.push(anchor.id);
|
|
131
|
+
}
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
const written = await options.repository.resignAnchor({
|
|
135
|
+
tenantId: anchor.tenantId,
|
|
136
|
+
id: anchor.id,
|
|
137
|
+
signature: options.signer.sign(anchor.anchorHash),
|
|
138
|
+
keyId: currentKeyId,
|
|
139
|
+
expectedSignature: anchor.signature,
|
|
140
|
+
});
|
|
141
|
+
if (written) rotated += 1;
|
|
142
|
+
else skipped += 1;
|
|
143
|
+
}
|
|
144
|
+
if (page.length < batchSize) break;
|
|
145
|
+
}
|
|
146
|
+
return { ...report, rotated, skipped, unverified, unverifiedCount };
|
|
147
|
+
}
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The three background loops of audit.core on the platform job runner
|
|
3
|
+
* (`@flowdular/sdk/server`). The runner owns the timer and its unref, the guard
|
|
4
|
+
* against overlapping passes, the bound on the work one pass takes, the
|
|
5
|
+
* per-item isolation, the renewal timer with the abort it raises when the fence
|
|
6
|
+
* answers false, and the drain on stop. This module keeps its tables, its
|
|
7
|
+
* routing reads, its claim statements with their stale windows, its renewal
|
|
8
|
+
* statements and every outcome it records.
|
|
9
|
+
*
|
|
10
|
+
* One runner per loop rather than one for audit.core: the intervals, the
|
|
11
|
+
* routing pages and the claims differ, and a retention sweep that ran every
|
|
12
|
+
* five seconds or an export that waited an hour would both be wrong.
|
|
13
|
+
*/
|
|
14
|
+
import {
|
|
15
|
+
createJobRunner,
|
|
16
|
+
createJobTraceSink,
|
|
17
|
+
jobBackoff,
|
|
18
|
+
serverLogger,
|
|
19
|
+
type JobEvent,
|
|
20
|
+
type JobRunner,
|
|
21
|
+
type Tracer,
|
|
22
|
+
} from '@flowdular/sdk/server';
|
|
23
|
+
import type { AuditErasureRun, AuditExportRun } from '../domain/types.ts';
|
|
24
|
+
import {
|
|
25
|
+
ERASURE_CLAIM_TIMEOUT_MS,
|
|
26
|
+
ERASURE_POLL_INTERVAL_MS,
|
|
27
|
+
ERASURE_ROUTING_PAGE,
|
|
28
|
+
type AuditErasureService,
|
|
29
|
+
} from './erasure-service.ts';
|
|
30
|
+
import {
|
|
31
|
+
EXPORT_CLAIM_TIMEOUT_MS,
|
|
32
|
+
EXPORT_POLL_INTERVAL_MS,
|
|
33
|
+
EXPORT_ROUTING_PAGE,
|
|
34
|
+
type AuditExportService,
|
|
35
|
+
} from './export-service.ts';
|
|
36
|
+
import type { AuditRepository } from './repository.ts';
|
|
37
|
+
import {
|
|
38
|
+
SWEEP_ROUTING_PAGE,
|
|
39
|
+
type AuditSweepService,
|
|
40
|
+
type DueDataClass,
|
|
41
|
+
} from './sweep-service.ts';
|
|
42
|
+
|
|
43
|
+
interface RunnerSeams {
|
|
44
|
+
readonly now?: (() => number) | undefined;
|
|
45
|
+
/** Absent turns every pass into spans; a sink of its own replaces that. */
|
|
46
|
+
readonly onEvent?: ((event: JobEvent) => void) | undefined;
|
|
47
|
+
/** Defaults to the process tracer, which is the one `context.tracer` carries. */
|
|
48
|
+
readonly tracer?: Tracer | undefined;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/* One sink per loop: the pass spans it keeps open are that loop's, and the
|
|
52
|
+
three loops here run at cadences of their own. */
|
|
53
|
+
function traceSink(options: RunnerSeams): (event: JobEvent) => void {
|
|
54
|
+
return (
|
|
55
|
+
options.onEvent ??
|
|
56
|
+
createJobTraceSink(options.tracer ? { tracer: options.tracer } : {})
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export interface AuditSweepRunnerOptions extends RunnerSeams {
|
|
61
|
+
readonly sweeps: () => Promise<AuditSweepService>;
|
|
62
|
+
/**
|
|
63
|
+
* Read once, as the cadence was before the runner: the setting's description
|
|
64
|
+
* says an edited value applies the next time the platform starts. The same
|
|
65
|
+
* setting is read live per pass for the due cutoff.
|
|
66
|
+
*/
|
|
67
|
+
readonly intervalMs: number;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export interface AuditExportRunnerOptions extends RunnerSeams {
|
|
71
|
+
readonly exports: () => Promise<AuditExportService>;
|
|
72
|
+
readonly repository: () => Promise<AuditRepository>;
|
|
73
|
+
readonly pollIntervalMs?: number | undefined;
|
|
74
|
+
readonly claimTimeoutMs?: number | undefined;
|
|
75
|
+
readonly heartbeatEveryMs?: number | undefined;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export interface AuditErasureRunnerOptions extends RunnerSeams {
|
|
79
|
+
readonly erasures: () => Promise<AuditErasureService>;
|
|
80
|
+
readonly repository: () => Promise<AuditRepository>;
|
|
81
|
+
readonly pollIntervalMs?: number | undefined;
|
|
82
|
+
readonly claimTimeoutMs?: number | undefined;
|
|
83
|
+
readonly heartbeatEveryMs?: number | undefined;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** A claimed run and the claim instant every renewal of it is fenced on. */
|
|
87
|
+
interface ClaimedRun<Run> {
|
|
88
|
+
readonly run: Run;
|
|
89
|
+
held: number;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** Routing columns are all a cross-workspace read answers. */
|
|
93
|
+
interface RunRouting {
|
|
94
|
+
readonly tenantId: string;
|
|
95
|
+
readonly id: string;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
interface ClaimRunInput extends RunRouting {
|
|
99
|
+
readonly claimedAt: number;
|
|
100
|
+
readonly staleBefore: number;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* The retention sweep. It claims nothing: a class is taken by the compare and
|
|
105
|
+
* swap on the sweep stamp the routing row carried, so there is no lease to hold
|
|
106
|
+
* and none to renew. One pass reads the routing page once and refuses,
|
|
107
|
+
* withholds or sweeps each class of it under the backup evidence that page was
|
|
108
|
+
* read with.
|
|
109
|
+
*/
|
|
110
|
+
export function createAuditSweepRunner(
|
|
111
|
+
options: AuditSweepRunnerOptions,
|
|
112
|
+
): JobRunner {
|
|
113
|
+
/* The page one pass works through. It refills only once drained, and a page
|
|
114
|
+
shorter than the bound means nothing more was due, so a pass reads the
|
|
115
|
+
routing table exactly once however many classes it examines. */
|
|
116
|
+
let queue: DueDataClass[] = [];
|
|
117
|
+
let refillable = true;
|
|
118
|
+
|
|
119
|
+
return createJobRunner<DueDataClass>({
|
|
120
|
+
name: 'audit.core.sweep',
|
|
121
|
+
intervalMs: options.intervalMs,
|
|
122
|
+
/* No claim and no renewal, so no window: the runner reads the field only
|
|
123
|
+
to space heartbeats this loop does not have. */
|
|
124
|
+
staleAfterMs: options.intervalMs,
|
|
125
|
+
backoff: jobBackoff(options.intervalMs),
|
|
126
|
+
batchLimit: SWEEP_ROUTING_PAGE,
|
|
127
|
+
logger: serverLogger,
|
|
128
|
+
now: options.now,
|
|
129
|
+
onEvent: traceSink(options),
|
|
130
|
+
claim: async () => {
|
|
131
|
+
if (queue.length === 0 && refillable) {
|
|
132
|
+
const page = await (await options.sweeps()).due(SWEEP_ROUTING_PAGE);
|
|
133
|
+
refillable = page.length === SWEEP_ROUTING_PAGE;
|
|
134
|
+
queue = [...page];
|
|
135
|
+
}
|
|
136
|
+
const next = queue.shift();
|
|
137
|
+
if (!next) {
|
|
138
|
+
refillable = true;
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
return next;
|
|
142
|
+
},
|
|
143
|
+
perform: async (due) => {
|
|
144
|
+
await (await options.sweeps()).sweep(due);
|
|
145
|
+
},
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/** Requested exports, claimed under the workspace the routing row named. */
|
|
150
|
+
export function createAuditExportRunner(
|
|
151
|
+
options: AuditExportRunnerOptions,
|
|
152
|
+
): JobRunner {
|
|
153
|
+
const staleAfterMs = options.claimTimeoutMs ?? EXPORT_CLAIM_TIMEOUT_MS;
|
|
154
|
+
const intervalMs = options.pollIntervalMs ?? EXPORT_POLL_INTERVAL_MS;
|
|
155
|
+
const claim = claimQueue<AuditExportRun>({
|
|
156
|
+
limit: EXPORT_ROUTING_PAGE,
|
|
157
|
+
staleAfterMs,
|
|
158
|
+
page: async (limit) =>
|
|
159
|
+
(await options.repository()).listPendingExportRuns(limit),
|
|
160
|
+
take: async (input) => (await options.repository()).claimExportRun(input),
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
return createJobRunner<ClaimedRun<AuditExportRun>>({
|
|
164
|
+
name: 'audit.core.export',
|
|
165
|
+
intervalMs,
|
|
166
|
+
staleAfterMs,
|
|
167
|
+
backoff: jobBackoff(intervalMs),
|
|
168
|
+
batchLimit: EXPORT_ROUTING_PAGE,
|
|
169
|
+
heartbeatEveryMs: options.heartbeatEveryMs,
|
|
170
|
+
logger: serverLogger,
|
|
171
|
+
now: options.now,
|
|
172
|
+
onEvent: traceSink(options),
|
|
173
|
+
claim,
|
|
174
|
+
heartbeat: async (item, at) => {
|
|
175
|
+
const renewed = await (
|
|
176
|
+
await options.repository()
|
|
177
|
+
).heartbeatExportRun(item.run.tenantId, item.run.id, at, item.held);
|
|
178
|
+
if (renewed) item.held = at;
|
|
179
|
+
return renewed;
|
|
180
|
+
},
|
|
181
|
+
perform: async (item, signal) => {
|
|
182
|
+
await (await options.exports()).perform(item.run, signal);
|
|
183
|
+
/* The stage records nothing when the claim changed hands and leaves the
|
|
184
|
+
run as the loop that owns it now will find it. Raising the abort here
|
|
185
|
+
is how the pass learns the item was contention, not work performed. */
|
|
186
|
+
signal.throwIfAborted();
|
|
187
|
+
},
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/** Requested erasures, including the expiry of one no platform answered. */
|
|
192
|
+
export function createAuditErasureRunner(
|
|
193
|
+
options: AuditErasureRunnerOptions,
|
|
194
|
+
): JobRunner {
|
|
195
|
+
const staleAfterMs = options.claimTimeoutMs ?? ERASURE_CLAIM_TIMEOUT_MS;
|
|
196
|
+
const intervalMs = options.pollIntervalMs ?? ERASURE_POLL_INTERVAL_MS;
|
|
197
|
+
const claim = claimQueue<AuditErasureRun>({
|
|
198
|
+
limit: ERASURE_ROUTING_PAGE,
|
|
199
|
+
staleAfterMs,
|
|
200
|
+
page: async (limit) =>
|
|
201
|
+
(await options.repository()).listPendingErasureRuns(limit),
|
|
202
|
+
take: async (input) => (await options.repository()).claimErasureRun(input),
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
return createJobRunner<ClaimedRun<AuditErasureRun>>({
|
|
206
|
+
name: 'audit.core.erasure',
|
|
207
|
+
intervalMs,
|
|
208
|
+
staleAfterMs,
|
|
209
|
+
backoff: jobBackoff(intervalMs),
|
|
210
|
+
batchLimit: ERASURE_ROUTING_PAGE,
|
|
211
|
+
heartbeatEveryMs: options.heartbeatEveryMs,
|
|
212
|
+
logger: serverLogger,
|
|
213
|
+
now: options.now,
|
|
214
|
+
onEvent: traceSink(options),
|
|
215
|
+
claim,
|
|
216
|
+
heartbeat: async (item, at) => {
|
|
217
|
+
const renewed = await (
|
|
218
|
+
await options.repository()
|
|
219
|
+
).heartbeatErasureRun(item.run.tenantId, item.run.id, at, item.held);
|
|
220
|
+
if (renewed) item.held = at;
|
|
221
|
+
return renewed;
|
|
222
|
+
},
|
|
223
|
+
perform: async (item, signal) => {
|
|
224
|
+
await (await options.erasures()).perform(item.run, signal);
|
|
225
|
+
signal.throwIfAborted();
|
|
226
|
+
},
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* One claim attempt over a routing page held between calls. Both request loops
|
|
232
|
+
* read routing columns across workspaces on the background lease and claim
|
|
233
|
+
* under the workspace the routing row named, so they share the walk and keep
|
|
234
|
+
* their own statements.
|
|
235
|
+
*/
|
|
236
|
+
function claimQueue<Run>(options: {
|
|
237
|
+
readonly limit: number;
|
|
238
|
+
readonly staleAfterMs: number;
|
|
239
|
+
readonly page: (limit: number) => Promise<readonly RunRouting[]>;
|
|
240
|
+
readonly take: (input: ClaimRunInput) => Promise<Run | null>;
|
|
241
|
+
}): (at: number) => Promise<ClaimedRun<Run> | null> {
|
|
242
|
+
let queue: RunRouting[] = [];
|
|
243
|
+
let refillable = true;
|
|
244
|
+
/* Rows this pass walked past without taking them. The runner bounds the
|
|
245
|
+
claims it is handed; this bounds the rows read to find them, so a page of
|
|
246
|
+
runs other processes hold cannot cost one routing read per row. */
|
|
247
|
+
let skipped = 0;
|
|
248
|
+
|
|
249
|
+
return async (at) => {
|
|
250
|
+
while (skipped < options.limit) {
|
|
251
|
+
if (queue.length === 0) {
|
|
252
|
+
if (!refillable) break;
|
|
253
|
+
const page = await options.page(options.limit);
|
|
254
|
+
refillable = page.length === options.limit;
|
|
255
|
+
queue = [...page];
|
|
256
|
+
if (queue.length === 0) break;
|
|
257
|
+
}
|
|
258
|
+
const routing = queue.shift()!;
|
|
259
|
+
const run = await options.take({
|
|
260
|
+
tenantId: routing.tenantId,
|
|
261
|
+
id: routing.id,
|
|
262
|
+
claimedAt: at,
|
|
263
|
+
staleBefore: at - options.staleAfterMs,
|
|
264
|
+
});
|
|
265
|
+
/* The claim statement wrote `at`, so that is the instant every renewal
|
|
266
|
+
fences on. */
|
|
267
|
+
if (run) return { run, held: at };
|
|
268
|
+
/* Another process holds it, or it was answered between the routing read
|
|
269
|
+
and the claim. Either way it is not this pass's work. */
|
|
270
|
+
skipped += 1;
|
|
271
|
+
}
|
|
272
|
+
/* Null ends the pass, so the next one walks a budget of its own and asks
|
|
273
|
+
the queue again for whatever is left here. */
|
|
274
|
+
skipped = 0;
|
|
275
|
+
refillable = true;
|
|
276
|
+
return null;
|
|
277
|
+
};
|
|
278
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { readFile, stat } from 'node:fs/promises';
|
|
2
|
+
import { isAbsolute, resolve } from 'node:path';
|
|
3
|
+
import {
|
|
4
|
+
BACKUP_MANIFEST_FILE,
|
|
5
|
+
parseBackupManifest,
|
|
6
|
+
type BackupKeyFingerprint,
|
|
7
|
+
} from '@flowdular/sdk/database';
|
|
8
|
+
import { AUDIT_REASONS } from '../domain/types.ts';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* How a deployment records that a backup exists. It points at the directory or
|
|
12
|
+
* at the `backup.json` that `flowdular database backup --apply` wrote. The
|
|
13
|
+
* sweep and the export read it and refuse while it names nothing, so a policy
|
|
14
|
+
* defect can never destroy data no backup holds.
|
|
15
|
+
*/
|
|
16
|
+
export const AUDIT_BACKUP_MANIFEST_VARIABLE = 'FD_AUDIT_BACKUP_MANIFEST';
|
|
17
|
+
|
|
18
|
+
/* A manifest is a few hundred bytes; anything this size is not one, and the
|
|
19
|
+
read is bounded before the file reaches memory. */
|
|
20
|
+
const MANIFEST_SIZE_LIMIT = 1_048_576;
|
|
21
|
+
|
|
22
|
+
export interface BackupEvidence {
|
|
23
|
+
readonly manifestPath: string;
|
|
24
|
+
readonly createdAt: string;
|
|
25
|
+
readonly adapter: string;
|
|
26
|
+
readonly platformVersion: string;
|
|
27
|
+
/** The key fingerprints the backup was taken under; never key material. */
|
|
28
|
+
readonly keys: readonly BackupKeyFingerprint[];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export type BackupGuardResult =
|
|
32
|
+
| { readonly ok: true; readonly evidence: BackupEvidence }
|
|
33
|
+
| { readonly ok: false; readonly reason: string; readonly detail: string };
|
|
34
|
+
|
|
35
|
+
export type BackupGuard = () => Promise<BackupGuardResult>;
|
|
36
|
+
|
|
37
|
+
function missing(detail: string): BackupGuardResult {
|
|
38
|
+
return {
|
|
39
|
+
ok: false,
|
|
40
|
+
reason: AUDIT_REASONS.backupManifestMissing,
|
|
41
|
+
detail,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function manifestPath(value: string, workspaceRoot: string): string {
|
|
46
|
+
const base = isAbsolute(value) ? value : resolve(workspaceRoot, value);
|
|
47
|
+
return base.endsWith('.json') ? base : resolve(base, BACKUP_MANIFEST_FILE);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Reads the recorded manifest on every call. It is asked once per sweep pass
|
|
52
|
+
* and once per export, so a backup taken while the platform runs is picked up
|
|
53
|
+
* without a restart and a backup directory that disappeared stops the sweep at
|
|
54
|
+
* the next interval.
|
|
55
|
+
*/
|
|
56
|
+
export function createBackupGuard(
|
|
57
|
+
environment: NodeJS.ProcessEnv,
|
|
58
|
+
workspaceRoot: string,
|
|
59
|
+
): BackupGuard {
|
|
60
|
+
return async () => {
|
|
61
|
+
const configured = environment[AUDIT_BACKUP_MANIFEST_VARIABLE]?.trim();
|
|
62
|
+
if (!configured) {
|
|
63
|
+
return missing(
|
|
64
|
+
`${AUDIT_BACKUP_MANIFEST_VARIABLE} is not set, so this deployment records no backup.`,
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
const path = manifestPath(configured, workspaceRoot);
|
|
68
|
+
try {
|
|
69
|
+
const stats = await stat(path);
|
|
70
|
+
if (!stats.isFile()) return missing(`${path} is not a backup manifest.`);
|
|
71
|
+
if (stats.size > MANIFEST_SIZE_LIMIT) {
|
|
72
|
+
return missing(`${path} is too large to be a backup manifest.`);
|
|
73
|
+
}
|
|
74
|
+
const manifest = parseBackupManifest(
|
|
75
|
+
JSON.parse(await readFile(path, 'utf8')),
|
|
76
|
+
);
|
|
77
|
+
return {
|
|
78
|
+
ok: true,
|
|
79
|
+
evidence: {
|
|
80
|
+
manifestPath: path,
|
|
81
|
+
createdAt: manifest.createdAt,
|
|
82
|
+
adapter: manifest.adapter,
|
|
83
|
+
platformVersion: manifest.platformVersion,
|
|
84
|
+
keys: manifest.keys,
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
} catch (error) {
|
|
88
|
+
return missing(
|
|
89
|
+
`${path} could not be read as a backup manifest: ${
|
|
90
|
+
error instanceof Error ? error.message : String(error)
|
|
91
|
+
}`,
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
}
|