@flowdular/sdk 0.2.3 → 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 +3 -2
- 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 +3 -2
- 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 +5 -2
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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 +5 -2
- 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 +3 -2
- 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 +66 -7
- package/packages/client/package.json +2 -1
- 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/dev-console/package.json +2 -1
- package/packages/dev-console/src/brand.d.mts +8 -0
- package/packages/dev-console/src/brand.mjs +33 -0
- package/packages/dev-console/src/index.mjs +2 -1
- package/packages/harness/src/index.ts +2 -0
- package/packages/harness/src/runtime.ts +218 -1
- package/packages/harness/src/tool-adapters.ts +19 -1
- package/packages/kernel/src/acl.ts +179 -0
- package/packages/kernel/src/capability-registry.ts +69 -2
- package/packages/kernel/src/data-class-registry.ts +354 -0
- package/packages/kernel/src/index.ts +65 -4
- package/packages/kernel/src/keyring.ts +208 -0
- package/packages/kernel/src/module-compatibility.ts +35 -4
- package/packages/kernel/src/module-registry.ts +49 -2
- package/packages/kernel/src/module-settings.ts +189 -27
- package/packages/server/package.json +2 -1
- package/packages/server/src/composition.ts +38 -0
- package/packages/server/src/endpoint.ts +104 -47
- package/packages/server/src/export/csv.ts +34 -0
- package/packages/server/src/export/definition.ts +346 -0
- package/packages/server/src/export/index.ts +61 -0
- package/packages/server/src/export/run.ts +116 -0
- package/packages/server/src/index.ts +155 -0
- package/packages/server/src/jobs/index.ts +93 -0
- package/packages/server/src/jobs/runner.ts +486 -0
- package/packages/server/src/log.ts +291 -0
- package/packages/server/src/mail/config.ts +184 -0
- package/packages/server/src/mail/contracts.ts +251 -0
- package/packages/server/src/mail/index.ts +31 -0
- package/packages/server/src/mail/port.ts +101 -0
- package/packages/server/src/mail/smtp.ts +191 -0
- package/packages/server/src/mail/template.ts +105 -0
- package/packages/server/src/metrics.ts +447 -0
- package/packages/server/src/pagination.ts +246 -0
- package/packages/server/src/trace/context.ts +103 -0
- package/packages/server/src/trace/egress.ts +66 -0
- package/packages/server/src/trace/error-sink.ts +296 -0
- package/packages/server/src/trace/exporter.ts +295 -0
- package/packages/server/src/trace/index.ts +60 -0
- package/packages/server/src/trace/job-sink.ts +172 -0
- package/packages/server/src/trace/tracer.ts +338 -0
- package/packages/server/src/web.ts +5 -1
- package/packages/storage/package.json +40 -0
- package/packages/storage/src/config.ts +189 -0
- package/packages/storage/src/content-type.ts +124 -0
- package/packages/storage/src/contracts.ts +112 -0
- package/packages/storage/src/envelope.ts +189 -0
- package/packages/storage/src/index.ts +43 -0
- package/packages/storage/src/local.ts +75 -0
- package/packages/storage/src/port.ts +251 -0
- package/packages/storage/src/read-token.ts +130 -0
- package/packages/storage/src/s3.ts +144 -0
- package/packages/storage/src/scanner.ts +22 -0
- package/packages/storage/src/sigv4.ts +104 -0
- package/packages/storage/src/store.ts +13 -0
- package/packages/ui/package.json +1 -0
- package/packages/ui/src/components/Button.tsrx +3 -0
- package/packages/ui/src/components/ConfirmDialog.tsrx +13 -2
- package/packages/ui/src/components/DateField.tsrx +92 -0
- package/packages/ui/src/components/DatePicker.tsrx +525 -0
- package/packages/ui/src/components/DateRangeField.tsrx +93 -0
- package/packages/ui/src/components/Drawer.tsrx +10 -1
- package/packages/ui/src/components/FileUpload.tsrx +158 -0
- package/packages/ui/src/components/Pagination.tsrx +130 -0
- package/packages/ui/src/components/Select.tsrx +78 -0
- package/packages/ui/src/components/Table.tsrx +498 -81
- package/packages/ui/src/components/Tabs.tsrx +53 -0
- package/packages/ui/src/components/ToastHost.tsrx +48 -0
- package/packages/ui/src/components/calendar.ts +243 -0
- package/packages/ui/src/components/date-field.ts +62 -0
- package/packages/ui/src/components/file-upload.ts +49 -0
- package/packages/ui/src/components/focus-trap.ts +62 -0
- package/packages/ui/src/components/pagination.ts +68 -0
- package/packages/ui/src/components/table-sorting.ts +49 -0
- package/packages/ui/src/components/tabs.ts +61 -0
- package/packages/ui/src/components/toast-store.ts +116 -0
- package/packages/ui/src/icons/Icon.tsrx +5 -0
- package/packages/ui/src/index.ts +45 -0
- package/packages/ui/src/styles/components.css +598 -0
- package/modules/automations-workflows-integration/module.json +0 -27
- package/modules/automations-workflows-integration/spec/module.yaml +0 -93
- package/modules/automations-workflows-integration/src/index.ts +0 -14
- package/modules/automations-workflows-integration/src/platform.ts +0 -24
- package/modules/automations-workflows-integration/src/server/index.ts +0 -11
- package/modules/automations-workflows-integration/translations/en.json +0 -21
- package/modules/automations-workflows-integration/translations/pl.json +0 -21
- package/modules/workflows/src/services/cursor-codec.ts +0 -62
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The durable job loop, extracted from the copies that converged during
|
|
3
|
+
* RFC 0002 (`docs/rfc/0004-platform-services.md`, H2).
|
|
4
|
+
*
|
|
5
|
+
* What the runner owns: the timer and its `unref`, the `inFlight` guard, the
|
|
6
|
+
* bound on claims per pass, the bound on items performed at once and the
|
|
7
|
+
* serialized claim behind it, per-item isolation, the heartbeat timer and the
|
|
8
|
+
* abort it raises when the fence answers false, exponential backoff after a
|
|
9
|
+
* pass that raised, the drain on stop and the trace hook.
|
|
10
|
+
*
|
|
11
|
+
* What a producer gets: `wake()`, one coalesced pass that can see the work it
|
|
12
|
+
* just enqueued. `tick()` joins the pass in flight, and that pass may already
|
|
13
|
+
* have found the queue empty, so a producer that has to be picked up before the
|
|
14
|
+
* next interval wakes the loop rather than ticking it.
|
|
15
|
+
*
|
|
16
|
+
* What the trace hook carries: the passes that claimed something. A pass that
|
|
17
|
+
* claimed nothing emits no `pass-start` and no `pass-end`, so a loop idling
|
|
18
|
+
* against an empty queue costs the span ring nothing.
|
|
19
|
+
*
|
|
20
|
+
* What a module keeps, always: its table, its migration, its routing read, its
|
|
21
|
+
* claim statement and stale window, its renewal statement, the work itself and
|
|
22
|
+
* every outcome it records. The runner opens no database handle.
|
|
23
|
+
*
|
|
24
|
+
* Adopting it, one module at a time behind that module's existing tests:
|
|
25
|
+
*
|
|
26
|
+
* 1. Move the loop body into `claim` (one attempt, null when nothing can be
|
|
27
|
+
* taken) and `perform` (one claimed item). A module whose routing read
|
|
28
|
+
* answers a page keeps the page in a closure and refills it only once it is
|
|
29
|
+
* drained, so one pass still reads the queue once.
|
|
30
|
+
* 2. Pass `staleAfterMs` as the same constant the claim statement subtracts for
|
|
31
|
+
* its stale cutoff, and `heartbeat` as the fenced renewal. Without a
|
|
32
|
+
* `heartbeat` the claim is held by wall clock alone, as it is today.
|
|
33
|
+
* 3. Replace the runtime's `setInterval`, `inFlight`, `stop` and `quiesce` with
|
|
34
|
+
* the runner's. Keep the runtime's lease acquisition and release.
|
|
35
|
+
*
|
|
36
|
+
* Per module, what stays behind (`docs/rfc/0004-platform-services.md` H2 lists
|
|
37
|
+
* the three claim findings that motivate the move):
|
|
38
|
+
*
|
|
39
|
+
* - `audit.core`: three runners, one per loop (`audit.core.sweep`,
|
|
40
|
+
* `audit.core.export`, `audit.core.erasure`), because the intervals and the
|
|
41
|
+
* routing pages differ. It keeps the erasure registry seal, the 24 hour
|
|
42
|
+
* expiry of an unclaimed request, the `lastSweptAt` compare and swap, the
|
|
43
|
+
* legal-hold and backup guards, and the archive and certificate writing. The
|
|
44
|
+
* sweep claims nothing, so its `claim` answers the next due class and its
|
|
45
|
+
* `heartbeat` is absent. Its export and erasure claims gain the renewal they
|
|
46
|
+
* never had.
|
|
47
|
+
* - `notifications.core`: one runner. It keeps both queue reads (due and
|
|
48
|
+
* stranded) behind one `claim`, the per-attempt delivery backoff and dead
|
|
49
|
+
* lettering, the paused-subscription park, and the retention sweep, which is
|
|
50
|
+
* a second runner rather than a tail appended to every delivery pass.
|
|
51
|
+
* - `approvals.core`: one runner with no `heartbeat`: expiry claims nothing and
|
|
52
|
+
* the status transition is its own fence. Its per-item `try`/`catch` is the
|
|
53
|
+
* runner's isolation now; the notification fan-out in the transition stays.
|
|
54
|
+
* - `agents.core` action execution: one runner, adopted. `kick()` is
|
|
55
|
+
* `runner.wake()`, which coalesces into one follow-up pass, so an invocation
|
|
56
|
+
* enqueued while a pass runs is performed when that pass ends rather than an
|
|
57
|
+
* interval later, and the `scheduled` flag and the zero-delay timer are gone
|
|
58
|
+
* either way. It keeps the per-tool
|
|
59
|
+
* timeout race, caller-signal bridging, consent and live permission
|
|
60
|
+
* re-checks, the idempotency key and the audit payload threaded through claim
|
|
61
|
+
* and settle. Its lease renewal is the runner's `heartbeat`, its routing page
|
|
62
|
+
* is the runner's `concurrency`, and the runner's `CLAIM_LOST` abort is
|
|
63
|
+
* bridged onto the controller the module already tracks per invocation, so a
|
|
64
|
+
* cancellation and a lost lease stop the work at the same place.
|
|
65
|
+
* - `auth.core`: one runner for the expired session sweep, which today has no
|
|
66
|
+
* `inFlight` guard, no `start` and no `stop` at all. It keeps its deliberate
|
|
67
|
+
* refusal to serialize the error, as an `onEvent` sink rather than the
|
|
68
|
+
* runner's own logging, and needs a row bound on the delete before adoption.
|
|
69
|
+
* - `automations.core`: one runner with no `heartbeat`: the `nextRunAt` compare
|
|
70
|
+
* and swap plus the slot idempotency key are its fence. It keeps the
|
|
71
|
+
* resolution `AbortController` aborted in `quiesce`, and the auto-disable and
|
|
72
|
+
* audit rows on a failing target.
|
|
73
|
+
*
|
|
74
|
+
* `workflows.core` is not in the first wave: its worker claims one run per
|
|
75
|
+
* drain and checks its lease at every node boundary, which is a per-item
|
|
76
|
+
* contract the runner does not model.
|
|
77
|
+
*/
|
|
78
|
+
export {
|
|
79
|
+
createJobRunner,
|
|
80
|
+
DEFAULT_JOB_BATCH_LIMIT,
|
|
81
|
+
JOB_CLAIM_LOST,
|
|
82
|
+
jobBackoff,
|
|
83
|
+
JobClaimLostError,
|
|
84
|
+
} from './runner.ts';
|
|
85
|
+
export type {
|
|
86
|
+
JobBackoff,
|
|
87
|
+
JobEvent,
|
|
88
|
+
JobPassReport,
|
|
89
|
+
JobRunner,
|
|
90
|
+
JobRunnerOptions,
|
|
91
|
+
} from './runner.ts';
|
|
92
|
+
export { createJobTraceSink, resumeJobTrace } from '../trace/job-sink.ts';
|
|
93
|
+
export type { JobTraceSinkOptions } from '../trace/job-sink.ts';
|
|
@@ -0,0 +1,486 @@
|
|
|
1
|
+
import type { Logger } from '../log.ts';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The stable code a runner reports when the fence says the claim changed hands.
|
|
5
|
+
* It is the reason carried by the aborted signal, so a stage that stops on it
|
|
6
|
+
* settles nothing: the work belongs to whoever holds the claim now.
|
|
7
|
+
*/
|
|
8
|
+
export const JOB_CLAIM_LOST = 'CLAIM_LOST';
|
|
9
|
+
|
|
10
|
+
export class JobClaimLostError extends Error {
|
|
11
|
+
readonly code = JOB_CLAIM_LOST;
|
|
12
|
+
constructor(readonly job: string) {
|
|
13
|
+
super(`Another process took over the work ${job} had claimed.`);
|
|
14
|
+
this.name = 'JobClaimLostError';
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface JobBackoff {
|
|
19
|
+
readonly initialMs: number;
|
|
20
|
+
readonly maxMs: number;
|
|
21
|
+
readonly multiplier: number;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* A pass that raised waits its own interval, doubling to ten times that
|
|
26
|
+
* and never past a minute, so a database refusing the claim gets room.
|
|
27
|
+
*/
|
|
28
|
+
export function jobBackoff(intervalMs: number): JobBackoff {
|
|
29
|
+
return {
|
|
30
|
+
initialMs: intervalMs,
|
|
31
|
+
maxMs: Math.max(intervalMs, Math.min(60_000, intervalMs * 10)),
|
|
32
|
+
multiplier: 2,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** What one pass did. Every item is counted in exactly one of the three. */
|
|
37
|
+
export interface JobPassReport {
|
|
38
|
+
readonly claimed: number;
|
|
39
|
+
readonly performed: number;
|
|
40
|
+
readonly failed: number;
|
|
41
|
+
readonly claimLost: number;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* The trace a pass emits. Identities and timings only: a consumer that wants
|
|
46
|
+
* the work itself reads the module's own tables through the id it already has.
|
|
47
|
+
*
|
|
48
|
+
* A pass that claimed nothing emits neither `pass-start` nor `pass-end`: a loop
|
|
49
|
+
* polling an empty queue all day is not work, and a span each would fill the
|
|
50
|
+
* ring a real pass has to share.
|
|
51
|
+
*/
|
|
52
|
+
export type JobEvent =
|
|
53
|
+
| { readonly type: 'pass-start'; readonly name: string; readonly at: number }
|
|
54
|
+
| {
|
|
55
|
+
readonly type: 'pass-end';
|
|
56
|
+
readonly name: string;
|
|
57
|
+
readonly at: number;
|
|
58
|
+
readonly report: JobPassReport;
|
|
59
|
+
readonly nextDelayMs: number;
|
|
60
|
+
}
|
|
61
|
+
| { readonly type: 'claimed'; readonly name: string; readonly at: number }
|
|
62
|
+
| {
|
|
63
|
+
readonly type: 'claim-failed';
|
|
64
|
+
readonly name: string;
|
|
65
|
+
readonly at: number;
|
|
66
|
+
readonly error: unknown;
|
|
67
|
+
}
|
|
68
|
+
| {
|
|
69
|
+
readonly type: 'performed';
|
|
70
|
+
readonly name: string;
|
|
71
|
+
readonly at: number;
|
|
72
|
+
readonly durationMs: number;
|
|
73
|
+
}
|
|
74
|
+
| {
|
|
75
|
+
readonly type: 'item-failed';
|
|
76
|
+
readonly name: string;
|
|
77
|
+
readonly at: number;
|
|
78
|
+
readonly error: unknown;
|
|
79
|
+
}
|
|
80
|
+
| { readonly type: 'heartbeat'; readonly name: string; readonly at: number }
|
|
81
|
+
| {
|
|
82
|
+
readonly type: 'heartbeat-failed';
|
|
83
|
+
readonly name: string;
|
|
84
|
+
readonly at: number;
|
|
85
|
+
readonly error: unknown;
|
|
86
|
+
}
|
|
87
|
+
| { readonly type: 'claim-lost'; readonly name: string; readonly at: number };
|
|
88
|
+
|
|
89
|
+
export interface JobRunnerOptions<Claimed> {
|
|
90
|
+
/**
|
|
91
|
+
* Stable id of this loop, conventionally the module id or
|
|
92
|
+
* `<module id>.<loop>` when a module runs more than one. It is the `module`
|
|
93
|
+
* field of every line the runner logs and the `name` on every event.
|
|
94
|
+
*/
|
|
95
|
+
readonly name: string;
|
|
96
|
+
readonly intervalMs: number;
|
|
97
|
+
/**
|
|
98
|
+
* One claim attempt at `at`. Null ends the pass: nothing is waiting, or
|
|
99
|
+
* nothing waiting could be taken. The runner opens no database handle, so the
|
|
100
|
+
* table, the statement and the stale window stay the module's own; the module
|
|
101
|
+
* computes its stale cutoff from the same `staleAfterMs` it passes here.
|
|
102
|
+
*/
|
|
103
|
+
readonly claim: (at: number) => Promise<Claimed | null>;
|
|
104
|
+
/**
|
|
105
|
+
* The work for one claimed item. It is aborted through `signal` when the
|
|
106
|
+
* fence below says the claim changed hands, and a stage that observes the
|
|
107
|
+
* abort must stop without settling the item.
|
|
108
|
+
*/
|
|
109
|
+
readonly perform: (claimed: Claimed, signal: AbortSignal) => Promise<void>;
|
|
110
|
+
/**
|
|
111
|
+
* Renews the claim, answering whether the renewal landed. False means the
|
|
112
|
+
* lease lapsed and another process reclaimed the item. A renewal the database
|
|
113
|
+
* could not answer at all is not a lost claim: it throws, the lease is
|
|
114
|
+
* unchanged, and the next beat asks again.
|
|
115
|
+
*/
|
|
116
|
+
readonly heartbeat?:
|
|
117
|
+
| ((claimed: Claimed, at: number) => Promise<boolean>)
|
|
118
|
+
| undefined;
|
|
119
|
+
/** Defaults to a third of `staleAfterMs`, so two renewals fit in the window. */
|
|
120
|
+
readonly heartbeatEveryMs?: number | undefined;
|
|
121
|
+
/** How long a claim survives without a renewal. */
|
|
122
|
+
readonly staleAfterMs: number;
|
|
123
|
+
/** Absent means none: a failing pass waits the same `intervalMs` as any other. */
|
|
124
|
+
readonly backoff?: JobBackoff | undefined;
|
|
125
|
+
/** Claims one pass may take. Defaults to `DEFAULT_JOB_BATCH_LIMIT`. */
|
|
126
|
+
readonly batchLimit?: number | undefined;
|
|
127
|
+
/**
|
|
128
|
+
* Items one pass performs at the same time, each under its own heartbeat
|
|
129
|
+
* timer and its own abort signal. Defaults to 1, which claims and performs in
|
|
130
|
+
* strict alternation. Bounded to 1 up to 64; a value outside that, or one
|
|
131
|
+
* that is not a whole count, is the default. Claims stay serialized at every
|
|
132
|
+
* setting: the claim statement, its page and its stale window are the
|
|
133
|
+
* module's, written for one caller at a time.
|
|
134
|
+
*/
|
|
135
|
+
readonly concurrency?: number | undefined;
|
|
136
|
+
readonly logger: () => Logger;
|
|
137
|
+
readonly now?: (() => number) | undefined;
|
|
138
|
+
/** Trace hook for observability. Isolated: a throwing sink costs the pass nothing. */
|
|
139
|
+
readonly onEvent?: ((event: JobEvent) => void) | undefined;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export interface JobRunner {
|
|
143
|
+
readonly name: string;
|
|
144
|
+
/** Starts the loop with an immediate first pass. */
|
|
145
|
+
start(): void;
|
|
146
|
+
/** One pass. Answers the pass already in flight rather than overlapping it. */
|
|
147
|
+
tick(): Promise<JobPassReport>;
|
|
148
|
+
/**
|
|
149
|
+
* Asks for a pass that can see work enqueued now. Idle, that is one pass. With
|
|
150
|
+
* a pass in flight it is one follow-up pass once that pass ends, because a
|
|
151
|
+
* pass that already found its source empty will not look again: every wake
|
|
152
|
+
* arriving during the same pass coalesces into that single follow-up.
|
|
153
|
+
*/
|
|
154
|
+
wake(): void;
|
|
155
|
+
stop(): void;
|
|
156
|
+
/** Stops the loop and waits for the pass in flight. Restartable. */
|
|
157
|
+
quiesce(): Promise<void>;
|
|
158
|
+
/** Quiesces for good: every later `start` and `tick` is a no-op. */
|
|
159
|
+
dispose(): Promise<void>;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
export const DEFAULT_JOB_BATCH_LIMIT = 25;
|
|
163
|
+
|
|
164
|
+
/* The ceiling on `concurrency`. A loop that needs more parallelism than this
|
|
165
|
+
needs more processes, not a deeper pool over one connection budget. */
|
|
166
|
+
const MAX_JOB_CONCURRENCY = 64;
|
|
167
|
+
|
|
168
|
+
const HEARTBEAT_DIVISOR = 3;
|
|
169
|
+
const MIN_HEARTBEAT_MS = 250;
|
|
170
|
+
/* Bounds both the exponent and the counter behind it, so a loop that has been
|
|
171
|
+
failing for a week computes the same delay as one failing for an hour. */
|
|
172
|
+
const MAX_BACKOFF_DOUBLINGS = 30;
|
|
173
|
+
|
|
174
|
+
const IDLE: JobPassReport = Object.freeze({
|
|
175
|
+
claimed: 0,
|
|
176
|
+
performed: 0,
|
|
177
|
+
failed: 0,
|
|
178
|
+
claimLost: 0,
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
type ItemOutcome = 'performed' | 'failed' | 'claim-lost';
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* The loop every durable module job runs, and nothing else. It claims bounded
|
|
185
|
+
* work, performs it under a renewed lease at the `concurrency` it was given,
|
|
186
|
+
* isolates each item from the next, backs off when a pass raises and drains
|
|
187
|
+
* every item in flight on stop.
|
|
188
|
+
*
|
|
189
|
+
* It never opens a database handle: the routing read, the claim statement, the
|
|
190
|
+
* renewal statement and the work itself are the module's, handed in as `claim`,
|
|
191
|
+
* `heartbeat` and `perform`.
|
|
192
|
+
*/
|
|
193
|
+
export function createJobRunner<Claimed>(
|
|
194
|
+
options: JobRunnerOptions<Claimed>,
|
|
195
|
+
): JobRunner {
|
|
196
|
+
const name = options.name;
|
|
197
|
+
const now = options.now ?? (() => Date.now());
|
|
198
|
+
const intervalMs = Math.max(1, options.intervalMs);
|
|
199
|
+
const batchLimit = Math.max(1, options.batchLimit ?? DEFAULT_JOB_BATCH_LIMIT);
|
|
200
|
+
const requestedConcurrency = Math.trunc(options.concurrency ?? 1);
|
|
201
|
+
/* Clamped rather than thrown on, and never zero: a pool of no workers would
|
|
202
|
+
perform nothing while every pass still reported a clean idle. */
|
|
203
|
+
const concurrency = Number.isSafeInteger(requestedConcurrency)
|
|
204
|
+
? Math.min(MAX_JOB_CONCURRENCY, Math.max(1, requestedConcurrency))
|
|
205
|
+
: 1;
|
|
206
|
+
const heartbeat = options.heartbeat;
|
|
207
|
+
const heartbeatEveryMs = Math.max(
|
|
208
|
+
1,
|
|
209
|
+
options.heartbeatEveryMs ??
|
|
210
|
+
Math.max(
|
|
211
|
+
MIN_HEARTBEAT_MS,
|
|
212
|
+
Math.floor(options.staleAfterMs / HEARTBEAT_DIVISOR),
|
|
213
|
+
),
|
|
214
|
+
);
|
|
215
|
+
const backoff = options.backoff;
|
|
216
|
+
const sink = options.onEvent;
|
|
217
|
+
|
|
218
|
+
/* A trace sink is the consumer's code. Wrapping it here means a throwing one
|
|
219
|
+
never reaches the pass, and the optional call below evaluates no event
|
|
220
|
+
object at all when nobody is listening. */
|
|
221
|
+
const emit = sink
|
|
222
|
+
? (event: JobEvent): void => {
|
|
223
|
+
try {
|
|
224
|
+
sink(event);
|
|
225
|
+
} catch {
|
|
226
|
+
/* An observer that throws is the observer's defect, not the job's. */
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
: undefined;
|
|
230
|
+
|
|
231
|
+
let disposed = false;
|
|
232
|
+
let started = false;
|
|
233
|
+
let waking = false;
|
|
234
|
+
let failures = 0;
|
|
235
|
+
let inFlight: Promise<JobPassReport> | undefined;
|
|
236
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
237
|
+
/* The scheduling chain a stop retires. A pass that outlives its stop must not
|
|
238
|
+
schedule for a loop that has been started again since. */
|
|
239
|
+
let generation = 0;
|
|
240
|
+
|
|
241
|
+
const delay = (): number => {
|
|
242
|
+
if (!backoff || failures === 0) return intervalMs;
|
|
243
|
+
const doublings = Math.min(failures - 1, MAX_BACKOFF_DOUBLINGS);
|
|
244
|
+
return Math.min(
|
|
245
|
+
backoff.maxMs,
|
|
246
|
+
backoff.initialMs * Math.max(1, backoff.multiplier) ** doublings,
|
|
247
|
+
);
|
|
248
|
+
};
|
|
249
|
+
|
|
250
|
+
const performItem = async (claimed: Claimed): Promise<ItemOutcome> => {
|
|
251
|
+
const controller = new AbortController();
|
|
252
|
+
let lost = false;
|
|
253
|
+
let beat: ReturnType<typeof setInterval> | undefined;
|
|
254
|
+
if (heartbeat) {
|
|
255
|
+
let beating = false;
|
|
256
|
+
beat = setInterval(() => {
|
|
257
|
+
/* A fence slower than the cadence must not queue behind itself. */
|
|
258
|
+
if (beating) return;
|
|
259
|
+
beating = true;
|
|
260
|
+
void (async () => {
|
|
261
|
+
const at = now();
|
|
262
|
+
try {
|
|
263
|
+
if (await heartbeat(claimed, at)) {
|
|
264
|
+
emit?.({ type: 'heartbeat', name, at });
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
} catch (error) {
|
|
268
|
+
emit?.({ type: 'heartbeat-failed', name, at, error });
|
|
269
|
+
return;
|
|
270
|
+
} finally {
|
|
271
|
+
beating = false;
|
|
272
|
+
}
|
|
273
|
+
lost = true;
|
|
274
|
+
if (beat) clearInterval(beat);
|
|
275
|
+
emit?.({ type: 'claim-lost', name, at });
|
|
276
|
+
controller.abort(new JobClaimLostError(name));
|
|
277
|
+
})();
|
|
278
|
+
}, heartbeatEveryMs);
|
|
279
|
+
beat.unref?.();
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
const startedAt = now();
|
|
283
|
+
try {
|
|
284
|
+
await options.perform(claimed, controller.signal);
|
|
285
|
+
/* The stage finished. A fence that answered false while it was settling
|
|
286
|
+
raced a row that is no longer in flight, and a stage that did observe
|
|
287
|
+
the abort raises instead of returning, so this is work performed. */
|
|
288
|
+
if (emit) {
|
|
289
|
+
const at = now();
|
|
290
|
+
emit({ type: 'performed', name, at, durationMs: at - startedAt });
|
|
291
|
+
}
|
|
292
|
+
return 'performed';
|
|
293
|
+
} catch (error) {
|
|
294
|
+
/* A stage that stopped on the abort reported the claim, not a failure:
|
|
295
|
+
the item is somebody else's work now and settles under their pass. */
|
|
296
|
+
if (lost) return 'claim-lost';
|
|
297
|
+
options
|
|
298
|
+
.logger()
|
|
299
|
+
.error(`${name} work failed`, { module: name, err: error });
|
|
300
|
+
emit?.({ type: 'item-failed', name, at: now(), error });
|
|
301
|
+
return 'failed';
|
|
302
|
+
} finally {
|
|
303
|
+
if (beat) clearInterval(beat);
|
|
304
|
+
}
|
|
305
|
+
};
|
|
306
|
+
|
|
307
|
+
const pass = async (): Promise<JobPassReport> => {
|
|
308
|
+
/* Read at the head of the pass but published only once the pass has work,
|
|
309
|
+
so the span a listener opens still covers the claim that found it. */
|
|
310
|
+
const startedAt = emit ? now() : 0;
|
|
311
|
+
let announced = false;
|
|
312
|
+
let attempts = 0;
|
|
313
|
+
let claimed = 0;
|
|
314
|
+
let performed = 0;
|
|
315
|
+
let failed = 0;
|
|
316
|
+
let claimLost = 0;
|
|
317
|
+
let raised = false;
|
|
318
|
+
let drained = false;
|
|
319
|
+
|
|
320
|
+
/* One claim attempt, counted against the batch bound whatever it answers.
|
|
321
|
+
Null ends the pass for every worker: the source is empty or it raised. */
|
|
322
|
+
const take = async (): Promise<Claimed | null> => {
|
|
323
|
+
if (drained || attempts >= batchLimit) return null;
|
|
324
|
+
attempts += 1;
|
|
325
|
+
let item: Claimed | null;
|
|
326
|
+
try {
|
|
327
|
+
item = await options.claim(now());
|
|
328
|
+
} catch (error) {
|
|
329
|
+
/* The source raised, so this pass has nothing further to take. What it
|
|
330
|
+
already performed keeps its outcomes; the next pass finds the rest. */
|
|
331
|
+
drained = true;
|
|
332
|
+
raised = true;
|
|
333
|
+
options
|
|
334
|
+
.logger()
|
|
335
|
+
.error(`${name} claim failed`, { module: name, err: error });
|
|
336
|
+
emit?.({ type: 'claim-failed', name, at: now(), error });
|
|
337
|
+
return null;
|
|
338
|
+
}
|
|
339
|
+
if (item === null) {
|
|
340
|
+
drained = true;
|
|
341
|
+
return null;
|
|
342
|
+
}
|
|
343
|
+
claimed += 1;
|
|
344
|
+
if (emit) {
|
|
345
|
+
if (!announced) {
|
|
346
|
+
announced = true;
|
|
347
|
+
emit({ type: 'pass-start', name, at: startedAt });
|
|
348
|
+
}
|
|
349
|
+
emit({ type: 'claimed', name, at: now() });
|
|
350
|
+
}
|
|
351
|
+
return item;
|
|
352
|
+
};
|
|
353
|
+
|
|
354
|
+
/* A pool of one is the sequential pass itself, with nothing to serialize
|
|
355
|
+
against; beyond that the workers queue behind one claim at a time. The
|
|
356
|
+
rejected arm takes the chain back: one link that raised must not leave
|
|
357
|
+
every other worker waiting on a promise that never settles. */
|
|
358
|
+
let queued: Promise<Claimed | null> = Promise.resolve(null);
|
|
359
|
+
const claimNext =
|
|
360
|
+
concurrency === 1
|
|
361
|
+
? take
|
|
362
|
+
: (): Promise<Claimed | null> => {
|
|
363
|
+
const taken = queued.then(take, take);
|
|
364
|
+
queued = taken;
|
|
365
|
+
return taken;
|
|
366
|
+
};
|
|
367
|
+
|
|
368
|
+
const worker = async (): Promise<void> => {
|
|
369
|
+
for (;;) {
|
|
370
|
+
const item = await claimNext();
|
|
371
|
+
if (item === null) return;
|
|
372
|
+
const outcome = await performItem(item);
|
|
373
|
+
if (outcome === 'performed') performed += 1;
|
|
374
|
+
else if (outcome === 'claim-lost') claimLost += 1;
|
|
375
|
+
else {
|
|
376
|
+
failed += 1;
|
|
377
|
+
raised = true;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
};
|
|
381
|
+
|
|
382
|
+
const pool: Promise<void>[] = [];
|
|
383
|
+
for (let slot = 0; slot < Math.min(concurrency, batchLimit); slot += 1) {
|
|
384
|
+
pool.push(worker());
|
|
385
|
+
}
|
|
386
|
+
await Promise.all(pool);
|
|
387
|
+
/* A claim another process already held is contention, not a failure, so it
|
|
388
|
+
never backs the loop off; anything that raised does, until a pass that
|
|
389
|
+
raises nothing resets it. */
|
|
390
|
+
failures = raised ? Math.min(failures + 1, MAX_BACKOFF_DOUBLINGS + 1) : 0;
|
|
391
|
+
const report: JobPassReport = { claimed, performed, failed, claimLost };
|
|
392
|
+
if (announced) {
|
|
393
|
+
emit?.({
|
|
394
|
+
type: 'pass-end',
|
|
395
|
+
name,
|
|
396
|
+
at: now(),
|
|
397
|
+
report,
|
|
398
|
+
nextDelayMs: delay(),
|
|
399
|
+
});
|
|
400
|
+
}
|
|
401
|
+
return report;
|
|
402
|
+
};
|
|
403
|
+
|
|
404
|
+
const tick = (): Promise<JobPassReport> => {
|
|
405
|
+
if (disposed) return Promise.resolve(IDLE);
|
|
406
|
+
if (inFlight) return inFlight;
|
|
407
|
+
const pending = pass().finally(() => {
|
|
408
|
+
if (inFlight === pending) inFlight = undefined;
|
|
409
|
+
});
|
|
410
|
+
inFlight = pending;
|
|
411
|
+
return pending;
|
|
412
|
+
};
|
|
413
|
+
|
|
414
|
+
const schedule = (delayMs: number, chain: number): void => {
|
|
415
|
+
timer = setTimeout(() => {
|
|
416
|
+
timer = undefined;
|
|
417
|
+
run(chain);
|
|
418
|
+
}, delayMs);
|
|
419
|
+
/* A poll loop is never the reason a process stays alive. */
|
|
420
|
+
timer.unref?.();
|
|
421
|
+
};
|
|
422
|
+
|
|
423
|
+
const run = (chain: number): void => {
|
|
424
|
+
void tick()
|
|
425
|
+
.catch(() => undefined)
|
|
426
|
+
.finally(() => {
|
|
427
|
+
/* A start while a pass is in flight joins that pass, so its chain ends
|
|
428
|
+
here too. Only the chain a stop has not retired schedules again;
|
|
429
|
+
without the token both would, and this one timer handle could cancel
|
|
430
|
+
just one of them. */
|
|
431
|
+
if (disposed || chain !== generation) return;
|
|
432
|
+
schedule(delay(), chain);
|
|
433
|
+
});
|
|
434
|
+
};
|
|
435
|
+
|
|
436
|
+
const stop = (): void => {
|
|
437
|
+
started = false;
|
|
438
|
+
waking = false;
|
|
439
|
+
generation += 1;
|
|
440
|
+
if (timer) clearTimeout(timer);
|
|
441
|
+
timer = undefined;
|
|
442
|
+
};
|
|
443
|
+
|
|
444
|
+
const wake = (): void => {
|
|
445
|
+
if (disposed) return;
|
|
446
|
+
if (!inFlight) {
|
|
447
|
+
void tick().catch(() => undefined);
|
|
448
|
+
return;
|
|
449
|
+
}
|
|
450
|
+
/* The pass in flight may already have read past the work this wake is
|
|
451
|
+
about, so it is followed by one more pass. Every wake arriving while that
|
|
452
|
+
pass runs coalesces into it. */
|
|
453
|
+
if (waking) return;
|
|
454
|
+
waking = true;
|
|
455
|
+
void inFlight
|
|
456
|
+
.catch(() => undefined)
|
|
457
|
+
.then(() => {
|
|
458
|
+
if (!waking) return;
|
|
459
|
+
waking = false;
|
|
460
|
+
if (disposed) return;
|
|
461
|
+
void tick().catch(() => undefined);
|
|
462
|
+
});
|
|
463
|
+
};
|
|
464
|
+
|
|
465
|
+
return {
|
|
466
|
+
name,
|
|
467
|
+
start() {
|
|
468
|
+
if (disposed || started) return;
|
|
469
|
+
started = true;
|
|
470
|
+
run(generation);
|
|
471
|
+
},
|
|
472
|
+
tick,
|
|
473
|
+
wake,
|
|
474
|
+
stop,
|
|
475
|
+
async quiesce() {
|
|
476
|
+
stop();
|
|
477
|
+
await inFlight?.catch(() => undefined);
|
|
478
|
+
},
|
|
479
|
+
async dispose() {
|
|
480
|
+
if (disposed) return;
|
|
481
|
+
stop();
|
|
482
|
+
disposed = true;
|
|
483
|
+
await inFlight?.catch(() => undefined);
|
|
484
|
+
},
|
|
485
|
+
};
|
|
486
|
+
}
|