@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,183 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
DatabaseMigration,
|
|
3
|
+
DatabaseSession,
|
|
4
|
+
ExistingMigrationState,
|
|
5
|
+
} from '@flowdular/sdk/database';
|
|
6
|
+
import {
|
|
7
|
+
migrationObjectState,
|
|
8
|
+
postgresTenantTableState,
|
|
9
|
+
} from '@flowdular/sdk/database';
|
|
10
|
+
|
|
11
|
+
/* Mirrors migrations/0001_metering_core.up.sql byte for byte;
|
|
12
|
+
tests/migrations.test.ts fails on drift. */
|
|
13
|
+
export const METERING_MIGRATION_001 = `-- Meters as one workspace recorded them. The declaration itself lives in the
|
|
14
|
+
-- composed process; a row appears the first time a module reports a fact for
|
|
15
|
+
-- this workspace, which is what makes the registry readable under the tenant
|
|
16
|
+
-- policy like every other row metering.core owns.
|
|
17
|
+
CREATE TABLE IF NOT EXISTS metering_meters (
|
|
18
|
+
id TEXT PRIMARY KEY,
|
|
19
|
+
tenant_id TEXT NOT NULL,
|
|
20
|
+
meter_key TEXT NOT NULL CHECK (length(meter_key) BETWEEN 1 AND 96),
|
|
21
|
+
module_id TEXT NOT NULL CHECK (length(module_id) BETWEEN 1 AND 64),
|
|
22
|
+
label TEXT NOT NULL CHECK (length(label) BETWEEN 1 AND 120),
|
|
23
|
+
unit TEXT NOT NULL CHECK (length(unit) BETWEEN 1 AND 32),
|
|
24
|
+
kind TEXT NOT NULL CHECK (kind IN ('cumulative', 'gauge')),
|
|
25
|
+
created_at BIGINT NOT NULL,
|
|
26
|
+
UNIQUE (tenant_id, meter_key)
|
|
27
|
+
);
|
|
28
|
+
ALTER TABLE metering_meters ENABLE ROW LEVEL SECURITY;
|
|
29
|
+
ALTER TABLE metering_meters FORCE ROW LEVEL SECURITY;
|
|
30
|
+
CREATE POLICY metering_meters_tenant_policy ON metering_meters
|
|
31
|
+
USING (tenant_id = current_setting('coreloom.tenant_id', true))
|
|
32
|
+
WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
|
|
33
|
+
|
|
34
|
+
-- One row per meter per UTC day. The unique key is also the index every read
|
|
35
|
+
-- and every accumulating write uses, so a fact costs one upsert and a month
|
|
36
|
+
-- total is a range scan over ordered days.
|
|
37
|
+
CREATE TABLE IF NOT EXISTS metering_buckets (
|
|
38
|
+
id TEXT PRIMARY KEY,
|
|
39
|
+
tenant_id TEXT NOT NULL,
|
|
40
|
+
meter_key TEXT NOT NULL CHECK (length(meter_key) BETWEEN 1 AND 96),
|
|
41
|
+
day TEXT NOT NULL CHECK (length(day) = 10),
|
|
42
|
+
amount BIGINT NOT NULL CHECK (amount >= 0),
|
|
43
|
+
events BIGINT NOT NULL CHECK (events >= 0),
|
|
44
|
+
updated_at BIGINT NOT NULL,
|
|
45
|
+
UNIQUE (tenant_id, meter_key, day)
|
|
46
|
+
);
|
|
47
|
+
CREATE INDEX IF NOT EXISTS metering_buckets_tenant_day_idx
|
|
48
|
+
ON metering_buckets (tenant_id, day, meter_key);
|
|
49
|
+
ALTER TABLE metering_buckets ENABLE ROW LEVEL SECURITY;
|
|
50
|
+
ALTER TABLE metering_buckets FORCE ROW LEVEL SECURITY;
|
|
51
|
+
CREATE POLICY metering_buckets_tenant_policy ON metering_buckets
|
|
52
|
+
USING (tenant_id = current_setting('coreloom.tenant_id', true))
|
|
53
|
+
WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
|
|
54
|
+
|
|
55
|
+
-- What makes a fact idempotent. The unique key is the whole mechanism: a
|
|
56
|
+
-- repeat of a source reference inserts nothing and the bucket is left alone.
|
|
57
|
+
-- The day column is carried so a retention sweep of the bucket class removes
|
|
58
|
+
-- these rows on the same cutoff and the same index.
|
|
59
|
+
CREATE TABLE IF NOT EXISTS metering_records (
|
|
60
|
+
id TEXT PRIMARY KEY,
|
|
61
|
+
tenant_id TEXT NOT NULL,
|
|
62
|
+
meter_key TEXT NOT NULL CHECK (length(meter_key) BETWEEN 1 AND 96),
|
|
63
|
+
source_ref TEXT NOT NULL CHECK (length(source_ref) BETWEEN 1 AND 200),
|
|
64
|
+
day TEXT NOT NULL CHECK (length(day) = 10),
|
|
65
|
+
amount BIGINT NOT NULL CHECK (amount >= 0),
|
|
66
|
+
recorded_at BIGINT NOT NULL,
|
|
67
|
+
UNIQUE (tenant_id, meter_key, source_ref)
|
|
68
|
+
);
|
|
69
|
+
CREATE INDEX IF NOT EXISTS metering_records_tenant_day_idx
|
|
70
|
+
ON metering_records (tenant_id, day, id);
|
|
71
|
+
ALTER TABLE metering_records ENABLE ROW LEVEL SECURITY;
|
|
72
|
+
ALTER TABLE metering_records FORCE ROW LEVEL SECURITY;
|
|
73
|
+
CREATE POLICY metering_records_tenant_policy ON metering_records
|
|
74
|
+
USING (tenant_id = current_setting('coreloom.tenant_id', true))
|
|
75
|
+
WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
|
|
76
|
+
|
|
77
|
+
-- The operator's ceiling. No foreign key to metering_meters: a limit is set
|
|
78
|
+
-- before the workspace has reported its first fact for that meter, which is
|
|
79
|
+
-- the point of setting one.
|
|
80
|
+
CREATE TABLE IF NOT EXISTS metering_limits (
|
|
81
|
+
id TEXT PRIMARY KEY,
|
|
82
|
+
tenant_id TEXT NOT NULL,
|
|
83
|
+
meter_key TEXT NOT NULL CHECK (length(meter_key) BETWEEN 1 AND 96),
|
|
84
|
+
monthly_limit BIGINT NOT NULL CHECK (monthly_limit >= 0),
|
|
85
|
+
set_by TEXT NOT NULL CHECK (length(set_by) BETWEEN 1 AND 128),
|
|
86
|
+
updated_at BIGINT NOT NULL,
|
|
87
|
+
UNIQUE (tenant_id, meter_key)
|
|
88
|
+
);
|
|
89
|
+
ALTER TABLE metering_limits ENABLE ROW LEVEL SECURITY;
|
|
90
|
+
ALTER TABLE metering_limits FORCE ROW LEVEL SECURITY;
|
|
91
|
+
CREATE POLICY metering_limits_tenant_policy ON metering_limits
|
|
92
|
+
USING (tenant_id = current_setting('coreloom.tenant_id', true))
|
|
93
|
+
WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
|
|
94
|
+
|
|
95
|
+
-- Every limit the operator set, in order, with the label the CLI derived. The
|
|
96
|
+
-- limit row carries the current value; this is the evidence of how it got
|
|
97
|
+
-- there and it is never rewritten.
|
|
98
|
+
CREATE TABLE IF NOT EXISTS metering_limit_events (
|
|
99
|
+
id TEXT PRIMARY KEY,
|
|
100
|
+
tenant_id TEXT NOT NULL,
|
|
101
|
+
meter_key TEXT NOT NULL CHECK (length(meter_key) BETWEEN 1 AND 96),
|
|
102
|
+
monthly_limit BIGINT NOT NULL CHECK (monthly_limit >= 0),
|
|
103
|
+
previous_limit BIGINT CHECK (previous_limit IS NULL OR previous_limit >= 0),
|
|
104
|
+
set_by TEXT NOT NULL CHECK (length(set_by) BETWEEN 1 AND 128),
|
|
105
|
+
occurred_at BIGINT NOT NULL
|
|
106
|
+
);
|
|
107
|
+
CREATE INDEX IF NOT EXISTS metering_limit_events_tenant_occurred_idx
|
|
108
|
+
ON metering_limit_events (tenant_id, occurred_at DESC, id);
|
|
109
|
+
ALTER TABLE metering_limit_events ENABLE ROW LEVEL SECURITY;
|
|
110
|
+
ALTER TABLE metering_limit_events FORCE ROW LEVEL SECURITY;
|
|
111
|
+
CREATE POLICY metering_limit_events_tenant_policy ON metering_limit_events
|
|
112
|
+
USING (tenant_id = current_setting('coreloom.tenant_id', true))
|
|
113
|
+
WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
|
|
114
|
+
|
|
115
|
+
-- One row per meter per month per threshold. The unique key is what makes a
|
|
116
|
+
-- threshold notification happen once: the row is claimed inside the recording
|
|
117
|
+
-- transaction and only a claim that inserted publishes.
|
|
118
|
+
CREATE TABLE IF NOT EXISTS metering_threshold_notices (
|
|
119
|
+
id TEXT PRIMARY KEY,
|
|
120
|
+
tenant_id TEXT NOT NULL,
|
|
121
|
+
meter_key TEXT NOT NULL CHECK (length(meter_key) BETWEEN 1 AND 96),
|
|
122
|
+
month TEXT NOT NULL CHECK (length(month) = 7),
|
|
123
|
+
threshold TEXT NOT NULL CHECK (threshold IN ('warning', 'exhausted')),
|
|
124
|
+
sent_at BIGINT NOT NULL,
|
|
125
|
+
UNIQUE (tenant_id, meter_key, month, threshold)
|
|
126
|
+
);
|
|
127
|
+
ALTER TABLE metering_threshold_notices ENABLE ROW LEVEL SECURITY;
|
|
128
|
+
ALTER TABLE metering_threshold_notices FORCE ROW LEVEL SECURITY;
|
|
129
|
+
CREATE POLICY metering_threshold_notices_tenant_policy ON metering_threshold_notices
|
|
130
|
+
USING (tenant_id = current_setting('coreloom.tenant_id', true))
|
|
131
|
+
WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
|
|
132
|
+
`;
|
|
133
|
+
|
|
134
|
+
/* Mirrors migrations/0002_metering_bucket_export.up.sql byte for byte. */
|
|
135
|
+
export const METERING_MIGRATION_002 = `-- The data class export walks a workspace's buckets by id, ascending. The
|
|
136
|
+
-- retention index leads with the day, so it cannot serve that walk and a large
|
|
137
|
+
-- workspace paged through a sequential scan per page.
|
|
138
|
+
CREATE INDEX IF NOT EXISTS metering_buckets_tenant_export_idx
|
|
139
|
+
ON metering_buckets (tenant_id, id);
|
|
140
|
+
`;
|
|
141
|
+
|
|
142
|
+
/** Every tenant table of this module, with the policy each one must carry. */
|
|
143
|
+
export const METERING_TENANT_TABLES = [
|
|
144
|
+
'metering_meters',
|
|
145
|
+
'metering_buckets',
|
|
146
|
+
'metering_records',
|
|
147
|
+
'metering_limits',
|
|
148
|
+
'metering_limit_events',
|
|
149
|
+
'metering_threshold_notices',
|
|
150
|
+
] as const;
|
|
151
|
+
|
|
152
|
+
/* One migration creates every table, so adoption is the conjunction: a schema
|
|
153
|
+
carrying only some of them is partial and the runner refuses it rather than
|
|
154
|
+
trusting a half-built one. */
|
|
155
|
+
async function tenantTablesState(
|
|
156
|
+
database: DatabaseSession,
|
|
157
|
+
): Promise<ExistingMigrationState> {
|
|
158
|
+
const states: ExistingMigrationState[] = [];
|
|
159
|
+
for (const table of METERING_TENANT_TABLES) {
|
|
160
|
+
states.push(
|
|
161
|
+
await postgresTenantTableState(database, table, `${table}_tenant_policy`),
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
if (states.every((state) => state === 'complete')) return 'complete';
|
|
165
|
+
if (states.every((state) => state === 'absent')) return 'absent';
|
|
166
|
+
return 'partial';
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export const databaseMigrations: readonly DatabaseMigration[] = [
|
|
170
|
+
{
|
|
171
|
+
id: '0001_metering_core',
|
|
172
|
+
sql: { postgresql: METERING_MIGRATION_001 },
|
|
173
|
+
inspectExisting: (database) => tenantTablesState(database),
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
id: '0002_metering_bucket_export',
|
|
177
|
+
sql: { postgresql: METERING_MIGRATION_002 },
|
|
178
|
+
inspectExisting: (database) =>
|
|
179
|
+
migrationObjectState([
|
|
180
|
+
() => database.schema.hasIndex('metering_buckets_tenant_export_idx'),
|
|
181
|
+
]),
|
|
182
|
+
},
|
|
183
|
+
];
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/* The notifications.core publish contract, declared here rather than imported.
|
|
2
|
+
notifications.core is optional: metering.core composes, records and refuses
|
|
3
|
+
with that module absent, so it may not be a package dependency. This mirror
|
|
4
|
+
is the contract notifications.core owns and must not drift from it.
|
|
5
|
+
modules/agents/src/services/notifications.ts holds the same mirror. */
|
|
6
|
+
export const NOTIFICATIONS_PUBLISH_CAPABILITY = 'notifications.publish.v1';
|
|
7
|
+
|
|
8
|
+
export interface NotificationPublishInput {
|
|
9
|
+
readonly tenantId: string;
|
|
10
|
+
readonly kind: 'meter-threshold';
|
|
11
|
+
readonly sourceModule: string;
|
|
12
|
+
readonly sourceRef: string;
|
|
13
|
+
readonly title: string;
|
|
14
|
+
readonly body?: string;
|
|
15
|
+
readonly recipients: readonly string[];
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface NotificationPublishResult {
|
|
19
|
+
readonly inboxItemIds: readonly string[];
|
|
20
|
+
readonly deliveryIds: readonly string[];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface NotificationPublisher {
|
|
24
|
+
publish(input: NotificationPublishInput): Promise<NotificationPublishResult>;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/* Read at the point of use, never at composition time: the platform may
|
|
28
|
+
register notifications.core after metering.core, or never. */
|
|
29
|
+
export type NotificationPublisherResolver = () => NotificationPublisher | null;
|
|
30
|
+
|
|
31
|
+
const LIMITS = {
|
|
32
|
+
sourceModule: 64,
|
|
33
|
+
sourceRef: 200,
|
|
34
|
+
title: 200,
|
|
35
|
+
body: 4_000,
|
|
36
|
+
recipients: 64,
|
|
37
|
+
recipientId: 128,
|
|
38
|
+
} as const;
|
|
39
|
+
|
|
40
|
+
function clamp(value: string, limit: number): string {
|
|
41
|
+
return value.length > limit ? value.slice(0, limit) : value;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/* Advisory and post-commit. An absent notifications module, nobody to notify,
|
|
45
|
+
or a publisher that throws never changes a recorded fact, so this never
|
|
46
|
+
rejects. The threshold row was already claimed, which is what keeps a
|
|
47
|
+
published notification to one per meter per month per threshold. */
|
|
48
|
+
export async function publishThresholdNotice(
|
|
49
|
+
resolve: NotificationPublisherResolver | undefined,
|
|
50
|
+
input: NotificationPublishInput,
|
|
51
|
+
): Promise<void> {
|
|
52
|
+
if (input.recipients.length === 0) return;
|
|
53
|
+
try {
|
|
54
|
+
const publisher = resolve?.();
|
|
55
|
+
if (!publisher) return;
|
|
56
|
+
await publisher.publish({
|
|
57
|
+
tenantId: input.tenantId,
|
|
58
|
+
kind: input.kind,
|
|
59
|
+
sourceModule: clamp(input.sourceModule, LIMITS.sourceModule),
|
|
60
|
+
sourceRef: clamp(input.sourceRef, LIMITS.sourceRef),
|
|
61
|
+
title: clamp(input.title, LIMITS.title),
|
|
62
|
+
...(input.body === undefined
|
|
63
|
+
? {}
|
|
64
|
+
: { body: clamp(input.body, LIMITS.body) }),
|
|
65
|
+
recipients: input.recipients
|
|
66
|
+
.slice(0, LIMITS.recipients)
|
|
67
|
+
.map((recipient) => clamp(recipient, LIMITS.recipientId)),
|
|
68
|
+
});
|
|
69
|
+
} catch (error) {
|
|
70
|
+
console.warn(
|
|
71
|
+
`[metering] threshold notification for ${input.sourceRef} failed:`,
|
|
72
|
+
error instanceof Error ? error.message : error,
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import {
|
|
2
|
+
REPORT_PROVIDER_LIMITS,
|
|
3
|
+
type ReportProvider,
|
|
4
|
+
type ReportProviderAnswer,
|
|
5
|
+
type ReportRange,
|
|
6
|
+
type ReportTile,
|
|
7
|
+
} from '@flowdular/sdk/modules/reports';
|
|
8
|
+
import { METERING_PERMISSIONS } from '../acl/permissions.ts';
|
|
9
|
+
import type { MeterUsage } from '../domain/types.ts';
|
|
10
|
+
import type { MeteringService } from './metering-service.ts';
|
|
11
|
+
|
|
12
|
+
export const METERING_REPORT_PROVIDER_KEY = 'metering.usage';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* The label states the period because the tiles are this calendar month's
|
|
16
|
+
* rollup whatever range the reader picked: metering counts per month against
|
|
17
|
+
* the operator's monthly limit, and a slice of a month would not compare with
|
|
18
|
+
* that limit.
|
|
19
|
+
*/
|
|
20
|
+
export const METERING_REPORT_PROVIDER_LABEL = 'Usage this month';
|
|
21
|
+
|
|
22
|
+
/** This module's own bundle names the period; the literal above is the fallback. */
|
|
23
|
+
export const METERING_REPORT_PROVIDER_LABEL_KEY = 'metering.report.usage.label';
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* The calendar month a `YYYY-MM` rollup covers, both days included. Day zero of
|
|
27
|
+
* the next month is the last day of this one, so February and a 30 day month
|
|
28
|
+
* are captioned with the day they actually end on.
|
|
29
|
+
*/
|
|
30
|
+
export function monthPeriod(month: string): ReportRange {
|
|
31
|
+
const year = Number(month.slice(0, 4));
|
|
32
|
+
const ordinal = Number(month.slice(5, 7));
|
|
33
|
+
return {
|
|
34
|
+
from: `${month}-01`,
|
|
35
|
+
to: new Date(Date.UTC(year, ordinal, 0)).toISOString().slice(0, 10),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* The limit carried as the unit's context, so a tile reads "412 requests of
|
|
41
|
+
* 1000" without the contract growing a field only this provider would use. A
|
|
42
|
+
* composed unit past the contract's bound would make the whole provider
|
|
43
|
+
* unavailable, so an unusually long meter unit keeps its bare form instead.
|
|
44
|
+
*/
|
|
45
|
+
export function unitWithLimit(unit: string, limit: number | null): string {
|
|
46
|
+
if (limit === null) return unit.slice(0, REPORT_PROVIDER_LIMITS.unit);
|
|
47
|
+
const composed = `${unit} of ${limit}`;
|
|
48
|
+
return composed.length > REPORT_PROVIDER_LIMITS.unit
|
|
49
|
+
? unit.slice(0, REPORT_PROVIDER_LIMITS.unit)
|
|
50
|
+
: composed;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* One tile per meter, busiest first, bounded to what a provider answer carries.
|
|
55
|
+
* A workspace with more meters than that shows the ones it spends on; the Usage
|
|
56
|
+
* screen still lists every one.
|
|
57
|
+
*/
|
|
58
|
+
export function usageTiles(
|
|
59
|
+
usage: readonly MeterUsage[],
|
|
60
|
+
): readonly ReportTile[] {
|
|
61
|
+
return [...usage]
|
|
62
|
+
.sort(
|
|
63
|
+
(left, right) =>
|
|
64
|
+
right.used - left.used || left.meter.key.localeCompare(right.meter.key),
|
|
65
|
+
)
|
|
66
|
+
.slice(0, REPORT_PROVIDER_LIMITS.tiles)
|
|
67
|
+
.map((entry) => ({
|
|
68
|
+
key: entry.meter.key,
|
|
69
|
+
label: entry.meter.label,
|
|
70
|
+
value: entry.used,
|
|
71
|
+
unit: unitWithLimit(entry.meter.unit, entry.limit),
|
|
72
|
+
}));
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function aborted(signal: AbortSignal | undefined): boolean {
|
|
76
|
+
return signal?.aborted === true;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* This workspace's metered usage as a report provider. The read goes through
|
|
81
|
+
* this module's own service under its own tenant transaction, with the tenant
|
|
82
|
+
* reports.core resolved from the principal, so no table crosses a module line.
|
|
83
|
+
*/
|
|
84
|
+
export function createUsageReportProvider(
|
|
85
|
+
service: () => Promise<MeteringService>,
|
|
86
|
+
): ReportProvider {
|
|
87
|
+
return {
|
|
88
|
+
key: METERING_REPORT_PROVIDER_KEY,
|
|
89
|
+
label: METERING_REPORT_PROVIDER_LABEL,
|
|
90
|
+
labelKey: METERING_REPORT_PROVIDER_LABEL_KEY,
|
|
91
|
+
permission: METERING_PERMISSIONS.read,
|
|
92
|
+
async read({ tenantId, signal }): Promise<ReportProviderAnswer> {
|
|
93
|
+
if (aborted(signal)) return { tiles: [] };
|
|
94
|
+
const metering = await service();
|
|
95
|
+
const usage = await metering.usage(tenantId, { signal });
|
|
96
|
+
if (aborted(signal)) return { tiles: [] };
|
|
97
|
+
/* The tiles are one calendar month whatever range was asked for, so
|
|
98
|
+
the answer names that month. It is taken from the rows, which carry
|
|
99
|
+
the month the read itself used, so a read that crosses a month
|
|
100
|
+
boundary still captions the numbers it actually got. */
|
|
101
|
+
const month = usage[0]?.month ?? metering.currentMonth();
|
|
102
|
+
return { tiles: usageTiles(usage), period: monthPeriod(month) };
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
MeterKind,
|
|
3
|
+
MeterLimit,
|
|
4
|
+
MeterLimitEvent,
|
|
5
|
+
MeterThreshold,
|
|
6
|
+
MeterUsage,
|
|
7
|
+
UsageBucket,
|
|
8
|
+
} from '../domain/types.ts';
|
|
9
|
+
|
|
10
|
+
/** The declaration a fact is recorded under, as the registry resolved it. */
|
|
11
|
+
export interface RecordedMeter {
|
|
12
|
+
/** The full key, `<moduleId>.<key>`. */
|
|
13
|
+
readonly key: string;
|
|
14
|
+
readonly moduleId: string;
|
|
15
|
+
readonly label: string;
|
|
16
|
+
readonly unit: string;
|
|
17
|
+
readonly kind: MeterKind;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** Everything one fact needs, already validated and resolved by the service. */
|
|
21
|
+
export interface RecordFactInput {
|
|
22
|
+
readonly tenantId: string;
|
|
23
|
+
readonly meter: RecordedMeter;
|
|
24
|
+
readonly day: string;
|
|
25
|
+
readonly month: string;
|
|
26
|
+
readonly amount: number;
|
|
27
|
+
readonly sourceRef: string | null;
|
|
28
|
+
readonly at: number;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface RecordFactResult {
|
|
32
|
+
/** False when this source reference had already been counted. */
|
|
33
|
+
readonly recorded: boolean;
|
|
34
|
+
/** This month's usage after the fact landed; zero when nothing was. */
|
|
35
|
+
readonly used: number;
|
|
36
|
+
readonly limit: number | null;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface BucketQuery {
|
|
40
|
+
readonly meter: string;
|
|
41
|
+
readonly from: string;
|
|
42
|
+
readonly to: string;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export interface SetLimitInput {
|
|
46
|
+
readonly tenantId: string;
|
|
47
|
+
readonly meter: string;
|
|
48
|
+
readonly monthlyLimit: number;
|
|
49
|
+
readonly setBy: string;
|
|
50
|
+
readonly at: number;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export interface SetLimitResult {
|
|
54
|
+
readonly limit: MeterLimit;
|
|
55
|
+
readonly previousLimit: number | null;
|
|
56
|
+
readonly event: MeterLimitEvent;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export interface UsageAgainstLimit {
|
|
60
|
+
readonly used: number;
|
|
61
|
+
readonly limit: number | null;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* What a caller that may be abandoned hands down to the statement. A read on a
|
|
66
|
+
* request path passes the signal the caller is bounded by, so the statement is
|
|
67
|
+
* cancelled with the work nobody is waiting for any more.
|
|
68
|
+
*/
|
|
69
|
+
export interface MeteringReadOptions {
|
|
70
|
+
readonly signal?: AbortSignal | undefined;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** The database-agnostic business port. No driver type crosses it. */
|
|
74
|
+
export interface MeteringRepository {
|
|
75
|
+
/**
|
|
76
|
+
* The whole fact in one tenant-scoped write transaction: the meter as this
|
|
77
|
+
* workspace recorded it, the idempotency claim, the day bucket, and the
|
|
78
|
+
* threshold rows this fact is the first to reach.
|
|
79
|
+
*/
|
|
80
|
+
recordFact(input: RecordFactInput): Promise<RecordFactResult>;
|
|
81
|
+
/**
|
|
82
|
+
* Claims the thresholds of one meter and month that have not been claimed
|
|
83
|
+
* yet and answers the ones this call won. A claim that never reaches a
|
|
84
|
+
* published notification is the price of publishing at most once; a claim
|
|
85
|
+
* lost to a crash before the insert is re-evaluated by the next fact.
|
|
86
|
+
*/
|
|
87
|
+
claimThresholds(
|
|
88
|
+
tenantId: string,
|
|
89
|
+
meter: string,
|
|
90
|
+
month: string,
|
|
91
|
+
thresholds: readonly MeterThreshold[],
|
|
92
|
+
at: number,
|
|
93
|
+
): Promise<readonly MeterThreshold[]>;
|
|
94
|
+
/** This month's usage and the limit of one meter, in one read. */
|
|
95
|
+
usageAgainstLimit(
|
|
96
|
+
tenantId: string,
|
|
97
|
+
meter: string,
|
|
98
|
+
month: string,
|
|
99
|
+
): Promise<UsageAgainstLimit>;
|
|
100
|
+
/** Every meter this workspace recorded, with the month's usage and limit. */
|
|
101
|
+
listMeterUsage(
|
|
102
|
+
tenantId: string,
|
|
103
|
+
month: string,
|
|
104
|
+
options?: MeteringReadOptions,
|
|
105
|
+
): Promise<readonly MeterUsage[]>;
|
|
106
|
+
listBuckets(
|
|
107
|
+
tenantId: string,
|
|
108
|
+
query: BucketQuery,
|
|
109
|
+
): Promise<readonly UsageBucket[]>;
|
|
110
|
+
listLimits(tenantId: string): Promise<readonly MeterLimit[]>;
|
|
111
|
+
setLimit(input: SetLimitInput): Promise<SetLimitResult>;
|
|
112
|
+
listLimitEvents(
|
|
113
|
+
tenantId: string,
|
|
114
|
+
limit: number,
|
|
115
|
+
): Promise<readonly MeterLimitEvent[]>;
|
|
116
|
+
/**
|
|
117
|
+
* Removes at most `limit` buckets older than the UTC day `beforeDay`, and
|
|
118
|
+
* the idempotency claims of the same days with them: a claim outliving its
|
|
119
|
+
* bucket would suppress a fact whose usage is already gone.
|
|
120
|
+
*/
|
|
121
|
+
sweepBuckets(
|
|
122
|
+
tenantId: string,
|
|
123
|
+
beforeDay: string,
|
|
124
|
+
limit: number,
|
|
125
|
+
): Promise<{ readonly removed: number }>;
|
|
126
|
+
/** One keyset page of buckets, ordered by id, for the export walk. */
|
|
127
|
+
exportBucketsPage(
|
|
128
|
+
tenantId: string,
|
|
129
|
+
afterId: string,
|
|
130
|
+
limit: number,
|
|
131
|
+
): Promise<readonly UsageBucket[]>;
|
|
132
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export class MeteringServiceError extends Error {
|
|
2
|
+
constructor(
|
|
3
|
+
readonly code: string,
|
|
4
|
+
message: string,
|
|
5
|
+
readonly status = 400,
|
|
6
|
+
) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.name = 'MeteringServiceError';
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function bounded(
|
|
13
|
+
value: string,
|
|
14
|
+
field: string,
|
|
15
|
+
minimum: number,
|
|
16
|
+
maximum: number,
|
|
17
|
+
): string {
|
|
18
|
+
const normalized = typeof value === 'string' ? value.trim() : '';
|
|
19
|
+
if (normalized.length < minimum || normalized.length > maximum) {
|
|
20
|
+
throw new MeteringServiceError(
|
|
21
|
+
'INVALID_INPUT',
|
|
22
|
+
`${field} must contain between ${minimum} and ${maximum} characters.`,
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
if (normalized.includes('\u0000')) {
|
|
26
|
+
throw new MeteringServiceError(
|
|
27
|
+
'INVALID_INPUT',
|
|
28
|
+
`${field} contains an unsupported character.`,
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
return normalized;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function wholeNumber(
|
|
35
|
+
value: number,
|
|
36
|
+
field: string,
|
|
37
|
+
maximum: number,
|
|
38
|
+
): number {
|
|
39
|
+
if (!Number.isSafeInteger(value) || value < 0 || value > maximum) {
|
|
40
|
+
throw new MeteringServiceError(
|
|
41
|
+
'INVALID_INPUT',
|
|
42
|
+
`${field} must be a whole number between 0 and ${maximum}.`,
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
return value;
|
|
46
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import {
|
|
2
|
+
defineModuleSettings,
|
|
3
|
+
PLATFORM_SETTINGS_TENANT,
|
|
4
|
+
type ModuleSettingsRuntime,
|
|
5
|
+
} from '@flowdular/sdk/kernel';
|
|
6
|
+
import { WARNING_PERCENT_RANGE } from './services/metering-service.ts';
|
|
7
|
+
|
|
8
|
+
export const METERING_MODULE_ID = 'metering.core';
|
|
9
|
+
|
|
10
|
+
/** The share of a limit the owners are notified at, before it refuses. */
|
|
11
|
+
export const DEFAULT_WARNING_PERCENT = 80;
|
|
12
|
+
|
|
13
|
+
export const METERING_MODULE_SETTINGS = defineModuleSettings({
|
|
14
|
+
moduleId: METERING_MODULE_ID,
|
|
15
|
+
settings: {
|
|
16
|
+
warningPercent: {
|
|
17
|
+
type: 'number',
|
|
18
|
+
defaultValue: DEFAULT_WARNING_PERCENT,
|
|
19
|
+
min: WARNING_PERCENT_RANGE.minimum,
|
|
20
|
+
max: WARNING_PERCENT_RANGE.maximum,
|
|
21
|
+
visibility: 'shared',
|
|
22
|
+
client: false,
|
|
23
|
+
scope: 'platform',
|
|
24
|
+
labelKey: 'metering.settings.warningPercent.label',
|
|
25
|
+
label: 'Warning share of a limit (percent)',
|
|
26
|
+
descriptionKey: 'metering.settings.warningPercent.description',
|
|
27
|
+
description:
|
|
28
|
+
'Share of a monthly limit at which the workspace owners are notified, before the limit itself refuses.',
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
/* A setting read must never take a recording path down, so the accessor falls
|
|
34
|
+
back to the declared default when the runtime has not registered it yet. */
|
|
35
|
+
export function meteringWarningPercent(
|
|
36
|
+
settings: ModuleSettingsRuntime,
|
|
37
|
+
): number {
|
|
38
|
+
try {
|
|
39
|
+
return settings.get<number>(
|
|
40
|
+
PLATFORM_SETTINGS_TENANT,
|
|
41
|
+
METERING_MODULE_ID,
|
|
42
|
+
'warningPercent',
|
|
43
|
+
);
|
|
44
|
+
} catch {
|
|
45
|
+
return DEFAULT_WARNING_PERCENT;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"navigation.usage": "Usage",
|
|
3
|
+
"navigation.usageDescription": "What this workspace consumed this month, meter by meter.",
|
|
4
|
+
"navigation.limits": "Limits",
|
|
5
|
+
"navigation.limitsDescription": "The monthly ceilings the deployment operator set for this workspace.",
|
|
6
|
+
"common.administration": "Administration",
|
|
7
|
+
"common.refresh": "Refresh",
|
|
8
|
+
"common.refreshing": "Refreshing…",
|
|
9
|
+
"common.filters": "Filters",
|
|
10
|
+
"common.accessDenied": "Access denied",
|
|
11
|
+
"common.notYet": "Not yet",
|
|
12
|
+
"kind.cumulative": "Cumulative",
|
|
13
|
+
"kind.gauge": "Gauge",
|
|
14
|
+
"usage.title": "Usage",
|
|
15
|
+
"usage.description": "Every meter a module reported for this workspace, with this month's total in UTC.",
|
|
16
|
+
"usage.denied": "You need the usage permission to see what this workspace consumed.",
|
|
17
|
+
"usage.note": "Owners are notified at {percent} percent of a limit and again when it is reached. Limits are set by the deployment operator.",
|
|
18
|
+
"usage.unlimited": "{used} used",
|
|
19
|
+
"usage.ofLimit": "{used} of {limit}",
|
|
20
|
+
"usage.column.key": "Meter",
|
|
21
|
+
"usage.column.label": "Name",
|
|
22
|
+
"usage.column.unit": "Unit",
|
|
23
|
+
"usage.column.kind": "Kind",
|
|
24
|
+
"usage.column.used": "This month",
|
|
25
|
+
"usage.table.title": "Meters",
|
|
26
|
+
"usage.table.count": "{count} meters",
|
|
27
|
+
"usage.table.caption": "Meters of this workspace",
|
|
28
|
+
"usage.table.loading": "Loading meters…",
|
|
29
|
+
"usage.search.label": "Search meters",
|
|
30
|
+
"usage.search.placeholder": "Meter key or name",
|
|
31
|
+
"usage.filter.module": "Module",
|
|
32
|
+
"usage.filter.allModules": "All modules",
|
|
33
|
+
"usage.empty.title": "Nothing metered yet",
|
|
34
|
+
"usage.empty.hint": "A meter appears here the first time a module reports usage for this workspace.",
|
|
35
|
+
"usage.emptyFiltered.title": "No meter matches",
|
|
36
|
+
"usage.emptyFiltered.hint": "Change the search or the module to widen the list.",
|
|
37
|
+
"usage.error.load": "The meters could not be loaded.",
|
|
38
|
+
"limits.title": "Limits",
|
|
39
|
+
"limits.description": "Monthly ceilings per meter. They are set by the deployment operator and refuse the operation once exhausted.",
|
|
40
|
+
"limits.denied": "You need the usage permission to see the limits of this workspace.",
|
|
41
|
+
"limits.note": "A workspace cannot change its own limit. The deployment operator sets one with metering limits set.",
|
|
42
|
+
"limits.column.meter": "Meter",
|
|
43
|
+
"limits.column.monthlyLimit": "Monthly limit",
|
|
44
|
+
"limits.column.used": "This month",
|
|
45
|
+
"limits.column.setBy": "Set by",
|
|
46
|
+
"limits.column.updatedAt": "Updated",
|
|
47
|
+
"limits.table.title": "Monthly limits",
|
|
48
|
+
"limits.table.count": "{count} limits",
|
|
49
|
+
"limits.table.caption": "Monthly meter limits of this workspace",
|
|
50
|
+
"limits.table.loading": "Loading limits…",
|
|
51
|
+
"limits.search.label": "Search limits",
|
|
52
|
+
"limits.search.placeholder": "Meter key",
|
|
53
|
+
"limits.empty.title": "No limit set",
|
|
54
|
+
"limits.empty.hint": "Every meter of this workspace is unlimited until the deployment operator sets a ceiling.",
|
|
55
|
+
"limits.emptyFiltered.title": "No limit matches",
|
|
56
|
+
"limits.emptyFiltered.hint": "Change the search to widen the list.",
|
|
57
|
+
"limits.error.load": "The limits could not be loaded.",
|
|
58
|
+
"widget.unlimited": "No limit set",
|
|
59
|
+
"widget.share": "{percent}% of the limit, {usage}",
|
|
60
|
+
"widget.attention": "Attention",
|
|
61
|
+
"widget.link": "Open usage",
|
|
62
|
+
"error.request": "The request failed.",
|
|
63
|
+
"error.code.INVALID_INPUT": "The request was not accepted. Check the meter and the date range.",
|
|
64
|
+
"error.code.METER_NOT_DECLARED": "No composed module declares this meter.",
|
|
65
|
+
"settings.warningPercent.label": "Warning share of a limit (percent)",
|
|
66
|
+
"settings.warningPercent.description": "Share of a monthly limit at which the workspace owners are notified, before the limit itself refuses.",
|
|
67
|
+
"report.usage.label": "Usage this month"
|
|
68
|
+
}
|