@flowdular/sdk 0.2.4 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.ai/agents/sandbox/business-manager.md +5 -1
- package/.ai/blueprints/author-spec/README.md +1 -1
- package/.ai/blueprints/author-spec/spec-requirements.yaml +44 -0
- package/.ai/blueprints/author-spec/steps.yaml +5 -5
- package/.ai/blueprints/author-spec/templates/module.yaml +99 -3
- package/.ai/blueprints/edit-module/gates.yaml +4 -0
- package/.ai/blueprints/edit-module/required-files.yaml +9 -0
- package/.ai/blueprints/new-module/gates.yaml +4 -0
- package/.ai/blueprints/new-module/spec-requirements.yaml +2 -2
- package/.ai/blueprints/release/gates.yaml +4 -0
- package/.ai/platform-capabilities.md +128 -0
- package/.ai/policies/capabilities.yaml +100 -0
- package/.ai/policies/path-ownership.yaml +5 -2
- package/.ai/policies/task-budgets.yaml +5 -3
- package/.ai/references/catalog/module.json +4 -4
- package/.ai/references/catalog/package.json +2 -2
- package/.ai/references/catalog/spec/module.yaml +5 -3
- package/.ai/references/catalog/src/platform.ts +2 -0
- package/.ai/references/catalog/src/services/catalog-service.ts +89 -1
- package/.ai/references/catalog/src/services/data-classes.ts +47 -0
- package/.ai/references/catalog/src/services/database-repository.ts +98 -1
- package/.ai/references/catalog/src/services/repository.ts +22 -1
- package/.ai/references/catalog/tests/data-classes.test.ts +157 -0
- package/.ai/references/catalog.provenance.json +12 -10
- package/.ai/skills/README.md +10 -0
- package/.ai/skills/agent-tool-design/SKILL.md +1 -2
- package/.ai/skills/auth-security-review/SKILL.md +1 -1
- package/.ai/skills/business-agent-design/SKILL.md +0 -1
- package/.ai/skills/deploy-operate/SKILL.md +114 -0
- package/.ai/skills/module-new/SKILL.md +29 -3
- package/.ai/skills/module-update/SKILL.md +9 -3
- package/.ai/skills/perf-audit/SKILL.md +0 -1
- package/.ai/skills/release-eject-pr/SKILL.md +0 -1
- package/.ai/skills/spec-interview/SKILL.md +120 -0
- package/.ai/skills/test-hardening/SKILL.md +1 -0
- package/.ai/skills/ux-design/SKILL.md +34 -3
- package/.ai/skills/variables/SKILL.md +0 -2
- package/.ai/skills/workflow-development/SKILL.md +0 -1
- package/AGENTS.md +4 -0
- package/docs/agent-contract.md +2 -2
- package/docs/design-system.md +185 -31
- package/modules/access/migrations/0001_access_core.down.sql +1 -0
- package/modules/access/migrations/0001_access_core.up.sql +28 -0
- package/modules/access/migrations/README.md +3 -0
- package/modules/access/module.json +33 -0
- package/modules/access/package.json +43 -0
- package/modules/access/spec/module.yaml +225 -0
- package/modules/access/src/acl/permissions.ts +6 -0
- package/modules/access/src/api/endpoints.ts +244 -0
- package/modules/access/src/client/ActivityView.tsrx +245 -0
- package/modules/access/src/client/AttestationsView.tsrx +176 -0
- package/modules/access/src/client/ReviewView.tsrx +586 -0
- package/modules/access/src/client/api.ts +132 -0
- package/modules/access/src/client/contribution.tsrx +41 -0
- package/modules/access/src/client/index.ts +41 -0
- package/modules/access/src/client/navigation.ts +57 -0
- package/modules/access/src/client/presentation.ts +69 -0
- package/modules/access/src/client/state.ts +72 -0
- package/modules/access/src/domain/types.ts +189 -0
- package/modules/access/src/index.ts +38 -0
- package/modules/access/src/platform.ts +60 -0
- package/modules/access/src/server/index.ts +42 -0
- package/modules/access/src/server/runtime.ts +105 -0
- package/modules/access/src/services/access-service.ts +298 -0
- package/modules/access/src/services/audit-window.ts +78 -0
- package/modules/access/src/services/auth-directory.ts +72 -0
- package/modules/access/src/services/changes.ts +91 -0
- package/modules/access/src/services/data-classes.ts +28 -0
- package/modules/access/src/services/database-repository.ts +185 -0
- package/modules/access/src/services/directory.ts +102 -0
- package/modules/access/src/services/index.ts +33 -0
- package/modules/access/src/services/list-exports.ts +150 -0
- package/modules/access/src/services/migration.ts +54 -0
- package/modules/access/src/services/repository.ts +30 -0
- package/modules/access/src/services/review.ts +178 -0
- package/modules/access/translations/en.json +155 -0
- package/modules/access/translations/pl.json +155 -0
- package/modules/agents/migrations/0022_credential_rotation_inventory.down.sql +2 -0
- package/modules/agents/migrations/0022_credential_rotation_inventory.up.sql +7 -0
- package/modules/agents/migrations/0023_agents_retention_indexes.down.sql +2 -0
- package/modules/agents/migrations/0023_agents_retention_indexes.up.sql +9 -0
- package/modules/agents/migrations/0024_agent_meter_refusals.down.sql +3 -0
- package/modules/agents/migrations/0024_agent_meter_refusals.up.sql +22 -0
- package/modules/agents/migrations/0025_agent_list_indexes.down.sql +3 -0
- package/modules/agents/migrations/0025_agent_list_indexes.up.sql +11 -0
- package/modules/agents/module.json +30 -4
- package/modules/agents/package.json +2 -1
- package/modules/agents/spec/module.yaml +63 -5
- package/modules/agents/src/api/endpoints.ts +291 -33
- package/modules/agents/src/cli/commands.json +11 -0
- package/modules/agents/src/cli/index.ts +45 -0
- package/modules/agents/src/client/AgentDashboardWidget.tsrx +19 -11
- package/modules/agents/src/client/AgentDefinitionList.tsrx +53 -10
- package/modules/agents/src/client/AgentPlaygroundView.tsrx +4 -4
- package/modules/agents/src/client/AgentProceduresView.tsrx +2 -2
- package/modules/agents/src/client/AgentRunsView.tsrx +143 -40
- package/modules/agents/src/client/AgentsView.tsrx +109 -33
- package/modules/agents/src/client/api.ts +99 -21
- package/modules/agents/src/client/state.ts +97 -0
- package/modules/agents/src/domain/types.ts +44 -4
- package/modules/agents/src/platform.ts +42 -0
- package/modules/agents/src/server/action-execution.ts +201 -106
- package/modules/agents/src/server/runtime.ts +32 -0
- package/modules/agents/src/services/agent-service.ts +158 -30
- package/modules/agents/src/services/credential-rotation.ts +185 -0
- package/modules/agents/src/services/credential-vault.ts +71 -46
- package/modules/agents/src/services/data-classes.ts +176 -0
- package/modules/agents/src/services/database-repository.ts +393 -101
- package/modules/agents/src/services/metering.ts +111 -0
- package/modules/agents/src/services/migration.ts +109 -0
- package/modules/agents/src/services/module-agent-preflight.ts +17 -9
- package/modules/agents/src/services/notifications.ts +98 -0
- package/modules/agents/src/services/provider-repository.ts +9 -18
- package/modules/agents/src/services/provider-service.ts +1 -9
- package/modules/agents/src/services/reports.ts +107 -0
- package/modules/agents/src/services/repository.ts +86 -6
- package/modules/agents/src/services/usage-service.ts +2 -0
- package/modules/agents/src/services/worker.ts +114 -4
- package/modules/agents/src/settings.ts +14 -3
- package/modules/agents/translations/en.json +14 -4
- package/modules/agents/translations/pl.json +14 -4
- package/modules/approvals/migrations/0001_approvals_core.down.sql +3 -0
- package/modules/approvals/migrations/0001_approvals_core.up.sql +78 -0
- package/modules/approvals/migrations/0002_approvals_expiry_routing_role.down.sql +2 -0
- package/modules/approvals/migrations/0002_approvals_expiry_routing_role.up.sql +19 -0
- package/modules/approvals/migrations/0003_approvals_retention_indexes.down.sql +6 -0
- package/modules/approvals/migrations/0003_approvals_retention_indexes.up.sql +14 -0
- package/modules/approvals/migrations/0004_approvals_inbox_keyset_indexes.down.sql +5 -0
- package/modules/approvals/migrations/0004_approvals_inbox_keyset_indexes.up.sql +12 -0
- package/modules/approvals/migrations/README.md +3 -0
- package/modules/approvals/module.json +34 -0
- package/modules/approvals/package.json +43 -0
- package/modules/approvals/spec/module.yaml +318 -0
- package/modules/approvals/src/acl/permissions.ts +7 -0
- package/modules/approvals/src/api/endpoints.ts +457 -0
- package/modules/approvals/src/client/ApprovalRequestDrawer.tsrx +138 -0
- package/modules/approvals/src/client/ApprovalsView.tsrx +562 -0
- package/modules/approvals/src/client/PendingCountWidget.tsrx +52 -0
- package/modules/approvals/src/client/api.ts +203 -0
- package/modules/approvals/src/client/approvals.css +51 -0
- package/modules/approvals/src/client/contribution.tsrx +44 -0
- package/modules/approvals/src/client/index.ts +26 -0
- package/modules/approvals/src/client/navigation.ts +39 -0
- package/modules/approvals/src/client/pending-count.ts +26 -0
- package/modules/approvals/src/client/presentation.ts +52 -0
- package/modules/approvals/src/client/state.ts +141 -0
- package/modules/approvals/src/domain/capability.ts +95 -0
- package/modules/approvals/src/domain/types.ts +154 -0
- package/modules/approvals/src/index.ts +52 -0
- package/modules/approvals/src/platform.ts +128 -0
- package/modules/approvals/src/server/index.ts +42 -0
- package/modules/approvals/src/server/runtime.ts +181 -0
- package/modules/approvals/src/services/approvals-service.ts +557 -0
- package/modules/approvals/src/services/callbacks.ts +75 -0
- package/modules/approvals/src/services/data-classes.ts +167 -0
- package/modules/approvals/src/services/database-repository.ts +724 -0
- package/modules/approvals/src/services/eligibility.ts +121 -0
- package/modules/approvals/src/services/expiry-runner.ts +81 -0
- package/modules/approvals/src/services/index.ts +31 -0
- package/modules/approvals/src/services/migration.ts +222 -0
- package/modules/approvals/src/services/notifications.ts +95 -0
- package/modules/approvals/src/services/repository.ts +161 -0
- package/modules/approvals/src/services/service-error.ts +70 -0
- package/modules/approvals/src/settings.ts +102 -0
- package/modules/approvals/translations/en.json +104 -0
- package/modules/approvals/translations/pl.json +104 -0
- package/modules/audit/migrations/0001_audit_core.down.sql +8 -0
- package/modules/audit/migrations/0001_audit_core.up.sql +107 -0
- package/modules/audit/migrations/0002_audit_sweep_routing_role.down.sql +2 -0
- package/modules/audit/migrations/0002_audit_sweep_routing_role.up.sql +21 -0
- package/modules/audit/migrations/0003_audit_export_request.down.sql +12 -0
- package/modules/audit/migrations/0003_audit_export_request.up.sql +40 -0
- package/modules/audit/migrations/0004_audit_hold_seal_erasure.down.sql +17 -0
- package/modules/audit/migrations/0004_audit_hold_seal_erasure.up.sql +192 -0
- package/modules/audit/migrations/0005_audit_event_format.down.sql +17 -0
- package/modules/audit/migrations/0005_audit_event_format.up.sql +60 -0
- package/modules/audit/migrations/0006_audit_own_class_walks.down.sql +3 -0
- package/modules/audit/migrations/0006_audit_own_class_walks.up.sql +14 -0
- package/modules/audit/migrations/README.md +3 -0
- package/modules/audit/module.json +32 -0
- package/modules/audit/package.json +49 -0
- package/modules/audit/spec/module.yaml +809 -0
- package/modules/audit/src/acl/permissions.ts +7 -0
- package/modules/audit/src/api/endpoints.ts +315 -0
- package/modules/audit/src/cli/commands.json +95 -0
- package/modules/audit/src/cli/index.ts +658 -0
- package/modules/audit/src/client/DataClassesView.tsrx +420 -0
- package/modules/audit/src/client/ExportsView.tsrx +256 -0
- package/modules/audit/src/client/HoldsView.tsrx +604 -0
- package/modules/audit/src/client/SweepsView.tsrx +251 -0
- package/modules/audit/src/client/api.ts +185 -0
- package/modules/audit/src/client/contribution.tsrx +52 -0
- package/modules/audit/src/client/index.ts +23 -0
- package/modules/audit/src/client/navigation.ts +74 -0
- package/modules/audit/src/client/presentation.ts +105 -0
- package/modules/audit/src/client/state.ts +86 -0
- package/modules/audit/src/domain/data-classes.ts +16 -0
- package/modules/audit/src/domain/types.ts +339 -0
- package/modules/audit/src/index.ts +76 -0
- package/modules/audit/src/platform.ts +44 -0
- package/modules/audit/src/server/index.ts +177 -0
- package/modules/audit/src/server/runtime.ts +303 -0
- package/modules/audit/src/services/anchor-key.ts +143 -0
- package/modules/audit/src/services/anchor-rotation.ts +147 -0
- package/modules/audit/src/services/audit-runners.ts +278 -0
- package/modules/audit/src/services/backup-guard.ts +95 -0
- package/modules/audit/src/services/database-repository.ts +1946 -0
- package/modules/audit/src/services/declared-classes.ts +64 -0
- package/modules/audit/src/services/erasure-port.ts +126 -0
- package/modules/audit/src/services/erasure-service.ts +770 -0
- package/modules/audit/src/services/export-directory.ts +106 -0
- package/modules/audit/src/services/export-service.ts +714 -0
- package/modules/audit/src/services/hold-service.ts +295 -0
- package/modules/audit/src/services/index.ts +17 -0
- package/modules/audit/src/services/migration.ts +658 -0
- package/modules/audit/src/services/own-classes.ts +318 -0
- package/modules/audit/src/services/platform-version.ts +23 -0
- package/modules/audit/src/services/repository.ts +495 -0
- package/modules/audit/src/services/retention-service.ts +191 -0
- package/modules/audit/src/services/seal-service.ts +769 -0
- package/modules/audit/src/services/service-error.ts +61 -0
- package/modules/audit/src/services/subject-keys.ts +90 -0
- package/modules/audit/src/services/sweep-service.ts +298 -0
- package/modules/audit/src/services/zip.ts +217 -0
- package/modules/audit/src/settings.ts +69 -0
- package/modules/audit/translations/en.json +210 -0
- package/modules/audit/translations/pl.json +210 -0
- package/modules/auth/README.md +77 -29
- package/modules/auth/migrations/0016_external_identities.up.sql +16 -0
- package/modules/auth/migrations/0017_mfa_key_id.up.sql +8 -0
- package/modules/auth/migrations/0018_retire_bundled_module_scopes.up.sql +29 -0
- package/modules/auth/migrations/0019_notifications_member_scopes.up.sql +44 -0
- package/modules/auth/migrations/0020_identity_providers.up.sql +61 -0
- package/modules/auth/migrations/0021_membership_status.up.sql +19 -0
- package/modules/auth/migrations/0022_auth_provider_scopes.up.sql +45 -0
- package/modules/auth/migrations/0023_enterprise_module_scopes.down.sql +19 -0
- package/modules/auth/migrations/0023_enterprise_module_scopes.up.sql +71 -0
- package/modules/auth/migrations/0024_approvals_member_scopes.down.sql +22 -0
- package/modules/auth/migrations/0024_approvals_member_scopes.up.sql +48 -0
- package/modules/auth/migrations/0025_audit_holds_owner_scope.down.sql +21 -0
- package/modules/auth/migrations/0025_audit_holds_owner_scope.up.sql +47 -0
- package/modules/auth/migrations/0026_auth_export_keyset_indexes.down.sql +6 -0
- package/modules/auth/migrations/0026_auth_export_keyset_indexes.up.sql +15 -0
- package/modules/auth/migrations/0027_workflow_automation_profile_scopes.down.sql +34 -0
- package/modules/auth/migrations/0027_workflow_automation_profile_scopes.up.sql +72 -0
- package/modules/auth/migrations/0028_auth_member_search_prefix_indexes.down.sql +6 -0
- package/modules/auth/migrations/0028_auth_member_search_prefix_indexes.up.sql +21 -0
- package/modules/auth/migrations/0029_reports_exports_access_scopes.down.sql +22 -0
- package/modules/auth/migrations/0029_reports_exports_access_scopes.up.sql +56 -0
- package/modules/auth/migrations/0030_auth_membership_keyset_index.down.sql +4 -0
- package/modules/auth/migrations/0030_auth_membership_keyset_index.up.sql +10 -0
- package/modules/auth/migrations/0031_membership_scope_backfills_under_rls.down.sql +4 -0
- package/modules/auth/migrations/0031_membership_scope_backfills_under_rls.up.sql +31 -0
- package/modules/auth/migrations/0032_audit_actor_service.down.sql +9 -0
- package/modules/auth/migrations/0032_audit_actor_service.up.sql +10 -0
- package/modules/auth/migrations/0033_auth_account_keyset_indexes.down.sql +5 -0
- package/modules/auth/migrations/0033_auth_account_keyset_indexes.up.sql +23 -0
- package/modules/auth/module.json +3 -3
- package/modules/auth/package.json +2 -1
- package/modules/auth/spec/module.yaml +372 -3
- package/modules/auth/src/acl/scopes.ts +50 -6
- package/modules/auth/src/cli/commands.json +11 -0
- package/modules/auth/src/cli/greenfield.ts +2 -2
- package/modules/auth/src/cli/index.ts +14 -0
- package/modules/auth/src/cli/secrets.ts +114 -0
- package/modules/auth/src/client/AuthenticationCore.tsrx +61 -8
- package/modules/auth/src/client/api.ts +72 -6
- package/modules/auth/src/client/contribution.tsrx +23 -0
- package/modules/auth/src/client/index.ts +6 -0
- package/modules/auth/src/client/providers/IdentityProviderForm.tsrx +191 -0
- package/modules/auth/src/client/providers/IdentityProvidersView.tsrx +358 -0
- package/modules/auth/src/client/providers/api.ts +128 -0
- package/modules/auth/src/client/providers/provider-columns.tsrx +60 -0
- package/modules/auth/src/client/providers/state.ts +35 -0
- package/modules/auth/src/client/security/SecurityView.tsrx +9 -1
- package/modules/auth/src/client/state.ts +15 -1
- package/modules/auth/src/domain/types.ts +55 -0
- package/modules/auth/src/index.ts +11 -1
- package/modules/auth/src/middleware/authentication.ts +4 -0
- package/modules/auth/src/server/endpoints.ts +467 -171
- package/modules/auth/src/server/http.ts +3 -2
- package/modules/auth/src/server/index.ts +22 -1
- package/modules/auth/src/server/membership-endpoints.ts +62 -0
- package/modules/auth/src/server/mfa-enforcement.ts +156 -0
- package/modules/auth/src/server/oidc.ts +389 -0
- package/modules/auth/src/server/provider-endpoints.ts +246 -0
- package/modules/auth/src/server/provider-host.ts +77 -0
- package/modules/auth/src/server/runtime.ts +231 -55
- package/modules/auth/src/services/auth-service-error.ts +7 -2
- package/modules/auth/src/services/auth-service.ts +948 -51
- package/modules/auth/src/services/data-classes.ts +236 -0
- package/modules/auth/src/services/database-repository.ts +853 -71
- package/modules/auth/src/services/identity-provider-service.ts +571 -0
- package/modules/auth/src/services/mail-delivery.ts +16 -16
- package/modules/auth/src/services/mail-message.ts +54 -0
- package/modules/auth/src/services/mail-port.ts +24 -0
- package/modules/auth/src/services/mail-smtp.ts +85 -0
- package/modules/auth/src/services/mfa-rotation.ts +144 -0
- package/modules/auth/src/services/migration.ts +810 -0
- package/modules/auth/src/services/password.ts +14 -0
- package/modules/auth/src/services/provider-secret-rotation.ts +169 -0
- package/modules/auth/src/services/provider-secrets.ts +136 -0
- package/modules/auth/src/services/repository.ts +321 -5
- package/modules/auth/src/services/session-sweep-runner.ts +73 -0
- package/modules/auth/src/services/settings-store.ts +10 -83
- package/modules/auth/src/services/totp.ts +88 -62
- package/modules/auth/src/services/validation.ts +194 -7
- package/modules/auth/src/settings.ts +18 -0
- package/modules/auth/translations/en.json +84 -1
- package/modules/auth/translations/pl.json +84 -1
- package/modules/automations/migrations/0005_secret_rotation_inventory.down.sql +1 -0
- package/modules/automations/migrations/0005_secret_rotation_inventory.up.sql +6 -0
- package/modules/automations/migrations/0006_automations_list_sort_indexes.down.sql +4 -0
- package/modules/automations/migrations/0006_automations_list_sort_indexes.up.sql +11 -0
- package/modules/automations/module.json +24 -6
- package/modules/automations/package.json +4 -1
- package/modules/automations/spec/module.yaml +81 -7
- package/modules/automations/src/api/endpoints.ts +202 -28
- package/modules/automations/src/cli/commands.json +17 -0
- package/modules/automations/src/cli/index.ts +114 -0
- package/modules/automations/src/client/AutomationScheduleForm.tsrx +77 -19
- package/modules/automations/src/client/AutomationSchedulesView.tsrx +144 -40
- package/modules/automations/src/client/AutomationTriggersView.tsrx +131 -32
- package/modules/automations/src/client/api.ts +62 -19
- package/modules/automations/src/client/presentation.ts +20 -2
- package/modules/automations/src/client/state.ts +84 -0
- package/modules/automations/src/domain/cadence.ts +99 -3
- package/modules/automations/src/domain/cron.ts +366 -0
- package/modules/automations/src/domain/time-zone.ts +61 -0
- package/modules/automations/src/platform.ts +38 -4
- package/modules/automations/src/server/index.ts +11 -0
- package/modules/automations/src/server/runtime.ts +46 -22
- package/modules/{automations-workflows-integration/src/server/adapter.ts → automations/src/server/workflow-target.ts} +13 -14
- package/modules/{automations-workflows-integration/src/server/tools.ts → automations/src/server/workflow-tools.ts} +0 -0
- package/modules/automations/src/services/data-classes.ts +62 -0
- package/modules/automations/src/services/database-repository.ts +152 -38
- package/modules/automations/src/services/migration.ts +119 -9
- package/modules/automations/src/services/repository.ts +52 -1
- package/modules/automations/src/services/schedule-runner.ts +84 -0
- package/modules/automations/src/services/schedule-service.ts +152 -26
- package/modules/automations/src/services/secret-rotation.ts +176 -0
- package/modules/automations/src/services/secret-vault.ts +68 -41
- package/modules/automations/src/services/trigger-service.ts +13 -10
- package/modules/automations/translations/en.json +15 -2
- package/modules/automations/translations/pl.json +15 -2
- package/modules/connectors/migrations/0001_connectors_core.down.sql +3 -0
- package/modules/connectors/migrations/0001_connectors_core.up.sql +72 -0
- package/modules/connectors/migrations/0002_connectors_call_keys.down.sql +3 -0
- package/modules/connectors/migrations/0002_connectors_call_keys.up.sql +18 -0
- package/modules/connectors/migrations/README.md +3 -0
- package/modules/connectors/module.json +28 -0
- package/modules/{automations-workflows-integration → connectors}/package.json +27 -26
- package/modules/connectors/spec/module.yaml +447 -0
- package/modules/connectors/src/acl/permissions.ts +6 -0
- package/modules/connectors/src/agent/tools.ts +180 -0
- package/modules/connectors/src/api/endpoints.ts +572 -0
- package/modules/connectors/src/client/ConnectorCallsView.tsrx +358 -0
- package/modules/connectors/src/client/ConnectorForm.tsrx +424 -0
- package/modules/connectors/src/client/ConnectorsView.tsrx +711 -0
- package/modules/connectors/src/client/api.ts +281 -0
- package/modules/connectors/src/client/consent.ts +48 -0
- package/modules/connectors/src/client/contribution.tsrx +37 -0
- package/modules/connectors/src/client/index.ts +22 -0
- package/modules/connectors/src/client/navigation.ts +42 -0
- package/modules/connectors/src/client/presentation.ts +38 -0
- package/modules/connectors/src/client/state.ts +175 -0
- package/modules/connectors/src/domain/calls.ts +70 -0
- package/modules/connectors/src/domain/definitions.ts +190 -0
- package/modules/connectors/src/domain/http-json.ts +68 -0
- package/modules/connectors/src/domain/types.ts +185 -0
- package/modules/connectors/src/index.ts +64 -0
- package/modules/connectors/src/platform.ts +56 -0
- package/modules/connectors/src/server/index.ts +66 -0
- package/modules/connectors/src/server/runtime.ts +163 -0
- package/modules/connectors/src/services/call-service.ts +903 -0
- package/modules/connectors/src/services/connectors-service.ts +653 -0
- package/modules/connectors/src/services/credential-vault.ts +188 -0
- package/modules/connectors/src/services/data-classes.ts +158 -0
- package/modules/connectors/src/services/database-repository.ts +897 -0
- package/modules/connectors/src/services/egress.ts +261 -0
- package/modules/connectors/src/services/index.ts +19 -0
- package/modules/connectors/src/services/migration.ts +166 -0
- package/modules/connectors/src/services/repository.ts +175 -0
- package/modules/connectors/src/services/service-error.ts +46 -0
- package/modules/connectors/src/settings.ts +69 -0
- package/modules/connectors/translations/en.json +191 -0
- package/modules/connectors/translations/pl.json +191 -0
- package/modules/directory/migrations/0001_directory_core.down.sql +5 -0
- package/modules/directory/migrations/0001_directory_core.up.sql +111 -0
- package/modules/directory/migrations/README.md +3 -0
- package/modules/directory/module.json +27 -0
- package/modules/directory/package.json +46 -0
- package/modules/directory/spec/module.yaml +351 -0
- package/modules/directory/src/acl/permissions.ts +7 -0
- package/modules/directory/src/api/endpoints.ts +478 -0
- package/modules/directory/src/api/scim-endpoints.ts +516 -0
- package/modules/directory/src/client/GroupMappingsView.tsrx +430 -0
- package/modules/directory/src/client/ProvisioningLogView.tsrx +248 -0
- package/modules/directory/src/client/ScimTokensView.tsrx +587 -0
- package/modules/directory/src/client/api.ts +222 -0
- package/modules/directory/src/client/contribution.tsrx +46 -0
- package/modules/directory/src/client/index.ts +22 -0
- package/modules/directory/src/client/navigation.ts +57 -0
- package/modules/directory/src/client/presentation.ts +143 -0
- package/modules/directory/src/client/state.ts +173 -0
- package/modules/directory/src/domain/scim.ts +346 -0
- package/modules/directory/src/domain/types.ts +166 -0
- package/modules/directory/src/index.ts +44 -0
- package/modules/directory/src/platform.ts +43 -0
- package/modules/directory/src/server/index.ts +17 -0
- package/modules/directory/src/server/runtime.ts +124 -0
- package/modules/directory/src/services/auth-port.ts +127 -0
- package/modules/directory/src/services/data-classes.ts +41 -0
- package/modules/directory/src/services/database-repository.ts +1067 -0
- package/modules/directory/src/services/directory-service.ts +311 -0
- package/modules/directory/src/services/index.ts +43 -0
- package/modules/directory/src/services/migration.ts +146 -0
- package/modules/directory/src/services/provisioning-service.ts +1420 -0
- package/modules/directory/src/services/rate-limiter.ts +103 -0
- package/modules/directory/src/services/repository.ts +208 -0
- package/modules/directory/src/services/service-error.ts +42 -0
- package/modules/directory/src/services/token-service.ts +215 -0
- package/modules/directory/src/settings.ts +86 -0
- package/modules/directory/translations/en.json +185 -0
- package/modules/directory/translations/pl.json +185 -0
- package/modules/documents/migrations/0001_documents_core.down.sql +1 -0
- package/modules/documents/migrations/0001_documents_core.up.sql +35 -0
- package/modules/documents/migrations/0002_documents_files_page.down.sql +1 -0
- package/modules/documents/migrations/0002_documents_files_page.up.sql +6 -0
- package/modules/documents/migrations/README.md +3 -0
- package/modules/documents/module.json +28 -0
- package/modules/documents/package.json +49 -0
- package/modules/documents/spec/module.yaml +247 -0
- package/modules/documents/src/acl/permissions.ts +6 -0
- package/modules/documents/src/api/endpoints.ts +401 -0
- package/modules/documents/src/client/DocumentUploader.tsrx +148 -0
- package/modules/documents/src/client/DocumentsView.tsrx +540 -0
- package/modules/documents/src/client/api.ts +209 -0
- package/modules/documents/src/client/contribution.tsrx +29 -0
- package/modules/documents/src/client/download.ts +70 -0
- package/modules/documents/src/client/index.ts +22 -0
- package/modules/documents/src/client/navigation.ts +25 -0
- package/modules/documents/src/client/presentation.ts +110 -0
- package/modules/documents/src/client/state.ts +117 -0
- package/modules/documents/src/domain/attachments.ts +84 -0
- package/modules/documents/src/domain/types.ts +80 -0
- package/modules/documents/src/index.ts +46 -0
- package/modules/documents/src/platform.ts +61 -0
- package/modules/documents/src/server/index.ts +30 -0
- package/modules/documents/src/server/runtime.ts +107 -0
- package/modules/documents/src/services/attachments.ts +39 -0
- package/modules/documents/src/services/data-classes.ts +25 -0
- package/modules/documents/src/services/database-repository.ts +259 -0
- package/modules/documents/src/services/documents-service.ts +586 -0
- package/modules/documents/src/services/index.ts +18 -0
- package/modules/documents/src/services/migration.ts +82 -0
- package/modules/documents/src/services/repository.ts +48 -0
- package/modules/documents/src/settings.ts +107 -0
- package/modules/documents/translations/en.json +111 -0
- package/modules/documents/translations/pl.json +111 -0
- package/modules/exports/migrations/0001_exports_core.down.sql +2 -0
- package/modules/exports/migrations/0001_exports_core.up.sql +28 -0
- package/modules/exports/migrations/0002_exports_job_routing_role.down.sql +4 -0
- package/modules/exports/migrations/0002_exports_job_routing_role.up.sql +21 -0
- package/modules/exports/migrations/README.md +3 -0
- package/modules/exports/module.json +28 -0
- package/modules/exports/package.json +44 -0
- package/modules/exports/spec/module.yaml +229 -0
- package/modules/exports/src/acl/permissions.ts +6 -0
- package/modules/exports/src/api/endpoints.ts +211 -0
- package/modules/exports/src/client/ExportsView.tsrx +327 -0
- package/modules/exports/src/client/api.ts +133 -0
- package/modules/exports/src/client/contribution.tsrx +31 -0
- package/modules/exports/src/client/index.ts +20 -0
- package/modules/exports/src/client/navigation.ts +25 -0
- package/modules/exports/src/client/presentation.ts +53 -0
- package/modules/exports/src/client/state.ts +56 -0
- package/modules/exports/src/domain/lists.ts +29 -0
- package/modules/exports/src/domain/types.ts +120 -0
- package/modules/exports/src/index.ts +41 -0
- package/modules/exports/src/platform.ts +80 -0
- package/modules/exports/src/server/index.ts +51 -0
- package/modules/exports/src/server/runtime.ts +160 -0
- package/modules/exports/src/services/data-classes.ts +56 -0
- package/modules/exports/src/services/database-repository.ts +405 -0
- package/modules/exports/src/services/export-runner.ts +123 -0
- package/modules/exports/src/services/export-service.ts +356 -0
- package/modules/exports/src/services/index.ts +6 -0
- package/modules/exports/src/services/list-registry.ts +105 -0
- package/modules/exports/src/services/migration.ts +89 -0
- package/modules/exports/src/services/repository.ts +97 -0
- package/modules/exports/src/settings.ts +70 -0
- package/modules/exports/translations/en.json +69 -0
- package/modules/exports/translations/pl.json +69 -0
- package/modules/import/migrations/0001_import_core.down.sql +6 -0
- package/modules/import/migrations/0001_import_core.up.sql +61 -0
- package/modules/import/migrations/0002_import_job_routing_role.down.sql +4 -0
- package/modules/import/migrations/0002_import_job_routing_role.up.sql +20 -0
- package/modules/import/migrations/0003_import_jobs_export_index.down.sql +1 -0
- package/modules/import/migrations/0003_import_jobs_export_index.up.sql +7 -0
- package/modules/import/migrations/0004_import_jobs_traceparent.down.sql +1 -0
- package/modules/import/migrations/0004_import_jobs_traceparent.up.sql +7 -0
- package/modules/import/migrations/README.md +3 -0
- package/modules/import/module.json +37 -0
- package/modules/import/package.json +50 -0
- package/modules/import/spec/module.yaml +335 -0
- package/modules/import/src/acl/permissions.ts +6 -0
- package/modules/import/src/api/endpoints.ts +400 -0
- package/modules/import/src/client/ImportJobDrawer.tsrx +229 -0
- package/modules/import/src/client/ImportsView.tsrx +455 -0
- package/modules/import/src/client/NewImportForm.tsrx +274 -0
- package/modules/import/src/client/api.ts +243 -0
- package/modules/import/src/client/contribution.tsrx +29 -0
- package/modules/import/src/client/index.ts +23 -0
- package/modules/import/src/client/navigation.ts +25 -0
- package/modules/import/src/client/presentation.ts +59 -0
- package/modules/import/src/client/state.ts +43 -0
- package/modules/import/src/domain/csv.ts +258 -0
- package/modules/import/src/domain/ports.ts +157 -0
- package/modules/import/src/domain/types.ts +179 -0
- package/modules/import/src/index.ts +58 -0
- package/modules/import/src/platform.ts +60 -0
- package/modules/import/src/server/index.ts +49 -0
- package/modules/import/src/server/runtime.ts +158 -0
- package/modules/import/src/services/csv-source.ts +121 -0
- package/modules/import/src/services/data-classes.ts +63 -0
- package/modules/import/src/services/database-repository.ts +780 -0
- package/modules/import/src/services/import-runner.ts +127 -0
- package/modules/import/src/services/import-service.ts +872 -0
- package/modules/import/src/services/index.ts +6 -0
- package/modules/import/src/services/migration.ts +156 -0
- package/modules/import/src/services/port-registry.ts +158 -0
- package/modules/import/src/services/repository.ts +147 -0
- package/modules/import/src/settings.ts +70 -0
- package/modules/import/translations/en.json +175 -0
- package/modules/import/translations/pl.json +175 -0
- package/modules/metering/migrations/0001_metering_core.down.sql +6 -0
- package/modules/metering/migrations/0001_metering_core.up.sql +119 -0
- package/modules/metering/migrations/0002_metering_bucket_export.down.sql +3 -0
- package/modules/metering/migrations/0002_metering_bucket_export.up.sql +5 -0
- package/modules/metering/migrations/README.md +3 -0
- package/modules/metering/module.json +46 -0
- package/modules/metering/package.json +50 -0
- package/modules/metering/spec/module.yaml +269 -0
- package/modules/metering/src/acl/permissions.ts +5 -0
- package/modules/metering/src/api/endpoints.ts +104 -0
- package/modules/metering/src/cli/commands.json +28 -0
- package/modules/metering/src/cli/index.ts +246 -0
- package/modules/metering/src/client/LimitsView.tsrx +170 -0
- package/modules/metering/src/client/UsageSummaryWidget.tsrx +63 -0
- package/modules/metering/src/client/UsageView.tsrx +205 -0
- package/modules/metering/src/client/api.ts +91 -0
- package/modules/metering/src/client/contribution.tsrx +42 -0
- package/modules/metering/src/client/index.ts +26 -0
- package/modules/metering/src/client/navigation.ts +54 -0
- package/modules/metering/src/client/presentation.ts +63 -0
- package/modules/metering/src/client/state.ts +31 -0
- package/modules/metering/src/domain/meters.ts +100 -0
- package/modules/metering/src/domain/types.ts +71 -0
- package/modules/metering/src/index.ts +51 -0
- package/modules/metering/src/platform.ts +84 -0
- package/modules/metering/src/server/index.ts +40 -0
- package/modules/metering/src/server/runtime.ts +165 -0
- package/modules/metering/src/services/data-classes.ts +34 -0
- package/modules/metering/src/services/database-repository.ts +574 -0
- package/modules/metering/src/services/index.ts +9 -0
- package/modules/metering/src/services/meter-registry.ts +145 -0
- package/modules/metering/src/services/metering-service.ts +441 -0
- package/modules/metering/src/services/migration.ts +183 -0
- package/modules/metering/src/services/notifications.ts +75 -0
- package/modules/metering/src/services/reports.ts +105 -0
- package/modules/metering/src/services/repository.ts +132 -0
- package/modules/metering/src/services/service-error.ts +46 -0
- package/modules/metering/src/settings.ts +47 -0
- package/modules/metering/translations/en.json +68 -0
- package/modules/metering/translations/pl.json +68 -0
- package/modules/notifications/migrations/0001_notifications_core.down.sql +1 -0
- package/modules/notifications/migrations/0001_notifications_core.up.sql +26 -0
- package/modules/notifications/migrations/0002_notifications_preferences.down.sql +1 -0
- package/modules/notifications/migrations/0002_notifications_preferences.up.sql +17 -0
- package/modules/notifications/migrations/0003_notifications_webhook_subscriptions.down.sql +1 -0
- package/modules/notifications/migrations/0003_notifications_webhook_subscriptions.up.sql +30 -0
- package/modules/notifications/migrations/0004_notifications_deliveries.down.sql +1 -0
- package/modules/notifications/migrations/0004_notifications_deliveries.up.sql +35 -0
- package/modules/notifications/migrations/0005_notifications_delivery_routing_role.down.sql +2 -0
- package/modules/notifications/migrations/0005_notifications_delivery_routing_role.up.sql +17 -0
- package/modules/notifications/migrations/0006_notifications_delivery_title.down.sql +1 -0
- package/modules/notifications/migrations/0006_notifications_delivery_title.up.sql +11 -0
- package/modules/notifications/migrations/0007_notifications_secret_rotation_inventory.down.sql +2 -0
- package/modules/notifications/migrations/0007_notifications_secret_rotation_inventory.up.sql +19 -0
- package/modules/notifications/migrations/0008_notifications_delivery_claim.down.sql +8 -0
- package/modules/notifications/migrations/0008_notifications_delivery_claim.up.sql +19 -0
- package/modules/notifications/migrations/0009_notifications_kind_approvals.down.sql +16 -0
- package/modules/notifications/migrations/0009_notifications_kind_approvals.up.sql +18 -0
- package/modules/notifications/migrations/0010_notifications_kind_meter_threshold.down.sql +16 -0
- package/modules/notifications/migrations/0010_notifications_kind_meter_threshold.up.sql +18 -0
- package/modules/notifications/migrations/0011_notifications_retention_keyset.down.sql +5 -0
- package/modules/notifications/migrations/0011_notifications_retention_keyset.up.sql +15 -0
- package/modules/notifications/migrations/0012_notifications_email_channel.down.sql +12 -0
- package/modules/notifications/migrations/0012_notifications_email_channel.up.sql +38 -0
- package/modules/notifications/migrations/0013_notifications_list_pages.down.sql +5 -0
- package/modules/notifications/migrations/0013_notifications_list_pages.up.sql +13 -0
- package/modules/notifications/migrations/README.md +3 -0
- package/modules/notifications/module.json +32 -0
- package/modules/notifications/package.json +49 -0
- package/modules/notifications/spec/module.yaml +718 -0
- package/modules/notifications/src/acl/permissions.ts +11 -0
- package/modules/notifications/src/api/endpoints.ts +814 -0
- package/modules/notifications/src/cli/commands.json +17 -0
- package/modules/notifications/src/cli/index.ts +126 -0
- package/modules/notifications/src/client/DeliveriesView.tsrx +483 -0
- package/modules/notifications/src/client/FactList.tsrx +24 -0
- package/modules/notifications/src/client/NotificationPreferencesView.tsrx +240 -0
- package/modules/notifications/src/client/NotificationsInboxView.tsrx +592 -0
- package/modules/notifications/src/client/UnreadCountWidget.tsrx +62 -0
- package/modules/notifications/src/client/WebhookForm.tsrx +297 -0
- package/modules/notifications/src/client/WebhooksView.tsrx +637 -0
- package/modules/notifications/src/client/api.ts +382 -0
- package/modules/notifications/src/client/contribution.tsrx +83 -0
- package/modules/notifications/src/client/inbox.ts +41 -0
- package/modules/notifications/src/client/index.ts +29 -0
- package/modules/notifications/src/client/navigation.ts +92 -0
- package/modules/notifications/src/client/notifications.css +70 -0
- package/modules/notifications/src/client/presentation.ts +81 -0
- package/modules/notifications/src/client/state.ts +246 -0
- package/modules/notifications/src/client/unread-count.ts +26 -0
- package/modules/notifications/src/domain/locale.ts +47 -0
- package/modules/notifications/src/domain/publish.ts +46 -0
- package/modules/notifications/src/domain/types.ts +186 -0
- package/modules/notifications/src/index.ts +62 -0
- package/modules/notifications/src/platform.ts +85 -0
- package/modules/notifications/src/server/index.ts +82 -0
- package/modules/notifications/src/server/runtime.ts +251 -0
- package/modules/notifications/src/services/data-classes.ts +139 -0
- package/modules/notifications/src/services/database-repository.ts +1334 -0
- package/modules/notifications/src/services/delivery-payload.ts +93 -0
- package/modules/notifications/src/services/delivery-runner.ts +170 -0
- package/modules/notifications/src/services/delivery-service.ts +811 -0
- package/modules/notifications/src/services/egress.ts +239 -0
- package/modules/notifications/src/services/email-channel.ts +93 -0
- package/modules/notifications/src/services/index.ts +23 -0
- package/modules/notifications/src/services/migration.ts +572 -0
- package/modules/notifications/src/services/notifications-service.ts +297 -0
- package/modules/notifications/src/services/paging.ts +60 -0
- package/modules/notifications/src/services/publish-service.ts +133 -0
- package/modules/notifications/src/services/repository.ts +342 -0
- package/modules/notifications/src/services/secret-rotation.ts +177 -0
- package/modules/notifications/src/services/secret-vault.ts +168 -0
- package/modules/notifications/src/services/service-error.ts +67 -0
- package/modules/notifications/src/services/signature.ts +81 -0
- package/modules/notifications/src/services/webhook-service.ts +307 -0
- package/modules/notifications/src/settings.ts +130 -0
- package/modules/notifications/translations/en.json +255 -0
- package/modules/notifications/translations/pl.json +255 -0
- package/modules/profile/module.json +3 -3
- package/modules/profile/package.json +1 -1
- package/modules/profile/spec/module.yaml +3 -3
- package/modules/profile/src/services/database-repository.ts +3 -13
- package/modules/reports/module.json +28 -0
- package/modules/reports/package.json +42 -0
- package/modules/reports/spec/module.yaml +231 -0
- package/modules/reports/src/acl/permissions.ts +5 -0
- package/modules/reports/src/api/endpoints.ts +72 -0
- package/modules/reports/src/client/ReportsSummaryWidget.tsrx +52 -0
- package/modules/reports/src/client/ReportsView.tsrx +246 -0
- package/modules/reports/src/client/api.ts +65 -0
- package/modules/reports/src/client/contribution.tsrx +36 -0
- package/modules/reports/src/client/index.ts +18 -0
- package/modules/reports/src/client/navigation.ts +39 -0
- package/modules/reports/src/client/presentation.ts +123 -0
- package/modules/reports/src/client/state.ts +28 -0
- package/modules/reports/src/domain/providers.ts +115 -0
- package/modules/reports/src/domain/types.ts +44 -0
- package/modules/reports/src/index.ts +47 -0
- package/modules/reports/src/platform.ts +37 -0
- package/modules/reports/src/server/index.ts +21 -0
- package/modules/reports/src/server/runtime.ts +40 -0
- package/modules/reports/src/services/index.ts +17 -0
- package/modules/reports/src/services/provider-registry.ts +144 -0
- package/modules/reports/src/services/range.ts +65 -0
- package/modules/reports/src/services/reports-service.ts +316 -0
- package/modules/reports/src/services/service-error.ts +26 -0
- package/modules/reports/src/settings.ts +49 -0
- package/modules/reports/translations/en.json +35 -0
- package/modules/reports/translations/pl.json +35 -0
- package/modules/sandbox/module.json +4 -4
- package/modules/sandbox/package.json +1 -1
- package/modules/sandbox/spec/module.yaml +3 -3
- package/modules/sandbox/src/services/database-repository.ts +14 -23
- package/modules/sandbox/src/services/directory.ts +16 -0
- package/modules/sandbox/src/services/sandbox-service.ts +13 -11
- package/modules/search/migrations/0001_search_core.down.sql +1 -0
- package/modules/search/migrations/0001_search_core.up.sql +22 -0
- package/modules/search/migrations/0002_search_recent_export.down.sql +3 -0
- package/modules/search/migrations/0002_search_recent_export.up.sql +5 -0
- package/modules/search/migrations/README.md +3 -0
- package/modules/search/module.json +28 -0
- package/modules/search/package.json +43 -0
- package/modules/search/spec/module.yaml +177 -0
- package/modules/search/src/acl/permissions.ts +5 -0
- package/modules/search/src/api/endpoints.ts +221 -0
- package/modules/search/src/client/SearchView.tsrx +346 -0
- package/modules/search/src/client/api.ts +157 -0
- package/modules/search/src/client/contribution.tsrx +31 -0
- package/modules/search/src/client/index.ts +17 -0
- package/modules/search/src/client/navigation.ts +97 -0
- package/modules/search/src/client/search.css +56 -0
- package/modules/search/src/client/state.ts +113 -0
- package/modules/search/src/domain/data-classes.ts +73 -0
- package/modules/search/src/domain/providers.ts +88 -0
- package/modules/search/src/domain/types.ts +56 -0
- package/modules/search/src/index.ts +46 -0
- package/modules/search/src/platform.ts +42 -0
- package/modules/search/src/server/index.ts +25 -0
- package/modules/search/src/server/runtime.ts +123 -0
- package/modules/search/src/services/database-repository.ts +163 -0
- package/modules/search/src/services/index.ts +21 -0
- package/modules/search/src/services/migration.ts +65 -0
- package/modules/search/src/services/provider-registry.ts +137 -0
- package/modules/search/src/services/repository.ts +43 -0
- package/modules/search/src/services/search-service.ts +442 -0
- package/modules/search/src/services/service-error.ts +35 -0
- package/modules/search/src/settings.ts +68 -0
- package/modules/search/translations/en.json +45 -0
- package/modules/search/translations/pl.json +45 -0
- package/modules/system/module.json +2 -2
- package/modules/system/package.json +1 -1
- package/modules/system/spec/module.yaml +30 -3
- package/modules/system/src/client/FlagsPanel.tsrx +127 -0
- package/modules/system/src/client/ModuleSettingRow.tsrx +17 -7
- package/modules/system/src/client/ModuleSettingsSection.tsrx +10 -71
- package/modules/system/src/client/ModulesView.tsrx +91 -65
- package/modules/system/src/client/flags.ts +35 -0
- package/modules/system/src/client/index.ts +8 -0
- package/modules/system/src/client/navigation.ts +8 -0
- package/modules/system/src/client/settings-state.ts +159 -0
- package/modules/system/src/client/state.ts +2 -0
- package/modules/system/src/domain/time-zone.ts +105 -0
- package/modules/system/src/index.ts +12 -0
- package/modules/system/src/platform.ts +5 -1
- package/modules/system/src/server/endpoints.ts +72 -21
- package/modules/system/src/settings.ts +28 -0
- package/modules/system/translations/en.json +17 -0
- package/modules/system/translations/pl.json +17 -0
- package/modules/users/module.json +30 -4
- package/modules/users/package.json +4 -1
- package/modules/users/spec/module.yaml +290 -7
- package/modules/users/src/api/endpoints.ts +228 -15
- package/modules/users/src/client/InviteMemberForm.tsrx +2 -2
- package/modules/users/src/client/MemberDrawer.tsrx +142 -26
- package/modules/users/src/client/UserAccountForm.tsrx +2 -2
- package/modules/users/src/client/UsersView.tsrx +432 -71
- package/modules/users/src/client/api.ts +106 -12
- package/modules/users/src/client/contribution.tsrx +5 -0
- package/modules/users/src/client/member-columns.tsrx +22 -9
- package/modules/users/src/client/state.ts +172 -7
- package/modules/users/src/domain/lists.ts +9 -0
- package/modules/users/src/index.ts +11 -0
- package/modules/users/src/platform.ts +50 -1
- package/modules/users/src/services/member-export.ts +51 -0
- package/modules/users/src/services/member-import.ts +249 -0
- package/modules/users/src/services/member-search.ts +145 -0
- package/modules/users/src/services/users-service.ts +117 -4
- package/modules/users/translations/en.json +57 -8
- package/modules/users/translations/pl.json +57 -8
- package/modules/workflows/migrations/0004_payload_rotation_inventory.up.sql +17 -0
- package/modules/workflows/migrations/0005_workflows_human_approval.up.sql +28 -0
- package/modules/workflows/migrations/0006_workflows_retention_indexes.up.sql +11 -0
- package/modules/workflows/migrations/0007_workflows_erasure_subject_indexes.up.sql +17 -0
- package/modules/workflows/migrations/0008_workflows_subject_account.up.sql +24 -0
- package/modules/workflows/migrations/0009_workflows_definition_list_indexes.up.sql +9 -0
- package/modules/workflows/module.json +34 -6
- package/modules/workflows/package.json +2 -1
- package/modules/workflows/spec/module.yaml +26 -9
- package/modules/workflows/src/api/endpoints.ts +131 -25
- package/modules/workflows/src/cli/commands.json +17 -0
- package/modules/workflows/src/cli/index.ts +114 -0
- package/modules/workflows/src/client/WorkflowExecutionHistory.tsrx +36 -27
- package/modules/workflows/src/client/WorkflowInspector.tsrx +116 -0
- package/modules/workflows/src/client/WorkflowNodePalette.tsrx +1 -0
- package/modules/workflows/src/client/WorkflowsView.tsrx +236 -99
- package/modules/workflows/src/client/api.ts +54 -34
- package/modules/workflows/src/client/canvas-model.ts +12 -0
- package/modules/workflows/src/client/state.ts +95 -0
- package/modules/workflows/src/domain/events.ts +25 -11
- package/modules/workflows/src/domain/graph.ts +135 -1
- package/modules/workflows/src/domain/types.ts +91 -4
- package/modules/workflows/src/platform.ts +12 -0
- package/modules/workflows/src/server/runtime.ts +78 -5
- package/modules/workflows/src/services/approvals.ts +62 -0
- package/modules/workflows/src/services/cursors.ts +37 -0
- package/modules/workflows/src/services/data-classes.ts +232 -0
- package/modules/workflows/src/services/database-repository.ts +660 -171
- package/modules/workflows/src/services/migration.ts +240 -0
- package/modules/workflows/src/services/notifications.ts +98 -0
- package/modules/workflows/src/services/payload-codec.ts +51 -28
- package/modules/workflows/src/services/payload-rotation.ts +171 -0
- package/modules/workflows/src/services/repository.ts +123 -8
- package/modules/workflows/src/services/simulation.ts +7 -0
- package/modules/workflows/src/services/worker.ts +446 -25
- package/modules/workflows/src/services/workflows-service.ts +264 -103
- package/modules/workflows/translations/en.json +12 -4
- package/modules/workflows/translations/pl.json +12 -4
- package/modules.json +48 -4
- package/package.json +64 -6
- package/packages/client/package.json +1 -0
- package/packages/client/src/ApplicationShell.tsrx +43 -0
- package/packages/client/src/contributions.ts +55 -0
- package/packages/client/src/i18n/locales/en.json +5 -0
- package/packages/client/src/i18n/locales/pl.json +5 -0
- package/packages/client/src/index.ts +13 -1
- package/packages/client/src/routing.ts +22 -0
- package/packages/client/src/shell/CommandPalette.tsrx +223 -11
- package/packages/client/src/shell/command-search.ts +126 -0
- package/packages/client/src/shell/command.ts +30 -0
- package/packages/client/src/shell/navigation.ts +12 -0
- package/packages/client/src/shell/palette-keys.ts +27 -0
- package/packages/client/src/shell/shell.css +7 -0
- package/packages/contracts/schemas/module-spec.schema.json +287 -1
- package/packages/contracts/schemas/module.schema.json +25 -0
- package/packages/contracts/src/index.ts +144 -1
- package/packages/database/src/backup.ts +179 -0
- package/packages/database/src/decoders.ts +25 -0
- package/packages/database/src/index.ts +17 -0
- package/packages/database/src/record-history.ts +5 -14
- package/packages/harness/src/index.ts +2 -0
- package/packages/harness/src/runtime.ts +218 -1
- package/packages/harness/src/tool-adapters.ts +19 -1
- package/packages/kernel/src/acl.ts +179 -0
- package/packages/kernel/src/capability-registry.ts +69 -2
- package/packages/kernel/src/data-class-registry.ts +354 -0
- package/packages/kernel/src/index.ts +65 -4
- package/packages/kernel/src/keyring.ts +208 -0
- package/packages/kernel/src/module-compatibility.ts +35 -4
- package/packages/kernel/src/module-registry.ts +49 -2
- package/packages/kernel/src/module-settings.ts +189 -27
- package/packages/server/package.json +2 -1
- package/packages/server/src/composition.ts +38 -0
- package/packages/server/src/endpoint.ts +104 -47
- package/packages/server/src/export/csv.ts +34 -0
- package/packages/server/src/export/definition.ts +346 -0
- package/packages/server/src/export/index.ts +61 -0
- package/packages/server/src/export/run.ts +116 -0
- package/packages/server/src/index.ts +155 -0
- package/packages/server/src/jobs/index.ts +93 -0
- package/packages/server/src/jobs/runner.ts +486 -0
- package/packages/server/src/log.ts +291 -0
- package/packages/server/src/mail/config.ts +184 -0
- package/packages/server/src/mail/contracts.ts +251 -0
- package/packages/server/src/mail/index.ts +31 -0
- package/packages/server/src/mail/port.ts +101 -0
- package/packages/server/src/mail/smtp.ts +191 -0
- package/packages/server/src/mail/template.ts +105 -0
- package/packages/server/src/metrics.ts +447 -0
- package/packages/server/src/pagination.ts +246 -0
- package/packages/server/src/trace/context.ts +103 -0
- package/packages/server/src/trace/egress.ts +66 -0
- package/packages/server/src/trace/error-sink.ts +296 -0
- package/packages/server/src/trace/exporter.ts +295 -0
- package/packages/server/src/trace/index.ts +60 -0
- package/packages/server/src/trace/job-sink.ts +172 -0
- package/packages/server/src/trace/tracer.ts +338 -0
- package/packages/server/src/web.ts +5 -1
- package/packages/storage/package.json +40 -0
- package/packages/storage/src/config.ts +189 -0
- package/packages/storage/src/content-type.ts +124 -0
- package/packages/storage/src/contracts.ts +112 -0
- package/packages/storage/src/envelope.ts +189 -0
- package/packages/storage/src/index.ts +43 -0
- package/packages/storage/src/local.ts +75 -0
- package/packages/storage/src/port.ts +251 -0
- package/packages/storage/src/read-token.ts +130 -0
- package/packages/storage/src/s3.ts +144 -0
- package/packages/storage/src/scanner.ts +22 -0
- package/packages/storage/src/sigv4.ts +104 -0
- package/packages/storage/src/store.ts +13 -0
- package/packages/ui/package.json +1 -0
- package/packages/ui/src/components/Button.tsrx +3 -0
- package/packages/ui/src/components/ConfirmDialog.tsrx +13 -2
- package/packages/ui/src/components/DateField.tsrx +92 -0
- package/packages/ui/src/components/DatePicker.tsrx +525 -0
- package/packages/ui/src/components/DateRangeField.tsrx +93 -0
- package/packages/ui/src/components/Drawer.tsrx +10 -1
- package/packages/ui/src/components/FileUpload.tsrx +158 -0
- package/packages/ui/src/components/Pagination.tsrx +130 -0
- package/packages/ui/src/components/Select.tsrx +78 -0
- package/packages/ui/src/components/Table.tsrx +498 -81
- package/packages/ui/src/components/Tabs.tsrx +53 -0
- package/packages/ui/src/components/ToastHost.tsrx +48 -0
- package/packages/ui/src/components/calendar.ts +243 -0
- package/packages/ui/src/components/date-field.ts +62 -0
- package/packages/ui/src/components/file-upload.ts +49 -0
- package/packages/ui/src/components/focus-trap.ts +62 -0
- package/packages/ui/src/components/pagination.ts +68 -0
- package/packages/ui/src/components/table-sorting.ts +49 -0
- package/packages/ui/src/components/tabs.ts +61 -0
- package/packages/ui/src/components/toast-store.ts +116 -0
- package/packages/ui/src/icons/Icon.tsrx +5 -0
- package/packages/ui/src/index.ts +45 -0
- package/packages/ui/src/styles/components.css +598 -0
- package/modules/automations-workflows-integration/module.json +0 -27
- package/modules/automations-workflows-integration/spec/module.yaml +0 -93
- package/modules/automations-workflows-integration/src/index.ts +0 -14
- package/modules/automations-workflows-integration/src/platform.ts +0 -24
- package/modules/automations-workflows-integration/src/server/index.ts +0 -11
- package/modules/automations-workflows-integration/translations/en.json +0 -21
- package/modules/automations-workflows-integration/translations/pl.json +0 -21
- package/modules/workflows/src/services/cursor-codec.ts +0 -62
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
import { serverLogger } from '../log.ts';
|
|
2
|
+
import {
|
|
3
|
+
currentTrace,
|
|
4
|
+
newSpanId,
|
|
5
|
+
newTraceId,
|
|
6
|
+
parseTraceParent,
|
|
7
|
+
type TraceContext,
|
|
8
|
+
} from './context.ts';
|
|
9
|
+
|
|
10
|
+
export type SpanKind =
|
|
11
|
+
| 'internal'
|
|
12
|
+
| 'server'
|
|
13
|
+
| 'client'
|
|
14
|
+
| 'producer'
|
|
15
|
+
| 'consumer';
|
|
16
|
+
export type SpanStatus = 'unset' | 'ok' | 'error';
|
|
17
|
+
export type SpanAttributeValue = string | number | boolean;
|
|
18
|
+
|
|
19
|
+
export interface SpanAttributes {
|
|
20
|
+
readonly [key: string]: SpanAttributeValue;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* A unit of work with a name, a start, an end, a status and bounded
|
|
25
|
+
* attributes. Ending it is idempotent, so a `finally` may always call it.
|
|
26
|
+
*/
|
|
27
|
+
export interface Span {
|
|
28
|
+
readonly context: TraceContext;
|
|
29
|
+
/** Ignored past the attribute ceiling and after the span ended. */
|
|
30
|
+
setAttribute(key: string, value: SpanAttributeValue): void;
|
|
31
|
+
/**
|
|
32
|
+
* `endedAt` is epoch milliseconds, for a consumer replaying an instant it
|
|
33
|
+
* was told about rather than one it observed, such as the job event sink.
|
|
34
|
+
* Absent reads the tracer's clock.
|
|
35
|
+
*/
|
|
36
|
+
end(status?: SpanStatus, message?: string, endedAt?: number): void;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface StartSpanOptions {
|
|
40
|
+
/**
|
|
41
|
+
* Absent takes the ambient trace, so nested work nests without threading a
|
|
42
|
+
* context by hand. Null is an explicit new root.
|
|
43
|
+
*/
|
|
44
|
+
readonly parent?: TraceContext | null;
|
|
45
|
+
/** Parsed when `parent` is absent; a header that does not parse is a root. */
|
|
46
|
+
readonly traceparent?: string | null;
|
|
47
|
+
readonly kind?: SpanKind;
|
|
48
|
+
readonly attributes?: SpanAttributes;
|
|
49
|
+
/** Epoch milliseconds. Defaults to the tracer's clock. */
|
|
50
|
+
readonly startedAt?: number;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** What a recorded span carries once it ended. Values only, no references. */
|
|
54
|
+
export interface RecordedSpan {
|
|
55
|
+
readonly traceId: string;
|
|
56
|
+
readonly spanId: string;
|
|
57
|
+
readonly parentSpanId: string | null;
|
|
58
|
+
readonly name: string;
|
|
59
|
+
readonly kind: SpanKind;
|
|
60
|
+
/** Epoch milliseconds. */
|
|
61
|
+
readonly startedAt: number;
|
|
62
|
+
readonly endedAt: number;
|
|
63
|
+
readonly status: SpanStatus;
|
|
64
|
+
readonly statusMessage: string | null;
|
|
65
|
+
readonly attributes: SpanAttributes;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export interface TraceStats {
|
|
69
|
+
/** Spans waiting to be drained. */
|
|
70
|
+
readonly buffered: number;
|
|
71
|
+
/** Spans the buffer evicted because it was full. */
|
|
72
|
+
readonly dropped: number;
|
|
73
|
+
/** Sampled spans recorded since the process started. */
|
|
74
|
+
readonly recorded: number;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export interface Tracer {
|
|
78
|
+
/** 0 to 1. A root outside that ratio still propagates, it is not recorded. */
|
|
79
|
+
readonly sampleRatio: number;
|
|
80
|
+
startSpan(name: string, options?: StartSpanOptions): Span;
|
|
81
|
+
/** Up to `max` spans, oldest first, removed from the buffer. */
|
|
82
|
+
drain(max?: number): readonly RecordedSpan[];
|
|
83
|
+
stats(): TraceStats;
|
|
84
|
+
/**
|
|
85
|
+
* One consumer at a time; the returned function detaches it. The listener
|
|
86
|
+
* is called with the buffered count after every recorded span, isolated.
|
|
87
|
+
*/
|
|
88
|
+
onSpanRecorded(listener: (buffered: number) => void): () => void;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Every bound the in-process trace buffer enforces. A span is a diagnostic,
|
|
93
|
+
* never a transport: attribute count, attribute length and buffered spans are
|
|
94
|
+
* all capped so one hostile caller cannot grow the process.
|
|
95
|
+
*/
|
|
96
|
+
export const TRACE_LIMITS = Object.freeze({
|
|
97
|
+
/** Spans held before the oldest is evicted. */
|
|
98
|
+
bufferSpans: 4_096,
|
|
99
|
+
/** Attributes kept per span. */
|
|
100
|
+
attributes: 16,
|
|
101
|
+
/** Characters kept per attribute key and per string value. */
|
|
102
|
+
attributeChars: 256,
|
|
103
|
+
/** Characters kept of a span name. */
|
|
104
|
+
nameChars: 256,
|
|
105
|
+
/** Spans one export batch carries. */
|
|
106
|
+
batchSpans: 512,
|
|
107
|
+
/** Milliseconds between export batches. */
|
|
108
|
+
flushEveryMs: 5_000,
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
const CONTROL_CHARACTER = /[\u0000-\u001f\u007f]/g;
|
|
112
|
+
const SAMPLE_DENOMINATOR = 0x1_0000_0000;
|
|
113
|
+
|
|
114
|
+
/* A span name and an attribute both reach an exporter and a log line, so a
|
|
115
|
+
control character in either would forge a second record downstream. */
|
|
116
|
+
function boundedText(value: string, max: number): string {
|
|
117
|
+
const cut = value.length <= max ? value : value.slice(0, max);
|
|
118
|
+
return cut.replace(CONTROL_CHARACTER, ' ');
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/* Deterministic on the trace id so the whole trace shares one decision, and so
|
|
122
|
+
a test that injects ids gets a stable answer instead of a coin flip. */
|
|
123
|
+
function sampledByRatio(traceId: string, ratio: number): boolean {
|
|
124
|
+
if (ratio >= 1) return true;
|
|
125
|
+
if (ratio <= 0) return false;
|
|
126
|
+
return Number.parseInt(traceId.slice(-8), 16) / SAMPLE_DENOMINATOR < ratio;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/* Propagated but never recorded. It still owns a span id, because a downstream
|
|
130
|
+
service reads the header and must see a parent that exists. */
|
|
131
|
+
class UnsampledSpan implements Span {
|
|
132
|
+
constructor(readonly context: TraceContext) {}
|
|
133
|
+
setAttribute(): void {}
|
|
134
|
+
end(): void {}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
class RecordingSpan implements Span {
|
|
138
|
+
#ended = false;
|
|
139
|
+
#count = 0;
|
|
140
|
+
readonly #attributes: Record<string, SpanAttributeValue> = {};
|
|
141
|
+
|
|
142
|
+
constructor(
|
|
143
|
+
readonly context: TraceContext,
|
|
144
|
+
private readonly parentSpanId: string | null,
|
|
145
|
+
private readonly name: string,
|
|
146
|
+
private readonly kind: SpanKind,
|
|
147
|
+
private readonly startedAt: number,
|
|
148
|
+
private readonly now: () => number,
|
|
149
|
+
private readonly record: (span: RecordedSpan) => void,
|
|
150
|
+
) {}
|
|
151
|
+
|
|
152
|
+
setAttribute(key: string, value: SpanAttributeValue): void {
|
|
153
|
+
if (this.#ended) return;
|
|
154
|
+
if (typeof value === 'number' && !Number.isFinite(value)) return;
|
|
155
|
+
const name = boundedText(key, TRACE_LIMITS.attributeChars);
|
|
156
|
+
if (name.length === 0) return;
|
|
157
|
+
/* The ceiling bounds distinct keys, so overwriting one the span already
|
|
158
|
+
carries is always admitted: it grows nothing. */
|
|
159
|
+
if (!(name in this.#attributes)) {
|
|
160
|
+
if (this.#count >= TRACE_LIMITS.attributes) return;
|
|
161
|
+
this.#count += 1;
|
|
162
|
+
}
|
|
163
|
+
this.#attributes[name] =
|
|
164
|
+
typeof value === 'string'
|
|
165
|
+
? boundedText(value, TRACE_LIMITS.attributeChars)
|
|
166
|
+
: value;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
end(status: SpanStatus = 'unset', message?: string, endedAt?: number): void {
|
|
170
|
+
if (this.#ended) return;
|
|
171
|
+
this.#ended = true;
|
|
172
|
+
this.record({
|
|
173
|
+
traceId: this.context.traceId,
|
|
174
|
+
spanId: this.context.spanId,
|
|
175
|
+
parentSpanId: this.parentSpanId,
|
|
176
|
+
name: this.name,
|
|
177
|
+
kind: this.kind,
|
|
178
|
+
startedAt: this.startedAt,
|
|
179
|
+
endedAt: endedAt ?? this.now(),
|
|
180
|
+
status,
|
|
181
|
+
statusMessage:
|
|
182
|
+
message === undefined
|
|
183
|
+
? null
|
|
184
|
+
: boundedText(message, TRACE_LIMITS.attributeChars),
|
|
185
|
+
attributes: this.#attributes,
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export interface TracerOptions {
|
|
191
|
+
/** 0 to 1. Anything outside that, or not a number, is 1. */
|
|
192
|
+
readonly sampleRatio?: number;
|
|
193
|
+
/** Epoch milliseconds. Defaults to `Date.now`. */
|
|
194
|
+
readonly now?: () => number;
|
|
195
|
+
/** Hex id source, for a test that needs a stable sampling decision. */
|
|
196
|
+
readonly newTraceId?: () => string;
|
|
197
|
+
readonly newSpanId?: () => string;
|
|
198
|
+
/** Buffered spans before the oldest is evicted. Defaults to the limit. */
|
|
199
|
+
readonly bufferSpans?: number;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Collects spans into one bounded ring. It sends nothing and opens no handle:
|
|
204
|
+
* an exporter drains it, and a deployment that composes none still pays only
|
|
205
|
+
* the ring, which evicts its oldest span rather than growing.
|
|
206
|
+
*/
|
|
207
|
+
export function createTracer(options: TracerOptions = {}): Tracer {
|
|
208
|
+
const ratio =
|
|
209
|
+
typeof options.sampleRatio === 'number' &&
|
|
210
|
+
Number.isFinite(options.sampleRatio) &&
|
|
211
|
+
options.sampleRatio >= 0 &&
|
|
212
|
+
options.sampleRatio <= 1
|
|
213
|
+
? options.sampleRatio
|
|
214
|
+
: 1;
|
|
215
|
+
const now = options.now ?? (() => Date.now());
|
|
216
|
+
const traceId = options.newTraceId ?? newTraceId;
|
|
217
|
+
const spanId = options.newSpanId ?? newSpanId;
|
|
218
|
+
const capacity = Math.max(
|
|
219
|
+
1,
|
|
220
|
+
Math.trunc(options.bufferSpans ?? TRACE_LIMITS.bufferSpans),
|
|
221
|
+
);
|
|
222
|
+
const ring = new Array<RecordedSpan | undefined>(capacity);
|
|
223
|
+
let head = 0;
|
|
224
|
+
let size = 0;
|
|
225
|
+
let dropped = 0;
|
|
226
|
+
let recorded = 0;
|
|
227
|
+
let listener: ((buffered: number) => void) | undefined;
|
|
228
|
+
|
|
229
|
+
const record = (span: RecordedSpan): void => {
|
|
230
|
+
if (size === capacity) {
|
|
231
|
+
/* Drop oldest: the newest span is the one a reader is waiting for, and
|
|
232
|
+
an exporter that fell behind must not decide what the process keeps. */
|
|
233
|
+
ring[head] = span;
|
|
234
|
+
head = (head + 1) % capacity;
|
|
235
|
+
dropped += 1;
|
|
236
|
+
} else {
|
|
237
|
+
ring[(head + size) % capacity] = span;
|
|
238
|
+
size += 1;
|
|
239
|
+
}
|
|
240
|
+
recorded += 1;
|
|
241
|
+
if (!listener) return;
|
|
242
|
+
try {
|
|
243
|
+
listener(size);
|
|
244
|
+
} catch {
|
|
245
|
+
/* An observer that throws is the observer's defect, not the span's. */
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
return Object.freeze({
|
|
250
|
+
sampleRatio: ratio,
|
|
251
|
+
startSpan(name: string, startOptions: StartSpanOptions = {}): Span {
|
|
252
|
+
const parent =
|
|
253
|
+
startOptions.parent !== undefined
|
|
254
|
+
? startOptions.parent
|
|
255
|
+
: startOptions.traceparent !== undefined
|
|
256
|
+
? parseTraceParent(startOptions.traceparent)
|
|
257
|
+
: (currentTrace() ?? null);
|
|
258
|
+
const id = parent ? parent.traceId : traceId();
|
|
259
|
+
const context: TraceContext = {
|
|
260
|
+
traceId: id,
|
|
261
|
+
spanId: spanId(),
|
|
262
|
+
sampled: parent ? parent.sampled : sampledByRatio(id, ratio),
|
|
263
|
+
};
|
|
264
|
+
if (!context.sampled) return new UnsampledSpan(context);
|
|
265
|
+
const span = new RecordingSpan(
|
|
266
|
+
context,
|
|
267
|
+
parent ? parent.spanId : null,
|
|
268
|
+
boundedText(name, TRACE_LIMITS.nameChars),
|
|
269
|
+
startOptions.kind ?? 'internal',
|
|
270
|
+
startOptions.startedAt ?? now(),
|
|
271
|
+
now,
|
|
272
|
+
record,
|
|
273
|
+
);
|
|
274
|
+
if (startOptions.attributes) {
|
|
275
|
+
for (const [key, value] of Object.entries(startOptions.attributes)) {
|
|
276
|
+
span.setAttribute(key, value);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
return span;
|
|
280
|
+
},
|
|
281
|
+
drain(max = capacity): readonly RecordedSpan[] {
|
|
282
|
+
const take = Math.min(size, Math.max(0, Math.trunc(max)));
|
|
283
|
+
const batch = new Array<RecordedSpan>(take);
|
|
284
|
+
for (let index = 0; index < take; index += 1) {
|
|
285
|
+
batch[index] = ring[head]!;
|
|
286
|
+
ring[head] = undefined;
|
|
287
|
+
head = (head + 1) % capacity;
|
|
288
|
+
}
|
|
289
|
+
size -= take;
|
|
290
|
+
return batch;
|
|
291
|
+
},
|
|
292
|
+
stats: (): TraceStats => ({ buffered: size, dropped, recorded }),
|
|
293
|
+
onSpanRecorded(next: (buffered: number) => void): () => void {
|
|
294
|
+
listener = next;
|
|
295
|
+
return () => {
|
|
296
|
+
if (listener === next) listener = undefined;
|
|
297
|
+
};
|
|
298
|
+
},
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
* The sample ratio this process records at, from `FD_TRACE_SAMPLE`. Throws on
|
|
304
|
+
* a value that is not a ratio, so a deployment that meant to sample never
|
|
305
|
+
* silently records everything.
|
|
306
|
+
*/
|
|
307
|
+
export function traceSampleRatio(environment: NodeJS.ProcessEnv): number {
|
|
308
|
+
const raw = environment.FD_TRACE_SAMPLE?.trim();
|
|
309
|
+
if (!raw) return 1;
|
|
310
|
+
const value = Number(raw);
|
|
311
|
+
if (!Number.isFinite(value) || value < 0 || value > 1) {
|
|
312
|
+
throw new Error('FD_TRACE_SAMPLE must be a ratio between 0 and 1.');
|
|
313
|
+
}
|
|
314
|
+
return value;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
let processTracer: Tracer | undefined;
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* The tracer of this process, built from the environment on first use so a
|
|
321
|
+
* deployment's `.env` is already loaded. Recording is always on and bounded;
|
|
322
|
+
* exporting is the platform's decision. Tests and libraries that need their
|
|
323
|
+
* own buffer call `createTracer` instead.
|
|
324
|
+
*/
|
|
325
|
+
export function serverTracer(): Tracer {
|
|
326
|
+
if (processTracer) return processTracer;
|
|
327
|
+
let ratio = 1;
|
|
328
|
+
try {
|
|
329
|
+
ratio = traceSampleRatio(process.env);
|
|
330
|
+
} catch {
|
|
331
|
+
/* The platform refuses the value while it composes, so this arm is only
|
|
332
|
+
reached by a process that never composed one. It records everything and
|
|
333
|
+
says so, rather than failing a request over a diagnostic. */
|
|
334
|
+
serverLogger().warn('FD_TRACE_SAMPLE is not a ratio; recording every span');
|
|
335
|
+
}
|
|
336
|
+
processTracer = createTracer({ sampleRatio: ratio });
|
|
337
|
+
return processTracer;
|
|
338
|
+
}
|
|
@@ -387,7 +387,11 @@ export function createModuleWebRoutes(options: {
|
|
|
387
387
|
!surface.pages.some((page) => page.path === '/')
|
|
388
388
|
)
|
|
389
389
|
routes.push(fallback(site.path));
|
|
390
|
-
|
|
390
|
+
/* A nested mount closes its own subtree. A root mount gets no catch-all:
|
|
391
|
+
it would claim the whole origin, and a matched server route pre-empts
|
|
392
|
+
the host layers that serve development transforms, built assets and
|
|
393
|
+
public files. Unmatched addresses reach those layers and 404 there. */
|
|
394
|
+
if (base) routes.push(fallback(base + '/*unmatched'));
|
|
391
395
|
}
|
|
392
396
|
if (
|
|
393
397
|
mounts.some((site) => site.path.startsWith('/sites/')) &&
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@flowdular/storage",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"exports": {
|
|
6
|
+
".": "./src/index.ts"
|
|
7
|
+
},
|
|
8
|
+
"scripts": {
|
|
9
|
+
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
10
|
+
"test": "vitest run"
|
|
11
|
+
},
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"@flowdular/kernel": "workspace:*"
|
|
14
|
+
},
|
|
15
|
+
"devDependencies": {
|
|
16
|
+
"@types/node": "24.13.3",
|
|
17
|
+
"typescript": "5.9.3",
|
|
18
|
+
"vitest": "4.1.11"
|
|
19
|
+
},
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": "git+https://github.com/Flowdular/flowdular.git",
|
|
24
|
+
"directory": "packages/storage"
|
|
25
|
+
},
|
|
26
|
+
"files": [
|
|
27
|
+
"src",
|
|
28
|
+
"schemas",
|
|
29
|
+
"dist",
|
|
30
|
+
"bin",
|
|
31
|
+
"public",
|
|
32
|
+
"module.json",
|
|
33
|
+
"migrations",
|
|
34
|
+
"translations",
|
|
35
|
+
"spec",
|
|
36
|
+
"README.md",
|
|
37
|
+
"LICENSE"
|
|
38
|
+
],
|
|
39
|
+
"private": true
|
|
40
|
+
}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import {
|
|
4
|
+
createKeyring,
|
|
5
|
+
parsePreviousKeys,
|
|
6
|
+
type Keyring,
|
|
7
|
+
} from '@flowdular/sdk/kernel';
|
|
8
|
+
import {
|
|
9
|
+
flowdularEnvironment,
|
|
10
|
+
flowdularStateDirectory,
|
|
11
|
+
} from '@flowdular/sdk/kernel/runtime-config';
|
|
12
|
+
|
|
13
|
+
export type ConfiguredStorageAdapter = 'local' | 's3';
|
|
14
|
+
|
|
15
|
+
export interface StorageConfig {
|
|
16
|
+
readonly adapter: ConfiguredStorageAdapter;
|
|
17
|
+
readonly production: boolean;
|
|
18
|
+
readonly maxObjectBytes: number;
|
|
19
|
+
readonly local: { readonly directory: string };
|
|
20
|
+
readonly s3: {
|
|
21
|
+
readonly bucket: string;
|
|
22
|
+
readonly region: string;
|
|
23
|
+
readonly endpoint: string | undefined;
|
|
24
|
+
readonly accessKeyId: string;
|
|
25
|
+
readonly secretAccessKey: string;
|
|
26
|
+
readonly forcePathStyle: boolean;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export const DEFAULT_STORAGE_MAX_OBJECT_BYTES = 25 * 1024 * 1024;
|
|
31
|
+
/* The port authenticates a whole object before handing out a byte of it, so the
|
|
32
|
+
limit also bounds what one request holds in memory. */
|
|
33
|
+
const STORAGE_MAX_OBJECT_BYTES_CEILING = 256 * 1024 * 1024;
|
|
34
|
+
const STORAGE_KEY_VARIABLE = 'FD_STORAGE_ENCRYPTION_KEY';
|
|
35
|
+
|
|
36
|
+
function adapterOf(
|
|
37
|
+
environment: NodeJS.ProcessEnv,
|
|
38
|
+
production: boolean,
|
|
39
|
+
): ConfiguredStorageAdapter {
|
|
40
|
+
const configured = environment.FD_STORAGE_ADAPTER?.trim();
|
|
41
|
+
const adapter = configured || (production ? 's3' : 'local');
|
|
42
|
+
if (adapter !== 'local' && adapter !== 's3') {
|
|
43
|
+
throw new Error('FD_STORAGE_ADAPTER must be "local" or "s3".');
|
|
44
|
+
}
|
|
45
|
+
/* The local adapter writes to the container filesystem, which no replica
|
|
46
|
+
shares and no backup covers. Production refuses it exactly as it refuses
|
|
47
|
+
the embedded database. */
|
|
48
|
+
if (production && adapter === 'local') {
|
|
49
|
+
throw new Error(
|
|
50
|
+
'FD_STORAGE_ADAPTER=local is refused in production; configure the S3-compatible adapter.',
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
return adapter;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function booleanEnvironment(
|
|
57
|
+
value: string | undefined,
|
|
58
|
+
fallback: boolean,
|
|
59
|
+
name: string,
|
|
60
|
+
): boolean {
|
|
61
|
+
const trimmed = value?.trim();
|
|
62
|
+
if (trimmed === undefined || trimmed === '') return fallback;
|
|
63
|
+
if (trimmed === 'true') return true;
|
|
64
|
+
if (trimmed === 'false') return false;
|
|
65
|
+
throw new Error(`${name} must be true or false.`);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function required(
|
|
69
|
+
environment: NodeJS.ProcessEnv,
|
|
70
|
+
name: string,
|
|
71
|
+
adapter: string,
|
|
72
|
+
): string {
|
|
73
|
+
const value = environment[name]?.trim();
|
|
74
|
+
if (!value)
|
|
75
|
+
throw new Error(`${name} is required by FD_STORAGE_ADAPTER=${adapter}.`);
|
|
76
|
+
return value;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export function storageConfigFromEnvironment(
|
|
80
|
+
environment: NodeJS.ProcessEnv = process.env,
|
|
81
|
+
workspaceRoot = process.cwd(),
|
|
82
|
+
): StorageConfig {
|
|
83
|
+
environment = flowdularEnvironment(environment);
|
|
84
|
+
const production = environment.NODE_ENV === 'production';
|
|
85
|
+
const adapter = adapterOf(environment, production);
|
|
86
|
+
if (production && !environment[STORAGE_KEY_VARIABLE]?.trim()) {
|
|
87
|
+
throw new Error(
|
|
88
|
+
`${STORAGE_KEY_VARIABLE} is required in production. Provide a base64-encoded 32-byte key through deployment secrets.`,
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
const configuredLimit = environment.FD_STORAGE_MAX_OBJECT_BYTES?.trim();
|
|
92
|
+
const maxObjectBytes = configuredLimit
|
|
93
|
+
? Number(configuredLimit)
|
|
94
|
+
: DEFAULT_STORAGE_MAX_OBJECT_BYTES;
|
|
95
|
+
if (
|
|
96
|
+
!Number.isSafeInteger(maxObjectBytes) ||
|
|
97
|
+
maxObjectBytes < 1024 ||
|
|
98
|
+
maxObjectBytes > STORAGE_MAX_OBJECT_BYTES_CEILING
|
|
99
|
+
) {
|
|
100
|
+
throw new Error(
|
|
101
|
+
`FD_STORAGE_MAX_OBJECT_BYTES must be an integer between 1024 and ${STORAGE_MAX_OBJECT_BYTES_CEILING}.`,
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
adapter,
|
|
106
|
+
production,
|
|
107
|
+
maxObjectBytes,
|
|
108
|
+
local: {
|
|
109
|
+
directory:
|
|
110
|
+
environment.FD_STORAGE_LOCAL_DIRECTORY?.trim() ||
|
|
111
|
+
resolve(flowdularStateDirectory(workspaceRoot), 'data', 'storage'),
|
|
112
|
+
},
|
|
113
|
+
s3:
|
|
114
|
+
adapter === 's3'
|
|
115
|
+
? {
|
|
116
|
+
bucket: required(environment, 'FD_STORAGE_S3_BUCKET', adapter),
|
|
117
|
+
region: required(environment, 'FD_STORAGE_S3_REGION', adapter),
|
|
118
|
+
endpoint: environment.FD_STORAGE_S3_ENDPOINT?.trim() || undefined,
|
|
119
|
+
accessKeyId: required(
|
|
120
|
+
environment,
|
|
121
|
+
'FD_STORAGE_S3_ACCESS_KEY_ID',
|
|
122
|
+
adapter,
|
|
123
|
+
),
|
|
124
|
+
secretAccessKey: required(
|
|
125
|
+
environment,
|
|
126
|
+
'FD_STORAGE_S3_SECRET_ACCESS_KEY',
|
|
127
|
+
adapter,
|
|
128
|
+
),
|
|
129
|
+
forcePathStyle: booleanEnvironment(
|
|
130
|
+
environment.FD_STORAGE_S3_FORCE_PATH_STYLE,
|
|
131
|
+
false,
|
|
132
|
+
'FD_STORAGE_S3_FORCE_PATH_STYLE',
|
|
133
|
+
),
|
|
134
|
+
}
|
|
135
|
+
: {
|
|
136
|
+
bucket: '',
|
|
137
|
+
region: '',
|
|
138
|
+
endpoint: undefined,
|
|
139
|
+
accessKeyId: '',
|
|
140
|
+
secretAccessKey: '',
|
|
141
|
+
forcePathStyle: false,
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function decodeStorageKey(
|
|
147
|
+
value: string,
|
|
148
|
+
variable = STORAGE_KEY_VARIABLE,
|
|
149
|
+
): Buffer {
|
|
150
|
+
const trimmed = value.trim();
|
|
151
|
+
const decoded = /^[0-9a-f]{64}$/i.test(trimmed)
|
|
152
|
+
? Buffer.from(trimmed, 'hex')
|
|
153
|
+
: Buffer.from(trimmed, 'base64');
|
|
154
|
+
if (decoded.length !== 32) {
|
|
155
|
+
throw new Error(`${variable} must encode exactly 32 bytes.`);
|
|
156
|
+
}
|
|
157
|
+
return decoded;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/* A local checkout stores objects without a configured key, the way it runs
|
|
161
|
+
without a database URL. The value is derived from the workspace path, so it
|
|
162
|
+
is stable across restarts and useless anywhere else. */
|
|
163
|
+
function derivedDevelopmentKey(workspaceRoot: string): Buffer {
|
|
164
|
+
return createHash('sha256')
|
|
165
|
+
.update(`flowdular-storage-development\u0000${workspaceRoot}`)
|
|
166
|
+
.digest();
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* The ring that seals every stored object and every read token. Rotation adds
|
|
171
|
+
* the retired key to `FD_STORAGE_ENCRYPTION_KEY_PREVIOUS`, which opens objects
|
|
172
|
+
* written before the rotation while new writes use the current key.
|
|
173
|
+
*/
|
|
174
|
+
export function createStorageKeyring(
|
|
175
|
+
environment: NodeJS.ProcessEnv = process.env,
|
|
176
|
+
workspaceRoot = process.cwd(),
|
|
177
|
+
): Keyring {
|
|
178
|
+
environment = flowdularEnvironment(environment);
|
|
179
|
+
const configured = environment[STORAGE_KEY_VARIABLE];
|
|
180
|
+
return createKeyring({
|
|
181
|
+
current: configured
|
|
182
|
+
? decodeStorageKey(configured)
|
|
183
|
+
: derivedDevelopmentKey(workspaceRoot),
|
|
184
|
+
previous: parsePreviousKeys(
|
|
185
|
+
environment[`${STORAGE_KEY_VARIABLE}_PREVIOUS`],
|
|
186
|
+
(entry) => decodeStorageKey(entry, `${STORAGE_KEY_VARIABLE}_PREVIOUS`),
|
|
187
|
+
),
|
|
188
|
+
});
|
|
189
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/* The platform stores content it did not produce, so the declared type is not
|
|
2
|
+
evidence. Every accepted type is verified against the bytes: a signature, or a
|
|
3
|
+
structural check for the container formats that share one. Archives and
|
|
4
|
+
executables are absent by decision, not by oversight. */
|
|
5
|
+
|
|
6
|
+
const OOXML_ENTRY = '[Content_Types].xml';
|
|
7
|
+
const TEXT_SAMPLE_BYTES = 64 * 1024;
|
|
8
|
+
|
|
9
|
+
type ContentVerifier = (body: Uint8Array) => boolean;
|
|
10
|
+
|
|
11
|
+
function signature(...bytes: readonly number[]): ContentVerifier {
|
|
12
|
+
return (body) => {
|
|
13
|
+
if (body.byteLength < bytes.length) return false;
|
|
14
|
+
return bytes.every((value, index) => body[index] === value);
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function at(offset: number, text: string): ContentVerifier {
|
|
19
|
+
const codes = [...text].map((character) => character.charCodeAt(0));
|
|
20
|
+
return (body) => {
|
|
21
|
+
if (body.byteLength < offset + codes.length) return false;
|
|
22
|
+
return codes.every((value, index) => body[offset + index] === value);
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function either(...verifiers: readonly ContentVerifier[]): ContentVerifier {
|
|
27
|
+
return (body) => verifiers.some((verify) => verify(body));
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function both(...verifiers: readonly ContentVerifier[]): ContentVerifier {
|
|
31
|
+
return (body) => verifiers.every((verify) => verify(body));
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* An OOXML document is a ZIP whose first entry is the content type map. A plain
|
|
36
|
+
* archive renamed to .docx carries a different first entry, so this refuses the
|
|
37
|
+
* archive the allowlist deliberately leaves out.
|
|
38
|
+
*/
|
|
39
|
+
const ooxml: ContentVerifier = (body) => {
|
|
40
|
+
if (!signature(0x50, 0x4b, 0x03, 0x04)(body)) return false;
|
|
41
|
+
if (body.byteLength < 30) return false;
|
|
42
|
+
const view = new DataView(body.buffer, body.byteOffset, body.byteLength);
|
|
43
|
+
const nameLength = view.getUint16(26, true);
|
|
44
|
+
if (nameLength !== OOXML_ENTRY.length) return false;
|
|
45
|
+
if (body.byteLength < 30 + nameLength) return false;
|
|
46
|
+
return at(30, OOXML_ENTRY)(body);
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
/* Valid UTF-8 without NUL or stray control bytes. The decoder runs over a
|
|
50
|
+
bounded prefix in streaming mode, so a multi-byte sequence split by the
|
|
51
|
+
sample boundary is not read as a failure. */
|
|
52
|
+
const utf8Text: ContentVerifier = (body) => {
|
|
53
|
+
const sample = body.subarray(0, TEXT_SAMPLE_BYTES);
|
|
54
|
+
for (const byte of sample) {
|
|
55
|
+
if (byte === 0) return false;
|
|
56
|
+
if (byte < 0x09 || (byte > 0x0d && byte < 0x20)) return false;
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
new TextDecoder('utf-8', { fatal: true }).decode(sample, { stream: true });
|
|
60
|
+
return true;
|
|
61
|
+
} catch {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
/* Documents, images, spreadsheets and PDF. No archive and no executable: a type
|
|
67
|
+
added here needs a verifier that a renamed file cannot satisfy. */
|
|
68
|
+
const RULES: ReadonlyMap<string, ContentVerifier> = new Map([
|
|
69
|
+
['application/pdf', signature(0x25, 0x50, 0x44, 0x46, 0x2d)],
|
|
70
|
+
['image/png', signature(0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a)],
|
|
71
|
+
['image/jpeg', signature(0xff, 0xd8, 0xff)],
|
|
72
|
+
['image/gif', either(at(0, 'GIF87a'), at(0, 'GIF89a'))],
|
|
73
|
+
['image/webp', both(at(0, 'RIFF'), at(8, 'WEBP'))],
|
|
74
|
+
['text/plain', utf8Text],
|
|
75
|
+
['text/csv', utf8Text],
|
|
76
|
+
[
|
|
77
|
+
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
|
78
|
+
ooxml,
|
|
79
|
+
],
|
|
80
|
+
['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', ooxml],
|
|
81
|
+
[
|
|
82
|
+
'application/vnd.openxmlformats-officedocument.presentationml.presentation',
|
|
83
|
+
ooxml,
|
|
84
|
+
],
|
|
85
|
+
[
|
|
86
|
+
'application/msword',
|
|
87
|
+
signature(0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1),
|
|
88
|
+
],
|
|
89
|
+
[
|
|
90
|
+
'application/vnd.ms-excel',
|
|
91
|
+
signature(0xd0, 0xcf, 0x11, 0xe0, 0xa1, 0xb1, 0x1a, 0xe1),
|
|
92
|
+
],
|
|
93
|
+
]);
|
|
94
|
+
|
|
95
|
+
/** Every content type an object may be stored under. */
|
|
96
|
+
export const STORAGE_CONTENT_TYPES: readonly string[] = Object.freeze([
|
|
97
|
+
...RULES.keys(),
|
|
98
|
+
]);
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* The essence of a media type: lowercased, without parameters and without
|
|
102
|
+
* surrounding space. `null` when the value is not a media type at all.
|
|
103
|
+
*/
|
|
104
|
+
export function normalizeContentType(value: string): string | null {
|
|
105
|
+
const essence = value.split(';')[0]?.trim().toLowerCase() ?? '';
|
|
106
|
+
return /^[a-z0-9][a-z0-9!#$&^_.+-]*\/[a-z0-9][a-z0-9!#$&^_.+-]*$/.test(
|
|
107
|
+
essence,
|
|
108
|
+
)
|
|
109
|
+
? essence
|
|
110
|
+
: null;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export function contentTypeAllowed(contentType: string): boolean {
|
|
114
|
+
return RULES.has(contentType);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/** Whether the bytes carry what the normalized content type claims. */
|
|
118
|
+
export function contentMatchesType(
|
|
119
|
+
contentType: string,
|
|
120
|
+
body: Uint8Array,
|
|
121
|
+
): boolean {
|
|
122
|
+
const verify = RULES.get(contentType);
|
|
123
|
+
return verify ? verify(body) : false;
|
|
124
|
+
}
|