@flowdular/sdk 0.1.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/README.md +27 -0
- package/.ai/agents/module-executor.md +36 -0
- package/.ai/agents/reviewer.md +23 -0
- package/.ai/agents/sandbox/agentic-engineer.md +31 -0
- package/.ai/agents/sandbox/backend-engineer.md +36 -0
- package/.ai/agents/sandbox/business-manager.md +23 -0
- package/.ai/agents/sandbox/frontend-engineer.md +27 -0
- package/.ai/agents/sandbox/ux-designer.md +23 -0
- package/.ai/agents/spec-author.md +29 -0
- package/.ai/blueprints/add-migration/README.md +5 -0
- package/.ai/blueprints/add-migration/allowed-paths.yaml +23 -0
- package/.ai/blueprints/add-migration/blueprint.json +14 -0
- package/.ai/blueprints/add-migration/examples/invalid/input-destructive.json +6 -0
- package/.ai/blueprints/add-migration/examples/invalid/plan-unnumbered-file.json +9 -0
- package/.ai/blueprints/add-migration/examples/valid/input.json +6 -0
- package/.ai/blueprints/add-migration/examples/valid/plan.json +9 -0
- package/.ai/blueprints/add-migration/gates.yaml +30 -0
- package/.ai/blueprints/add-migration/input.schema.json +23 -0
- package/.ai/blueprints/add-migration/plan.schema.json +54 -0
- package/.ai/blueprints/add-migration/required-files.yaml +18 -0
- package/.ai/blueprints/add-migration/spec-requirements.yaml +13 -0
- package/.ai/blueprints/add-migration/steps.yaml +62 -0
- package/.ai/blueprints/author-spec/README.md +5 -0
- package/.ai/blueprints/author-spec/allowed-paths.yaml +7 -0
- package/.ai/blueprints/author-spec/blueprint.json +14 -0
- package/.ai/blueprints/author-spec/examples/invalid/input-missing-outcome.json +5 -0
- package/.ai/blueprints/author-spec/examples/valid/input.json +6 -0
- package/.ai/blueprints/author-spec/gates.yaml +13 -0
- package/.ai/blueprints/author-spec/input.schema.json +20 -0
- package/.ai/blueprints/author-spec/plan.schema.json +14 -0
- package/.ai/blueprints/author-spec/required-files.yaml +6 -0
- package/.ai/blueprints/author-spec/spec-requirements.yaml +35 -0
- package/.ai/blueprints/author-spec/steps.yaml +28 -0
- package/.ai/blueprints/author-spec/templates/module.yaml +45 -0
- package/.ai/blueprints/bug-fix/README.md +5 -0
- package/.ai/blueprints/bug-fix/allowed-paths.yaml +29 -0
- package/.ai/blueprints/bug-fix/blueprint.json +14 -0
- package/.ai/blueprints/bug-fix/examples/invalid/input-no-symptom.json +4 -0
- package/.ai/blueprints/bug-fix/examples/invalid/plan-no-test.json +8 -0
- package/.ai/blueprints/bug-fix/examples/valid/input.json +6 -0
- package/.ai/blueprints/bug-fix/examples/valid/plan.json +8 -0
- package/.ai/blueprints/bug-fix/gates.yaml +30 -0
- package/.ai/blueprints/bug-fix/input.schema.json +25 -0
- package/.ai/blueprints/bug-fix/plan.schema.json +53 -0
- package/.ai/blueprints/bug-fix/required-files.yaml +7 -0
- package/.ai/blueprints/bug-fix/spec-requirements.yaml +7 -0
- package/.ai/blueprints/bug-fix/steps.yaml +51 -0
- package/.ai/blueprints/core-extend/README.md +5 -0
- package/.ai/blueprints/core-extend/allowed-paths.yaml +49 -0
- package/.ai/blueprints/core-extend/blueprint.json +14 -0
- package/.ai/blueprints/core-extend/examples/invalid/input-unknown-package.json +5 -0
- package/.ai/blueprints/core-extend/examples/invalid/plan-missing-gates.json +7 -0
- package/.ai/blueprints/core-extend/examples/valid/input.json +6 -0
- package/.ai/blueprints/core-extend/examples/valid/plan.json +10 -0
- package/.ai/blueprints/core-extend/gates.yaml +16 -0
- package/.ai/blueprints/core-extend/input.schema.json +54 -0
- package/.ai/blueprints/core-extend/plan.schema.json +39 -0
- package/.ai/blueprints/core-extend/required-files.yaml +36 -0
- package/.ai/blueprints/core-extend/spec-requirements.yaml +17 -0
- package/.ai/blueprints/core-extend/steps.yaml +54 -0
- package/.ai/blueprints/edit-module/README.md +9 -0
- package/.ai/blueprints/edit-module/allowed-paths.yaml +27 -0
- package/.ai/blueprints/edit-module/blueprint.json +20 -0
- package/.ai/blueprints/edit-module/examples/invalid/input-unknown-change.json +5 -0
- package/.ai/blueprints/edit-module/examples/invalid/plan-touches-platform.json +15 -0
- package/.ai/blueprints/edit-module/examples/valid/input.json +5 -0
- package/.ai/blueprints/edit-module/examples/valid/plan.json +25 -0
- package/.ai/blueprints/edit-module/gates.yaml +30 -0
- package/.ai/blueprints/edit-module/input.schema.json +31 -0
- package/.ai/blueprints/edit-module/plan.schema.json +65 -0
- package/.ai/blueprints/edit-module/required-files.yaml +80 -0
- package/.ai/blueprints/edit-module/spec-requirements.yaml +15 -0
- package/.ai/blueprints/edit-module/steps.yaml +115 -0
- package/.ai/blueprints/new-module/README.md +7 -0
- package/.ai/blueprints/new-module/allowed-paths.yaml +27 -0
- package/.ai/blueprints/new-module/blueprint.json +20 -0
- package/.ai/blueprints/new-module/examples/invalid/input-spec-outside-modules.json +4 -0
- package/.ai/blueprints/new-module/examples/invalid/plan-unknown-gate.json +8 -0
- package/.ai/blueprints/new-module/examples/valid/input.json +5 -0
- package/.ai/blueprints/new-module/examples/valid/plan.json +22 -0
- package/.ai/blueprints/new-module/gates.yaml +30 -0
- package/.ai/blueprints/new-module/input.schema.json +21 -0
- package/.ai/blueprints/new-module/plan.schema.json +58 -0
- package/.ai/blueprints/new-module/required-files.yaml +73 -0
- package/.ai/blueprints/new-module/spec-requirements.yaml +30 -0
- package/.ai/blueprints/new-module/steps.yaml +138 -0
- package/.ai/blueprints/release/README.md +5 -0
- package/.ai/blueprints/release/allowed-paths.yaml +19 -0
- package/.ai/blueprints/release/blueprint.json +14 -0
- package/.ai/blueprints/release/examples/invalid/input-bad-version.json +4 -0
- package/.ai/blueprints/release/examples/invalid/plan-bad-branch.json +7 -0
- package/.ai/blueprints/release/examples/valid/input.json +5 -0
- package/.ai/blueprints/release/examples/valid/plan.json +20 -0
- package/.ai/blueprints/release/gates.yaml +20 -0
- package/.ai/blueprints/release/input.schema.json +24 -0
- package/.ai/blueprints/release/plan.schema.json +46 -0
- package/.ai/blueprints/release/required-files.yaml +19 -0
- package/.ai/blueprints/release/spec-requirements.yaml +8 -0
- package/.ai/blueprints/release/steps.yaml +47 -0
- package/.ai/blueprints/security-review/README.md +5 -0
- package/.ai/blueprints/security-review/allowed-paths.yaml +6 -0
- package/.ai/blueprints/security-review/blueprint.json +14 -0
- package/.ai/blueprints/security-review/examples/invalid/input-unknown-kind.json +4 -0
- package/.ai/blueprints/security-review/examples/invalid/plan-finding-without-scenario.json +14 -0
- package/.ai/blueprints/security-review/examples/valid/input.json +4 -0
- package/.ai/blueprints/security-review/examples/valid/plan.json +19 -0
- package/.ai/blueprints/security-review/gates.yaml +22 -0
- package/.ai/blueprints/security-review/input.schema.json +20 -0
- package/.ai/blueprints/security-review/plan.schema.json +65 -0
- package/.ai/blueprints/security-review/required-files.yaml +6 -0
- package/.ai/blueprints/security-review/spec-requirements.yaml +9 -0
- package/.ai/blueprints/security-review/steps.yaml +38 -0
- package/.ai/policies/capabilities.yaml +164 -0
- package/.ai/policies/model-routing.yaml +72 -0
- package/.ai/policies/path-ownership.yaml +65 -0
- package/.ai/policies/task-budgets.yaml +37 -0
- package/.ai/references/catalog/LICENSE +21 -0
- package/.ai/references/catalog/migrations/0001_catalog_core.down.sql +2 -0
- package/.ai/references/catalog/migrations/0001_catalog_core.up.sql +21 -0
- package/.ai/references/catalog/migrations/0002_catalog_history.down.sql +3 -0
- package/.ai/references/catalog/migrations/0002_catalog_history.up.sql +20 -0
- package/.ai/references/catalog/migrations/0003_catalog_history_service_actors.down.sql +3 -0
- package/.ai/references/catalog/migrations/0003_catalog_history_service_actors.up.sql +36 -0
- package/.ai/references/catalog/migrations/0004_catalog_idempotency_ledger.down.sql +3 -0
- package/.ai/references/catalog/migrations/0004_catalog_idempotency_ledger.up.sql +19 -0
- package/.ai/references/catalog/migrations/README.md +3 -0
- package/.ai/references/catalog/module.json +27 -0
- package/.ai/references/catalog/package.json +49 -0
- package/.ai/references/catalog/spec/module.yaml +86 -0
- package/.ai/references/catalog/src/acl/permissions.ts +6 -0
- package/.ai/references/catalog/src/agent/tools.ts +164 -0
- package/.ai/references/catalog/src/api/endpoints.ts +243 -0
- package/.ai/references/catalog/src/client/CatalogHistoryDrawer.tsrx +123 -0
- package/.ai/references/catalog/src/client/CatalogItemForm.tsrx +190 -0
- package/.ai/references/catalog/src/client/CatalogView.tsrx +473 -0
- package/.ai/references/catalog/src/client/api.ts +111 -0
- package/.ai/references/catalog/src/client/contribution.tsrx +61 -0
- package/.ai/references/catalog/src/client/index.ts +18 -0
- package/.ai/references/catalog/src/client/navigation-copy.ts +9 -0
- package/.ai/references/catalog/src/client/state.ts +24 -0
- package/.ai/references/catalog/src/domain/types.ts +32 -0
- package/.ai/references/catalog/src/domain/variables.ts +111 -0
- package/.ai/references/catalog/src/index.ts +31 -0
- package/.ai/references/catalog/src/platform.ts +35 -0
- package/.ai/references/catalog/src/server/index.ts +4 -0
- package/.ai/references/catalog/src/server/runtime.ts +86 -0
- package/.ai/references/catalog/src/services/catalog-service.ts +306 -0
- package/.ai/references/catalog/src/services/database-repository.ts +440 -0
- package/.ai/references/catalog/src/services/index.ts +4 -0
- package/.ai/references/catalog/src/services/migration.ts +171 -0
- package/.ai/references/catalog/src/services/repository.ts +36 -0
- package/.ai/references/catalog/src/services/target-idempotency.ts +59 -0
- package/.ai/references/catalog/tests/agent-tools.test.ts +277 -0
- package/.ai/references/catalog/tests/endpoints.test.ts +320 -0
- package/.ai/references/catalog/tests/idempotency.test.ts +297 -0
- package/.ai/references/catalog/tests/migrations.test.ts +149 -0
- package/.ai/references/catalog/tests/module.test.ts +271 -0
- package/.ai/references/catalog/tests/support/database.ts +76 -0
- package/.ai/references/catalog/translations/en.json +101 -0
- package/.ai/references/catalog/translations/pl.json +101 -0
- package/.ai/references/catalog/tsconfig.json +15 -0
- package/.ai/references/catalog/vitest.config.ts +16 -0
- package/.ai/references/catalog.provenance.json +55 -0
- package/.ai/skills/README.md +36 -0
- package/.ai/skills/agent-tool-design/SKILL.md +209 -0
- package/.ai/skills/auth-security-review/SKILL.md +96 -0
- package/.ai/skills/auto-review/SKILL.md +112 -0
- package/.ai/skills/bug-hunt/SKILL.md +110 -0
- package/.ai/skills/business-agent-design/SKILL.md +188 -0
- package/.ai/skills/cli-extension/SKILL.md +114 -0
- package/.ai/skills/core-extend/SKILL.md +104 -0
- package/.ai/skills/database-adapter/SKILL.md +204 -0
- package/.ai/skills/database-adapter/references/first-run-and-matrix.md +105 -0
- package/.ai/skills/migration-authoring/SKILL.md +167 -0
- package/.ai/skills/module-new/SKILL.md +180 -0
- package/.ai/skills/module-update/SKILL.md +100 -0
- package/.ai/skills/perf-audit/SKILL.md +105 -0
- package/.ai/skills/release-eject-pr/SKILL.md +113 -0
- package/.ai/skills/spec-approval/SKILL.md +112 -0
- package/.ai/skills/test-hardening/SKILL.md +86 -0
- package/.ai/skills/translations-i18n/SKILL.md +85 -0
- package/.ai/skills/ux-design/SKILL.md +97 -0
- package/.ai/skills/variables/SKILL.md +164 -0
- package/.ai/skills/workflow-development/SKILL.md +199 -0
- package/AGENTS.md +59 -0
- package/LICENSE +21 -0
- package/README.md +24 -0
- package/docs/agent-contract.md +45 -0
- package/docs/design-system.md +217 -0
- package/modules/agents/migrations/0001_agents_core.down.sql +4 -0
- package/modules/agents/migrations/0001_agents_core.up.sql +106 -0
- package/modules/agents/migrations/0002_provider_connections.down.sql +1 -0
- package/modules/agents/migrations/0002_provider_connections.up.sql +34 -0
- package/modules/agents/migrations/0003_resource_audit.down.sql +1 -0
- package/modules/agents/migrations/0003_resource_audit.up.sql +25 -0
- package/modules/agents/migrations/0004_run_grants.down.sql +1 -0
- package/modules/agents/migrations/0004_run_grants.up.sql +19 -0
- package/modules/agents/migrations/0005_long_running_limits.down.sql +2 -0
- package/modules/agents/migrations/0005_long_running_limits.up.sql +14 -0
- package/modules/agents/migrations/0006_agent_skills.down.sql +3 -0
- package/modules/agents/migrations/0006_agent_skills.up.sql +44 -0
- package/modules/agents/migrations/0007_model_readiness.down.sql +1 -0
- package/modules/agents/migrations/0007_model_readiness.up.sql +18 -0
- package/modules/agents/migrations/0008_output_limits.down.sql +2 -0
- package/modules/agents/migrations/0008_output_limits.up.sql +8 -0
- package/modules/agents/migrations/0009_agent_audit_v3.down.sql +1 -0
- package/modules/agents/migrations/0009_agent_audit_v3.up.sql +25 -0
- package/modules/agents/migrations/0012_agent_run_costs.down.sql +3 -0
- package/modules/agents/migrations/0012_agent_run_costs.up.sql +32 -0
- package/modules/agents/migrations/0013_workflow_prerequisites.down.sql +3 -0
- package/modules/agents/migrations/0013_workflow_prerequisites.up.sql +97 -0
- package/modules/agents/migrations/0014_agent_action_audit.down.sql +1 -0
- package/modules/agents/migrations/0014_agent_action_audit.up.sql +25 -0
- package/modules/agents/migrations/0015_agent_run_actors.down.sql +1 -0
- package/modules/agents/migrations/0015_agent_run_actors.up.sql +17 -0
- package/modules/agents/migrations/0016_module_owned_agents.down.sql +6 -0
- package/modules/agents/migrations/0016_module_owned_agents.up.sql +68 -0
- package/modules/agents/migrations/0017_agent_authorization_subjects.down.sql +2 -0
- package/modules/agents/migrations/0017_agent_authorization_subjects.up.sql +18 -0
- package/modules/agents/migrations/0018_agent_child_tenant_isolation.down.sql +12 -0
- package/modules/agents/migrations/0018_agent_child_tenant_isolation.up.sql +88 -0
- package/modules/agents/migrations/0019_background_recovery_grants.down.sql +6 -0
- package/modules/agents/migrations/0019_background_recovery_grants.up.sql +17 -0
- package/modules/agents/migrations/0020_provider_summary_role.down.sql +2 -0
- package/modules/agents/migrations/0020_provider_summary_role.up.sql +17 -0
- package/modules/agents/migrations/0021_agents_agent_reconciliation_role.down.sql +4 -0
- package/modules/agents/migrations/0021_agents_agent_reconciliation_role.up.sql +7 -0
- package/modules/agents/migrations/README.md +39 -0
- package/modules/agents/module.json +38 -0
- package/modules/agents/package.json +56 -0
- package/modules/agents/spec/module.yaml +271 -0
- package/modules/agents/spec/procedures-compatibility.md +63 -0
- package/modules/agents/src/acl/permissions.ts +13 -0
- package/modules/agents/src/api/endpoints.ts +1122 -0
- package/modules/agents/src/cli/commands.json +29 -0
- package/modules/agents/src/cli/index.ts +162 -0
- package/modules/agents/src/client/AgentDashboardWidget.tsrx +32 -0
- package/modules/agents/src/client/AgentDefinitionForm.tsrx +362 -0
- package/modules/agents/src/client/AgentDefinitionList.tsrx +127 -0
- package/modules/agents/src/client/AgentPlaygroundView.tsrx +246 -0
- package/modules/agents/src/client/AgentProcedureForm.tsrx +182 -0
- package/modules/agents/src/client/AgentProcedureList.tsrx +118 -0
- package/modules/agents/src/client/AgentProceduresView.tsrx +253 -0
- package/modules/agents/src/client/AgentProvidersView.tsrx +248 -0
- package/modules/agents/src/client/AgentRunsView.tsrx +304 -0
- package/modules/agents/src/client/AgentUsageView.tsrx +233 -0
- package/modules/agents/src/client/AgentsView.tsrx +339 -0
- package/modules/agents/src/client/ModuleAgentBindingForm.tsrx +239 -0
- package/modules/agents/src/client/ModuleAgentList.tsrx +122 -0
- package/modules/agents/src/client/ProviderConnectionForm.tsrx +273 -0
- package/modules/agents/src/client/ProviderConnectionList.tsrx +229 -0
- package/modules/agents/src/client/ProviderModelEditor.tsrx +313 -0
- package/modules/agents/src/client/RunTimeline.tsrx +212 -0
- package/modules/agents/src/client/agents.css +349 -0
- package/modules/agents/src/client/api.ts +373 -0
- package/modules/agents/src/client/contribution.tsrx +181 -0
- package/modules/agents/src/client/index.ts +21 -0
- package/modules/agents/src/client/presentation.ts +162 -0
- package/modules/agents/src/client/state.ts +100 -0
- package/modules/agents/src/domain/context-variables.ts +58 -0
- package/modules/agents/src/domain/run-timeline.ts +145 -0
- package/modules/agents/src/domain/types.ts +481 -0
- package/modules/agents/src/index.ts +88 -0
- package/modules/agents/src/platform.ts +82 -0
- package/modules/agents/src/server/action-execution.ts +811 -0
- package/modules/agents/src/server/define-agent.ts +170 -0
- package/modules/agents/src/server/index.ts +67 -0
- package/modules/agents/src/server/run-execution.ts +231 -0
- package/modules/agents/src/server/run-queue.ts +96 -0
- package/modules/agents/src/server/runtime.ts +448 -0
- package/modules/agents/src/server/tools.ts +18 -0
- package/modules/agents/src/services/agent-service.ts +2167 -0
- package/modules/agents/src/services/credential-vault.ts +133 -0
- package/modules/agents/src/services/database-repository.ts +2786 -0
- package/modules/agents/src/services/index.ts +33 -0
- package/modules/agents/src/services/migration.ts +1152 -0
- package/modules/agents/src/services/module-agent-preflight.ts +76 -0
- package/modules/agents/src/services/outbound-policy.ts +136 -0
- package/modules/agents/src/services/provider-broker.ts +80 -0
- package/modules/agents/src/services/provider-repository.ts +589 -0
- package/modules/agents/src/services/provider-service.ts +968 -0
- package/modules/agents/src/services/repository.ts +294 -0
- package/modules/agents/src/services/run-grant.ts +305 -0
- package/modules/agents/src/services/usage-service.ts +119 -0
- package/modules/agents/src/services/worker.ts +442 -0
- package/modules/agents/src/settings.ts +244 -0
- package/modules/agents/translations/en.json +403 -0
- package/modules/agents/translations/pl.json +403 -0
- package/modules/auth/README.md +215 -0
- package/modules/auth/migrations/0001_auth_core.up.sql +108 -0
- package/modules/auth/migrations/0002_bundled_module_scopes.up.sql +26 -0
- package/modules/auth/migrations/0003_agent_core_scopes.up.sql +12 -0
- package/modules/auth/migrations/0004_owner_only_development_scopes.up.sql +8 -0
- package/modules/auth/migrations/0005_agent_provider_scopes.up.sql +13 -0
- package/modules/auth/migrations/0006_tenant_slug.up.sql +6 -0
- package/modules/auth/migrations/0007_sandbox_scopes.up.sql +13 -0
- package/modules/auth/migrations/0008_api_tokens.up.sql +43 -0
- package/modules/auth/migrations/0009_module_settings.up.sql +24 -0
- package/modules/auth/migrations/0010_sign_in_lockout.up.sql +11 -0
- package/modules/auth/migrations/0011_session_ids_and_password_reset.up.sql +7 -0
- package/modules/auth/migrations/0012_roles.up.sql +31 -0
- package/modules/auth/migrations/0013_audit.up.sql +27 -0
- package/modules/auth/migrations/0014_audit_actor.up.sql +4 -0
- package/modules/auth/migrations/0015_account_security.up.sql +81 -0
- package/modules/auth/module.json +26 -0
- package/modules/auth/package.json +61 -0
- package/modules/auth/spec/module.yaml +190 -0
- package/modules/auth/src/acl/scopes.ts +86 -0
- package/modules/auth/src/api/attempt-limiter.ts +42 -0
- package/modules/auth/src/api/client-address.ts +14 -0
- package/modules/auth/src/api/cookies.ts +52 -0
- package/modules/auth/src/api/origin.ts +40 -0
- package/modules/auth/src/cli/commands.json +74 -0
- package/modules/auth/src/cli/database.ts +51 -0
- package/modules/auth/src/cli/greenfield.ts +173 -0
- package/modules/auth/src/cli/index.ts +184 -0
- package/modules/auth/src/cli/provisioning.ts +211 -0
- package/modules/auth/src/client/AuthBackdrop.tsrx +137 -0
- package/modules/auth/src/client/AuthenticationCore.tsrx +630 -0
- package/modules/auth/src/client/PasswordChangeRequired.tsrx +145 -0
- package/modules/auth/src/client/PublicAuthFlows.tsrx +379 -0
- package/modules/auth/src/client/api.ts +464 -0
- package/modules/auth/src/client/audit/AuditView.tsrx +357 -0
- package/modules/auth/src/client/audit/api.ts +164 -0
- package/modules/auth/src/client/audit/audit-columns.tsrx +47 -0
- package/modules/auth/src/client/audit/audit-row.ts +38 -0
- package/modules/auth/src/client/auth.css +483 -0
- package/modules/auth/src/client/contribution.tsrx +100 -0
- package/modules/auth/src/client/index.ts +32 -0
- package/modules/auth/src/client/security/SecurityView.tsrx +253 -0
- package/modules/auth/src/client/settings/PreferencesCard.tsrx +65 -0
- package/modules/auth/src/client/settings/SettingsView.tsrx +212 -0
- package/modules/auth/src/client/settings/WorkspaceCard.tsrx +59 -0
- package/modules/auth/src/client/settings/api.ts +115 -0
- package/modules/auth/src/client/slug.ts +26 -0
- package/modules/auth/src/client/state.ts +115 -0
- package/modules/auth/src/client/tokens/ApiTokenForm.tsrx +153 -0
- package/modules/auth/src/client/tokens/ApiTokenSecret.tsrx +35 -0
- package/modules/auth/src/client/tokens/ApiTokensView.tsrx +216 -0
- package/modules/auth/src/client/tokens/api.ts +59 -0
- package/modules/auth/src/client/tokens/state.ts +26 -0
- package/modules/auth/src/client/tokens/token-columns.tsrx +64 -0
- package/modules/auth/src/client/translations.ts +23 -0
- package/modules/auth/src/domain/types.ts +152 -0
- package/modules/auth/src/index.ts +42 -0
- package/modules/auth/src/middleware/authentication.ts +97 -0
- package/modules/auth/src/platform.ts +0 -0
- package/modules/auth/src/server/actor.ts +12 -0
- package/modules/auth/src/server/audit-endpoints.ts +51 -0
- package/modules/auth/src/server/composition.ts +9 -0
- package/modules/auth/src/server/endpoints.ts +893 -0
- package/modules/auth/src/server/http.ts +153 -0
- package/modules/auth/src/server/index.ts +37 -0
- package/modules/auth/src/server/roles-endpoints.ts +120 -0
- package/modules/auth/src/server/runtime.ts +705 -0
- package/modules/auth/src/server/session-endpoints.ts +86 -0
- package/modules/auth/src/server/session-security.ts +62 -0
- package/modules/auth/src/server/token-endpoints.ts +106 -0
- package/modules/auth/src/services/auth-service-error.ts +11 -0
- package/modules/auth/src/services/auth-service.ts +2309 -0
- package/modules/auth/src/services/database-repository.ts +1825 -0
- package/modules/auth/src/services/mail-delivery.ts +27 -0
- package/modules/auth/src/services/migration.ts +591 -0
- package/modules/auth/src/services/password.ts +115 -0
- package/modules/auth/src/services/repository.ts +395 -0
- package/modules/auth/src/services/settings-store.ts +92 -0
- package/modules/auth/src/services/totp.ts +135 -0
- package/modules/auth/src/services/validation.ts +186 -0
- package/modules/auth/src/settings.ts +150 -0
- package/modules/auth/translations/en.json +263 -0
- package/modules/auth/translations/pl.json +263 -0
- package/modules/automations/migrations/0001_automations_core.down.sql +10 -0
- package/modules/automations/migrations/0001_automations_core.up.sql +76 -0
- package/modules/automations/migrations/0002_automations_targets.down.sql +9 -0
- package/modules/automations/migrations/0002_automations_targets.up.sql +37 -0
- package/modules/automations/migrations/0003_automations_scheduler_role.down.sql +3 -0
- package/modules/automations/migrations/0003_automations_scheduler_role.up.sql +19 -0
- package/modules/automations/migrations/0004_automations_trigger_routing_role.down.sql +3 -0
- package/modules/automations/migrations/0004_automations_trigger_routing_role.up.sql +18 -0
- package/modules/automations/migrations/README.md +3 -0
- package/modules/automations/module.json +31 -0
- package/modules/automations/package.json +55 -0
- package/modules/automations/spec/module.yaml +93 -0
- package/modules/automations/src/acl/permissions.ts +10 -0
- package/modules/automations/src/api/endpoints.ts +480 -0
- package/modules/automations/src/client/AutomationScheduleForm.tsrx +218 -0
- package/modules/automations/src/client/AutomationSchedulesView.tsrx +339 -0
- package/modules/automations/src/client/AutomationTriggerForm.tsrx +190 -0
- package/modules/automations/src/client/AutomationTriggersView.tsrx +329 -0
- package/modules/automations/src/client/api.ts +148 -0
- package/modules/automations/src/client/contribution.tsrx +70 -0
- package/modules/automations/src/client/index.ts +20 -0
- package/modules/automations/src/client/presentation.ts +38 -0
- package/modules/automations/src/client/state.ts +40 -0
- package/modules/automations/src/client/target-selection.ts +44 -0
- package/modules/automations/src/domain/cadence.ts +44 -0
- package/modules/automations/src/domain/types.ts +110 -0
- package/modules/automations/src/domain/variables.ts +178 -0
- package/modules/automations/src/index.ts +39 -0
- package/modules/automations/src/platform.ts +73 -0
- package/modules/automations/src/server/execution.ts +77 -0
- package/modules/automations/src/server/index.ts +39 -0
- package/modules/automations/src/server/runtime.ts +218 -0
- package/modules/automations/src/server/targets.ts +116 -0
- package/modules/automations/src/services/automations-service.ts +10 -0
- package/modules/automations/src/services/database-repository.ts +763 -0
- package/modules/automations/src/services/index.ts +5 -0
- package/modules/automations/src/services/migration.ts +223 -0
- package/modules/automations/src/services/repository.ts +119 -0
- package/modules/automations/src/services/schedule-service.ts +837 -0
- package/modules/automations/src/services/secret-vault.ts +124 -0
- package/modules/automations/src/services/trigger-service.ts +648 -0
- package/modules/automations/src/settings.ts +69 -0
- package/modules/automations/translations/en.json +126 -0
- package/modules/automations/translations/pl.json +126 -0
- package/modules/automations-workflows-integration/module.json +27 -0
- package/modules/automations-workflows-integration/package.json +48 -0
- package/modules/automations-workflows-integration/spec/module.yaml +93 -0
- package/modules/automations-workflows-integration/src/index.ts +14 -0
- package/modules/automations-workflows-integration/src/platform.ts +24 -0
- package/modules/automations-workflows-integration/src/server/adapter.ts +272 -0
- package/modules/automations-workflows-integration/src/server/index.ts +11 -0
- package/modules/automations-workflows-integration/src/server/tools.ts +0 -0
- package/modules/automations-workflows-integration/translations/en.json +21 -0
- package/modules/automations-workflows-integration/translations/pl.json +21 -0
- package/modules/profile/migrations/0001_profile_core.down.sql +1 -0
- package/modules/profile/migrations/0001_profile_core.up.sql +13 -0
- package/modules/profile/migrations/0002_profile_language.down.sql +1 -0
- package/modules/profile/migrations/0002_profile_language.up.sql +12 -0
- package/modules/profile/migrations/README.md +3 -0
- package/modules/profile/module.json +23 -0
- package/modules/profile/package.json +55 -0
- package/modules/profile/spec/module.yaml +136 -0
- package/modules/profile/src/acl/permissions.ts +5 -0
- package/modules/profile/src/api/endpoints.ts +184 -0
- package/modules/profile/src/client/DisplayNameCard.tsrx +59 -0
- package/modules/profile/src/client/LanguageCard.tsrx +89 -0
- package/modules/profile/src/client/PasswordCard.tsrx +79 -0
- package/modules/profile/src/client/ProfileView.tsrx +192 -0
- package/modules/profile/src/client/SessionsCard.tsrx +158 -0
- package/modules/profile/src/client/api.ts +134 -0
- package/modules/profile/src/client/contribution.tsrx +61 -0
- package/modules/profile/src/client/index.ts +15 -0
- package/modules/profile/src/client/password.ts +41 -0
- package/modules/profile/src/client/sessions-api.ts +52 -0
- package/modules/profile/src/client/state.ts +23 -0
- package/modules/profile/src/domain/types.ts +21 -0
- package/modules/profile/src/index.ts +21 -0
- package/modules/profile/src/platform.ts +23 -0
- package/modules/profile/src/server/index.ts +7 -0
- package/modules/profile/src/server/runtime.ts +84 -0
- package/modules/profile/src/services/database-repository.ts +154 -0
- package/modules/profile/src/services/index.ts +6 -0
- package/modules/profile/src/services/migration.ts +58 -0
- package/modules/profile/src/services/profile-service.ts +114 -0
- package/modules/profile/src/services/repository.ts +13 -0
- package/modules/profile/translations/en.json +58 -0
- package/modules/profile/translations/pl.json +58 -0
- package/modules/sandbox/migrations/0001_sandbox_core.down.sql +6 -0
- package/modules/sandbox/migrations/0001_sandbox_core.up.sql +70 -0
- package/modules/sandbox/migrations/0002_sandbox_session_lifecycle.down.sql +36 -0
- package/modules/sandbox/migrations/0002_sandbox_session_lifecycle.up.sql +37 -0
- package/modules/sandbox/migrations/README.md +7 -0
- package/modules/sandbox/module.json +31 -0
- package/modules/sandbox/package.json +56 -0
- package/modules/sandbox/spec/module.yaml +111 -0
- package/modules/sandbox/src/acl/permissions.ts +18 -0
- package/modules/sandbox/src/api/endpoints.ts +439 -0
- package/modules/sandbox/src/cli/commands.json +84 -0
- package/modules/sandbox/src/cli/index.ts +450 -0
- package/modules/sandbox/src/client/SandboxAccessView.tsrx +191 -0
- package/modules/sandbox/src/client/SandboxGrantForm.tsrx +134 -0
- package/modules/sandbox/src/client/SandboxGrantList.tsrx +83 -0
- package/modules/sandbox/src/client/SandboxSessionList.tsrx +56 -0
- package/modules/sandbox/src/client/api.ts +87 -0
- package/modules/sandbox/src/client/contribution.tsrx +47 -0
- package/modules/sandbox/src/client/index.ts +18 -0
- package/modules/sandbox/src/client/presentation.ts +47 -0
- package/modules/sandbox/src/client/state.ts +20 -0
- package/modules/sandbox/src/domain/types.ts +125 -0
- package/modules/sandbox/src/index.ts +33 -0
- package/modules/sandbox/src/platform.ts +28 -0
- package/modules/sandbox/src/server/index.ts +20 -0
- package/modules/sandbox/src/server/runtime.ts +119 -0
- package/modules/sandbox/src/services/database-repository.ts +567 -0
- package/modules/sandbox/src/services/directory.ts +33 -0
- package/modules/sandbox/src/services/index.ts +19 -0
- package/modules/sandbox/src/services/migration.ts +145 -0
- package/modules/sandbox/src/services/repository.ts +55 -0
- package/modules/sandbox/src/services/sandbox-service-error.ts +10 -0
- package/modules/sandbox/src/services/sandbox-service.ts +533 -0
- package/modules/sandbox/translations/en.json +77 -0
- package/modules/sandbox/translations/pl.json +77 -0
- package/modules/system/module.json +18 -0
- package/modules/system/package.json +56 -0
- package/modules/system/spec/module.yaml +104 -0
- package/modules/system/src/acl/permissions.ts +10 -0
- package/modules/system/src/client/ModuleSettingRow.tsrx +191 -0
- package/modules/system/src/client/ModuleSettingsSection.tsrx +155 -0
- package/modules/system/src/client/ModulesView.tsrx +241 -0
- package/modules/system/src/client/api.ts +36 -0
- package/modules/system/src/client/contribution.tsrx +48 -0
- package/modules/system/src/client/index.ts +26 -0
- package/modules/system/src/client/module-columns.tsrx +66 -0
- package/modules/system/src/client/overview-api.ts +30 -0
- package/modules/system/src/client/setting-copy.ts +30 -0
- package/modules/system/src/client/settings-api.ts +57 -0
- package/modules/system/src/client/state.ts +16 -0
- package/modules/system/src/index.ts +11 -0
- package/modules/system/src/platform.ts +11 -0
- package/modules/system/src/server/endpoints.ts +372 -0
- package/modules/system/src/server/index.ts +11 -0
- package/modules/system/src/server/module-catalog.ts +117 -0
- package/modules/system/translations/en.json +64 -0
- package/modules/system/translations/pl.json +64 -0
- package/modules/users/migrations/README.md +3 -0
- package/modules/users/module.json +27 -0
- package/modules/users/package.json +54 -0
- package/modules/users/spec/module.yaml +79 -0
- package/modules/users/src/acl/permissions.ts +6 -0
- package/modules/users/src/api/endpoints.ts +222 -0
- package/modules/users/src/client/InviteMemberForm.tsrx +62 -0
- package/modules/users/src/client/MemberDrawer.tsrx +298 -0
- package/modules/users/src/client/RoleForm.tsrx +140 -0
- package/modules/users/src/client/RolesView.tsrx +288 -0
- package/modules/users/src/client/UserAccountForm.tsrx +86 -0
- package/modules/users/src/client/UsersView.tsrx +486 -0
- package/modules/users/src/client/api.ts +172 -0
- package/modules/users/src/client/contribution.tsrx +92 -0
- package/modules/users/src/client/index.ts +19 -0
- package/modules/users/src/client/member-columns.tsrx +52 -0
- package/modules/users/src/client/roles-api.ts +90 -0
- package/modules/users/src/client/state.ts +42 -0
- package/modules/users/src/index.ts +27 -0
- package/modules/users/src/platform.ts +11 -0
- package/modules/users/src/services/index.ts +2 -0
- package/modules/users/src/services/users-service.ts +142 -0
- package/modules/users/translations/en.json +133 -0
- package/modules/users/translations/pl.json +133 -0
- package/modules/workflows/migrations/0001_workflows_core.down.sql +19 -0
- package/modules/workflows/migrations/0001_workflows_core.up.sql +228 -0
- package/modules/workflows/migrations/0002_workflows_authorization_subject.down.sql +1 -0
- package/modules/workflows/migrations/0002_workflows_authorization_subject.up.sql +9 -0
- package/modules/workflows/migrations/0003_workflows_worker_role.up.sql +34 -0
- package/modules/workflows/migrations/README.md +7 -0
- package/modules/workflows/module.json +31 -0
- package/modules/workflows/package.json +55 -0
- package/modules/workflows/spec/module.yaml +227 -0
- package/modules/workflows/src/acl/permissions.ts +10 -0
- package/modules/workflows/src/api/endpoints.ts +852 -0
- package/modules/workflows/src/client/WorkflowCanvas.tsrx +819 -0
- package/modules/workflows/src/client/WorkflowCreateForm.tsrx +111 -0
- package/modules/workflows/src/client/WorkflowEditor.tsrx +443 -0
- package/modules/workflows/src/client/WorkflowExecutionHistory.tsrx +169 -0
- package/modules/workflows/src/client/WorkflowFixtureDrawer.tsrx +206 -0
- package/modules/workflows/src/client/WorkflowInputForm.tsrx +125 -0
- package/modules/workflows/src/client/WorkflowInputSchemaEditor.tsrx +185 -0
- package/modules/workflows/src/client/WorkflowInspector.tsrx +471 -0
- package/modules/workflows/src/client/WorkflowLiveConfirmation.tsrx +67 -0
- package/modules/workflows/src/client/WorkflowMappingEditor.tsrx +283 -0
- package/modules/workflows/src/client/WorkflowNodePalette.tsrx +50 -0
- package/modules/workflows/src/client/WorkflowPointerField.tsrx +178 -0
- package/modules/workflows/src/client/WorkflowRevisionReview.tsrx +49 -0
- package/modules/workflows/src/client/WorkflowRunInspector.tsrx +143 -0
- package/modules/workflows/src/client/WorkflowTestPanel.tsrx +109 -0
- package/modules/workflows/src/client/WorkflowValidationPanel.tsrx +139 -0
- package/modules/workflows/src/client/WorkflowsView.tsrx +1060 -0
- package/modules/workflows/src/client/api.ts +312 -0
- package/modules/workflows/src/client/canvas-model.ts +472 -0
- package/modules/workflows/src/client/connected-node.ts +71 -0
- package/modules/workflows/src/client/contribution.tsrx +57 -0
- package/modules/workflows/src/client/create-model.ts +15 -0
- package/modules/workflows/src/client/draft-repair.ts +86 -0
- package/modules/workflows/src/client/index.ts +19 -0
- package/modules/workflows/src/client/input-model.ts +124 -0
- package/modules/workflows/src/client/mapping-model.ts +110 -0
- package/modules/workflows/src/client/pointer-model.ts +123 -0
- package/modules/workflows/src/client/presentation.ts +62 -0
- package/modules/workflows/src/client/run-actions.ts +19 -0
- package/modules/workflows/src/client/state.ts +57 -0
- package/modules/workflows/src/client/viewport.ts +107 -0
- package/modules/workflows/src/client/workflows.css +899 -0
- package/modules/workflows/src/domain/events.ts +399 -0
- package/modules/workflows/src/domain/graph.ts +1136 -0
- package/modules/workflows/src/domain/types.ts +563 -0
- package/modules/workflows/src/index.ts +27 -0
- package/modules/workflows/src/platform.ts +49 -0
- package/modules/workflows/src/server/index.ts +13 -0
- package/modules/workflows/src/server/runtime.ts +266 -0
- package/modules/workflows/src/services/cursor-codec.ts +62 -0
- package/modules/workflows/src/services/database-repository.ts +2407 -0
- package/modules/workflows/src/services/index.ts +6 -0
- package/modules/workflows/src/services/migration.ts +375 -0
- package/modules/workflows/src/services/payload-codec.ts +264 -0
- package/modules/workflows/src/services/repository.ts +285 -0
- package/modules/workflows/src/services/simulation.ts +359 -0
- package/modules/workflows/src/services/worker.ts +1196 -0
- package/modules/workflows/src/services/workflows-service.ts +1395 -0
- package/modules/workflows/translations/en.json +348 -0
- package/modules/workflows/translations/pl.json +348 -0
- package/modules.json +41 -0
- package/package.json +125 -0
- package/packages/ai-provider/package.json +46 -0
- package/packages/ai-provider/src/catalog.ts +102 -0
- package/packages/ai-provider/src/errors.ts +110 -0
- package/packages/ai-provider/src/index.ts +33 -0
- package/packages/ai-provider/src/model.ts +198 -0
- package/packages/ai-provider/src/pricing.ts +73 -0
- package/packages/cli-protocol/package.json +40 -0
- package/packages/cli-protocol/src/index.ts +113 -0
- package/packages/client/package.json +46 -0
- package/packages/client/src/ApplicationShell.tsrx +374 -0
- package/packages/client/src/contributions.ts +172 -0
- package/packages/client/src/i18n/index.ts +30 -0
- package/packages/client/src/i18n/locale.ts +25 -0
- package/packages/client/src/i18n/locales/en.json +66 -0
- package/packages/client/src/i18n/locales/pl.json +66 -0
- package/packages/client/src/i18n/runtime.ts +201 -0
- package/packages/client/src/i18n/translations.ts +88 -0
- package/packages/client/src/index.ts +55 -0
- package/packages/client/src/routing.ts +9 -0
- package/packages/client/src/shell/BrandMark.tsrx +10 -0
- package/packages/client/src/shell/CommandPalette.tsrx +79 -0
- package/packages/client/src/shell/ContributionOutlets.tsrx +31 -0
- package/packages/client/src/shell/DashboardView.tsrx +60 -0
- package/packages/client/src/shell/MobileHeader.tsrx +24 -0
- package/packages/client/src/shell/OrganizationSwitcher.tsrx +100 -0
- package/packages/client/src/shell/OverviewCharts.tsrx +167 -0
- package/packages/client/src/shell/PrimaryNavigation.tsrx +75 -0
- package/packages/client/src/shell/Sidebar.tsrx +76 -0
- package/packages/client/src/shell/Topbar.tsrx +44 -0
- package/packages/client/src/shell/UserMenu.tsrx +103 -0
- package/packages/client/src/shell/WorkspaceContent.tsrx +30 -0
- package/packages/client/src/shell/identity.ts +12 -0
- package/packages/client/src/shell/navigation.ts +68 -0
- package/packages/client/src/shell/shell.css +734 -0
- package/packages/client/src/shell/types.ts +29 -0
- package/packages/client/src/state.ts +63 -0
- package/packages/client/src/web.ts +39 -0
- package/packages/coding-agent/package.json +44 -0
- package/packages/coding-agent/src/drivers/byok.ts +322 -0
- package/packages/coding-agent/src/drivers/claude-code.ts +290 -0
- package/packages/coding-agent/src/drivers/codex.ts +281 -0
- package/packages/coding-agent/src/index.ts +56 -0
- package/packages/coding-agent/src/registry.ts +119 -0
- package/packages/coding-agent/src/roles/contract.ts +60 -0
- package/packages/coding-agent/src/roles/defaults.ts +134 -0
- package/packages/coding-agent/src/roles/handoff.ts +41 -0
- package/packages/coding-agent/src/roles/registry.ts +156 -0
- package/packages/coding-agent/src/roles/skills.ts +72 -0
- package/packages/coding-agent/src/roles/sync.ts +88 -0
- package/packages/coding-agent/src/types.ts +102 -0
- package/packages/coding-agent/src/workspace.ts +275 -0
- package/packages/contracts/package.json +38 -0
- package/packages/contracts/schemas/blueprint.schema.json +48 -0
- package/packages/contracts/schemas/cli-extension.schema.json +90 -0
- package/packages/contracts/schemas/module-artifact.schema.json +82 -0
- package/packages/contracts/schemas/module-catalog.schema.json +48 -0
- package/packages/contracts/schemas/module-spec.schema.json +111 -0
- package/packages/contracts/schemas/module.schema.json +156 -0
- package/packages/contracts/schemas/platform-spec.schema.json +17 -0
- package/packages/contracts/schemas/project.schema.json +270 -0
- package/packages/contracts/src/index.ts +191 -0
- package/packages/contracts/src/module-distribution.ts +47 -0
- package/packages/contracts/src/schemas.ts +18 -0
- package/packages/contracts/src/variables.ts +156 -0
- package/packages/contracts/src/web.ts +60 -0
- package/packages/database/package.json +43 -0
- package/packages/database/src/contracts.ts +399 -0
- package/packages/database/src/index.ts +112 -0
- package/packages/database/src/migrations.ts +444 -0
- package/packages/database/src/postgresql.ts +517 -0
- package/packages/database/src/provider.ts +639 -0
- package/packages/database/src/record-history.ts +201 -0
- package/packages/database/src/registry.ts +265 -0
- package/packages/database/src/reset.ts +87 -0
- package/packages/database-pglite/package.json +42 -0
- package/packages/database-pglite/src/driver.ts +168 -0
- package/packages/database-pglite/src/index.ts +2 -0
- package/packages/database-testing/package.json +44 -0
- package/packages/database-testing/src/index.ts +8 -0
- package/packages/database-testing/src/pglite.ts +124 -0
- package/packages/database-testing/src/postgres.ts +184 -0
- package/packages/database-testing/src/provider.ts +43 -0
- package/packages/database-testing/src/vitest-preset.ts +23 -0
- package/packages/dev-console/README.md +6 -0
- package/packages/dev-console/package.json +38 -0
- package/packages/dev-console/src/index.mjs +220 -0
- package/packages/harness/package.json +47 -0
- package/packages/harness/schemas/task-packet.schema.json +48 -0
- package/packages/harness/src/catalog.ts +24 -0
- package/packages/harness/src/errors.ts +9 -0
- package/packages/harness/src/index.ts +53 -0
- package/packages/harness/src/preamble.ts +31 -0
- package/packages/harness/src/runtime.ts +833 -0
- package/packages/harness/src/task-packet.ts +86 -0
- package/packages/harness/src/tool-adapters.ts +106 -0
- package/packages/harness/src/tool-contract.ts +242 -0
- package/packages/harness/src/vercel-ai-provider.ts +198 -0
- package/packages/kernel/package.json +44 -0
- package/packages/kernel/src/acl.ts +20 -0
- package/packages/kernel/src/actor.ts +139 -0
- package/packages/kernel/src/agent-registry.ts +81 -0
- package/packages/kernel/src/capability-registry.ts +28 -0
- package/packages/kernel/src/errors.ts +9 -0
- package/packages/kernel/src/index.ts +90 -0
- package/packages/kernel/src/legacy-local-state.ts +103 -0
- package/packages/kernel/src/module-compatibility.ts +70 -0
- package/packages/kernel/src/module-registry.ts +124 -0
- package/packages/kernel/src/module-settings.ts +403 -0
- package/packages/kernel/src/record-history.ts +146 -0
- package/packages/kernel/src/runtime-config.ts +51 -0
- package/packages/kernel/src/tool-registry.ts +25 -0
- package/packages/kernel/src/variable-registry.ts +339 -0
- package/packages/sandbox/README.md +691 -0
- package/packages/sandbox/bin/flowdular-sandbox.mjs +393 -0
- package/packages/sandbox/dist/client/assets/App-ClMOrpyg.js +11 -0
- package/packages/sandbox/dist/client/assets/PreviewHost-BHiHrfbQ.js +1 -0
- package/packages/sandbox/dist/client/assets/auto-buGEq6de.js +3 -0
- package/packages/sandbox/dist/client/assets/ibm-plex-mono-cyrillic-400-normal-BSMlKf0J.woff2 +0 -0
- package/packages/sandbox/dist/client/assets/ibm-plex-mono-cyrillic-400-normal-CEL4l2ZJ.woff +0 -0
- package/packages/sandbox/dist/client/assets/ibm-plex-mono-cyrillic-500-normal-Ael50iVv.woff +0 -0
- package/packages/sandbox/dist/client/assets/ibm-plex-mono-cyrillic-500-normal-Bq9vWWag.woff2 +0 -0
- package/packages/sandbox/dist/client/assets/ibm-plex-mono-cyrillic-ext-400-normal-DMdlQ8Kv.woff +0 -0
- package/packages/sandbox/dist/client/assets/ibm-plex-mono-cyrillic-ext-400-normal-xuaO2J-f.woff2 +0 -0
- package/packages/sandbox/dist/client/assets/ibm-plex-mono-cyrillic-ext-500-normal-BIfNGwUT.woff +0 -0
- package/packages/sandbox/dist/client/assets/ibm-plex-mono-cyrillic-ext-500-normal-BqneJy0T.woff2 +0 -0
- package/packages/sandbox/dist/client/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
- package/packages/sandbox/dist/client/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
- package/packages/sandbox/dist/client/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
- package/packages/sandbox/dist/client/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
- package/packages/sandbox/dist/client/assets/ibm-plex-mono-latin-ext-400-normal-BmRBH3aV.woff2 +0 -0
- package/packages/sandbox/dist/client/assets/ibm-plex-mono-latin-ext-400-normal-D3D2R8hC.woff +0 -0
- package/packages/sandbox/dist/client/assets/ibm-plex-mono-latin-ext-500-normal-CAhNIIs5.woff2 +0 -0
- package/packages/sandbox/dist/client/assets/ibm-plex-mono-latin-ext-500-normal-CZ70TYgx.woff +0 -0
- package/packages/sandbox/dist/client/assets/ibm-plex-mono-vietnamese-400-normal-BulugwFq.woff2 +0 -0
- package/packages/sandbox/dist/client/assets/ibm-plex-mono-vietnamese-400-normal-DDuiU_S-.woff +0 -0
- package/packages/sandbox/dist/client/assets/ibm-plex-mono-vietnamese-500-normal-C8zxqsMH.woff +0 -0
- package/packages/sandbox/dist/client/assets/ibm-plex-mono-vietnamese-500-normal-DZ4AoWbu.woff2 +0 -0
- package/packages/sandbox/dist/client/assets/ibm-plex-sans-cyrillic-ext-wght-normal-d45eAU9y.woff2 +0 -0
- package/packages/sandbox/dist/client/assets/ibm-plex-sans-cyrillic-wght-normal-BAAhND-U.woff2 +0 -0
- package/packages/sandbox/dist/client/assets/ibm-plex-sans-greek-wght-normal-CmyJS8uq.woff2 +0 -0
- package/packages/sandbox/dist/client/assets/ibm-plex-sans-latin-ext-wght-normal-CIII54If.woff2 +0 -0
- package/packages/sandbox/dist/client/assets/ibm-plex-sans-latin-wght-normal-IvpUvPa2.woff2 +0 -0
- package/packages/sandbox/dist/client/assets/ibm-plex-sans-vietnamese-wght-normal-Dg1JeJN0.woff2 +0 -0
- package/packages/sandbox/dist/client/assets/index-CvwhlQ87.js +4 -0
- package/packages/sandbox/dist/client/assets/styles-BPWaGf55.js +3 -0
- package/packages/sandbox/dist/client/assets/styles-Dx1_KOag.css +1 -0
- package/packages/sandbox/dist/client/favicon.svg +1 -0
- package/packages/sandbox/dist/server/assets/auto-CVGNYyb3.js +12785 -0
- package/packages/sandbox/dist/server/assets/chunk-DDJLRBDX-3OUNo51g.js +4125 -0
- package/packages/sandbox/dist/server/assets/nodefs-DVSI7kG0.js +24 -0
- package/packages/sandbox/dist/server/assets/opfs-ahp-D56iokt1.js +388 -0
- package/packages/sandbox/dist/server/assets/token-Bvaq7Anz.js +55 -0
- package/packages/sandbox/dist/server/assets/token-util-BqSvdIPQ.js +3 -0
- package/packages/sandbox/dist/server/assets/token-util-CktFFT4z.js +494 -0
- package/packages/sandbox/dist/server/entry.js +91671 -0
- package/packages/sandbox/dist/server/favicon.svg +1 -0
- package/packages/sandbox/dist/server/index.html +161 -0
- package/packages/sandbox/index.html +159 -0
- package/packages/sandbox/octane.config.ts +36 -0
- package/packages/sandbox/package.json +83 -0
- package/packages/sandbox/public/favicon.svg +1 -0
- package/packages/sandbox/public/og.png +0 -0
- package/packages/sandbox/src/App.tsrx +924 -0
- package/packages/sandbox/src/client/ApprovalHandoff.tsrx +39 -0
- package/packages/sandbox/src/client/ChatPane.tsrx +694 -0
- package/packages/sandbox/src/client/ConnectView.tsrx +86 -0
- package/packages/sandbox/src/client/DiffPane.tsrx +150 -0
- package/packages/sandbox/src/client/EjectModal.tsrx +571 -0
- package/packages/sandbox/src/client/GateResults.tsrx +60 -0
- package/packages/sandbox/src/client/GitHubSettingsModal.tsrx +219 -0
- package/packages/sandbox/src/client/NewSessionForm.tsrx +214 -0
- package/packages/sandbox/src/client/SessionBar.tsrx +151 -0
- package/packages/sandbox/src/client/SessionPicker.tsrx +472 -0
- package/packages/sandbox/src/client/SpecEditor.tsrx +109 -0
- package/packages/sandbox/src/client/SpecReviewCard.tsrx +321 -0
- package/packages/sandbox/src/client/WorkCard.tsrx +128 -0
- package/packages/sandbox/src/client/WorkbenchModal.tsrx +161 -0
- package/packages/sandbox/src/client/WorkspaceMenu.tsrx +100 -0
- package/packages/sandbox/src/client/api.ts +797 -0
- package/packages/sandbox/src/client/attachments.ts +73 -0
- package/packages/sandbox/src/client/dashboard.ts +46 -0
- package/packages/sandbox/src/client/github-settings.ts +48 -0
- package/packages/sandbox/src/client/highlight.ts +105 -0
- package/packages/sandbox/src/client/i18n.ts +32 -0
- package/packages/sandbox/src/client/locales/en.json +466 -0
- package/packages/sandbox/src/client/locales/pl.json +466 -0
- package/packages/sandbox/src/client/session-labels.ts +77 -0
- package/packages/sandbox/src/client/state.ts +108 -0
- package/packages/sandbox/src/index.ts +10 -0
- package/packages/sandbox/src/preview/PreviewHost.tsrx +373 -0
- package/packages/sandbox/src/preview/load-module.ts +16 -0
- package/packages/sandbox/src/server/attachments.ts +308 -0
- package/packages/sandbox/src/server/auto-review.ts +181 -0
- package/packages/sandbox/src/server/checkpoints.ts +90 -0
- package/packages/sandbox/src/server/config.ts +460 -0
- package/packages/sandbox/src/server/dashboard.ts +245 -0
- package/packages/sandbox/src/server/delivery/configuration.ts +193 -0
- package/packages/sandbox/src/server/delivery/git-pr.ts +1473 -0
- package/packages/sandbox/src/server/delivery/index.ts +83 -0
- package/packages/sandbox/src/server/delivery/local.ts +151 -0
- package/packages/sandbox/src/server/delivery/official-modules.ts +516 -0
- package/packages/sandbox/src/server/delivery/plan.ts +218 -0
- package/packages/sandbox/src/server/delivery/policies.ts +239 -0
- package/packages/sandbox/src/server/delivery/record.ts +41 -0
- package/packages/sandbox/src/server/delivery/steps.ts +464 -0
- package/packages/sandbox/src/server/delivery/types.ts +158 -0
- package/packages/sandbox/src/server/dependencies.ts +88 -0
- package/packages/sandbox/src/server/diff.ts +230 -0
- package/packages/sandbox/src/server/gates.ts +388 -0
- package/packages/sandbox/src/server/index.ts +139 -0
- package/packages/sandbox/src/server/path-guard.ts +282 -0
- package/packages/sandbox/src/server/planning.ts +749 -0
- package/packages/sandbox/src/server/platform-client.ts +189 -0
- package/packages/sandbox/src/server/preview-database-host.ts +340 -0
- package/packages/sandbox/src/server/preview-database-protocol.ts +163 -0
- package/packages/sandbox/src/server/preview-database-proxy.ts +356 -0
- package/packages/sandbox/src/server/preview-database.ts +109 -0
- package/packages/sandbox/src/server/preview-ipc.ts +15 -0
- package/packages/sandbox/src/server/preview-modules.ts +83 -0
- package/packages/sandbox/src/server/preview-revision.ts +44 -0
- package/packages/sandbox/src/server/preview-runtime.ts +467 -0
- package/packages/sandbox/src/server/preview-worker-manager.ts +436 -0
- package/packages/sandbox/src/server/preview-worker.ts +168 -0
- package/packages/sandbox/src/server/reference.ts +251 -0
- package/packages/sandbox/src/server/routes.ts +2258 -0
- package/packages/sandbox/src/server/runtime.ts +188 -0
- package/packages/sandbox/src/server/session-owner.ts +23 -0
- package/packages/sandbox/src/server/sessions.ts +849 -0
- package/packages/sandbox/src/server/spec.ts +471 -0
- package/packages/sandbox/src/server/turn-lifecycle.ts +56 -0
- package/packages/sandbox/src/server/turns.ts +993 -0
- package/packages/sandbox/src/server/workspace-install.ts +266 -0
- package/packages/sandbox/src/server/workspace-root.ts +73 -0
- package/packages/sandbox/src/styles.css +1573 -0
- package/packages/sandbox/vite.config.ts +133 -0
- package/packages/server/package.json +43 -0
- package/packages/server/src/application-routes.ts +21 -0
- package/packages/server/src/composition.ts +48 -0
- package/packages/server/src/endpoint.ts +142 -0
- package/packages/server/src/http.ts +128 -0
- package/packages/server/src/index.ts +46 -0
- package/packages/server/src/response-lifetime.ts +56 -0
- package/packages/server/src/security-headers.ts +130 -0
- package/packages/server/src/web-html.ts +55 -0
- package/packages/server/src/web.ts +361 -0
- package/packages/ui/package.json +46 -0
- package/packages/ui/src/brand/BrandMark.tsrx +66 -0
- package/packages/ui/src/brand/mark.ts +44 -0
- package/packages/ui/src/components/Alert.tsrx +17 -0
- package/packages/ui/src/components/Avatar.tsrx +18 -0
- package/packages/ui/src/components/Button.tsrx +29 -0
- package/packages/ui/src/components/Chart.tsrx +274 -0
- package/packages/ui/src/components/CheckGrid.tsrx +93 -0
- package/packages/ui/src/components/ConfirmDialog.tsrx +63 -0
- package/packages/ui/src/components/Drawer.tsrx +71 -0
- package/packages/ui/src/components/EmptyState.tsrx +26 -0
- package/packages/ui/src/components/Filters.tsrx +39 -0
- package/packages/ui/src/components/FormField.tsrx +27 -0
- package/packages/ui/src/components/Kpi.tsrx +36 -0
- package/packages/ui/src/components/PageHeader.tsrx +26 -0
- package/packages/ui/src/components/ScopeSummary.tsrx +76 -0
- package/packages/ui/src/components/SearchField.tsrx +24 -0
- package/packages/ui/src/components/SettingRow.tsrx +50 -0
- package/packages/ui/src/components/Switch.tsrx +21 -0
- package/packages/ui/src/components/Table.tsrx +267 -0
- package/packages/ui/src/components/TableCard.tsrx +52 -0
- package/packages/ui/src/components/Tag.tsrx +28 -0
- package/packages/ui/src/components/VariableField.tsrx +284 -0
- package/packages/ui/src/components/VariableInput.tsrx +7 -0
- package/packages/ui/src/components/VariableSelect.tsrx +72 -0
- package/packages/ui/src/components/VariableTextarea.tsrx +9 -0
- package/packages/ui/src/components/variable-field.ts +61 -0
- package/packages/ui/src/components/variable-select.ts +69 -0
- package/packages/ui/src/icons/Icon.tsrx +56 -0
- package/packages/ui/src/index.ts +81 -0
- package/packages/ui/src/initials.ts +10 -0
- package/packages/ui/src/styles/base.css +71 -0
- package/packages/ui/src/styles/components.css +1859 -0
- package/packages/ui/src/styles/index.css +3 -0
- package/packages/ui/src/styles/tokens.css +124 -0
- package/tsconfig.base.json +18 -0
|
@@ -0,0 +1,705 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import type { Middleware } from '@octanejs/app-core';
|
|
4
|
+
import {
|
|
5
|
+
DATABASE_CAPABILITY_IDS,
|
|
6
|
+
DATABASE_DIALECT_IDS,
|
|
7
|
+
type DatabaseAdapterLease,
|
|
8
|
+
type DatabaseProvider,
|
|
9
|
+
type DatabaseProviderRequest,
|
|
10
|
+
} from '@flowdular/sdk/database';
|
|
11
|
+
import {
|
|
12
|
+
createModuleSettingsRuntime as createKernelSettingsRuntime,
|
|
13
|
+
normalizeActor,
|
|
14
|
+
PLATFORM_SETTINGS_TENANT,
|
|
15
|
+
type Actor,
|
|
16
|
+
type ModuleSettingsRuntime,
|
|
17
|
+
} from '@flowdular/sdk/kernel';
|
|
18
|
+
import {
|
|
19
|
+
createSecurityHeadersMiddleware,
|
|
20
|
+
DEVELOPMENT_CONTENT_SECURITY_POLICY,
|
|
21
|
+
PRODUCTION_CONTENT_SECURITY_POLICY,
|
|
22
|
+
} from '@flowdular/sdk/server';
|
|
23
|
+
import { createAuthenticationMiddleware } from '../middleware/authentication.ts';
|
|
24
|
+
import { AuthService, type AuthPolicy } from '../services/auth-service.ts';
|
|
25
|
+
import {
|
|
26
|
+
DatabaseAuthRepository,
|
|
27
|
+
migrateAuthDatabase,
|
|
28
|
+
} from '../services/database-repository.ts';
|
|
29
|
+
import {
|
|
30
|
+
DevelopmentMailDelivery,
|
|
31
|
+
type AuthMailDelivery,
|
|
32
|
+
} from '../services/mail-delivery.ts';
|
|
33
|
+
import type { AuthRepository } from '../services/repository.ts';
|
|
34
|
+
import {
|
|
35
|
+
createAuthSettingsStore,
|
|
36
|
+
type AuthSettingsStore,
|
|
37
|
+
} from '../services/settings-store.ts';
|
|
38
|
+
import type { AuthCookieConfig } from '../api/cookies.ts';
|
|
39
|
+
import {
|
|
40
|
+
createAuthModuleSettings,
|
|
41
|
+
DEFAULT_PASSWORD_MIN_LENGTH,
|
|
42
|
+
DEFAULT_SESSION_IDLE_MINUTES,
|
|
43
|
+
DEFAULT_SESSION_TTL_HOURS,
|
|
44
|
+
parseProviderList,
|
|
45
|
+
type AuthSettings,
|
|
46
|
+
} from '../settings.ts';
|
|
47
|
+
|
|
48
|
+
export interface AuthRuntimeOptions extends AuthRuntimeEnvironmentOptions {
|
|
49
|
+
/** Platform-owned provider. auth.core never receives a DSN or a pool. */
|
|
50
|
+
readonly databases: DatabaseProvider;
|
|
51
|
+
/** Tenant-scoped lease purpose; `migration` is taken and released internally. */
|
|
52
|
+
readonly purpose?: Exclude<DatabaseProviderRequest['purpose'], 'migration'>;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** Everything the process environment can decide on its own. */
|
|
56
|
+
export interface AuthRuntimeEnvironmentOptions {
|
|
57
|
+
readonly secureCookies: boolean;
|
|
58
|
+
/* Applications that share a host with the platform must not share its
|
|
59
|
+
session cookie; cookies ignore the port. */
|
|
60
|
+
readonly cookieName?: string;
|
|
61
|
+
/* The remaining values are deployment defaults for the declared auth.core
|
|
62
|
+
settings; a value stored through the Settings screen wins at read time. */
|
|
63
|
+
readonly sessionTtlMs: number;
|
|
64
|
+
readonly sessionIdleMs?: number;
|
|
65
|
+
readonly passwordMinLength?: number;
|
|
66
|
+
readonly allowSignUp: boolean;
|
|
67
|
+
readonly emailConfirmation: boolean;
|
|
68
|
+
readonly signInProviders: readonly string[];
|
|
69
|
+
/** Locales a tenant may pick as default; from flowdular.json when known. */
|
|
70
|
+
readonly locales?: readonly string[];
|
|
71
|
+
readonly workspaceRoot?: string;
|
|
72
|
+
/** Honor x-forwarded-for; only behind a reverse proxy that sets it. */
|
|
73
|
+
readonly trustProxy?: boolean;
|
|
74
|
+
/** True once a mail transport is composed; gates email confirmation. */
|
|
75
|
+
readonly mailTransport?: boolean;
|
|
76
|
+
readonly mailDelivery?: AuthMailDelivery;
|
|
77
|
+
readonly mfaEncryptionKey?: string;
|
|
78
|
+
readonly publicBaseUrl?: string;
|
|
79
|
+
readonly oidcProviders?: readonly OidcProvider[];
|
|
80
|
+
readonly production?: boolean;
|
|
81
|
+
readonly contentSecurityPolicy?: string | null;
|
|
82
|
+
readonly contentSecurityPolicyReportOnly?: boolean;
|
|
83
|
+
/** Share an existing settings runtime instead of opening one of its own. */
|
|
84
|
+
readonly settings?: ModuleSettingsRuntime;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export interface OidcProvider {
|
|
88
|
+
readonly id: string;
|
|
89
|
+
readonly authorizationEndpoint: string;
|
|
90
|
+
readonly tokenEndpoint: string;
|
|
91
|
+
readonly userInfoEndpoint: string;
|
|
92
|
+
readonly clientId: string;
|
|
93
|
+
readonly clientSecret: string;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export interface AuthRuntime {
|
|
97
|
+
readonly cookie: AuthCookieConfig;
|
|
98
|
+
readonly middleware: Middleware;
|
|
99
|
+
/** Live view of the declared auth.core settings. */
|
|
100
|
+
readonly settings: AuthSettings;
|
|
101
|
+
readonly moduleSettings: ModuleSettingsRuntime;
|
|
102
|
+
readonly trustProxy: boolean;
|
|
103
|
+
readonly mailTransport: boolean;
|
|
104
|
+
readonly workspaceRoot: string | null;
|
|
105
|
+
readonly oidcProviders: readonly OidcProvider[];
|
|
106
|
+
readonly publicBaseUrl: string | null;
|
|
107
|
+
/* Resolves once the schema is migrated and the leases are held. Concurrent
|
|
108
|
+
first callers await the same initialization. */
|
|
109
|
+
service(): Promise<AuthService>;
|
|
110
|
+
/* Re-read at the point of use. A stored run snapshot is only a ceiling and
|
|
111
|
+
never substitutes for the actor's current membership. */
|
|
112
|
+
authorizeAgentToolAccess(
|
|
113
|
+
tenantId: string,
|
|
114
|
+
actor: Actor,
|
|
115
|
+
): Promise<readonly string[]>;
|
|
116
|
+
/**
|
|
117
|
+
* Resolves once every settings audit row accepted so far has been written.
|
|
118
|
+
* The kernel change listener is synchronous, so the write is started after
|
|
119
|
+
* it returns; a caller that must observe the trail waits on this first.
|
|
120
|
+
*/
|
|
121
|
+
settingsAuditSettled(): Promise<void>;
|
|
122
|
+
/** Terminal, idempotent release used by platform HMR and process shutdown. */
|
|
123
|
+
dispose(): Promise<void>;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function booleanEnvironment(
|
|
127
|
+
value: string | undefined,
|
|
128
|
+
fallback: boolean,
|
|
129
|
+
name: string,
|
|
130
|
+
): boolean {
|
|
131
|
+
if (value === undefined) return fallback;
|
|
132
|
+
if (value === 'true') return true;
|
|
133
|
+
if (value === 'false') return false;
|
|
134
|
+
throw new Error(`${name} must be true or false.`);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function integerEnvironment(
|
|
138
|
+
value: string | undefined,
|
|
139
|
+
fallback: number,
|
|
140
|
+
name: string,
|
|
141
|
+
min: number,
|
|
142
|
+
max: number,
|
|
143
|
+
): number {
|
|
144
|
+
if (value === undefined || value.trim() === '') return fallback;
|
|
145
|
+
const parsed = Number(value);
|
|
146
|
+
if (!Number.isSafeInteger(parsed) || parsed < min || parsed > max) {
|
|
147
|
+
throw new Error(`${name} must be an integer between ${min} and ${max}.`);
|
|
148
|
+
}
|
|
149
|
+
return parsed;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const PROVIDER_PATTERN = /^[a-z][a-z0-9-]{1,30}$/;
|
|
153
|
+
|
|
154
|
+
function providersEnvironment(
|
|
155
|
+
value: string | undefined,
|
|
156
|
+
name: string,
|
|
157
|
+
): readonly string[] {
|
|
158
|
+
if (value === undefined || value.trim() === '') return [];
|
|
159
|
+
const providers = parseProviderList(value);
|
|
160
|
+
for (const provider of providers) {
|
|
161
|
+
if (!PROVIDER_PATTERN.test(provider)) {
|
|
162
|
+
throw new Error(`${name} contains an invalid provider id: ${provider}`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return providers;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function oidcProvidersEnvironment(
|
|
169
|
+
value: string | undefined,
|
|
170
|
+
): readonly OidcProvider[] {
|
|
171
|
+
if (!value?.trim()) return [];
|
|
172
|
+
let parsed: unknown;
|
|
173
|
+
try {
|
|
174
|
+
parsed = JSON.parse(value);
|
|
175
|
+
} catch {
|
|
176
|
+
throw new Error('FD_AUTH_OIDC_PROVIDERS must be valid JSON.');
|
|
177
|
+
}
|
|
178
|
+
if (!Array.isArray(parsed) || parsed.length > 8)
|
|
179
|
+
throw new Error(
|
|
180
|
+
'FD_AUTH_OIDC_PROVIDERS must be an array of at most eight providers.',
|
|
181
|
+
);
|
|
182
|
+
return parsed.map((entry): OidcProvider => {
|
|
183
|
+
if (!entry || typeof entry !== 'object')
|
|
184
|
+
throw new Error('OIDC provider configuration is invalid.');
|
|
185
|
+
const source = entry as Record<string, unknown>;
|
|
186
|
+
const text = (key: string): string => {
|
|
187
|
+
const value = source[key];
|
|
188
|
+
if (typeof value !== 'string' || value.trim().length === 0)
|
|
189
|
+
throw new Error('OIDC provider configuration is incomplete.');
|
|
190
|
+
return value.trim();
|
|
191
|
+
};
|
|
192
|
+
const id = text('id').toLowerCase();
|
|
193
|
+
if (!PROVIDER_PATTERN.test(id))
|
|
194
|
+
throw new Error('OIDC provider id is invalid.');
|
|
195
|
+
const authorizationEndpoint = text('authorizationEndpoint');
|
|
196
|
+
const tokenEndpoint = text('tokenEndpoint');
|
|
197
|
+
const userInfoEndpoint = text('userInfoEndpoint');
|
|
198
|
+
for (const value of [
|
|
199
|
+
authorizationEndpoint,
|
|
200
|
+
tokenEndpoint,
|
|
201
|
+
userInfoEndpoint,
|
|
202
|
+
]) {
|
|
203
|
+
try {
|
|
204
|
+
if (new URL(value).protocol !== 'https:') throw new Error();
|
|
205
|
+
} catch {
|
|
206
|
+
throw new Error('OIDC endpoints must use valid HTTPS URLs.');
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return {
|
|
210
|
+
id,
|
|
211
|
+
authorizationEndpoint,
|
|
212
|
+
tokenEndpoint,
|
|
213
|
+
userInfoEndpoint,
|
|
214
|
+
clientId: text('clientId'),
|
|
215
|
+
clientSecret: text('clientSecret'),
|
|
216
|
+
};
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
function assertMfaEncryptionKey(value: string, label: string): void {
|
|
221
|
+
const hex = /^[0-9a-f]{64}$/i.test(value);
|
|
222
|
+
const base64url = /^[A-Za-z0-9_-]{43}=?$/.test(value);
|
|
223
|
+
const bytes = Buffer.from(value, hex ? 'hex' : 'base64url');
|
|
224
|
+
if ((!hex && !base64url) || bytes.byteLength !== 32) {
|
|
225
|
+
throw new Error(`${label} must encode exactly 32 bytes.`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
function publicOriginEnvironment(
|
|
230
|
+
value: string | undefined,
|
|
231
|
+
): string | undefined {
|
|
232
|
+
if (!value?.trim()) return undefined;
|
|
233
|
+
let url: URL;
|
|
234
|
+
try {
|
|
235
|
+
url = new URL(value);
|
|
236
|
+
} catch {
|
|
237
|
+
throw new Error('FD_AUTH_PUBLIC_ORIGIN must be an absolute URL.');
|
|
238
|
+
}
|
|
239
|
+
if (url.username || url.password) {
|
|
240
|
+
throw new Error('FD_AUTH_PUBLIC_ORIGIN must not contain URL credentials.');
|
|
241
|
+
}
|
|
242
|
+
if (url.pathname !== '/' || url.search || url.hash) {
|
|
243
|
+
throw new Error('FD_AUTH_PUBLIC_ORIGIN must contain only an origin.');
|
|
244
|
+
}
|
|
245
|
+
const loopback =
|
|
246
|
+
url.hostname === 'localhost' ||
|
|
247
|
+
url.hostname === '::1' ||
|
|
248
|
+
url.hostname === '[::1]' ||
|
|
249
|
+
/^127(?:\.\d{1,3}){3}$/.test(url.hostname);
|
|
250
|
+
if (url.protocol !== 'https:' && !(url.protocol === 'http:' && loopback)) {
|
|
251
|
+
throw new Error(
|
|
252
|
+
'FD_AUTH_PUBLIC_ORIGIN must use HTTPS unless it is a loopback origin.',
|
|
253
|
+
);
|
|
254
|
+
}
|
|
255
|
+
return url.origin;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/* The tenant default locale is validated against the workspace locales; a
|
|
259
|
+
missing or unreadable flowdular.json falls back to the module's own list. */
|
|
260
|
+
function workspaceLocales(
|
|
261
|
+
workspaceRoot: string,
|
|
262
|
+
): readonly string[] | undefined {
|
|
263
|
+
try {
|
|
264
|
+
const config = JSON.parse(
|
|
265
|
+
readFileSync(resolve(workspaceRoot, 'flowdular.json'), 'utf8'),
|
|
266
|
+
) as { locales?: unknown };
|
|
267
|
+
return Array.isArray(config.locales) &&
|
|
268
|
+
config.locales.every((entry) => typeof entry === 'string')
|
|
269
|
+
? (config.locales as string[])
|
|
270
|
+
: undefined;
|
|
271
|
+
} catch {
|
|
272
|
+
return undefined;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/* The database is not one of them: composition owns the provider and passes it
|
|
277
|
+
to createAuthRuntime alongside this result. */
|
|
278
|
+
export function authRuntimeOptionsFromEnvironment(
|
|
279
|
+
environment: NodeJS.ProcessEnv = process.env,
|
|
280
|
+
workspaceRoot = process.cwd(),
|
|
281
|
+
): AuthRuntimeEnvironmentOptions {
|
|
282
|
+
const production = environment.NODE_ENV === 'production';
|
|
283
|
+
const developmentMail = booleanEnvironment(
|
|
284
|
+
environment.FD_AUTH_DEVELOPMENT_MAIL,
|
|
285
|
+
false,
|
|
286
|
+
'FD_AUTH_DEVELOPMENT_MAIL',
|
|
287
|
+
);
|
|
288
|
+
if (developmentMail && production) {
|
|
289
|
+
throw new Error(
|
|
290
|
+
'FD_AUTH_DEVELOPMENT_MAIL is only allowed outside production.',
|
|
291
|
+
);
|
|
292
|
+
}
|
|
293
|
+
const mailDelivery = developmentMail
|
|
294
|
+
? new DevelopmentMailDelivery()
|
|
295
|
+
: undefined;
|
|
296
|
+
const mailTransport = mailDelivery !== undefined;
|
|
297
|
+
const emailConfirmation = booleanEnvironment(
|
|
298
|
+
environment.FD_AUTH_EMAIL_CONFIRMATION,
|
|
299
|
+
false,
|
|
300
|
+
'FD_AUTH_EMAIL_CONFIRMATION',
|
|
301
|
+
);
|
|
302
|
+
if (emailConfirmation && !mailTransport) {
|
|
303
|
+
throw new Error(
|
|
304
|
+
'FD_AUTH_EMAIL_CONFIRMATION requires a composed mail transport; none is available.',
|
|
305
|
+
);
|
|
306
|
+
}
|
|
307
|
+
if (environment.FD_AUTH_MFA_KEY) {
|
|
308
|
+
assertMfaEncryptionKey(environment.FD_AUTH_MFA_KEY, 'FD_AUTH_MFA_KEY');
|
|
309
|
+
}
|
|
310
|
+
const publicBaseUrl = publicOriginEnvironment(
|
|
311
|
+
environment.FD_AUTH_PUBLIC_ORIGIN,
|
|
312
|
+
);
|
|
313
|
+
const locales = workspaceLocales(workspaceRoot);
|
|
314
|
+
return {
|
|
315
|
+
secureCookies: booleanEnvironment(
|
|
316
|
+
environment.FD_AUTH_SECURE_COOKIE,
|
|
317
|
+
production,
|
|
318
|
+
'FD_AUTH_SECURE_COOKIE',
|
|
319
|
+
),
|
|
320
|
+
sessionTtlMs:
|
|
321
|
+
integerEnvironment(
|
|
322
|
+
environment.FD_AUTH_SESSION_TTL_HOURS,
|
|
323
|
+
DEFAULT_SESSION_TTL_HOURS,
|
|
324
|
+
'FD_AUTH_SESSION_TTL_HOURS',
|
|
325
|
+
1,
|
|
326
|
+
168,
|
|
327
|
+
) *
|
|
328
|
+
60 *
|
|
329
|
+
60 *
|
|
330
|
+
1000,
|
|
331
|
+
sessionIdleMs:
|
|
332
|
+
integerEnvironment(
|
|
333
|
+
environment.FD_AUTH_SESSION_IDLE_MINUTES,
|
|
334
|
+
DEFAULT_SESSION_IDLE_MINUTES,
|
|
335
|
+
'FD_AUTH_SESSION_IDLE_MINUTES',
|
|
336
|
+
5,
|
|
337
|
+
1440,
|
|
338
|
+
) *
|
|
339
|
+
60 *
|
|
340
|
+
1000,
|
|
341
|
+
passwordMinLength: integerEnvironment(
|
|
342
|
+
environment.FD_AUTH_PASSWORD_MIN_LENGTH,
|
|
343
|
+
DEFAULT_PASSWORD_MIN_LENGTH,
|
|
344
|
+
'FD_AUTH_PASSWORD_MIN_LENGTH',
|
|
345
|
+
8,
|
|
346
|
+
128,
|
|
347
|
+
),
|
|
348
|
+
// Public registration stays opt-in for production deployments.
|
|
349
|
+
allowSignUp: booleanEnvironment(
|
|
350
|
+
environment.FD_AUTH_ALLOW_SIGN_UP,
|
|
351
|
+
!production,
|
|
352
|
+
'FD_AUTH_ALLOW_SIGN_UP',
|
|
353
|
+
),
|
|
354
|
+
emailConfirmation,
|
|
355
|
+
signInProviders: providersEnvironment(
|
|
356
|
+
environment.FD_AUTH_SIGN_IN_PROVIDERS,
|
|
357
|
+
'FD_AUTH_SIGN_IN_PROVIDERS',
|
|
358
|
+
),
|
|
359
|
+
oidcProviders: oidcProvidersEnvironment(environment.FD_AUTH_OIDC_PROVIDERS),
|
|
360
|
+
...(locales ? { locales } : {}),
|
|
361
|
+
workspaceRoot,
|
|
362
|
+
trustProxy: booleanEnvironment(
|
|
363
|
+
environment.FD_TRUST_PROXY,
|
|
364
|
+
false,
|
|
365
|
+
'FD_TRUST_PROXY',
|
|
366
|
+
),
|
|
367
|
+
mailTransport,
|
|
368
|
+
...(mailDelivery ? { mailDelivery } : {}),
|
|
369
|
+
...(environment.FD_AUTH_MFA_KEY
|
|
370
|
+
? { mfaEncryptionKey: environment.FD_AUTH_MFA_KEY }
|
|
371
|
+
: {}),
|
|
372
|
+
...(publicBaseUrl ? { publicBaseUrl } : {}),
|
|
373
|
+
production,
|
|
374
|
+
contentSecurityPolicy:
|
|
375
|
+
environment.FD_CSP?.trim() ||
|
|
376
|
+
(production
|
|
377
|
+
? PRODUCTION_CONTENT_SECURITY_POLICY
|
|
378
|
+
: DEVELOPMENT_CONTENT_SECURITY_POLICY),
|
|
379
|
+
contentSecurityPolicyReportOnly: booleanEnvironment(
|
|
380
|
+
environment.FD_CSP_REPORT_ONLY,
|
|
381
|
+
!production,
|
|
382
|
+
'FD_CSP_REPORT_ONLY',
|
|
383
|
+
),
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
function cookieName(options: AuthRuntimeOptions): string {
|
|
388
|
+
const configured = options.cookieName?.trim();
|
|
389
|
+
if (!configured) {
|
|
390
|
+
return options.secureCookies
|
|
391
|
+
? '__Host-coreloom_session'
|
|
392
|
+
: 'coreloom_session_dev';
|
|
393
|
+
}
|
|
394
|
+
if (!/^[A-Za-z0-9_-]{4,64}$/.test(configured)) {
|
|
395
|
+
throw new Error('Session cookie name contains unsupported characters.');
|
|
396
|
+
}
|
|
397
|
+
if (options.secureCookies && !configured.startsWith('__Host-')) {
|
|
398
|
+
throw new Error(
|
|
399
|
+
'A secure session cookie name must use the __Host- prefix.',
|
|
400
|
+
);
|
|
401
|
+
}
|
|
402
|
+
return configured;
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
const EXPIRED_SESSION_SWEEP_MS = 15 * 60 * 1000;
|
|
406
|
+
|
|
407
|
+
const RUNTIME_REQUIREMENTS = {
|
|
408
|
+
dialectIds: [DATABASE_DIALECT_IDS.postgresql],
|
|
409
|
+
capabilities: [DATABASE_CAPABILITY_IDS.TRANSACTIONS],
|
|
410
|
+
} as const;
|
|
411
|
+
|
|
412
|
+
const MIGRATION_REQUIREMENTS = {
|
|
413
|
+
dialectIds: [DATABASE_DIALECT_IDS.postgresql],
|
|
414
|
+
capabilities: [
|
|
415
|
+
DATABASE_CAPABILITY_IDS.MIGRATION_LOCK,
|
|
416
|
+
DATABASE_CAPABILITY_IDS.SCHEMA_INTROSPECTION,
|
|
417
|
+
DATABASE_CAPABILITY_IDS.TRANSACTIONAL_DDL,
|
|
418
|
+
],
|
|
419
|
+
} as const;
|
|
420
|
+
|
|
421
|
+
interface OpenedAuthDatabase {
|
|
422
|
+
readonly repository: AuthRepository;
|
|
423
|
+
readonly leases: readonly DatabaseAdapterLease[];
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
/* The schema is owned by the migration role and released before any request
|
|
427
|
+
can run: the tenant-scoped runtime role never holds DDL rights. The
|
|
428
|
+
background lease is the read-only role that answers which workspace owns a
|
|
429
|
+
session token, a bearer token, an invitation or an email address. */
|
|
430
|
+
async function openAuthDatabase(
|
|
431
|
+
databases: DatabaseProvider,
|
|
432
|
+
purpose: Exclude<DatabaseProviderRequest['purpose'], 'migration'>,
|
|
433
|
+
): Promise<OpenedAuthDatabase> {
|
|
434
|
+
const migration = await databases.acquire({
|
|
435
|
+
namespace: 'auth.core',
|
|
436
|
+
purpose: 'migration',
|
|
437
|
+
requirements: MIGRATION_REQUIREMENTS,
|
|
438
|
+
});
|
|
439
|
+
try {
|
|
440
|
+
await migrateAuthDatabase(migration.database);
|
|
441
|
+
} finally {
|
|
442
|
+
await migration.release();
|
|
443
|
+
}
|
|
444
|
+
const runtime = await databases.acquire({
|
|
445
|
+
namespace: 'auth.core',
|
|
446
|
+
purpose,
|
|
447
|
+
requirements: RUNTIME_REQUIREMENTS,
|
|
448
|
+
});
|
|
449
|
+
try {
|
|
450
|
+
const background = await databases.acquire({
|
|
451
|
+
namespace: 'auth.core',
|
|
452
|
+
purpose: 'background',
|
|
453
|
+
requirements: RUNTIME_REQUIREMENTS,
|
|
454
|
+
});
|
|
455
|
+
return {
|
|
456
|
+
repository: new DatabaseAuthRepository({
|
|
457
|
+
runtime: runtime.database,
|
|
458
|
+
background: background.database,
|
|
459
|
+
}),
|
|
460
|
+
leases: [runtime, background],
|
|
461
|
+
};
|
|
462
|
+
} catch (error) {
|
|
463
|
+
/* A deployment that declares no cross-tenant role is refused here. The
|
|
464
|
+
lease already taken goes back before the error leaves. */
|
|
465
|
+
await runtime.release();
|
|
466
|
+
throw error;
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
export interface AuthModuleSettingsRuntime {
|
|
471
|
+
readonly settings: ModuleSettingsRuntime;
|
|
472
|
+
/** Resolves once every pending settings read and write has landed. */
|
|
473
|
+
ready(): Promise<void>;
|
|
474
|
+
dispose(): Promise<void>;
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
/* Standalone settings runtime over the auth.core namespace, for a composition
|
|
478
|
+
root or a CLI that needs settings without the rest of the auth runtime. */
|
|
479
|
+
export function createModuleSettingsRuntime(options: {
|
|
480
|
+
readonly databases: DatabaseProvider;
|
|
481
|
+
readonly purpose?: Exclude<DatabaseProviderRequest['purpose'], 'migration'>;
|
|
482
|
+
}): AuthModuleSettingsRuntime {
|
|
483
|
+
let opened: Promise<OpenedAuthDatabase> | undefined;
|
|
484
|
+
const open = () =>
|
|
485
|
+
(opened ??= openAuthDatabase(
|
|
486
|
+
options.databases,
|
|
487
|
+
options.purpose ?? 'runtime',
|
|
488
|
+
));
|
|
489
|
+
const store = createAuthSettingsStore(async () => (await open()).repository);
|
|
490
|
+
return {
|
|
491
|
+
settings: createKernelSettingsRuntime(store),
|
|
492
|
+
ready: () => store.ready(),
|
|
493
|
+
async dispose() {
|
|
494
|
+
const pending = opened;
|
|
495
|
+
opened = undefined;
|
|
496
|
+
if (!pending) return;
|
|
497
|
+
await store.ready().catch(() => undefined);
|
|
498
|
+
const database = await pending.catch(() => undefined);
|
|
499
|
+
for (const lease of database?.leases ?? []) await lease.release();
|
|
500
|
+
},
|
|
501
|
+
};
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
export function createAuthRuntime(options: AuthRuntimeOptions): AuthRuntime {
|
|
505
|
+
if (options.mfaEncryptionKey) {
|
|
506
|
+
assertMfaEncryptionKey(options.mfaEncryptionKey, 'The MFA encryption key');
|
|
507
|
+
}
|
|
508
|
+
let opened: Promise<OpenedAuthDatabase> | undefined;
|
|
509
|
+
let servicePromise: Promise<AuthService> | undefined;
|
|
510
|
+
let sessionSweep: ReturnType<typeof setInterval> | undefined;
|
|
511
|
+
let disposed = false;
|
|
512
|
+
const open = (): Promise<OpenedAuthDatabase> => {
|
|
513
|
+
if (disposed) throw new Error('Auth runtime is disposed.');
|
|
514
|
+
return (opened ??= openAuthDatabase(
|
|
515
|
+
options.databases,
|
|
516
|
+
options.purpose ?? 'runtime',
|
|
517
|
+
));
|
|
518
|
+
};
|
|
519
|
+
const store: AuthSettingsStore = createAuthSettingsStore(
|
|
520
|
+
async () => (await open()).repository,
|
|
521
|
+
);
|
|
522
|
+
const moduleSettings = options.settings ?? createKernelSettingsRuntime(store);
|
|
523
|
+
moduleSettings.declare(
|
|
524
|
+
createAuthModuleSettings({
|
|
525
|
+
allowSignUp: options.allowSignUp,
|
|
526
|
+
emailConfirmation: options.emailConfirmation,
|
|
527
|
+
sessionTtlHours: Math.max(
|
|
528
|
+
1,
|
|
529
|
+
Math.round(options.sessionTtlMs / 3_600_000),
|
|
530
|
+
),
|
|
531
|
+
sessionIdleMinutes: Math.max(
|
|
532
|
+
5,
|
|
533
|
+
Math.round(
|
|
534
|
+
(options.sessionIdleMs ?? DEFAULT_SESSION_IDLE_MINUTES * 60_000) /
|
|
535
|
+
60_000,
|
|
536
|
+
),
|
|
537
|
+
),
|
|
538
|
+
passwordMinLength:
|
|
539
|
+
options.passwordMinLength ?? DEFAULT_PASSWORD_MIN_LENGTH,
|
|
540
|
+
signInProviders: options.signInProviders,
|
|
541
|
+
...(options.locales ? { locales: options.locales } : {}),
|
|
542
|
+
}),
|
|
543
|
+
);
|
|
544
|
+
const read = <T extends string | number | boolean>(key: string): T =>
|
|
545
|
+
moduleSettings.get<T>(PLATFORM_SETTINGS_TENANT, 'auth.core', key);
|
|
546
|
+
const settings: AuthSettings = {
|
|
547
|
+
get allowSignUp() {
|
|
548
|
+
return read<boolean>('allowSignUp');
|
|
549
|
+
},
|
|
550
|
+
get emailConfirmation() {
|
|
551
|
+
return (
|
|
552
|
+
(options.mailTransport ?? options.mailDelivery !== undefined) &&
|
|
553
|
+
read<boolean>('emailConfirmation')
|
|
554
|
+
);
|
|
555
|
+
},
|
|
556
|
+
get signInProviders() {
|
|
557
|
+
return parseProviderList(read<string>('signInProviders'));
|
|
558
|
+
},
|
|
559
|
+
get sessionTtlMs() {
|
|
560
|
+
return read<number>('sessionTtlHours') * 60 * 60 * 1000;
|
|
561
|
+
},
|
|
562
|
+
get sessionIdleMs() {
|
|
563
|
+
return read<number>('sessionIdleMinutes') * 60 * 1000;
|
|
564
|
+
},
|
|
565
|
+
get passwordMinLength() {
|
|
566
|
+
return read<number>('passwordMinLength');
|
|
567
|
+
},
|
|
568
|
+
};
|
|
569
|
+
const policy = (): AuthPolicy => ({
|
|
570
|
+
sessionTtlMs: settings.sessionTtlMs,
|
|
571
|
+
sessionIdleMs: settings.sessionIdleMs,
|
|
572
|
+
passwordMinLength: settings.passwordMinLength,
|
|
573
|
+
});
|
|
574
|
+
const cookie: AuthCookieConfig = {
|
|
575
|
+
name: cookieName(options),
|
|
576
|
+
secure: options.secureCookies,
|
|
577
|
+
get maxAgeSeconds() {
|
|
578
|
+
return Math.floor(settings.sessionTtlMs / 1000);
|
|
579
|
+
},
|
|
580
|
+
};
|
|
581
|
+
const create = async (): Promise<AuthService> => {
|
|
582
|
+
const { repository } = await open();
|
|
583
|
+
/* The settings this runtime reads on every request are platform scoped.
|
|
584
|
+
Priming them here means a request never observes the declared default
|
|
585
|
+
in place of a stored value. */
|
|
586
|
+
await store.prime(PLATFORM_SETTINGS_TENANT, 'auth.core');
|
|
587
|
+
const authService = new AuthService(repository, {
|
|
588
|
+
policy,
|
|
589
|
+
...(options.mfaEncryptionKey
|
|
590
|
+
? { mfaEncryptionKey: options.mfaEncryptionKey }
|
|
591
|
+
: {}),
|
|
592
|
+
...(options.mailDelivery ? { mailDelivery: options.mailDelivery } : {}),
|
|
593
|
+
...(options.publicBaseUrl
|
|
594
|
+
? { publicBaseUrl: options.publicBaseUrl }
|
|
595
|
+
: {}),
|
|
596
|
+
});
|
|
597
|
+
// Expired rows only matter for storage; the lookup already filters them.
|
|
598
|
+
sessionSweep = setInterval(() => {
|
|
599
|
+
void authService.deleteExpiredSessions().catch((error: unknown) => {
|
|
600
|
+
/* Repository errors can contain SQL parameters. Keep the recurring
|
|
601
|
+
maintenance log useful without serializing the thrown value. */
|
|
602
|
+
console.error(
|
|
603
|
+
`[auth.core] expired session sweep failed (${error instanceof Error ? 'Error' : 'non-error'})`,
|
|
604
|
+
);
|
|
605
|
+
});
|
|
606
|
+
}, EXPIRED_SESSION_SWEEP_MS);
|
|
607
|
+
sessionSweep.unref();
|
|
608
|
+
return authService;
|
|
609
|
+
};
|
|
610
|
+
const service = (): Promise<AuthService> => {
|
|
611
|
+
if (disposed) {
|
|
612
|
+
return Promise.reject(new Error('Auth runtime is disposed.'));
|
|
613
|
+
}
|
|
614
|
+
return (servicePromise ??= create());
|
|
615
|
+
};
|
|
616
|
+
/* Settings writes are audited at the store owner, so the settings
|
|
617
|
+
administration API in system.core needs no audit dependency. The kernel
|
|
618
|
+
change listener is synchronous, so the audit row is written after it
|
|
619
|
+
returns and a failure is reported instead of failing the setting. */
|
|
620
|
+
/* An accepted settings change owes an audit row. Tracking the in-flight
|
|
621
|
+
writes is what lets disposal drain them instead of dropping them. */
|
|
622
|
+
const settingsAuditWrites = new Set<Promise<void>>();
|
|
623
|
+
const detachSettingsAudit = moduleSettings.onChange((change) => {
|
|
624
|
+
const write = (async () => {
|
|
625
|
+
const { repository } = await open();
|
|
626
|
+
const membership = await repository.findAccountMembership(
|
|
627
|
+
change.actor.accountId,
|
|
628
|
+
change.actor.tenantId,
|
|
629
|
+
);
|
|
630
|
+
await (
|
|
631
|
+
await service()
|
|
632
|
+
).recordSettingsUpdate(
|
|
633
|
+
{
|
|
634
|
+
accountId: change.actor.accountId,
|
|
635
|
+
tenantId: change.actor.tenantId,
|
|
636
|
+
email: membership?.email ?? change.actor.accountId,
|
|
637
|
+
role: membership?.role ?? '',
|
|
638
|
+
scopes: membership?.scopes ?? [],
|
|
639
|
+
},
|
|
640
|
+
change.moduleId,
|
|
641
|
+
change.key,
|
|
642
|
+
change.cleared,
|
|
643
|
+
);
|
|
644
|
+
})().catch(() => {
|
|
645
|
+
console.error('[auth.core] settings audit write failed');
|
|
646
|
+
});
|
|
647
|
+
settingsAuditWrites.add(write);
|
|
648
|
+
void write.finally(() => settingsAuditWrites.delete(write));
|
|
649
|
+
});
|
|
650
|
+
const securityHeaders = createSecurityHeadersMiddleware({
|
|
651
|
+
strictTransportSecurity: options.secureCookies,
|
|
652
|
+
contentSecurityPolicy:
|
|
653
|
+
options.contentSecurityPolicy === undefined
|
|
654
|
+
? options.production
|
|
655
|
+
? PRODUCTION_CONTENT_SECURITY_POLICY
|
|
656
|
+
: DEVELOPMENT_CONTENT_SECURITY_POLICY
|
|
657
|
+
: options.contentSecurityPolicy,
|
|
658
|
+
reportOnly: options.contentSecurityPolicyReportOnly ?? !options.production,
|
|
659
|
+
});
|
|
660
|
+
const authentication = createAuthenticationMiddleware(service, cookie);
|
|
661
|
+
return {
|
|
662
|
+
cookie,
|
|
663
|
+
settings,
|
|
664
|
+
moduleSettings,
|
|
665
|
+
trustProxy: options.trustProxy ?? false,
|
|
666
|
+
mailTransport: options.mailTransport ?? options.mailDelivery !== undefined,
|
|
667
|
+
workspaceRoot: options.workspaceRoot ?? null,
|
|
668
|
+
oidcProviders: options.oidcProviders ?? [],
|
|
669
|
+
publicBaseUrl: options.publicBaseUrl ?? null,
|
|
670
|
+
service,
|
|
671
|
+
async authorizeAgentToolAccess(tenantId, actor) {
|
|
672
|
+
const identity = normalizeActor(actor);
|
|
673
|
+
if (!identity || identity.kind !== 'user') return [];
|
|
674
|
+
const membership = await (
|
|
675
|
+
await open()
|
|
676
|
+
).repository.findAccountMembership(identity.id, tenantId);
|
|
677
|
+
return membership?.status === 'active'
|
|
678
|
+
? [...new Set(membership.scopes)].sort()
|
|
679
|
+
: [];
|
|
680
|
+
},
|
|
681
|
+
async settingsAuditSettled() {
|
|
682
|
+
await Promise.allSettled([...settingsAuditWrites]);
|
|
683
|
+
},
|
|
684
|
+
async dispose() {
|
|
685
|
+
if (disposed) return;
|
|
686
|
+
disposed = true;
|
|
687
|
+
detachSettingsAudit();
|
|
688
|
+
await Promise.allSettled([...settingsAuditWrites]);
|
|
689
|
+
if (sessionSweep) clearInterval(sessionSweep);
|
|
690
|
+
sessionSweep = undefined;
|
|
691
|
+
const database = opened;
|
|
692
|
+
opened = undefined;
|
|
693
|
+
servicePromise = undefined;
|
|
694
|
+
if (!database) return;
|
|
695
|
+
/* A settings write accepted before disposal still has to land, and its
|
|
696
|
+
lease has to outlive it. */
|
|
697
|
+
await store.ready().catch(() => undefined);
|
|
698
|
+
for (const lease of (await database).leases) await lease.release();
|
|
699
|
+
},
|
|
700
|
+
middleware: (context, next) =>
|
|
701
|
+
securityHeaders(context, () =>
|
|
702
|
+
Promise.resolve(authentication(context, next)),
|
|
703
|
+
),
|
|
704
|
+
};
|
|
705
|
+
}
|