@flowdular/sdk 0.2.4 → 0.3.1
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 +130 -3
- 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/cli-extension/SKILL.md +1 -1
- package/.ai/skills/deploy-operate/SKILL.md +119 -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/0005_approvals_grant_audit.down.sql +4 -0
- package/modules/approvals/migrations/0005_approvals_grant_audit.up.sql +20 -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 +327 -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 +107 -0
- package/modules/approvals/src/domain/grant.ts +69 -0
- package/modules/approvals/src/domain/types.ts +168 -0
- package/modules/approvals/src/index.ts +61 -0
- package/modules/approvals/src/platform.ts +136 -0
- package/modules/approvals/src/server/index.ts +42 -0
- package/modules/approvals/src/server/runtime.ts +185 -0
- package/modules/approvals/src/services/approvals-service.ts +637 -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 +783 -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 +256 -0
- package/modules/approvals/src/services/notifications.ts +95 -0
- package/modules/approvals/src/services/repository.ts +169 -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/0003_connectors_rotation_inventory.down.sql +2 -0
- package/modules/connectors/migrations/0003_connectors_rotation_inventory.up.sql +19 -0
- package/modules/connectors/migrations/README.md +3 -0
- package/modules/connectors/module.json +32 -0
- package/modules/{automations-workflows-integration → connectors}/package.json +28 -26
- package/modules/connectors/spec/module.yaml +448 -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/cli/commands.json +17 -0
- package/modules/connectors/src/cli/index.ts +126 -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-rotation.ts +221 -0
- package/modules/connectors/src/services/credential-vault.ts +194 -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 +202 -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/0003_documents_rotation_inventory.down.sql +2 -0
- package/modules/documents/migrations/0003_documents_rotation_inventory.up.sql +18 -0
- package/modules/documents/migrations/README.md +3 -0
- package/modules/documents/module.json +32 -0
- package/modules/documents/package.json +50 -0
- package/modules/documents/spec/module.yaml +248 -0
- package/modules/documents/src/acl/permissions.ts +6 -0
- package/modules/documents/src/api/endpoints.ts +401 -0
- package/modules/documents/src/cli/commands.json +17 -0
- package/modules/documents/src/cli/index.ts +145 -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 +270 -0
- package/modules/documents/src/services/documents-service.ts +590 -0
- package/modules/documents/src/services/index.ts +18 -0
- package/modules/documents/src/services/migration.ts +117 -0
- package/modules/documents/src/services/repository.ts +58 -0
- package/modules/documents/src/services/storage-rotation.ts +157 -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/0003_exports_rotation_inventory.down.sql +1 -0
- package/modules/exports/migrations/0003_exports_rotation_inventory.up.sql +9 -0
- package/modules/exports/migrations/README.md +3 -0
- package/modules/exports/module.json +32 -0
- package/modules/exports/package.json +45 -0
- package/modules/exports/spec/module.yaml +230 -0
- package/modules/exports/src/acl/permissions.ts +6 -0
- package/modules/exports/src/api/endpoints.ts +211 -0
- package/modules/exports/src/cli/commands.json +17 -0
- package/modules/exports/src/cli/index.ts +145 -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 +50 -0
- package/modules/exports/src/server/runtime.ts +160 -0
- package/modules/exports/src/services/data-classes.ts +59 -0
- package/modules/exports/src/services/database-repository.ts +403 -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 +116 -0
- package/modules/exports/src/services/repository.ts +96 -0
- package/modules/exports/src/services/storage-rotation.ts +138 -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 +180 -0
- package/packages/database/src/decoders.ts +25 -0
- package/packages/database/src/index.ts +17 -0
- package/packages/database/src/migrations.ts +7 -0
- package/packages/database/src/record-history.ts +5 -14
- package/packages/harness/src/index.ts +2 -0
- package/packages/harness/src/runtime.ts +378 -2
- package/packages/harness/src/tool-adapters.ts +20 -9
- package/packages/kernel/src/acl.ts +179 -0
- package/packages/kernel/src/approval-grant.ts +310 -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 +85 -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 +238 -0
- package/packages/storage/src/index.ts +49 -0
- package/packages/storage/src/local.ts +75 -0
- package/packages/storage/src/port.ts +262 -0
- package/packages/storage/src/read-token.ts +130 -0
- package/packages/storage/src/reseal.ts +128 -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,269 @@
|
|
|
1
|
+
schemaVersion: 2
|
|
2
|
+
id: metering.core
|
|
3
|
+
specVersion: 0.1.7
|
|
4
|
+
status: approved
|
|
5
|
+
name: Metering Core
|
|
6
|
+
description: Counts what a workspace consumes through meters every module declares, keeps the facts in daily buckets under the tenant's own row-level security, shows usage to the workspace, and lets the deployment operator set per-workspace limits that a module checks before a costly operation and that refuse it once exhausted.
|
|
7
|
+
profile: full
|
|
8
|
+
capabilities:
|
|
9
|
+
- api
|
|
10
|
+
- database
|
|
11
|
+
- client
|
|
12
|
+
- translations
|
|
13
|
+
- cli
|
|
14
|
+
dependencies:
|
|
15
|
+
- id: system.core
|
|
16
|
+
range: ^0.7.0
|
|
17
|
+
- id: auth.core
|
|
18
|
+
range: ^0.13.0
|
|
19
|
+
- id: reports.core
|
|
20
|
+
range: ^0.1.0
|
|
21
|
+
requires:
|
|
22
|
+
- id: notifications.publish.v1
|
|
23
|
+
optional: true
|
|
24
|
+
- id: reports.v1
|
|
25
|
+
optional: true
|
|
26
|
+
tenancy: required
|
|
27
|
+
locales:
|
|
28
|
+
- en
|
|
29
|
+
- pl
|
|
30
|
+
invariants:
|
|
31
|
+
- Persistence runs on the shared asynchronous database contract with explicit PostgreSQL SQL; every tenant table enables and forces row-level security with USING and WITH CHECK policies bound to the transaction-local tenant id, and the runtime role holds neither SUPERUSER nor BYPASSRLS.
|
|
32
|
+
- A meter is declared by its owning module through the public capability metering.meters.v1 at composition with a stable key, a label, a unit and whether it is cumulative per period or a gauge; metering.core records only what a module reports through the same capability and never reads another module's tables.
|
|
33
|
+
- metering.core registers the report provider metering.usage through the public capability reports.v1 at composition when reports.core is present, and continues without it when it is not. The provider answers this calendar month's usage per meter with the operator's monthly limit carried as the unit's context, ordered by usage and bounded to the tiles one provider answer may carry; it reads this module's own service inside this module's own tenant transaction and no other module's tables. It answers the calendar month it rolled up as the period of that answer, names itself with a key of this module's own translation bundle beside the English literal, and hands the reader's time budget to that transaction so the statement is cancelled when the budget expires.
|
|
34
|
+
- A usage fact is reported through record(tenantId, meter, amount, at, sourceRef) and written by metering.core inside its own tenant-scoped transaction, never through the reporter's database handle; it lands in the day bucket of the workspace's calendar day in UTC, uses integer arithmetic, and is idempotent per (tenantId, meter, sourceRef) when the reporter names a source reference. An instant outside the range a UTC day covers is refused with a stable error before anything is written, and a month total past the safe integer range is read as that maximum rather than failing the fact that crossed it, because every ceiling is smaller.
|
|
35
|
+
- A limit is a per-workspace ceiling per meter per calendar month, set only by the deployment operator through the CLI or a platform setting, never by the workspace; a workspace without a limit is unlimited.
|
|
36
|
+
- A module asks check(tenantId, meter, amount) before a costly operation and receives allowed, warning or refused; refused is returned once the month's usage plus the amount exceeds the limit, and the refusal is recorded in the module's audit trail by the caller with the stable code METER_LIMIT_EXCEEDED.
|
|
37
|
+
- When a month's usage first crosses 80 percent of a limit, and again when it reaches 100 percent, metering.core publishes a notification of kind meter-threshold to the workspace owners through notifications.publish.v1 when present, once per meter per month per threshold.
|
|
38
|
+
- Usage and limits are readable by members holding metering.usage.read; the deployment operator lists and sets limits with the CLI, which writes a limit event with the operator label in the same transaction as the limit.
|
|
39
|
+
- Buckets sum amounts for both meter kinds; a gauge meter differs only in how the reporter chooses amounts and how a screen labels them, and a distinct gauge rollup is a later decision.
|
|
40
|
+
- Buckets older than the workspace's retention for the class metering.core.buckets are swept through the platform data class registry, at most the batch the registry asked for, taking the idempotency claims of the swept days with them and reporting the number of buckets removed; limits and threshold records are kept until the operator removes them.
|
|
41
|
+
permissions:
|
|
42
|
+
- id: metering.usage.read
|
|
43
|
+
description: Read usage, meters and limits of the active workspace.
|
|
44
|
+
dataOwnership:
|
|
45
|
+
- metering.core owns meter declarations as recorded, day buckets, monthly limits and threshold notifications.
|
|
46
|
+
- Each declaring module owns the operation it meters and decides when to ask and how to refuse; metering.core never performs the operation.
|
|
47
|
+
entities:
|
|
48
|
+
- id: meter
|
|
49
|
+
name: Meter
|
|
50
|
+
description: One declared counter as the workspace sees it.
|
|
51
|
+
fields:
|
|
52
|
+
- id: key
|
|
53
|
+
type: string
|
|
54
|
+
required: true
|
|
55
|
+
unique: tenant
|
|
56
|
+
maxLength: 96
|
|
57
|
+
description: module id plus meter key, for example agents.core.run-tokens.
|
|
58
|
+
- id: moduleId
|
|
59
|
+
type: string
|
|
60
|
+
required: true
|
|
61
|
+
maxLength: 64
|
|
62
|
+
- id: label
|
|
63
|
+
type: string
|
|
64
|
+
required: true
|
|
65
|
+
maxLength: 120
|
|
66
|
+
- id: unit
|
|
67
|
+
type: string
|
|
68
|
+
required: true
|
|
69
|
+
maxLength: 32
|
|
70
|
+
- id: kind
|
|
71
|
+
type: enum
|
|
72
|
+
required: true
|
|
73
|
+
values:
|
|
74
|
+
- cumulative
|
|
75
|
+
- gauge
|
|
76
|
+
- id: bucket
|
|
77
|
+
name: Usage bucket
|
|
78
|
+
description: The usage of one meter on one UTC day.
|
|
79
|
+
fields:
|
|
80
|
+
- id: meter
|
|
81
|
+
type: reference
|
|
82
|
+
required: true
|
|
83
|
+
reference: meter
|
|
84
|
+
- id: day
|
|
85
|
+
type: date
|
|
86
|
+
required: true
|
|
87
|
+
- id: amount
|
|
88
|
+
type: integer
|
|
89
|
+
required: true
|
|
90
|
+
- id: events
|
|
91
|
+
type: integer
|
|
92
|
+
required: true
|
|
93
|
+
- id: limit
|
|
94
|
+
name: Monthly limit
|
|
95
|
+
description: The operator's ceiling for one meter in one workspace.
|
|
96
|
+
fields:
|
|
97
|
+
- id: meter
|
|
98
|
+
type: reference
|
|
99
|
+
required: true
|
|
100
|
+
reference: meter
|
|
101
|
+
- id: monthlyLimit
|
|
102
|
+
type: integer
|
|
103
|
+
required: true
|
|
104
|
+
- id: setBy
|
|
105
|
+
type: string
|
|
106
|
+
required: true
|
|
107
|
+
maxLength: 128
|
|
108
|
+
description: The operator label recorded by the CLI.
|
|
109
|
+
- id: updatedAt
|
|
110
|
+
type: datetime
|
|
111
|
+
required: true
|
|
112
|
+
- id: limit-event
|
|
113
|
+
name: Limit event
|
|
114
|
+
description: The immutable record of one limit change by the operator.
|
|
115
|
+
fields:
|
|
116
|
+
- id: meter
|
|
117
|
+
type: reference
|
|
118
|
+
required: true
|
|
119
|
+
reference: meter
|
|
120
|
+
- id: previousLimit
|
|
121
|
+
type: integer
|
|
122
|
+
required: false
|
|
123
|
+
- id: monthlyLimit
|
|
124
|
+
type: integer
|
|
125
|
+
required: true
|
|
126
|
+
- id: setBy
|
|
127
|
+
type: string
|
|
128
|
+
required: true
|
|
129
|
+
maxLength: 128
|
|
130
|
+
- id: occurredAt
|
|
131
|
+
type: datetime
|
|
132
|
+
required: true
|
|
133
|
+
- id: threshold-notice
|
|
134
|
+
name: Threshold notice
|
|
135
|
+
description: A record that a threshold notification was sent for a meter in a month.
|
|
136
|
+
fields:
|
|
137
|
+
- id: meter
|
|
138
|
+
type: reference
|
|
139
|
+
required: true
|
|
140
|
+
reference: meter
|
|
141
|
+
- id: month
|
|
142
|
+
type: string
|
|
143
|
+
required: true
|
|
144
|
+
maxLength: 7
|
|
145
|
+
description: YYYY-MM in UTC.
|
|
146
|
+
- id: threshold
|
|
147
|
+
type: enum
|
|
148
|
+
required: true
|
|
149
|
+
values:
|
|
150
|
+
- warning
|
|
151
|
+
- exhausted
|
|
152
|
+
- id: sentAt
|
|
153
|
+
type: datetime
|
|
154
|
+
required: true
|
|
155
|
+
screens:
|
|
156
|
+
- id: usage
|
|
157
|
+
kind: list
|
|
158
|
+
entity: meter
|
|
159
|
+
title: Usage
|
|
160
|
+
columns:
|
|
161
|
+
- key
|
|
162
|
+
- label
|
|
163
|
+
- unit
|
|
164
|
+
- kind
|
|
165
|
+
filters:
|
|
166
|
+
- moduleId
|
|
167
|
+
navigationGroup: Administration
|
|
168
|
+
- id: limits
|
|
169
|
+
kind: list
|
|
170
|
+
entity: limit
|
|
171
|
+
title: Limits
|
|
172
|
+
columns:
|
|
173
|
+
- meter
|
|
174
|
+
- monthlyLimit
|
|
175
|
+
- setBy
|
|
176
|
+
- updatedAt
|
|
177
|
+
navigationGroup: Administration
|
|
178
|
+
actions: []
|
|
179
|
+
widgets:
|
|
180
|
+
- id: usage-summary
|
|
181
|
+
slot: dashboard.metrics
|
|
182
|
+
entity: bucket
|
|
183
|
+
description: This month's usage of the three busiest meters against their limits when limits exist.
|
|
184
|
+
settings:
|
|
185
|
+
- key: warningPercent
|
|
186
|
+
type: integer
|
|
187
|
+
scope: platform
|
|
188
|
+
default: 80
|
|
189
|
+
description: Percent of a limit at which the warning notification is sent; 50 to 99.
|
|
190
|
+
agentTools: []
|
|
191
|
+
outOfScope:
|
|
192
|
+
- No module declares or reports a meter in this version. metering.core ships as the substrate only; agents.core run tokens is the first producer and is delivered as a separate change (D-METERING-PRODUCER).
|
|
193
|
+
- Billing, invoices, prices and payment collection are not offered; metering counts and limits.
|
|
194
|
+
- Workspace administrators cannot set their own limits; a self-imposed cost cap is a later decision.
|
|
195
|
+
- Real-time streaming of usage is not offered; the dashboard reads day buckets.
|
|
196
|
+
decisions:
|
|
197
|
+
- id: D-METERING-SCOPE
|
|
198
|
+
question: What does the first version contain?
|
|
199
|
+
answer: A meter registry per module, day buckets under tenant RLS, a usage screen, operator-set per-workspace monthly limits, and a check that refuses once exhausted; no billing.
|
|
200
|
+
decidedBy: user
|
|
201
|
+
- id: D-METERING-LIMITS
|
|
202
|
+
question: Who sets limits and what happens when they are exceeded?
|
|
203
|
+
answer: The deployment operator through the CLI or platform settings; owners are notified at 80 percent and at 100 percent, the operation is refused with a stable error and audited, and the month resets on the calendar.
|
|
204
|
+
decidedBy: user
|
|
205
|
+
- id: D-METERING-REGISTRY
|
|
206
|
+
question: How do modules declare and report?
|
|
207
|
+
answer: Through the capability metering.meters.v1 with declare at composition and record and check at run time; metering.core writes the fact in its own tenant-scoped transaction and no database handle crosses the capability, so a fact commits independently of whatever the reporter is doing and a source reference is what makes a repeat a no-op.
|
|
208
|
+
decidedBy: default
|
|
209
|
+
- id: D-METERING-PERMISSIONS
|
|
210
|
+
question: Who reads usage?
|
|
211
|
+
answer: Owners hold metering.usage.read; members hold nothing.
|
|
212
|
+
decidedBy: default
|
|
213
|
+
- id: D-METERING-CLI
|
|
214
|
+
question: What does the operator use?
|
|
215
|
+
answer: The commands metering limits list and metering limits set --workspace --meter --monthly-limit [--apply], with dry run and audit; a command that is not applying anything verifies the migration ledger and applies no schema, so a read never creates this module's tables.
|
|
216
|
+
decidedBy: default
|
|
217
|
+
- id: D-METERING-PRODUCER
|
|
218
|
+
question: Which module reports the first facts?
|
|
219
|
+
answer: None in this version. The substrate ships first, so the capability, the store, the limits and the screens are delivered and proved against a stand-in reporter, and agents.core run tokens is the first real producer, delivered next as its own change on the schedule the coordinator sets.
|
|
220
|
+
decidedBy: user
|
|
221
|
+
acceptanceScenarios:
|
|
222
|
+
- id: METERING-DECLARE-RECORD
|
|
223
|
+
given: A module declares a cumulative meter at composition and records two facts with source references on the same UTC day.
|
|
224
|
+
when: A principal holding metering.usage.read reads usage.
|
|
225
|
+
then: One bucket for that day holds the sum with two events, a repeat of a fact with the same source reference changes nothing, and the meter appears with its module, label and unit.
|
|
226
|
+
- id: METERING-CHECK
|
|
227
|
+
given: A workspace with a monthly limit of 100 on a meter and usage of 90 this month.
|
|
228
|
+
when: The module checks an amount of 5, then an amount of 20, then usage reaches 100 and it checks 1.
|
|
229
|
+
then: The first answers allowed, the second answers refused with METER_LIMIT_EXCEEDED before any write by the caller, and the third answers refused; a workspace without a limit always answers allowed.
|
|
230
|
+
- id: METERING-THRESHOLDS
|
|
231
|
+
given: A limit of 100 and a notifications capability present.
|
|
232
|
+
when: Usage crosses 80 and later reaches 100 within the same month, then more facts arrive.
|
|
233
|
+
then: One meter-threshold warning and one exhausted notification reach the workspace owners, each once, and the threshold records prevent repeats until the next month.
|
|
234
|
+
- id: METERING-LIMIT-SET
|
|
235
|
+
given: A workspace and a declared meter.
|
|
236
|
+
when: The operator runs metering limits set for the workspace and meter without --apply, then with --apply, then lists limits.
|
|
237
|
+
then: The dry run prints the plan and writes nothing, the apply persists the limit with the operator label and an audit event, and the list shows it; a member of the workspace cannot change it through any endpoint.
|
|
238
|
+
- id: METERING-MONTH-RESET
|
|
239
|
+
given: Usage exhausted a limit in one month.
|
|
240
|
+
when: The next calendar month begins and the module checks an amount.
|
|
241
|
+
then: The check answers allowed and the previous month's buckets remain readable.
|
|
242
|
+
- id: METERING-DENY
|
|
243
|
+
given: A principal is unauthenticated or lacks metering.usage.read.
|
|
244
|
+
when: The principal reads usage or limits.
|
|
245
|
+
then: The server denies the operation before repository access.
|
|
246
|
+
- id: METERING-TENANT-BOUNDARY
|
|
247
|
+
given: Two workspaces with buckets and limits on the same meter.
|
|
248
|
+
when: A runtime transaction bound to one workspace reads or writes any of them.
|
|
249
|
+
then: Only that workspace's rows are visible or mutable and a row carrying another tenant identifier is rejected by the forced policy.
|
|
250
|
+
- id: METERING-CLI-READONLY
|
|
251
|
+
given: A deployment database this module has never been migrated in.
|
|
252
|
+
when: The operator lists limits, or runs the set command without --apply.
|
|
253
|
+
then: The command applies no schema and refuses with a stable error naming the missing migration, and the tables appear only once a command runs with --apply or the platform starts.
|
|
254
|
+
- id: METERING-INSTANT-BOUNDS
|
|
255
|
+
given: A reporter passing an instant no UTC day covers.
|
|
256
|
+
when: It reports a fact.
|
|
257
|
+
then: The call is refused with a stable error and nothing is counted.
|
|
258
|
+
- id: METERING-SWEEP-BATCH
|
|
259
|
+
given: A workspace with buckets older than its retention.
|
|
260
|
+
when: The registry sweeps the class with a batch that is not a whole number, and again with one over the module's own ceiling.
|
|
261
|
+
then: Each pass removes rows under a batch clamped to a whole number within the ceiling, and neither is refused, because a batch this module would not have chosen is no reason to leave the rows unswept.
|
|
262
|
+
- id: METERING-ZERO-LIMIT
|
|
263
|
+
given: A meter whose workspace limit is zero.
|
|
264
|
+
when: A member reads usage.
|
|
265
|
+
then: The meter reads as fully consumed at 100 percent in the danger tone and its dashboard tile carries the attention badge, distinct from an unlimited meter, which carries no share.
|
|
266
|
+
- id: METERING-REPORT-USAGE
|
|
267
|
+
given: A workspace with facts recorded on several meters this month and an operator limit on one of them.
|
|
268
|
+
when: The reports.core provider metering.usage is read.
|
|
269
|
+
then: It answers one tile per meter with this month's usage as the value and the meter's unit carrying the monthly limit as its context, ordered by usage, bounded to the tiles one provider answer may carry, and no series. It names its own calendar month as the period those tiles cover and names itself with a key of this module's bundle, and it passes the reader's time budget into its own tenant transaction so an expired budget cancels the statement instead of leaving it running.
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import {
|
|
2
|
+
defineEndpoint,
|
|
3
|
+
jsonResponse,
|
|
4
|
+
problemResponse,
|
|
5
|
+
} from '@flowdular/sdk/server';
|
|
6
|
+
import type { AuthRuntime } from '@flowdular/sdk/modules/auth/server';
|
|
7
|
+
import {
|
|
8
|
+
endpointIdentityFromContext,
|
|
9
|
+
principalFromContext,
|
|
10
|
+
} from '@flowdular/sdk/modules/auth/server';
|
|
11
|
+
import { METERING_PERMISSIONS } from '../acl/permissions.ts';
|
|
12
|
+
import type { MeteringRuntime } from '../server/runtime.ts';
|
|
13
|
+
import { MeteringServiceError } from '../services/service-error.ts';
|
|
14
|
+
|
|
15
|
+
function failure(error: unknown): Response {
|
|
16
|
+
if (error instanceof MeteringServiceError) {
|
|
17
|
+
return jsonResponse(
|
|
18
|
+
{ error: { code: error.code, message: error.message } },
|
|
19
|
+
error.status,
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
return problemResponse(error, 'The metering operation failed.');
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/* Every route is a read. Limits are the operator's, so this module publishes no
|
|
26
|
+
mutation a workspace could reach, and there is no CSRF surface to guard. */
|
|
27
|
+
export function createMeteringRoutes(
|
|
28
|
+
_auth: AuthRuntime,
|
|
29
|
+
runtime: MeteringRuntime,
|
|
30
|
+
) {
|
|
31
|
+
const meters = defineEndpoint({
|
|
32
|
+
id: 'metering.meters.list',
|
|
33
|
+
path: '/api/metering/meters',
|
|
34
|
+
methods: ['GET'],
|
|
35
|
+
access: { kind: 'permission', permission: METERING_PERMISSIONS.read },
|
|
36
|
+
resolveIdentity: endpointIdentityFromContext,
|
|
37
|
+
handler: async ({ octane }) => {
|
|
38
|
+
try {
|
|
39
|
+
const service = await runtime.service();
|
|
40
|
+
return jsonResponse({
|
|
41
|
+
meters: await service.usage(principalFromContext(octane)!.tenantId),
|
|
42
|
+
warningPercent: service.warningPercent(),
|
|
43
|
+
});
|
|
44
|
+
} catch (error) {
|
|
45
|
+
return failure(error);
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
const buckets = defineEndpoint({
|
|
50
|
+
id: 'metering.buckets.list',
|
|
51
|
+
path: '/api/metering/buckets',
|
|
52
|
+
methods: ['GET'],
|
|
53
|
+
access: { kind: 'permission', permission: METERING_PERMISSIONS.read },
|
|
54
|
+
resolveIdentity: endpointIdentityFromContext,
|
|
55
|
+
handler: async ({ octane }) => {
|
|
56
|
+
try {
|
|
57
|
+
const url = new URL(octane.request.url);
|
|
58
|
+
const meter = url.searchParams.get('meter');
|
|
59
|
+
if (meter === null || meter === '') {
|
|
60
|
+
throw new MeteringServiceError('INVALID_INPUT', 'meter is required.');
|
|
61
|
+
}
|
|
62
|
+
const from = url.searchParams.get('from');
|
|
63
|
+
const to = url.searchParams.get('to');
|
|
64
|
+
const service = await runtime.service();
|
|
65
|
+
return jsonResponse({
|
|
66
|
+
buckets: await service.buckets(
|
|
67
|
+
principalFromContext(octane)!.tenantId,
|
|
68
|
+
{
|
|
69
|
+
meter,
|
|
70
|
+
...(from ? { from } : {}),
|
|
71
|
+
...(to ? { to } : {}),
|
|
72
|
+
},
|
|
73
|
+
),
|
|
74
|
+
});
|
|
75
|
+
} catch (error) {
|
|
76
|
+
return failure(error);
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
const limits = defineEndpoint({
|
|
81
|
+
id: 'metering.limits.list',
|
|
82
|
+
path: '/api/metering/limits',
|
|
83
|
+
methods: ['GET'],
|
|
84
|
+
access: { kind: 'permission', permission: METERING_PERMISSIONS.read },
|
|
85
|
+
resolveIdentity: endpointIdentityFromContext,
|
|
86
|
+
handler: async ({ octane }) => {
|
|
87
|
+
try {
|
|
88
|
+
const service = await runtime.service();
|
|
89
|
+
return jsonResponse({
|
|
90
|
+
limits: await service.limits(principalFromContext(octane)!.tenantId),
|
|
91
|
+
});
|
|
92
|
+
} catch (error) {
|
|
93
|
+
return failure(error);
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
return [meters.serverRoute, buckets.serverRoute, limits.serverRoute] as const;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export const endpoints = [
|
|
101
|
+
'metering.meters.list',
|
|
102
|
+
'metering.buckets.list',
|
|
103
|
+
'metering.limits.list',
|
|
104
|
+
] as const;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"protocolVersion": 1,
|
|
3
|
+
"moduleId": "metering.core",
|
|
4
|
+
"commands": [
|
|
5
|
+
{
|
|
6
|
+
"path": ["metering", "limits", "list"],
|
|
7
|
+
"capability": {
|
|
8
|
+
"id": "metering.limits.list",
|
|
9
|
+
"version": 1,
|
|
10
|
+
"summary": "List the monthly meter limits of one workspace.",
|
|
11
|
+
"risk": "read",
|
|
12
|
+
"requiresApprovedSpec": false,
|
|
13
|
+
"supportsDryRun": false
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"path": ["metering", "limits", "set"],
|
|
18
|
+
"capability": {
|
|
19
|
+
"id": "metering.limits.set",
|
|
20
|
+
"version": 1,
|
|
21
|
+
"summary": "Set the monthly limit of one meter for one workspace.",
|
|
22
|
+
"risk": "process",
|
|
23
|
+
"requiresApprovedSpec": false,
|
|
24
|
+
"supportsDryRun": true
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
]
|
|
28
|
+
}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import {
|
|
2
|
+
defineCliExtension,
|
|
3
|
+
type CliExtensionContext,
|
|
4
|
+
type CliExtensionResult,
|
|
5
|
+
} from '@flowdular/sdk/cli-protocol';
|
|
6
|
+
import {
|
|
7
|
+
authRuntimeOptionsFromEnvironment,
|
|
8
|
+
createAuthRuntime,
|
|
9
|
+
} from '@flowdular/sdk/modules/auth/server';
|
|
10
|
+
import { METER_LIMITS } from '../domain/meters.ts';
|
|
11
|
+
import { createMeteringRuntime } from '../server/runtime.ts';
|
|
12
|
+
import { MeteringServiceError } from '../services/service-error.ts';
|
|
13
|
+
import { DEFAULT_WARNING_PERCENT } from '../settings.ts';
|
|
14
|
+
|
|
15
|
+
const listCapability = {
|
|
16
|
+
id: 'metering.limits.list',
|
|
17
|
+
version: 1,
|
|
18
|
+
summary: 'List the monthly meter limits of one workspace.',
|
|
19
|
+
risk: 'read' as const,
|
|
20
|
+
requiresApprovedSpec: false,
|
|
21
|
+
supportsDryRun: false,
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const setCapability = {
|
|
25
|
+
id: 'metering.limits.set',
|
|
26
|
+
version: 1,
|
|
27
|
+
summary: 'Set the monthly limit of one meter for one workspace.',
|
|
28
|
+
risk: 'process' as const,
|
|
29
|
+
requiresApprovedSpec: false,
|
|
30
|
+
supportsDryRun: true,
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const EVIDENCE = ['modules/metering/spec/module.yaml', 'docs/cli.md'] as const;
|
|
34
|
+
|
|
35
|
+
const USAGE =
|
|
36
|
+
'Use metering limits set --workspace <slug|id> --meter <key> --monthly-limit <n> [--apply].';
|
|
37
|
+
|
|
38
|
+
interface Workspace {
|
|
39
|
+
readonly tenantId: string;
|
|
40
|
+
readonly slug: string;
|
|
41
|
+
readonly name: string;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function stringFlag(context: CliExtensionContext, name: string): string {
|
|
45
|
+
const value = context.flags.get(name);
|
|
46
|
+
if (typeof value !== 'string' || value.trim() === '') {
|
|
47
|
+
throw new MeteringServiceError(
|
|
48
|
+
'INPUT_REQUIRED',
|
|
49
|
+
`${USAGE} --${name} is missing.`,
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
return value.trim();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function integerFlag(context: CliExtensionContext, name: string): number {
|
|
56
|
+
const raw = stringFlag(context, name);
|
|
57
|
+
const value = Number(raw);
|
|
58
|
+
if (
|
|
59
|
+
!/^\d+$/.test(raw) ||
|
|
60
|
+
!Number.isSafeInteger(value) ||
|
|
61
|
+
value > METER_LIMITS.monthlyLimit
|
|
62
|
+
) {
|
|
63
|
+
throw new MeteringServiceError(
|
|
64
|
+
'INVALID_INPUT',
|
|
65
|
+
`--${name} must be a whole number between 0 and ${METER_LIMITS.monthlyLimit}.`,
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
return value;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function databases(context: CliExtensionContext) {
|
|
72
|
+
if (!context.databases) {
|
|
73
|
+
throw new MeteringServiceError(
|
|
74
|
+
'DATABASE_UNAVAILABLE',
|
|
75
|
+
'metering.core CLI commands read the deployment database, and this workspace has none configured.',
|
|
76
|
+
503,
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
return context.databases;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Resolves a workspace slug or identifier through auth.core's own service, on
|
|
84
|
+
* auth.core's own leases. metering.core never opens another module's table.
|
|
85
|
+
*/
|
|
86
|
+
async function resolveWorkspace(
|
|
87
|
+
context: CliExtensionContext,
|
|
88
|
+
reference: string,
|
|
89
|
+
): Promise<Workspace> {
|
|
90
|
+
const auth = createAuthRuntime({
|
|
91
|
+
databases: databases(context),
|
|
92
|
+
...authRuntimeOptionsFromEnvironment(process.env, context.workspaceRoot),
|
|
93
|
+
});
|
|
94
|
+
try {
|
|
95
|
+
const tenant = await (await auth.service()).findTenant(reference);
|
|
96
|
+
if (!tenant) {
|
|
97
|
+
throw new MeteringServiceError(
|
|
98
|
+
'WORKSPACE_NOT_FOUND',
|
|
99
|
+
`No workspace matches "${reference}".`,
|
|
100
|
+
404,
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
return { tenantId: tenant.tenantId, slug: tenant.slug, name: tenant.name };
|
|
104
|
+
} finally {
|
|
105
|
+
await auth.dispose();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/* The operator runs these outside a composed platform, so no module has
|
|
110
|
+
declared a meter and no threshold can be published from here: the runtime is
|
|
111
|
+
opened for its leases and its repository only.
|
|
112
|
+
|
|
113
|
+
A command that is not applying anything applies no schema either: a read and
|
|
114
|
+
a dry run verify the ledger and stop there, so `metering limits list` can
|
|
115
|
+
never be what creates this module's tables in a deployment. */
|
|
116
|
+
async function withRuntime<T>(
|
|
117
|
+
context: CliExtensionContext,
|
|
118
|
+
operation: (runtime: ReturnType<typeof createMeteringRuntime>) => Promise<T>,
|
|
119
|
+
): Promise<T> {
|
|
120
|
+
const runtime = createMeteringRuntime({
|
|
121
|
+
databases: databases(context),
|
|
122
|
+
warningPercent: () => DEFAULT_WARNING_PERCENT,
|
|
123
|
+
migrations: context.apply ? 'apply' : 'verify',
|
|
124
|
+
});
|
|
125
|
+
try {
|
|
126
|
+
return await operation(runtime);
|
|
127
|
+
} finally {
|
|
128
|
+
await runtime.dispose();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/** The person who ran the command, as the limit row records them. */
|
|
133
|
+
function operatorLabel(): string {
|
|
134
|
+
return `cli:${process.env.USER ?? 'operator'}`;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export const cliExtension = defineCliExtension({
|
|
138
|
+
protocolVersion: 1,
|
|
139
|
+
moduleId: 'metering.core',
|
|
140
|
+
commands: [
|
|
141
|
+
{
|
|
142
|
+
path: ['metering', 'limits', 'list'],
|
|
143
|
+
capability: listCapability,
|
|
144
|
+
execute: async (context): Promise<CliExtensionResult> => {
|
|
145
|
+
const workspace = await resolveWorkspace(
|
|
146
|
+
context,
|
|
147
|
+
stringFlag(context, 'workspace'),
|
|
148
|
+
);
|
|
149
|
+
return withRuntime(context, async (runtime) => {
|
|
150
|
+
const service = await runtime.service();
|
|
151
|
+
const limits = await service.limits(workspace.tenantId);
|
|
152
|
+
const usage = await service.usage(workspace.tenantId);
|
|
153
|
+
const used = new Map(
|
|
154
|
+
usage.map((entry) => [entry.meter.key, entry.used]),
|
|
155
|
+
);
|
|
156
|
+
return {
|
|
157
|
+
data: {
|
|
158
|
+
moduleId: 'metering.core',
|
|
159
|
+
workspace: workspace.slug,
|
|
160
|
+
limits: limits.map((limit) => ({
|
|
161
|
+
meter: limit.meter,
|
|
162
|
+
monthlyLimit: limit.monthlyLimit,
|
|
163
|
+
usedThisMonth: used.get(limit.meter) ?? 0,
|
|
164
|
+
setBy: limit.setBy,
|
|
165
|
+
updatedAt: new Date(limit.updatedAt).toISOString(),
|
|
166
|
+
})),
|
|
167
|
+
},
|
|
168
|
+
evidence: [...EVIDENCE],
|
|
169
|
+
};
|
|
170
|
+
});
|
|
171
|
+
},
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
path: ['metering', 'limits', 'set'],
|
|
175
|
+
capability: setCapability,
|
|
176
|
+
execute: async (context): Promise<CliExtensionResult> => {
|
|
177
|
+
const reference = stringFlag(context, 'workspace');
|
|
178
|
+
const meter = stringFlag(context, 'meter');
|
|
179
|
+
if (meter.length > METER_LIMITS.key) {
|
|
180
|
+
throw new MeteringServiceError(
|
|
181
|
+
'INVALID_INPUT',
|
|
182
|
+
`--meter must be at most ${METER_LIMITS.key} characters.`,
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
const monthlyLimit = integerFlag(context, 'monthly-limit');
|
|
186
|
+
const workspace = await resolveWorkspace(context, reference);
|
|
187
|
+
return withRuntime(context, async (runtime) => {
|
|
188
|
+
const service = await runtime.service();
|
|
189
|
+
const before =
|
|
190
|
+
(await service.limits(workspace.tenantId)).find(
|
|
191
|
+
(limit) => limit.meter === meter,
|
|
192
|
+
) ?? null;
|
|
193
|
+
/* An operator caps a meter before the workspace has reported its
|
|
194
|
+
first fact, so an unrecorded meter is a warning, never a
|
|
195
|
+
refusal. */
|
|
196
|
+
const recorded = (await service.usage(workspace.tenantId)).some(
|
|
197
|
+
(entry) => entry.meter.key === meter,
|
|
198
|
+
);
|
|
199
|
+
const warnings = recorded
|
|
200
|
+
? []
|
|
201
|
+
: [
|
|
202
|
+
`This workspace has not recorded the meter "${meter}" yet. The limit applies from its first fact.`,
|
|
203
|
+
];
|
|
204
|
+
if (!context.apply) {
|
|
205
|
+
return {
|
|
206
|
+
data: {
|
|
207
|
+
moduleId: 'metering.core',
|
|
208
|
+
applied: false,
|
|
209
|
+
workspace: workspace.slug,
|
|
210
|
+
meter,
|
|
211
|
+
previousLimit: before?.monthlyLimit ?? null,
|
|
212
|
+
monthlyLimit,
|
|
213
|
+
setBy: operatorLabel(),
|
|
214
|
+
},
|
|
215
|
+
evidence: [...EVIDENCE],
|
|
216
|
+
warnings,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
const saved = await service.setLimit({
|
|
220
|
+
tenantId: workspace.tenantId,
|
|
221
|
+
meter,
|
|
222
|
+
monthlyLimit,
|
|
223
|
+
setBy: operatorLabel(),
|
|
224
|
+
});
|
|
225
|
+
return {
|
|
226
|
+
data: {
|
|
227
|
+
moduleId: 'metering.core',
|
|
228
|
+
applied: true,
|
|
229
|
+
workspace: workspace.slug,
|
|
230
|
+
meter: saved.limit.meter,
|
|
231
|
+
previousLimit: saved.previousLimit,
|
|
232
|
+
monthlyLimit: saved.limit.monthlyLimit,
|
|
233
|
+
setBy: saved.limit.setBy,
|
|
234
|
+
auditEventId: saved.event.id,
|
|
235
|
+
occurredAt: new Date(saved.event.occurredAt).toISOString(),
|
|
236
|
+
},
|
|
237
|
+
evidence: [...EVIDENCE],
|
|
238
|
+
warnings,
|
|
239
|
+
};
|
|
240
|
+
});
|
|
241
|
+
},
|
|
242
|
+
},
|
|
243
|
+
],
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
export default cliExtension;
|