@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
|
@@ -4,8 +4,10 @@ import type {
|
|
|
4
4
|
} from '@flowdular/sdk/harness';
|
|
5
5
|
import type {
|
|
6
6
|
AgentAuditEvent,
|
|
7
|
-
|
|
7
|
+
AgentAuditListQuery,
|
|
8
8
|
AgentDefinition,
|
|
9
|
+
AgentListPage,
|
|
10
|
+
AgentListQuery,
|
|
9
11
|
AgentDefinitionRevision,
|
|
10
12
|
ModuleAgentBinding,
|
|
11
13
|
ModuleAgentDefinition,
|
|
@@ -13,6 +15,7 @@ import type {
|
|
|
13
15
|
AgentRun,
|
|
14
16
|
AgentRunDetail,
|
|
15
17
|
AgentRunExecution,
|
|
18
|
+
AgentRunListQuery,
|
|
16
19
|
AgentProcedure,
|
|
17
20
|
AgentUsageAgent,
|
|
18
21
|
AgentUsageBucket,
|
|
@@ -69,11 +72,32 @@ export interface CompletedRunCost {
|
|
|
69
72
|
readonly costMicroUsd: number | null;
|
|
70
73
|
}
|
|
71
74
|
|
|
75
|
+
/** Where a run export page resumes: newest queue time first, then run id. */
|
|
76
|
+
export interface AgentRunExportCursor {
|
|
77
|
+
readonly queuedAt: number;
|
|
78
|
+
readonly id: string;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** One run and its steps, as the workspace export presents them. */
|
|
82
|
+
export interface ExportedAgentRun {
|
|
83
|
+
readonly run: AgentRun;
|
|
84
|
+
readonly events: readonly AgentExecutionEvent[];
|
|
85
|
+
}
|
|
86
|
+
|
|
72
87
|
export type PendingAgentAuditEvent = Omit<
|
|
73
88
|
AgentAuditEvent,
|
|
74
89
|
'id' | 'sequence' | 'previousHash' | 'eventHash'
|
|
75
90
|
>;
|
|
76
91
|
|
|
92
|
+
/**
|
|
93
|
+
* What a caller that may be abandoned hands down to the statement. A read on a
|
|
94
|
+
* request path passes the signal the caller is bounded by, so the statement is
|
|
95
|
+
* cancelled with the work nobody is waiting for any more.
|
|
96
|
+
*/
|
|
97
|
+
export interface AgentReadOptions {
|
|
98
|
+
readonly signal?: AbortSignal | undefined;
|
|
99
|
+
}
|
|
100
|
+
|
|
77
101
|
export interface AgentRepository {
|
|
78
102
|
close(): Promise<void>;
|
|
79
103
|
reconcileModuleAgents(
|
|
@@ -93,7 +117,13 @@ export interface AgentRepository {
|
|
|
93
117
|
expectedRevision: number,
|
|
94
118
|
audit: PendingAgentAuditEvent,
|
|
95
119
|
): Promise<ModuleAgentBinding>;
|
|
120
|
+
/* Every definition of the tenant, for the run queue capability and revision
|
|
121
|
+
adoption, which need the whole catalog. Screens read `listAgentsPage`. */
|
|
96
122
|
listAgents(tenantId: string): Promise<readonly AgentDefinition[]>;
|
|
123
|
+
listAgentsPage(
|
|
124
|
+
tenantId: string,
|
|
125
|
+
query: AgentListQuery,
|
|
126
|
+
): Promise<AgentListPage>;
|
|
97
127
|
getAgent(tenantId: string, agentId: string): Promise<AgentDefinition | null>;
|
|
98
128
|
getAgentRevision(
|
|
99
129
|
tenantId: string,
|
|
@@ -133,7 +163,10 @@ export interface AgentRepository {
|
|
|
133
163
|
readonly assignments: number;
|
|
134
164
|
readonly activeDefinitions: number;
|
|
135
165
|
}>;
|
|
136
|
-
listRuns(
|
|
166
|
+
listRuns(
|
|
167
|
+
tenantId: string,
|
|
168
|
+
query: AgentRunListQuery,
|
|
169
|
+
): Promise<readonly AgentRun[]>;
|
|
137
170
|
getRun(tenantId: string, runId: string): Promise<AgentRunDetail | null>;
|
|
138
171
|
listRunEvents(
|
|
139
172
|
tenantId: string,
|
|
@@ -240,6 +273,13 @@ export interface AgentRepository {
|
|
|
240
273
|
workerId: string,
|
|
241
274
|
leaseExpiresAt: number,
|
|
242
275
|
): Promise<boolean>;
|
|
276
|
+
/* Hands a claim back to the queue, clearing the lease, for work this worker
|
|
277
|
+
took but will not perform. Answers whether the row was still its own. */
|
|
278
|
+
releaseAction(
|
|
279
|
+
tenantId: string,
|
|
280
|
+
invocationId: string,
|
|
281
|
+
workerId: string,
|
|
282
|
+
): Promise<boolean>;
|
|
243
283
|
completeAction(
|
|
244
284
|
tenantId: string,
|
|
245
285
|
invocationId: string,
|
|
@@ -262,23 +302,63 @@ export interface AgentRepository {
|
|
|
262
302
|
completedAt: number,
|
|
263
303
|
audit: PendingAgentAuditEvent,
|
|
264
304
|
): Promise<AgentActionInvocation['status'] | null>;
|
|
305
|
+
/* Keyset page of the run export, newest queue time first, with the steps of
|
|
306
|
+
every run on the page. */
|
|
307
|
+
exportRunsPage(
|
|
308
|
+
tenantId: string,
|
|
309
|
+
after: AgentRunExportCursor | null,
|
|
310
|
+
limit: number,
|
|
311
|
+
): Promise<readonly ExportedAgentRun[]>;
|
|
312
|
+
/* Removes at most `limit` settled runs completed before `before`, taking
|
|
313
|
+
their steps and child rows with them. A queued or running run is never
|
|
314
|
+
removed, whatever the age of the request behind it. */
|
|
315
|
+
deleteSettledRunsBefore(
|
|
316
|
+
tenantId: string,
|
|
317
|
+
before: number,
|
|
318
|
+
limit: number,
|
|
319
|
+
): Promise<number>;
|
|
320
|
+
/* Removes at most `limit` runs one account requested, in any state. */
|
|
321
|
+
deleteRunsRequestedBy(
|
|
322
|
+
tenantId: string,
|
|
323
|
+
accountId: string,
|
|
324
|
+
limit: number,
|
|
325
|
+
): Promise<number>;
|
|
326
|
+
/**
|
|
327
|
+
* Takes the standing refusal of one workspace, meter and month, and answers
|
|
328
|
+
* whether this call is the one that took it. A refusal stands until the
|
|
329
|
+
* month turns or the limit is raised, so only the call that takes it writes
|
|
330
|
+
* the audit event and a retry loop adds no second row. The claim removes the
|
|
331
|
+
* rows of earlier months, so a workspace holds one row per meter.
|
|
332
|
+
*/
|
|
333
|
+
claimMeterRefusal(
|
|
334
|
+
tenantId: string,
|
|
335
|
+
meter: string,
|
|
336
|
+
period: string,
|
|
337
|
+
at: number,
|
|
338
|
+
): Promise<boolean>;
|
|
265
339
|
appendAuditEvent(event: PendingAgentAuditEvent): Promise<AgentAuditEvent>;
|
|
266
340
|
listAuditEvents(
|
|
267
341
|
tenantId: string,
|
|
268
342
|
limit: number,
|
|
269
343
|
): Promise<readonly AgentAuditEvent[]>;
|
|
270
|
-
/* Keyset page
|
|
271
|
-
|
|
344
|
+
/* Keyset page of the tenant trail in chain order, oldest first. */
|
|
345
|
+
exportAuditEventsPage(
|
|
272
346
|
tenantId: string,
|
|
273
|
-
|
|
347
|
+
afterSequence: number,
|
|
274
348
|
limit: number,
|
|
275
|
-
): Promise<
|
|
349
|
+
): Promise<readonly AgentAuditEvent[]>;
|
|
350
|
+
/* Keyset page over the tenant trail, newest first. */
|
|
351
|
+
pageAuditEvents(
|
|
352
|
+
tenantId: string,
|
|
353
|
+
query: AgentAuditListQuery,
|
|
354
|
+
): Promise<readonly AgentAuditEvent[]>;
|
|
276
355
|
verifyAuditChain(tenantId: string): Promise<boolean>;
|
|
277
356
|
verifyAuditChainDetailed(tenantId: string): Promise<AuditChainVerification>;
|
|
278
357
|
usageByDay(
|
|
279
358
|
tenantId: string,
|
|
280
359
|
fromDay: string,
|
|
281
360
|
toDay: string,
|
|
361
|
+
options?: AgentReadOptions,
|
|
282
362
|
): Promise<readonly AgentUsageDay[]>;
|
|
283
363
|
usageByAgent(
|
|
284
364
|
tenantId: string,
|
|
@@ -54,6 +54,7 @@ export class AgentUsageService {
|
|
|
54
54
|
const to = usageDay(now);
|
|
55
55
|
const from = usageDay(now - (window - 1) * DAY_MS);
|
|
56
56
|
const monthFrom = firstDayOfMonth(now);
|
|
57
|
+
await this.settings?.prime(tenantId);
|
|
57
58
|
return {
|
|
58
59
|
from,
|
|
59
60
|
to,
|
|
@@ -87,6 +88,7 @@ export class AgentUsageService {
|
|
|
87
88
|
agentId: string,
|
|
88
89
|
now = this.now(),
|
|
89
90
|
): Promise<BudgetRefusal | null> {
|
|
91
|
+
await this.settings?.prime(tenantId);
|
|
90
92
|
const caps = this.caps(tenantId);
|
|
91
93
|
if (caps.monthlyCostMicroUsd === 0 && caps.agentMonthlyCostMicroUsd === 0) {
|
|
92
94
|
return null;
|
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
import type { AgentHarness, AgentProvider } from '@flowdular/sdk/harness';
|
|
2
|
-
import type {
|
|
2
|
+
import type {
|
|
3
|
+
AgentRun,
|
|
4
|
+
AgentRunExecution,
|
|
5
|
+
AgentWorkerStatus,
|
|
6
|
+
} from '../domain/types.ts';
|
|
3
7
|
import type { AgentRepository, RecoverableRun } from './repository.ts';
|
|
8
|
+
import {
|
|
9
|
+
publishRunOutcome,
|
|
10
|
+
runNotificationRecipients,
|
|
11
|
+
type NotificationPublisherResolver,
|
|
12
|
+
} from './notifications.ts';
|
|
13
|
+
import { AGENT_METERS, type MeterRegistryResolver } from './metering.ts';
|
|
4
14
|
import type { AgentProviderBroker } from './provider-broker.ts';
|
|
5
15
|
import type { AgentRunGrantAuthority } from './run-grant.ts';
|
|
6
16
|
|
|
@@ -12,6 +22,13 @@ export interface AgentWorkerOptions {
|
|
|
12
22
|
readonly leaseMs: number;
|
|
13
23
|
readonly runGrantAuthority?: AgentRunGrantAuthority;
|
|
14
24
|
readonly providerBroker?: AgentProviderBroker;
|
|
25
|
+
/* Resolved when a run settles. Absent, or resolving to null, means the
|
|
26
|
+
optional notifications module is not composed and nothing is published. */
|
|
27
|
+
readonly notifications?: NotificationPublisherResolver;
|
|
28
|
+
/* Resolved when a run settles, so the registry is the one the platform holds
|
|
29
|
+
then. Absent only in a process that built a worker outside the module
|
|
30
|
+
composition, such as a test; a composed deployment always has it. */
|
|
31
|
+
readonly meters?: MeterRegistryResolver;
|
|
15
32
|
readonly now?: () => number;
|
|
16
33
|
}
|
|
17
34
|
|
|
@@ -35,10 +52,17 @@ const CANCELLED = 'cancelled';
|
|
|
35
52
|
const SHUTDOWN = 'worker-shutdown';
|
|
36
53
|
const LEASE_LOST = 'lease-lost';
|
|
37
54
|
|
|
55
|
+
/* A provider, a driver or the database can put any text on `code`. Only a
|
|
56
|
+
stable code may reach the failure record, the audit metadata and the
|
|
57
|
+
notification body a person reads. */
|
|
58
|
+
const STABLE_CODE = /^[A-Z][A-Z0-9_]+$/;
|
|
59
|
+
|
|
38
60
|
function failure(error: unknown): { code: string; message: string } {
|
|
39
61
|
if (error instanceof Error) {
|
|
40
62
|
const code =
|
|
41
|
-
'code' in error &&
|
|
63
|
+
'code' in error &&
|
|
64
|
+
typeof error.code === 'string' &&
|
|
65
|
+
STABLE_CODE.test(error.code)
|
|
42
66
|
? error.code
|
|
43
67
|
: 'AGENT_EXECUTION_FAILED';
|
|
44
68
|
return { code, message: error.message.slice(0, 1_000) };
|
|
@@ -242,6 +266,10 @@ export class AgentWorker {
|
|
|
242
266
|
): Promise<void> {
|
|
243
267
|
let eventWrites = Promise.resolve();
|
|
244
268
|
let eventFailure: unknown;
|
|
269
|
+
/* The abort a refused event write decides on waits for one ownership
|
|
270
|
+
probe; the failure path awaits this so the reason is known before the
|
|
271
|
+
run is settled, and the release waits for it so nothing outruns it. */
|
|
272
|
+
let eventClassification = Promise.resolve();
|
|
245
273
|
const renewal = setInterval(
|
|
246
274
|
async () => {
|
|
247
275
|
try {
|
|
@@ -312,9 +340,25 @@ export class AgentWorker {
|
|
|
312
340
|
event,
|
|
313
341
|
),
|
|
314
342
|
);
|
|
315
|
-
|
|
343
|
+
eventClassification = eventWrites.catch(async (error) => {
|
|
344
|
+
/* An event refused on a run this worker no longer holds is the lost
|
|
345
|
+
lease, not a persistence fault: an erasure or another worker took
|
|
346
|
+
the row, and which failure surfaces first is a matter of timing.
|
|
347
|
+
One rejection reaches every later write; classify it once. */
|
|
348
|
+
if (eventFailure !== undefined) return;
|
|
316
349
|
eventFailure = error;
|
|
317
|
-
|
|
350
|
+
let owned = false;
|
|
351
|
+
try {
|
|
352
|
+
owned = await this.repository.renewLease(
|
|
353
|
+
candidate.tenantId,
|
|
354
|
+
candidate.runId,
|
|
355
|
+
this.options.workerId,
|
|
356
|
+
this.#now() + this.options.leaseMs,
|
|
357
|
+
);
|
|
358
|
+
} catch {
|
|
359
|
+
owned = false;
|
|
360
|
+
}
|
|
361
|
+
controller.abort(owned ? 'event-persistence-failed' : LEASE_LOST);
|
|
318
362
|
});
|
|
319
363
|
};
|
|
320
364
|
const result = await this.harness.execute(
|
|
@@ -356,13 +400,19 @@ export class AgentWorker {
|
|
|
356
400
|
occurredAt: result.completedAt,
|
|
357
401
|
},
|
|
358
402
|
);
|
|
403
|
+
await this.#reportMeters(execution.run, result.usage.totalTokens);
|
|
359
404
|
await this.#recordRunSuccess(
|
|
360
405
|
execution,
|
|
361
406
|
result.completedAt,
|
|
362
407
|
result.startedAt,
|
|
363
408
|
);
|
|
409
|
+
await this.#publishOutcome(execution.run, 'agent-run-completed', {
|
|
410
|
+
title: `Agent ${execution.run.agentName} finished`,
|
|
411
|
+
body: `The run finished in ${result.completedAt - result.startedAt} ms and used ${result.usage.totalTokens} tokens.`,
|
|
412
|
+
});
|
|
364
413
|
} catch (error) {
|
|
365
414
|
await eventWrites.catch(() => undefined);
|
|
415
|
+
await eventClassification;
|
|
366
416
|
/* The service already moved a cancelled row and wrote its audit event;
|
|
367
417
|
the worker only had to stop. */
|
|
368
418
|
if (controller.signal.aborted && controller.signal.reason === CANCELLED) {
|
|
@@ -412,10 +462,70 @@ export class AgentWorker {
|
|
|
412
462
|
`[agents] run ${candidate.runId} failed with ${failed.code} and could not be settled:`,
|
|
413
463
|
settleError instanceof Error ? settleError.message : settleError,
|
|
414
464
|
);
|
|
465
|
+
return;
|
|
415
466
|
}
|
|
467
|
+
await this.#reportMeters(execution.run, 0);
|
|
468
|
+
await this.#publishOutcome(execution.run, 'agent-run-failed', {
|
|
469
|
+
title: `Agent ${execution.run.agentName} failed`,
|
|
470
|
+
body: `The run stopped with ${failed.code}.`,
|
|
471
|
+
});
|
|
416
472
|
} finally {
|
|
417
473
|
clearInterval(renewal);
|
|
418
474
|
await eventWrites.catch(() => undefined);
|
|
475
|
+
await eventClassification;
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
/* Called after the terminal row is committed and outside its transaction.
|
|
480
|
+
The run id is the source reference, so a terminal step that runs twice
|
|
481
|
+
reports the same outcome instead of adding a second notification. A run a
|
|
482
|
+
workflow owns stays silent: workflows.core reports the outcome the person
|
|
483
|
+
actually asked for, once, instead of one notification per agent step. */
|
|
484
|
+
async #publishOutcome(
|
|
485
|
+
run: AgentRun,
|
|
486
|
+
kind: 'agent-run-completed' | 'agent-run-failed',
|
|
487
|
+
copy: { readonly title: string; readonly body: string },
|
|
488
|
+
): Promise<void> {
|
|
489
|
+
if (run.workflowRunId !== null) return;
|
|
490
|
+
await publishRunOutcome(this.options.notifications, {
|
|
491
|
+
tenantId: run.tenantId,
|
|
492
|
+
kind,
|
|
493
|
+
sourceModule: 'agents.core',
|
|
494
|
+
sourceRef: run.id,
|
|
495
|
+
title: copy.title,
|
|
496
|
+
body: copy.body,
|
|
497
|
+
recipients: runNotificationRecipients(run.authorizationSubject),
|
|
498
|
+
});
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
/* Called after the terminal row is committed and outside its transaction.
|
|
502
|
+
The run id is the source reference, so a terminal step that runs twice
|
|
503
|
+
counts the run once. Counting is advisory: metering.core commits the fact
|
|
504
|
+
in its own transaction and a failure there never changes a settled run. A
|
|
505
|
+
run that reported no tokens counts none rather than claiming zero. */
|
|
506
|
+
async #reportMeters(run: AgentRun, totalTokens: number): Promise<void> {
|
|
507
|
+
const meters = this.options.meters?.();
|
|
508
|
+
if (!meters) return;
|
|
509
|
+
try {
|
|
510
|
+
await meters.record({
|
|
511
|
+
tenantId: run.tenantId,
|
|
512
|
+
meter: AGENT_METERS.runs,
|
|
513
|
+
amount: 1,
|
|
514
|
+
sourceRef: run.id,
|
|
515
|
+
});
|
|
516
|
+
if (totalTokens > 0) {
|
|
517
|
+
await meters.record({
|
|
518
|
+
tenantId: run.tenantId,
|
|
519
|
+
meter: AGENT_METERS.runTokens,
|
|
520
|
+
amount: totalTokens,
|
|
521
|
+
sourceRef: run.id,
|
|
522
|
+
});
|
|
523
|
+
}
|
|
524
|
+
} catch (error) {
|
|
525
|
+
console.warn(
|
|
526
|
+
`[agents] metering for run ${run.id} failed:`,
|
|
527
|
+
error instanceof Error ? error.message : error,
|
|
528
|
+
);
|
|
419
529
|
}
|
|
420
530
|
}
|
|
421
531
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
defineModuleSettings,
|
|
3
|
+
ModuleSettingsError,
|
|
3
4
|
PLATFORM_SETTINGS_TENANT,
|
|
4
5
|
type ModuleSettingsDeclaration,
|
|
5
6
|
type ModuleSettingsRuntime,
|
|
@@ -166,6 +167,8 @@ export function agentsModuleSettingsFromEnvironment(
|
|
|
166
167
|
}
|
|
167
168
|
|
|
168
169
|
export interface AgentSettingsReader {
|
|
170
|
+
/** Loads a workspace's settings; a tenant-scoped read needs it first. */
|
|
171
|
+
prime(tenantId: string): Promise<void>;
|
|
169
172
|
workerConcurrency(): number;
|
|
170
173
|
workerLeaseMs(): number;
|
|
171
174
|
providerReadinessTtlMs(): number;
|
|
@@ -185,8 +188,9 @@ function settingsSource(value: unknown): ModuleSettingsRuntime | null {
|
|
|
185
188
|
: null;
|
|
186
189
|
}
|
|
187
190
|
|
|
188
|
-
/* Reads are live and per call. Without a settings runtime, or when
|
|
189
|
-
|
|
191
|
+
/* Reads are live and per call. Without a settings runtime, or when the
|
|
192
|
+
module's settings are not declared, the environment decides exactly as
|
|
193
|
+
before; a workspace nobody primed stays a loud caller defect. */
|
|
190
194
|
export function agentSettings(context: {
|
|
191
195
|
readonly environment: NodeJS.ProcessEnv;
|
|
192
196
|
readonly settings?: unknown;
|
|
@@ -204,11 +208,18 @@ export function agentSettings(context: {
|
|
|
204
208
|
return typeof value === typeof fallbackValue
|
|
205
209
|
? (value as T)
|
|
206
210
|
: fallbackValue;
|
|
207
|
-
} catch {
|
|
211
|
+
} catch (error) {
|
|
212
|
+
if (
|
|
213
|
+
error instanceof ModuleSettingsError &&
|
|
214
|
+
error.code === 'SETTINGS_NOT_PRIMED'
|
|
215
|
+
) {
|
|
216
|
+
throw error;
|
|
217
|
+
}
|
|
208
218
|
return fallbackValue;
|
|
209
219
|
}
|
|
210
220
|
};
|
|
211
221
|
return {
|
|
222
|
+
prime: (tenantId) => source?.prime(tenantId) ?? Promise.resolve(),
|
|
212
223
|
workerConcurrency: () =>
|
|
213
224
|
read(
|
|
214
225
|
PLATFORM_SETTINGS_TENANT,
|
|
@@ -8,6 +8,10 @@
|
|
|
8
8
|
"common.actions": "Agent actions",
|
|
9
9
|
"common.requestFailed": "The agent operation failed.",
|
|
10
10
|
"common.view": "View",
|
|
11
|
+
"common.page.label": "List pages",
|
|
12
|
+
"common.page.previous": "Previous",
|
|
13
|
+
"common.page.next": "Next",
|
|
14
|
+
"common.page.summary": "Page {page} · from {from}",
|
|
11
15
|
"navigation.agents": "Agents",
|
|
12
16
|
"navigation.agentsDescription": "Reusable worker definitions",
|
|
13
17
|
"navigation.providers": "Providers",
|
|
@@ -132,7 +136,7 @@
|
|
|
132
136
|
"definitions.lifecycle.delete.confirm": "Delete agent",
|
|
133
137
|
"definitions.lifecycle.delete.description": "Permanently delete {name}. Agents with run history cannot be deleted.",
|
|
134
138
|
"definitions.table.title": "Custom agents",
|
|
135
|
-
"definitions.table.count": "{
|
|
139
|
+
"definitions.table.count": "{count} on this page",
|
|
136
140
|
"definitions.table.caption": "Agent definitions",
|
|
137
141
|
"definitions.loading": "Loading custom agents…",
|
|
138
142
|
"definitions.search.placeholder": "Filter by name, key, or description",
|
|
@@ -148,6 +152,7 @@
|
|
|
148
152
|
"definitions.column.agent": "Agent",
|
|
149
153
|
"definitions.column.purpose": "Purpose",
|
|
150
154
|
"definitions.column.model": "Model",
|
|
155
|
+
"definitions.column.updated": "Updated",
|
|
151
156
|
"definitions.column.status": "Status",
|
|
152
157
|
"definitions.form.name": "Name",
|
|
153
158
|
"definitions.form.key": "Stable key",
|
|
@@ -284,9 +289,9 @@
|
|
|
284
289
|
"runs.error.cancel": "Could not cancel the run.",
|
|
285
290
|
"runs.error.load": "Could not load agent runs.",
|
|
286
291
|
"runs.table.title": "Execution history",
|
|
287
|
-
"runs.table.count": "{count}
|
|
292
|
+
"runs.table.count": "{count} on this page",
|
|
288
293
|
"runs.table.caption": "Agent runs",
|
|
289
|
-
"runs.search.placeholder": "Search agent
|
|
294
|
+
"runs.search.placeholder": "Search by agent name or run id",
|
|
290
295
|
"runs.search.label": "Search agent runs",
|
|
291
296
|
"runs.filter.status": "Status",
|
|
292
297
|
"runs.filter.allStatuses": "All statuses",
|
|
@@ -399,5 +404,10 @@
|
|
|
399
404
|
"settings.monthlyCostCapUsd.label": "Monthly agent budget (USD)",
|
|
400
405
|
"settings.monthlyCostCapUsd.description": "Enqueue is refused once the calendar month costs this much. Zero means no cap. A run already executing is never stopped.",
|
|
401
406
|
"settings.agentMonthlyCostCapUsd.label": "Monthly budget per agent (USD)",
|
|
402
|
-
"settings.agentMonthlyCostCapUsd.description": "Applied to every agent on its own, in addition to the workspace budget. Zero means no cap."
|
|
407
|
+
"settings.agentMonthlyCostCapUsd.description": "Applied to every agent on its own, in addition to the workspace budget. Zero means no cap.",
|
|
408
|
+
"report.runs.label": "Agent runs",
|
|
409
|
+
"report.runs.tile.runs": "Runs",
|
|
410
|
+
"report.runs.tile.tokens": "Tokens",
|
|
411
|
+
"report.runs.series.runsPerDay": "Runs per day",
|
|
412
|
+
"report.runs.series.tokensPerDay": "Tokens per day"
|
|
403
413
|
}
|
|
@@ -8,6 +8,10 @@
|
|
|
8
8
|
"common.actions": "Akcje agenta",
|
|
9
9
|
"common.requestFailed": "Operacja agenta nie powiodła się.",
|
|
10
10
|
"common.view": "Zobacz",
|
|
11
|
+
"common.page.label": "Strony listy",
|
|
12
|
+
"common.page.previous": "Poprzednia",
|
|
13
|
+
"common.page.next": "Następna",
|
|
14
|
+
"common.page.summary": "Strona {page} · od {from}",
|
|
11
15
|
"navigation.agents": "Agenci",
|
|
12
16
|
"navigation.agentsDescription": "Definicje agentów wielokrotnego użytku",
|
|
13
17
|
"navigation.providers": "Dostawcy modeli",
|
|
@@ -132,7 +136,7 @@
|
|
|
132
136
|
"definitions.lifecycle.delete.confirm": "Usuń agenta",
|
|
133
137
|
"definitions.lifecycle.delete.description": "Trwale usuń agenta {name}. Agenta z historią uruchomień nie można usunąć.",
|
|
134
138
|
"definitions.table.title": "Agenci własni",
|
|
135
|
-
"definitions.table.count": "
|
|
139
|
+
"definitions.table.count": "Na tej stronie: {count}",
|
|
136
140
|
"definitions.table.caption": "Definicje agentów",
|
|
137
141
|
"definitions.loading": "Wczytywanie agentów własnych…",
|
|
138
142
|
"definitions.search.placeholder": "Szukaj po nazwie, kluczu lub opisie",
|
|
@@ -148,6 +152,7 @@
|
|
|
148
152
|
"definitions.column.agent": "Agent",
|
|
149
153
|
"definitions.column.purpose": "Zadanie",
|
|
150
154
|
"definitions.column.model": "Model",
|
|
155
|
+
"definitions.column.updated": "Zaktualizowano",
|
|
151
156
|
"definitions.column.status": "Status",
|
|
152
157
|
"definitions.form.name": "Nazwa",
|
|
153
158
|
"definitions.form.key": "Stały klucz",
|
|
@@ -284,9 +289,9 @@
|
|
|
284
289
|
"runs.error.cancel": "Nie udało się anulować uruchomienia.",
|
|
285
290
|
"runs.error.load": "Nie udało się wczytać uruchomień agentów.",
|
|
286
291
|
"runs.table.title": "Historia wykonań",
|
|
287
|
-
"runs.table.count": "
|
|
292
|
+
"runs.table.count": "Na tej stronie: {count}",
|
|
288
293
|
"runs.table.caption": "Uruchomienia agentów",
|
|
289
|
-
"runs.search.placeholder": "Szukaj
|
|
294
|
+
"runs.search.placeholder": "Szukaj po nazwie agenta lub identyfikatorze uruchomienia",
|
|
290
295
|
"runs.search.label": "Szukaj uruchomień agentów",
|
|
291
296
|
"runs.filter.status": "Status",
|
|
292
297
|
"runs.filter.allStatuses": "Wszystkie statusy",
|
|
@@ -399,5 +404,10 @@
|
|
|
399
404
|
"settings.monthlyCostCapUsd.label": "Miesięczny budżet agentów (USD)",
|
|
400
405
|
"settings.monthlyCostCapUsd.description": "Po osiągnięciu tej kwoty w miesiącu nowe uruchomienia są odrzucane. Zero wyłącza limit. Trwające uruchomienie nie jest przerywane.",
|
|
401
406
|
"settings.agentMonthlyCostCapUsd.label": "Miesięczny budżet jednego agenta (USD)",
|
|
402
|
-
"settings.agentMonthlyCostCapUsd.description": "Obowiązuje osobno dla każdego agenta, niezależnie od budżetu przestrzeni roboczej. Zero wyłącza limit."
|
|
407
|
+
"settings.agentMonthlyCostCapUsd.description": "Obowiązuje osobno dla każdego agenta, niezależnie od budżetu przestrzeni roboczej. Zero wyłącza limit.",
|
|
408
|
+
"report.runs.label": "Uruchomienia agentów",
|
|
409
|
+
"report.runs.tile.runs": "Uruchomienia",
|
|
410
|
+
"report.runs.tile.tokens": "Tokeny",
|
|
411
|
+
"report.runs.series.runsPerDay": "Uruchomienia dziennie",
|
|
412
|
+
"report.runs.series.tokensPerDay": "Tokeny dziennie"
|
|
403
413
|
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
CREATE TABLE IF NOT EXISTS approvals_requests (
|
|
2
|
+
id TEXT PRIMARY KEY,
|
|
3
|
+
tenant_id TEXT NOT NULL,
|
|
4
|
+
subject_module TEXT NOT NULL,
|
|
5
|
+
subject_ref TEXT NOT NULL,
|
|
6
|
+
permission TEXT NOT NULL,
|
|
7
|
+
action TEXT NOT NULL,
|
|
8
|
+
title TEXT NOT NULL,
|
|
9
|
+
summary TEXT,
|
|
10
|
+
requester_account_id TEXT NOT NULL,
|
|
11
|
+
requirement_json TEXT NOT NULL,
|
|
12
|
+
decisions_needed BIGINT NOT NULL CHECK (decisions_needed >= 1),
|
|
13
|
+
status TEXT NOT NULL CHECK (status IN ('pending', 'approved', 'rejected', 'expired', 'cancelled')),
|
|
14
|
+
expires_at BIGINT NOT NULL,
|
|
15
|
+
resolved_at BIGINT,
|
|
16
|
+
created_at BIGINT NOT NULL
|
|
17
|
+
);
|
|
18
|
+
-- A subject module that reopens after a crash has to find the request it
|
|
19
|
+
-- already opened instead of asking the same question twice. One pending
|
|
20
|
+
-- request per subject reference is what makes opening idempotent.
|
|
21
|
+
CREATE UNIQUE INDEX IF NOT EXISTS approvals_requests_pending_subject_idx
|
|
22
|
+
ON approvals_requests (tenant_id, subject_module, subject_ref)
|
|
23
|
+
WHERE status = 'pending';
|
|
24
|
+
CREATE INDEX IF NOT EXISTS approvals_requests_tenant_status_idx
|
|
25
|
+
ON approvals_requests (tenant_id, status, created_at DESC, id);
|
|
26
|
+
CREATE INDEX IF NOT EXISTS approvals_requests_requester_idx
|
|
27
|
+
ON approvals_requests (tenant_id, requester_account_id, created_at DESC, id);
|
|
28
|
+
-- The cross-tenant expiry poll reads in this order and stops at the first
|
|
29
|
+
-- request that is not due yet.
|
|
30
|
+
CREATE INDEX IF NOT EXISTS approvals_requests_routing_idx
|
|
31
|
+
ON approvals_requests (status, expires_at, tenant_id, id);
|
|
32
|
+
ALTER TABLE approvals_requests ENABLE ROW LEVEL SECURITY;
|
|
33
|
+
ALTER TABLE approvals_requests FORCE ROW LEVEL SECURITY;
|
|
34
|
+
CREATE POLICY approvals_requests_tenant_policy ON approvals_requests
|
|
35
|
+
USING (tenant_id = current_setting('coreloom.tenant_id', true))
|
|
36
|
+
WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
|
|
37
|
+
-- The eligibility snapshot taken when the request opened. It decides whose
|
|
38
|
+
-- inbox the request appears in, so it is a row per decider with its own index
|
|
39
|
+
-- rather than a list inside the request: the screen asks "what may I decide"
|
|
40
|
+
-- once per open workspace and that question has to stay one index lookup.
|
|
41
|
+
CREATE TABLE IF NOT EXISTS approvals_eligible (
|
|
42
|
+
tenant_id TEXT NOT NULL,
|
|
43
|
+
request_id TEXT NOT NULL,
|
|
44
|
+
account_id TEXT NOT NULL,
|
|
45
|
+
PRIMARY KEY (tenant_id, request_id, account_id)
|
|
46
|
+
);
|
|
47
|
+
CREATE INDEX IF NOT EXISTS approvals_eligible_account_idx
|
|
48
|
+
ON approvals_eligible (tenant_id, account_id, request_id);
|
|
49
|
+
ALTER TABLE approvals_eligible ENABLE ROW LEVEL SECURITY;
|
|
50
|
+
ALTER TABLE approvals_eligible FORCE ROW LEVEL SECURITY;
|
|
51
|
+
CREATE POLICY approvals_eligible_tenant_policy ON approvals_eligible
|
|
52
|
+
USING (tenant_id = current_setting('coreloom.tenant_id', true))
|
|
53
|
+
WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
|
|
54
|
+
CREATE TABLE IF NOT EXISTS approvals_decisions (
|
|
55
|
+
id TEXT PRIMARY KEY,
|
|
56
|
+
tenant_id TEXT NOT NULL,
|
|
57
|
+
request_id TEXT NOT NULL,
|
|
58
|
+
decider_account_id TEXT,
|
|
59
|
+
decision TEXT NOT NULL CHECK (decision IN ('approve', 'reject', 'expire', 'cancel')),
|
|
60
|
+
comment TEXT,
|
|
61
|
+
decided_at BIGINT NOT NULL,
|
|
62
|
+
-- Expiry is the one decision no member makes. Every other row names the
|
|
63
|
+
-- account answerable for it, and the pair is checked here rather than only
|
|
64
|
+
-- in the service that writes it.
|
|
65
|
+
CHECK ((decision = 'expire') = (decider_account_id IS NULL))
|
|
66
|
+
);
|
|
67
|
+
-- One approval or rejection per member per request. The service checks first,
|
|
68
|
+
-- but this index is what actually guarantees the conflict it reports.
|
|
69
|
+
CREATE UNIQUE INDEX IF NOT EXISTS approvals_decisions_decider_idx
|
|
70
|
+
ON approvals_decisions (tenant_id, request_id, decider_account_id)
|
|
71
|
+
WHERE decision IN ('approve', 'reject');
|
|
72
|
+
CREATE INDEX IF NOT EXISTS approvals_decisions_request_idx
|
|
73
|
+
ON approvals_decisions (tenant_id, request_id, decided_at, id);
|
|
74
|
+
ALTER TABLE approvals_decisions ENABLE ROW LEVEL SECURITY;
|
|
75
|
+
ALTER TABLE approvals_decisions FORCE ROW LEVEL SECURITY;
|
|
76
|
+
CREATE POLICY approvals_decisions_tenant_policy ON approvals_decisions
|
|
77
|
+
USING (tenant_id = current_setting('coreloom.tenant_id', true))
|
|
78
|
+
WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
-- The expiry loop has to find due pending requests before it knows whose they
|
|
2
|
+
-- are, and the requests table is invisible to the cross-tenant role: it carries
|
|
3
|
+
-- no background policy and the role holds no default table grant. This adds the
|
|
4
|
+
-- four routing columns and nothing else. The subject, the requester, the
|
|
5
|
+
-- requirement, the eligibility snapshot and the title stay unreadable on this
|
|
6
|
+
-- connection, and every request it names is read again under its own tenant
|
|
7
|
+
-- before anything about it is written.
|
|
8
|
+
DO $$
|
|
9
|
+
BEGIN
|
|
10
|
+
IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'coreloom_background') THEN
|
|
11
|
+
RAISE EXCEPTION 'The coreloom_background role must exist before this migration.';
|
|
12
|
+
END IF;
|
|
13
|
+
END
|
|
14
|
+
$$;
|
|
15
|
+
CREATE POLICY approvals_requests_background_policy ON approvals_requests
|
|
16
|
+
FOR SELECT TO coreloom_background
|
|
17
|
+
USING (true);
|
|
18
|
+
REVOKE SELECT ON approvals_requests FROM coreloom_background;
|
|
19
|
+
GRANT SELECT (tenant_id, id, expires_at, status) ON approvals_requests TO coreloom_background;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
-- The three indexes carry no data of their own, so dropping them returns the
|
|
2
|
+
-- schema to what 0002 left and costs only the scans the retention operations
|
|
3
|
+
-- then have to perform.
|
|
4
|
+
DROP INDEX IF EXISTS approvals_decisions_decider_account_idx;
|
|
5
|
+
DROP INDEX IF EXISTS approvals_requests_export_idx;
|
|
6
|
+
DROP INDEX IF EXISTS approvals_requests_resolved_idx;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
-- The retention sweep of approvals.core.requests asks one workspace for its
|
|
2
|
+
-- oldest resolved requests, the export walks every request of a workspace in
|
|
3
|
+
-- id order, and a subject erasure asks it for the decisions one account made.
|
|
4
|
+
-- None of the three is covered by what the module already carries: the status
|
|
5
|
+
-- index orders by creation rather than by resolution, the requester index
|
|
6
|
+
-- answers who asked rather than who decided, and no index carries the export's
|
|
7
|
+
-- own key order. All three are bounded batches, so all three need a range scan
|
|
8
|
+
-- rather than a pass over the workspace's requests.
|
|
9
|
+
CREATE INDEX IF NOT EXISTS approvals_requests_resolved_idx
|
|
10
|
+
ON approvals_requests (tenant_id, status, resolved_at, id);
|
|
11
|
+
CREATE INDEX IF NOT EXISTS approvals_requests_export_idx
|
|
12
|
+
ON approvals_requests (tenant_id, id);
|
|
13
|
+
CREATE INDEX IF NOT EXISTS approvals_decisions_decider_account_idx
|
|
14
|
+
ON approvals_decisions (tenant_id, decider_account_id, id);
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
-- The three indexes carry no data of their own, so dropping them returns the
|
|
2
|
+
-- schema to what 0003 left and costs only the sort every inbox page then pays.
|
|
3
|
+
DROP INDEX IF EXISTS approvals_requests_created_idx;
|
|
4
|
+
DROP INDEX IF EXISTS approvals_requests_requester_created_idx;
|
|
5
|
+
DROP INDEX IF EXISTS approvals_requests_status_created_idx;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
-- The inbox pages by keyset on (created_at, id) in one direction, under a
|
|
2
|
+
-- status filter, a requester filter, or neither. The two indexes 0001 carries
|
|
3
|
+
-- order created_at DESC with id ASC, so a page walked in either direction ends
|
|
4
|
+
-- in a sort, and a workspace-wide page has no index at all. These three carry
|
|
5
|
+
-- both keys ascending: a newest-first page is a backward scan of the same
|
|
6
|
+
-- index, and a page continued from a cursor starts where the cursor names.
|
|
7
|
+
CREATE INDEX IF NOT EXISTS approvals_requests_status_created_idx
|
|
8
|
+
ON approvals_requests (tenant_id, status, created_at, id);
|
|
9
|
+
CREATE INDEX IF NOT EXISTS approvals_requests_requester_created_idx
|
|
10
|
+
ON approvals_requests (tenant_id, requester_account_id, created_at, id);
|
|
11
|
+
CREATE INDEX IF NOT EXISTS approvals_requests_created_idx
|
|
12
|
+
ON approvals_requests (tenant_id, created_at, id);
|