@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
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An RFC 4180 reader for the one shape this module accepts: UTF-8, a header
|
|
3
|
+
* row, comma separated, `"` quoting with `""` for a literal quote, CRLF or LF
|
|
4
|
+
* record separators. Anything else is a refusal with a stable code rather than
|
|
5
|
+
* a guess, because a file parsed the wrong way writes the wrong records.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export type CsvErrorCode =
|
|
9
|
+
| 'CSV_EMPTY'
|
|
10
|
+
| 'CSV_HEADER_BLANK'
|
|
11
|
+
| 'CSV_HEADER_DUPLICATE'
|
|
12
|
+
| 'CSV_NOT_UTF8'
|
|
13
|
+
| 'CSV_QUOTE_UNTERMINATED'
|
|
14
|
+
| 'CSV_QUOTE_UNEXPECTED'
|
|
15
|
+
| 'CSV_TOO_LARGE'
|
|
16
|
+
| 'CSV_TOO_MANY_ROWS';
|
|
17
|
+
|
|
18
|
+
export class CsvError extends Error {
|
|
19
|
+
constructor(
|
|
20
|
+
readonly code: CsvErrorCode,
|
|
21
|
+
message: string,
|
|
22
|
+
) {
|
|
23
|
+
super(message);
|
|
24
|
+
this.name = 'CsvError';
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface CsvRow {
|
|
29
|
+
/** 1-based data row number, header excluded. */
|
|
30
|
+
readonly row: number;
|
|
31
|
+
readonly cells: readonly string[];
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface CsvDocument {
|
|
35
|
+
readonly header: readonly string[];
|
|
36
|
+
readonly rows: readonly CsvRow[];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface CsvLimits {
|
|
40
|
+
/** Bytes of encoded CSV; the stream is abandoned the moment it passes this. */
|
|
41
|
+
readonly maxBytes: number;
|
|
42
|
+
/** Data rows, header excluded. */
|
|
43
|
+
readonly maxRows: number;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const BOM = '';
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Reads at most `maxBytes` and refuses anything longer, so a hostile body costs
|
|
50
|
+
* the cap rather than the file. The whole CSV is held in memory on purpose: the
|
|
51
|
+
* cap is 25 MB, one job's rows are held anyway, and a streaming parser would
|
|
52
|
+
* buy nothing against a bound this small.
|
|
53
|
+
*/
|
|
54
|
+
export async function readCsvBody(
|
|
55
|
+
body: ReadableStream<Uint8Array>,
|
|
56
|
+
maxBytes: number,
|
|
57
|
+
): Promise<Uint8Array> {
|
|
58
|
+
const reader = body.getReader();
|
|
59
|
+
const chunks: Uint8Array[] = [];
|
|
60
|
+
let total = 0;
|
|
61
|
+
try {
|
|
62
|
+
for (;;) {
|
|
63
|
+
const { done, value } = await reader.read();
|
|
64
|
+
if (done) break;
|
|
65
|
+
if (!value) continue;
|
|
66
|
+
total += value.byteLength;
|
|
67
|
+
if (total > maxBytes) {
|
|
68
|
+
throw new CsvError(
|
|
69
|
+
'CSV_TOO_LARGE',
|
|
70
|
+
`The file is larger than ${maxBytes} bytes.`,
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
chunks.push(value);
|
|
74
|
+
}
|
|
75
|
+
} finally {
|
|
76
|
+
reader.releaseLock();
|
|
77
|
+
/* The body is abandoned on a refusal as well, so a producer blocked on
|
|
78
|
+
backpressure is released rather than left holding the connection. */
|
|
79
|
+
await body.cancel().catch(() => undefined);
|
|
80
|
+
}
|
|
81
|
+
const bytes = new Uint8Array(total);
|
|
82
|
+
let offset = 0;
|
|
83
|
+
for (const chunk of chunks) {
|
|
84
|
+
bytes.set(chunk, offset);
|
|
85
|
+
offset += chunk.byteLength;
|
|
86
|
+
}
|
|
87
|
+
return bytes;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export function decodeCsv(bytes: Uint8Array): string {
|
|
91
|
+
let text: string;
|
|
92
|
+
try {
|
|
93
|
+
text = new TextDecoder('utf-8', { fatal: true }).decode(bytes);
|
|
94
|
+
} catch {
|
|
95
|
+
throw new CsvError('CSV_NOT_UTF8', 'The file is not valid UTF-8 text.');
|
|
96
|
+
}
|
|
97
|
+
return text.startsWith(BOM) ? text.slice(BOM.length) : text;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/* One pass, no regular expressions and no per-character array: O(n) in the
|
|
101
|
+
characters of the file and O(1) beyond the cells it produces.
|
|
102
|
+
|
|
103
|
+
A cell is cut out of the source text rather than appended character by
|
|
104
|
+
character: appending leaves every cell a tree of cons strings whose retained
|
|
105
|
+
size is an order of magnitude past the file (measured 124 MB of heap for a
|
|
106
|
+
5 MB CSV against 8.7 MB for these slices). `pending` carries only the pieces
|
|
107
|
+
a doubled quote forces this reader to join. */
|
|
108
|
+
function parseRecords(text: string, maxRows: number): string[][] {
|
|
109
|
+
const records: string[][] = [];
|
|
110
|
+
let cells: string[] = [];
|
|
111
|
+
let start = 0;
|
|
112
|
+
let pending = '';
|
|
113
|
+
let quoted = false;
|
|
114
|
+
let started = false;
|
|
115
|
+
let index = 0;
|
|
116
|
+
|
|
117
|
+
/** Whether the cell being read has taken no character yet. */
|
|
118
|
+
const empty = () => pending === '' && start === index;
|
|
119
|
+
const endField = () => {
|
|
120
|
+
cells.push(
|
|
121
|
+
pending === ''
|
|
122
|
+
? text.slice(start, index)
|
|
123
|
+
: pending + text.slice(start, index),
|
|
124
|
+
);
|
|
125
|
+
pending = '';
|
|
126
|
+
started = true;
|
|
127
|
+
};
|
|
128
|
+
const endRecord = () => {
|
|
129
|
+
endField();
|
|
130
|
+
records.push(cells);
|
|
131
|
+
cells = [];
|
|
132
|
+
started = false;
|
|
133
|
+
/* The header is the first record, so the data bound is one past it. */
|
|
134
|
+
if (records.length > maxRows + 1) {
|
|
135
|
+
throw new CsvError(
|
|
136
|
+
'CSV_TOO_MANY_ROWS',
|
|
137
|
+
`The file holds more than ${maxRows} rows.`,
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
|
|
142
|
+
while (index < text.length) {
|
|
143
|
+
const character = text[index]!;
|
|
144
|
+
if (quoted) {
|
|
145
|
+
if (character !== '"') {
|
|
146
|
+
index += 1;
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
if (text[index + 1] === '"') {
|
|
150
|
+
/* The pair's first quote closes the piece and is the one literal
|
|
151
|
+
character the cell keeps. */
|
|
152
|
+
pending += text.slice(start, index + 1);
|
|
153
|
+
index += 2;
|
|
154
|
+
start = index;
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
pending =
|
|
158
|
+
pending === ''
|
|
159
|
+
? text.slice(start, index)
|
|
160
|
+
: pending + text.slice(start, index);
|
|
161
|
+
quoted = false;
|
|
162
|
+
index += 1;
|
|
163
|
+
start = index;
|
|
164
|
+
/* Only a separator may follow a closing quote. `a"b"c` is a file whose
|
|
165
|
+
author meant something this reader cannot know. */
|
|
166
|
+
const next = text[index];
|
|
167
|
+
if (
|
|
168
|
+
next !== undefined &&
|
|
169
|
+
next !== ',' &&
|
|
170
|
+
next !== '\n' &&
|
|
171
|
+
next !== '\r'
|
|
172
|
+
) {
|
|
173
|
+
throw new CsvError(
|
|
174
|
+
'CSV_QUOTE_UNEXPECTED',
|
|
175
|
+
`Unexpected text after a closing quote at offset ${index}.`,
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
if (character === '"') {
|
|
181
|
+
if (!empty()) {
|
|
182
|
+
throw new CsvError(
|
|
183
|
+
'CSV_QUOTE_UNEXPECTED',
|
|
184
|
+
`A quote may only open a field, at offset ${index}.`,
|
|
185
|
+
);
|
|
186
|
+
}
|
|
187
|
+
quoted = true;
|
|
188
|
+
started = true;
|
|
189
|
+
index += 1;
|
|
190
|
+
start = index;
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
if (character === ',') {
|
|
194
|
+
endField();
|
|
195
|
+
index += 1;
|
|
196
|
+
start = index;
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
if (character === '\r' || character === '\n') {
|
|
200
|
+
endRecord();
|
|
201
|
+
index += character === '\r' && text[index + 1] === '\n' ? 2 : 1;
|
|
202
|
+
start = index;
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
started = true;
|
|
206
|
+
index += 1;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
if (quoted) {
|
|
210
|
+
throw new CsvError(
|
|
211
|
+
'CSV_QUOTE_UNTERMINATED',
|
|
212
|
+
'A quoted field is never closed.',
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
/* A file ending in a newline has no trailing empty record; one ending in
|
|
216
|
+
text does have a last record. */
|
|
217
|
+
if (started || !empty() || cells.length > 0) endRecord();
|
|
218
|
+
return records;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* Header cells are trimmed because whitespace around a column name is never
|
|
223
|
+
* what the author meant, and a mapping keyed on `" email"` would silently miss.
|
|
224
|
+
* Data cells keep every character they carried.
|
|
225
|
+
*/
|
|
226
|
+
export function parseCsv(text: string, limits: CsvLimits): CsvDocument {
|
|
227
|
+
const records = parseRecords(text, limits.maxRows);
|
|
228
|
+
const headerRecord = records[0];
|
|
229
|
+
if (!headerRecord || (headerRecord.length === 1 && headerRecord[0] === '')) {
|
|
230
|
+
throw new CsvError('CSV_EMPTY', 'The file carries no header row.');
|
|
231
|
+
}
|
|
232
|
+
const header = headerRecord.map((cell) => cell.trim());
|
|
233
|
+
const seen = new Set<string>();
|
|
234
|
+
for (const name of header) {
|
|
235
|
+
if (name === '') {
|
|
236
|
+
throw new CsvError('CSV_HEADER_BLANK', 'A column header is blank.');
|
|
237
|
+
}
|
|
238
|
+
if (seen.has(name)) {
|
|
239
|
+
throw new CsvError(
|
|
240
|
+
'CSV_HEADER_DUPLICATE',
|
|
241
|
+
`The column ${name} appears more than once.`,
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
seen.add(name);
|
|
245
|
+
}
|
|
246
|
+
const rows: CsvRow[] = [];
|
|
247
|
+
for (let index = 1; index < records.length; index += 1) {
|
|
248
|
+
rows.push({ row: index, cells: records[index]! });
|
|
249
|
+
}
|
|
250
|
+
return { header, rows };
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
export async function readCsv(
|
|
254
|
+
body: ReadableStream<Uint8Array>,
|
|
255
|
+
limits: CsvLimits,
|
|
256
|
+
): Promise<CsvDocument> {
|
|
257
|
+
return parseCsv(decodeCsv(await readCsvBody(body, limits.maxBytes)), limits);
|
|
258
|
+
}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import type { AuthPrincipal } from '@flowdular/sdk/modules/auth';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The public cross-module surface. A module that owns records registers its own
|
|
5
|
+
* import targets while it composes:
|
|
6
|
+
* `context.capabilities.get<ImportPorts>(IMPORT_PORTS_CAPABILITY)?.register(...)`.
|
|
7
|
+
*
|
|
8
|
+
* import.core never writes another module's records. It parses the CSV, maps
|
|
9
|
+
* the columns, checks the port's declared permission on the acting principal
|
|
10
|
+
* and then hands bounded batches of rows to the port, which applies its own
|
|
11
|
+
* invariants, its own natural key and its own tenant-scoped transaction.
|
|
12
|
+
*/
|
|
13
|
+
export const IMPORT_PORTS_CAPABILITY = 'import.ports.v1';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* What a field holds. The type is the port's declaration of shape, not its
|
|
17
|
+
* validation: import.core refuses a cell that cannot be that type at all, and
|
|
18
|
+
* the port still decides what a well-shaped value means.
|
|
19
|
+
*/
|
|
20
|
+
export const IMPORT_FIELD_TYPES = [
|
|
21
|
+
'string',
|
|
22
|
+
'integer',
|
|
23
|
+
'boolean',
|
|
24
|
+
'date',
|
|
25
|
+
'email',
|
|
26
|
+
] as const;
|
|
27
|
+
export type ImportFieldType = (typeof IMPORT_FIELD_TYPES)[number];
|
|
28
|
+
|
|
29
|
+
/** How a row that already exists under the port's natural key is treated. */
|
|
30
|
+
export const IMPORT_MODES = [
|
|
31
|
+
'create-only',
|
|
32
|
+
'update-existing',
|
|
33
|
+
'skip-existing',
|
|
34
|
+
] as const;
|
|
35
|
+
export type ImportMode = (typeof IMPORT_MODES)[number];
|
|
36
|
+
|
|
37
|
+
export interface ImportField {
|
|
38
|
+
readonly id: string;
|
|
39
|
+
readonly label: string;
|
|
40
|
+
readonly required: boolean;
|
|
41
|
+
readonly type: ImportFieldType;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* One CSV row after mapping. `row` is the 1-based data row number with the
|
|
46
|
+
* header excluded, so it is the number the reader counts in their file, and
|
|
47
|
+
* every verdict and outcome refers back to it. Values are the raw cell text
|
|
48
|
+
* keyed by field id; a column the mapping did not name is absent rather than
|
|
49
|
+
* empty, so a port can tell "not supplied" from "supplied blank".
|
|
50
|
+
*/
|
|
51
|
+
export interface ImportRow {
|
|
52
|
+
readonly row: number;
|
|
53
|
+
readonly values: Readonly<Record<string, string>>;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export interface ImportValidateInput {
|
|
57
|
+
readonly tenantId: string;
|
|
58
|
+
/**
|
|
59
|
+
* The principal that started the job, as it stood at that moment. A port
|
|
60
|
+
* checks its own record-level conditions against it; the declared
|
|
61
|
+
* `permission` is already checked by import.core before this call.
|
|
62
|
+
*/
|
|
63
|
+
readonly principal: AuthPrincipal;
|
|
64
|
+
readonly rows: readonly ImportRow[];
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* One verdict per row. A port may answer fewer entries than it was given; a row
|
|
69
|
+
* it says nothing about is taken as valid, because a port reports what it
|
|
70
|
+
* refuses rather than restating what it accepts.
|
|
71
|
+
*/
|
|
72
|
+
export interface ImportValidation {
|
|
73
|
+
readonly row: number;
|
|
74
|
+
readonly verdict: 'valid' | 'invalid';
|
|
75
|
+
readonly field?: string;
|
|
76
|
+
readonly reason?: string;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export interface ImportWriteInput {
|
|
80
|
+
readonly tenantId: string;
|
|
81
|
+
readonly principal: AuthPrincipal;
|
|
82
|
+
readonly rows: readonly ImportRow[];
|
|
83
|
+
readonly mode: ImportMode;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* One outcome per row. A row the port says nothing about is recorded as failed
|
|
88
|
+
* with a stable reason rather than silently counted as written: a port that
|
|
89
|
+
* drops a row has to be visible in the job.
|
|
90
|
+
*/
|
|
91
|
+
export interface ImportWriteOutcome {
|
|
92
|
+
readonly row: number;
|
|
93
|
+
readonly outcome: 'created' | 'updated' | 'skipped' | 'failed';
|
|
94
|
+
readonly recordRef?: string;
|
|
95
|
+
readonly reason?: string;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* One import target. The target id a job names is `<moduleId>.<key>`, for
|
|
100
|
+
* example `users.core.members`.
|
|
101
|
+
*
|
|
102
|
+
* Guaranteed to the port: `validate` runs before any `write`; `write` is called
|
|
103
|
+
* only for rows the port itself called valid; both are called with batches no
|
|
104
|
+
* larger than the platform `batchSize` setting, in ascending row order, and
|
|
105
|
+
* never concurrently for one job. Deliberately unspecified: how many batches a
|
|
106
|
+
* job takes, whether two jobs of one workspace overlap, and how long the gap
|
|
107
|
+
* between validate and write is, so a port must not carry state between calls.
|
|
108
|
+
*/
|
|
109
|
+
export interface ImportPort {
|
|
110
|
+
readonly key: string;
|
|
111
|
+
readonly label: string;
|
|
112
|
+
/** The target module's own permission; import never widens what a member may write. */
|
|
113
|
+
readonly permission: string;
|
|
114
|
+
readonly fields: readonly ImportField[];
|
|
115
|
+
/** The fields whose values make a repeat idempotent. */
|
|
116
|
+
readonly naturalKey: readonly string[];
|
|
117
|
+
/**
|
|
118
|
+
* The natural key of one row as this port compares two records of its own.
|
|
119
|
+
* import.core refuses a row repeating an earlier row's key across the whole
|
|
120
|
+
* file, and only the port knows what two values mean to it: an address it
|
|
121
|
+
* stores folded matches whatever case the file carries. Left out, the key
|
|
122
|
+
* fields are compared exactly, length prefixed so two fields cannot run into
|
|
123
|
+
* one another.
|
|
124
|
+
*/
|
|
125
|
+
naturalKeyOf?(values: ImportRow['values']): string;
|
|
126
|
+
validate(input: ImportValidateInput): Promise<readonly ImportValidation[]>;
|
|
127
|
+
write(input: ImportWriteInput): Promise<readonly ImportWriteOutcome[]>;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export interface ImportPorts {
|
|
131
|
+
/**
|
|
132
|
+
* Registers a module's targets. Registration is open while the platform
|
|
133
|
+
* composes and sealed before the first request; a later call throws, so the
|
|
134
|
+
* set of targets a workspace can choose from never changes under it.
|
|
135
|
+
*/
|
|
136
|
+
register(moduleId: string, ports: readonly ImportPort[]): void;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/** Longest values a port declaration may carry; over any of them is refused. */
|
|
140
|
+
export const IMPORT_PORT_LIMITS = {
|
|
141
|
+
moduleId: 64,
|
|
142
|
+
key: 48,
|
|
143
|
+
target: 96,
|
|
144
|
+
label: 120,
|
|
145
|
+
permission: 96,
|
|
146
|
+
fieldId: 64,
|
|
147
|
+
fieldLabel: 120,
|
|
148
|
+
fields: 64,
|
|
149
|
+
naturalKey: 8,
|
|
150
|
+
portsPerModule: 32,
|
|
151
|
+
reason: 200,
|
|
152
|
+
recordRef: 200,
|
|
153
|
+
} as const;
|
|
154
|
+
|
|
155
|
+
export function importTargetId(moduleId: string, key: string): string {
|
|
156
|
+
return `${moduleId}.${key}`;
|
|
157
|
+
}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import type { ImportMode } from './ports.ts';
|
|
2
|
+
|
|
3
|
+
/** The stages a job moves through; the transitions live in the service. */
|
|
4
|
+
export const IMPORT_JOB_STATUSES = [
|
|
5
|
+
'parsing',
|
|
6
|
+
'validated',
|
|
7
|
+
'writing',
|
|
8
|
+
'completed',
|
|
9
|
+
'failed',
|
|
10
|
+
'cancelled',
|
|
11
|
+
] as const;
|
|
12
|
+
export type ImportJobStatus = (typeof IMPORT_JOB_STATUSES)[number];
|
|
13
|
+
|
|
14
|
+
/** What one row ended as. The first two are verdicts, the rest are writes. */
|
|
15
|
+
export const IMPORT_ROW_OUTCOMES = [
|
|
16
|
+
'valid',
|
|
17
|
+
'invalid',
|
|
18
|
+
'created',
|
|
19
|
+
'updated',
|
|
20
|
+
'skipped',
|
|
21
|
+
'failed',
|
|
22
|
+
] as const;
|
|
23
|
+
export type ImportRowOutcome = (typeof IMPORT_ROW_OUTCOMES)[number];
|
|
24
|
+
|
|
25
|
+
/** Longest values this module accepts; over any of them is a rejection. */
|
|
26
|
+
export const IMPORT_LIMITS = {
|
|
27
|
+
id: 64,
|
|
28
|
+
target: 96,
|
|
29
|
+
documentId: 128,
|
|
30
|
+
accountId: 128,
|
|
31
|
+
field: 64,
|
|
32
|
+
reason: 200,
|
|
33
|
+
recordRef: 200,
|
|
34
|
+
failureCode: 64,
|
|
35
|
+
/** Serialized principal snapshot and column mapping, matching the schema. */
|
|
36
|
+
json: 8_192,
|
|
37
|
+
/** Rows one outcome page may carry; the platform page ceiling. */
|
|
38
|
+
page: 200,
|
|
39
|
+
/** Jobs one routing pass considers. */
|
|
40
|
+
routingPage: 25,
|
|
41
|
+
} as const;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* The CSV bound the spec fixes. It is not a setting: the storage port refuses a
|
|
45
|
+
* larger object at upload, so raising it here would only move the refusal.
|
|
46
|
+
*/
|
|
47
|
+
export const IMPORT_MAX_CSV_BYTES = 25 * 1024 * 1024;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* The one content type an import source may carry. The screen uploads under it,
|
|
51
|
+
* the start request refuses anything else, and the stage that opens the file
|
|
52
|
+
* decides the same way, so a document refused at start is never a document a
|
|
53
|
+
* stage goes on to read.
|
|
54
|
+
*/
|
|
55
|
+
export const IMPORT_CSV_CONTENT_TYPE = 'text/csv';
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* The acting principal as it stood when the job was started, kept so the port
|
|
59
|
+
* sees the same identity in a later stage that it would have seen in the
|
|
60
|
+
* request. Authorization is decided on the live principal at start and at
|
|
61
|
+
* continue; this snapshot carries the decision forward, it does not make one.
|
|
62
|
+
*/
|
|
63
|
+
export interface ImportRequester {
|
|
64
|
+
readonly accountId: string;
|
|
65
|
+
readonly email: string;
|
|
66
|
+
readonly displayName: string;
|
|
67
|
+
readonly role: string;
|
|
68
|
+
readonly scopes: readonly string[];
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export interface ImportJob {
|
|
72
|
+
readonly id: string;
|
|
73
|
+
readonly tenantId: string;
|
|
74
|
+
readonly target: string;
|
|
75
|
+
readonly documentId: string;
|
|
76
|
+
/**
|
|
77
|
+
* The record reference the CSV was uploaded against. documents.core
|
|
78
|
+
* addresses an attachment by owner module, record reference and id, so the
|
|
79
|
+
* job carries the reference its `documentId` is only resolvable under.
|
|
80
|
+
*/
|
|
81
|
+
readonly documentRef: string;
|
|
82
|
+
readonly mode: ImportMode;
|
|
83
|
+
readonly dryRun: boolean;
|
|
84
|
+
/** Whether `continue` asked for the valid rows alone. */
|
|
85
|
+
readonly validOnly: boolean;
|
|
86
|
+
readonly status: ImportJobStatus;
|
|
87
|
+
readonly totalRows: number;
|
|
88
|
+
readonly validRows: number;
|
|
89
|
+
readonly writtenRows: number;
|
|
90
|
+
readonly failedRows: number;
|
|
91
|
+
readonly requesterAccountId: string;
|
|
92
|
+
readonly requester: ImportRequester;
|
|
93
|
+
/** Port field id to CSV header, as the job was started with. */
|
|
94
|
+
readonly columns: Readonly<Record<string, string>>;
|
|
95
|
+
/** The stable code behind a failed job; null in every other status. */
|
|
96
|
+
readonly failureCode: string | null;
|
|
97
|
+
readonly claimedAt: number | null;
|
|
98
|
+
readonly startedAt: number;
|
|
99
|
+
readonly completedAt: number | null;
|
|
100
|
+
/**
|
|
101
|
+
* The trace that enqueued the job, as a `traceparent` header value. Null
|
|
102
|
+
* when the job was started outside a traced scope, which the claim reads as
|
|
103
|
+
* a new root.
|
|
104
|
+
*/
|
|
105
|
+
readonly traceparent: string | null;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* A job as the poll loop holds it. The claim instant is the fence every renewal
|
|
110
|
+
* of that claim is made under, so a stage can tell that its lease lapsed and the
|
|
111
|
+
* job changed hands.
|
|
112
|
+
*/
|
|
113
|
+
export type ClaimedImportJob = ImportJob & { readonly claimedAt: number };
|
|
114
|
+
|
|
115
|
+
/** What a stage records when the failure carries no stable code of its own. */
|
|
116
|
+
export const IMPORT_UNEXPECTED_FAILURE = 'JOB_FAILED';
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* The job as an API response carries it. The requester snapshot is bookkeeping
|
|
120
|
+
* a port needs in a background stage and no reader of the screen does, and the
|
|
121
|
+
* claim and the trace it was enqueued in are the poll loop's own, so none of
|
|
122
|
+
* them crosses the wire: a job read names the requester by account id alone.
|
|
123
|
+
*/
|
|
124
|
+
export type ImportJobView = Omit<
|
|
125
|
+
ImportJob,
|
|
126
|
+
'requester' | 'claimedAt' | 'traceparent'
|
|
127
|
+
>;
|
|
128
|
+
|
|
129
|
+
/* Every field is named rather than spread, so a field added to the job is a
|
|
130
|
+
decision taken here instead of an addition the wire makes silently. */
|
|
131
|
+
export function importJobView(job: ImportJob): ImportJobView {
|
|
132
|
+
return {
|
|
133
|
+
id: job.id,
|
|
134
|
+
tenantId: job.tenantId,
|
|
135
|
+
target: job.target,
|
|
136
|
+
documentId: job.documentId,
|
|
137
|
+
documentRef: job.documentRef,
|
|
138
|
+
mode: job.mode,
|
|
139
|
+
dryRun: job.dryRun,
|
|
140
|
+
validOnly: job.validOnly,
|
|
141
|
+
status: job.status,
|
|
142
|
+
totalRows: job.totalRows,
|
|
143
|
+
validRows: job.validRows,
|
|
144
|
+
writtenRows: job.writtenRows,
|
|
145
|
+
failedRows: job.failedRows,
|
|
146
|
+
requesterAccountId: job.requesterAccountId,
|
|
147
|
+
columns: job.columns,
|
|
148
|
+
failureCode: job.failureCode,
|
|
149
|
+
startedAt: job.startedAt,
|
|
150
|
+
completedAt: job.completedAt,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export interface ImportJobRow {
|
|
155
|
+
readonly id: string;
|
|
156
|
+
readonly tenantId: string;
|
|
157
|
+
readonly jobId: string;
|
|
158
|
+
readonly rowNumber: number;
|
|
159
|
+
readonly outcome: ImportRowOutcome;
|
|
160
|
+
readonly field: string | null;
|
|
161
|
+
readonly reason: string | null;
|
|
162
|
+
readonly recordRef: string | null;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
export interface ImportMapping {
|
|
166
|
+
readonly id: string;
|
|
167
|
+
readonly tenantId: string;
|
|
168
|
+
readonly target: string;
|
|
169
|
+
readonly columns: Readonly<Record<string, string>>;
|
|
170
|
+
readonly updatedAt: number;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/** What the cross-tenant routing read may see, and nothing else. */
|
|
174
|
+
export interface ImportJobRouting {
|
|
175
|
+
readonly tenantId: string;
|
|
176
|
+
readonly id: string;
|
|
177
|
+
readonly status: ImportJobStatus;
|
|
178
|
+
readonly startedAt: number;
|
|
179
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { ModuleManifest, RegisteredModule } from '@flowdular/sdk/contracts';
|
|
2
|
+
import manifest from '../module.json' with { type: 'json' };
|
|
3
|
+
import { IMPORT_PERMISSIONS } from './acl/permissions.ts';
|
|
4
|
+
|
|
5
|
+
export const moduleDefinition = {
|
|
6
|
+
manifest: manifest as ModuleManifest,
|
|
7
|
+
navigation: [
|
|
8
|
+
{
|
|
9
|
+
id: 'import.navigation',
|
|
10
|
+
label: 'Imports',
|
|
11
|
+
href: '/imports',
|
|
12
|
+
order: 60,
|
|
13
|
+
permission: IMPORT_PERMISSIONS.read,
|
|
14
|
+
},
|
|
15
|
+
],
|
|
16
|
+
permissions: Object.values(IMPORT_PERMISSIONS),
|
|
17
|
+
} satisfies RegisteredModule;
|
|
18
|
+
|
|
19
|
+
export { IMPORT_PERMISSIONS } from './acl/permissions.ts';
|
|
20
|
+
|
|
21
|
+
/* The cross-module contract. A module that owns records imports the identifier
|
|
22
|
+
and the types from here and registers its targets through the capability
|
|
23
|
+
registry; nothing else in this module is meant to be imported by another. */
|
|
24
|
+
export {
|
|
25
|
+
IMPORT_FIELD_TYPES,
|
|
26
|
+
IMPORT_MODES,
|
|
27
|
+
IMPORT_PORTS_CAPABILITY,
|
|
28
|
+
IMPORT_PORT_LIMITS,
|
|
29
|
+
importTargetId,
|
|
30
|
+
} from './domain/ports.ts';
|
|
31
|
+
export type {
|
|
32
|
+
ImportField,
|
|
33
|
+
ImportFieldType,
|
|
34
|
+
ImportMode,
|
|
35
|
+
ImportPort,
|
|
36
|
+
ImportPorts,
|
|
37
|
+
ImportRow,
|
|
38
|
+
ImportValidateInput,
|
|
39
|
+
ImportValidation,
|
|
40
|
+
ImportWriteInput,
|
|
41
|
+
ImportWriteOutcome,
|
|
42
|
+
} from './domain/ports.ts';
|
|
43
|
+
|
|
44
|
+
export {
|
|
45
|
+
IMPORT_CSV_CONTENT_TYPE,
|
|
46
|
+
IMPORT_JOB_STATUSES,
|
|
47
|
+
IMPORT_LIMITS,
|
|
48
|
+
IMPORT_MAX_CSV_BYTES,
|
|
49
|
+
IMPORT_ROW_OUTCOMES,
|
|
50
|
+
} from './domain/types.ts';
|
|
51
|
+
export type {
|
|
52
|
+
ClaimedImportJob,
|
|
53
|
+
ImportJob,
|
|
54
|
+
ImportJobRow,
|
|
55
|
+
ImportJobStatus,
|
|
56
|
+
ImportMapping,
|
|
57
|
+
ImportRowOutcome,
|
|
58
|
+
} from './domain/types.ts';
|