@flowdular/sdk 0.2.3 → 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 +3 -2
- 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 +3 -2
- 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 +5 -2
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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 +5 -2
- 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 +3 -2
- 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 +66 -7
- package/packages/client/package.json +2 -1
- 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/dev-console/package.json +2 -1
- package/packages/dev-console/src/brand.d.mts +8 -0
- package/packages/dev-console/src/brand.mjs +33 -0
- package/packages/dev-console/src/index.mjs +2 -1
- 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
|
@@ -332,6 +332,129 @@ const TENANT_TABLES: readonly (readonly [string, string, string])[] = [
|
|
|
332
332
|
],
|
|
333
333
|
];
|
|
334
334
|
|
|
335
|
+
export const WORKFLOWS_MIGRATION_004 = `-- The rotation command has to find the payloads still sealed with a retired key
|
|
336
|
+
-- before it knows whose they are. The retention sweep sees only payloads with an
|
|
337
|
+
-- expiry; a rotation covers every live one, so it reads under a policy of its
|
|
338
|
+
-- own and is granted the key id alone. The ciphertext stays unreadable on this
|
|
339
|
+
-- connection, and every payload it re-seals is read again under the tenant that
|
|
340
|
+
-- row named.
|
|
341
|
+
DO $$
|
|
342
|
+
BEGIN
|
|
343
|
+
IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'coreloom_background') THEN
|
|
344
|
+
RAISE EXCEPTION 'The coreloom_background role must exist before this migration.';
|
|
345
|
+
END IF;
|
|
346
|
+
END
|
|
347
|
+
$$;
|
|
348
|
+
CREATE POLICY workflow_payloads_rotation_policy ON workflow_payloads
|
|
349
|
+
FOR SELECT TO coreloom_background
|
|
350
|
+
USING (kind = 'execution');
|
|
351
|
+
GRANT SELECT (encryption_key_id) ON workflow_payloads TO coreloom_background;
|
|
352
|
+
`;
|
|
353
|
+
|
|
354
|
+
/* Mirrors migrations/0005_workflows_human_approval.up.sql byte for byte. */
|
|
355
|
+
export const WORKFLOWS_MIGRATION_005_HUMAN_APPROVAL = `-- A run waiting on a person waits for days, not for the seconds an agent or an
|
|
356
|
+
-- action takes. Leaving it in 'running' would keep it at the head of the claim
|
|
357
|
+
-- queue, where it would be re-claimed every poll and, because the queue is
|
|
358
|
+
-- ordered by queued_at, would starve every run queued after it.
|
|
359
|
+
--
|
|
360
|
+
-- 'waiting-approval' is the status that takes such a run out of the queue. It
|
|
361
|
+
-- comes back when approvals.core calls back, which sets the node's
|
|
362
|
+
-- next_attempt_at to now, or when the recheck the node armed falls due; the
|
|
363
|
+
-- claim predicate reads that column exactly as it already does for a retry.
|
|
364
|
+
--
|
|
365
|
+
-- The approval itself is the third child kind. It reuses the attempt's
|
|
366
|
+
-- waiting-child machinery, so the request id is stored in child_id and recovery
|
|
367
|
+
-- after a restart finds the open request instead of opening a second one.
|
|
368
|
+
ALTER TABLE workflow_runs DROP CONSTRAINT IF EXISTS workflow_runs_status_check;
|
|
369
|
+
ALTER TABLE workflow_runs ADD CONSTRAINT workflow_runs_status_check
|
|
370
|
+
CHECK (status IN ('queued', 'running', 'waiting-agent', 'waiting-approval', 'waiting-retry', 'cancel-requested', 'succeeded', 'failed', 'refused', 'cancelled'));
|
|
371
|
+
ALTER TABLE workflow_node_attempts DROP CONSTRAINT IF EXISTS workflow_node_attempts_child_kind_check;
|
|
372
|
+
ALTER TABLE workflow_node_attempts ADD CONSTRAINT workflow_node_attempts_child_kind_check
|
|
373
|
+
CHECK (child_kind IN ('agent', 'action', 'approval'));
|
|
374
|
+
-- The claim poll has to see that a node is asleep on an approval before it can
|
|
375
|
+
-- decide whether the run is due, and the cross-tenant policy showed it retries
|
|
376
|
+
-- only. It is widened to the second waiting state and no further: the four
|
|
377
|
+
-- routing columns it was already granted stay the whole of what it can read,
|
|
378
|
+
-- and the run is read again under its own tenant before anything is written.
|
|
379
|
+
DROP POLICY IF EXISTS workflow_node_states_background_policy ON workflow_node_states;
|
|
380
|
+
CREATE POLICY workflow_node_states_background_policy ON workflow_node_states
|
|
381
|
+
FOR SELECT TO coreloom_background
|
|
382
|
+
USING (status IN ('waiting-retry', 'waiting-child'));
|
|
383
|
+
`;
|
|
384
|
+
|
|
385
|
+
/* Mirrors migrations/0006_workflows_retention_indexes.up.sql byte for byte. */
|
|
386
|
+
export const WORKFLOWS_MIGRATION_006_RETENTION_INDEXES = `-- The retention sweep of workflows.core.runs asks one workspace for its oldest
|
|
387
|
+
-- settled runs, and a subject erasure asks it for the runs one account
|
|
388
|
+
-- requested. Both are bounded batches, so both need a range scan rather than a
|
|
389
|
+
-- pass over the workspace's runs. The requester lives inside the stored actor
|
|
390
|
+
-- document, so the index is over that one field of it; the export walks the
|
|
391
|
+
-- order workflow_runs_tenant_queue_idx already carries and needs no index of
|
|
392
|
+
-- its own.
|
|
393
|
+
CREATE INDEX IF NOT EXISTS workflow_runs_tenant_settled_idx
|
|
394
|
+
ON workflow_runs (tenant_id, completed_at);
|
|
395
|
+
CREATE INDEX IF NOT EXISTS workflow_runs_tenant_requester_idx
|
|
396
|
+
ON workflow_runs (tenant_id, (actor_json::jsonb ->> 'id'), id);
|
|
397
|
+
`;
|
|
398
|
+
|
|
399
|
+
/* Mirrors migrations/0007_workflows_erasure_subject_indexes.up.sql byte for byte. */
|
|
400
|
+
export const WORKFLOWS_MIGRATION_007_ERASURE_SUBJECT_INDEXES = `-- A subject erasure asks one workspace for the runs a person is behind, and
|
|
401
|
+
-- that is three questions rather than one: the runs the person started, the
|
|
402
|
+
-- runs a service actor they configured started, and the runs an agent started
|
|
403
|
+
-- on their behalf. 0006 indexed the first, which is the only one held in the
|
|
404
|
+
-- actor's own id. These give the other two the same support.
|
|
405
|
+
-- Neither is reachable from the connection the erasure runs on, and 0006's is
|
|
406
|
+
-- not either. The jsonb extraction operator is not leakproof, so under the
|
|
407
|
+
-- forced row level security policy PostgreSQL applies the policy first and the
|
|
408
|
+
-- comparison stays a filter rather than an index condition: measured over
|
|
409
|
+
-- 20000 runs, the runtime role scans the workspace while the migration role
|
|
410
|
+
-- uses the index. The batch limit is what bounds an erasure until the subject
|
|
411
|
+
-- account is stored in a column of its own, which compares leakproof and
|
|
412
|
+
-- indexes plainly; that column is the precise fix and it retires all three.
|
|
413
|
+
CREATE INDEX IF NOT EXISTS workflow_runs_tenant_configured_by_idx
|
|
414
|
+
ON workflow_runs (tenant_id, (actor_json::jsonb -> 'configuredBy' ->> 'id'), id);
|
|
415
|
+
CREATE INDEX IF NOT EXISTS workflow_runs_tenant_subject_idx
|
|
416
|
+
ON workflow_runs (tenant_id, (authorization_subject_json::jsonb ->> 'id'), id);
|
|
417
|
+
`;
|
|
418
|
+
|
|
419
|
+
/* Mirrors migrations/0008_workflows_subject_account.up.sql byte for byte. */
|
|
420
|
+
export const WORKFLOWS_MIGRATION_008_SUBJECT_ACCOUNT = `-- The person behind a run, resolved once at write time instead of read out of
|
|
421
|
+
-- the stored actor document on every erasure. A run started by a person names
|
|
422
|
+
-- them in its actor, a run started by a schedule, a webhook or an automation
|
|
423
|
+
-- names them in the service actor's configuredBy, and a run an agent started
|
|
424
|
+
-- names them in the delegated authorization subject; this column is that one
|
|
425
|
+
-- answer, and the three predicates it replaces become a single equality.
|
|
426
|
+
-- This supersedes the expression indexes of 0006 and 0007, which the erasure
|
|
427
|
+
-- cannot use: the jsonb extraction operator is not leakproof, so under the
|
|
428
|
+
-- forced row level security policy PostgreSQL applies the policy first and the
|
|
429
|
+
-- comparison can never become an index condition. A plain text column compares
|
|
430
|
+
-- leakproof and indexes normally, so the same query becomes an index scan on
|
|
431
|
+
-- the connection the erasure actually runs on. Both older indexes stay because
|
|
432
|
+
-- an applied migration is immutable; they are dead weight, not a hazard.
|
|
433
|
+
ALTER TABLE workflow_runs
|
|
434
|
+
ADD COLUMN subject_account_id TEXT;
|
|
435
|
+
UPDATE workflow_runs
|
|
436
|
+
SET subject_account_id = COALESCE(
|
|
437
|
+
actor_json::jsonb -> 'configuredBy' ->> 'id',
|
|
438
|
+
authorization_subject_json::jsonb ->> 'id',
|
|
439
|
+
actor_json::jsonb ->> 'id'
|
|
440
|
+
)
|
|
441
|
+
WHERE subject_account_id IS NULL;
|
|
442
|
+
CREATE INDEX IF NOT EXISTS workflow_runs_tenant_subject_account_idx
|
|
443
|
+
ON workflow_runs (tenant_id, subject_account_id, id);
|
|
444
|
+
`;
|
|
445
|
+
|
|
446
|
+
/* Mirrors migrations/0009_workflows_definition_list_indexes.up.sql byte for byte. */
|
|
447
|
+
export const WORKFLOWS_MIGRATION_009_DEFINITION_LIST_INDEXES = `-- The definitions screen pages by keyset over the order it shows, by name or by
|
|
448
|
+
-- last update, each ending in the id. 0001 indexed (tenant_id, name, id), which
|
|
449
|
+
-- serves neither an ORDER BY over lower(name) nor one over updated_at, so both
|
|
450
|
+
-- orders walked the workspace's rows and sorted them. These two carry each
|
|
451
|
+
-- order the way the page reads it.
|
|
452
|
+
CREATE INDEX IF NOT EXISTS workflow_definitions_tenant_lower_name_idx
|
|
453
|
+
ON workflow_definitions (tenant_id, lower(name), id);
|
|
454
|
+
CREATE INDEX IF NOT EXISTS workflow_definitions_tenant_updated_idx
|
|
455
|
+
ON workflow_definitions (tenant_id, updated_at, id);
|
|
456
|
+
`;
|
|
457
|
+
|
|
335
458
|
export const databaseMigrations: readonly DatabaseMigration[] = [
|
|
336
459
|
{
|
|
337
460
|
id: '0001_workflows_core',
|
|
@@ -372,4 +495,121 @@ export const databaseMigrations: readonly DatabaseMigration[] = [
|
|
|
372
495
|
() => database.schema.hasIndex('workflow_payloads_retention_idx'),
|
|
373
496
|
]),
|
|
374
497
|
},
|
|
498
|
+
{
|
|
499
|
+
id: '0004_payload_rotation_inventory',
|
|
500
|
+
sql: { postgresql: WORKFLOWS_MIGRATION_004 },
|
|
501
|
+
/* A policy and a grant leave no object the schema reader can see, so the
|
|
502
|
+
policy itself proves this migration ran. */
|
|
503
|
+
inspectExisting: async (database) => {
|
|
504
|
+
const result = await database.query<{ present: boolean }>({
|
|
505
|
+
text: `SELECT EXISTS (
|
|
506
|
+
SELECT 1 FROM pg_policy
|
|
507
|
+
JOIN pg_class ON pg_class.oid = pg_policy.polrelid
|
|
508
|
+
JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace
|
|
509
|
+
WHERE pg_namespace.nspname = current_schema()
|
|
510
|
+
AND pg_class.relname = 'workflow_payloads'
|
|
511
|
+
AND pg_policy.polname = 'workflow_payloads_rotation_policy'
|
|
512
|
+
) AS present`,
|
|
513
|
+
});
|
|
514
|
+
return result.rows[0]?.present === true ? 'complete' : 'absent';
|
|
515
|
+
},
|
|
516
|
+
},
|
|
517
|
+
{
|
|
518
|
+
id: '0005_workflows_human_approval',
|
|
519
|
+
sql: { postgresql: WORKFLOWS_MIGRATION_005_HUMAN_APPROVAL },
|
|
520
|
+
/* A replaced check constraint leaves no new schema object behind, so each
|
|
521
|
+
of the two is proved against the catalogue and a schema carrying only
|
|
522
|
+
one of them is partial. The rows are narrowed to this schema's objects
|
|
523
|
+
before anything is deparsed: a deparse over the whole catalogue reaches
|
|
524
|
+
relations another connection is dropping and fails with a cache lookup
|
|
525
|
+
error instead of an answer. */
|
|
526
|
+
inspectExisting: (database) =>
|
|
527
|
+
migrationObjectState([
|
|
528
|
+
async () =>
|
|
529
|
+
(
|
|
530
|
+
await database.query<{ present: boolean }>({
|
|
531
|
+
text: `WITH candidate AS MATERIALIZED (
|
|
532
|
+
SELECT oid FROM pg_constraint
|
|
533
|
+
WHERE conrelid = to_regclass('workflow_runs')
|
|
534
|
+
AND conname = 'workflow_runs_status_check'
|
|
535
|
+
)
|
|
536
|
+
SELECT EXISTS (
|
|
537
|
+
SELECT 1 FROM candidate
|
|
538
|
+
WHERE pg_get_constraintdef(oid) LIKE '%waiting-approval%'
|
|
539
|
+
) AS present`,
|
|
540
|
+
})
|
|
541
|
+
).rows[0]?.present === true,
|
|
542
|
+
async () =>
|
|
543
|
+
(
|
|
544
|
+
await database.query<{ present: boolean }>({
|
|
545
|
+
text: `WITH candidate AS MATERIALIZED (
|
|
546
|
+
SELECT oid FROM pg_constraint
|
|
547
|
+
WHERE conrelid = to_regclass('workflow_node_attempts')
|
|
548
|
+
AND conname = 'workflow_node_attempts_child_kind_check'
|
|
549
|
+
)
|
|
550
|
+
SELECT EXISTS (
|
|
551
|
+
SELECT 1 FROM candidate
|
|
552
|
+
WHERE pg_get_constraintdef(oid) LIKE '%approval%'
|
|
553
|
+
) AS present`,
|
|
554
|
+
})
|
|
555
|
+
).rows[0]?.present === true,
|
|
556
|
+
async () =>
|
|
557
|
+
(
|
|
558
|
+
await database.query<{ present: boolean }>({
|
|
559
|
+
text: `WITH candidate AS MATERIALIZED (
|
|
560
|
+
SELECT pg_policy.polqual, pg_policy.polrelid
|
|
561
|
+
FROM pg_policy
|
|
562
|
+
WHERE pg_policy.polrelid = to_regclass('workflow_node_states')
|
|
563
|
+
AND pg_policy.polname = 'workflow_node_states_background_policy'
|
|
564
|
+
)
|
|
565
|
+
SELECT EXISTS (
|
|
566
|
+
SELECT 1 FROM candidate
|
|
567
|
+
WHERE pg_get_expr(polqual, polrelid) LIKE '%waiting-child%'
|
|
568
|
+
) AS present`,
|
|
569
|
+
})
|
|
570
|
+
).rows[0]?.present === true,
|
|
571
|
+
]),
|
|
572
|
+
},
|
|
573
|
+
{
|
|
574
|
+
id: '0006_workflows_retention_indexes',
|
|
575
|
+
sql: { postgresql: WORKFLOWS_MIGRATION_006_RETENTION_INDEXES },
|
|
576
|
+
inspectExisting: (database) =>
|
|
577
|
+
migrationObjectState([
|
|
578
|
+
() => database.schema.hasIndex('workflow_runs_tenant_settled_idx'),
|
|
579
|
+
() => database.schema.hasIndex('workflow_runs_tenant_requester_idx'),
|
|
580
|
+
]),
|
|
581
|
+
},
|
|
582
|
+
{
|
|
583
|
+
id: '0007_workflows_erasure_subject_indexes',
|
|
584
|
+
sql: { postgresql: WORKFLOWS_MIGRATION_007_ERASURE_SUBJECT_INDEXES },
|
|
585
|
+
inspectExisting: (database) =>
|
|
586
|
+
migrationObjectState([
|
|
587
|
+
() =>
|
|
588
|
+
database.schema.hasIndex('workflow_runs_tenant_configured_by_idx'),
|
|
589
|
+
() => database.schema.hasIndex('workflow_runs_tenant_subject_idx'),
|
|
590
|
+
]),
|
|
591
|
+
},
|
|
592
|
+
{
|
|
593
|
+
id: '0008_workflows_subject_account',
|
|
594
|
+
sql: { postgresql: WORKFLOWS_MIGRATION_008_SUBJECT_ACCOUNT },
|
|
595
|
+
inspectExisting: (database) =>
|
|
596
|
+
migrationObjectState([
|
|
597
|
+
() => database.schema.hasColumn('workflow_runs', 'subject_account_id'),
|
|
598
|
+
() =>
|
|
599
|
+
database.schema.hasIndex('workflow_runs_tenant_subject_account_idx'),
|
|
600
|
+
]),
|
|
601
|
+
},
|
|
602
|
+
{
|
|
603
|
+
id: '0009_workflows_definition_list_indexes',
|
|
604
|
+
sql: { postgresql: WORKFLOWS_MIGRATION_009_DEFINITION_LIST_INDEXES },
|
|
605
|
+
inspectExisting: (database) =>
|
|
606
|
+
migrationObjectState([
|
|
607
|
+
() =>
|
|
608
|
+
database.schema.hasIndex(
|
|
609
|
+
'workflow_definitions_tenant_lower_name_idx',
|
|
610
|
+
),
|
|
611
|
+
() =>
|
|
612
|
+
database.schema.hasIndex('workflow_definitions_tenant_updated_idx'),
|
|
613
|
+
]),
|
|
614
|
+
},
|
|
375
615
|
];
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import type { UserActor } from '@flowdular/sdk/kernel';
|
|
2
|
+
|
|
3
|
+
/* The notifications.core publish contract, declared here rather than imported.
|
|
4
|
+
notifications.core is optional: workflows.core composes, runs and settles
|
|
5
|
+
runs with that module absent, so it may not be a package dependency. This
|
|
6
|
+
mirror is the contract notifications.core owns and must not drift from it.
|
|
7
|
+
modules/agents/src/services/notifications.ts holds the same mirror and stays
|
|
8
|
+
identical to this file apart from the module id; change both. */
|
|
9
|
+
export const NOTIFICATIONS_PUBLISH_CAPABILITY = 'notifications.publish.v1';
|
|
10
|
+
|
|
11
|
+
export type NotificationKind =
|
|
12
|
+
| 'agent-run-completed'
|
|
13
|
+
| 'agent-run-failed'
|
|
14
|
+
| 'workflow-run-completed'
|
|
15
|
+
| 'workflow-run-failed'
|
|
16
|
+
| 'webhook-dead-letter'
|
|
17
|
+
| 'approval-requested'
|
|
18
|
+
| 'approval-decided'
|
|
19
|
+
| 'meter-threshold';
|
|
20
|
+
|
|
21
|
+
export interface NotificationPublishInput {
|
|
22
|
+
readonly tenantId: string;
|
|
23
|
+
readonly kind: NotificationKind;
|
|
24
|
+
readonly sourceModule: string;
|
|
25
|
+
readonly sourceRef: string;
|
|
26
|
+
readonly title: string;
|
|
27
|
+
readonly body?: string;
|
|
28
|
+
readonly recipients: readonly string[];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface NotificationPublishResult {
|
|
32
|
+
readonly inboxItemIds: readonly string[];
|
|
33
|
+
readonly deliveryIds: readonly string[];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface NotificationPublisher {
|
|
37
|
+
publish(input: NotificationPublishInput): Promise<NotificationPublishResult>;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/* Read at the point of use, never at composition time: the platform may
|
|
41
|
+
register notifications.core after workflows.core, or never. */
|
|
42
|
+
export type NotificationPublisherResolver = () => NotificationPublisher | null;
|
|
43
|
+
|
|
44
|
+
const LIMITS = {
|
|
45
|
+
sourceModule: 64,
|
|
46
|
+
sourceRef: 200,
|
|
47
|
+
title: 200,
|
|
48
|
+
body: 4_000,
|
|
49
|
+
recipients: 64,
|
|
50
|
+
recipientId: 128,
|
|
51
|
+
} as const;
|
|
52
|
+
|
|
53
|
+
function clamp(value: string, limit: number): string {
|
|
54
|
+
return value.length > limit ? value.slice(0, limit) : value;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/* The person accountable for the run. The service that enqueued it already
|
|
58
|
+
derived and validated one: the member who started the run, or the member who
|
|
59
|
+
configured the service identity that did. A run with no person behind it,
|
|
60
|
+
such as one an agent started for itself, has nobody to notify. */
|
|
61
|
+
export function runNotificationRecipients(
|
|
62
|
+
authorizationSubject: UserActor | null,
|
|
63
|
+
): readonly string[] {
|
|
64
|
+
return authorizationSubject ? [authorizationSubject.id] : [];
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/* Advisory and post-commit. An absent notifications module, nobody to notify,
|
|
68
|
+
or a publisher that throws never changes a settled run, so this never
|
|
69
|
+
rejects. The caller passes the run id as sourceRef, which makes a retried
|
|
70
|
+
terminal step publish the same notification instead of a second one. */
|
|
71
|
+
export async function publishRunOutcome(
|
|
72
|
+
resolve: NotificationPublisherResolver | undefined,
|
|
73
|
+
input: NotificationPublishInput,
|
|
74
|
+
): Promise<void> {
|
|
75
|
+
if (input.recipients.length === 0) return;
|
|
76
|
+
try {
|
|
77
|
+
const publisher = resolve?.();
|
|
78
|
+
if (!publisher) return;
|
|
79
|
+
await publisher.publish({
|
|
80
|
+
tenantId: input.tenantId,
|
|
81
|
+
kind: input.kind,
|
|
82
|
+
sourceModule: clamp(input.sourceModule, LIMITS.sourceModule),
|
|
83
|
+
sourceRef: clamp(input.sourceRef, LIMITS.sourceRef),
|
|
84
|
+
title: clamp(input.title, LIMITS.title),
|
|
85
|
+
...(input.body === undefined
|
|
86
|
+
? {}
|
|
87
|
+
: { body: clamp(input.body, LIMITS.body) }),
|
|
88
|
+
recipients: input.recipients
|
|
89
|
+
.slice(0, LIMITS.recipients)
|
|
90
|
+
.map((recipient) => clamp(recipient, LIMITS.recipientId)),
|
|
91
|
+
});
|
|
92
|
+
} catch (error) {
|
|
93
|
+
console.warn(
|
|
94
|
+
`[workflows] notification publish for run ${input.sourceRef} failed:`,
|
|
95
|
+
error instanceof Error ? error.message : error,
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
} from '
|
|
2
|
+
createKeyring,
|
|
3
|
+
KeyringError,
|
|
4
|
+
keyFingerprint,
|
|
5
|
+
type Keyring,
|
|
6
|
+
} from '@flowdular/sdk/kernel';
|
|
7
7
|
import type {
|
|
8
8
|
JsonSchemaV1,
|
|
9
9
|
JsonValue,
|
|
@@ -46,21 +46,41 @@ function aad(context: {
|
|
|
46
46
|
);
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
export function decodeWorkflowPayloadKey(
|
|
49
|
+
export function decodeWorkflowPayloadKey(
|
|
50
|
+
value: string,
|
|
51
|
+
variable = 'FD_WORKFLOWS_PAYLOAD_KEY',
|
|
52
|
+
): Buffer {
|
|
50
53
|
const trimmed = value.trim();
|
|
51
54
|
const decoded = /^[0-9a-f]{64}$/i.test(trimmed)
|
|
52
55
|
? Buffer.from(trimmed, 'hex')
|
|
53
56
|
: Buffer.from(trimmed, 'base64');
|
|
54
57
|
if (decoded.length !== 32) {
|
|
55
|
-
throw new Error(
|
|
58
|
+
throw new Error(`${variable} must encode exactly 32 bytes.`);
|
|
56
59
|
}
|
|
57
60
|
return decoded;
|
|
58
61
|
}
|
|
59
62
|
|
|
60
|
-
|
|
63
|
+
/* The stored envelope spells the key id with the digest it came from. The ring
|
|
64
|
+
holds the bare fingerprint, so the prefix is added on the way out and
|
|
65
|
+
stripped on the way in; stored rows keep the format they were written in. */
|
|
66
|
+
const KEY_ID_PREFIX = 'sha256:';
|
|
67
|
+
|
|
68
|
+
export function workflowPayloadKeyId(key: Buffer): string {
|
|
69
|
+
return `${KEY_ID_PREFIX}${keyFingerprint(key)}`;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* `previous` holds the payload keys a rotation has not finished retiring. They
|
|
74
|
+
* open stored payloads; every new payload is sealed with `key`.
|
|
75
|
+
*/
|
|
76
|
+
export function createWorkflowPayloadCodec(
|
|
77
|
+
key: Buffer,
|
|
78
|
+
previous: readonly Buffer[] = [],
|
|
79
|
+
): WorkflowPayloadCodec {
|
|
61
80
|
if (key.length !== 32)
|
|
62
81
|
throw new Error('Workflow payload encryption requires 32 bytes.');
|
|
63
|
-
const
|
|
82
|
+
const keyring: Keyring = createKeyring({ current: key, previous });
|
|
83
|
+
const keyId = `${KEY_ID_PREFIX}${keyring.keyId}`;
|
|
64
84
|
return {
|
|
65
85
|
keyId,
|
|
66
86
|
encrypt(value, context) {
|
|
@@ -68,16 +88,13 @@ export function createWorkflowPayloadCodec(key: Buffer): WorkflowPayloadCodec {
|
|
|
68
88
|
if (bytes.length > WORKFLOW_LIMITS.maxEnvelopeBytes) {
|
|
69
89
|
throw new Error('WORKFLOW_LIMIT_EXCEEDED');
|
|
70
90
|
}
|
|
71
|
-
const
|
|
72
|
-
const cipher = createCipheriv('aes-256-gcm', key, iv);
|
|
73
|
-
cipher.setAAD(aad(context));
|
|
74
|
-
const encrypted = Buffer.concat([cipher.update(bytes), cipher.final()]);
|
|
91
|
+
const sealed = keyring.seal(bytes, aad(context));
|
|
75
92
|
return [
|
|
76
93
|
'v1',
|
|
77
94
|
keyId,
|
|
78
|
-
iv.toString('base64url'),
|
|
79
|
-
|
|
80
|
-
|
|
95
|
+
sealed.iv.toString('base64url'),
|
|
96
|
+
sealed.tag.toString('base64url'),
|
|
97
|
+
sealed.ciphertext.toString('base64url'),
|
|
81
98
|
].join('.');
|
|
82
99
|
},
|
|
83
100
|
decrypt(ciphertext, context) {
|
|
@@ -85,24 +102,30 @@ export function createWorkflowPayloadCodec(key: Buffer): WorkflowPayloadCodec {
|
|
|
85
102
|
ciphertext.split('.');
|
|
86
103
|
if (
|
|
87
104
|
version !== 'v1' ||
|
|
88
|
-
storedKeyId
|
|
105
|
+
!storedKeyId?.startsWith(KEY_ID_PREFIX) ||
|
|
89
106
|
!encodedIv ||
|
|
90
107
|
!encodedTag ||
|
|
91
108
|
!encodedData
|
|
92
109
|
) {
|
|
93
110
|
throw new Error('WORKFLOW_PAYLOAD_UNREADABLE');
|
|
94
111
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
112
|
+
let clear: Buffer;
|
|
113
|
+
try {
|
|
114
|
+
clear = keyring.open(
|
|
115
|
+
{
|
|
116
|
+
keyId: storedKeyId.slice(KEY_ID_PREFIX.length),
|
|
117
|
+
iv: Buffer.from(encodedIv, 'base64url'),
|
|
118
|
+
tag: Buffer.from(encodedTag, 'base64url'),
|
|
119
|
+
ciphertext: Buffer.from(encodedData, 'base64url'),
|
|
120
|
+
},
|
|
121
|
+
aad(context),
|
|
122
|
+
);
|
|
123
|
+
} catch (error) {
|
|
124
|
+
if (error instanceof KeyringError) {
|
|
125
|
+
throw new Error('WORKFLOW_PAYLOAD_UNREADABLE', { cause: error });
|
|
126
|
+
}
|
|
127
|
+
throw error;
|
|
128
|
+
}
|
|
106
129
|
return JSON.parse(clear.toString('utf8')) as JsonValue;
|
|
107
130
|
},
|
|
108
131
|
};
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import type { DatabaseHandle } from '@flowdular/sdk/database';
|
|
2
|
+
import type { WorkflowPayloadCodec } from './payload-codec.ts';
|
|
3
|
+
|
|
4
|
+
/** Payloads re-sealed inside one tenant-scoped transaction. */
|
|
5
|
+
export const PAYLOAD_ROTATION_BATCH = 200;
|
|
6
|
+
|
|
7
|
+
export const PAYLOAD_ROTATION_TABLE = 'workflow_payloads';
|
|
8
|
+
|
|
9
|
+
export interface PayloadKeyCount {
|
|
10
|
+
readonly keyId: string;
|
|
11
|
+
readonly rows: number;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface PayloadRotationReport {
|
|
15
|
+
readonly table: string;
|
|
16
|
+
/** Key id every payload should end on: the current key of the codec. */
|
|
17
|
+
readonly currentKeyId: string;
|
|
18
|
+
readonly counts: readonly PayloadKeyCount[];
|
|
19
|
+
/** Payloads on a retired key when the run started. */
|
|
20
|
+
readonly stale: number;
|
|
21
|
+
readonly tenants: number;
|
|
22
|
+
readonly rotated: number;
|
|
23
|
+
/** Payloads a concurrent write changed between the read and the update. */
|
|
24
|
+
readonly skipped: number;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface PayloadRotationOptions {
|
|
28
|
+
/** Tenant-scoped handle. Every read and write of a payload runs on it. */
|
|
29
|
+
readonly runtime: DatabaseHandle;
|
|
30
|
+
/** Cross-tenant handle. It is granted the key ids and nothing else. */
|
|
31
|
+
readonly background: DatabaseHandle;
|
|
32
|
+
readonly codec: WorkflowPayloadCodec;
|
|
33
|
+
readonly apply?: boolean;
|
|
34
|
+
readonly batchSize?: number;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
interface StaleRow {
|
|
38
|
+
id: string;
|
|
39
|
+
run_id: string;
|
|
40
|
+
ciphertext: string;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/* Evidence rows hold a redacted preview and no ciphertext, so only execution
|
|
44
|
+
payloads carry an envelope a key can open. */
|
|
45
|
+
const SQL = {
|
|
46
|
+
counts: `SELECT encryption_key_id AS key_id, count(*) AS row_count
|
|
47
|
+
FROM workflow_payloads
|
|
48
|
+
WHERE kind = 'execution'
|
|
49
|
+
GROUP BY encryption_key_id
|
|
50
|
+
ORDER BY encryption_key_id`,
|
|
51
|
+
staleTenants: `SELECT tenant_id, count(*) AS row_count
|
|
52
|
+
FROM workflow_payloads
|
|
53
|
+
WHERE kind = 'execution' AND encryption_key_id IS DISTINCT FROM $1
|
|
54
|
+
GROUP BY tenant_id
|
|
55
|
+
ORDER BY tenant_id`,
|
|
56
|
+
/* Paged by primary key: a payload the optimistic update skipped stays stale,
|
|
57
|
+
so a query that only asked for stale rows would return it forever. */
|
|
58
|
+
staleBatch: `SELECT id, run_id, ciphertext
|
|
59
|
+
FROM workflow_payloads
|
|
60
|
+
WHERE tenant_id = $1 AND kind = 'execution'
|
|
61
|
+
AND encryption_key_id IS DISTINCT FROM $2 AND id > $3
|
|
62
|
+
ORDER BY id
|
|
63
|
+
LIMIT $4`,
|
|
64
|
+
/* The envelope the row still holds is the optimistic check. A payload is
|
|
65
|
+
written once and expired later, so a mismatch means retention or a
|
|
66
|
+
concurrent rotation reached it first. */
|
|
67
|
+
reseal: `UPDATE workflow_payloads
|
|
68
|
+
SET ciphertext = $1, encryption_key_id = $2
|
|
69
|
+
WHERE tenant_id = $3 AND id = $4 AND ciphertext = $5`,
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
function count(value: number | bigint | string): number {
|
|
73
|
+
const normalized = Number(value);
|
|
74
|
+
if (!Number.isSafeInteger(normalized)) {
|
|
75
|
+
throw new Error('The workflows database returned an invalid count.');
|
|
76
|
+
}
|
|
77
|
+
return normalized;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Re-seals every stored execution payload that is not on the current key. The
|
|
82
|
+
* inventory is read once across tenants, and each batch of payloads is read,
|
|
83
|
+
* decrypted, re-sealed and written inside one transaction scoped to the tenant
|
|
84
|
+
* that owns them. It is idempotent: a second run finds nothing to do.
|
|
85
|
+
*/
|
|
86
|
+
export async function rotateWorkflowPayloads(
|
|
87
|
+
options: PayloadRotationOptions,
|
|
88
|
+
): Promise<PayloadRotationReport> {
|
|
89
|
+
const currentKeyId = options.codec.keyId;
|
|
90
|
+
const batchSize = options.batchSize ?? PAYLOAD_ROTATION_BATCH;
|
|
91
|
+
const inventory = await options.background.transaction(
|
|
92
|
+
async (transaction) => ({
|
|
93
|
+
counts: (
|
|
94
|
+
await transaction.query<{
|
|
95
|
+
key_id: string | null;
|
|
96
|
+
row_count: number | bigint | string;
|
|
97
|
+
}>({ text: SQL.counts })
|
|
98
|
+
).rows,
|
|
99
|
+
stale: (
|
|
100
|
+
await transaction.query<{
|
|
101
|
+
tenant_id: string;
|
|
102
|
+
row_count: number | bigint | string;
|
|
103
|
+
}>({ text: SQL.staleTenants, parameters: [currentKeyId] })
|
|
104
|
+
).rows,
|
|
105
|
+
}),
|
|
106
|
+
{ access: 'read' },
|
|
107
|
+
);
|
|
108
|
+
const report = {
|
|
109
|
+
table: PAYLOAD_ROTATION_TABLE,
|
|
110
|
+
currentKeyId,
|
|
111
|
+
counts: inventory.counts.map((row) => ({
|
|
112
|
+
keyId: row.key_id ?? 'none',
|
|
113
|
+
rows: count(row.row_count),
|
|
114
|
+
})),
|
|
115
|
+
stale: inventory.stale.reduce(
|
|
116
|
+
(total, row) => total + count(row.row_count),
|
|
117
|
+
0,
|
|
118
|
+
),
|
|
119
|
+
tenants: inventory.stale.length,
|
|
120
|
+
};
|
|
121
|
+
if (options.apply !== true) {
|
|
122
|
+
return { ...report, rotated: 0, skipped: 0 };
|
|
123
|
+
}
|
|
124
|
+
let rotated = 0;
|
|
125
|
+
let skipped = 0;
|
|
126
|
+
for (const { tenant_id: tenantId } of inventory.stale) {
|
|
127
|
+
let cursor = '';
|
|
128
|
+
for (;;) {
|
|
129
|
+
const batch = await options.runtime.transaction(
|
|
130
|
+
async (transaction) => {
|
|
131
|
+
const rows = (
|
|
132
|
+
await transaction.query<StaleRow>({
|
|
133
|
+
text: SQL.staleBatch,
|
|
134
|
+
parameters: [tenantId, currentKeyId, cursor, batchSize],
|
|
135
|
+
})
|
|
136
|
+
).rows;
|
|
137
|
+
let written = 0;
|
|
138
|
+
for (const row of rows) {
|
|
139
|
+
const context = {
|
|
140
|
+
tenantId,
|
|
141
|
+
runId: row.run_id,
|
|
142
|
+
payloadId: row.id,
|
|
143
|
+
};
|
|
144
|
+
const sealed = options.codec.encrypt(
|
|
145
|
+
options.codec.decrypt(row.ciphertext, context),
|
|
146
|
+
context,
|
|
147
|
+
);
|
|
148
|
+
const result = await transaction.execute({
|
|
149
|
+
text: SQL.reseal,
|
|
150
|
+
parameters: [
|
|
151
|
+
sealed,
|
|
152
|
+
options.codec.keyId,
|
|
153
|
+
tenantId,
|
|
154
|
+
row.id,
|
|
155
|
+
row.ciphertext,
|
|
156
|
+
],
|
|
157
|
+
});
|
|
158
|
+
written += result.affectedRows;
|
|
159
|
+
}
|
|
160
|
+
return { read: rows.length, written, last: rows.at(-1)?.id };
|
|
161
|
+
},
|
|
162
|
+
{ access: 'write', tenantId },
|
|
163
|
+
);
|
|
164
|
+
rotated += batch.written;
|
|
165
|
+
skipped += batch.read - batch.written;
|
|
166
|
+
if (batch.read < batchSize || batch.last === undefined) break;
|
|
167
|
+
cursor = batch.last;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return { ...report, rotated, skipped };
|
|
171
|
+
}
|