@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,104 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: core-extend
|
|
3
|
+
description: >-
|
|
4
|
+
Change a platform package (contracts, kernel, server, client, ui, cli,
|
|
5
|
+
sandbox, coding-agent) without breaking the modules and generated files that
|
|
6
|
+
depend on it.
|
|
7
|
+
roles:
|
|
8
|
+
- module-executor
|
|
9
|
+
- reviewer
|
|
10
|
+
when: A change is needed under packages/**, platform/**, or the schemas in packages/contracts, and no module-level change can deliver it.
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Extend the platform core
|
|
14
|
+
|
|
15
|
+
This work runs at the repository root; a sandbox session cannot do it (the session workspace holds one module plus read-only `reference/` copies). When a sandbox role needs a core change, it stops with `HANDOFF: none - <the exact core change>` and this skill picks it up.
|
|
16
|
+
|
|
17
|
+
## 1. Dependency direction
|
|
18
|
+
|
|
19
|
+
`packages/contracts` (types and JSON schemas, no runtime) -> `packages/kernel` (registry, ACL, settings) -> `packages/server`, `packages/client`, `packages/ui` -> modules -> `platform` (composition) and `packages/cli`, `packages/sandbox`, `packages/coding-agent`, `packages/harness`, `packages/ai-provider`. A lower layer never imports a higher one. `platform/octane.config.ts` imports `@flowdular/sdk/modules/auth/server` and the generated `modules.server.ts`; nothing else in `packages/` may import a module. `@flowdular/sdk/modules/auth/server` is effectively part of the server contract: `PlatformServerContext` and `PlatformServerComposition` live in `modules/auth/src/server/composition.ts`.
|
|
20
|
+
|
|
21
|
+
## 2. Surfaces every module and every agent sees
|
|
22
|
+
|
|
23
|
+
Keep these stable or migrate every consumer in the same change. `packages/sandbox/src/server/reference.ts` copies them into every session, so agents code against them:
|
|
24
|
+
|
|
25
|
+
- `packages/server/src/index.ts`: `defineEndpoint`, `HttpProblem`, `jsonResponse`, `problemResponse`, `readJsonObject`, `requiredString`, `optionalString`, `requiredInteger`, types `EndpointIdentity`, `EndpointExecutionContext`.
|
|
26
|
+
- `packages/client/src/contributions.ts`: `ModuleClientContext`, `ModuleClientContribution`, `WORKSPACE_SLOTS`, `NavigationGroup`, `createClientContributionRegistry`. `packages/client/src/state.ts`.
|
|
27
|
+
- `packages/contracts/src/index.ts` and `packages/contracts/schemas/*.json`.
|
|
28
|
+
- `packages/ui/src/index.ts`, `packages/ui/src/components/*.tsrx`, `packages/ui/src/styles/components.css`.
|
|
29
|
+
- `modules/auth/src/{index.ts,acl/scopes.ts,domain/types.ts,server/index.ts,services/auth-service.ts}`.
|
|
30
|
+
- `AGENTS.md`, `docs/design-system.md`, and `.ai/skills/**` (copied to `reference/skills/`).
|
|
31
|
+
|
|
32
|
+
## 3. Checklists by change type
|
|
33
|
+
|
|
34
|
+
Schema change (`packages/contracts/schemas/*.schema.json`):
|
|
35
|
+
|
|
36
|
+
1. Edit the schema and the matching type in `packages/contracts/src/index.ts`.
|
|
37
|
+
2. Update `packages/cli/src/module-scaffold.ts` so a fresh module satisfies the schema, and its test `packages/cli/tests/module-scaffold.test.ts`.
|
|
38
|
+
3. Update every `modules/*/module.json` or `modules/*/spec/module.yaml` the change affects, and the `.ai/blueprints/*/required-files.yaml`, `spec-requirements.yaml` and the business manager prompt when keys change.
|
|
39
|
+
4. `pnpm validate` (spec, blueprint, module validation) and `pnpm test`.
|
|
40
|
+
|
|
41
|
+
Server or auth contract (`packages/server`, `modules/auth/src/server/composition.ts`): change the type, then every `src/platform.ts` and `src/api/endpoints.ts` under `modules/`, then `packages/cli/src/module-sync.ts` if the generated composition shape changes, then `platform/octane.config.ts`. Adding a hook to `PlatformServerComposition` (for example an optional `agentTools`) must stay optional so existing modules compile.
|
|
42
|
+
|
|
43
|
+
Client or UI primitive: add the component to `packages/ui/src/components/`, export it from `packages/ui/src/index.ts`, add its classes to `packages/ui/src/styles/components.css` with tokens only, document props and classes in `docs/design-system.md`, and delete the module-local promotion candidate it replaces. An icon is one path in `ICON_PATHS` (`packages/ui/src/icons/Icon.tsrx`), 24x24 stroke geometry.
|
|
44
|
+
|
|
45
|
+
CLI: commands are dispatched in `packages/cli/src/runner.ts`; a new core capability is a descriptor in `packages/cli/src/capabilities.ts` (`id`, `version`, `summary`, `risk`, `requiresApprovedSpec`, `supportsDryRun`); flags are parsed by `packages/cli/src/arguments.ts` (`--name value` or `--name=value`, `--flag`); `reservedGroups` in `packages/cli/src/extensions.ts` protects core groups from module namespaces; `pnpm flowdular help` output lists the commands. Tests in `packages/cli/tests`. Update `.ai/policies/capabilities.yaml` and `README.md`.
|
|
46
|
+
|
|
47
|
+
Sandbox and coding agent: gate ids live in `packages/sandbox/src/server/gates.ts` (`GateId`, `GATE_DEFINITIONS`) and must match the `gates:` front matter of `.ai/agents/sandbox/*.md`; role defaults in `packages/coding-agent/src/roles/defaults.ts` are regenerated from those files (sync script in `.ai/README.md`), never hand-edited; the instruction contract is `packages/coding-agent/src/roles/contract.ts`. Reference copies for sessions: `packages/sandbox/src/server/reference.ts` `REFERENCE_SOURCES`.
|
|
48
|
+
|
|
49
|
+
Module and blueprint discovery: `packages/cli/src/validation.ts` `findNamedFiles` walks the workspace for `module.json`, `module.yaml` and `blueprint.json`, skipping `node_modules`, `dist` and tool state directories; check its skip list before adding a new discoverable file type.
|
|
50
|
+
|
|
51
|
+
## 3b. Worked example: how the optional composition members landed
|
|
52
|
+
|
|
53
|
+
The agent-tool hook, capability registry and module settings show the shape of a safe contract change (`modules/auth/src/server/composition.ts`, `packages/kernel/src/{capability-registry,tool-registry,module-settings}.ts`, `platform/octane.config.ts`):
|
|
54
|
+
|
|
55
|
+
```ts
|
|
56
|
+
export interface PlatformServerContext {
|
|
57
|
+
readonly environment: NodeJS.ProcessEnv;
|
|
58
|
+
readonly workspaceRoot: string;
|
|
59
|
+
readonly auth: AuthRuntime;
|
|
60
|
+
readonly settings: ModuleSettingsRuntime; // live, tenant-scoped reads
|
|
61
|
+
readonly agentTools: PlatformToolRegistry; // register(tools), list()
|
|
62
|
+
readonly agentDefinitions: PlatformAgentRegistry; // register(definitions), list()
|
|
63
|
+
readonly capabilities: PlatformCapabilityRegistry; // register(id, service), get(id), has(id)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export interface PlatformServerComposition {
|
|
67
|
+
readonly routes: readonly ServerRoute[];
|
|
68
|
+
readonly settings?: ModuleSettingsDeclaration; // declared by the platform after composing
|
|
69
|
+
readonly prepare?: () => void | Promise<void>; // read-only checks before HMR activation
|
|
70
|
+
readonly start?: () => void; // called after every module composed
|
|
71
|
+
readonly stop?: () => void | Promise<void>; // drains background work before disposal
|
|
72
|
+
readonly dispose?: () => void | Promise<void>; // releases owned resources
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
New context members are required (every module receives them; nobody has to read them), new composition members are optional (existing modules compile unchanged). The platform composes modules in dependency order, binds each `agentDefinitions` registrar to that module id, declares every `settings`, seals the definitions, runs every `prepare`, retires the old generation, and then calls every `start`. Retirement completes every `stop` before any `dispose`, so background work cannot outlive a repository it uses. The generic registries live in `@flowdular/sdk/kernel` so `modules/auth` does not import the harness or a provider module. `agentTools` carries model-visible tool identities; `agentDefinitions` carries immutable module-owned business agent behavior; `capabilities` carries typed public services between modules, with the provider owning the service type and the consumer declaring the module dependency and handling absence from `get`.
|
|
77
|
+
|
|
78
|
+
## 4. Generated and composed files
|
|
79
|
+
|
|
80
|
+
`platform/src/generated/modules.server.ts` and `modules.client.ts` are written by `pnpm flowdular module sync --apply` (also run by `pnpm dev` and `pnpm build`). `flowdular.json` `modules.enabled` and `platform/package.json` dependencies are written by `module enable --apply`. Never edit them by hand; change the generator and regenerate. `packages/ui/src/brand/mark.ts` is generated by `node packages/ui/scripts/gen-mark.mjs`.
|
|
81
|
+
|
|
82
|
+
## 5. Verification
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
pnpm verify # typecheck, test, validate, format:check
|
|
86
|
+
pnpm build # cli build and smoke, module sync --apply, platform build
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Run the affected package alone while iterating: `pnpm --filter @flowdular/<pkg> test`. A change to `packages/ui` or `packages/client` also needs `pnpm --filter @flowdular/platform typecheck` and a look at the shell in `pnpm dev`.
|
|
90
|
+
|
|
91
|
+
After implementation and these checks, switch to `auto-review` as a separate
|
|
92
|
+
read-only phase before declaring completion. Fix findings in an implementation
|
|
93
|
+
phase, rerun affected checks, and repeat the review.
|
|
94
|
+
|
|
95
|
+
## 6. Do not build on dead code
|
|
96
|
+
|
|
97
|
+
`RegisteredModule.navigation` in `packages/contracts` is declared by modules but never read at run time (the shell reads `ModuleClientContribution.navigation`). `validateTaskPacket` and `packages/harness/schemas/task-packet.schema.json` have no runtime caller. Module translations load through `ModuleClientContribution.translations` and the shared client i18n registry; do not introduce a second loader. Extend the live path or remove the dead one in its own change; do not add a third variant.
|
|
98
|
+
|
|
99
|
+
## Pitfalls
|
|
100
|
+
|
|
101
|
+
- A new required key in `module.schema.json` breaks every module manifest and the scaffold at once; ship it optional first.
|
|
102
|
+
- Changing an error code string (`UNAUTHENTICATED`, `FORBIDDEN`, `CSRF_REJECTED`) breaks module tests that assert it.
|
|
103
|
+
- `packages/ui/src/index.ts` imports fonts and `styles/index.css` at module top; a test that imports `@flowdular/sdk/ui` needs a DOM environment.
|
|
104
|
+
- Prettier uses tabs and `@tsrx/prettier-plugin`; run `pnpm format` before `format:check`.
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: database-adapter
|
|
3
|
+
description: >-
|
|
4
|
+
Build a Flowdular module repository on the asynchronous @flowdular/sdk/database
|
|
5
|
+
contract: PostgreSQL everywhere, embedded PGlite for local and test runs,
|
|
6
|
+
provider leases, forced row-level security, migrations, and tenant isolation
|
|
7
|
+
tests.
|
|
8
|
+
roles:
|
|
9
|
+
- backend-engineer
|
|
10
|
+
- module-executor
|
|
11
|
+
- reviewer
|
|
12
|
+
when: A module needs a repository on the shared database provider, a new table, a cross-tenant read, or a migration.
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Use the database adapter contract
|
|
16
|
+
|
|
17
|
+
Read `docs/database-adapters.md`, `packages/database/src/contracts.ts`, and the
|
|
18
|
+
converted `modules/profile` repository before editing. This skill is for coding
|
|
19
|
+
agents. It is unrelated to tenant-defined Procedures in `agents.core`.
|
|
20
|
+
For a driver adapter, first-run setup, adapter switch, or delivery matrix, also
|
|
21
|
+
read [references/first-run-and-matrix.md](references/first-run-and-matrix.md).
|
|
22
|
+
|
|
23
|
+
## 1. Keep three layers separate
|
|
24
|
+
|
|
25
|
+
1. The business repository port is database-agnostic. Domain types, services,
|
|
26
|
+
errors, and callers never import a driver or branch on a dialect.
|
|
27
|
+
2. The module owns persistence for every dialect it declares: explicit queries,
|
|
28
|
+
row mapping, error normalization, migrations, and contract tests.
|
|
29
|
+
3. Platform composition owns driver adapters and `DatabaseProvider`: paths,
|
|
30
|
+
credentials, pools, TLS, timeouts, and disposal. A module never receives a
|
|
31
|
+
DSN and never creates a production pool.
|
|
32
|
+
|
|
33
|
+
`DatabaseProvider.acquire({ namespace, purpose })` returns a lease. The module
|
|
34
|
+
uses `lease.database` and releases only that lease. `DatabaseHandle` exposes
|
|
35
|
+
async operations, open `adapterId` and `dialectId`, capabilities, transactions,
|
|
36
|
+
and schema introspection. A callback-scoped transaction expires on return.
|
|
37
|
+
|
|
38
|
+
The platform runs on PostgreSQL. A deployment points at a server; a
|
|
39
|
+
workstation, a preview and a test suite get the same PostgreSQL embedded in the
|
|
40
|
+
process through PGlite, so there is nothing to install and no second dialect to
|
|
41
|
+
keep in step. Modules write PostgreSQL and only PostgreSQL. The contract still
|
|
42
|
+
carries an open `dialectId` and capability negotiation so a future driver can
|
|
43
|
+
join, but never add a core exhaustive switch that must be edited for each one.
|
|
44
|
+
|
|
45
|
+
## 2. Make the whole repository chain asynchronous
|
|
46
|
+
|
|
47
|
+
Changing only the driver is not a conversion. Update every method in the chain:
|
|
48
|
+
|
|
49
|
+
1. `src/services/repository.ts` returns `Promise<T>` or `Promise<void>`.
|
|
50
|
+
2. The database repository awaits every `query`, `execute`, transaction, and
|
|
51
|
+
migration call.
|
|
52
|
+
3. Services await repository methods. Preserve validation and domain error
|
|
53
|
+
codes at this boundary.
|
|
54
|
+
4. Endpoints, agent tools, capabilities, background jobs, and tests await the
|
|
55
|
+
service.
|
|
56
|
+
5. Remove synchronous assumptions such as returning a write input before the
|
|
57
|
+
database confirms it.
|
|
58
|
+
|
|
59
|
+
Search every caller of the repository interface before changing it. A missed
|
|
60
|
+
caller can compile through an inferred promise and then serialize the wrong
|
|
61
|
+
value into an API response.
|
|
62
|
+
|
|
63
|
+
## 3. Acquire one provider lease per module runtime
|
|
64
|
+
|
|
65
|
+
`createServerComposition` remains synchronous. Pass `context.databases` into
|
|
66
|
+
the module runtime. The runtime owns one shared initialization promise that
|
|
67
|
+
acquires the lease and runs migrations lazily before the first repository
|
|
68
|
+
operation. Concurrent first requests await that same promise.
|
|
69
|
+
|
|
70
|
+
Use the module id as the namespace. Acquire `purpose: 'migration'`, run
|
|
71
|
+
`runDatabaseMigrations`, and release that lease before acquiring
|
|
72
|
+
`purpose: 'runtime'`; the application role never owns DDL. Preview uses
|
|
73
|
+
`purpose: 'preview'` and isolated tests use `purpose: 'test'`. A read that must
|
|
74
|
+
cross tenants takes `purpose: 'background'`, a read-only role with no blanket
|
|
75
|
+
table grant. Follow `modules/profile/src/server/runtime.ts` for the exact
|
|
76
|
+
sequence. `prepare()` stays read-only and never acquires a lease. `dispose()`
|
|
77
|
+
awaits started initialization and releases every lease once.
|
|
78
|
+
|
|
79
|
+
## 4. Write explicit SQL
|
|
80
|
+
|
|
81
|
+
Repositories own their SQL. There is no translation layer and no placeholder
|
|
82
|
+
rewriting.
|
|
83
|
+
|
|
84
|
+
- Parameters are `$1`, `$2`, and so on, in the order the statement binds them.
|
|
85
|
+
- Values always go in `DatabaseStatement.parameters`. Never concatenate request
|
|
86
|
+
data, tenant ids, identifiers, sort directions, or filter values into SQL.
|
|
87
|
+
- Dynamic identifiers and ordering come from a closed code-owned allowlist.
|
|
88
|
+
- `executeScript()` is only for trusted, checked-in migration DDL. Runtime
|
|
89
|
+
writes use `execute()`.
|
|
90
|
+
- Keep tenant predicates and tenant-first uniqueness in both dialects. Every
|
|
91
|
+
tenant-owned read and write includes `tenant_id` from the trusted principal.
|
|
92
|
+
|
|
93
|
+
PostgreSQL tenant-owned tables also use database-enforced isolation:
|
|
94
|
+
|
|
95
|
+
- enable and force row-level security on the table;
|
|
96
|
+
- define a policy whose `USING` and `WITH CHECK` clauses compare `tenant_id`
|
|
97
|
+
with `current_setting('coreloom.tenant_id', true)`;
|
|
98
|
+
- run application traffic under a role that is neither a superuser nor granted
|
|
99
|
+
`BYPASSRLS`;
|
|
100
|
+
- use a separate migration role for DDL or policy ownership when required.
|
|
101
|
+
|
|
102
|
+
The adapter sets `coreloom.tenant_id` with parameterized `set_config(..., true)`
|
|
103
|
+
after `BEGIN` on the pinned connection. Never use an unpinned root query.
|
|
104
|
+
Explicit tenant predicates remain required as defense in depth.
|
|
105
|
+
|
|
106
|
+
PostgreSQL returns `BIGINT` as a string. Normalize every integer column on the
|
|
107
|
+
way out of a row through a local `integer()` helper. A comparison such as
|
|
108
|
+
`enabled === 1` silently fails without it, and a count read raw compares against
|
|
109
|
+
a string. Only widen timestamps and sequences to `BIGINT`; leave flags, counters
|
|
110
|
+
and version columns `INTEGER`.
|
|
111
|
+
|
|
112
|
+
Normalize driver-specific unique, foreign-key, serialization, and timeout
|
|
113
|
+
failures into the module's stable service error codes. `DatabaseError` covers
|
|
114
|
+
contract misuse and lifecycle errors; raw driver error classes are deliberately
|
|
115
|
+
not a public module contract.
|
|
116
|
+
|
|
117
|
+
## 5. Transactions and concurrency
|
|
118
|
+
|
|
119
|
+
Use the transaction argument for every operation inside a transaction callback.
|
|
120
|
+
Calling the root handle from that callback is rejected, and retaining the
|
|
121
|
+
transaction after the callback is `TRANSACTION_CONTEXT_MISUSE`.
|
|
122
|
+
|
|
123
|
+
PostgreSQL may run root operations concurrently, while a transaction is pinned
|
|
124
|
+
to one pooled client. Do not depend on physical connection identity or pool
|
|
125
|
+
order. State transitions that must be atomic belong in one transaction with an
|
|
126
|
+
affected-row or version check. A public repository method called from inside
|
|
127
|
+
another method's transaction opens a second transaction and is rejected; give it
|
|
128
|
+
a private in-transaction variant that takes the transaction instead.
|
|
129
|
+
|
|
130
|
+
Pass `AbortSignal` and a bounded `timeoutMs` from long-running jobs. Read
|
|
131
|
+
`database.capabilities` before depending on isolation or cancellation. A
|
|
132
|
+
`before-start` cancellation capability does not stop a driver call already in
|
|
133
|
+
progress. Portable tenant-owned repository methods use
|
|
134
|
+
`database.transaction(operation, { tenantId, access, isolation })`, including
|
|
135
|
+
reads. PostgreSQL root query, execute, and schema calls, and PostgreSQL
|
|
136
|
+
transactions without `tenantId`, fail with `TENANT_CONTEXT_REQUIRED`.
|
|
137
|
+
|
|
138
|
+
## 6. Migrations v2 and schema inspection
|
|
139
|
+
|
|
140
|
+
Use `DatabaseMigration` and `runDatabaseMigrations` from `@flowdular/sdk/database`.
|
|
141
|
+
Each migration has one immutable id and its PostgreSQL SQL. The ledger is
|
|
142
|
+
`_coreloom_migrations_v2`, keyed by module namespace and migration id; its
|
|
143
|
+
checksum covers that exact SQL.
|
|
144
|
+
|
|
145
|
+
`inspectExisting(database)` is the only pre-ledger adoption proof. Use
|
|
146
|
+
`database.schema.hasTable`, `hasColumn`, and `hasIndex` with fixed identifiers
|
|
147
|
+
and return:
|
|
148
|
+
|
|
149
|
+
- `complete` only when every effect of the migration exists;
|
|
150
|
+
- `absent` only when none exists;
|
|
151
|
+
- `partial` for every mixed state, which the runner refuses.
|
|
152
|
+
|
|
153
|
+
The runner acquires the adapter's migration lock and applies outstanding DDL
|
|
154
|
+
plus ledger rows in one serializable transaction. It refuses a missing dialect,
|
|
155
|
+
checksum drift, duplicate ids, partial adoption, and adapters without
|
|
156
|
+
transactional DDL. Never edit applied migration bytes or bypass a refusal.
|
|
157
|
+
|
|
158
|
+
`inspectExisting` must pass thunks, not eager promises. Adoption runs inside a
|
|
159
|
+
single-connection transaction, and overlapping queries on that connection break
|
|
160
|
+
it. Check in numbered `.up.sql` source and mirror its bytes in the migration
|
|
161
|
+
constant. A migration-only task uses `migration-authoring` in a separate phase.
|
|
162
|
+
|
|
163
|
+
## 7. Tests run on a real PostgreSQL
|
|
164
|
+
|
|
165
|
+
`createTestDatabaseProvider()` from `@flowdular/sdk/database-testing` gives a suite its
|
|
166
|
+
own PostgreSQL in process by default, with the same `coreloom_runtime` and
|
|
167
|
+
`coreloom_background` roles and the same forced row-level security a deployment
|
|
168
|
+
enforces. There is no server to start and no second dialect to keep green, so
|
|
169
|
+
the isolation assertions run on every turn rather than behind an environment
|
|
170
|
+
flag. CI selects server PostgreSQL with `FD_TEST_DATABASE_ADAPTER=postgresql`
|
|
171
|
+
and the three test role URLs; missing credentials fail instead of falling back.
|
|
172
|
+
|
|
173
|
+
Starting the engine costs roughly half a second. Open one per test file and
|
|
174
|
+
truncate between cases instead of paying it per test.
|
|
175
|
+
|
|
176
|
+
Cover CRUD, commit and rollback, tenant isolation and uniqueness, stable error
|
|
177
|
+
normalization, and concurrent version conflicts. Migration tests cover empty
|
|
178
|
+
apply, safe adoption, refusals, and a clean second start.
|
|
179
|
+
|
|
180
|
+
With two tenants, prove that each can see and mutate only its own rows, that a
|
|
181
|
+
read or write without tenant context fails with `TENANT_CONTEXT_REQUIRED`, and
|
|
182
|
+
that `WITH CHECK` blocks inserting another tenant id. Where a module polls
|
|
183
|
+
across tenants, prove that the background role reads exactly the routing columns
|
|
184
|
+
and is refused everything else, including writes.
|
|
185
|
+
|
|
186
|
+
## Refuse
|
|
187
|
+
|
|
188
|
+
- A DSN, password, pool, or `pg` dependency inside a module.
|
|
189
|
+
- A module that opens its own database file or connection.
|
|
190
|
+
- A closed core switch over known adapter ids.
|
|
191
|
+
- Root-handle work inside a transaction callback or a transaction that escapes.
|
|
192
|
+
- Cross-module database access. Use the owner's typed capability or API.
|
|
193
|
+
- A tenant table without enabled and forced row-level security, a tenant policy,
|
|
194
|
+
or tests under a role that cannot bypass it.
|
|
195
|
+
- A cross-tenant read on the runtime role, or a background role granted whole
|
|
196
|
+
rows instead of the columns its poll needs.
|
|
197
|
+
- Tests that mock away SQL, migration, concurrency, or tenant predicates.
|
|
198
|
+
|
|
199
|
+
## Verification
|
|
200
|
+
|
|
201
|
+
Run the module typecheck and tests, the `@flowdular/sdk/database` contract tests when
|
|
202
|
+
the adapter changes, `pnpm flowdular module validate --json`, and `pnpm verify`
|
|
203
|
+
before landing. An adapter change also needs a shutdown test proving that active
|
|
204
|
+
work drains before pool disposal.
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Adapter setup and delivery matrix
|
|
2
|
+
|
|
3
|
+
Read this reference when adding a driver adapter, exposing database setup, or
|
|
4
|
+
preparing an adapter-backed module for eject or a pull request.
|
|
5
|
+
|
|
6
|
+
## Adapter descriptor
|
|
7
|
+
|
|
8
|
+
A platform adapter descriptor owns the complete first-run contract:
|
|
9
|
+
|
|
10
|
+
- an open `adapterId` and `dialectId`;
|
|
11
|
+
- a machine-readable configuration schema;
|
|
12
|
+
- UI hints such as labels, descriptions, groups, order, and input kind;
|
|
13
|
+
- an explicit list of secret fields;
|
|
14
|
+
- configuration validation without opening module databases;
|
|
15
|
+
- a connectivity probe with bounded time and sanitized errors;
|
|
16
|
+
- optional provisioning for infrastructure the adapter actually owns;
|
|
17
|
+
- connection creation that returns the shared adapter contract;
|
|
18
|
+
- advertised database capabilities.
|
|
19
|
+
|
|
20
|
+
The registry is open. Core code resolves a descriptor by id and negotiates its
|
|
21
|
+
capabilities rather than switching over known adapter ids, so an adapter package
|
|
22
|
+
can join without changing module business ports or the setup screen.
|
|
23
|
+
|
|
24
|
+
Configuration UI is generated by the platform from descriptor metadata. A
|
|
25
|
+
module never implements database setup UI and never asks for a DSN.
|
|
26
|
+
|
|
27
|
+
## First run
|
|
28
|
+
|
|
29
|
+
The embedded PostgreSQL is the zero-configuration local default: PGlite runs in
|
|
30
|
+
process, so a workstation starts with nothing installed and still exercises the
|
|
31
|
+
same forced row-level security a deployment enforces. Its data root comes from
|
|
32
|
+
the platform provider, not from each module.
|
|
33
|
+
|
|
34
|
+
Before selecting another adapter, setup:
|
|
35
|
+
|
|
36
|
+
1. validates descriptor configuration and required secrets;
|
|
37
|
+
2. probes the target with a strict timeout and no secret echo;
|
|
38
|
+
3. lists every enabled database-owning module;
|
|
39
|
+
4. verifies that each module declares an implementation for the target
|
|
40
|
+
`dialectId` and that the adapter supplies its required capabilities;
|
|
41
|
+
5. refuses activation with the exact incompatible modules and capabilities;
|
|
42
|
+
6. provisions only after explicit operator confirmation when provisioning
|
|
43
|
+
changes external state;
|
|
44
|
+
7. runs migrations through a migration lease before runtime leases are served;
|
|
45
|
+
8. verifies readiness under the non-bypass runtime role.
|
|
46
|
+
|
|
47
|
+
Secret values live in environment-backed or encrypted platform secret storage.
|
|
48
|
+
`flowdular.json`, module manifests, setup responses, logs, audit metadata, run
|
|
49
|
+
snapshots, and pull request descriptions contain only secret references or
|
|
50
|
+
redacted presence state.
|
|
51
|
+
|
|
52
|
+
## Switching an adapter with existing data
|
|
53
|
+
|
|
54
|
+
Changing an adapter id never points modules at an empty database and never
|
|
55
|
+
copies storage files. The only supported switch is an explicit operation:
|
|
56
|
+
|
|
57
|
+
1. stop writes and acquire an export snapshot;
|
|
58
|
+
2. export through module-owned portable records, preserving ids and versions;
|
|
59
|
+
3. provision and migrate the target;
|
|
60
|
+
4. import in dependency-safe batches under tenant context;
|
|
61
|
+
5. verify counts, checksums, referential expectations, and module invariants;
|
|
62
|
+
6. probe reads and writes through the target runtime role;
|
|
63
|
+
7. activate the target only after verification succeeds;
|
|
64
|
+
8. retain the source for rollback until the operator closes the window.
|
|
65
|
+
|
|
66
|
+
A failed import or verification leaves the source active. There is no silent
|
|
67
|
+
fallback to another database, because that would split writes.
|
|
68
|
+
|
|
69
|
+
## Module declarations
|
|
70
|
+
|
|
71
|
+
Each database-owning module declares:
|
|
72
|
+
|
|
73
|
+
- supported open dialect ids;
|
|
74
|
+
- the required capability set, such as transactions, transactional DDL,
|
|
75
|
+
schema introspection, returning values, or an isolation level;
|
|
76
|
+
- its module-owned persistence implementation and migrations;
|
|
77
|
+
- one adapter-neutral repository behavior suite.
|
|
78
|
+
|
|
79
|
+
The platform compatibility check consumes these declarations before first run,
|
|
80
|
+
adapter change, sandbox eject, and deployment validation.
|
|
81
|
+
|
|
82
|
+
## Delivery matrix
|
|
83
|
+
|
|
84
|
+
Every turn runs against a real PostgreSQL, because the embedded one starts in
|
|
85
|
+
process. The sandbox and the test suites use `createTestDatabaseProvider()` from
|
|
86
|
+
`@flowdular/sdk/database-testing`, which brings the `coreloom_runtime` and
|
|
87
|
+
`coreloom_background` roles and forced row-level security with it.
|
|
88
|
+
|
|
89
|
+
A target run covers tenant A and B fixtures, operations without tenant context,
|
|
90
|
+
forged cross-tenant inserts, direct row-security bypass probes, concurrent
|
|
91
|
+
writes, and cleanup. Where a module polls across tenants, it also proves the
|
|
92
|
+
background role reads only the routing columns.
|
|
93
|
+
|
|
94
|
+
Before eject or a pull request the matrix additionally runs the same suite
|
|
95
|
+
against a server PostgreSQL when one is configured, using a unique schema and a
|
|
96
|
+
role that holds neither `SUPERUSER` nor `BYPASSRLS`. Test credentials are
|
|
97
|
+
short-lived and never enter the transcript. If that target is unavailable the
|
|
98
|
+
session may continue editing, and delivery states the exact missing target.
|
|
99
|
+
|
|
100
|
+
Server selection is explicit: `FD_TEST_DATABASE_ADAPTER=postgresql`,
|
|
101
|
+
`FD_TEST_POSTGRES_URL` (migrator), `FD_TEST_POSTGRES_RUNTIME_URL` and
|
|
102
|
+
`FD_TEST_POSTGRES_BACKGROUND_URL`. All three URLs are required. Missing or
|
|
103
|
+
unreachable configuration never falls back to PGlite. `.github/workflows/ci.yml`
|
|
104
|
+
runs this matrix, including auth and agents. Keep role separation intact in
|
|
105
|
+
fixtures: even the migration owner must supply tenant context for tenant data.
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: migration-authoring
|
|
3
|
+
description: >-
|
|
4
|
+
Add an immutable PostgreSQL module migration through @flowdular/sdk/database, with
|
|
5
|
+
the namespaced v2 ledger, safe schema adoption, forced row-level security, and
|
|
6
|
+
tenant isolation tests.
|
|
7
|
+
roles:
|
|
8
|
+
- backend-engineer
|
|
9
|
+
- module-executor
|
|
10
|
+
- reviewer
|
|
11
|
+
when: A module needs a new table, column, index, or constraint.
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Author a database migration
|
|
15
|
+
|
|
16
|
+
An adapter conversion is a separate phase using `database-adapter`. For this phase, read
|
|
17
|
+
`packages/database/src/migrations.ts` and the converted `modules/profile`
|
|
18
|
+
migration as the reference. Flowdular has a migration runner. Do not add
|
|
19
|
+
constructor-owned `DatabaseSync.exec()` guards around it.
|
|
20
|
+
|
|
21
|
+
## 1. Source layout and compatibility
|
|
22
|
+
|
|
23
|
+
Migration SQL is checked in and immutable after release:
|
|
24
|
+
|
|
25
|
+
- `migrations/NNNN_<module>_<name>.up.sql` holds the PostgreSQL source and is
|
|
26
|
+
byte-exact. Never move, renumber or reformat a released file.
|
|
27
|
+
- `src/services/migration.ts` mirrors every `.up.sql` file as a literal and
|
|
28
|
+
exports `databaseMigrations: readonly DatabaseMigration[]`, one entry per
|
|
29
|
+
file. No code translates or rewrites SQL.
|
|
30
|
+
- `.down.sql` documents a reverse operation. Flowdular never executes it.
|
|
31
|
+
|
|
32
|
+
## 2. What the v2 runner guarantees
|
|
33
|
+
|
|
34
|
+
`runDatabaseMigrations(database, namespace, databaseMigrations)` uses the
|
|
35
|
+
namespaced `_coreloom_migrations_v2` ledger. A row records namespace, migration
|
|
36
|
+
id, dialect id, checksum, and applied time. The checksum covers the selected
|
|
37
|
+
dialect's exact SQL.
|
|
38
|
+
|
|
39
|
+
Before applying outstanding work, the runner checks every existing ledger row.
|
|
40
|
+
It refuses checksum drift, a missing script, duplicate ids, a wrong ledger
|
|
41
|
+
dialect, partial adoption, and adapters without transactional DDL. It opens one
|
|
42
|
+
serializable transaction, takes a transaction advisory lock, and commits DDL
|
|
43
|
+
plus ledger rows together. Dry run writes nothing.
|
|
44
|
+
|
|
45
|
+
The runner selects scripts by the provider's open `dialectId`. Do not add a core
|
|
46
|
+
switch over known dialects. A new driver advertises capabilities and a module
|
|
47
|
+
opts into it by supplying reviewed SQL and tests.
|
|
48
|
+
|
|
49
|
+
## 3. Explicit adoption proof
|
|
50
|
+
|
|
51
|
+
Every migration that may predate v2 defines `inspectExisting(database)`. Use
|
|
52
|
+
adapter-owned, capability-checked schema introspection such as `hasTable`,
|
|
53
|
+
`hasColumn`, and `hasIndex` with fixed identifiers.
|
|
54
|
+
|
|
55
|
+
Return `complete` only when every table, column, index, constraint, data effect,
|
|
56
|
+
and security policy exists. Return `absent` only when none exists. Return
|
|
57
|
+
`partial` for every mixed state. If an adapter cannot inspect a required object,
|
|
58
|
+
extend its introspection capability or supply a narrow module-owned inspection.
|
|
59
|
+
Never guess `complete` and never parse another dialect's catalog directly in
|
|
60
|
+
shared code.
|
|
61
|
+
|
|
62
|
+
## 4. SQL rules shared by dialects
|
|
63
|
+
|
|
64
|
+
- Tenant tables carry `tenant_id TEXT NOT NULL`.
|
|
65
|
+
- Tenant uniqueness and lookup indexes start with `tenant_id`; ordered indexes
|
|
66
|
+
end with `id` for stable results.
|
|
67
|
+
- IDs are text UUIDs generated by the service. Times are integer milliseconds.
|
|
68
|
+
- Money is integer minor units plus a currency code, never floating point.
|
|
69
|
+
- Enums and ranges have database check constraints.
|
|
70
|
+
- Cross-module foreign keys do not exist. Use the owner's capability or API.
|
|
71
|
+
- Additive changes are the default. Destructive or locking changes need an
|
|
72
|
+
operator-approved rollout, compatibility window, and rollback plan.
|
|
73
|
+
|
|
74
|
+
Write PostgreSQL directly: its types, conflict syntax, indexes and policies.
|
|
75
|
+
Never rewrite placeholders or DDL text.
|
|
76
|
+
|
|
77
|
+
## 5. PostgreSQL row-level security
|
|
78
|
+
|
|
79
|
+
Every PostgreSQL tenant table includes:
|
|
80
|
+
|
|
81
|
+
```sql
|
|
82
|
+
ALTER TABLE inventory_locations ENABLE ROW LEVEL SECURITY;
|
|
83
|
+
ALTER TABLE inventory_locations FORCE ROW LEVEL SECURITY;
|
|
84
|
+
CREATE POLICY inventory_locations_tenant_policy ON inventory_locations
|
|
85
|
+
USING (tenant_id = current_setting('coreloom.tenant_id', true))
|
|
86
|
+
WITH CHECK (tenant_id = current_setting('coreloom.tenant_id', true));
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
The runtime role is not a superuser and has no `BYPASSRLS`. DDL and policy
|
|
90
|
+
ownership use `purpose: 'migration'`. Runtime repository calls use
|
|
91
|
+
`database.transaction(operation, { tenantId, access })`; the adapter sets
|
|
92
|
+
transaction-local `coreloom.tenant_id` on the pinned connection. Queries still
|
|
93
|
+
include `WHERE tenant_id = ...` as defense in depth.
|
|
94
|
+
|
|
95
|
+
## 6. Add one migration
|
|
96
|
+
|
|
97
|
+
Scaffold instead of writing from memory:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
pnpm flowdular migration new <name> --module <id> # dry run
|
|
101
|
+
pnpm flowdular migration new <name> --module <id> --apply # writes both files
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
The scaffold emits the `.up.sql` and `.down.sql` pair with the tenant table, its
|
|
105
|
+
index, and the `ENABLE` + `FORCE` + policy block already correct. Replace the
|
|
106
|
+
placeholder columns with the real schema; keep the row-security block unless the
|
|
107
|
+
table is not tenant owned.
|
|
108
|
+
|
|
109
|
+
1. Never renumber released files. The scaffold picks the next id.
|
|
110
|
+
2. Mirror every `.up.sql` byte for byte and append one `DatabaseMigration` with
|
|
111
|
+
the same id.
|
|
112
|
+
3. Add exact `inspectExisting` logic with `migrationObjectState` and
|
|
113
|
+
`postgresTenantTableState` from `@flowdular/sdk/database`. Pass thunks, never
|
|
114
|
+
ready promises: adoption runs inside a transaction pinned to one connection,
|
|
115
|
+
and eager promises issue overlapping queries on it.
|
|
116
|
+
4. Extend repository SQL, row mapping, service validation, endpoint, client,
|
|
117
|
+
approved spec scenario, and all three module versions.
|
|
118
|
+
|
|
119
|
+
### Column types that bite
|
|
120
|
+
|
|
121
|
+
PostgreSQL returns `BIGINT` as a string. Normalize every integer read in the
|
|
122
|
+
repository through a local `integer()` helper; a raw value concatenates where it
|
|
123
|
+
should add, and `enabled === 1` is false against `'1'`.
|
|
124
|
+
|
|
125
|
+
Widen timestamps, durations and sequences to `BIGINT`. Leave boolean flags,
|
|
126
|
+
counters and version columns `INTEGER`, or every comparison against them has to
|
|
127
|
+
be normalized too.
|
|
128
|
+
|
|
129
|
+
Money is integer minor units in `BIGINT` plus a currency code.
|
|
130
|
+
|
|
131
|
+
Never test against a workspace database. `createTestDatabaseProvider()` from
|
|
132
|
+
`@flowdular/sdk/database-testing` gives the suite its own PGlite by default or an
|
|
133
|
+
isolated PostgreSQL schema in server CI. Tenant fixture reads and writes still
|
|
134
|
+
need transaction-local tenant context, including on the migration connection.
|
|
135
|
+
|
|
136
|
+
## 7. Tests and gates
|
|
137
|
+
|
|
138
|
+
`pnpm flowdular migration verify` checks the ledger and every module's migration
|
|
139
|
+
set: a missing script, a tenant table without forced row security, and a policy
|
|
140
|
+
lost to a table rebuild.
|
|
141
|
+
|
|
142
|
+
The migration suite proves byte parity and id order, empty apply, complete
|
|
143
|
+
adoption without row loss, partial refusal, checksum refusal before later SQL,
|
|
144
|
+
dry run without writes, and a clean second start.
|
|
145
|
+
|
|
146
|
+
Every gate runs against a real PostgreSQL, because the embedded one starts in
|
|
147
|
+
process. Cover tenant A and B isolation, a forged tenant `WITH CHECK` refusal, a
|
|
148
|
+
missing-context `TENANT_CONTEXT_REQUIRED` test, and direct row-security bypass
|
|
149
|
+
probes under a role that holds neither `SUPERUSER` nor `BYPASSRLS`. Where the
|
|
150
|
+
module polls across tenants, prove the background role reads only the routing
|
|
151
|
+
columns.
|
|
152
|
+
|
|
153
|
+
## Refuse
|
|
154
|
+
|
|
155
|
+
- Editing, moving, reordering, or removing released migration bytes.
|
|
156
|
+
- A PostgreSQL tenant table without enabled and forced RLS plus both policy
|
|
157
|
+
clauses.
|
|
158
|
+
- A runtime role with superuser or `BYPASSRLS`.
|
|
159
|
+
- DDL through a runtime lease or request data through `executeScript()`.
|
|
160
|
+
- Automatic SQL translation or a closed core switch over known dialects.
|
|
161
|
+
- Forcing past checksum or partial-adoption refusal.
|
|
162
|
+
- A production-support claim based on a fake driver alone.
|
|
163
|
+
|
|
164
|
+
## Verification
|
|
165
|
+
|
|
166
|
+
Run the module typecheck and tests, module validation,
|
|
167
|
+
`pnpm flowdular migration verify`, and `pnpm verify`.
|