@flowdular/sdk 0.2.4 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.ai/agents/sandbox/business-manager.md +5 -1
- package/.ai/blueprints/author-spec/README.md +1 -1
- package/.ai/blueprints/author-spec/spec-requirements.yaml +44 -0
- package/.ai/blueprints/author-spec/steps.yaml +5 -5
- package/.ai/blueprints/author-spec/templates/module.yaml +99 -3
- package/.ai/blueprints/edit-module/gates.yaml +4 -0
- package/.ai/blueprints/edit-module/required-files.yaml +9 -0
- package/.ai/blueprints/new-module/gates.yaml +4 -0
- package/.ai/blueprints/new-module/spec-requirements.yaml +2 -2
- package/.ai/blueprints/release/gates.yaml +4 -0
- package/.ai/platform-capabilities.md +128 -0
- package/.ai/policies/capabilities.yaml +100 -0
- package/.ai/policies/path-ownership.yaml +5 -2
- package/.ai/policies/task-budgets.yaml +5 -3
- package/.ai/references/catalog/module.json +4 -4
- package/.ai/references/catalog/package.json +2 -2
- package/.ai/references/catalog/spec/module.yaml +5 -3
- package/.ai/references/catalog/src/platform.ts +2 -0
- package/.ai/references/catalog/src/services/catalog-service.ts +89 -1
- package/.ai/references/catalog/src/services/data-classes.ts +47 -0
- package/.ai/references/catalog/src/services/database-repository.ts +98 -1
- package/.ai/references/catalog/src/services/repository.ts +22 -1
- package/.ai/references/catalog/tests/data-classes.test.ts +157 -0
- package/.ai/references/catalog.provenance.json +12 -10
- package/.ai/skills/README.md +10 -0
- package/.ai/skills/agent-tool-design/SKILL.md +1 -2
- package/.ai/skills/auth-security-review/SKILL.md +1 -1
- package/.ai/skills/business-agent-design/SKILL.md +0 -1
- package/.ai/skills/deploy-operate/SKILL.md +114 -0
- package/.ai/skills/module-new/SKILL.md +29 -3
- package/.ai/skills/module-update/SKILL.md +9 -3
- package/.ai/skills/perf-audit/SKILL.md +0 -1
- package/.ai/skills/release-eject-pr/SKILL.md +0 -1
- package/.ai/skills/spec-interview/SKILL.md +120 -0
- package/.ai/skills/test-hardening/SKILL.md +1 -0
- package/.ai/skills/ux-design/SKILL.md +34 -3
- package/.ai/skills/variables/SKILL.md +0 -2
- package/.ai/skills/workflow-development/SKILL.md +0 -1
- package/AGENTS.md +4 -0
- package/docs/agent-contract.md +2 -2
- package/docs/design-system.md +185 -31
- package/modules/access/migrations/0001_access_core.down.sql +1 -0
- package/modules/access/migrations/0001_access_core.up.sql +28 -0
- package/modules/access/migrations/README.md +3 -0
- package/modules/access/module.json +33 -0
- package/modules/access/package.json +43 -0
- package/modules/access/spec/module.yaml +225 -0
- package/modules/access/src/acl/permissions.ts +6 -0
- package/modules/access/src/api/endpoints.ts +244 -0
- package/modules/access/src/client/ActivityView.tsrx +245 -0
- package/modules/access/src/client/AttestationsView.tsrx +176 -0
- package/modules/access/src/client/ReviewView.tsrx +586 -0
- package/modules/access/src/client/api.ts +132 -0
- package/modules/access/src/client/contribution.tsrx +41 -0
- package/modules/access/src/client/index.ts +41 -0
- package/modules/access/src/client/navigation.ts +57 -0
- package/modules/access/src/client/presentation.ts +69 -0
- package/modules/access/src/client/state.ts +72 -0
- package/modules/access/src/domain/types.ts +189 -0
- package/modules/access/src/index.ts +38 -0
- package/modules/access/src/platform.ts +60 -0
- package/modules/access/src/server/index.ts +42 -0
- package/modules/access/src/server/runtime.ts +105 -0
- package/modules/access/src/services/access-service.ts +298 -0
- package/modules/access/src/services/audit-window.ts +78 -0
- package/modules/access/src/services/auth-directory.ts +72 -0
- package/modules/access/src/services/changes.ts +91 -0
- package/modules/access/src/services/data-classes.ts +28 -0
- package/modules/access/src/services/database-repository.ts +185 -0
- package/modules/access/src/services/directory.ts +102 -0
- package/modules/access/src/services/index.ts +33 -0
- package/modules/access/src/services/list-exports.ts +150 -0
- package/modules/access/src/services/migration.ts +54 -0
- package/modules/access/src/services/repository.ts +30 -0
- package/modules/access/src/services/review.ts +178 -0
- package/modules/access/translations/en.json +155 -0
- package/modules/access/translations/pl.json +155 -0
- package/modules/agents/migrations/0022_credential_rotation_inventory.down.sql +2 -0
- package/modules/agents/migrations/0022_credential_rotation_inventory.up.sql +7 -0
- package/modules/agents/migrations/0023_agents_retention_indexes.down.sql +2 -0
- package/modules/agents/migrations/0023_agents_retention_indexes.up.sql +9 -0
- package/modules/agents/migrations/0024_agent_meter_refusals.down.sql +3 -0
- package/modules/agents/migrations/0024_agent_meter_refusals.up.sql +22 -0
- package/modules/agents/migrations/0025_agent_list_indexes.down.sql +3 -0
- package/modules/agents/migrations/0025_agent_list_indexes.up.sql +11 -0
- package/modules/agents/module.json +30 -4
- package/modules/agents/package.json +2 -1
- package/modules/agents/spec/module.yaml +63 -5
- package/modules/agents/src/api/endpoints.ts +291 -33
- package/modules/agents/src/cli/commands.json +11 -0
- package/modules/agents/src/cli/index.ts +45 -0
- package/modules/agents/src/client/AgentDashboardWidget.tsrx +19 -11
- package/modules/agents/src/client/AgentDefinitionList.tsrx +53 -10
- package/modules/agents/src/client/AgentPlaygroundView.tsrx +4 -4
- package/modules/agents/src/client/AgentProceduresView.tsrx +2 -2
- package/modules/agents/src/client/AgentRunsView.tsrx +143 -40
- package/modules/agents/src/client/AgentsView.tsrx +109 -33
- package/modules/agents/src/client/api.ts +99 -21
- package/modules/agents/src/client/state.ts +97 -0
- package/modules/agents/src/domain/types.ts +44 -4
- package/modules/agents/src/platform.ts +42 -0
- package/modules/agents/src/server/action-execution.ts +201 -106
- package/modules/agents/src/server/runtime.ts +32 -0
- package/modules/agents/src/services/agent-service.ts +158 -30
- package/modules/agents/src/services/credential-rotation.ts +185 -0
- package/modules/agents/src/services/credential-vault.ts +71 -46
- package/modules/agents/src/services/data-classes.ts +176 -0
- package/modules/agents/src/services/database-repository.ts +393 -101
- package/modules/agents/src/services/metering.ts +111 -0
- package/modules/agents/src/services/migration.ts +109 -0
- package/modules/agents/src/services/module-agent-preflight.ts +17 -9
- package/modules/agents/src/services/notifications.ts +98 -0
- package/modules/agents/src/services/provider-repository.ts +9 -18
- package/modules/agents/src/services/provider-service.ts +1 -9
- package/modules/agents/src/services/reports.ts +107 -0
- package/modules/agents/src/services/repository.ts +86 -6
- package/modules/agents/src/services/usage-service.ts +2 -0
- package/modules/agents/src/services/worker.ts +114 -4
- package/modules/agents/src/settings.ts +14 -3
- package/modules/agents/translations/en.json +14 -4
- package/modules/agents/translations/pl.json +14 -4
- package/modules/approvals/migrations/0001_approvals_core.down.sql +3 -0
- package/modules/approvals/migrations/0001_approvals_core.up.sql +78 -0
- package/modules/approvals/migrations/0002_approvals_expiry_routing_role.down.sql +2 -0
- package/modules/approvals/migrations/0002_approvals_expiry_routing_role.up.sql +19 -0
- package/modules/approvals/migrations/0003_approvals_retention_indexes.down.sql +6 -0
- package/modules/approvals/migrations/0003_approvals_retention_indexes.up.sql +14 -0
- package/modules/approvals/migrations/0004_approvals_inbox_keyset_indexes.down.sql +5 -0
- package/modules/approvals/migrations/0004_approvals_inbox_keyset_indexes.up.sql +12 -0
- package/modules/approvals/migrations/README.md +3 -0
- package/modules/approvals/module.json +34 -0
- package/modules/approvals/package.json +43 -0
- package/modules/approvals/spec/module.yaml +318 -0
- package/modules/approvals/src/acl/permissions.ts +7 -0
- package/modules/approvals/src/api/endpoints.ts +457 -0
- package/modules/approvals/src/client/ApprovalRequestDrawer.tsrx +138 -0
- package/modules/approvals/src/client/ApprovalsView.tsrx +562 -0
- package/modules/approvals/src/client/PendingCountWidget.tsrx +52 -0
- package/modules/approvals/src/client/api.ts +203 -0
- package/modules/approvals/src/client/approvals.css +51 -0
- package/modules/approvals/src/client/contribution.tsrx +44 -0
- package/modules/approvals/src/client/index.ts +26 -0
- package/modules/approvals/src/client/navigation.ts +39 -0
- package/modules/approvals/src/client/pending-count.ts +26 -0
- package/modules/approvals/src/client/presentation.ts +52 -0
- package/modules/approvals/src/client/state.ts +141 -0
- package/modules/approvals/src/domain/capability.ts +95 -0
- package/modules/approvals/src/domain/types.ts +154 -0
- package/modules/approvals/src/index.ts +52 -0
- package/modules/approvals/src/platform.ts +128 -0
- package/modules/approvals/src/server/index.ts +42 -0
- package/modules/approvals/src/server/runtime.ts +181 -0
- package/modules/approvals/src/services/approvals-service.ts +557 -0
- package/modules/approvals/src/services/callbacks.ts +75 -0
- package/modules/approvals/src/services/data-classes.ts +167 -0
- package/modules/approvals/src/services/database-repository.ts +724 -0
- package/modules/approvals/src/services/eligibility.ts +121 -0
- package/modules/approvals/src/services/expiry-runner.ts +81 -0
- package/modules/approvals/src/services/index.ts +31 -0
- package/modules/approvals/src/services/migration.ts +222 -0
- package/modules/approvals/src/services/notifications.ts +95 -0
- package/modules/approvals/src/services/repository.ts +161 -0
- package/modules/approvals/src/services/service-error.ts +70 -0
- package/modules/approvals/src/settings.ts +102 -0
- package/modules/approvals/translations/en.json +104 -0
- package/modules/approvals/translations/pl.json +104 -0
- package/modules/audit/migrations/0001_audit_core.down.sql +8 -0
- package/modules/audit/migrations/0001_audit_core.up.sql +107 -0
- package/modules/audit/migrations/0002_audit_sweep_routing_role.down.sql +2 -0
- package/modules/audit/migrations/0002_audit_sweep_routing_role.up.sql +21 -0
- package/modules/audit/migrations/0003_audit_export_request.down.sql +12 -0
- package/modules/audit/migrations/0003_audit_export_request.up.sql +40 -0
- package/modules/audit/migrations/0004_audit_hold_seal_erasure.down.sql +17 -0
- package/modules/audit/migrations/0004_audit_hold_seal_erasure.up.sql +192 -0
- package/modules/audit/migrations/0005_audit_event_format.down.sql +17 -0
- package/modules/audit/migrations/0005_audit_event_format.up.sql +60 -0
- package/modules/audit/migrations/0006_audit_own_class_walks.down.sql +3 -0
- package/modules/audit/migrations/0006_audit_own_class_walks.up.sql +14 -0
- package/modules/audit/migrations/README.md +3 -0
- package/modules/audit/module.json +32 -0
- package/modules/audit/package.json +49 -0
- package/modules/audit/spec/module.yaml +809 -0
- package/modules/audit/src/acl/permissions.ts +7 -0
- package/modules/audit/src/api/endpoints.ts +315 -0
- package/modules/audit/src/cli/commands.json +95 -0
- package/modules/audit/src/cli/index.ts +658 -0
- package/modules/audit/src/client/DataClassesView.tsrx +420 -0
- package/modules/audit/src/client/ExportsView.tsrx +256 -0
- package/modules/audit/src/client/HoldsView.tsrx +604 -0
- package/modules/audit/src/client/SweepsView.tsrx +251 -0
- package/modules/audit/src/client/api.ts +185 -0
- package/modules/audit/src/client/contribution.tsrx +52 -0
- package/modules/audit/src/client/index.ts +23 -0
- package/modules/audit/src/client/navigation.ts +74 -0
- package/modules/audit/src/client/presentation.ts +105 -0
- package/modules/audit/src/client/state.ts +86 -0
- package/modules/audit/src/domain/data-classes.ts +16 -0
- package/modules/audit/src/domain/types.ts +339 -0
- package/modules/audit/src/index.ts +76 -0
- package/modules/audit/src/platform.ts +44 -0
- package/modules/audit/src/server/index.ts +177 -0
- package/modules/audit/src/server/runtime.ts +303 -0
- package/modules/audit/src/services/anchor-key.ts +143 -0
- package/modules/audit/src/services/anchor-rotation.ts +147 -0
- package/modules/audit/src/services/audit-runners.ts +278 -0
- package/modules/audit/src/services/backup-guard.ts +95 -0
- package/modules/audit/src/services/database-repository.ts +1946 -0
- package/modules/audit/src/services/declared-classes.ts +64 -0
- package/modules/audit/src/services/erasure-port.ts +126 -0
- package/modules/audit/src/services/erasure-service.ts +770 -0
- package/modules/audit/src/services/export-directory.ts +106 -0
- package/modules/audit/src/services/export-service.ts +714 -0
- package/modules/audit/src/services/hold-service.ts +295 -0
- package/modules/audit/src/services/index.ts +17 -0
- package/modules/audit/src/services/migration.ts +658 -0
- package/modules/audit/src/services/own-classes.ts +318 -0
- package/modules/audit/src/services/platform-version.ts +23 -0
- package/modules/audit/src/services/repository.ts +495 -0
- package/modules/audit/src/services/retention-service.ts +191 -0
- package/modules/audit/src/services/seal-service.ts +769 -0
- package/modules/audit/src/services/service-error.ts +61 -0
- package/modules/audit/src/services/subject-keys.ts +90 -0
- package/modules/audit/src/services/sweep-service.ts +298 -0
- package/modules/audit/src/services/zip.ts +217 -0
- package/modules/audit/src/settings.ts +69 -0
- package/modules/audit/translations/en.json +210 -0
- package/modules/audit/translations/pl.json +210 -0
- package/modules/auth/README.md +77 -29
- package/modules/auth/migrations/0016_external_identities.up.sql +16 -0
- package/modules/auth/migrations/0017_mfa_key_id.up.sql +8 -0
- package/modules/auth/migrations/0018_retire_bundled_module_scopes.up.sql +29 -0
- package/modules/auth/migrations/0019_notifications_member_scopes.up.sql +44 -0
- package/modules/auth/migrations/0020_identity_providers.up.sql +61 -0
- package/modules/auth/migrations/0021_membership_status.up.sql +19 -0
- package/modules/auth/migrations/0022_auth_provider_scopes.up.sql +45 -0
- package/modules/auth/migrations/0023_enterprise_module_scopes.down.sql +19 -0
- package/modules/auth/migrations/0023_enterprise_module_scopes.up.sql +71 -0
- package/modules/auth/migrations/0024_approvals_member_scopes.down.sql +22 -0
- package/modules/auth/migrations/0024_approvals_member_scopes.up.sql +48 -0
- package/modules/auth/migrations/0025_audit_holds_owner_scope.down.sql +21 -0
- package/modules/auth/migrations/0025_audit_holds_owner_scope.up.sql +47 -0
- package/modules/auth/migrations/0026_auth_export_keyset_indexes.down.sql +6 -0
- package/modules/auth/migrations/0026_auth_export_keyset_indexes.up.sql +15 -0
- package/modules/auth/migrations/0027_workflow_automation_profile_scopes.down.sql +34 -0
- package/modules/auth/migrations/0027_workflow_automation_profile_scopes.up.sql +72 -0
- package/modules/auth/migrations/0028_auth_member_search_prefix_indexes.down.sql +6 -0
- package/modules/auth/migrations/0028_auth_member_search_prefix_indexes.up.sql +21 -0
- package/modules/auth/migrations/0029_reports_exports_access_scopes.down.sql +22 -0
- package/modules/auth/migrations/0029_reports_exports_access_scopes.up.sql +56 -0
- package/modules/auth/migrations/0030_auth_membership_keyset_index.down.sql +4 -0
- package/modules/auth/migrations/0030_auth_membership_keyset_index.up.sql +10 -0
- package/modules/auth/migrations/0031_membership_scope_backfills_under_rls.down.sql +4 -0
- package/modules/auth/migrations/0031_membership_scope_backfills_under_rls.up.sql +31 -0
- package/modules/auth/migrations/0032_audit_actor_service.down.sql +9 -0
- package/modules/auth/migrations/0032_audit_actor_service.up.sql +10 -0
- package/modules/auth/migrations/0033_auth_account_keyset_indexes.down.sql +5 -0
- package/modules/auth/migrations/0033_auth_account_keyset_indexes.up.sql +23 -0
- package/modules/auth/module.json +3 -3
- package/modules/auth/package.json +2 -1
- package/modules/auth/spec/module.yaml +372 -3
- package/modules/auth/src/acl/scopes.ts +50 -6
- package/modules/auth/src/cli/commands.json +11 -0
- package/modules/auth/src/cli/greenfield.ts +2 -2
- package/modules/auth/src/cli/index.ts +14 -0
- package/modules/auth/src/cli/secrets.ts +114 -0
- package/modules/auth/src/client/AuthenticationCore.tsrx +61 -8
- package/modules/auth/src/client/api.ts +72 -6
- package/modules/auth/src/client/contribution.tsrx +23 -0
- package/modules/auth/src/client/index.ts +6 -0
- package/modules/auth/src/client/providers/IdentityProviderForm.tsrx +191 -0
- package/modules/auth/src/client/providers/IdentityProvidersView.tsrx +358 -0
- package/modules/auth/src/client/providers/api.ts +128 -0
- package/modules/auth/src/client/providers/provider-columns.tsrx +60 -0
- package/modules/auth/src/client/providers/state.ts +35 -0
- package/modules/auth/src/client/security/SecurityView.tsrx +9 -1
- package/modules/auth/src/client/state.ts +15 -1
- package/modules/auth/src/domain/types.ts +55 -0
- package/modules/auth/src/index.ts +11 -1
- package/modules/auth/src/middleware/authentication.ts +4 -0
- package/modules/auth/src/server/endpoints.ts +467 -171
- package/modules/auth/src/server/http.ts +3 -2
- package/modules/auth/src/server/index.ts +22 -1
- package/modules/auth/src/server/membership-endpoints.ts +62 -0
- package/modules/auth/src/server/mfa-enforcement.ts +156 -0
- package/modules/auth/src/server/oidc.ts +389 -0
- package/modules/auth/src/server/provider-endpoints.ts +246 -0
- package/modules/auth/src/server/provider-host.ts +77 -0
- package/modules/auth/src/server/runtime.ts +231 -55
- package/modules/auth/src/services/auth-service-error.ts +7 -2
- package/modules/auth/src/services/auth-service.ts +948 -51
- package/modules/auth/src/services/data-classes.ts +236 -0
- package/modules/auth/src/services/database-repository.ts +853 -71
- package/modules/auth/src/services/identity-provider-service.ts +571 -0
- package/modules/auth/src/services/mail-delivery.ts +16 -16
- package/modules/auth/src/services/mail-message.ts +54 -0
- package/modules/auth/src/services/mail-port.ts +24 -0
- package/modules/auth/src/services/mail-smtp.ts +85 -0
- package/modules/auth/src/services/mfa-rotation.ts +144 -0
- package/modules/auth/src/services/migration.ts +810 -0
- package/modules/auth/src/services/password.ts +14 -0
- package/modules/auth/src/services/provider-secret-rotation.ts +169 -0
- package/modules/auth/src/services/provider-secrets.ts +136 -0
- package/modules/auth/src/services/repository.ts +321 -5
- package/modules/auth/src/services/session-sweep-runner.ts +73 -0
- package/modules/auth/src/services/settings-store.ts +10 -83
- package/modules/auth/src/services/totp.ts +88 -62
- package/modules/auth/src/services/validation.ts +194 -7
- package/modules/auth/src/settings.ts +18 -0
- package/modules/auth/translations/en.json +84 -1
- package/modules/auth/translations/pl.json +84 -1
- package/modules/automations/migrations/0005_secret_rotation_inventory.down.sql +1 -0
- package/modules/automations/migrations/0005_secret_rotation_inventory.up.sql +6 -0
- package/modules/automations/migrations/0006_automations_list_sort_indexes.down.sql +4 -0
- package/modules/automations/migrations/0006_automations_list_sort_indexes.up.sql +11 -0
- package/modules/automations/module.json +24 -6
- package/modules/automations/package.json +4 -1
- package/modules/automations/spec/module.yaml +81 -7
- package/modules/automations/src/api/endpoints.ts +202 -28
- package/modules/automations/src/cli/commands.json +17 -0
- package/modules/automations/src/cli/index.ts +114 -0
- package/modules/automations/src/client/AutomationScheduleForm.tsrx +77 -19
- package/modules/automations/src/client/AutomationSchedulesView.tsrx +144 -40
- package/modules/automations/src/client/AutomationTriggersView.tsrx +131 -32
- package/modules/automations/src/client/api.ts +62 -19
- package/modules/automations/src/client/presentation.ts +20 -2
- package/modules/automations/src/client/state.ts +84 -0
- package/modules/automations/src/domain/cadence.ts +99 -3
- package/modules/automations/src/domain/cron.ts +366 -0
- package/modules/automations/src/domain/time-zone.ts +61 -0
- package/modules/automations/src/platform.ts +38 -4
- package/modules/automations/src/server/index.ts +11 -0
- package/modules/automations/src/server/runtime.ts +46 -22
- package/modules/{automations-workflows-integration/src/server/adapter.ts → automations/src/server/workflow-target.ts} +13 -14
- package/modules/{automations-workflows-integration/src/server/tools.ts → automations/src/server/workflow-tools.ts} +0 -0
- package/modules/automations/src/services/data-classes.ts +62 -0
- package/modules/automations/src/services/database-repository.ts +152 -38
- package/modules/automations/src/services/migration.ts +119 -9
- package/modules/automations/src/services/repository.ts +52 -1
- package/modules/automations/src/services/schedule-runner.ts +84 -0
- package/modules/automations/src/services/schedule-service.ts +152 -26
- package/modules/automations/src/services/secret-rotation.ts +176 -0
- package/modules/automations/src/services/secret-vault.ts +68 -41
- package/modules/automations/src/services/trigger-service.ts +13 -10
- package/modules/automations/translations/en.json +15 -2
- package/modules/automations/translations/pl.json +15 -2
- package/modules/connectors/migrations/0001_connectors_core.down.sql +3 -0
- package/modules/connectors/migrations/0001_connectors_core.up.sql +72 -0
- package/modules/connectors/migrations/0002_connectors_call_keys.down.sql +3 -0
- package/modules/connectors/migrations/0002_connectors_call_keys.up.sql +18 -0
- package/modules/connectors/migrations/README.md +3 -0
- package/modules/connectors/module.json +28 -0
- package/modules/{automations-workflows-integration → connectors}/package.json +27 -26
- package/modules/connectors/spec/module.yaml +447 -0
- package/modules/connectors/src/acl/permissions.ts +6 -0
- package/modules/connectors/src/agent/tools.ts +180 -0
- package/modules/connectors/src/api/endpoints.ts +572 -0
- package/modules/connectors/src/client/ConnectorCallsView.tsrx +358 -0
- package/modules/connectors/src/client/ConnectorForm.tsrx +424 -0
- package/modules/connectors/src/client/ConnectorsView.tsrx +711 -0
- package/modules/connectors/src/client/api.ts +281 -0
- package/modules/connectors/src/client/consent.ts +48 -0
- package/modules/connectors/src/client/contribution.tsrx +37 -0
- package/modules/connectors/src/client/index.ts +22 -0
- package/modules/connectors/src/client/navigation.ts +42 -0
- package/modules/connectors/src/client/presentation.ts +38 -0
- package/modules/connectors/src/client/state.ts +175 -0
- package/modules/connectors/src/domain/calls.ts +70 -0
- package/modules/connectors/src/domain/definitions.ts +190 -0
- package/modules/connectors/src/domain/http-json.ts +68 -0
- package/modules/connectors/src/domain/types.ts +185 -0
- package/modules/connectors/src/index.ts +64 -0
- package/modules/connectors/src/platform.ts +56 -0
- package/modules/connectors/src/server/index.ts +66 -0
- package/modules/connectors/src/server/runtime.ts +163 -0
- package/modules/connectors/src/services/call-service.ts +903 -0
- package/modules/connectors/src/services/connectors-service.ts +653 -0
- package/modules/connectors/src/services/credential-vault.ts +188 -0
- package/modules/connectors/src/services/data-classes.ts +158 -0
- package/modules/connectors/src/services/database-repository.ts +897 -0
- package/modules/connectors/src/services/egress.ts +261 -0
- package/modules/connectors/src/services/index.ts +19 -0
- package/modules/connectors/src/services/migration.ts +166 -0
- package/modules/connectors/src/services/repository.ts +175 -0
- package/modules/connectors/src/services/service-error.ts +46 -0
- package/modules/connectors/src/settings.ts +69 -0
- package/modules/connectors/translations/en.json +191 -0
- package/modules/connectors/translations/pl.json +191 -0
- package/modules/directory/migrations/0001_directory_core.down.sql +5 -0
- package/modules/directory/migrations/0001_directory_core.up.sql +111 -0
- package/modules/directory/migrations/README.md +3 -0
- package/modules/directory/module.json +27 -0
- package/modules/directory/package.json +46 -0
- package/modules/directory/spec/module.yaml +351 -0
- package/modules/directory/src/acl/permissions.ts +7 -0
- package/modules/directory/src/api/endpoints.ts +478 -0
- package/modules/directory/src/api/scim-endpoints.ts +516 -0
- package/modules/directory/src/client/GroupMappingsView.tsrx +430 -0
- package/modules/directory/src/client/ProvisioningLogView.tsrx +248 -0
- package/modules/directory/src/client/ScimTokensView.tsrx +587 -0
- package/modules/directory/src/client/api.ts +222 -0
- package/modules/directory/src/client/contribution.tsrx +46 -0
- package/modules/directory/src/client/index.ts +22 -0
- package/modules/directory/src/client/navigation.ts +57 -0
- package/modules/directory/src/client/presentation.ts +143 -0
- package/modules/directory/src/client/state.ts +173 -0
- package/modules/directory/src/domain/scim.ts +346 -0
- package/modules/directory/src/domain/types.ts +166 -0
- package/modules/directory/src/index.ts +44 -0
- package/modules/directory/src/platform.ts +43 -0
- package/modules/directory/src/server/index.ts +17 -0
- package/modules/directory/src/server/runtime.ts +124 -0
- package/modules/directory/src/services/auth-port.ts +127 -0
- package/modules/directory/src/services/data-classes.ts +41 -0
- package/modules/directory/src/services/database-repository.ts +1067 -0
- package/modules/directory/src/services/directory-service.ts +311 -0
- package/modules/directory/src/services/index.ts +43 -0
- package/modules/directory/src/services/migration.ts +146 -0
- package/modules/directory/src/services/provisioning-service.ts +1420 -0
- package/modules/directory/src/services/rate-limiter.ts +103 -0
- package/modules/directory/src/services/repository.ts +208 -0
- package/modules/directory/src/services/service-error.ts +42 -0
- package/modules/directory/src/services/token-service.ts +215 -0
- package/modules/directory/src/settings.ts +86 -0
- package/modules/directory/translations/en.json +185 -0
- package/modules/directory/translations/pl.json +185 -0
- package/modules/documents/migrations/0001_documents_core.down.sql +1 -0
- package/modules/documents/migrations/0001_documents_core.up.sql +35 -0
- package/modules/documents/migrations/0002_documents_files_page.down.sql +1 -0
- package/modules/documents/migrations/0002_documents_files_page.up.sql +6 -0
- package/modules/documents/migrations/README.md +3 -0
- package/modules/documents/module.json +28 -0
- package/modules/documents/package.json +49 -0
- package/modules/documents/spec/module.yaml +247 -0
- package/modules/documents/src/acl/permissions.ts +6 -0
- package/modules/documents/src/api/endpoints.ts +401 -0
- package/modules/documents/src/client/DocumentUploader.tsrx +148 -0
- package/modules/documents/src/client/DocumentsView.tsrx +540 -0
- package/modules/documents/src/client/api.ts +209 -0
- package/modules/documents/src/client/contribution.tsrx +29 -0
- package/modules/documents/src/client/download.ts +70 -0
- package/modules/documents/src/client/index.ts +22 -0
- package/modules/documents/src/client/navigation.ts +25 -0
- package/modules/documents/src/client/presentation.ts +110 -0
- package/modules/documents/src/client/state.ts +117 -0
- package/modules/documents/src/domain/attachments.ts +84 -0
- package/modules/documents/src/domain/types.ts +80 -0
- package/modules/documents/src/index.ts +46 -0
- package/modules/documents/src/platform.ts +61 -0
- package/modules/documents/src/server/index.ts +30 -0
- package/modules/documents/src/server/runtime.ts +107 -0
- package/modules/documents/src/services/attachments.ts +39 -0
- package/modules/documents/src/services/data-classes.ts +25 -0
- package/modules/documents/src/services/database-repository.ts +259 -0
- package/modules/documents/src/services/documents-service.ts +586 -0
- package/modules/documents/src/services/index.ts +18 -0
- package/modules/documents/src/services/migration.ts +82 -0
- package/modules/documents/src/services/repository.ts +48 -0
- package/modules/documents/src/settings.ts +107 -0
- package/modules/documents/translations/en.json +111 -0
- package/modules/documents/translations/pl.json +111 -0
- package/modules/exports/migrations/0001_exports_core.down.sql +2 -0
- package/modules/exports/migrations/0001_exports_core.up.sql +28 -0
- package/modules/exports/migrations/0002_exports_job_routing_role.down.sql +4 -0
- package/modules/exports/migrations/0002_exports_job_routing_role.up.sql +21 -0
- package/modules/exports/migrations/README.md +3 -0
- package/modules/exports/module.json +28 -0
- package/modules/exports/package.json +44 -0
- package/modules/exports/spec/module.yaml +229 -0
- package/modules/exports/src/acl/permissions.ts +6 -0
- package/modules/exports/src/api/endpoints.ts +211 -0
- package/modules/exports/src/client/ExportsView.tsrx +327 -0
- package/modules/exports/src/client/api.ts +133 -0
- package/modules/exports/src/client/contribution.tsrx +31 -0
- package/modules/exports/src/client/index.ts +20 -0
- package/modules/exports/src/client/navigation.ts +25 -0
- package/modules/exports/src/client/presentation.ts +53 -0
- package/modules/exports/src/client/state.ts +56 -0
- package/modules/exports/src/domain/lists.ts +29 -0
- package/modules/exports/src/domain/types.ts +120 -0
- package/modules/exports/src/index.ts +41 -0
- package/modules/exports/src/platform.ts +80 -0
- package/modules/exports/src/server/index.ts +51 -0
- package/modules/exports/src/server/runtime.ts +160 -0
- package/modules/exports/src/services/data-classes.ts +56 -0
- package/modules/exports/src/services/database-repository.ts +405 -0
- package/modules/exports/src/services/export-runner.ts +123 -0
- package/modules/exports/src/services/export-service.ts +356 -0
- package/modules/exports/src/services/index.ts +6 -0
- package/modules/exports/src/services/list-registry.ts +105 -0
- package/modules/exports/src/services/migration.ts +89 -0
- package/modules/exports/src/services/repository.ts +97 -0
- package/modules/exports/src/settings.ts +70 -0
- package/modules/exports/translations/en.json +69 -0
- package/modules/exports/translations/pl.json +69 -0
- package/modules/import/migrations/0001_import_core.down.sql +6 -0
- package/modules/import/migrations/0001_import_core.up.sql +61 -0
- package/modules/import/migrations/0002_import_job_routing_role.down.sql +4 -0
- package/modules/import/migrations/0002_import_job_routing_role.up.sql +20 -0
- package/modules/import/migrations/0003_import_jobs_export_index.down.sql +1 -0
- package/modules/import/migrations/0003_import_jobs_export_index.up.sql +7 -0
- package/modules/import/migrations/0004_import_jobs_traceparent.down.sql +1 -0
- package/modules/import/migrations/0004_import_jobs_traceparent.up.sql +7 -0
- package/modules/import/migrations/README.md +3 -0
- package/modules/import/module.json +37 -0
- package/modules/import/package.json +50 -0
- package/modules/import/spec/module.yaml +335 -0
- package/modules/import/src/acl/permissions.ts +6 -0
- package/modules/import/src/api/endpoints.ts +400 -0
- package/modules/import/src/client/ImportJobDrawer.tsrx +229 -0
- package/modules/import/src/client/ImportsView.tsrx +455 -0
- package/modules/import/src/client/NewImportForm.tsrx +274 -0
- package/modules/import/src/client/api.ts +243 -0
- package/modules/import/src/client/contribution.tsrx +29 -0
- package/modules/import/src/client/index.ts +23 -0
- package/modules/import/src/client/navigation.ts +25 -0
- package/modules/import/src/client/presentation.ts +59 -0
- package/modules/import/src/client/state.ts +43 -0
- package/modules/import/src/domain/csv.ts +258 -0
- package/modules/import/src/domain/ports.ts +157 -0
- package/modules/import/src/domain/types.ts +179 -0
- package/modules/import/src/index.ts +58 -0
- package/modules/import/src/platform.ts +60 -0
- package/modules/import/src/server/index.ts +49 -0
- package/modules/import/src/server/runtime.ts +158 -0
- package/modules/import/src/services/csv-source.ts +121 -0
- package/modules/import/src/services/data-classes.ts +63 -0
- package/modules/import/src/services/database-repository.ts +780 -0
- package/modules/import/src/services/import-runner.ts +127 -0
- package/modules/import/src/services/import-service.ts +872 -0
- package/modules/import/src/services/index.ts +6 -0
- package/modules/import/src/services/migration.ts +156 -0
- package/modules/import/src/services/port-registry.ts +158 -0
- package/modules/import/src/services/repository.ts +147 -0
- package/modules/import/src/settings.ts +70 -0
- package/modules/import/translations/en.json +175 -0
- package/modules/import/translations/pl.json +175 -0
- package/modules/metering/migrations/0001_metering_core.down.sql +6 -0
- package/modules/metering/migrations/0001_metering_core.up.sql +119 -0
- package/modules/metering/migrations/0002_metering_bucket_export.down.sql +3 -0
- package/modules/metering/migrations/0002_metering_bucket_export.up.sql +5 -0
- package/modules/metering/migrations/README.md +3 -0
- package/modules/metering/module.json +46 -0
- package/modules/metering/package.json +50 -0
- package/modules/metering/spec/module.yaml +269 -0
- package/modules/metering/src/acl/permissions.ts +5 -0
- package/modules/metering/src/api/endpoints.ts +104 -0
- package/modules/metering/src/cli/commands.json +28 -0
- package/modules/metering/src/cli/index.ts +246 -0
- package/modules/metering/src/client/LimitsView.tsrx +170 -0
- package/modules/metering/src/client/UsageSummaryWidget.tsrx +63 -0
- package/modules/metering/src/client/UsageView.tsrx +205 -0
- package/modules/metering/src/client/api.ts +91 -0
- package/modules/metering/src/client/contribution.tsrx +42 -0
- package/modules/metering/src/client/index.ts +26 -0
- package/modules/metering/src/client/navigation.ts +54 -0
- package/modules/metering/src/client/presentation.ts +63 -0
- package/modules/metering/src/client/state.ts +31 -0
- package/modules/metering/src/domain/meters.ts +100 -0
- package/modules/metering/src/domain/types.ts +71 -0
- package/modules/metering/src/index.ts +51 -0
- package/modules/metering/src/platform.ts +84 -0
- package/modules/metering/src/server/index.ts +40 -0
- package/modules/metering/src/server/runtime.ts +165 -0
- package/modules/metering/src/services/data-classes.ts +34 -0
- package/modules/metering/src/services/database-repository.ts +574 -0
- package/modules/metering/src/services/index.ts +9 -0
- package/modules/metering/src/services/meter-registry.ts +145 -0
- package/modules/metering/src/services/metering-service.ts +441 -0
- package/modules/metering/src/services/migration.ts +183 -0
- package/modules/metering/src/services/notifications.ts +75 -0
- package/modules/metering/src/services/reports.ts +105 -0
- package/modules/metering/src/services/repository.ts +132 -0
- package/modules/metering/src/services/service-error.ts +46 -0
- package/modules/metering/src/settings.ts +47 -0
- package/modules/metering/translations/en.json +68 -0
- package/modules/metering/translations/pl.json +68 -0
- package/modules/notifications/migrations/0001_notifications_core.down.sql +1 -0
- package/modules/notifications/migrations/0001_notifications_core.up.sql +26 -0
- package/modules/notifications/migrations/0002_notifications_preferences.down.sql +1 -0
- package/modules/notifications/migrations/0002_notifications_preferences.up.sql +17 -0
- package/modules/notifications/migrations/0003_notifications_webhook_subscriptions.down.sql +1 -0
- package/modules/notifications/migrations/0003_notifications_webhook_subscriptions.up.sql +30 -0
- package/modules/notifications/migrations/0004_notifications_deliveries.down.sql +1 -0
- package/modules/notifications/migrations/0004_notifications_deliveries.up.sql +35 -0
- package/modules/notifications/migrations/0005_notifications_delivery_routing_role.down.sql +2 -0
- package/modules/notifications/migrations/0005_notifications_delivery_routing_role.up.sql +17 -0
- package/modules/notifications/migrations/0006_notifications_delivery_title.down.sql +1 -0
- package/modules/notifications/migrations/0006_notifications_delivery_title.up.sql +11 -0
- package/modules/notifications/migrations/0007_notifications_secret_rotation_inventory.down.sql +2 -0
- package/modules/notifications/migrations/0007_notifications_secret_rotation_inventory.up.sql +19 -0
- package/modules/notifications/migrations/0008_notifications_delivery_claim.down.sql +8 -0
- package/modules/notifications/migrations/0008_notifications_delivery_claim.up.sql +19 -0
- package/modules/notifications/migrations/0009_notifications_kind_approvals.down.sql +16 -0
- package/modules/notifications/migrations/0009_notifications_kind_approvals.up.sql +18 -0
- package/modules/notifications/migrations/0010_notifications_kind_meter_threshold.down.sql +16 -0
- package/modules/notifications/migrations/0010_notifications_kind_meter_threshold.up.sql +18 -0
- package/modules/notifications/migrations/0011_notifications_retention_keyset.down.sql +5 -0
- package/modules/notifications/migrations/0011_notifications_retention_keyset.up.sql +15 -0
- package/modules/notifications/migrations/0012_notifications_email_channel.down.sql +12 -0
- package/modules/notifications/migrations/0012_notifications_email_channel.up.sql +38 -0
- package/modules/notifications/migrations/0013_notifications_list_pages.down.sql +5 -0
- package/modules/notifications/migrations/0013_notifications_list_pages.up.sql +13 -0
- package/modules/notifications/migrations/README.md +3 -0
- package/modules/notifications/module.json +32 -0
- package/modules/notifications/package.json +49 -0
- package/modules/notifications/spec/module.yaml +718 -0
- package/modules/notifications/src/acl/permissions.ts +11 -0
- package/modules/notifications/src/api/endpoints.ts +814 -0
- package/modules/notifications/src/cli/commands.json +17 -0
- package/modules/notifications/src/cli/index.ts +126 -0
- package/modules/notifications/src/client/DeliveriesView.tsrx +483 -0
- package/modules/notifications/src/client/FactList.tsrx +24 -0
- package/modules/notifications/src/client/NotificationPreferencesView.tsrx +240 -0
- package/modules/notifications/src/client/NotificationsInboxView.tsrx +592 -0
- package/modules/notifications/src/client/UnreadCountWidget.tsrx +62 -0
- package/modules/notifications/src/client/WebhookForm.tsrx +297 -0
- package/modules/notifications/src/client/WebhooksView.tsrx +637 -0
- package/modules/notifications/src/client/api.ts +382 -0
- package/modules/notifications/src/client/contribution.tsrx +83 -0
- package/modules/notifications/src/client/inbox.ts +41 -0
- package/modules/notifications/src/client/index.ts +29 -0
- package/modules/notifications/src/client/navigation.ts +92 -0
- package/modules/notifications/src/client/notifications.css +70 -0
- package/modules/notifications/src/client/presentation.ts +81 -0
- package/modules/notifications/src/client/state.ts +246 -0
- package/modules/notifications/src/client/unread-count.ts +26 -0
- package/modules/notifications/src/domain/locale.ts +47 -0
- package/modules/notifications/src/domain/publish.ts +46 -0
- package/modules/notifications/src/domain/types.ts +186 -0
- package/modules/notifications/src/index.ts +62 -0
- package/modules/notifications/src/platform.ts +85 -0
- package/modules/notifications/src/server/index.ts +82 -0
- package/modules/notifications/src/server/runtime.ts +251 -0
- package/modules/notifications/src/services/data-classes.ts +139 -0
- package/modules/notifications/src/services/database-repository.ts +1334 -0
- package/modules/notifications/src/services/delivery-payload.ts +93 -0
- package/modules/notifications/src/services/delivery-runner.ts +170 -0
- package/modules/notifications/src/services/delivery-service.ts +811 -0
- package/modules/notifications/src/services/egress.ts +239 -0
- package/modules/notifications/src/services/email-channel.ts +93 -0
- package/modules/notifications/src/services/index.ts +23 -0
- package/modules/notifications/src/services/migration.ts +572 -0
- package/modules/notifications/src/services/notifications-service.ts +297 -0
- package/modules/notifications/src/services/paging.ts +60 -0
- package/modules/notifications/src/services/publish-service.ts +133 -0
- package/modules/notifications/src/services/repository.ts +342 -0
- package/modules/notifications/src/services/secret-rotation.ts +177 -0
- package/modules/notifications/src/services/secret-vault.ts +168 -0
- package/modules/notifications/src/services/service-error.ts +67 -0
- package/modules/notifications/src/services/signature.ts +81 -0
- package/modules/notifications/src/services/webhook-service.ts +307 -0
- package/modules/notifications/src/settings.ts +130 -0
- package/modules/notifications/translations/en.json +255 -0
- package/modules/notifications/translations/pl.json +255 -0
- package/modules/profile/module.json +3 -3
- package/modules/profile/package.json +1 -1
- package/modules/profile/spec/module.yaml +3 -3
- package/modules/profile/src/services/database-repository.ts +3 -13
- package/modules/reports/module.json +28 -0
- package/modules/reports/package.json +42 -0
- package/modules/reports/spec/module.yaml +231 -0
- package/modules/reports/src/acl/permissions.ts +5 -0
- package/modules/reports/src/api/endpoints.ts +72 -0
- package/modules/reports/src/client/ReportsSummaryWidget.tsrx +52 -0
- package/modules/reports/src/client/ReportsView.tsrx +246 -0
- package/modules/reports/src/client/api.ts +65 -0
- package/modules/reports/src/client/contribution.tsrx +36 -0
- package/modules/reports/src/client/index.ts +18 -0
- package/modules/reports/src/client/navigation.ts +39 -0
- package/modules/reports/src/client/presentation.ts +123 -0
- package/modules/reports/src/client/state.ts +28 -0
- package/modules/reports/src/domain/providers.ts +115 -0
- package/modules/reports/src/domain/types.ts +44 -0
- package/modules/reports/src/index.ts +47 -0
- package/modules/reports/src/platform.ts +37 -0
- package/modules/reports/src/server/index.ts +21 -0
- package/modules/reports/src/server/runtime.ts +40 -0
- package/modules/reports/src/services/index.ts +17 -0
- package/modules/reports/src/services/provider-registry.ts +144 -0
- package/modules/reports/src/services/range.ts +65 -0
- package/modules/reports/src/services/reports-service.ts +316 -0
- package/modules/reports/src/services/service-error.ts +26 -0
- package/modules/reports/src/settings.ts +49 -0
- package/modules/reports/translations/en.json +35 -0
- package/modules/reports/translations/pl.json +35 -0
- package/modules/sandbox/module.json +4 -4
- package/modules/sandbox/package.json +1 -1
- package/modules/sandbox/spec/module.yaml +3 -3
- package/modules/sandbox/src/services/database-repository.ts +14 -23
- package/modules/sandbox/src/services/directory.ts +16 -0
- package/modules/sandbox/src/services/sandbox-service.ts +13 -11
- package/modules/search/migrations/0001_search_core.down.sql +1 -0
- package/modules/search/migrations/0001_search_core.up.sql +22 -0
- package/modules/search/migrations/0002_search_recent_export.down.sql +3 -0
- package/modules/search/migrations/0002_search_recent_export.up.sql +5 -0
- package/modules/search/migrations/README.md +3 -0
- package/modules/search/module.json +28 -0
- package/modules/search/package.json +43 -0
- package/modules/search/spec/module.yaml +177 -0
- package/modules/search/src/acl/permissions.ts +5 -0
- package/modules/search/src/api/endpoints.ts +221 -0
- package/modules/search/src/client/SearchView.tsrx +346 -0
- package/modules/search/src/client/api.ts +157 -0
- package/modules/search/src/client/contribution.tsrx +31 -0
- package/modules/search/src/client/index.ts +17 -0
- package/modules/search/src/client/navigation.ts +97 -0
- package/modules/search/src/client/search.css +56 -0
- package/modules/search/src/client/state.ts +113 -0
- package/modules/search/src/domain/data-classes.ts +73 -0
- package/modules/search/src/domain/providers.ts +88 -0
- package/modules/search/src/domain/types.ts +56 -0
- package/modules/search/src/index.ts +46 -0
- package/modules/search/src/platform.ts +42 -0
- package/modules/search/src/server/index.ts +25 -0
- package/modules/search/src/server/runtime.ts +123 -0
- package/modules/search/src/services/database-repository.ts +163 -0
- package/modules/search/src/services/index.ts +21 -0
- package/modules/search/src/services/migration.ts +65 -0
- package/modules/search/src/services/provider-registry.ts +137 -0
- package/modules/search/src/services/repository.ts +43 -0
- package/modules/search/src/services/search-service.ts +442 -0
- package/modules/search/src/services/service-error.ts +35 -0
- package/modules/search/src/settings.ts +68 -0
- package/modules/search/translations/en.json +45 -0
- package/modules/search/translations/pl.json +45 -0
- package/modules/system/module.json +2 -2
- package/modules/system/package.json +1 -1
- package/modules/system/spec/module.yaml +30 -3
- package/modules/system/src/client/FlagsPanel.tsrx +127 -0
- package/modules/system/src/client/ModuleSettingRow.tsrx +17 -7
- package/modules/system/src/client/ModuleSettingsSection.tsrx +10 -71
- package/modules/system/src/client/ModulesView.tsrx +91 -65
- package/modules/system/src/client/flags.ts +35 -0
- package/modules/system/src/client/index.ts +8 -0
- package/modules/system/src/client/navigation.ts +8 -0
- package/modules/system/src/client/settings-state.ts +159 -0
- package/modules/system/src/client/state.ts +2 -0
- package/modules/system/src/domain/time-zone.ts +105 -0
- package/modules/system/src/index.ts +12 -0
- package/modules/system/src/platform.ts +5 -1
- package/modules/system/src/server/endpoints.ts +72 -21
- package/modules/system/src/settings.ts +28 -0
- package/modules/system/translations/en.json +17 -0
- package/modules/system/translations/pl.json +17 -0
- package/modules/users/module.json +30 -4
- package/modules/users/package.json +4 -1
- package/modules/users/spec/module.yaml +290 -7
- package/modules/users/src/api/endpoints.ts +228 -15
- package/modules/users/src/client/InviteMemberForm.tsrx +2 -2
- package/modules/users/src/client/MemberDrawer.tsrx +142 -26
- package/modules/users/src/client/UserAccountForm.tsrx +2 -2
- package/modules/users/src/client/UsersView.tsrx +432 -71
- package/modules/users/src/client/api.ts +106 -12
- package/modules/users/src/client/contribution.tsrx +5 -0
- package/modules/users/src/client/member-columns.tsrx +22 -9
- package/modules/users/src/client/state.ts +172 -7
- package/modules/users/src/domain/lists.ts +9 -0
- package/modules/users/src/index.ts +11 -0
- package/modules/users/src/platform.ts +50 -1
- package/modules/users/src/services/member-export.ts +51 -0
- package/modules/users/src/services/member-import.ts +249 -0
- package/modules/users/src/services/member-search.ts +145 -0
- package/modules/users/src/services/users-service.ts +117 -4
- package/modules/users/translations/en.json +57 -8
- package/modules/users/translations/pl.json +57 -8
- package/modules/workflows/migrations/0004_payload_rotation_inventory.up.sql +17 -0
- package/modules/workflows/migrations/0005_workflows_human_approval.up.sql +28 -0
- package/modules/workflows/migrations/0006_workflows_retention_indexes.up.sql +11 -0
- package/modules/workflows/migrations/0007_workflows_erasure_subject_indexes.up.sql +17 -0
- package/modules/workflows/migrations/0008_workflows_subject_account.up.sql +24 -0
- package/modules/workflows/migrations/0009_workflows_definition_list_indexes.up.sql +9 -0
- package/modules/workflows/module.json +34 -6
- package/modules/workflows/package.json +2 -1
- package/modules/workflows/spec/module.yaml +26 -9
- package/modules/workflows/src/api/endpoints.ts +131 -25
- package/modules/workflows/src/cli/commands.json +17 -0
- package/modules/workflows/src/cli/index.ts +114 -0
- package/modules/workflows/src/client/WorkflowExecutionHistory.tsrx +36 -27
- package/modules/workflows/src/client/WorkflowInspector.tsrx +116 -0
- package/modules/workflows/src/client/WorkflowNodePalette.tsrx +1 -0
- package/modules/workflows/src/client/WorkflowsView.tsrx +236 -99
- package/modules/workflows/src/client/api.ts +54 -34
- package/modules/workflows/src/client/canvas-model.ts +12 -0
- package/modules/workflows/src/client/state.ts +95 -0
- package/modules/workflows/src/domain/events.ts +25 -11
- package/modules/workflows/src/domain/graph.ts +135 -1
- package/modules/workflows/src/domain/types.ts +91 -4
- package/modules/workflows/src/platform.ts +12 -0
- package/modules/workflows/src/server/runtime.ts +78 -5
- package/modules/workflows/src/services/approvals.ts +62 -0
- package/modules/workflows/src/services/cursors.ts +37 -0
- package/modules/workflows/src/services/data-classes.ts +232 -0
- package/modules/workflows/src/services/database-repository.ts +660 -171
- package/modules/workflows/src/services/migration.ts +240 -0
- package/modules/workflows/src/services/notifications.ts +98 -0
- package/modules/workflows/src/services/payload-codec.ts +51 -28
- package/modules/workflows/src/services/payload-rotation.ts +171 -0
- package/modules/workflows/src/services/repository.ts +123 -8
- package/modules/workflows/src/services/simulation.ts +7 -0
- package/modules/workflows/src/services/worker.ts +446 -25
- package/modules/workflows/src/services/workflows-service.ts +264 -103
- package/modules/workflows/translations/en.json +12 -4
- package/modules/workflows/translations/pl.json +12 -4
- package/modules.json +48 -4
- package/package.json +64 -6
- package/packages/client/package.json +1 -0
- package/packages/client/src/ApplicationShell.tsrx +43 -0
- package/packages/client/src/contributions.ts +55 -0
- package/packages/client/src/i18n/locales/en.json +5 -0
- package/packages/client/src/i18n/locales/pl.json +5 -0
- package/packages/client/src/index.ts +13 -1
- package/packages/client/src/routing.ts +22 -0
- package/packages/client/src/shell/CommandPalette.tsrx +223 -11
- package/packages/client/src/shell/command-search.ts +126 -0
- package/packages/client/src/shell/command.ts +30 -0
- package/packages/client/src/shell/navigation.ts +12 -0
- package/packages/client/src/shell/palette-keys.ts +27 -0
- package/packages/client/src/shell/shell.css +7 -0
- package/packages/contracts/schemas/module-spec.schema.json +287 -1
- package/packages/contracts/schemas/module.schema.json +25 -0
- package/packages/contracts/src/index.ts +144 -1
- package/packages/database/src/backup.ts +179 -0
- package/packages/database/src/decoders.ts +25 -0
- package/packages/database/src/index.ts +17 -0
- package/packages/database/src/record-history.ts +5 -14
- package/packages/harness/src/index.ts +2 -0
- package/packages/harness/src/runtime.ts +218 -1
- package/packages/harness/src/tool-adapters.ts +19 -1
- package/packages/kernel/src/acl.ts +179 -0
- package/packages/kernel/src/capability-registry.ts +69 -2
- package/packages/kernel/src/data-class-registry.ts +354 -0
- package/packages/kernel/src/index.ts +65 -4
- package/packages/kernel/src/keyring.ts +208 -0
- package/packages/kernel/src/module-compatibility.ts +35 -4
- package/packages/kernel/src/module-registry.ts +49 -2
- package/packages/kernel/src/module-settings.ts +189 -27
- package/packages/server/package.json +2 -1
- package/packages/server/src/composition.ts +38 -0
- package/packages/server/src/endpoint.ts +104 -47
- package/packages/server/src/export/csv.ts +34 -0
- package/packages/server/src/export/definition.ts +346 -0
- package/packages/server/src/export/index.ts +61 -0
- package/packages/server/src/export/run.ts +116 -0
- package/packages/server/src/index.ts +155 -0
- package/packages/server/src/jobs/index.ts +93 -0
- package/packages/server/src/jobs/runner.ts +486 -0
- package/packages/server/src/log.ts +291 -0
- package/packages/server/src/mail/config.ts +184 -0
- package/packages/server/src/mail/contracts.ts +251 -0
- package/packages/server/src/mail/index.ts +31 -0
- package/packages/server/src/mail/port.ts +101 -0
- package/packages/server/src/mail/smtp.ts +191 -0
- package/packages/server/src/mail/template.ts +105 -0
- package/packages/server/src/metrics.ts +447 -0
- package/packages/server/src/pagination.ts +246 -0
- package/packages/server/src/trace/context.ts +103 -0
- package/packages/server/src/trace/egress.ts +66 -0
- package/packages/server/src/trace/error-sink.ts +296 -0
- package/packages/server/src/trace/exporter.ts +295 -0
- package/packages/server/src/trace/index.ts +60 -0
- package/packages/server/src/trace/job-sink.ts +172 -0
- package/packages/server/src/trace/tracer.ts +338 -0
- package/packages/server/src/web.ts +5 -1
- package/packages/storage/package.json +40 -0
- package/packages/storage/src/config.ts +189 -0
- package/packages/storage/src/content-type.ts +124 -0
- package/packages/storage/src/contracts.ts +112 -0
- package/packages/storage/src/envelope.ts +189 -0
- package/packages/storage/src/index.ts +43 -0
- package/packages/storage/src/local.ts +75 -0
- package/packages/storage/src/port.ts +251 -0
- package/packages/storage/src/read-token.ts +130 -0
- package/packages/storage/src/s3.ts +144 -0
- package/packages/storage/src/scanner.ts +22 -0
- package/packages/storage/src/sigv4.ts +104 -0
- package/packages/storage/src/store.ts +13 -0
- package/packages/ui/package.json +1 -0
- package/packages/ui/src/components/Button.tsrx +3 -0
- package/packages/ui/src/components/ConfirmDialog.tsrx +13 -2
- package/packages/ui/src/components/DateField.tsrx +92 -0
- package/packages/ui/src/components/DatePicker.tsrx +525 -0
- package/packages/ui/src/components/DateRangeField.tsrx +93 -0
- package/packages/ui/src/components/Drawer.tsrx +10 -1
- package/packages/ui/src/components/FileUpload.tsrx +158 -0
- package/packages/ui/src/components/Pagination.tsrx +130 -0
- package/packages/ui/src/components/Select.tsrx +78 -0
- package/packages/ui/src/components/Table.tsrx +498 -81
- package/packages/ui/src/components/Tabs.tsrx +53 -0
- package/packages/ui/src/components/ToastHost.tsrx +48 -0
- package/packages/ui/src/components/calendar.ts +243 -0
- package/packages/ui/src/components/date-field.ts +62 -0
- package/packages/ui/src/components/file-upload.ts +49 -0
- package/packages/ui/src/components/focus-trap.ts +62 -0
- package/packages/ui/src/components/pagination.ts +68 -0
- package/packages/ui/src/components/table-sorting.ts +49 -0
- package/packages/ui/src/components/tabs.ts +61 -0
- package/packages/ui/src/components/toast-store.ts +116 -0
- package/packages/ui/src/icons/Icon.tsrx +5 -0
- package/packages/ui/src/index.ts +45 -0
- package/packages/ui/src/styles/components.css +598 -0
- package/modules/automations-workflows-integration/module.json +0 -27
- package/modules/automations-workflows-integration/spec/module.yaml +0 -93
- package/modules/automations-workflows-integration/src/index.ts +0 -14
- package/modules/automations-workflows-integration/src/platform.ts +0 -24
- package/modules/automations-workflows-integration/src/server/index.ts +0 -11
- package/modules/automations-workflows-integration/translations/en.json +0 -21
- package/modules/automations-workflows-integration/translations/pl.json +0 -21
- package/modules/workflows/src/services/cursor-codec.ts +0 -62
|
@@ -2,18 +2,17 @@ import {
|
|
|
2
2
|
serviceActor,
|
|
3
3
|
type PlatformCapabilityRegistry,
|
|
4
4
|
} from '@flowdular/sdk/kernel';
|
|
5
|
-
import {
|
|
6
|
-
AUTOMATION_TARGETS_CAPABILITY,
|
|
7
|
-
type AutomationTargetAdapter,
|
|
8
|
-
type AutomationTargetAuthorizationContext,
|
|
9
|
-
type AutomationTargetInvocationContext,
|
|
10
|
-
type AutomationTargetRegistry,
|
|
11
|
-
} from '@flowdular/sdk/modules/automations/server';
|
|
12
5
|
import { WORKFLOWS_PERMISSIONS } from '@flowdular/sdk/modules/workflows';
|
|
13
6
|
import {
|
|
14
7
|
WORKFLOW_EXECUTION_CAPABILITY,
|
|
15
8
|
type WorkflowExecutionCapability,
|
|
16
9
|
} from '@flowdular/sdk/modules/workflows/server';
|
|
10
|
+
import type {
|
|
11
|
+
AutomationTargetAdapter,
|
|
12
|
+
AutomationTargetAuthorizationContext,
|
|
13
|
+
AutomationTargetInvocationContext,
|
|
14
|
+
AutomationTargetRegistry,
|
|
15
|
+
} from './targets.ts';
|
|
17
16
|
|
|
18
17
|
type WorkflowInput = Parameters<
|
|
19
18
|
WorkflowExecutionCapability['enqueue']
|
|
@@ -114,6 +113,8 @@ async function requireExecutable(
|
|
|
114
113
|
return reference;
|
|
115
114
|
}
|
|
116
115
|
|
|
116
|
+
/* The key prefixes are persisted in the workflows idempotency ledger, so they
|
|
117
|
+
keep the name of the former integration module. */
|
|
117
118
|
function idempotencyKey(context: AutomationTargetInvocationContext): string {
|
|
118
119
|
const source = context.source;
|
|
119
120
|
if (source.kind === 'schedule') {
|
|
@@ -254,13 +255,12 @@ export function createWorkflowAutomationTargetAdapter(
|
|
|
254
255
|
};
|
|
255
256
|
}
|
|
256
257
|
|
|
257
|
-
|
|
258
|
+
/* The workflow capability is resolved per call: workflows.core may compose
|
|
259
|
+
after automations.core, and a workspace may leave it uninstalled. */
|
|
260
|
+
export function registerWorkflowAutomationTarget(
|
|
261
|
+
targets: AutomationTargetRegistry,
|
|
258
262
|
capabilities: PlatformCapabilityRegistry,
|
|
259
|
-
):
|
|
260
|
-
const targets = capabilities.get<AutomationTargetRegistry>(
|
|
261
|
-
AUTOMATION_TARGETS_CAPABILITY,
|
|
262
|
-
);
|
|
263
|
-
if (!targets) return false;
|
|
263
|
+
): void {
|
|
264
264
|
targets.register(
|
|
265
265
|
createWorkflowAutomationTargetAdapter(() =>
|
|
266
266
|
capabilities.get<WorkflowExecutionCapability>(
|
|
@@ -268,5 +268,4 @@ export function registerAutomationsWorkflowsIntegration(
|
|
|
268
268
|
),
|
|
269
269
|
),
|
|
270
270
|
);
|
|
271
|
-
return true;
|
|
272
271
|
}
|
|
Binary file
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
DataClassDeclaration,
|
|
3
|
+
DataClassExportSummary,
|
|
4
|
+
} from '@flowdular/sdk/kernel';
|
|
5
|
+
import type { AutomationsRepository } from './repository.ts';
|
|
6
|
+
|
|
7
|
+
/** Rows one keyset page carries. Bounded so a walk never loads a whole table. */
|
|
8
|
+
export const AUDIT_EXPORT_PAGE = 500;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* The classes automations.core owns. Schedules and triggers are configuration a
|
|
12
|
+
* person manages rather than history that ages, so the trail is the only class
|
|
13
|
+
* here: it is what the workspace accumulates.
|
|
14
|
+
*
|
|
15
|
+
* It carries no sweep. The trail is hash chained per workspace, every event
|
|
16
|
+
* naming the hash of the one before it, and verifyAuditChain walks it from
|
|
17
|
+
* sequence 1 with no previous hash. Deleting the oldest events by age would
|
|
18
|
+
* leave the first surviving event pointing at a row that is gone, so the next
|
|
19
|
+
* verification would report the chain broken and could not tell retention from
|
|
20
|
+
* tampering. audit.core keeps its own chained ledgers for the same reason. The
|
|
21
|
+
* precise fix is chain archival, sealing a removed prefix under one anchor
|
|
22
|
+
* event; until that exists these rows are kept until a person deletes them.
|
|
23
|
+
*
|
|
24
|
+
* The repository arrives as a thunk because declaring happens while the
|
|
25
|
+
* platform composes, before anything has opened a database.
|
|
26
|
+
*/
|
|
27
|
+
export function automationsDataClasses(
|
|
28
|
+
repository: () => Promise<AutomationsRepository>,
|
|
29
|
+
pageSize = AUDIT_EXPORT_PAGE,
|
|
30
|
+
): readonly DataClassDeclaration[] {
|
|
31
|
+
return [
|
|
32
|
+
{
|
|
33
|
+
key: 'audit-events',
|
|
34
|
+
label: 'Automation audit trail',
|
|
35
|
+
defaultRetentionDays: null,
|
|
36
|
+
exportable: true,
|
|
37
|
+
export: async ({ tenantId, sink }): Promise<DataClassExportSummary> => {
|
|
38
|
+
let afterId = '';
|
|
39
|
+
let rows = 0;
|
|
40
|
+
let from: Date | null = null;
|
|
41
|
+
let to: Date | null = null;
|
|
42
|
+
for (;;) {
|
|
43
|
+
const page = await (
|
|
44
|
+
await repository()
|
|
45
|
+
).exportAuditEventsPage(tenantId, afterId, pageSize);
|
|
46
|
+
for (const event of page) {
|
|
47
|
+
const at = new Date(event.occurredAt);
|
|
48
|
+
if (!from || at < from) from = at;
|
|
49
|
+
if (!to || at > to) to = at;
|
|
50
|
+
afterId = event.id;
|
|
51
|
+
rows += 1;
|
|
52
|
+
await sink.write({
|
|
53
|
+
...event,
|
|
54
|
+
occurredAt: at.toISOString(),
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
if (page.length < pageSize) return { rows, from, to };
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
];
|
|
62
|
+
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { createHash, randomUUID } from 'node:crypto';
|
|
2
2
|
import type { DatabaseHandle, DatabaseTransaction } from '@flowdular/sdk/database';
|
|
3
|
-
import { runDatabaseMigrations } from '@flowdular/sdk/database';
|
|
3
|
+
import { integer, runDatabaseMigrations } from '@flowdular/sdk/database';
|
|
4
4
|
import { normalizeActor } from '@flowdular/sdk/kernel';
|
|
5
|
+
import { keysetWhere } from '@flowdular/sdk/server';
|
|
5
6
|
import type { UserActor } from '@flowdular/sdk/kernel';
|
|
6
7
|
import type {
|
|
7
8
|
AutomationAuditEvent,
|
|
@@ -9,6 +10,9 @@ import type {
|
|
|
9
10
|
} from '../domain/types.ts';
|
|
10
11
|
import { databaseMigrations } from './migration.ts';
|
|
11
12
|
import type {
|
|
13
|
+
AutomationListCursor,
|
|
14
|
+
AutomationListPage,
|
|
15
|
+
AutomationListQuery,
|
|
12
16
|
AutomationScheduleRouting,
|
|
13
17
|
AutomationsRepository,
|
|
14
18
|
AutomationTriggerRecord,
|
|
@@ -77,21 +81,11 @@ interface AuditRow {
|
|
|
77
81
|
event_hash: string;
|
|
78
82
|
}
|
|
79
83
|
|
|
80
|
-
/* PostgreSQL returns BIGINT as a string. The audit hash covers sequence and
|
|
81
|
-
occurredAt, so a string here would break the chain rather than merely look
|
|
82
|
-
wrong. */
|
|
83
|
-
function integer(value: number | bigint | string): number {
|
|
84
|
-
const normalized = Number(value);
|
|
85
|
-
if (!Number.isSafeInteger(normalized)) {
|
|
86
|
-
throw new Error('The automations database returned an invalid integer.');
|
|
87
|
-
}
|
|
88
|
-
return normalized;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
84
|
function optionalInteger(
|
|
92
85
|
value: number | bigint | string | null,
|
|
86
|
+
field: string,
|
|
93
87
|
): number | null {
|
|
94
|
-
return value === null ? null : integer(value);
|
|
88
|
+
return value === null ? null : integer(value, field);
|
|
95
89
|
}
|
|
96
90
|
|
|
97
91
|
function configuredBy(value: string | null, createdBy: string): UserActor {
|
|
@@ -131,14 +125,14 @@ function schedule(row: ScheduleRow): StoredAutomationSchedule {
|
|
|
131
125
|
label: row.label,
|
|
132
126
|
inputTemplate: row.input_template,
|
|
133
127
|
cadence: row.cadence,
|
|
134
|
-
enabled: integer(row.enabled) === 1,
|
|
128
|
+
enabled: integer(row.enabled, 'enabled') === 1,
|
|
135
129
|
disabledReason: row.disabled_reason,
|
|
136
|
-
nextRunAt: integer(row.next_run_at),
|
|
137
|
-
lastRunAt: optionalInteger(row.last_run_at),
|
|
130
|
+
nextRunAt: integer(row.next_run_at, 'next_run_at'),
|
|
131
|
+
lastRunAt: optionalInteger(row.last_run_at, 'last_run_at'),
|
|
138
132
|
lastRunId: row.last_run_id,
|
|
139
133
|
lastError: row.last_error,
|
|
140
|
-
createdAt: integer(row.created_at),
|
|
141
|
-
updatedAt: integer(row.updated_at),
|
|
134
|
+
createdAt: integer(row.created_at, 'created_at'),
|
|
135
|
+
updatedAt: integer(row.updated_at, 'updated_at'),
|
|
142
136
|
createdBy: row.created_by,
|
|
143
137
|
configuredBy: configuredBy(row.configured_by_json, row.created_by),
|
|
144
138
|
permissionSnapshot: permissionSnapshot(row.permission_snapshot_json),
|
|
@@ -155,14 +149,14 @@ function trigger(row: TriggerRow): StoredAutomationTrigger {
|
|
|
155
149
|
targetKey,
|
|
156
150
|
agentId: targetKind === 'agent' ? targetKey : '',
|
|
157
151
|
label: row.label,
|
|
158
|
-
enabled: integer(row.enabled) === 1,
|
|
159
|
-
secretRevision: integer(row.secret_revision),
|
|
160
|
-
createdAt: integer(row.created_at),
|
|
161
|
-
updatedAt: integer(row.updated_at),
|
|
152
|
+
enabled: integer(row.enabled, 'enabled') === 1,
|
|
153
|
+
secretRevision: integer(row.secret_revision, 'secret_revision'),
|
|
154
|
+
createdAt: integer(row.created_at, 'created_at'),
|
|
155
|
+
updatedAt: integer(row.updated_at, 'updated_at'),
|
|
162
156
|
createdBy: row.created_by,
|
|
163
|
-
lastFiredAt: optionalInteger(row.last_fired_at),
|
|
164
|
-
acceptedCount: integer(row.accepted_count),
|
|
165
|
-
rejectedCount: integer(row.rejected_count),
|
|
157
|
+
lastFiredAt: optionalInteger(row.last_fired_at, 'last_fired_at'),
|
|
158
|
+
acceptedCount: integer(row.accepted_count, 'accepted_count'),
|
|
159
|
+
rejectedCount: integer(row.rejected_count, 'rejected_count'),
|
|
166
160
|
configuredBy: configuredBy(row.configured_by_json, row.created_by),
|
|
167
161
|
permissionSnapshot: permissionSnapshot(row.permission_snapshot_json),
|
|
168
162
|
};
|
|
@@ -221,7 +215,7 @@ function audit(row: AuditRow): AutomationAuditEvent {
|
|
|
221
215
|
return {
|
|
222
216
|
id: row.id,
|
|
223
217
|
tenantId: row.tenant_id,
|
|
224
|
-
sequence: integer(row.sequence),
|
|
218
|
+
sequence: integer(row.sequence, 'sequence'),
|
|
225
219
|
actorId: row.actor_id,
|
|
226
220
|
action: row.action,
|
|
227
221
|
subjectType: row.subject_type,
|
|
@@ -229,7 +223,7 @@ function audit(row: AuditRow): AutomationAuditEvent {
|
|
|
229
223
|
metadata: JSON.parse(row.metadata_json) as Readonly<
|
|
230
224
|
Record<string, string | number | boolean>
|
|
231
225
|
>,
|
|
232
|
-
occurredAt: integer(row.occurred_at),
|
|
226
|
+
occurredAt: integer(row.occurred_at, 'occurred_at'),
|
|
233
227
|
previousHash: row.previous_hash,
|
|
234
228
|
eventHash: row.event_hash,
|
|
235
229
|
};
|
|
@@ -257,6 +251,76 @@ function markers(count: number): string {
|
|
|
257
251
|
);
|
|
258
252
|
}
|
|
259
253
|
|
|
254
|
+
/* The three characters LIKE reads as syntax are escaped with the backslash
|
|
255
|
+
PostgreSQL takes as the default escape character, so a `%` a reader types
|
|
256
|
+
searches for a percent sign. */
|
|
257
|
+
function likePattern(term: string): string {
|
|
258
|
+
return '%' + term.replace(/[\\%_]/g, (character) => '\\' + character) + '%';
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
const LIST_SORT_COLUMNS = {
|
|
262
|
+
label: 'label_key',
|
|
263
|
+
updatedAt: 'updated_at',
|
|
264
|
+
} as const;
|
|
265
|
+
|
|
266
|
+
interface ListSortRow {
|
|
267
|
+
label_key: string;
|
|
268
|
+
updated_at: number | bigint | string;
|
|
269
|
+
id: string;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/* `label_key` is lower(label) aliased in a subselect, because a keyset column
|
|
273
|
+
must be a plain identifier. The planner pulls the subselect up, so the
|
|
274
|
+
expression index on (tenant_id, lower(label), id) still serves the order. */
|
|
275
|
+
function listPageStatement(
|
|
276
|
+
table: 'automations_schedules' | 'automations_triggers',
|
|
277
|
+
tenantId: string,
|
|
278
|
+
query: AutomationListQuery,
|
|
279
|
+
): { readonly text: string; readonly parameters: unknown[] } {
|
|
280
|
+
const column = LIST_SORT_COLUMNS[query.sort];
|
|
281
|
+
const parameters: unknown[] = [
|
|
282
|
+
tenantId,
|
|
283
|
+
query.enabled === undefined ? null : query.enabled ? 1 : 0,
|
|
284
|
+
query.search === undefined ? null : likePattern(query.search),
|
|
285
|
+
];
|
|
286
|
+
let keyset = '';
|
|
287
|
+
if (query.after) {
|
|
288
|
+
const predicate = keysetWhere(
|
|
289
|
+
[column, 'id'],
|
|
290
|
+
[query.after.value, query.after.id],
|
|
291
|
+
{ direction: query.direction, parameterOffset: parameters.length },
|
|
292
|
+
);
|
|
293
|
+
keyset = ` AND ${predicate.text}`;
|
|
294
|
+
parameters.push(...predicate.parameters);
|
|
295
|
+
}
|
|
296
|
+
parameters.push(query.limit);
|
|
297
|
+
const order = query.direction === 'desc' ? 'DESC' : 'ASC';
|
|
298
|
+
return {
|
|
299
|
+
text: `SELECT * FROM (SELECT s.*, lower(s.label) AS label_key FROM ${table} s) s
|
|
300
|
+
WHERE tenant_id = $1
|
|
301
|
+
AND ($2::integer IS NULL OR enabled = $2)
|
|
302
|
+
AND ($3::text IS NULL OR label ILIKE $3 OR target_key ILIKE $3)${keyset}
|
|
303
|
+
ORDER BY ${column} ${order}, id ${order}
|
|
304
|
+
LIMIT $${parameters.length}`,
|
|
305
|
+
parameters,
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
function listCursor(
|
|
310
|
+
rows: readonly ListSortRow[],
|
|
311
|
+
query: AutomationListQuery,
|
|
312
|
+
): AutomationListCursor | null {
|
|
313
|
+
const last = rows.at(-1);
|
|
314
|
+
if (!last || rows.length < query.limit) return null;
|
|
315
|
+
return {
|
|
316
|
+
value:
|
|
317
|
+
query.sort === 'label'
|
|
318
|
+
? last.label_key
|
|
319
|
+
: integer(last.updated_at, 'updated_at'),
|
|
320
|
+
id: last.id,
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
|
|
260
324
|
const SQL = {
|
|
261
325
|
listSchedules: `SELECT * FROM automations_schedules WHERE tenant_id = $1
|
|
262
326
|
ORDER BY lower(label), id`,
|
|
@@ -283,11 +347,13 @@ const SQL = {
|
|
|
283
347
|
updated_at = $5
|
|
284
348
|
WHERE tenant_id = $6 AND id = $7 AND enabled = 1
|
|
285
349
|
AND next_run_at = $8`,
|
|
350
|
+
retimeSchedule: `UPDATE automations_schedules SET next_run_at = $1,
|
|
351
|
+
updated_at = $2
|
|
352
|
+
WHERE tenant_id = $3 AND id = $4 AND enabled = 1
|
|
353
|
+
AND next_run_at = $5`,
|
|
286
354
|
disableSchedule: `UPDATE automations_schedules SET enabled = 0,
|
|
287
355
|
disabled_reason = $1, updated_at = $2
|
|
288
356
|
WHERE tenant_id = $3 AND id = $4 AND enabled = 1`,
|
|
289
|
-
listTriggers: `SELECT * FROM automations_triggers WHERE tenant_id = $1
|
|
290
|
-
ORDER BY lower(label), id`,
|
|
291
357
|
getTrigger: `SELECT * FROM automations_triggers
|
|
292
358
|
WHERE tenant_id = $1 AND id = $2`,
|
|
293
359
|
/* Read through the cross-tenant background lease. It routes a webhook to a
|
|
@@ -320,6 +386,9 @@ const SQL = {
|
|
|
320
386
|
ORDER BY sequence DESC LIMIT $2`,
|
|
321
387
|
auditChain: `SELECT * FROM automations_audit_events WHERE tenant_id = $1
|
|
322
388
|
ORDER BY sequence ASC`,
|
|
389
|
+
exportAudit: `SELECT * FROM automations_audit_events
|
|
390
|
+
WHERE tenant_id = $1 AND id > $2
|
|
391
|
+
ORDER BY id LIMIT $3`,
|
|
323
392
|
} as const;
|
|
324
393
|
|
|
325
394
|
export async function migrateAutomationsDatabase(
|
|
@@ -353,6 +422,17 @@ export class DatabaseAutomationsRepository implements AutomationsRepository {
|
|
|
353
422
|
return result.map(schedule);
|
|
354
423
|
}
|
|
355
424
|
|
|
425
|
+
async listSchedulesPage(
|
|
426
|
+
tenantId: string,
|
|
427
|
+
query: AutomationListQuery,
|
|
428
|
+
): Promise<AutomationListPage<StoredAutomationSchedule>> {
|
|
429
|
+
const rows = await this.#read<ScheduleRow & ListSortRow>(
|
|
430
|
+
tenantId,
|
|
431
|
+
listPageStatement('automations_schedules', tenantId, query),
|
|
432
|
+
);
|
|
433
|
+
return { items: rows.map(schedule), next: listCursor(rows, query) };
|
|
434
|
+
}
|
|
435
|
+
|
|
356
436
|
async getSchedule(
|
|
357
437
|
tenantId: string,
|
|
358
438
|
scheduleId: string,
|
|
@@ -443,7 +523,7 @@ export class DatabaseAutomationsRepository implements AutomationsRepository {
|
|
|
443
523
|
return result.rows.map((row) => ({
|
|
444
524
|
tenantId: row.tenant_id,
|
|
445
525
|
id: row.id,
|
|
446
|
-
nextRunAt: integer(row.next_run_at),
|
|
526
|
+
nextRunAt: integer(row.next_run_at, 'next_run_at'),
|
|
447
527
|
}));
|
|
448
528
|
}
|
|
449
529
|
|
|
@@ -472,6 +552,26 @@ export class DatabaseAutomationsRepository implements AutomationsRepository {
|
|
|
472
552
|
return affected === 1;
|
|
473
553
|
}
|
|
474
554
|
|
|
555
|
+
async retimeSchedule(input: {
|
|
556
|
+
readonly tenantId: string;
|
|
557
|
+
readonly scheduleId: string;
|
|
558
|
+
readonly expectedNextRunAt: number;
|
|
559
|
+
readonly nextRunAt: number;
|
|
560
|
+
readonly updatedAt: number;
|
|
561
|
+
}): Promise<boolean> {
|
|
562
|
+
const affected = await this.#write(input.tenantId, {
|
|
563
|
+
text: SQL.retimeSchedule,
|
|
564
|
+
parameters: [
|
|
565
|
+
input.nextRunAt,
|
|
566
|
+
input.updatedAt,
|
|
567
|
+
input.tenantId,
|
|
568
|
+
input.scheduleId,
|
|
569
|
+
input.expectedNextRunAt,
|
|
570
|
+
],
|
|
571
|
+
});
|
|
572
|
+
return affected === 1;
|
|
573
|
+
}
|
|
574
|
+
|
|
475
575
|
async disableSchedule(
|
|
476
576
|
tenantId: string,
|
|
477
577
|
scheduleId: string,
|
|
@@ -485,14 +585,15 @@ export class DatabaseAutomationsRepository implements AutomationsRepository {
|
|
|
485
585
|
return affected === 1;
|
|
486
586
|
}
|
|
487
587
|
|
|
488
|
-
async
|
|
588
|
+
async listTriggersPage(
|
|
489
589
|
tenantId: string,
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
590
|
+
query: AutomationListQuery,
|
|
591
|
+
): Promise<AutomationListPage<StoredAutomationTrigger>> {
|
|
592
|
+
const rows = await this.#read<TriggerRow & ListSortRow>(
|
|
593
|
+
tenantId,
|
|
594
|
+
listPageStatement('automations_triggers', tenantId, query),
|
|
595
|
+
);
|
|
596
|
+
return { items: rows.map(trigger), next: listCursor(rows, query) };
|
|
496
597
|
}
|
|
497
598
|
|
|
498
599
|
async getTrigger(
|
|
@@ -643,7 +744,8 @@ export class DatabaseAutomationsRepository implements AutomationsRepository {
|
|
|
643
744
|
parameters: [event.tenantId],
|
|
644
745
|
});
|
|
645
746
|
const previous = latest.rows[0];
|
|
646
|
-
const sequence =
|
|
747
|
+
const sequence =
|
|
748
|
+
(previous ? integer(previous.sequence, 'sequence') : 0) + 1;
|
|
647
749
|
const previousHash = previous?.event_hash ?? null;
|
|
648
750
|
const metadataJson = stableMetadata(event.metadata);
|
|
649
751
|
const created: AutomationAuditEvent = {
|
|
@@ -696,6 +798,18 @@ export class DatabaseAutomationsRepository implements AutomationsRepository {
|
|
|
696
798
|
return rows.map(audit);
|
|
697
799
|
}
|
|
698
800
|
|
|
801
|
+
async exportAuditEventsPage(
|
|
802
|
+
tenantId: string,
|
|
803
|
+
afterId: string,
|
|
804
|
+
limit: number,
|
|
805
|
+
): Promise<readonly AutomationAuditEvent[]> {
|
|
806
|
+
const rows = await this.#read<AuditRow>(tenantId, {
|
|
807
|
+
text: SQL.exportAudit,
|
|
808
|
+
parameters: [tenantId, afterId, limit],
|
|
809
|
+
});
|
|
810
|
+
return rows.map(audit);
|
|
811
|
+
}
|
|
812
|
+
|
|
699
813
|
async verifyAuditChain(
|
|
700
814
|
tenantId: string,
|
|
701
815
|
): Promise<AutomationAuditVerification> {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { DatabaseMigration } from '@flowdular/sdk/database';
|
|
1
|
+
import type { DatabaseMigration, DatabaseSession } from '@flowdular/sdk/database';
|
|
2
2
|
import {
|
|
3
3
|
migrationObjectState,
|
|
4
4
|
postgresTenantTableState,
|
|
@@ -166,6 +166,58 @@ REVOKE SELECT ON automations_triggers FROM coreloom_background;
|
|
|
166
166
|
GRANT SELECT (tenant_id, id) ON automations_triggers TO coreloom_background;
|
|
167
167
|
`;
|
|
168
168
|
|
|
169
|
+
export const AUTOMATIONS_MIGRATION_005_SECRET_ROTATION_INVENTORY = `-- The rotation command has to find the triggers still sealed with a retired key
|
|
170
|
+
-- before it knows whose they are. The cross-tenant lookup already reads the two
|
|
171
|
+
-- routing columns; this adds the key id and nothing else. The nonce, the tag and
|
|
172
|
+
-- the ciphertext stay unreadable on this connection, and every row it re-seals
|
|
173
|
+
-- is read again under the tenant that row named.
|
|
174
|
+
GRANT SELECT (secret_key_id) ON automations_triggers TO coreloom_background;
|
|
175
|
+
`;
|
|
176
|
+
|
|
177
|
+
/* Mirrors migrations/0006_automations_list_sort_indexes.up.sql byte for byte. */
|
|
178
|
+
export const AUTOMATIONS_MIGRATION_006_LIST_SORT_INDEXES = `-- The schedule and trigger lists page by keyset over the same order they show,
|
|
179
|
+
-- lower(label) then id, or updated_at then id, so each order gets an index
|
|
180
|
+
-- that starts with the tenant and ends with the id the keyset breaks ties on.
|
|
181
|
+
CREATE INDEX IF NOT EXISTS automations_schedules_tenant_label_key_idx
|
|
182
|
+
ON automations_schedules (tenant_id, lower(label), id);
|
|
183
|
+
CREATE INDEX IF NOT EXISTS automations_schedules_tenant_updated_idx
|
|
184
|
+
ON automations_schedules (tenant_id, updated_at, id);
|
|
185
|
+
CREATE INDEX IF NOT EXISTS automations_triggers_tenant_label_key_idx
|
|
186
|
+
ON automations_triggers (tenant_id, lower(label), id);
|
|
187
|
+
CREATE INDEX IF NOT EXISTS automations_triggers_tenant_updated_idx
|
|
188
|
+
ON automations_triggers (tenant_id, updated_at, id);
|
|
189
|
+
`;
|
|
190
|
+
|
|
191
|
+
/* Narrowed to this schema's relation through to_regclass and never deparsed:
|
|
192
|
+
a deparse over the whole catalogue reaches relations another connection is
|
|
193
|
+
dropping and fails with a cache lookup error instead of an answer. */
|
|
194
|
+
async function backgroundPolicyPresent(
|
|
195
|
+
database: DatabaseSession,
|
|
196
|
+
table: string,
|
|
197
|
+
policy: string,
|
|
198
|
+
): Promise<boolean> {
|
|
199
|
+
const result = await database.query<{ present: boolean }>({
|
|
200
|
+
text: `SELECT EXISTS (
|
|
201
|
+
SELECT 1 FROM pg_policy
|
|
202
|
+
WHERE polrelid = to_regclass('${table}') AND polname = '${policy}'
|
|
203
|
+
) AS present`,
|
|
204
|
+
});
|
|
205
|
+
return result.rows[0]?.present === true;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
async function backgroundColumnGranted(
|
|
209
|
+
database: DatabaseSession,
|
|
210
|
+
table: string,
|
|
211
|
+
column: string,
|
|
212
|
+
): Promise<boolean> {
|
|
213
|
+
const result = await database.query<{ granted: boolean }>({
|
|
214
|
+
text: `SELECT CASE WHEN to_regclass('${table}') IS NOT NULL THEN
|
|
215
|
+
has_column_privilege('coreloom_background', '${table}', '${column}', 'SELECT')
|
|
216
|
+
ELSE false END AS granted`,
|
|
217
|
+
});
|
|
218
|
+
return result.rows[0]?.granted === true;
|
|
219
|
+
}
|
|
220
|
+
|
|
169
221
|
export const databaseMigrations: readonly DatabaseMigration[] = [
|
|
170
222
|
{
|
|
171
223
|
id: '0001_automations_core',
|
|
@@ -207,17 +259,75 @@ export const databaseMigrations: readonly DatabaseMigration[] = [
|
|
|
207
259
|
{
|
|
208
260
|
id: '0003_automations_scheduler_role',
|
|
209
261
|
sql: { postgresql: AUTOMATIONS_MIGRATION_003_SCHEDULER_ROLE },
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
262
|
+
/* The index is one of three objects; the background policy and the
|
|
263
|
+
column grant leave nothing the schema reader sees, so each is proved
|
|
264
|
+
against the catalogue and a schema carrying only some is partial. */
|
|
265
|
+
inspectExisting: (database) =>
|
|
266
|
+
migrationObjectState([
|
|
267
|
+
() => database.schema.hasIndex('automations_schedules_routing_idx'),
|
|
268
|
+
() =>
|
|
269
|
+
backgroundPolicyPresent(
|
|
270
|
+
database,
|
|
271
|
+
'automations_schedules',
|
|
272
|
+
'automations_schedules_background_policy',
|
|
273
|
+
),
|
|
274
|
+
() =>
|
|
275
|
+
backgroundColumnGranted(
|
|
276
|
+
database,
|
|
277
|
+
'automations_schedules',
|
|
278
|
+
'next_run_at',
|
|
279
|
+
),
|
|
280
|
+
]),
|
|
214
281
|
},
|
|
215
282
|
{
|
|
216
283
|
id: '0004_automations_trigger_routing_role',
|
|
217
284
|
sql: { postgresql: AUTOMATIONS_MIGRATION_004_TRIGGER_ROUTING_ROLE },
|
|
218
|
-
inspectExisting:
|
|
219
|
-
(
|
|
220
|
-
|
|
221
|
-
|
|
285
|
+
inspectExisting: (database) =>
|
|
286
|
+
migrationObjectState([
|
|
287
|
+
() => database.schema.hasIndex('automations_triggers_routing_idx'),
|
|
288
|
+
() =>
|
|
289
|
+
backgroundPolicyPresent(
|
|
290
|
+
database,
|
|
291
|
+
'automations_triggers',
|
|
292
|
+
'automations_triggers_background_policy',
|
|
293
|
+
),
|
|
294
|
+
() =>
|
|
295
|
+
backgroundColumnGranted(
|
|
296
|
+
database,
|
|
297
|
+
'automations_triggers',
|
|
298
|
+
'tenant_id',
|
|
299
|
+
),
|
|
300
|
+
]),
|
|
301
|
+
},
|
|
302
|
+
{
|
|
303
|
+
id: '0005_secret_rotation_inventory',
|
|
304
|
+
sql: { postgresql: AUTOMATIONS_MIGRATION_005_SECRET_ROTATION_INVENTORY },
|
|
305
|
+
/* A grant leaves no object behind, so the column privilege itself is what
|
|
306
|
+
proves this migration ran. */
|
|
307
|
+
inspectExisting: async (database) => {
|
|
308
|
+
const result = await database.query<{ granted: boolean }>({
|
|
309
|
+
text: `SELECT CASE WHEN to_regclass('automations_triggers') IS NOT NULL THEN
|
|
310
|
+
has_column_privilege('coreloom_background', 'automations_triggers', 'secret_key_id', 'SELECT')
|
|
311
|
+
ELSE false END AS granted`,
|
|
312
|
+
});
|
|
313
|
+
return result.rows[0]?.granted === true ? 'complete' : 'absent';
|
|
314
|
+
},
|
|
315
|
+
},
|
|
316
|
+
{
|
|
317
|
+
id: '0006_automations_list_sort_indexes',
|
|
318
|
+
sql: { postgresql: AUTOMATIONS_MIGRATION_006_LIST_SORT_INDEXES },
|
|
319
|
+
inspectExisting: (database) =>
|
|
320
|
+
migrationObjectState([
|
|
321
|
+
() =>
|
|
322
|
+
database.schema.hasIndex(
|
|
323
|
+
'automations_schedules_tenant_label_key_idx',
|
|
324
|
+
),
|
|
325
|
+
() =>
|
|
326
|
+
database.schema.hasIndex('automations_schedules_tenant_updated_idx'),
|
|
327
|
+
() =>
|
|
328
|
+
database.schema.hasIndex('automations_triggers_tenant_label_key_idx'),
|
|
329
|
+
() =>
|
|
330
|
+
database.schema.hasIndex('automations_triggers_tenant_updated_idx'),
|
|
331
|
+
]),
|
|
222
332
|
},
|
|
223
333
|
];
|
|
@@ -46,8 +46,42 @@ export interface AutomationScheduleRouting {
|
|
|
46
46
|
readonly nextRunAt: number;
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
+
export type AutomationListSortKey = 'label' | 'updatedAt';
|
|
50
|
+
|
|
51
|
+
export const AUTOMATION_LIST_SORT_KEYS: readonly AutomationListSortKey[] = [
|
|
52
|
+
'label',
|
|
53
|
+
'updatedAt',
|
|
54
|
+
];
|
|
55
|
+
|
|
56
|
+
/** The keyset of the last row of a page: the sort value, then the id. */
|
|
57
|
+
export interface AutomationListCursor {
|
|
58
|
+
readonly value: string | number;
|
|
59
|
+
readonly id: string;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export interface AutomationListQuery {
|
|
63
|
+
readonly sort: AutomationListSortKey;
|
|
64
|
+
readonly direction: 'asc' | 'desc';
|
|
65
|
+
readonly enabled?: boolean | undefined;
|
|
66
|
+
/** Substring of the label or the target key. */
|
|
67
|
+
readonly search?: string | undefined;
|
|
68
|
+
readonly limit: number;
|
|
69
|
+
readonly after?: AutomationListCursor | null | undefined;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export interface AutomationListPage<Item> {
|
|
73
|
+
readonly items: readonly Item[];
|
|
74
|
+
/** The keyset to continue from; null once the page was short. */
|
|
75
|
+
readonly next: AutomationListCursor | null;
|
|
76
|
+
}
|
|
77
|
+
|
|
49
78
|
export interface AutomationsRepository {
|
|
79
|
+
/** Every schedule of one workspace; only `retime` walks a whole workspace. */
|
|
50
80
|
listSchedules(tenantId: string): Promise<readonly StoredAutomationSchedule[]>;
|
|
81
|
+
listSchedulesPage(
|
|
82
|
+
tenantId: string,
|
|
83
|
+
query: AutomationListQuery,
|
|
84
|
+
): Promise<AutomationListPage<StoredAutomationSchedule>>;
|
|
51
85
|
getSchedule(
|
|
52
86
|
tenantId: string,
|
|
53
87
|
scheduleId: string,
|
|
@@ -72,13 +106,24 @@ export interface AutomationsRepository {
|
|
|
72
106
|
readonly lastRunId: string | null;
|
|
73
107
|
readonly lastError: string | null;
|
|
74
108
|
}): Promise<boolean>;
|
|
109
|
+
/** Moves a pending slot only while it still holds the value that was read. */
|
|
110
|
+
retimeSchedule(input: {
|
|
111
|
+
readonly tenantId: string;
|
|
112
|
+
readonly scheduleId: string;
|
|
113
|
+
readonly expectedNextRunAt: number;
|
|
114
|
+
readonly nextRunAt: number;
|
|
115
|
+
readonly updatedAt: number;
|
|
116
|
+
}): Promise<boolean>;
|
|
75
117
|
disableSchedule(
|
|
76
118
|
tenantId: string,
|
|
77
119
|
scheduleId: string,
|
|
78
120
|
reason: string,
|
|
79
121
|
now: number,
|
|
80
122
|
): Promise<boolean>;
|
|
81
|
-
|
|
123
|
+
listTriggersPage(
|
|
124
|
+
tenantId: string,
|
|
125
|
+
query: AutomationListQuery,
|
|
126
|
+
): Promise<AutomationListPage<StoredAutomationTrigger>>;
|
|
82
127
|
getTrigger(
|
|
83
128
|
tenantId: string,
|
|
84
129
|
triggerId: string,
|
|
@@ -116,4 +161,10 @@ export interface AutomationsRepository {
|
|
|
116
161
|
limit: number,
|
|
117
162
|
): Promise<readonly AutomationAuditEvent[]>;
|
|
118
163
|
verifyAuditChain(tenantId: string): Promise<AutomationAuditVerification>;
|
|
164
|
+
/** One keyset page of the trail, ordered by id, for the data class export. */
|
|
165
|
+
exportAuditEventsPage(
|
|
166
|
+
tenantId: string,
|
|
167
|
+
afterId: string,
|
|
168
|
+
limit: number,
|
|
169
|
+
): Promise<readonly AutomationAuditEvent[]>;
|
|
119
170
|
}
|