@flowdular/sdk 0.2.4 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.ai/agents/sandbox/business-manager.md +5 -1
- package/.ai/blueprints/author-spec/README.md +1 -1
- package/.ai/blueprints/author-spec/spec-requirements.yaml +44 -0
- package/.ai/blueprints/author-spec/steps.yaml +5 -5
- package/.ai/blueprints/author-spec/templates/module.yaml +99 -3
- package/.ai/blueprints/edit-module/gates.yaml +4 -0
- package/.ai/blueprints/edit-module/required-files.yaml +9 -0
- package/.ai/blueprints/new-module/gates.yaml +4 -0
- package/.ai/blueprints/new-module/spec-requirements.yaml +2 -2
- package/.ai/blueprints/release/gates.yaml +4 -0
- package/.ai/platform-capabilities.md +128 -0
- package/.ai/policies/capabilities.yaml +130 -3
- package/.ai/policies/path-ownership.yaml +5 -2
- package/.ai/policies/task-budgets.yaml +5 -3
- package/.ai/references/catalog/module.json +4 -4
- package/.ai/references/catalog/package.json +2 -2
- package/.ai/references/catalog/spec/module.yaml +5 -3
- package/.ai/references/catalog/src/platform.ts +2 -0
- package/.ai/references/catalog/src/services/catalog-service.ts +89 -1
- package/.ai/references/catalog/src/services/data-classes.ts +47 -0
- package/.ai/references/catalog/src/services/database-repository.ts +98 -1
- package/.ai/references/catalog/src/services/repository.ts +22 -1
- package/.ai/references/catalog/tests/data-classes.test.ts +157 -0
- package/.ai/references/catalog.provenance.json +12 -10
- package/.ai/skills/README.md +10 -0
- package/.ai/skills/agent-tool-design/SKILL.md +1 -2
- package/.ai/skills/auth-security-review/SKILL.md +1 -1
- package/.ai/skills/business-agent-design/SKILL.md +0 -1
- package/.ai/skills/cli-extension/SKILL.md +1 -1
- package/.ai/skills/deploy-operate/SKILL.md +119 -0
- package/.ai/skills/module-new/SKILL.md +29 -3
- package/.ai/skills/module-update/SKILL.md +9 -3
- package/.ai/skills/perf-audit/SKILL.md +0 -1
- package/.ai/skills/release-eject-pr/SKILL.md +0 -1
- package/.ai/skills/spec-interview/SKILL.md +120 -0
- package/.ai/skills/test-hardening/SKILL.md +1 -0
- package/.ai/skills/ux-design/SKILL.md +34 -3
- package/.ai/skills/variables/SKILL.md +0 -2
- package/.ai/skills/workflow-development/SKILL.md +0 -1
- package/AGENTS.md +4 -0
- package/docs/agent-contract.md +2 -2
- package/docs/design-system.md +185 -31
- package/modules/access/migrations/0001_access_core.down.sql +1 -0
- package/modules/access/migrations/0001_access_core.up.sql +28 -0
- package/modules/access/migrations/README.md +3 -0
- package/modules/access/module.json +33 -0
- package/modules/access/package.json +43 -0
- package/modules/access/spec/module.yaml +225 -0
- package/modules/access/src/acl/permissions.ts +6 -0
- package/modules/access/src/api/endpoints.ts +244 -0
- package/modules/access/src/client/ActivityView.tsrx +245 -0
- package/modules/access/src/client/AttestationsView.tsrx +176 -0
- package/modules/access/src/client/ReviewView.tsrx +586 -0
- package/modules/access/src/client/api.ts +132 -0
- package/modules/access/src/client/contribution.tsrx +41 -0
- package/modules/access/src/client/index.ts +41 -0
- package/modules/access/src/client/navigation.ts +57 -0
- package/modules/access/src/client/presentation.ts +69 -0
- package/modules/access/src/client/state.ts +72 -0
- package/modules/access/src/domain/types.ts +189 -0
- package/modules/access/src/index.ts +38 -0
- package/modules/access/src/platform.ts +60 -0
- package/modules/access/src/server/index.ts +42 -0
- package/modules/access/src/server/runtime.ts +105 -0
- package/modules/access/src/services/access-service.ts +298 -0
- package/modules/access/src/services/audit-window.ts +78 -0
- package/modules/access/src/services/auth-directory.ts +72 -0
- package/modules/access/src/services/changes.ts +91 -0
- package/modules/access/src/services/data-classes.ts +28 -0
- package/modules/access/src/services/database-repository.ts +185 -0
- package/modules/access/src/services/directory.ts +102 -0
- package/modules/access/src/services/index.ts +33 -0
- package/modules/access/src/services/list-exports.ts +150 -0
- package/modules/access/src/services/migration.ts +54 -0
- package/modules/access/src/services/repository.ts +30 -0
- package/modules/access/src/services/review.ts +178 -0
- package/modules/access/translations/en.json +155 -0
- package/modules/access/translations/pl.json +155 -0
- package/modules/agents/migrations/0022_credential_rotation_inventory.down.sql +2 -0
- package/modules/agents/migrations/0022_credential_rotation_inventory.up.sql +7 -0
- package/modules/agents/migrations/0023_agents_retention_indexes.down.sql +2 -0
- package/modules/agents/migrations/0023_agents_retention_indexes.up.sql +9 -0
- package/modules/agents/migrations/0024_agent_meter_refusals.down.sql +3 -0
- package/modules/agents/migrations/0024_agent_meter_refusals.up.sql +22 -0
- package/modules/agents/migrations/0025_agent_list_indexes.down.sql +3 -0
- package/modules/agents/migrations/0025_agent_list_indexes.up.sql +11 -0
- package/modules/agents/module.json +30 -4
- package/modules/agents/package.json +2 -1
- package/modules/agents/spec/module.yaml +63 -5
- package/modules/agents/src/api/endpoints.ts +291 -33
- package/modules/agents/src/cli/commands.json +11 -0
- package/modules/agents/src/cli/index.ts +45 -0
- package/modules/agents/src/client/AgentDashboardWidget.tsrx +19 -11
- package/modules/agents/src/client/AgentDefinitionList.tsrx +53 -10
- package/modules/agents/src/client/AgentPlaygroundView.tsrx +4 -4
- package/modules/agents/src/client/AgentProceduresView.tsrx +2 -2
- package/modules/agents/src/client/AgentRunsView.tsrx +143 -40
- package/modules/agents/src/client/AgentsView.tsrx +109 -33
- package/modules/agents/src/client/api.ts +99 -21
- package/modules/agents/src/client/state.ts +97 -0
- package/modules/agents/src/domain/types.ts +44 -4
- package/modules/agents/src/platform.ts +42 -0
- package/modules/agents/src/server/action-execution.ts +201 -106
- package/modules/agents/src/server/runtime.ts +32 -0
- package/modules/agents/src/services/agent-service.ts +158 -30
- package/modules/agents/src/services/credential-rotation.ts +185 -0
- package/modules/agents/src/services/credential-vault.ts +71 -46
- package/modules/agents/src/services/data-classes.ts +176 -0
- package/modules/agents/src/services/database-repository.ts +393 -101
- package/modules/agents/src/services/metering.ts +111 -0
- package/modules/agents/src/services/migration.ts +109 -0
- package/modules/agents/src/services/module-agent-preflight.ts +17 -9
- package/modules/agents/src/services/notifications.ts +98 -0
- package/modules/agents/src/services/provider-repository.ts +9 -18
- package/modules/agents/src/services/provider-service.ts +1 -9
- package/modules/agents/src/services/reports.ts +107 -0
- package/modules/agents/src/services/repository.ts +86 -6
- package/modules/agents/src/services/usage-service.ts +2 -0
- package/modules/agents/src/services/worker.ts +114 -4
- package/modules/agents/src/settings.ts +14 -3
- package/modules/agents/translations/en.json +14 -4
- package/modules/agents/translations/pl.json +14 -4
- package/modules/approvals/migrations/0001_approvals_core.down.sql +3 -0
- package/modules/approvals/migrations/0001_approvals_core.up.sql +78 -0
- package/modules/approvals/migrations/0002_approvals_expiry_routing_role.down.sql +2 -0
- package/modules/approvals/migrations/0002_approvals_expiry_routing_role.up.sql +19 -0
- package/modules/approvals/migrations/0003_approvals_retention_indexes.down.sql +6 -0
- package/modules/approvals/migrations/0003_approvals_retention_indexes.up.sql +14 -0
- package/modules/approvals/migrations/0004_approvals_inbox_keyset_indexes.down.sql +5 -0
- package/modules/approvals/migrations/0004_approvals_inbox_keyset_indexes.up.sql +12 -0
- package/modules/approvals/migrations/0005_approvals_grant_audit.down.sql +4 -0
- package/modules/approvals/migrations/0005_approvals_grant_audit.up.sql +20 -0
- package/modules/approvals/migrations/README.md +3 -0
- package/modules/approvals/module.json +34 -0
- package/modules/approvals/package.json +43 -0
- package/modules/approvals/spec/module.yaml +327 -0
- package/modules/approvals/src/acl/permissions.ts +7 -0
- package/modules/approvals/src/api/endpoints.ts +457 -0
- package/modules/approvals/src/client/ApprovalRequestDrawer.tsrx +138 -0
- package/modules/approvals/src/client/ApprovalsView.tsrx +562 -0
- package/modules/approvals/src/client/PendingCountWidget.tsrx +52 -0
- package/modules/approvals/src/client/api.ts +203 -0
- package/modules/approvals/src/client/approvals.css +51 -0
- package/modules/approvals/src/client/contribution.tsrx +44 -0
- package/modules/approvals/src/client/index.ts +26 -0
- package/modules/approvals/src/client/navigation.ts +39 -0
- package/modules/approvals/src/client/pending-count.ts +26 -0
- package/modules/approvals/src/client/presentation.ts +52 -0
- package/modules/approvals/src/client/state.ts +141 -0
- package/modules/approvals/src/domain/capability.ts +107 -0
- package/modules/approvals/src/domain/grant.ts +69 -0
- package/modules/approvals/src/domain/types.ts +168 -0
- package/modules/approvals/src/index.ts +61 -0
- package/modules/approvals/src/platform.ts +136 -0
- package/modules/approvals/src/server/index.ts +42 -0
- package/modules/approvals/src/server/runtime.ts +185 -0
- package/modules/approvals/src/services/approvals-service.ts +637 -0
- package/modules/approvals/src/services/callbacks.ts +75 -0
- package/modules/approvals/src/services/data-classes.ts +167 -0
- package/modules/approvals/src/services/database-repository.ts +783 -0
- package/modules/approvals/src/services/eligibility.ts +121 -0
- package/modules/approvals/src/services/expiry-runner.ts +81 -0
- package/modules/approvals/src/services/index.ts +31 -0
- package/modules/approvals/src/services/migration.ts +256 -0
- package/modules/approvals/src/services/notifications.ts +95 -0
- package/modules/approvals/src/services/repository.ts +169 -0
- package/modules/approvals/src/services/service-error.ts +70 -0
- package/modules/approvals/src/settings.ts +102 -0
- package/modules/approvals/translations/en.json +104 -0
- package/modules/approvals/translations/pl.json +104 -0
- package/modules/audit/migrations/0001_audit_core.down.sql +8 -0
- package/modules/audit/migrations/0001_audit_core.up.sql +107 -0
- package/modules/audit/migrations/0002_audit_sweep_routing_role.down.sql +2 -0
- package/modules/audit/migrations/0002_audit_sweep_routing_role.up.sql +21 -0
- package/modules/audit/migrations/0003_audit_export_request.down.sql +12 -0
- package/modules/audit/migrations/0003_audit_export_request.up.sql +40 -0
- package/modules/audit/migrations/0004_audit_hold_seal_erasure.down.sql +17 -0
- package/modules/audit/migrations/0004_audit_hold_seal_erasure.up.sql +192 -0
- package/modules/audit/migrations/0005_audit_event_format.down.sql +17 -0
- package/modules/audit/migrations/0005_audit_event_format.up.sql +60 -0
- package/modules/audit/migrations/0006_audit_own_class_walks.down.sql +3 -0
- package/modules/audit/migrations/0006_audit_own_class_walks.up.sql +14 -0
- package/modules/audit/migrations/README.md +3 -0
- package/modules/audit/module.json +32 -0
- package/modules/audit/package.json +49 -0
- package/modules/audit/spec/module.yaml +809 -0
- package/modules/audit/src/acl/permissions.ts +7 -0
- package/modules/audit/src/api/endpoints.ts +315 -0
- package/modules/audit/src/cli/commands.json +95 -0
- package/modules/audit/src/cli/index.ts +658 -0
- package/modules/audit/src/client/DataClassesView.tsrx +420 -0
- package/modules/audit/src/client/ExportsView.tsrx +256 -0
- package/modules/audit/src/client/HoldsView.tsrx +604 -0
- package/modules/audit/src/client/SweepsView.tsrx +251 -0
- package/modules/audit/src/client/api.ts +185 -0
- package/modules/audit/src/client/contribution.tsrx +52 -0
- package/modules/audit/src/client/index.ts +23 -0
- package/modules/audit/src/client/navigation.ts +74 -0
- package/modules/audit/src/client/presentation.ts +105 -0
- package/modules/audit/src/client/state.ts +86 -0
- package/modules/audit/src/domain/data-classes.ts +16 -0
- package/modules/audit/src/domain/types.ts +339 -0
- package/modules/audit/src/index.ts +76 -0
- package/modules/audit/src/platform.ts +44 -0
- package/modules/audit/src/server/index.ts +177 -0
- package/modules/audit/src/server/runtime.ts +303 -0
- package/modules/audit/src/services/anchor-key.ts +143 -0
- package/modules/audit/src/services/anchor-rotation.ts +147 -0
- package/modules/audit/src/services/audit-runners.ts +278 -0
- package/modules/audit/src/services/backup-guard.ts +95 -0
- package/modules/audit/src/services/database-repository.ts +1946 -0
- package/modules/audit/src/services/declared-classes.ts +64 -0
- package/modules/audit/src/services/erasure-port.ts +126 -0
- package/modules/audit/src/services/erasure-service.ts +770 -0
- package/modules/audit/src/services/export-directory.ts +106 -0
- package/modules/audit/src/services/export-service.ts +714 -0
- package/modules/audit/src/services/hold-service.ts +295 -0
- package/modules/audit/src/services/index.ts +17 -0
- package/modules/audit/src/services/migration.ts +658 -0
- package/modules/audit/src/services/own-classes.ts +318 -0
- package/modules/audit/src/services/platform-version.ts +23 -0
- package/modules/audit/src/services/repository.ts +495 -0
- package/modules/audit/src/services/retention-service.ts +191 -0
- package/modules/audit/src/services/seal-service.ts +769 -0
- package/modules/audit/src/services/service-error.ts +61 -0
- package/modules/audit/src/services/subject-keys.ts +90 -0
- package/modules/audit/src/services/sweep-service.ts +298 -0
- package/modules/audit/src/services/zip.ts +217 -0
- package/modules/audit/src/settings.ts +69 -0
- package/modules/audit/translations/en.json +210 -0
- package/modules/audit/translations/pl.json +210 -0
- package/modules/auth/README.md +77 -29
- package/modules/auth/migrations/0016_external_identities.up.sql +16 -0
- package/modules/auth/migrations/0017_mfa_key_id.up.sql +8 -0
- package/modules/auth/migrations/0018_retire_bundled_module_scopes.up.sql +29 -0
- package/modules/auth/migrations/0019_notifications_member_scopes.up.sql +44 -0
- package/modules/auth/migrations/0020_identity_providers.up.sql +61 -0
- package/modules/auth/migrations/0021_membership_status.up.sql +19 -0
- package/modules/auth/migrations/0022_auth_provider_scopes.up.sql +45 -0
- package/modules/auth/migrations/0023_enterprise_module_scopes.down.sql +19 -0
- package/modules/auth/migrations/0023_enterprise_module_scopes.up.sql +71 -0
- package/modules/auth/migrations/0024_approvals_member_scopes.down.sql +22 -0
- package/modules/auth/migrations/0024_approvals_member_scopes.up.sql +48 -0
- package/modules/auth/migrations/0025_audit_holds_owner_scope.down.sql +21 -0
- package/modules/auth/migrations/0025_audit_holds_owner_scope.up.sql +47 -0
- package/modules/auth/migrations/0026_auth_export_keyset_indexes.down.sql +6 -0
- package/modules/auth/migrations/0026_auth_export_keyset_indexes.up.sql +15 -0
- package/modules/auth/migrations/0027_workflow_automation_profile_scopes.down.sql +34 -0
- package/modules/auth/migrations/0027_workflow_automation_profile_scopes.up.sql +72 -0
- package/modules/auth/migrations/0028_auth_member_search_prefix_indexes.down.sql +6 -0
- package/modules/auth/migrations/0028_auth_member_search_prefix_indexes.up.sql +21 -0
- package/modules/auth/migrations/0029_reports_exports_access_scopes.down.sql +22 -0
- package/modules/auth/migrations/0029_reports_exports_access_scopes.up.sql +56 -0
- package/modules/auth/migrations/0030_auth_membership_keyset_index.down.sql +4 -0
- package/modules/auth/migrations/0030_auth_membership_keyset_index.up.sql +10 -0
- package/modules/auth/migrations/0031_membership_scope_backfills_under_rls.down.sql +4 -0
- package/modules/auth/migrations/0031_membership_scope_backfills_under_rls.up.sql +31 -0
- package/modules/auth/migrations/0032_audit_actor_service.down.sql +9 -0
- package/modules/auth/migrations/0032_audit_actor_service.up.sql +10 -0
- package/modules/auth/migrations/0033_auth_account_keyset_indexes.down.sql +5 -0
- package/modules/auth/migrations/0033_auth_account_keyset_indexes.up.sql +23 -0
- package/modules/auth/module.json +3 -3
- package/modules/auth/package.json +2 -1
- package/modules/auth/spec/module.yaml +372 -3
- package/modules/auth/src/acl/scopes.ts +50 -6
- package/modules/auth/src/cli/commands.json +11 -0
- package/modules/auth/src/cli/greenfield.ts +2 -2
- package/modules/auth/src/cli/index.ts +14 -0
- package/modules/auth/src/cli/secrets.ts +114 -0
- package/modules/auth/src/client/AuthenticationCore.tsrx +61 -8
- package/modules/auth/src/client/api.ts +72 -6
- package/modules/auth/src/client/contribution.tsrx +23 -0
- package/modules/auth/src/client/index.ts +6 -0
- package/modules/auth/src/client/providers/IdentityProviderForm.tsrx +191 -0
- package/modules/auth/src/client/providers/IdentityProvidersView.tsrx +358 -0
- package/modules/auth/src/client/providers/api.ts +128 -0
- package/modules/auth/src/client/providers/provider-columns.tsrx +60 -0
- package/modules/auth/src/client/providers/state.ts +35 -0
- package/modules/auth/src/client/security/SecurityView.tsrx +9 -1
- package/modules/auth/src/client/state.ts +15 -1
- package/modules/auth/src/domain/types.ts +55 -0
- package/modules/auth/src/index.ts +11 -1
- package/modules/auth/src/middleware/authentication.ts +4 -0
- package/modules/auth/src/server/endpoints.ts +467 -171
- package/modules/auth/src/server/http.ts +3 -2
- package/modules/auth/src/server/index.ts +22 -1
- package/modules/auth/src/server/membership-endpoints.ts +62 -0
- package/modules/auth/src/server/mfa-enforcement.ts +156 -0
- package/modules/auth/src/server/oidc.ts +389 -0
- package/modules/auth/src/server/provider-endpoints.ts +246 -0
- package/modules/auth/src/server/provider-host.ts +77 -0
- package/modules/auth/src/server/runtime.ts +231 -55
- package/modules/auth/src/services/auth-service-error.ts +7 -2
- package/modules/auth/src/services/auth-service.ts +948 -51
- package/modules/auth/src/services/data-classes.ts +236 -0
- package/modules/auth/src/services/database-repository.ts +853 -71
- package/modules/auth/src/services/identity-provider-service.ts +571 -0
- package/modules/auth/src/services/mail-delivery.ts +16 -16
- package/modules/auth/src/services/mail-message.ts +54 -0
- package/modules/auth/src/services/mail-port.ts +24 -0
- package/modules/auth/src/services/mail-smtp.ts +85 -0
- package/modules/auth/src/services/mfa-rotation.ts +144 -0
- package/modules/auth/src/services/migration.ts +810 -0
- package/modules/auth/src/services/password.ts +14 -0
- package/modules/auth/src/services/provider-secret-rotation.ts +169 -0
- package/modules/auth/src/services/provider-secrets.ts +136 -0
- package/modules/auth/src/services/repository.ts +321 -5
- package/modules/auth/src/services/session-sweep-runner.ts +73 -0
- package/modules/auth/src/services/settings-store.ts +10 -83
- package/modules/auth/src/services/totp.ts +88 -62
- package/modules/auth/src/services/validation.ts +194 -7
- package/modules/auth/src/settings.ts +18 -0
- package/modules/auth/translations/en.json +84 -1
- package/modules/auth/translations/pl.json +84 -1
- package/modules/automations/migrations/0005_secret_rotation_inventory.down.sql +1 -0
- package/modules/automations/migrations/0005_secret_rotation_inventory.up.sql +6 -0
- package/modules/automations/migrations/0006_automations_list_sort_indexes.down.sql +4 -0
- package/modules/automations/migrations/0006_automations_list_sort_indexes.up.sql +11 -0
- package/modules/automations/module.json +24 -6
- package/modules/automations/package.json +4 -1
- package/modules/automations/spec/module.yaml +81 -7
- package/modules/automations/src/api/endpoints.ts +202 -28
- package/modules/automations/src/cli/commands.json +17 -0
- package/modules/automations/src/cli/index.ts +114 -0
- package/modules/automations/src/client/AutomationScheduleForm.tsrx +77 -19
- package/modules/automations/src/client/AutomationSchedulesView.tsrx +144 -40
- package/modules/automations/src/client/AutomationTriggersView.tsrx +131 -32
- package/modules/automations/src/client/api.ts +62 -19
- package/modules/automations/src/client/presentation.ts +20 -2
- package/modules/automations/src/client/state.ts +84 -0
- package/modules/automations/src/domain/cadence.ts +99 -3
- package/modules/automations/src/domain/cron.ts +366 -0
- package/modules/automations/src/domain/time-zone.ts +61 -0
- package/modules/automations/src/platform.ts +38 -4
- package/modules/automations/src/server/index.ts +11 -0
- package/modules/automations/src/server/runtime.ts +46 -22
- package/modules/{automations-workflows-integration/src/server/adapter.ts → automations/src/server/workflow-target.ts} +13 -14
- package/modules/{automations-workflows-integration/src/server/tools.ts → automations/src/server/workflow-tools.ts} +0 -0
- package/modules/automations/src/services/data-classes.ts +62 -0
- package/modules/automations/src/services/database-repository.ts +152 -38
- package/modules/automations/src/services/migration.ts +119 -9
- package/modules/automations/src/services/repository.ts +52 -1
- package/modules/automations/src/services/schedule-runner.ts +84 -0
- package/modules/automations/src/services/schedule-service.ts +152 -26
- package/modules/automations/src/services/secret-rotation.ts +176 -0
- package/modules/automations/src/services/secret-vault.ts +68 -41
- package/modules/automations/src/services/trigger-service.ts +13 -10
- package/modules/automations/translations/en.json +15 -2
- package/modules/automations/translations/pl.json +15 -2
- package/modules/connectors/migrations/0001_connectors_core.down.sql +3 -0
- package/modules/connectors/migrations/0001_connectors_core.up.sql +72 -0
- package/modules/connectors/migrations/0002_connectors_call_keys.down.sql +3 -0
- package/modules/connectors/migrations/0002_connectors_call_keys.up.sql +18 -0
- package/modules/connectors/migrations/0003_connectors_rotation_inventory.down.sql +2 -0
- package/modules/connectors/migrations/0003_connectors_rotation_inventory.up.sql +19 -0
- package/modules/connectors/migrations/README.md +3 -0
- package/modules/connectors/module.json +32 -0
- package/modules/{automations-workflows-integration → connectors}/package.json +28 -26
- package/modules/connectors/spec/module.yaml +448 -0
- package/modules/connectors/src/acl/permissions.ts +6 -0
- package/modules/connectors/src/agent/tools.ts +180 -0
- package/modules/connectors/src/api/endpoints.ts +572 -0
- package/modules/connectors/src/cli/commands.json +17 -0
- package/modules/connectors/src/cli/index.ts +126 -0
- package/modules/connectors/src/client/ConnectorCallsView.tsrx +358 -0
- package/modules/connectors/src/client/ConnectorForm.tsrx +424 -0
- package/modules/connectors/src/client/ConnectorsView.tsrx +711 -0
- package/modules/connectors/src/client/api.ts +281 -0
- package/modules/connectors/src/client/consent.ts +48 -0
- package/modules/connectors/src/client/contribution.tsrx +37 -0
- package/modules/connectors/src/client/index.ts +22 -0
- package/modules/connectors/src/client/navigation.ts +42 -0
- package/modules/connectors/src/client/presentation.ts +38 -0
- package/modules/connectors/src/client/state.ts +175 -0
- package/modules/connectors/src/domain/calls.ts +70 -0
- package/modules/connectors/src/domain/definitions.ts +190 -0
- package/modules/connectors/src/domain/http-json.ts +68 -0
- package/modules/connectors/src/domain/types.ts +185 -0
- package/modules/connectors/src/index.ts +64 -0
- package/modules/connectors/src/platform.ts +56 -0
- package/modules/connectors/src/server/index.ts +66 -0
- package/modules/connectors/src/server/runtime.ts +163 -0
- package/modules/connectors/src/services/call-service.ts +903 -0
- package/modules/connectors/src/services/connectors-service.ts +653 -0
- package/modules/connectors/src/services/credential-rotation.ts +221 -0
- package/modules/connectors/src/services/credential-vault.ts +194 -0
- package/modules/connectors/src/services/data-classes.ts +158 -0
- package/modules/connectors/src/services/database-repository.ts +897 -0
- package/modules/connectors/src/services/egress.ts +261 -0
- package/modules/connectors/src/services/index.ts +19 -0
- package/modules/connectors/src/services/migration.ts +202 -0
- package/modules/connectors/src/services/repository.ts +175 -0
- package/modules/connectors/src/services/service-error.ts +46 -0
- package/modules/connectors/src/settings.ts +69 -0
- package/modules/connectors/translations/en.json +191 -0
- package/modules/connectors/translations/pl.json +191 -0
- package/modules/directory/migrations/0001_directory_core.down.sql +5 -0
- package/modules/directory/migrations/0001_directory_core.up.sql +111 -0
- package/modules/directory/migrations/README.md +3 -0
- package/modules/directory/module.json +27 -0
- package/modules/directory/package.json +46 -0
- package/modules/directory/spec/module.yaml +351 -0
- package/modules/directory/src/acl/permissions.ts +7 -0
- package/modules/directory/src/api/endpoints.ts +478 -0
- package/modules/directory/src/api/scim-endpoints.ts +516 -0
- package/modules/directory/src/client/GroupMappingsView.tsrx +430 -0
- package/modules/directory/src/client/ProvisioningLogView.tsrx +248 -0
- package/modules/directory/src/client/ScimTokensView.tsrx +587 -0
- package/modules/directory/src/client/api.ts +222 -0
- package/modules/directory/src/client/contribution.tsrx +46 -0
- package/modules/directory/src/client/index.ts +22 -0
- package/modules/directory/src/client/navigation.ts +57 -0
- package/modules/directory/src/client/presentation.ts +143 -0
- package/modules/directory/src/client/state.ts +173 -0
- package/modules/directory/src/domain/scim.ts +346 -0
- package/modules/directory/src/domain/types.ts +166 -0
- package/modules/directory/src/index.ts +44 -0
- package/modules/directory/src/platform.ts +43 -0
- package/modules/directory/src/server/index.ts +17 -0
- package/modules/directory/src/server/runtime.ts +124 -0
- package/modules/directory/src/services/auth-port.ts +127 -0
- package/modules/directory/src/services/data-classes.ts +41 -0
- package/modules/directory/src/services/database-repository.ts +1067 -0
- package/modules/directory/src/services/directory-service.ts +311 -0
- package/modules/directory/src/services/index.ts +43 -0
- package/modules/directory/src/services/migration.ts +146 -0
- package/modules/directory/src/services/provisioning-service.ts +1420 -0
- package/modules/directory/src/services/rate-limiter.ts +103 -0
- package/modules/directory/src/services/repository.ts +208 -0
- package/modules/directory/src/services/service-error.ts +42 -0
- package/modules/directory/src/services/token-service.ts +215 -0
- package/modules/directory/src/settings.ts +86 -0
- package/modules/directory/translations/en.json +185 -0
- package/modules/directory/translations/pl.json +185 -0
- package/modules/documents/migrations/0001_documents_core.down.sql +1 -0
- package/modules/documents/migrations/0001_documents_core.up.sql +35 -0
- package/modules/documents/migrations/0002_documents_files_page.down.sql +1 -0
- package/modules/documents/migrations/0002_documents_files_page.up.sql +6 -0
- package/modules/documents/migrations/0003_documents_rotation_inventory.down.sql +2 -0
- package/modules/documents/migrations/0003_documents_rotation_inventory.up.sql +18 -0
- package/modules/documents/migrations/README.md +3 -0
- package/modules/documents/module.json +32 -0
- package/modules/documents/package.json +50 -0
- package/modules/documents/spec/module.yaml +248 -0
- package/modules/documents/src/acl/permissions.ts +6 -0
- package/modules/documents/src/api/endpoints.ts +401 -0
- package/modules/documents/src/cli/commands.json +17 -0
- package/modules/documents/src/cli/index.ts +145 -0
- package/modules/documents/src/client/DocumentUploader.tsrx +148 -0
- package/modules/documents/src/client/DocumentsView.tsrx +540 -0
- package/modules/documents/src/client/api.ts +209 -0
- package/modules/documents/src/client/contribution.tsrx +29 -0
- package/modules/documents/src/client/download.ts +70 -0
- package/modules/documents/src/client/index.ts +22 -0
- package/modules/documents/src/client/navigation.ts +25 -0
- package/modules/documents/src/client/presentation.ts +110 -0
- package/modules/documents/src/client/state.ts +117 -0
- package/modules/documents/src/domain/attachments.ts +84 -0
- package/modules/documents/src/domain/types.ts +80 -0
- package/modules/documents/src/index.ts +46 -0
- package/modules/documents/src/platform.ts +61 -0
- package/modules/documents/src/server/index.ts +30 -0
- package/modules/documents/src/server/runtime.ts +107 -0
- package/modules/documents/src/services/attachments.ts +39 -0
- package/modules/documents/src/services/data-classes.ts +25 -0
- package/modules/documents/src/services/database-repository.ts +270 -0
- package/modules/documents/src/services/documents-service.ts +590 -0
- package/modules/documents/src/services/index.ts +18 -0
- package/modules/documents/src/services/migration.ts +117 -0
- package/modules/documents/src/services/repository.ts +58 -0
- package/modules/documents/src/services/storage-rotation.ts +157 -0
- package/modules/documents/src/settings.ts +107 -0
- package/modules/documents/translations/en.json +111 -0
- package/modules/documents/translations/pl.json +111 -0
- package/modules/exports/migrations/0001_exports_core.down.sql +2 -0
- package/modules/exports/migrations/0001_exports_core.up.sql +28 -0
- package/modules/exports/migrations/0002_exports_job_routing_role.down.sql +4 -0
- package/modules/exports/migrations/0002_exports_job_routing_role.up.sql +21 -0
- package/modules/exports/migrations/0003_exports_rotation_inventory.down.sql +1 -0
- package/modules/exports/migrations/0003_exports_rotation_inventory.up.sql +9 -0
- package/modules/exports/migrations/README.md +3 -0
- package/modules/exports/module.json +32 -0
- package/modules/exports/package.json +45 -0
- package/modules/exports/spec/module.yaml +230 -0
- package/modules/exports/src/acl/permissions.ts +6 -0
- package/modules/exports/src/api/endpoints.ts +211 -0
- package/modules/exports/src/cli/commands.json +17 -0
- package/modules/exports/src/cli/index.ts +145 -0
- package/modules/exports/src/client/ExportsView.tsrx +327 -0
- package/modules/exports/src/client/api.ts +133 -0
- package/modules/exports/src/client/contribution.tsrx +31 -0
- package/modules/exports/src/client/index.ts +20 -0
- package/modules/exports/src/client/navigation.ts +25 -0
- package/modules/exports/src/client/presentation.ts +53 -0
- package/modules/exports/src/client/state.ts +56 -0
- package/modules/exports/src/domain/lists.ts +29 -0
- package/modules/exports/src/domain/types.ts +120 -0
- package/modules/exports/src/index.ts +41 -0
- package/modules/exports/src/platform.ts +80 -0
- package/modules/exports/src/server/index.ts +50 -0
- package/modules/exports/src/server/runtime.ts +160 -0
- package/modules/exports/src/services/data-classes.ts +59 -0
- package/modules/exports/src/services/database-repository.ts +403 -0
- package/modules/exports/src/services/export-runner.ts +123 -0
- package/modules/exports/src/services/export-service.ts +356 -0
- package/modules/exports/src/services/index.ts +6 -0
- package/modules/exports/src/services/list-registry.ts +105 -0
- package/modules/exports/src/services/migration.ts +116 -0
- package/modules/exports/src/services/repository.ts +96 -0
- package/modules/exports/src/services/storage-rotation.ts +138 -0
- package/modules/exports/src/settings.ts +70 -0
- package/modules/exports/translations/en.json +69 -0
- package/modules/exports/translations/pl.json +69 -0
- package/modules/import/migrations/0001_import_core.down.sql +6 -0
- package/modules/import/migrations/0001_import_core.up.sql +61 -0
- package/modules/import/migrations/0002_import_job_routing_role.down.sql +4 -0
- package/modules/import/migrations/0002_import_job_routing_role.up.sql +20 -0
- package/modules/import/migrations/0003_import_jobs_export_index.down.sql +1 -0
- package/modules/import/migrations/0003_import_jobs_export_index.up.sql +7 -0
- package/modules/import/migrations/0004_import_jobs_traceparent.down.sql +1 -0
- package/modules/import/migrations/0004_import_jobs_traceparent.up.sql +7 -0
- package/modules/import/migrations/README.md +3 -0
- package/modules/import/module.json +37 -0
- package/modules/import/package.json +50 -0
- package/modules/import/spec/module.yaml +335 -0
- package/modules/import/src/acl/permissions.ts +6 -0
- package/modules/import/src/api/endpoints.ts +400 -0
- package/modules/import/src/client/ImportJobDrawer.tsrx +229 -0
- package/modules/import/src/client/ImportsView.tsrx +455 -0
- package/modules/import/src/client/NewImportForm.tsrx +274 -0
- package/modules/import/src/client/api.ts +243 -0
- package/modules/import/src/client/contribution.tsrx +29 -0
- package/modules/import/src/client/index.ts +23 -0
- package/modules/import/src/client/navigation.ts +25 -0
- package/modules/import/src/client/presentation.ts +59 -0
- package/modules/import/src/client/state.ts +43 -0
- package/modules/import/src/domain/csv.ts +258 -0
- package/modules/import/src/domain/ports.ts +157 -0
- package/modules/import/src/domain/types.ts +179 -0
- package/modules/import/src/index.ts +58 -0
- package/modules/import/src/platform.ts +60 -0
- package/modules/import/src/server/index.ts +49 -0
- package/modules/import/src/server/runtime.ts +158 -0
- package/modules/import/src/services/csv-source.ts +121 -0
- package/modules/import/src/services/data-classes.ts +63 -0
- package/modules/import/src/services/database-repository.ts +780 -0
- package/modules/import/src/services/import-runner.ts +127 -0
- package/modules/import/src/services/import-service.ts +872 -0
- package/modules/import/src/services/index.ts +6 -0
- package/modules/import/src/services/migration.ts +156 -0
- package/modules/import/src/services/port-registry.ts +158 -0
- package/modules/import/src/services/repository.ts +147 -0
- package/modules/import/src/settings.ts +70 -0
- package/modules/import/translations/en.json +175 -0
- package/modules/import/translations/pl.json +175 -0
- package/modules/metering/migrations/0001_metering_core.down.sql +6 -0
- package/modules/metering/migrations/0001_metering_core.up.sql +119 -0
- package/modules/metering/migrations/0002_metering_bucket_export.down.sql +3 -0
- package/modules/metering/migrations/0002_metering_bucket_export.up.sql +5 -0
- package/modules/metering/migrations/README.md +3 -0
- package/modules/metering/module.json +46 -0
- package/modules/metering/package.json +50 -0
- package/modules/metering/spec/module.yaml +269 -0
- package/modules/metering/src/acl/permissions.ts +5 -0
- package/modules/metering/src/api/endpoints.ts +104 -0
- package/modules/metering/src/cli/commands.json +28 -0
- package/modules/metering/src/cli/index.ts +246 -0
- package/modules/metering/src/client/LimitsView.tsrx +170 -0
- package/modules/metering/src/client/UsageSummaryWidget.tsrx +63 -0
- package/modules/metering/src/client/UsageView.tsrx +205 -0
- package/modules/metering/src/client/api.ts +91 -0
- package/modules/metering/src/client/contribution.tsrx +42 -0
- package/modules/metering/src/client/index.ts +26 -0
- package/modules/metering/src/client/navigation.ts +54 -0
- package/modules/metering/src/client/presentation.ts +63 -0
- package/modules/metering/src/client/state.ts +31 -0
- package/modules/metering/src/domain/meters.ts +100 -0
- package/modules/metering/src/domain/types.ts +71 -0
- package/modules/metering/src/index.ts +51 -0
- package/modules/metering/src/platform.ts +84 -0
- package/modules/metering/src/server/index.ts +40 -0
- package/modules/metering/src/server/runtime.ts +165 -0
- package/modules/metering/src/services/data-classes.ts +34 -0
- package/modules/metering/src/services/database-repository.ts +574 -0
- package/modules/metering/src/services/index.ts +9 -0
- package/modules/metering/src/services/meter-registry.ts +145 -0
- package/modules/metering/src/services/metering-service.ts +441 -0
- package/modules/metering/src/services/migration.ts +183 -0
- package/modules/metering/src/services/notifications.ts +75 -0
- package/modules/metering/src/services/reports.ts +105 -0
- package/modules/metering/src/services/repository.ts +132 -0
- package/modules/metering/src/services/service-error.ts +46 -0
- package/modules/metering/src/settings.ts +47 -0
- package/modules/metering/translations/en.json +68 -0
- package/modules/metering/translations/pl.json +68 -0
- package/modules/notifications/migrations/0001_notifications_core.down.sql +1 -0
- package/modules/notifications/migrations/0001_notifications_core.up.sql +26 -0
- package/modules/notifications/migrations/0002_notifications_preferences.down.sql +1 -0
- package/modules/notifications/migrations/0002_notifications_preferences.up.sql +17 -0
- package/modules/notifications/migrations/0003_notifications_webhook_subscriptions.down.sql +1 -0
- package/modules/notifications/migrations/0003_notifications_webhook_subscriptions.up.sql +30 -0
- package/modules/notifications/migrations/0004_notifications_deliveries.down.sql +1 -0
- package/modules/notifications/migrations/0004_notifications_deliveries.up.sql +35 -0
- package/modules/notifications/migrations/0005_notifications_delivery_routing_role.down.sql +2 -0
- package/modules/notifications/migrations/0005_notifications_delivery_routing_role.up.sql +17 -0
- package/modules/notifications/migrations/0006_notifications_delivery_title.down.sql +1 -0
- package/modules/notifications/migrations/0006_notifications_delivery_title.up.sql +11 -0
- package/modules/notifications/migrations/0007_notifications_secret_rotation_inventory.down.sql +2 -0
- package/modules/notifications/migrations/0007_notifications_secret_rotation_inventory.up.sql +19 -0
- package/modules/notifications/migrations/0008_notifications_delivery_claim.down.sql +8 -0
- package/modules/notifications/migrations/0008_notifications_delivery_claim.up.sql +19 -0
- package/modules/notifications/migrations/0009_notifications_kind_approvals.down.sql +16 -0
- package/modules/notifications/migrations/0009_notifications_kind_approvals.up.sql +18 -0
- package/modules/notifications/migrations/0010_notifications_kind_meter_threshold.down.sql +16 -0
- package/modules/notifications/migrations/0010_notifications_kind_meter_threshold.up.sql +18 -0
- package/modules/notifications/migrations/0011_notifications_retention_keyset.down.sql +5 -0
- package/modules/notifications/migrations/0011_notifications_retention_keyset.up.sql +15 -0
- package/modules/notifications/migrations/0012_notifications_email_channel.down.sql +12 -0
- package/modules/notifications/migrations/0012_notifications_email_channel.up.sql +38 -0
- package/modules/notifications/migrations/0013_notifications_list_pages.down.sql +5 -0
- package/modules/notifications/migrations/0013_notifications_list_pages.up.sql +13 -0
- package/modules/notifications/migrations/README.md +3 -0
- package/modules/notifications/module.json +32 -0
- package/modules/notifications/package.json +49 -0
- package/modules/notifications/spec/module.yaml +718 -0
- package/modules/notifications/src/acl/permissions.ts +11 -0
- package/modules/notifications/src/api/endpoints.ts +814 -0
- package/modules/notifications/src/cli/commands.json +17 -0
- package/modules/notifications/src/cli/index.ts +126 -0
- package/modules/notifications/src/client/DeliveriesView.tsrx +483 -0
- package/modules/notifications/src/client/FactList.tsrx +24 -0
- package/modules/notifications/src/client/NotificationPreferencesView.tsrx +240 -0
- package/modules/notifications/src/client/NotificationsInboxView.tsrx +592 -0
- package/modules/notifications/src/client/UnreadCountWidget.tsrx +62 -0
- package/modules/notifications/src/client/WebhookForm.tsrx +297 -0
- package/modules/notifications/src/client/WebhooksView.tsrx +637 -0
- package/modules/notifications/src/client/api.ts +382 -0
- package/modules/notifications/src/client/contribution.tsrx +83 -0
- package/modules/notifications/src/client/inbox.ts +41 -0
- package/modules/notifications/src/client/index.ts +29 -0
- package/modules/notifications/src/client/navigation.ts +92 -0
- package/modules/notifications/src/client/notifications.css +70 -0
- package/modules/notifications/src/client/presentation.ts +81 -0
- package/modules/notifications/src/client/state.ts +246 -0
- package/modules/notifications/src/client/unread-count.ts +26 -0
- package/modules/notifications/src/domain/locale.ts +47 -0
- package/modules/notifications/src/domain/publish.ts +46 -0
- package/modules/notifications/src/domain/types.ts +186 -0
- package/modules/notifications/src/index.ts +62 -0
- package/modules/notifications/src/platform.ts +85 -0
- package/modules/notifications/src/server/index.ts +82 -0
- package/modules/notifications/src/server/runtime.ts +251 -0
- package/modules/notifications/src/services/data-classes.ts +139 -0
- package/modules/notifications/src/services/database-repository.ts +1334 -0
- package/modules/notifications/src/services/delivery-payload.ts +93 -0
- package/modules/notifications/src/services/delivery-runner.ts +170 -0
- package/modules/notifications/src/services/delivery-service.ts +811 -0
- package/modules/notifications/src/services/egress.ts +239 -0
- package/modules/notifications/src/services/email-channel.ts +93 -0
- package/modules/notifications/src/services/index.ts +23 -0
- package/modules/notifications/src/services/migration.ts +572 -0
- package/modules/notifications/src/services/notifications-service.ts +297 -0
- package/modules/notifications/src/services/paging.ts +60 -0
- package/modules/notifications/src/services/publish-service.ts +133 -0
- package/modules/notifications/src/services/repository.ts +342 -0
- package/modules/notifications/src/services/secret-rotation.ts +177 -0
- package/modules/notifications/src/services/secret-vault.ts +168 -0
- package/modules/notifications/src/services/service-error.ts +67 -0
- package/modules/notifications/src/services/signature.ts +81 -0
- package/modules/notifications/src/services/webhook-service.ts +307 -0
- package/modules/notifications/src/settings.ts +130 -0
- package/modules/notifications/translations/en.json +255 -0
- package/modules/notifications/translations/pl.json +255 -0
- package/modules/profile/module.json +3 -3
- package/modules/profile/package.json +1 -1
- package/modules/profile/spec/module.yaml +3 -3
- package/modules/profile/src/services/database-repository.ts +3 -13
- package/modules/reports/module.json +28 -0
- package/modules/reports/package.json +42 -0
- package/modules/reports/spec/module.yaml +231 -0
- package/modules/reports/src/acl/permissions.ts +5 -0
- package/modules/reports/src/api/endpoints.ts +72 -0
- package/modules/reports/src/client/ReportsSummaryWidget.tsrx +52 -0
- package/modules/reports/src/client/ReportsView.tsrx +246 -0
- package/modules/reports/src/client/api.ts +65 -0
- package/modules/reports/src/client/contribution.tsrx +36 -0
- package/modules/reports/src/client/index.ts +18 -0
- package/modules/reports/src/client/navigation.ts +39 -0
- package/modules/reports/src/client/presentation.ts +123 -0
- package/modules/reports/src/client/state.ts +28 -0
- package/modules/reports/src/domain/providers.ts +115 -0
- package/modules/reports/src/domain/types.ts +44 -0
- package/modules/reports/src/index.ts +47 -0
- package/modules/reports/src/platform.ts +37 -0
- package/modules/reports/src/server/index.ts +21 -0
- package/modules/reports/src/server/runtime.ts +40 -0
- package/modules/reports/src/services/index.ts +17 -0
- package/modules/reports/src/services/provider-registry.ts +144 -0
- package/modules/reports/src/services/range.ts +65 -0
- package/modules/reports/src/services/reports-service.ts +316 -0
- package/modules/reports/src/services/service-error.ts +26 -0
- package/modules/reports/src/settings.ts +49 -0
- package/modules/reports/translations/en.json +35 -0
- package/modules/reports/translations/pl.json +35 -0
- package/modules/sandbox/module.json +4 -4
- package/modules/sandbox/package.json +1 -1
- package/modules/sandbox/spec/module.yaml +3 -3
- package/modules/sandbox/src/services/database-repository.ts +14 -23
- package/modules/sandbox/src/services/directory.ts +16 -0
- package/modules/sandbox/src/services/sandbox-service.ts +13 -11
- package/modules/search/migrations/0001_search_core.down.sql +1 -0
- package/modules/search/migrations/0001_search_core.up.sql +22 -0
- package/modules/search/migrations/0002_search_recent_export.down.sql +3 -0
- package/modules/search/migrations/0002_search_recent_export.up.sql +5 -0
- package/modules/search/migrations/README.md +3 -0
- package/modules/search/module.json +28 -0
- package/modules/search/package.json +43 -0
- package/modules/search/spec/module.yaml +177 -0
- package/modules/search/src/acl/permissions.ts +5 -0
- package/modules/search/src/api/endpoints.ts +221 -0
- package/modules/search/src/client/SearchView.tsrx +346 -0
- package/modules/search/src/client/api.ts +157 -0
- package/modules/search/src/client/contribution.tsrx +31 -0
- package/modules/search/src/client/index.ts +17 -0
- package/modules/search/src/client/navigation.ts +97 -0
- package/modules/search/src/client/search.css +56 -0
- package/modules/search/src/client/state.ts +113 -0
- package/modules/search/src/domain/data-classes.ts +73 -0
- package/modules/search/src/domain/providers.ts +88 -0
- package/modules/search/src/domain/types.ts +56 -0
- package/modules/search/src/index.ts +46 -0
- package/modules/search/src/platform.ts +42 -0
- package/modules/search/src/server/index.ts +25 -0
- package/modules/search/src/server/runtime.ts +123 -0
- package/modules/search/src/services/database-repository.ts +163 -0
- package/modules/search/src/services/index.ts +21 -0
- package/modules/search/src/services/migration.ts +65 -0
- package/modules/search/src/services/provider-registry.ts +137 -0
- package/modules/search/src/services/repository.ts +43 -0
- package/modules/search/src/services/search-service.ts +442 -0
- package/modules/search/src/services/service-error.ts +35 -0
- package/modules/search/src/settings.ts +68 -0
- package/modules/search/translations/en.json +45 -0
- package/modules/search/translations/pl.json +45 -0
- package/modules/system/module.json +2 -2
- package/modules/system/package.json +1 -1
- package/modules/system/spec/module.yaml +30 -3
- package/modules/system/src/client/FlagsPanel.tsrx +127 -0
- package/modules/system/src/client/ModuleSettingRow.tsrx +17 -7
- package/modules/system/src/client/ModuleSettingsSection.tsrx +10 -71
- package/modules/system/src/client/ModulesView.tsrx +91 -65
- package/modules/system/src/client/flags.ts +35 -0
- package/modules/system/src/client/index.ts +8 -0
- package/modules/system/src/client/navigation.ts +8 -0
- package/modules/system/src/client/settings-state.ts +159 -0
- package/modules/system/src/client/state.ts +2 -0
- package/modules/system/src/domain/time-zone.ts +105 -0
- package/modules/system/src/index.ts +12 -0
- package/modules/system/src/platform.ts +5 -1
- package/modules/system/src/server/endpoints.ts +72 -21
- package/modules/system/src/settings.ts +28 -0
- package/modules/system/translations/en.json +17 -0
- package/modules/system/translations/pl.json +17 -0
- package/modules/users/module.json +30 -4
- package/modules/users/package.json +4 -1
- package/modules/users/spec/module.yaml +290 -7
- package/modules/users/src/api/endpoints.ts +228 -15
- package/modules/users/src/client/InviteMemberForm.tsrx +2 -2
- package/modules/users/src/client/MemberDrawer.tsrx +142 -26
- package/modules/users/src/client/UserAccountForm.tsrx +2 -2
- package/modules/users/src/client/UsersView.tsrx +432 -71
- package/modules/users/src/client/api.ts +106 -12
- package/modules/users/src/client/contribution.tsrx +5 -0
- package/modules/users/src/client/member-columns.tsrx +22 -9
- package/modules/users/src/client/state.ts +172 -7
- package/modules/users/src/domain/lists.ts +9 -0
- package/modules/users/src/index.ts +11 -0
- package/modules/users/src/platform.ts +50 -1
- package/modules/users/src/services/member-export.ts +51 -0
- package/modules/users/src/services/member-import.ts +249 -0
- package/modules/users/src/services/member-search.ts +145 -0
- package/modules/users/src/services/users-service.ts +117 -4
- package/modules/users/translations/en.json +57 -8
- package/modules/users/translations/pl.json +57 -8
- package/modules/workflows/migrations/0004_payload_rotation_inventory.up.sql +17 -0
- package/modules/workflows/migrations/0005_workflows_human_approval.up.sql +28 -0
- package/modules/workflows/migrations/0006_workflows_retention_indexes.up.sql +11 -0
- package/modules/workflows/migrations/0007_workflows_erasure_subject_indexes.up.sql +17 -0
- package/modules/workflows/migrations/0008_workflows_subject_account.up.sql +24 -0
- package/modules/workflows/migrations/0009_workflows_definition_list_indexes.up.sql +9 -0
- package/modules/workflows/module.json +34 -6
- package/modules/workflows/package.json +2 -1
- package/modules/workflows/spec/module.yaml +26 -9
- package/modules/workflows/src/api/endpoints.ts +131 -25
- package/modules/workflows/src/cli/commands.json +17 -0
- package/modules/workflows/src/cli/index.ts +114 -0
- package/modules/workflows/src/client/WorkflowExecutionHistory.tsrx +36 -27
- package/modules/workflows/src/client/WorkflowInspector.tsrx +116 -0
- package/modules/workflows/src/client/WorkflowNodePalette.tsrx +1 -0
- package/modules/workflows/src/client/WorkflowsView.tsrx +236 -99
- package/modules/workflows/src/client/api.ts +54 -34
- package/modules/workflows/src/client/canvas-model.ts +12 -0
- package/modules/workflows/src/client/state.ts +95 -0
- package/modules/workflows/src/domain/events.ts +25 -11
- package/modules/workflows/src/domain/graph.ts +135 -1
- package/modules/workflows/src/domain/types.ts +91 -4
- package/modules/workflows/src/platform.ts +12 -0
- package/modules/workflows/src/server/runtime.ts +78 -5
- package/modules/workflows/src/services/approvals.ts +62 -0
- package/modules/workflows/src/services/cursors.ts +37 -0
- package/modules/workflows/src/services/data-classes.ts +232 -0
- package/modules/workflows/src/services/database-repository.ts +660 -171
- package/modules/workflows/src/services/migration.ts +240 -0
- package/modules/workflows/src/services/notifications.ts +98 -0
- package/modules/workflows/src/services/payload-codec.ts +51 -28
- package/modules/workflows/src/services/payload-rotation.ts +171 -0
- package/modules/workflows/src/services/repository.ts +123 -8
- package/modules/workflows/src/services/simulation.ts +7 -0
- package/modules/workflows/src/services/worker.ts +446 -25
- package/modules/workflows/src/services/workflows-service.ts +264 -103
- package/modules/workflows/translations/en.json +12 -4
- package/modules/workflows/translations/pl.json +12 -4
- package/modules.json +48 -4
- package/package.json +64 -6
- package/packages/client/package.json +1 -0
- package/packages/client/src/ApplicationShell.tsrx +43 -0
- package/packages/client/src/contributions.ts +55 -0
- package/packages/client/src/i18n/locales/en.json +5 -0
- package/packages/client/src/i18n/locales/pl.json +5 -0
- package/packages/client/src/index.ts +13 -1
- package/packages/client/src/routing.ts +22 -0
- package/packages/client/src/shell/CommandPalette.tsrx +223 -11
- package/packages/client/src/shell/command-search.ts +126 -0
- package/packages/client/src/shell/command.ts +30 -0
- package/packages/client/src/shell/navigation.ts +12 -0
- package/packages/client/src/shell/palette-keys.ts +27 -0
- package/packages/client/src/shell/shell.css +7 -0
- package/packages/contracts/schemas/module-spec.schema.json +287 -1
- package/packages/contracts/schemas/module.schema.json +25 -0
- package/packages/contracts/src/index.ts +144 -1
- package/packages/database/src/backup.ts +180 -0
- package/packages/database/src/decoders.ts +25 -0
- package/packages/database/src/index.ts +17 -0
- package/packages/database/src/migrations.ts +7 -0
- package/packages/database/src/record-history.ts +5 -14
- package/packages/harness/src/index.ts +2 -0
- package/packages/harness/src/runtime.ts +378 -2
- package/packages/harness/src/tool-adapters.ts +20 -9
- package/packages/kernel/src/acl.ts +179 -0
- package/packages/kernel/src/approval-grant.ts +310 -0
- package/packages/kernel/src/capability-registry.ts +69 -2
- package/packages/kernel/src/data-class-registry.ts +354 -0
- package/packages/kernel/src/index.ts +85 -4
- package/packages/kernel/src/keyring.ts +208 -0
- package/packages/kernel/src/module-compatibility.ts +35 -4
- package/packages/kernel/src/module-registry.ts +49 -2
- package/packages/kernel/src/module-settings.ts +189 -27
- package/packages/server/package.json +2 -1
- package/packages/server/src/composition.ts +38 -0
- package/packages/server/src/endpoint.ts +104 -47
- package/packages/server/src/export/csv.ts +34 -0
- package/packages/server/src/export/definition.ts +346 -0
- package/packages/server/src/export/index.ts +61 -0
- package/packages/server/src/export/run.ts +116 -0
- package/packages/server/src/index.ts +155 -0
- package/packages/server/src/jobs/index.ts +93 -0
- package/packages/server/src/jobs/runner.ts +486 -0
- package/packages/server/src/log.ts +291 -0
- package/packages/server/src/mail/config.ts +184 -0
- package/packages/server/src/mail/contracts.ts +251 -0
- package/packages/server/src/mail/index.ts +31 -0
- package/packages/server/src/mail/port.ts +101 -0
- package/packages/server/src/mail/smtp.ts +191 -0
- package/packages/server/src/mail/template.ts +105 -0
- package/packages/server/src/metrics.ts +447 -0
- package/packages/server/src/pagination.ts +246 -0
- package/packages/server/src/trace/context.ts +103 -0
- package/packages/server/src/trace/egress.ts +66 -0
- package/packages/server/src/trace/error-sink.ts +296 -0
- package/packages/server/src/trace/exporter.ts +295 -0
- package/packages/server/src/trace/index.ts +60 -0
- package/packages/server/src/trace/job-sink.ts +172 -0
- package/packages/server/src/trace/tracer.ts +338 -0
- package/packages/server/src/web.ts +5 -1
- package/packages/storage/package.json +40 -0
- package/packages/storage/src/config.ts +189 -0
- package/packages/storage/src/content-type.ts +124 -0
- package/packages/storage/src/contracts.ts +112 -0
- package/packages/storage/src/envelope.ts +238 -0
- package/packages/storage/src/index.ts +49 -0
- package/packages/storage/src/local.ts +75 -0
- package/packages/storage/src/port.ts +262 -0
- package/packages/storage/src/read-token.ts +130 -0
- package/packages/storage/src/reseal.ts +128 -0
- package/packages/storage/src/s3.ts +144 -0
- package/packages/storage/src/scanner.ts +22 -0
- package/packages/storage/src/sigv4.ts +104 -0
- package/packages/storage/src/store.ts +13 -0
- package/packages/ui/package.json +1 -0
- package/packages/ui/src/components/Button.tsrx +3 -0
- package/packages/ui/src/components/ConfirmDialog.tsrx +13 -2
- package/packages/ui/src/components/DateField.tsrx +92 -0
- package/packages/ui/src/components/DatePicker.tsrx +525 -0
- package/packages/ui/src/components/DateRangeField.tsrx +93 -0
- package/packages/ui/src/components/Drawer.tsrx +10 -1
- package/packages/ui/src/components/FileUpload.tsrx +158 -0
- package/packages/ui/src/components/Pagination.tsrx +130 -0
- package/packages/ui/src/components/Select.tsrx +78 -0
- package/packages/ui/src/components/Table.tsrx +498 -81
- package/packages/ui/src/components/Tabs.tsrx +53 -0
- package/packages/ui/src/components/ToastHost.tsrx +48 -0
- package/packages/ui/src/components/calendar.ts +243 -0
- package/packages/ui/src/components/date-field.ts +62 -0
- package/packages/ui/src/components/file-upload.ts +49 -0
- package/packages/ui/src/components/focus-trap.ts +62 -0
- package/packages/ui/src/components/pagination.ts +68 -0
- package/packages/ui/src/components/table-sorting.ts +49 -0
- package/packages/ui/src/components/tabs.ts +61 -0
- package/packages/ui/src/components/toast-store.ts +116 -0
- package/packages/ui/src/icons/Icon.tsrx +5 -0
- package/packages/ui/src/index.ts +45 -0
- package/packages/ui/src/styles/components.css +598 -0
- package/modules/automations-workflows-integration/module.json +0 -27
- package/modules/automations-workflows-integration/spec/module.yaml +0 -93
- package/modules/automations-workflows-integration/src/index.ts +0 -14
- package/modules/automations-workflows-integration/src/platform.ts +0 -24
- package/modules/automations-workflows-integration/src/server/index.ts +0 -11
- package/modules/automations-workflows-integration/translations/en.json +0 -21
- package/modules/automations-workflows-integration/translations/pl.json +0 -21
- package/modules/workflows/src/services/cursor-codec.ts +0 -62
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { activeTabId, nextTabId, type TabItem } from './tabs.ts';
|
|
2
|
+
|
|
3
|
+
export interface TabsProps {
|
|
4
|
+
/** Required: tabs render as `<id>-tab-<item.id>` and point at the caller's `<id>-panel-<item.id>`. */
|
|
5
|
+
readonly id: string;
|
|
6
|
+
readonly items: readonly TabItem[];
|
|
7
|
+
readonly active: string;
|
|
8
|
+
readonly onChange: (id: string) => void;
|
|
9
|
+
/** Accessible name of the tablist. */
|
|
10
|
+
readonly label: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* The accessible tablist. Arrow keys move between tabs and Home and End jump
|
|
15
|
+
* to the ends, skipping disabled tabs; only the active tab is in the tab
|
|
16
|
+
* order, so Tab moves out of the list into the panel. An `active` that names no
|
|
17
|
+
* enabled tab selects the first enabled one instead, so the list never falls
|
|
18
|
+
* out of the tab order. The caller renders the panel, which keeps the tabs free
|
|
19
|
+
* of any assumption about the content.
|
|
20
|
+
*/
|
|
21
|
+
export function Tabs(props: TabsProps) @{
|
|
22
|
+
const selected = activeTabId(props.items, props.active);
|
|
23
|
+
const onKeyDown = (event: KeyboardEvent) => {
|
|
24
|
+
const next = nextTabId(props.items, selected, event.key);
|
|
25
|
+
if (next === '' || next === selected) return;
|
|
26
|
+
event.preventDefault();
|
|
27
|
+
props.onChange(next);
|
|
28
|
+
/* The tab already exists; only its tabindex changes on the next render,
|
|
29
|
+
so focus can move to it now and roving focus stays with the reader. */
|
|
30
|
+
document.getElementById(props.id + '-tab-' + next)?.focus();
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
<div
|
|
34
|
+
class="ui-tabs"
|
|
35
|
+
role="tablist"
|
|
36
|
+
aria-label={props.label}
|
|
37
|
+
onKeyDown={onKeyDown}
|
|
38
|
+
>
|
|
39
|
+
@for (const item of props.items; key item.id) {
|
|
40
|
+
<button
|
|
41
|
+
class={['ui-tabs__tab', item.id === selected && 'ui-tabs__tab--on']}
|
|
42
|
+
type="button"
|
|
43
|
+
role="tab"
|
|
44
|
+
id={props.id + '-tab-' + item.id}
|
|
45
|
+
aria-controls={props.id + '-panel-' + item.id}
|
|
46
|
+
aria-selected={item.id === selected}
|
|
47
|
+
tabindex={item.id === selected ? 0 : -1}
|
|
48
|
+
disabled={item.disabled ?? false}
|
|
49
|
+
onClick={() => props.onChange(item.id)}
|
|
50
|
+
>{item.label}</button>
|
|
51
|
+
}
|
|
52
|
+
</div>
|
|
53
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { useSyncExternalStore } from 'octane';
|
|
2
|
+
import { Icon } from '../icons/Icon.tsrx';
|
|
3
|
+
import { toasts, type ToastStore, type ToastTone } from './toast-store.ts';
|
|
4
|
+
|
|
5
|
+
export interface ToastHostProps {
|
|
6
|
+
/** Accessible name of the live region, e.g. 'Notifications'. */
|
|
7
|
+
readonly label: string;
|
|
8
|
+
readonly closeLabel: string;
|
|
9
|
+
/** Defaults to the shared queue; pass one to scope a surface or a test. */
|
|
10
|
+
readonly store?: ToastStore | undefined;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const TONE_ICONS: Readonly<Record<ToastTone, string>> = {
|
|
14
|
+
success: 'check',
|
|
15
|
+
error: 'alert',
|
|
16
|
+
info: 'info',
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Renders the toast queue. One host per screen that raises toasts; the region
|
|
21
|
+
* stays in the DOM while it is empty, because a live region added together
|
|
22
|
+
* with its first message is not announced.
|
|
23
|
+
*/
|
|
24
|
+
export function ToastHost(props: ToastHostProps) @{
|
|
25
|
+
const store = props.store ?? toasts;
|
|
26
|
+
const items = useSyncExternalStore(store.subscribe, store.list, store.list);
|
|
27
|
+
<div
|
|
28
|
+
class="ui-toasts"
|
|
29
|
+
role="region"
|
|
30
|
+
aria-label={props.label}
|
|
31
|
+
aria-live="polite"
|
|
32
|
+
>
|
|
33
|
+
@for (const toast of items; key toast.id) {
|
|
34
|
+
<div class={['ui-toast', 'ui-toast--' + toast.tone]}>
|
|
35
|
+
<Icon name={TONE_ICONS[toast.tone]} size={16} />
|
|
36
|
+
<span class="ui-toast__message">{toast.message}</span>
|
|
37
|
+
<button
|
|
38
|
+
class="ui-toast__close"
|
|
39
|
+
type="button"
|
|
40
|
+
aria-label={props.closeLabel}
|
|
41
|
+
onClick={() => store.dismiss(toast.id)}
|
|
42
|
+
>
|
|
43
|
+
<Icon name="x" size={14} />
|
|
44
|
+
</button>
|
|
45
|
+
</div>
|
|
46
|
+
}
|
|
47
|
+
</div>
|
|
48
|
+
}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/** The four windows every list screen offers, named once so they agree. */
|
|
2
|
+
export type DatePresetId =
|
|
3
|
+
| 'today'
|
|
4
|
+
| 'last-7-days'
|
|
5
|
+
| 'last-30-days'
|
|
6
|
+
| 'this-month';
|
|
7
|
+
|
|
8
|
+
export const DATE_PRESET_IDS: readonly DatePresetId[] = [
|
|
9
|
+
'today',
|
|
10
|
+
'last-7-days',
|
|
11
|
+
'last-30-days',
|
|
12
|
+
'this-month',
|
|
13
|
+
];
|
|
14
|
+
|
|
15
|
+
/** One day of a rendered month. */
|
|
16
|
+
export interface CalendarDay {
|
|
17
|
+
/** 'YYYY-MM-DD'. */
|
|
18
|
+
readonly iso: string;
|
|
19
|
+
readonly dayOfMonth: number;
|
|
20
|
+
/** False for the leading and trailing days of the neighbouring months. */
|
|
21
|
+
readonly inMonth: boolean;
|
|
22
|
+
/** Outside `min` or `max`: rendered, never selectable. */
|
|
23
|
+
readonly disabled: boolean;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface CalendarWeek {
|
|
27
|
+
readonly key: string;
|
|
28
|
+
readonly days: readonly CalendarDay[];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface CalendarBounds {
|
|
32
|
+
readonly min?: string | undefined;
|
|
33
|
+
readonly max?: string | undefined;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const DAY_PATTERN = /^(\d{4})-(\d{2})-(\d{2})/;
|
|
37
|
+
const DAY_MS = 86_400_000;
|
|
38
|
+
|
|
39
|
+
function pad(value: number): string {
|
|
40
|
+
return value < 10 ? '0' + value : String(value);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* The calendar day inside a date or datetime value, or '' when there is none.
|
|
45
|
+
* A datetime keeps its time elsewhere: the grid only ever answers about days.
|
|
46
|
+
*/
|
|
47
|
+
export function isoDay(value: string): string {
|
|
48
|
+
const parts = DAY_PATTERN.exec(value);
|
|
49
|
+
if (!parts) return '';
|
|
50
|
+
return `${parts[1]}-${parts[2]}-${parts[3]}`;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/* Days are counted at UTC midnight so arithmetic never crosses a daylight
|
|
54
|
+
saving boundary: a calendar day is not an instant, and `new Date(iso)` would
|
|
55
|
+
make it one. */
|
|
56
|
+
function toDayNumber(iso: string): number | null {
|
|
57
|
+
const parts = DAY_PATTERN.exec(iso);
|
|
58
|
+
if (!parts) return null;
|
|
59
|
+
const year = Number(parts[1]);
|
|
60
|
+
const month = Number(parts[2]);
|
|
61
|
+
const day = Number(parts[3]);
|
|
62
|
+
const stamp = Date.UTC(year, month - 1, day);
|
|
63
|
+
const date = new Date(stamp);
|
|
64
|
+
if (date.getUTCMonth() !== month - 1 || date.getUTCDate() !== day)
|
|
65
|
+
return null;
|
|
66
|
+
return stamp;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function fromDayNumber(stamp: number): string {
|
|
70
|
+
const date = new Date(stamp);
|
|
71
|
+
return (
|
|
72
|
+
`${date.getUTCFullYear()}-${pad(date.getUTCMonth() + 1)}-` +
|
|
73
|
+
pad(date.getUTCDate())
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** The reader's own today, which is a calendar day and not an instant. */
|
|
78
|
+
export function todayIso(now: number = Date.now()): string {
|
|
79
|
+
const date = new Date(now);
|
|
80
|
+
return (
|
|
81
|
+
`${date.getFullYear()}-${pad(date.getMonth() + 1)}-` + pad(date.getDate())
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** `iso` moved by whole days, or '' when `iso` is not a calendar day. */
|
|
86
|
+
export function addDays(iso: string, days: number): string {
|
|
87
|
+
const stamp = toDayNumber(iso);
|
|
88
|
+
if (stamp === null) return '';
|
|
89
|
+
return fromDayNumber(stamp + days * DAY_MS);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* `iso` moved by whole months, keeping the day of the month where it exists:
|
|
94
|
+
* 31 January back one month is 28 or 29 February, never 2 or 3 March.
|
|
95
|
+
*/
|
|
96
|
+
export function addMonths(iso: string, months: number): string {
|
|
97
|
+
const stamp = toDayNumber(iso);
|
|
98
|
+
if (stamp === null) return '';
|
|
99
|
+
const date = new Date(stamp);
|
|
100
|
+
const target = date.getUTCMonth() + months;
|
|
101
|
+
const year = date.getUTCFullYear() + Math.floor(target / 12);
|
|
102
|
+
const month = ((target % 12) + 12) % 12;
|
|
103
|
+
const lastDay = new Date(Date.UTC(year, month + 1, 0)).getUTCDate();
|
|
104
|
+
return `${year}-${pad(month + 1)}-${pad(Math.min(date.getUTCDate(), lastDay))}`;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export function startOfMonth(iso: string): string {
|
|
108
|
+
const day = isoDay(iso);
|
|
109
|
+
return day === '' ? '' : day.slice(0, 8) + '01';
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** `iso` held inside the bounds. Either bound may be absent or unparseable. */
|
|
113
|
+
export function clampIsoDay(iso: string, bounds: CalendarBounds = {}): string {
|
|
114
|
+
const day = isoDay(iso);
|
|
115
|
+
if (day === '') return '';
|
|
116
|
+
const min = isoDay(bounds.min ?? '');
|
|
117
|
+
const max = isoDay(bounds.max ?? '');
|
|
118
|
+
if (min !== '' && day < min) return min;
|
|
119
|
+
if (max !== '' && day > max) return max;
|
|
120
|
+
return day;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export function isOutsideBounds(iso: string, bounds: CalendarBounds): boolean {
|
|
124
|
+
const min = isoDay(bounds.min ?? '');
|
|
125
|
+
const max = isoDay(bounds.max ?? '');
|
|
126
|
+
return (min !== '' && iso < min) || (max !== '' && iso > max);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* The first weekday of the reader's week, 0 for Sunday. Engines without
|
|
131
|
+
* `weekInfo` answer Monday, which is the platform's default reading order.
|
|
132
|
+
*/
|
|
133
|
+
export function firstWeekday(locale?: string | undefined): number {
|
|
134
|
+
try {
|
|
135
|
+
const info = new Intl.Locale(
|
|
136
|
+
locale ?? new Intl.DateTimeFormat().resolvedOptions().locale,
|
|
137
|
+
) as Intl.Locale & {
|
|
138
|
+
getWeekInfo?: () => { firstDay: number };
|
|
139
|
+
weekInfo?: { firstDay: number };
|
|
140
|
+
};
|
|
141
|
+
const first = info.getWeekInfo?.().firstDay ?? info.weekInfo?.firstDay;
|
|
142
|
+
if (typeof first === 'number') return first % 7;
|
|
143
|
+
} catch {
|
|
144
|
+
/* An unparseable tag is the caller's, not the grid's, problem: the week
|
|
145
|
+
still has to start somewhere. */
|
|
146
|
+
}
|
|
147
|
+
return 1;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/** Position of `iso` inside its week, 0 for the first column rendered. */
|
|
151
|
+
export function weekdayIndex(iso: string, weekStart: number): number {
|
|
152
|
+
const stamp = toDayNumber(iso);
|
|
153
|
+
if (stamp === null) return 0;
|
|
154
|
+
return (new Date(stamp).getUTCDay() - weekStart + 7) % 7;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Six weeks of `month`, always, so the popover keeps one height and changing
|
|
159
|
+
* months never moves the controls under the reader's pointer. 42 cells is the
|
|
160
|
+
* whole cost of a month change.
|
|
161
|
+
*/
|
|
162
|
+
export function monthWeeks(
|
|
163
|
+
month: string,
|
|
164
|
+
weekStart: number,
|
|
165
|
+
bounds: CalendarBounds = {},
|
|
166
|
+
): readonly CalendarWeek[] {
|
|
167
|
+
const first = toDayNumber(startOfMonth(month));
|
|
168
|
+
if (first === null) return [];
|
|
169
|
+
const monthKey = fromDayNumber(first).slice(0, 7);
|
|
170
|
+
const lead = (new Date(first).getUTCDay() - weekStart + 7) % 7;
|
|
171
|
+
const weeks: CalendarWeek[] = [];
|
|
172
|
+
for (let week = 0; week < 6; week += 1) {
|
|
173
|
+
const days: CalendarDay[] = [];
|
|
174
|
+
for (let index = 0; index < 7; index += 1) {
|
|
175
|
+
const iso = fromDayNumber(first + (week * 7 + index - lead) * DAY_MS);
|
|
176
|
+
days.push({
|
|
177
|
+
iso,
|
|
178
|
+
dayOfMonth: Number(iso.slice(8)),
|
|
179
|
+
inMonth: iso.slice(0, 7) === monthKey,
|
|
180
|
+
disabled: isOutsideBounds(iso, bounds),
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
weeks.push({ key: days[0]?.iso ?? String(week), days });
|
|
184
|
+
}
|
|
185
|
+
return weeks;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/** The month heading, e.g. 'September 2026'. */
|
|
189
|
+
export function monthLabel(month: string, locale?: string | undefined): string {
|
|
190
|
+
const stamp = toDayNumber(startOfMonth(month));
|
|
191
|
+
if (stamp === null) return '';
|
|
192
|
+
return new Intl.DateTimeFormat(locale, {
|
|
193
|
+
month: 'long',
|
|
194
|
+
year: 'numeric',
|
|
195
|
+
timeZone: 'UTC',
|
|
196
|
+
}).format(stamp);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/** Column headings from the same week the grid renders, shortest form. */
|
|
200
|
+
export function weekdayLabels(
|
|
201
|
+
weekStart: number,
|
|
202
|
+
locale?: string | undefined,
|
|
203
|
+
): readonly string[] {
|
|
204
|
+
const format = new Intl.DateTimeFormat(locale, {
|
|
205
|
+
weekday: 'short',
|
|
206
|
+
timeZone: 'UTC',
|
|
207
|
+
});
|
|
208
|
+
/* 4 January 1970 was a Sunday, so the offset is the weekday itself. */
|
|
209
|
+
const sunday = Date.UTC(1970, 0, 4);
|
|
210
|
+
return Array.from({ length: 7 }, (_unused, index) =>
|
|
211
|
+
format.format(sunday + ((weekStart + index) % 7) * DAY_MS),
|
|
212
|
+
);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/** The day a full reading names, e.g. 'Monday, 14 September 2026'. */
|
|
216
|
+
export function dayLabel(iso: string, locale?: string | undefined): string {
|
|
217
|
+
const stamp = toDayNumber(iso);
|
|
218
|
+
if (stamp === null) return '';
|
|
219
|
+
return new Intl.DateTimeFormat(locale, {
|
|
220
|
+
weekday: 'long',
|
|
221
|
+
day: 'numeric',
|
|
222
|
+
month: 'long',
|
|
223
|
+
year: 'numeric',
|
|
224
|
+
timeZone: 'UTC',
|
|
225
|
+
}).format(stamp);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* The window a preset selects, both ends inclusive. 'this-month' is the month
|
|
230
|
+
* so far: a range that ends in the future selects records that do not exist,
|
|
231
|
+
* which reads as an empty list rather than as a filter.
|
|
232
|
+
*/
|
|
233
|
+
export function datePresetRange(
|
|
234
|
+
id: DatePresetId,
|
|
235
|
+
today: string = todayIso(),
|
|
236
|
+
): { readonly from: string; readonly to: string } {
|
|
237
|
+
const day = isoDay(today);
|
|
238
|
+
if (day === '') return { from: '', to: '' };
|
|
239
|
+
if (id === 'today') return { from: day, to: day };
|
|
240
|
+
if (id === 'last-7-days') return { from: addDays(day, -6), to: day };
|
|
241
|
+
if (id === 'last-30-days') return { from: addDays(day, -29), to: day };
|
|
242
|
+
return { from: startOfMonth(day), to: day };
|
|
243
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/** 'date' renders a native date input, 'datetime' a datetime-local one. */
|
|
2
|
+
export type DateFieldKind = 'date' | 'datetime';
|
|
3
|
+
|
|
4
|
+
const ISO_PATTERN =
|
|
5
|
+
/^(\d{4})-(\d{2})-(\d{2})(?:T(\d{2}):(\d{2})(?::(\d{2}))?)?$/;
|
|
6
|
+
|
|
7
|
+
export function dateInputType(
|
|
8
|
+
kind: DateFieldKind | undefined,
|
|
9
|
+
): 'date' | 'datetime-local' {
|
|
10
|
+
return kind === 'datetime' ? 'datetime-local' : 'date';
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/* A native date input carries a calendar date, not an instant. Parsing it with
|
|
14
|
+
`new Date(value)` would read it as UTC and shift the day west of Greenwich,
|
|
15
|
+
so the parts are read out and placed in the reader's own day. */
|
|
16
|
+
function parseIsoValue(value: string): Date | null {
|
|
17
|
+
const parts = ISO_PATTERN.exec(value);
|
|
18
|
+
if (!parts) return null;
|
|
19
|
+
const year = Number(parts[1]);
|
|
20
|
+
const month = Number(parts[2]);
|
|
21
|
+
const day = Number(parts[3]);
|
|
22
|
+
const date = new Date(
|
|
23
|
+
year,
|
|
24
|
+
month - 1,
|
|
25
|
+
day,
|
|
26
|
+
Number(parts[4] ?? 0),
|
|
27
|
+
Number(parts[5] ?? 0),
|
|
28
|
+
Number(parts[6] ?? 0),
|
|
29
|
+
);
|
|
30
|
+
date.setFullYear(year);
|
|
31
|
+
if (date.getMonth() !== month - 1 || date.getDate() !== day) return null;
|
|
32
|
+
return date;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* The value of a date field as the reader writes it. Returns '' for an empty
|
|
37
|
+
* or unparseable value, so a screen renders the reading unconditionally.
|
|
38
|
+
*/
|
|
39
|
+
export function formatDateValue(
|
|
40
|
+
value: string,
|
|
41
|
+
kind: DateFieldKind | undefined,
|
|
42
|
+
locale?: string | undefined,
|
|
43
|
+
): string {
|
|
44
|
+
const date = parseIsoValue(value);
|
|
45
|
+
if (!date) return '';
|
|
46
|
+
return new Intl.DateTimeFormat(
|
|
47
|
+
locale,
|
|
48
|
+
kind === 'datetime'
|
|
49
|
+
? { dateStyle: 'medium', timeStyle: 'short' }
|
|
50
|
+
: { dateStyle: 'medium' },
|
|
51
|
+
).format(date);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Whether the end of a range precedes its start. ISO values of one kind order
|
|
56
|
+
* chronologically as text, so the check costs no Date allocation. An
|
|
57
|
+
* incomplete range is never reversed: the reader is still filling it in.
|
|
58
|
+
*/
|
|
59
|
+
export function dateRangeReversed(from: string, to: string): boolean {
|
|
60
|
+
if (from === '' || to === '') return false;
|
|
61
|
+
return to < from;
|
|
62
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/** Why a control refused a file. The words for it belong to the screen. */
|
|
2
|
+
export type FileRefusalReason = 'type' | 'size';
|
|
3
|
+
|
|
4
|
+
/** What a refusal check reads: a `File` satisfies it, and so does a test. */
|
|
5
|
+
export interface FileFacts {
|
|
6
|
+
readonly name: string;
|
|
7
|
+
readonly type: string;
|
|
8
|
+
readonly size: number;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function matchesEntry(file: FileFacts, entry: string): boolean {
|
|
12
|
+
const rule = entry.trim().toLowerCase();
|
|
13
|
+
if (rule === '' || rule === '*/*') return true;
|
|
14
|
+
if (rule.startsWith('.')) return file.name.toLowerCase().endsWith(rule);
|
|
15
|
+
const type = file.type.toLowerCase();
|
|
16
|
+
if (rule.endsWith('/*')) return type.startsWith(rule.slice(0, -1));
|
|
17
|
+
return type === rule;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Whether `accept` covers the file, over the same three forms the HTML
|
|
22
|
+
* attribute takes: an exact content type, a `type/*` family, and a filename
|
|
23
|
+
* suffix. An empty list accepts everything, because a screen that could not
|
|
24
|
+
* read the port's limits must still offer the upload.
|
|
25
|
+
*/
|
|
26
|
+
export function acceptsFile(
|
|
27
|
+
file: FileFacts,
|
|
28
|
+
accept: readonly string[] | undefined,
|
|
29
|
+
): boolean {
|
|
30
|
+
if (accept === undefined || accept.length === 0) return true;
|
|
31
|
+
for (const entry of accept) if (matchesEntry(file, entry)) return true;
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Why this file cannot be uploaded, or null when it can. The port applies the
|
|
37
|
+
* same ceiling to the bytes it receives; checking here spends a comparison
|
|
38
|
+
* instead of the upload. A limit the screen has not read yet is `null` and
|
|
39
|
+
* refuses nothing, so the server stays the authority.
|
|
40
|
+
*/
|
|
41
|
+
export function fileRefusal(
|
|
42
|
+
file: FileFacts,
|
|
43
|
+
accept: readonly string[] | undefined,
|
|
44
|
+
maxBytes: number | null | undefined,
|
|
45
|
+
): FileRefusalReason | null {
|
|
46
|
+
if (!acceptsFile(file, accept)) return 'type';
|
|
47
|
+
if (typeof maxBytes === 'number' && file.size > maxBytes) return 'size';
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/* One selector for every modal surface. `tabindex` is read from the property
|
|
2
|
+
rather than the attribute, so a control that opted out with -1 is skipped
|
|
3
|
+
without a second query. */
|
|
4
|
+
const FOCUSABLE =
|
|
5
|
+
'a[href], area[href], button, input, select, textarea, summary, [tabindex]';
|
|
6
|
+
|
|
7
|
+
function focusable(element: HTMLElement): boolean {
|
|
8
|
+
if (element.hasAttribute('hidden') || element.tabIndex < 0) return false;
|
|
9
|
+
const disabled = (element as { disabled?: boolean }).disabled;
|
|
10
|
+
return disabled !== true;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Everything inside `root` that Tab can reach, in document order. Visibility is
|
|
15
|
+
* not consulted: a modal panel renders only what it shows, and a layout read
|
|
16
|
+
* per keystroke would cost a reflow for an answer the markup already gives.
|
|
17
|
+
*/
|
|
18
|
+
export function focusableElements(root: HTMLElement): readonly HTMLElement[] {
|
|
19
|
+
return [...root.querySelectorAll<HTMLElement>(FOCUSABLE)].filter(focusable);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Holds Tab inside `root` until the returned release is called, which also
|
|
24
|
+
* returns focus to whatever held it when the trap opened. Focus moves into
|
|
25
|
+
* `root` only when nothing inside it is focused already, so a control that
|
|
26
|
+
* carries `autoFocus` keeps it.
|
|
27
|
+
*
|
|
28
|
+
* `root` needs `tabindex="-1"` so the panel itself can hold focus while it has
|
|
29
|
+
* no focusable child.
|
|
30
|
+
*/
|
|
31
|
+
export function trapFocus(root: HTMLElement): () => void {
|
|
32
|
+
const opener = document.activeElement as HTMLElement | null;
|
|
33
|
+
if (!root.contains(document.activeElement))
|
|
34
|
+
(focusableElements(root)[0] ?? root).focus();
|
|
35
|
+
const onKeyDown = (event: KeyboardEvent) => {
|
|
36
|
+
if (event.key !== 'Tab' || event.defaultPrevented) return;
|
|
37
|
+
const stops = focusableElements(root);
|
|
38
|
+
const active = document.activeElement as HTMLElement | null;
|
|
39
|
+
const first = stops[0];
|
|
40
|
+
const last = stops[stops.length - 1];
|
|
41
|
+
if (first === undefined || last === undefined) {
|
|
42
|
+
event.preventDefault();
|
|
43
|
+
root.focus();
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
/* Focus left the panel (a click on the page behind it, a browser chrome
|
|
47
|
+
stop): the next Tab walks back in rather than through the workspace. */
|
|
48
|
+
if (active === null || !root.contains(active)) {
|
|
49
|
+
event.preventDefault();
|
|
50
|
+
(event.shiftKey ? last : first).focus();
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if (event.shiftKey ? active !== first : active !== last) return;
|
|
54
|
+
event.preventDefault();
|
|
55
|
+
(event.shiftKey ? last : first).focus();
|
|
56
|
+
};
|
|
57
|
+
document.addEventListener('keydown', onKeyDown, true);
|
|
58
|
+
return () => {
|
|
59
|
+
document.removeEventListener('keydown', onKeyDown, true);
|
|
60
|
+
if (opener !== null && opener.isConnected) opener.focus();
|
|
61
|
+
};
|
|
62
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/** The page a `Table` renders and a `Pagination` describes. */
|
|
2
|
+
export interface PageRange {
|
|
3
|
+
/** Zero-based page index, clamped into the pages that exist. */
|
|
4
|
+
readonly pageIndex: number;
|
|
5
|
+
/** Number of pages; at least 1, so an empty set still reads "1 of 1". */
|
|
6
|
+
readonly pageCount: number;
|
|
7
|
+
/** One-based position of the first row on the page, 0 when there are none. */
|
|
8
|
+
readonly from: number;
|
|
9
|
+
/** One-based position of the last row on the page, 0 when there are none. */
|
|
10
|
+
readonly to: number;
|
|
11
|
+
readonly totalRows: number;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/** The page a keyset pager describes, over a set nobody counted. */
|
|
15
|
+
export interface KeysetPage {
|
|
16
|
+
/** Zero-based index of the page on screen. */
|
|
17
|
+
readonly pageIndex: number;
|
|
18
|
+
readonly pageSize: number;
|
|
19
|
+
/** One-based position of the first row on the page. */
|
|
20
|
+
readonly from: number;
|
|
21
|
+
/** Whether a page follows this one. */
|
|
22
|
+
readonly hasMore: boolean;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function whole(value: number, minimum: number): number {
|
|
26
|
+
return Number.isFinite(value)
|
|
27
|
+
? Math.max(minimum, Math.trunc(value))
|
|
28
|
+
: minimum;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Page arithmetic shared by `Table` (which slices the rows) and `Pagination`
|
|
33
|
+
* (which labels them), so the two can never disagree about which page is on
|
|
34
|
+
* screen. Out-of-range input is clamped rather than refused: a page index
|
|
35
|
+
* survives a row set that shrinks under it.
|
|
36
|
+
*/
|
|
37
|
+
export function pageRange(
|
|
38
|
+
totalRows: number,
|
|
39
|
+
pageSize: number,
|
|
40
|
+
pageIndex: number,
|
|
41
|
+
): PageRange {
|
|
42
|
+
const rows = whole(totalRows, 0);
|
|
43
|
+
const size = whole(pageSize, 1);
|
|
44
|
+
const pageCount = Math.max(1, Math.ceil(rows / size));
|
|
45
|
+
const index = Math.min(whole(pageIndex, 0), pageCount - 1);
|
|
46
|
+
return {
|
|
47
|
+
pageIndex: index,
|
|
48
|
+
pageCount,
|
|
49
|
+
from: rows === 0 ? 0 : index * size + 1,
|
|
50
|
+
to: Math.min(rows, (index + 1) * size),
|
|
51
|
+
totalRows: rows,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* The same arithmetic over a page nobody counted. There is no page count to
|
|
57
|
+
* clamp against, so the index the screen holds stands and `hasMore` is all that
|
|
58
|
+
* is known about what follows it.
|
|
59
|
+
*/
|
|
60
|
+
export function keysetPage(
|
|
61
|
+
pageIndex: number,
|
|
62
|
+
pageSize: number,
|
|
63
|
+
hasMore: boolean,
|
|
64
|
+
): KeysetPage {
|
|
65
|
+
const index = whole(pageIndex, 0);
|
|
66
|
+
const size = whole(pageSize, 1);
|
|
67
|
+
return { pageIndex: index, pageSize: size, from: index * size + 1, hasMore };
|
|
68
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/** One sorted column, named by the Flowdular `TableColumn.key`. */
|
|
2
|
+
export interface TableSort {
|
|
3
|
+
readonly key: string;
|
|
4
|
+
readonly desc: boolean;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export type TableSortChange = (sorts: readonly TableSort[]) => void;
|
|
8
|
+
|
|
9
|
+
/* One collator for every table: constructing an Intl.Collator costs far more
|
|
10
|
+
than a comparison, and sorting n rows calls compare O(n log n) times. The
|
|
11
|
+
locale is the host locale, so a value that must follow another collation is
|
|
12
|
+
normalised by the column's own `value` function. */
|
|
13
|
+
const COLLATOR = new Intl.Collator(undefined, {
|
|
14
|
+
numeric: true,
|
|
15
|
+
sensitivity: 'base',
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
function isBlank(value: unknown): boolean {
|
|
19
|
+
return value === null || value === undefined || value === '';
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Orders two cell values of one column. Numbers and booleans compare by
|
|
24
|
+
* magnitude, everything else through the host collator, so 'Łucja' lands where
|
|
25
|
+
* the reader expects it. Blank values sort last in ascending order.
|
|
26
|
+
*/
|
|
27
|
+
export function compareCellValues(left: unknown, right: unknown): number {
|
|
28
|
+
if (isBlank(left) || isBlank(right)) {
|
|
29
|
+
if (isBlank(left) && isBlank(right)) return 0;
|
|
30
|
+
return isBlank(left) ? 1 : -1;
|
|
31
|
+
}
|
|
32
|
+
if (typeof left === 'number' && typeof right === 'number')
|
|
33
|
+
return left < right ? -1 : left > right ? 1 : 0;
|
|
34
|
+
if (typeof left === 'boolean' && typeof right === 'boolean')
|
|
35
|
+
return left === right ? 0 : left ? 1 : -1;
|
|
36
|
+
return COLLATOR.compare(String(left), String(right));
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Stable identity of a sorting state. A controlled `Table` rebuilds the array
|
|
41
|
+
* it hands to the table engine only when this changes, so an unchanged sort
|
|
42
|
+
* never writes the engine's state atom during render.
|
|
43
|
+
*/
|
|
44
|
+
export function sortingSignature(sorts: readonly TableSort[]): string {
|
|
45
|
+
let signature = '';
|
|
46
|
+
for (const sort of sorts)
|
|
47
|
+
signature += `${sort.key}:${sort.desc ? 'desc' : 'asc'},`;
|
|
48
|
+
return signature;
|
|
49
|
+
}
|