@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
|
@@ -106,6 +106,12 @@ export interface AgentToolContext {
|
|
|
106
106
|
refuse when the trusted identity is absent. */
|
|
107
107
|
readonly agentId?: string;
|
|
108
108
|
readonly agentName?: string;
|
|
109
|
+
/* How the tool was reached: a model turn inside an agent run, or a workflow
|
|
110
|
+
node running it as a published action. A tool whose admission differs per
|
|
111
|
+
caller kind reads this instead of assuming one. Optional keeps v1 callers
|
|
112
|
+
and direct module tests source-compatible; absent means an agent run,
|
|
113
|
+
because the workflow action runtime always states it. */
|
|
114
|
+
readonly invocation?: 'agent-run' | 'workflow-action';
|
|
109
115
|
readonly idempotencyKey?: string;
|
|
110
116
|
/* Trusted provenance for record history. Optional preserves v1 direct tool
|
|
111
117
|
callers; harness and workflow executions always provide it. */
|
|
@@ -115,6 +121,28 @@ export interface AgentToolContext {
|
|
|
115
121
|
readonly signal: AbortSignal;
|
|
116
122
|
}
|
|
117
123
|
|
|
124
|
+
export interface AgentToolConsentDecision {
|
|
125
|
+
readonly granted: boolean;
|
|
126
|
+
/** Stable code recorded on the denial event when the gate refuses. */
|
|
127
|
+
readonly reason?: string;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* A module-owned gate asked before every call of a tool that declares one, so
|
|
132
|
+
* a workspace can admit a tool per record (a connector instance an owner
|
|
133
|
+
* consented to) without the tool declaring a risk the harness refuses outright.
|
|
134
|
+
* The answer is computed per call from the already validated input and is never
|
|
135
|
+
* cached; a gate that throws denies.
|
|
136
|
+
*/
|
|
137
|
+
export interface AgentToolConsent {
|
|
138
|
+
/** Stable id of the gate, recorded on the denial event. */
|
|
139
|
+
readonly id: string;
|
|
140
|
+
check(
|
|
141
|
+
input: unknown,
|
|
142
|
+
context: AgentToolContext,
|
|
143
|
+
): Promise<AgentToolConsentDecision> | AgentToolConsentDecision;
|
|
144
|
+
}
|
|
145
|
+
|
|
118
146
|
export interface AgentTool {
|
|
119
147
|
readonly id: string;
|
|
120
148
|
readonly transport: 'api' | 'cli';
|
|
@@ -125,6 +153,9 @@ export interface AgentTool {
|
|
|
125
153
|
readonly contractVersion?: number;
|
|
126
154
|
readonly outputSchema?: Readonly<Record<string, unknown>>;
|
|
127
155
|
readonly risk?: 'read' | 'workspace-write' | 'external' | 'destructive';
|
|
156
|
+
/* Run-time admission on top of the permission snapshot. A tool declaring one
|
|
157
|
+
is offered to the model as usual and refused per call when the gate says so. */
|
|
158
|
+
readonly consent?: AgentToolConsent;
|
|
128
159
|
readonly idempotency?: 'required';
|
|
129
160
|
/* A mutating tool is executable only when its target persists the key and
|
|
130
161
|
returns the first result on retry. Declaring `required` alone is not that
|
|
@@ -355,15 +386,92 @@ function toolFailure(error: unknown): { code: string; message: string } {
|
|
|
355
386
|
return { code: 'TOOL_EXECUTION_FAILED', message };
|
|
356
387
|
}
|
|
357
388
|
|
|
389
|
+
/**
|
|
390
|
+
* `external` is the ceiling no unattended caller crosses: the CLI runner
|
|
391
|
+
* refuses it, `defineCliAgentTool` and `defineApiAgentTool` refuse to build it,
|
|
392
|
+
* and a hand-built tool object is refused here as well, before the model is
|
|
393
|
+
* ever told the tool exists.
|
|
394
|
+
*/
|
|
395
|
+
function admissibleRisk(tool: AgentTool): boolean {
|
|
396
|
+
return tool.risk !== 'external';
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
/* A refusal code comes from module code, so it is bounded to the shape an
|
|
400
|
+
event metadata field may carry before it is recorded. */
|
|
401
|
+
function consentReason(reason: string | undefined): string {
|
|
402
|
+
return reason !== undefined && /^[A-Z][A-Z0-9_]{2,63}$/.test(reason)
|
|
403
|
+
? reason
|
|
404
|
+
: 'TOOL_CONSENT_REFUSED';
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
/**
|
|
408
|
+
* The narrow tracing port the harness needs, declared here rather than
|
|
409
|
+
* imported: `@flowdular/sdk/server` is a sibling package, not a dependency of the
|
|
410
|
+
* harness, and its tracer satisfies this shape structurally. The composer that
|
|
411
|
+
* owns both hands one in; without it the harness records nothing and pays one
|
|
412
|
+
* optional call per provider and per tool.
|
|
413
|
+
*/
|
|
414
|
+
export interface AgentTraceContext {
|
|
415
|
+
readonly traceId: string;
|
|
416
|
+
readonly spanId: string;
|
|
417
|
+
readonly sampled: boolean;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
export interface AgentTraceSpan {
|
|
421
|
+
readonly context: AgentTraceContext;
|
|
422
|
+
setAttribute(key: string, value: string | number | boolean): void;
|
|
423
|
+
end(status?: 'unset' | 'ok' | 'error', message?: string): void;
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
export interface AgentSpanOptions {
|
|
427
|
+
readonly parent?: AgentTraceContext | null;
|
|
428
|
+
readonly kind?: 'internal' | 'client';
|
|
429
|
+
readonly attributes?: Readonly<Record<string, string | number | boolean>>;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
export interface AgentTracer {
|
|
433
|
+
startSpan(name: string, options?: AgentSpanOptions): AgentTraceSpan;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
/* Foreign code on the run path: a tracer that throws must cost the run
|
|
437
|
+
nothing, so both ends answer with an absent span instead of raising. */
|
|
438
|
+
function startSpan(
|
|
439
|
+
tracer: AgentTracer | undefined,
|
|
440
|
+
name: string,
|
|
441
|
+
options: AgentSpanOptions,
|
|
442
|
+
): AgentTraceSpan | undefined {
|
|
443
|
+
if (!tracer) return undefined;
|
|
444
|
+
try {
|
|
445
|
+
return tracer.startSpan(name, options);
|
|
446
|
+
} catch {
|
|
447
|
+
return undefined;
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
function endSpan(
|
|
452
|
+
span: AgentTraceSpan | undefined,
|
|
453
|
+
status: 'ok' | 'error',
|
|
454
|
+
message?: string,
|
|
455
|
+
): void {
|
|
456
|
+
if (!span) return;
|
|
457
|
+
try {
|
|
458
|
+
span.end(status, message);
|
|
459
|
+
} catch {
|
|
460
|
+
/* An observer that throws is the observer's defect, not the run's. */
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
|
|
358
464
|
export class AgentHarness {
|
|
359
465
|
readonly #providers: ReadonlyMap<string, AgentProvider>;
|
|
360
466
|
readonly #tools: ReadonlyMap<string, AgentTool>;
|
|
361
467
|
readonly #authorizeToolAccess: AgentToolAccessAuthorizer;
|
|
468
|
+
readonly #tracer: AgentTracer | undefined;
|
|
362
469
|
|
|
363
470
|
constructor(options: {
|
|
364
471
|
readonly providers: readonly AgentProvider[];
|
|
365
472
|
readonly tools?: readonly AgentTool[];
|
|
366
473
|
readonly authorizeToolAccess?: AgentToolAccessAuthorizer;
|
|
474
|
+
readonly tracer?: AgentTracer;
|
|
367
475
|
}) {
|
|
368
476
|
const providers = new Map<string, AgentProvider>();
|
|
369
477
|
for (const provider of options.providers) {
|
|
@@ -385,6 +493,9 @@ export class AgentHarness {
|
|
|
385
493
|
`Tool ${id} is already registered.`,
|
|
386
494
|
);
|
|
387
495
|
}
|
|
496
|
+
/* The gate id reaches the denial event, so it is held to the same
|
|
497
|
+
shape as the tool id rather than checked only where it is emitted. */
|
|
498
|
+
if (tool.consent) identifier(tool.consent.id, 'tool.consent.id');
|
|
388
499
|
toolTimeoutMs(tool.timeoutMs);
|
|
389
500
|
tools.set(id, tool);
|
|
390
501
|
}
|
|
@@ -394,6 +505,7 @@ export class AgentHarness {
|
|
|
394
505
|
service actors fail-closed instead of treating a stored snapshot as a
|
|
395
506
|
permanent credential. */
|
|
396
507
|
this.#authorizeToolAccess = options.authorizeToolAccess ?? (() => []);
|
|
508
|
+
this.#tracer = options.tracer;
|
|
397
509
|
}
|
|
398
510
|
|
|
399
511
|
providers(): readonly string[] {
|
|
@@ -514,6 +626,7 @@ export class AgentHarness {
|
|
|
514
626
|
const initialPermissions = await livePermissions();
|
|
515
627
|
const availableTools = [...this.#tools.values()]
|
|
516
628
|
.filter((tool) => snapshotGrants.has(tool.id))
|
|
629
|
+
.filter(admissibleRisk)
|
|
517
630
|
.filter((tool) =>
|
|
518
631
|
tool.requiredPermissions.every((permission) =>
|
|
519
632
|
initialPermissions.has(permission),
|
|
@@ -547,6 +660,8 @@ export class AgentHarness {
|
|
|
547
660
|
model: request.definition.model,
|
|
548
661
|
});
|
|
549
662
|
const grantedIds = new Set(availableTools.map((tool) => tool.id));
|
|
663
|
+
const tracer = this.#tracer;
|
|
664
|
+
let providerSpan: AgentTraceSpan | undefined;
|
|
550
665
|
let toolCallOrdinal = 0;
|
|
551
666
|
const invokeTool = async (
|
|
552
667
|
id: string,
|
|
@@ -555,6 +670,16 @@ export class AgentHarness {
|
|
|
555
670
|
): Promise<unknown> => {
|
|
556
671
|
const ordinal = ++toolCallOrdinal;
|
|
557
672
|
const tool = this.#tools.get(id);
|
|
673
|
+
if (tool && !admissibleRisk(tool)) {
|
|
674
|
+
emit('tool.denied', `Tool ${id} was denied.`, {
|
|
675
|
+
tool: id,
|
|
676
|
+
reason: 'TOOL_RISK_REFUSED',
|
|
677
|
+
});
|
|
678
|
+
throw new AgentHarnessError(
|
|
679
|
+
'TOOL_RISK_REFUSED',
|
|
680
|
+
`Tool ${id} declares external risk and cannot run unattended.`,
|
|
681
|
+
);
|
|
682
|
+
}
|
|
558
683
|
if (!tool || !grantedIds.has(id)) {
|
|
559
684
|
emit('tool.denied', `Tool ${id} was denied.`, {
|
|
560
685
|
tool: id,
|
|
@@ -623,6 +748,47 @@ export class AgentHarness {
|
|
|
623
748
|
});
|
|
624
749
|
throw error;
|
|
625
750
|
}
|
|
751
|
+
if (tool.consent) {
|
|
752
|
+
/* Foreign code: a throw is a refusal, never a crash. The run deadline
|
|
753
|
+
already bounds it, because the provider call this runs inside races
|
|
754
|
+
the execution timeout. */
|
|
755
|
+
let decision: AgentToolConsentDecision;
|
|
756
|
+
try {
|
|
757
|
+
decision = await tool.consent.check(input, {
|
|
758
|
+
runId: request.runId,
|
|
759
|
+
tenantId: request.tenantId,
|
|
760
|
+
requestedBy: request.requestedBy,
|
|
761
|
+
agentId: request.definition.id,
|
|
762
|
+
agentName: request.definition.name,
|
|
763
|
+
invocation: 'agent-run',
|
|
764
|
+
actor: {
|
|
765
|
+
kind: 'agent',
|
|
766
|
+
id: request.definition.id,
|
|
767
|
+
label: request.definition.name,
|
|
768
|
+
runId: request.runId,
|
|
769
|
+
},
|
|
770
|
+
...(authorizationSubject?.kind === 'user'
|
|
771
|
+
? { authorizationSubject }
|
|
772
|
+
: {}),
|
|
773
|
+
permissions,
|
|
774
|
+
signal: controller.signal,
|
|
775
|
+
});
|
|
776
|
+
} catch {
|
|
777
|
+
decision = { granted: false, reason: 'TOOL_CONSENT_UNAVAILABLE' };
|
|
778
|
+
}
|
|
779
|
+
if (!decision.granted) {
|
|
780
|
+
const reason = consentReason(decision.reason);
|
|
781
|
+
emit('tool.denied', `Tool ${id} was denied.`, {
|
|
782
|
+
tool: id,
|
|
783
|
+
consent: tool.consent.id,
|
|
784
|
+
reason,
|
|
785
|
+
});
|
|
786
|
+
throw new AgentHarnessError(
|
|
787
|
+
reason,
|
|
788
|
+
`Tool ${id} was not consented for this workspace.`,
|
|
789
|
+
);
|
|
790
|
+
}
|
|
791
|
+
}
|
|
626
792
|
emit('tool.started', `Tool ${id} started.`, {
|
|
627
793
|
tool: id,
|
|
628
794
|
ordinal,
|
|
@@ -658,6 +824,7 @@ export class AgentHarness {
|
|
|
658
824
|
requestedBy: request.requestedBy,
|
|
659
825
|
agentId: request.definition.id,
|
|
660
826
|
agentName: request.definition.name,
|
|
827
|
+
invocation: 'agent-run',
|
|
661
828
|
actor: {
|
|
662
829
|
kind: 'agent',
|
|
663
830
|
id: request.definition.id,
|
|
@@ -710,6 +877,38 @@ export class AgentHarness {
|
|
|
710
877
|
controller.signal.removeEventListener('abort', abortTool);
|
|
711
878
|
}
|
|
712
879
|
};
|
|
880
|
+
/* Wrapped rather than instrumented inside: the wrapper sees exactly what
|
|
881
|
+
the provider sees, so a denial before the tool ever runs is a span too.
|
|
882
|
+
Without a tracer the provider is handed the original function. */
|
|
883
|
+
const tracedInvokeTool: typeof invokeTool = !tracer
|
|
884
|
+
? invokeTool
|
|
885
|
+
: async (id, input, invocation = {}) => {
|
|
886
|
+
const span = startSpan(tracer, `tool ${id}`, {
|
|
887
|
+
...(providerSpan ? { parent: providerSpan.context } : {}),
|
|
888
|
+
kind: 'internal',
|
|
889
|
+
attributes: {
|
|
890
|
+
'flowdular.tool': id,
|
|
891
|
+
...(invocation.providerCallId
|
|
892
|
+
? {
|
|
893
|
+
'flowdular.tool.provider_call_id':
|
|
894
|
+
invocation.providerCallId.slice(0, 128),
|
|
895
|
+
}
|
|
896
|
+
: {}),
|
|
897
|
+
},
|
|
898
|
+
});
|
|
899
|
+
try {
|
|
900
|
+
const output = await invokeTool(id, input, invocation);
|
|
901
|
+
endSpan(span, 'ok');
|
|
902
|
+
return output;
|
|
903
|
+
} catch (error) {
|
|
904
|
+
endSpan(
|
|
905
|
+
span,
|
|
906
|
+
'error',
|
|
907
|
+
error instanceof AgentHarnessError ? error.code : 'TOOL_FAILED',
|
|
908
|
+
);
|
|
909
|
+
throw error;
|
|
910
|
+
}
|
|
911
|
+
};
|
|
713
912
|
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
714
913
|
let rejectProviderAbort: (() => void) | undefined;
|
|
715
914
|
try {
|
|
@@ -738,6 +937,16 @@ export class AgentHarness {
|
|
|
738
937
|
controller.abort('timeout');
|
|
739
938
|
}, request.definition.timeoutMs);
|
|
740
939
|
});
|
|
940
|
+
providerSpan = startSpan(tracer, `provider ${provider.id}`, {
|
|
941
|
+
kind: 'client',
|
|
942
|
+
attributes: {
|
|
943
|
+
'flowdular.agent.run_id': request.runId,
|
|
944
|
+
'flowdular.agent.id': request.definition.id,
|
|
945
|
+
'flowdular.agent.provider': provider.id,
|
|
946
|
+
'flowdular.agent.model': request.definition.model,
|
|
947
|
+
'flowdular.agent.trigger': request.trigger,
|
|
948
|
+
},
|
|
949
|
+
});
|
|
741
950
|
const providerResult = await Promise.race([
|
|
742
951
|
provider.execute({
|
|
743
952
|
request,
|
|
@@ -752,7 +961,7 @@ export class AgentHarness {
|
|
|
752
961
|
additionalProperties: false,
|
|
753
962
|
},
|
|
754
963
|
})),
|
|
755
|
-
invokeTool,
|
|
964
|
+
invokeTool: tracedInvokeTool,
|
|
756
965
|
emit,
|
|
757
966
|
}),
|
|
758
967
|
timeout,
|
|
@@ -779,6 +988,7 @@ export class AgentHarness {
|
|
|
779
988
|
emit('provider.completed', `Provider ${provider.id} completed.`, {
|
|
780
989
|
finishReason: providerResult.finishReason,
|
|
781
990
|
});
|
|
991
|
+
endSpan(providerSpan, 'ok', providerResult.finishReason);
|
|
782
992
|
const completedAt = Date.now();
|
|
783
993
|
emit('run.completed', 'Harness completed the run.');
|
|
784
994
|
return {
|
|
@@ -788,6 +998,13 @@ export class AgentHarness {
|
|
|
788
998
|
startedAt,
|
|
789
999
|
completedAt,
|
|
790
1000
|
};
|
|
1001
|
+
} catch (error) {
|
|
1002
|
+
endSpan(
|
|
1003
|
+
providerSpan,
|
|
1004
|
+
'error',
|
|
1005
|
+
error instanceof AgentHarnessError ? error.code : 'PROVIDER_FAILED',
|
|
1006
|
+
);
|
|
1007
|
+
throw error;
|
|
791
1008
|
} finally {
|
|
792
1009
|
acceptingEvents = false;
|
|
793
1010
|
if (timer !== undefined) clearTimeout(timer);
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import type { CapabilityRisk } from '@flowdular/sdk/contracts';
|
|
2
|
-
import type {
|
|
2
|
+
import type {
|
|
3
|
+
AgentTool,
|
|
4
|
+
AgentToolConsent,
|
|
5
|
+
AgentToolContext,
|
|
6
|
+
} from './runtime.ts';
|
|
3
7
|
|
|
4
8
|
interface AgentToolBase {
|
|
5
9
|
readonly id: string;
|
|
@@ -9,6 +13,9 @@ interface AgentToolBase {
|
|
|
9
13
|
readonly contractVersion?: number;
|
|
10
14
|
readonly outputSchema?: Readonly<Record<string, unknown>>;
|
|
11
15
|
readonly risk?: 'read' | 'workspace-write' | 'external' | 'destructive';
|
|
16
|
+
/* Asked per call, after input validation, by every caller that runs the
|
|
17
|
+
tool: the harness and the workflow action runtime. */
|
|
18
|
+
readonly consent?: AgentToolConsent;
|
|
12
19
|
readonly idempotency?: 'required';
|
|
13
20
|
readonly idempotencyProtection?: 'target-ledger';
|
|
14
21
|
readonly cancellation?: 'cooperative' | 'not-supported';
|
|
@@ -36,6 +43,11 @@ function dottedIdentifier(value: string, field: string): string {
|
|
|
36
43
|
export function defineApiAgentTool(
|
|
37
44
|
definition: ApiAgentToolDefinition,
|
|
38
45
|
): AgentTool {
|
|
46
|
+
if (definition.risk === 'external') {
|
|
47
|
+
throw new Error(
|
|
48
|
+
`Tool ${definition.id} declares external risk and cannot be registered as an unattended agent tool.`,
|
|
49
|
+
);
|
|
50
|
+
}
|
|
39
51
|
return Object.freeze({
|
|
40
52
|
id: dottedIdentifier(definition.id, 'Tool id'),
|
|
41
53
|
transport: 'api' as const,
|
|
@@ -49,6 +61,9 @@ export function defineApiAgentTool(
|
|
|
49
61
|
? {}
|
|
50
62
|
: { outputSchema: definition.outputSchema }),
|
|
51
63
|
...(definition.risk === undefined ? {} : { risk: definition.risk }),
|
|
64
|
+
...(definition.consent === undefined
|
|
65
|
+
? {}
|
|
66
|
+
: { consent: definition.consent }),
|
|
52
67
|
...(definition.idempotency === undefined
|
|
53
68
|
? {}
|
|
54
69
|
: { idempotency: definition.idempotency }),
|
|
@@ -89,6 +104,9 @@ export function defineCliAgentTool(
|
|
|
89
104
|
? {}
|
|
90
105
|
: { outputSchema: definition.outputSchema }),
|
|
91
106
|
...(definition.risk === undefined ? {} : { risk: definition.risk }),
|
|
107
|
+
...(definition.consent === undefined
|
|
108
|
+
? {}
|
|
109
|
+
: { consent: definition.consent }),
|
|
92
110
|
...(definition.idempotency === undefined
|
|
93
111
|
? {}
|
|
94
112
|
: { idempotency: definition.idempotency }),
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { RegistryError } from './errors.ts';
|
|
2
|
+
|
|
1
3
|
export interface Principal {
|
|
2
4
|
readonly id: string;
|
|
3
5
|
readonly permissions: ReadonlySet<string>;
|
|
@@ -18,3 +20,180 @@ export function authorize(
|
|
|
18
20
|
}
|
|
19
21
|
return { allowed: true, reason: 'granted' };
|
|
20
22
|
}
|
|
23
|
+
|
|
24
|
+
/* What a denied decision would need to become an allow. The kernel owns the
|
|
25
|
+
shape only: resolving a role or a scope to people, collecting their decisions
|
|
26
|
+
and recording the receipt belong to the module that owns approvals. */
|
|
27
|
+
export interface ApprovalRequirement {
|
|
28
|
+
readonly roleKey?: string;
|
|
29
|
+
readonly scope?: string;
|
|
30
|
+
readonly decisions?: number;
|
|
31
|
+
readonly expiresInDays?: number;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export type PolicyDecision =
|
|
35
|
+
| { readonly allowed: true }
|
|
36
|
+
| {
|
|
37
|
+
readonly allowed: false;
|
|
38
|
+
readonly reason: string;
|
|
39
|
+
readonly requiresApproval?: {
|
|
40
|
+
readonly requirement: ApprovalRequirement;
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export interface PolicyEvaluationContext<TRecord = unknown> {
|
|
45
|
+
readonly principal: Principal;
|
|
46
|
+
readonly permission: string;
|
|
47
|
+
readonly record: TRecord;
|
|
48
|
+
/** The domain operation, when one permission covers several. */
|
|
49
|
+
readonly action?: string;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface PolicyDefinition<TRecord = unknown> {
|
|
53
|
+
readonly id: string;
|
|
54
|
+
readonly permission: string;
|
|
55
|
+
evaluate(context: PolicyEvaluationContext<TRecord>): PolicyDecision;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** A registered policy: the record is the permission's, so the registry keeps none. */
|
|
59
|
+
export type Policy = PolicyDefinition<unknown>;
|
|
60
|
+
|
|
61
|
+
export const MAX_POLICIES = 256;
|
|
62
|
+
|
|
63
|
+
/* Permission ids and policy ids share one shape, so a policy id reads as
|
|
64
|
+
`<module>.<record>.<rule>` next to the permission it qualifies. */
|
|
65
|
+
const POLICY_ID = /^[a-z][a-z0-9-]*(\.[a-z][a-z0-9-]*)+$/;
|
|
66
|
+
|
|
67
|
+
const ALLOWED: PolicyDecision = Object.freeze({ allowed: true });
|
|
68
|
+
const NO_POLICIES: readonly Policy[] = Object.freeze([]);
|
|
69
|
+
|
|
70
|
+
export function definePolicy<TRecord = unknown>(
|
|
71
|
+
definition: PolicyDefinition<TRecord>,
|
|
72
|
+
): Policy {
|
|
73
|
+
if (!POLICY_ID.test(definition.id)) {
|
|
74
|
+
throw new RegistryError(
|
|
75
|
+
'POLICY_INVALID',
|
|
76
|
+
`Policy ${definition.id} has an invalid id.`,
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
if (!POLICY_ID.test(definition.permission)) {
|
|
80
|
+
throw new RegistryError(
|
|
81
|
+
'POLICY_INVALID',
|
|
82
|
+
`Policy ${definition.id} names an invalid permission ${definition.permission}.`,
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
if (typeof definition.evaluate !== 'function') {
|
|
86
|
+
throw new RegistryError(
|
|
87
|
+
'POLICY_INVALID',
|
|
88
|
+
`Policy ${definition.id} has no evaluate function.`,
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
/* The record type belongs to the permission, not to the registry, which
|
|
92
|
+
holds policies of every module at once. This is the one place the author's
|
|
93
|
+
record type is erased, so a policy body stays typed. */
|
|
94
|
+
return Object.freeze({
|
|
95
|
+
id: definition.id,
|
|
96
|
+
permission: definition.permission,
|
|
97
|
+
evaluate: definition.evaluate as Policy['evaluate'],
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export interface PolicyRegistry {
|
|
102
|
+
register(policy: Policy): void;
|
|
103
|
+
/** Registration order, which is evaluation order. Empty for an unknown permission. */
|
|
104
|
+
list(permission: string): readonly Policy[];
|
|
105
|
+
evaluate(
|
|
106
|
+
principal: Principal,
|
|
107
|
+
permission: string,
|
|
108
|
+
record: unknown,
|
|
109
|
+
action?: string,
|
|
110
|
+
): PolicyDecision;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export interface MutablePolicyRegistry extends PolicyRegistry {
|
|
114
|
+
seal(): void;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/* Policies are registered while the platform composes and become an immutable
|
|
118
|
+
catalog before start hooks run: a policy registered at request time would
|
|
119
|
+
change an authorization decision under the requests already in flight. */
|
|
120
|
+
export function createPolicyRegistry(): MutablePolicyRegistry {
|
|
121
|
+
const ids = new Set<string>();
|
|
122
|
+
const byPermission = new Map<string, Policy[]>();
|
|
123
|
+
let sealed = false;
|
|
124
|
+
return {
|
|
125
|
+
register(policy) {
|
|
126
|
+
if (sealed) {
|
|
127
|
+
throw new RegistryError(
|
|
128
|
+
'POLICY_REGISTRY_SEALED',
|
|
129
|
+
'The policy registry is already sealed.',
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
if (ids.has(policy.id)) {
|
|
133
|
+
throw new RegistryError(
|
|
134
|
+
'POLICY_DUPLICATE',
|
|
135
|
+
`Policy ${policy.id} is already registered.`,
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
if (ids.size >= MAX_POLICIES) {
|
|
139
|
+
throw new RegistryError(
|
|
140
|
+
'POLICY_LIMIT',
|
|
141
|
+
`A platform registers at most ${MAX_POLICIES} policies.`,
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
ids.add(policy.id);
|
|
145
|
+
const registered = byPermission.get(policy.permission);
|
|
146
|
+
if (registered) registered.push(policy);
|
|
147
|
+
else byPermission.set(policy.permission, [policy]);
|
|
148
|
+
},
|
|
149
|
+
list(permission) {
|
|
150
|
+
const registered = byPermission.get(permission);
|
|
151
|
+
if (registered === undefined) return NO_POLICIES;
|
|
152
|
+
return Object.freeze([...registered]);
|
|
153
|
+
},
|
|
154
|
+
evaluate(principal, permission, record, action) {
|
|
155
|
+
const registered = byPermission.get(permission);
|
|
156
|
+
if (registered === undefined) return ALLOWED;
|
|
157
|
+
const context: PolicyEvaluationContext =
|
|
158
|
+
action === undefined
|
|
159
|
+
? { principal, permission, record }
|
|
160
|
+
: { principal, permission, record, action };
|
|
161
|
+
for (const policy of registered) {
|
|
162
|
+
const decision = evaluatePolicy(policy, context);
|
|
163
|
+
if (!decision.allowed) return decision;
|
|
164
|
+
}
|
|
165
|
+
return ALLOWED;
|
|
166
|
+
},
|
|
167
|
+
seal() {
|
|
168
|
+
sealed = true;
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/* A policy is module code on the authorization path. A throwing policy denies
|
|
174
|
+
instead of escaping, so one faulty policy can never turn into an allow. */
|
|
175
|
+
function evaluatePolicy(
|
|
176
|
+
policy: Policy,
|
|
177
|
+
context: PolicyEvaluationContext,
|
|
178
|
+
): PolicyDecision {
|
|
179
|
+
try {
|
|
180
|
+
return policy.evaluate(context);
|
|
181
|
+
} catch {
|
|
182
|
+
return { allowed: false, reason: `policy-failed:${policy.id}` };
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/** The permission scope first, then the policies that qualify it. */
|
|
187
|
+
export function authorizeRecord(
|
|
188
|
+
registry: PolicyRegistry,
|
|
189
|
+
principal: Principal | null,
|
|
190
|
+
permission: string,
|
|
191
|
+
record: unknown,
|
|
192
|
+
action?: string,
|
|
193
|
+
): PolicyDecision {
|
|
194
|
+
const scope = authorize(principal, permission);
|
|
195
|
+
if (!scope.allowed || !principal) {
|
|
196
|
+
return { allowed: false, reason: scope.reason };
|
|
197
|
+
}
|
|
198
|
+
return registry.evaluate(principal, permission, record, action);
|
|
199
|
+
}
|
|
@@ -4,13 +4,33 @@ export interface PlatformCapabilityRegistry {
|
|
|
4
4
|
register<T>(id: string, capability: T): void;
|
|
5
5
|
get<T>(id: string): T | null;
|
|
6
6
|
has(id: string): boolean;
|
|
7
|
+
/* A view bound to one module's manifest declaration: register accepts only
|
|
8
|
+
the ids under `provides`, get and has only the ids under `requires`; ids
|
|
9
|
+
under `platform.` are kernel-owned and stay open both ways. The generated
|
|
10
|
+
composition hands each module this view so the manifest stays the truth
|
|
11
|
+
about who talks to whom. */
|
|
12
|
+
forModule(
|
|
13
|
+
moduleId: string,
|
|
14
|
+
declaration: ModuleCapabilityDeclaration,
|
|
15
|
+
): PlatformCapabilityRegistry;
|
|
7
16
|
}
|
|
8
17
|
|
|
18
|
+
export interface ModuleCapabilityDeclaration {
|
|
19
|
+
readonly provides?: readonly string[];
|
|
20
|
+
readonly requires?: readonly {
|
|
21
|
+
readonly id: string;
|
|
22
|
+
readonly optional?: boolean;
|
|
23
|
+
}[];
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const CAPABILITY_ID = /^[a-z][a-z0-9-]*(\.[a-z][a-z0-9-]*)+$/;
|
|
27
|
+
const PLATFORM_PREFIX = 'platform.';
|
|
28
|
+
|
|
9
29
|
export function createPlatformCapabilityRegistry(): PlatformCapabilityRegistry {
|
|
10
30
|
const capabilities = new Map<string, unknown>();
|
|
11
|
-
|
|
31
|
+
const root: PlatformCapabilityRegistry = {
|
|
12
32
|
register(id, capability) {
|
|
13
|
-
if (
|
|
33
|
+
if (!CAPABILITY_ID.test(id)) {
|
|
14
34
|
throw new Error(`Platform capability ${id} has an invalid id.`);
|
|
15
35
|
}
|
|
16
36
|
if (capabilities.has(id)) {
|
|
@@ -24,5 +44,52 @@ export function createPlatformCapabilityRegistry(): PlatformCapabilityRegistry {
|
|
|
24
44
|
has(id) {
|
|
25
45
|
return capabilities.has(id);
|
|
26
46
|
},
|
|
47
|
+
forModule(moduleId, declaration) {
|
|
48
|
+
return scopedCapabilityRegistry(root, moduleId, declaration);
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
return root;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function scopedCapabilityRegistry(
|
|
55
|
+
root: PlatformCapabilityRegistry,
|
|
56
|
+
moduleId: string,
|
|
57
|
+
declaration: ModuleCapabilityDeclaration,
|
|
58
|
+
): PlatformCapabilityRegistry {
|
|
59
|
+
const provides = new Set(declaration.provides ?? []);
|
|
60
|
+
const requires = new Set(
|
|
61
|
+
(declaration.requires ?? []).map((entry) => entry.id),
|
|
62
|
+
);
|
|
63
|
+
const readable = (id: string) =>
|
|
64
|
+
requires.has(id) || provides.has(id) || id.startsWith(PLATFORM_PREFIX);
|
|
65
|
+
const scoped: PlatformCapabilityRegistry = {
|
|
66
|
+
register(id, capability) {
|
|
67
|
+
if (!provides.has(id) && !id.startsWith(PLATFORM_PREFIX)) {
|
|
68
|
+
throw new Error(
|
|
69
|
+
`${moduleId} registers capability ${id} without declaring it under "provides" in module.json.`,
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
root.register(id, capability);
|
|
73
|
+
},
|
|
74
|
+
get<T>(id: string): T | null {
|
|
75
|
+
if (!readable(id)) {
|
|
76
|
+
throw new Error(
|
|
77
|
+
`${moduleId} resolves capability ${id} without declaring it under "requires" in module.json.`,
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
return root.get<T>(id);
|
|
81
|
+
},
|
|
82
|
+
has(id) {
|
|
83
|
+
if (!readable(id)) {
|
|
84
|
+
throw new Error(
|
|
85
|
+
`${moduleId} checks capability ${id} without declaring it under "requires" in module.json.`,
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
return root.has(id);
|
|
89
|
+
},
|
|
90
|
+
forModule(nestedModuleId, nestedDeclaration) {
|
|
91
|
+
return scopedCapabilityRegistry(root, nestedModuleId, nestedDeclaration);
|
|
92
|
+
},
|
|
27
93
|
};
|
|
94
|
+
return scoped;
|
|
28
95
|
}
|