@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,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@flowdular/module-sandbox",
|
|
3
|
+
"version": "0.4.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"exports": {
|
|
6
|
+
".": "./src/index.ts",
|
|
7
|
+
"./client": "./src/client/index.ts",
|
|
8
|
+
"./server": "./src/server/index.ts",
|
|
9
|
+
"./platform": "./src/platform.ts",
|
|
10
|
+
"./module.json": "./module.json"
|
|
11
|
+
},
|
|
12
|
+
"scripts": {
|
|
13
|
+
"typecheck": "tsrx-tsc --noEmit -p tsconfig.json",
|
|
14
|
+
"test": "vitest run"
|
|
15
|
+
},
|
|
16
|
+
"dependencies": {
|
|
17
|
+
"@flowdular/cli-protocol": "workspace:*",
|
|
18
|
+
"@flowdular/client": "workspace:*",
|
|
19
|
+
"@flowdular/contracts": "workspace:*",
|
|
20
|
+
"@flowdular/database": "workspace:*",
|
|
21
|
+
"@flowdular/kernel": "workspace:*",
|
|
22
|
+
"@flowdular/module-auth": "workspace:*",
|
|
23
|
+
"@flowdular/server": "workspace:*",
|
|
24
|
+
"@flowdular/ui": "workspace:*",
|
|
25
|
+
"@octanejs/app-core": "0.0.47",
|
|
26
|
+
"octane": "0.1.51",
|
|
27
|
+
"segment-state": "0.2.0"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@flowdular/database-testing": "workspace:*",
|
|
31
|
+
"@tsrx/typescript-plugin": "0.3.120",
|
|
32
|
+
"@types/node": "24.13.3",
|
|
33
|
+
"typescript": "5.9.3",
|
|
34
|
+
"vitest": "4.1.10"
|
|
35
|
+
},
|
|
36
|
+
"license": "MIT",
|
|
37
|
+
"repository": {
|
|
38
|
+
"type": "git",
|
|
39
|
+
"url": "git+https://github.com/Flowdular/flowdular.git",
|
|
40
|
+
"directory": "modules/sandbox"
|
|
41
|
+
},
|
|
42
|
+
"files": [
|
|
43
|
+
"src",
|
|
44
|
+
"schemas",
|
|
45
|
+
"dist",
|
|
46
|
+
"bin",
|
|
47
|
+
"public",
|
|
48
|
+
"module.json",
|
|
49
|
+
"migrations",
|
|
50
|
+
"translations",
|
|
51
|
+
"spec",
|
|
52
|
+
"README.md",
|
|
53
|
+
"LICENSE"
|
|
54
|
+
],
|
|
55
|
+
"private": true
|
|
56
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
schemaVersion: 1
|
|
2
|
+
id: sandbox.core
|
|
3
|
+
specVersion: 0.4.0
|
|
4
|
+
status: approved
|
|
5
|
+
name: Sandbox Access
|
|
6
|
+
description: Owns sandbox access grants, sandbox session records, and the audit evidence that lets an authorized account open the Flowdular sandbox, preview a draft module against live platform data, and eject an accepted module into the workspace.
|
|
7
|
+
profile: full
|
|
8
|
+
capabilities:
|
|
9
|
+
- api
|
|
10
|
+
- database
|
|
11
|
+
- client
|
|
12
|
+
- translations
|
|
13
|
+
- cli
|
|
14
|
+
dependencies:
|
|
15
|
+
- id: system.core
|
|
16
|
+
range: 0.5.0
|
|
17
|
+
- id: auth.core
|
|
18
|
+
range: 0.10.0
|
|
19
|
+
tenancy: required
|
|
20
|
+
locales:
|
|
21
|
+
- en
|
|
22
|
+
- pl
|
|
23
|
+
invariants:
|
|
24
|
+
- Persistence runs on PostgreSQL through the shared asynchronous database contract. The module receives a leased handle from platform composition, never a driver or a connection string, and writes explicit PostgreSQL SQL.
|
|
25
|
+
- Migrations are declared as explicit PostgreSQL SQL; sandbox.core never rewrites placeholders or translates SQL between dialects.
|
|
26
|
+
- PostgreSQL grant, session, and audit tables enable and force row-level security with USING and WITH CHECK policies bound to transaction-local coreloom.tenant_id, and the runtime role holds neither SUPERUSER nor BYPASSRLS. Migrations use a separate lease.
|
|
27
|
+
- Every access grant, session record, and audit event is owned by exactly one tenant, and every repository query receives the trusted tenant identifier.
|
|
28
|
+
- The sandbox is a separate application. It never receives platform authority implicitly; it must resolve an authenticated account, the sandbox.access.use scope on the selected membership, and an active grant before it opens a session.
|
|
29
|
+
- A grant is created only by an authorized owner through the platform API or through the sandbox CLI capability. Both paths write the same record and the same audit evidence.
|
|
30
|
+
- A grant is revocable and may carry an expiry. A revoked or expired grant denies sandbox sign-in and every sandbox capability check without further lookup.
|
|
31
|
+
- Grant capabilities are a subset of the sandbox scopes held by the granted membership. A grant can narrow authority and can never widen it beyond the account's platform scopes.
|
|
32
|
+
- Sandbox sessions are metadata only. Draft source code, chat transcripts, and provider credentials are owned by the sandbox application and never enter this module's database or API responses.
|
|
33
|
+
- Preview data bridging requires the sandbox.preview.data scope on the grant. Without it the sandbox serves fixtures and never forwards a request to the full application.
|
|
34
|
+
- Ejecting a draft module requires the sandbox.modules.eject scope, an explicit apply flag, and passing module and specification gates. The eject path never edits the platform composition by hand.
|
|
35
|
+
- Local coding agent binaries are offered only by a sandbox in loopback mode. A self-hosted sandbox exposes bring-your-own-key providers only.
|
|
36
|
+
- Access changes, session lifecycle transitions, and eject attempts are recorded as append-only tenant-scoped audit events with the actor, action, subject, timestamp, and safe metadata.
|
|
37
|
+
- Passwords, session tokens, provider credentials, and draft source contents are never stored, logged, or returned by this module.
|
|
38
|
+
- Sandbox navigation is development surface. It is visible to tenant owners, and server scopes remain authoritative.
|
|
39
|
+
permissions:
|
|
40
|
+
- id: sandbox.access.use
|
|
41
|
+
description: Sign in to the sandbox and open sessions for the active tenant.
|
|
42
|
+
- id: sandbox.access.manage
|
|
43
|
+
description: Grant, narrow, and revoke sandbox access for members of the active tenant.
|
|
44
|
+
- id: sandbox.sessions.read
|
|
45
|
+
description: Read sandbox session records of the active tenant.
|
|
46
|
+
- id: sandbox.preview.data
|
|
47
|
+
description: Allow a sandbox preview to read live platform data through the bridge.
|
|
48
|
+
- id: sandbox.modules.eject
|
|
49
|
+
description: Eject an accepted sandbox module into the workspace module tree.
|
|
50
|
+
dataOwnership:
|
|
51
|
+
- sandbox.core owns sandbox access grants, their capability subset, expiry, revocation state, and the identity of the granting actor.
|
|
52
|
+
- 'sandbox.core owns sandbox session records: identifier, owning account, target module identifier, blueprint, lifecycle state, driver identifier, and timestamps.'
|
|
53
|
+
- sandbox.core owns the append-only sandbox audit chain for access, session, and eject events.
|
|
54
|
+
- The sandbox application owns session workspaces, draft source files, chat transcripts, ephemeral preview databases, and provider credentials. Business modules own their records and answer bridged preview requests through their own services and ACL rules.
|
|
55
|
+
acceptanceScenarios:
|
|
56
|
+
- id: SANDBOX-GRANT-API
|
|
57
|
+
given: An owner with sandbox.access.manage and a member of the active tenant.
|
|
58
|
+
when: The owner grants sandbox access with a capability subset.
|
|
59
|
+
then: A tenant-scoped grant is persisted, capabilities are intersected with the member's platform scopes, and an audit event records the actor and subject.
|
|
60
|
+
- id: SANDBOX-GRANT-CLI
|
|
61
|
+
given: A local operator running the sandbox CLI capability with an explicit apply flag.
|
|
62
|
+
when: The operator grants sandbox access to an existing account of a tenant.
|
|
63
|
+
then: The same grant record and audit event are written and the command returns the resulting capabilities as machine-readable evidence.
|
|
64
|
+
- id: SANDBOX-GRANT-DRY-RUN
|
|
65
|
+
given: A local operator running the sandbox grant capability without an apply flag.
|
|
66
|
+
when: The command executes.
|
|
67
|
+
then: The resolved account, tenant, and capability subset are reported, no record is written, and the response is marked as a dry run.
|
|
68
|
+
- id: SANDBOX-REVOKE
|
|
69
|
+
given: An active grant for a member.
|
|
70
|
+
when: An owner revokes it from the platform or from the CLI.
|
|
71
|
+
then: The grant is marked revoked with a timestamp, sandbox authorization fails immediately, and an audit event is appended.
|
|
72
|
+
- id: SANDBOX-AUTHORIZE
|
|
73
|
+
given: An authenticated account with sandbox.access.use and an active grant on the selected tenant.
|
|
74
|
+
when: The sandbox resolves sandbox authority for that account and tenant.
|
|
75
|
+
then: The effective capability set is returned as the intersection of platform scopes and grant capabilities.
|
|
76
|
+
- id: SANDBOX-AUTHORIZE-DENY
|
|
77
|
+
given: An account whose grant is missing, revoked, or expired, or whose membership lacks sandbox.access.use.
|
|
78
|
+
when: The sandbox resolves sandbox authority.
|
|
79
|
+
then: Authority is denied with a stable reason and no session is opened.
|
|
80
|
+
- id: SANDBOX-SESSION-RECORD
|
|
81
|
+
given: An authorized sandbox principal opens a session for a draft module.
|
|
82
|
+
when: The session is registered.
|
|
83
|
+
then: A tenant-scoped session record is persisted with its lifecycle state, and later state transitions update the same record with audit evidence.
|
|
84
|
+
- id: SANDBOX-BRIDGE-DENY
|
|
85
|
+
given: A sandbox session whose grant lacks sandbox.preview.data.
|
|
86
|
+
when: The preview requests platform data through the bridge.
|
|
87
|
+
then: The request is denied before any call to the full application and the preview continues on fixtures.
|
|
88
|
+
- id: SANDBOX-EJECT-DRY-RUN
|
|
89
|
+
given: A session in the accepted state and an operator with sandbox.modules.eject.
|
|
90
|
+
when: The eject capability runs without an apply flag.
|
|
91
|
+
then: Every target path and every gate that will run is reported and no file is written into the module tree.
|
|
92
|
+
- id: SANDBOX-EJECT-APPLY
|
|
93
|
+
given: The same session and operator with an explicit apply flag.
|
|
94
|
+
when: The eject capability runs.
|
|
95
|
+
then: The module is copied into the module tree, module and specification gates pass, module enable is invoked through the existing capability, and an audit event records the result.
|
|
96
|
+
- id: SANDBOX-TENANT-ISOLATION
|
|
97
|
+
given: Grants and sessions exist in two tenants.
|
|
98
|
+
when: Any read or write is executed with a tenant identifier.
|
|
99
|
+
then: Only records of that tenant are visible and cross-tenant access is denied by the server.
|
|
100
|
+
- id: SANDBOX-DENY-UNAUTHORIZED
|
|
101
|
+
given: A principal that is unauthenticated or lacks the required sandbox scope.
|
|
102
|
+
when: The principal reads grants, manages grants, or requests eject.
|
|
103
|
+
then: The server denies the operation before data or workspace effects are exposed.
|
|
104
|
+
- id: SANDBOX-AUDIT-READ
|
|
105
|
+
given: A principal reads the sandbox audit trail over HTTP.
|
|
106
|
+
when: The principal lacks sandbox.sessions.read, or holds it and pages with a cursor.
|
|
107
|
+
then: The request is denied before any row is read without the scope, and with it only the active tenant's events are returned newest first with a stable occurred-at and sequence cursor and the chain fields.
|
|
108
|
+
- id: SANDBOX-AUDIT-VERIFY
|
|
109
|
+
given: A stored sandbox audit row is altered after it was written.
|
|
110
|
+
when: A principal with sandbox.sessions.read verifies the chain over HTTP, reusing the same walk as the audit-verify CLI.
|
|
111
|
+
then: The response reports the chain as not verified and names the identifier of the first broken row.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export const SANDBOX_PERMISSIONS = {
|
|
2
|
+
use: 'sandbox.access.use',
|
|
3
|
+
manage: 'sandbox.access.manage',
|
|
4
|
+
sessionsRead: 'sandbox.sessions.read',
|
|
5
|
+
previewData: 'sandbox.preview.data',
|
|
6
|
+
eject: 'sandbox.modules.eject',
|
|
7
|
+
} as const;
|
|
8
|
+
|
|
9
|
+
/* Capabilities a grant can carry. Managing grants stays a platform scope and
|
|
10
|
+
is never delegated into the sandbox application. */
|
|
11
|
+
export const SANDBOX_GRANT_CAPABILITIES = Object.freeze([
|
|
12
|
+
SANDBOX_PERMISSIONS.use,
|
|
13
|
+
SANDBOX_PERMISSIONS.sessionsRead,
|
|
14
|
+
SANDBOX_PERMISSIONS.previewData,
|
|
15
|
+
SANDBOX_PERMISSIONS.eject,
|
|
16
|
+
]);
|
|
17
|
+
|
|
18
|
+
export const permissions = Object.freeze(Object.values(SANDBOX_PERMISSIONS));
|
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
import {
|
|
2
|
+
defineEndpoint,
|
|
3
|
+
HttpProblem,
|
|
4
|
+
jsonResponse,
|
|
5
|
+
problemResponse,
|
|
6
|
+
readJsonObject,
|
|
7
|
+
requiredString,
|
|
8
|
+
} from '@flowdular/sdk/server';
|
|
9
|
+
import type { AuthRuntime } from '@flowdular/sdk/modules/auth/server';
|
|
10
|
+
import {
|
|
11
|
+
endpointIdentityFromContext,
|
|
12
|
+
isTokenPrincipal,
|
|
13
|
+
principalFromContext,
|
|
14
|
+
sessionMutationDenial,
|
|
15
|
+
} from '@flowdular/sdk/modules/auth/server';
|
|
16
|
+
import type { Context } from '@octanejs/app-core';
|
|
17
|
+
import { SANDBOX_PERMISSIONS } from '../acl/permissions.ts';
|
|
18
|
+
import type { SandboxSessionState } from '../domain/types.ts';
|
|
19
|
+
import { SandboxServiceError } from '../services/sandbox-service-error.ts';
|
|
20
|
+
import type { SandboxRuntime } from '../server/runtime.ts';
|
|
21
|
+
|
|
22
|
+
/* A browser session is guarded by CSRF. An API token is never sent
|
|
23
|
+
automatically by a browser, so it carries no CSRF risk and is checked by its
|
|
24
|
+
scopes alone. */
|
|
25
|
+
function mutationDenial(context: Context, auth: AuthRuntime): Response | null {
|
|
26
|
+
return isTokenPrincipal(context)
|
|
27
|
+
? null
|
|
28
|
+
: sessionMutationDenial(context, auth);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function failure(error: unknown): Response {
|
|
32
|
+
if (error instanceof SandboxServiceError) {
|
|
33
|
+
return jsonResponse(
|
|
34
|
+
{ error: { code: error.code, message: error.message } },
|
|
35
|
+
error.status,
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
return problemResponse(error, 'The sandbox operation failed.');
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function optionalCapabilities(
|
|
42
|
+
value: Record<string, unknown>,
|
|
43
|
+
): readonly string[] | undefined {
|
|
44
|
+
const raw = value.capabilities;
|
|
45
|
+
if (raw === undefined || raw === null) return undefined;
|
|
46
|
+
if (
|
|
47
|
+
!Array.isArray(raw) ||
|
|
48
|
+
raw.length > 8 ||
|
|
49
|
+
raw.some((entry) => typeof entry !== 'string')
|
|
50
|
+
) {
|
|
51
|
+
throw new HttpProblem(
|
|
52
|
+
'INVALID_CAPABILITIES',
|
|
53
|
+
'capabilities must be an array of capability identifiers.',
|
|
54
|
+
400,
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
return raw as readonly string[];
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function optionalExpiry(value: Record<string, unknown>): number | null {
|
|
61
|
+
const raw = value.expiresAt;
|
|
62
|
+
if (raw === undefined || raw === null) return null;
|
|
63
|
+
if (typeof raw !== 'number' || !Number.isSafeInteger(raw)) {
|
|
64
|
+
throw new HttpProblem(
|
|
65
|
+
'INVALID_EXPIRY',
|
|
66
|
+
'expiresAt must be an integer timestamp in milliseconds.',
|
|
67
|
+
400,
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
return raw;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function optionalNote(value: Record<string, unknown>): string | null {
|
|
74
|
+
const raw = value.note;
|
|
75
|
+
if (raw === undefined || raw === null || raw === '') return null;
|
|
76
|
+
if (typeof raw !== 'string' || raw.length > 280) {
|
|
77
|
+
throw new HttpProblem(
|
|
78
|
+
'INVALID_NOTE',
|
|
79
|
+
'note must be a string of at most 280 characters.',
|
|
80
|
+
400,
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
return raw;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function ejectMetadata(
|
|
87
|
+
value: Record<string, unknown>,
|
|
88
|
+
): Readonly<Record<string, string | number | boolean>> {
|
|
89
|
+
const raw = value.metadata;
|
|
90
|
+
if (raw === undefined || raw === null) return {};
|
|
91
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
|
|
92
|
+
throw new HttpProblem(
|
|
93
|
+
'INVALID_METADATA',
|
|
94
|
+
'metadata must be an object of strings, numbers, and booleans.',
|
|
95
|
+
400,
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
const entries = Object.entries(raw as Record<string, unknown>);
|
|
99
|
+
if (entries.length > 20) {
|
|
100
|
+
throw new HttpProblem(
|
|
101
|
+
'INVALID_METADATA',
|
|
102
|
+
'metadata may hold at most 20 entries.',
|
|
103
|
+
400,
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
const metadata: Record<string, string | number | boolean> = {};
|
|
107
|
+
for (const [key, entry] of entries) {
|
|
108
|
+
if (
|
|
109
|
+
!/^[a-zA-Z][a-zA-Z0-9_.-]{0,63}$/.test(key) ||
|
|
110
|
+
(typeof entry !== 'boolean' &&
|
|
111
|
+
typeof entry !== 'number' &&
|
|
112
|
+
(typeof entry !== 'string' || entry.length > 500))
|
|
113
|
+
) {
|
|
114
|
+
throw new HttpProblem(
|
|
115
|
+
'INVALID_METADATA',
|
|
116
|
+
'metadata must be an object of strings, numbers, and booleans.',
|
|
117
|
+
400,
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
metadata[key] = entry;
|
|
121
|
+
}
|
|
122
|
+
return metadata;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export function createSandboxRoutes(
|
|
126
|
+
auth: AuthRuntime,
|
|
127
|
+
runtime: SandboxRuntime,
|
|
128
|
+
) {
|
|
129
|
+
const access = defineEndpoint({
|
|
130
|
+
id: 'sandbox.access.snapshot',
|
|
131
|
+
path: '/api/sandbox/access',
|
|
132
|
+
methods: ['GET'],
|
|
133
|
+
access: { kind: 'permission', permission: SANDBOX_PERMISSIONS.manage },
|
|
134
|
+
resolveIdentity: endpointIdentityFromContext,
|
|
135
|
+
handler: async ({ octane }) => {
|
|
136
|
+
const principal = principalFromContext(octane)!;
|
|
137
|
+
const service = await runtime.service(auth);
|
|
138
|
+
return jsonResponse({
|
|
139
|
+
sandbox: { url: runtime.options.sandboxUrl },
|
|
140
|
+
grants: await service.listGrants(principal.tenantId),
|
|
141
|
+
candidates: await service.listCandidates(principal.tenantId),
|
|
142
|
+
});
|
|
143
|
+
},
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
const grant = defineEndpoint({
|
|
147
|
+
id: 'sandbox.access.create-grant',
|
|
148
|
+
path: '/api/sandbox/access',
|
|
149
|
+
methods: ['POST'],
|
|
150
|
+
access: { kind: 'permission', permission: SANDBOX_PERMISSIONS.manage },
|
|
151
|
+
resolveIdentity: endpointIdentityFromContext,
|
|
152
|
+
handler: async ({ octane }) => {
|
|
153
|
+
const denial = sessionMutationDenial(octane, auth);
|
|
154
|
+
if (denial) return denial;
|
|
155
|
+
try {
|
|
156
|
+
const principal = principalFromContext(octane)!;
|
|
157
|
+
const value = await readJsonObject(octane.request);
|
|
158
|
+
return jsonResponse(
|
|
159
|
+
{
|
|
160
|
+
grant: await (
|
|
161
|
+
await runtime.service(auth)
|
|
162
|
+
).grant({
|
|
163
|
+
tenantId: principal.tenantId,
|
|
164
|
+
actorId: principal.accountId,
|
|
165
|
+
accountId: requiredString(value, 'accountId', { max: 128 }),
|
|
166
|
+
capabilities: optionalCapabilities(value),
|
|
167
|
+
expiresAt: optionalExpiry(value),
|
|
168
|
+
note: optionalNote(value),
|
|
169
|
+
}),
|
|
170
|
+
},
|
|
171
|
+
201,
|
|
172
|
+
);
|
|
173
|
+
} catch (error) {
|
|
174
|
+
return failure(error);
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
const revoke = defineEndpoint({
|
|
180
|
+
id: 'sandbox.access.revoke-grant',
|
|
181
|
+
path: '/api/sandbox/access/revoke',
|
|
182
|
+
methods: ['POST'],
|
|
183
|
+
access: { kind: 'permission', permission: SANDBOX_PERMISSIONS.manage },
|
|
184
|
+
resolveIdentity: endpointIdentityFromContext,
|
|
185
|
+
handler: async ({ octane }) => {
|
|
186
|
+
const denial = sessionMutationDenial(octane, auth);
|
|
187
|
+
if (denial) return denial;
|
|
188
|
+
try {
|
|
189
|
+
const principal = principalFromContext(octane)!;
|
|
190
|
+
const value = await readJsonObject(octane.request);
|
|
191
|
+
return jsonResponse({
|
|
192
|
+
grant: await (
|
|
193
|
+
await runtime.service(auth)
|
|
194
|
+
).revoke(
|
|
195
|
+
principal.tenantId,
|
|
196
|
+
requiredString(value, 'accountId', { max: 128 }),
|
|
197
|
+
principal.accountId,
|
|
198
|
+
),
|
|
199
|
+
});
|
|
200
|
+
} catch (error) {
|
|
201
|
+
return failure(error);
|
|
202
|
+
}
|
|
203
|
+
},
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
const sessions = defineEndpoint({
|
|
207
|
+
id: 'sandbox.sessions.snapshot',
|
|
208
|
+
path: '/api/sandbox/sessions',
|
|
209
|
+
methods: ['GET'],
|
|
210
|
+
access: {
|
|
211
|
+
kind: 'permission',
|
|
212
|
+
permission: SANDBOX_PERMISSIONS.sessionsRead,
|
|
213
|
+
},
|
|
214
|
+
resolveIdentity: endpointIdentityFromContext,
|
|
215
|
+
handler: async ({ octane }) => {
|
|
216
|
+
const principal = principalFromContext(octane)!;
|
|
217
|
+
return jsonResponse({
|
|
218
|
+
sessions: await (
|
|
219
|
+
await runtime.service(auth)
|
|
220
|
+
).listSessions(principal.tenantId, 50),
|
|
221
|
+
});
|
|
222
|
+
},
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
const audit = defineEndpoint({
|
|
226
|
+
id: 'sandbox.audit.snapshot',
|
|
227
|
+
path: '/api/sandbox/audit',
|
|
228
|
+
methods: ['GET'],
|
|
229
|
+
access: {
|
|
230
|
+
kind: 'permission',
|
|
231
|
+
permission: SANDBOX_PERMISSIONS.sessionsRead,
|
|
232
|
+
},
|
|
233
|
+
resolveIdentity: endpointIdentityFromContext,
|
|
234
|
+
handler: async ({ octane }) => {
|
|
235
|
+
try {
|
|
236
|
+
const principal = principalFromContext(octane)!;
|
|
237
|
+
const url = new URL(octane.request.url);
|
|
238
|
+
const limit = Number(url.searchParams.get('limit') ?? '50');
|
|
239
|
+
return jsonResponse(
|
|
240
|
+
await (
|
|
241
|
+
await runtime.service(auth)
|
|
242
|
+
).pageAuditEvents(
|
|
243
|
+
principal.tenantId,
|
|
244
|
+
url.searchParams.get('cursor'),
|
|
245
|
+
Number.isSafeInteger(limit) ? limit : 50,
|
|
246
|
+
),
|
|
247
|
+
);
|
|
248
|
+
} catch (error) {
|
|
249
|
+
return failure(error);
|
|
250
|
+
}
|
|
251
|
+
},
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
const verifyAudit = defineEndpoint({
|
|
255
|
+
id: 'sandbox.audit.verify',
|
|
256
|
+
path: '/api/sandbox/audit/verify',
|
|
257
|
+
methods: ['GET'],
|
|
258
|
+
access: {
|
|
259
|
+
kind: 'permission',
|
|
260
|
+
permission: SANDBOX_PERMISSIONS.sessionsRead,
|
|
261
|
+
},
|
|
262
|
+
resolveIdentity: endpointIdentityFromContext,
|
|
263
|
+
handler: async ({ octane }) => {
|
|
264
|
+
try {
|
|
265
|
+
const principal = principalFromContext(octane)!;
|
|
266
|
+
return jsonResponse(
|
|
267
|
+
await (await runtime.service(auth)).verifyAudit(principal.tenantId),
|
|
268
|
+
);
|
|
269
|
+
} catch (error) {
|
|
270
|
+
return failure(error);
|
|
271
|
+
}
|
|
272
|
+
},
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
const authority = defineEndpoint({
|
|
276
|
+
id: 'sandbox.authority.resolve',
|
|
277
|
+
path: '/api/sandbox/authority',
|
|
278
|
+
methods: ['GET'],
|
|
279
|
+
access: { kind: 'permission', permission: SANDBOX_PERMISSIONS.use },
|
|
280
|
+
resolveIdentity: endpointIdentityFromContext,
|
|
281
|
+
handler: async ({ octane }) => {
|
|
282
|
+
const principal = principalFromContext(octane)!;
|
|
283
|
+
return jsonResponse({
|
|
284
|
+
principal: {
|
|
285
|
+
accountId: principal.accountId,
|
|
286
|
+
tenantId: principal.tenantId,
|
|
287
|
+
email: principal.email,
|
|
288
|
+
displayName: principal.displayName,
|
|
289
|
+
role: principal.role,
|
|
290
|
+
scopes: principal.scopes,
|
|
291
|
+
tenantName:
|
|
292
|
+
principal.tenants.find(
|
|
293
|
+
(tenant) => tenant.tenantId === principal.tenantId,
|
|
294
|
+
)?.name ?? principal.tenantId,
|
|
295
|
+
tenantSlug:
|
|
296
|
+
principal.tenants.find(
|
|
297
|
+
(tenant) => tenant.tenantId === principal.tenantId,
|
|
298
|
+
)?.slug ?? '',
|
|
299
|
+
},
|
|
300
|
+
authority: await (
|
|
301
|
+
await runtime.service(auth)
|
|
302
|
+
).authorize(principal.tenantId, principal.accountId, principal.scopes),
|
|
303
|
+
sandbox: { url: runtime.options.sandboxUrl },
|
|
304
|
+
});
|
|
305
|
+
},
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
const registerSession = defineEndpoint({
|
|
309
|
+
id: 'sandbox.sessions.register',
|
|
310
|
+
path: '/api/sandbox/sessions',
|
|
311
|
+
methods: ['POST'],
|
|
312
|
+
access: { kind: 'permission', permission: SANDBOX_PERMISSIONS.use },
|
|
313
|
+
resolveIdentity: endpointIdentityFromContext,
|
|
314
|
+
handler: async ({ octane }) => {
|
|
315
|
+
const denial = mutationDenial(octane, auth);
|
|
316
|
+
if (denial) return denial;
|
|
317
|
+
try {
|
|
318
|
+
const principal = principalFromContext(octane)!;
|
|
319
|
+
const value = await readJsonObject(octane.request);
|
|
320
|
+
const mode = requiredString(value, 'mode', { max: 16 });
|
|
321
|
+
if (mode !== 'loopback' && mode !== 'self-hosted') {
|
|
322
|
+
throw new HttpProblem(
|
|
323
|
+
'INVALID_MODE',
|
|
324
|
+
'mode must be loopback or self-hosted.',
|
|
325
|
+
400,
|
|
326
|
+
);
|
|
327
|
+
}
|
|
328
|
+
return jsonResponse(
|
|
329
|
+
{
|
|
330
|
+
session: await (
|
|
331
|
+
await runtime.service(auth)
|
|
332
|
+
).registerSession({
|
|
333
|
+
tenantId: principal.tenantId,
|
|
334
|
+
accountId: principal.accountId,
|
|
335
|
+
sessionId: requiredString(value, 'sessionId', { max: 128 }),
|
|
336
|
+
moduleId: requiredString(value, 'moduleId', { max: 128 }),
|
|
337
|
+
title: requiredString(value, 'title', { min: 2, max: 120 }),
|
|
338
|
+
blueprint: requiredString(value, 'blueprint', { max: 120 }),
|
|
339
|
+
driver: requiredString(value, 'driver', { max: 64 }),
|
|
340
|
+
mode,
|
|
341
|
+
}),
|
|
342
|
+
},
|
|
343
|
+
201,
|
|
344
|
+
);
|
|
345
|
+
} catch (error) {
|
|
346
|
+
return failure(error);
|
|
347
|
+
}
|
|
348
|
+
},
|
|
349
|
+
});
|
|
350
|
+
|
|
351
|
+
const updateSessionState = defineEndpoint({
|
|
352
|
+
id: 'sandbox.sessions.transition',
|
|
353
|
+
path: '/api/sandbox/sessions/state',
|
|
354
|
+
methods: ['POST'],
|
|
355
|
+
access: { kind: 'permission', permission: SANDBOX_PERMISSIONS.use },
|
|
356
|
+
resolveIdentity: endpointIdentityFromContext,
|
|
357
|
+
handler: async ({ octane }) => {
|
|
358
|
+
const denial = mutationDenial(octane, auth);
|
|
359
|
+
if (denial) return denial;
|
|
360
|
+
try {
|
|
361
|
+
const principal = principalFromContext(octane)!;
|
|
362
|
+
const value = await readJsonObject(octane.request);
|
|
363
|
+
return jsonResponse({
|
|
364
|
+
session: await (
|
|
365
|
+
await runtime.service(auth)
|
|
366
|
+
).updateSessionState(
|
|
367
|
+
principal.tenantId,
|
|
368
|
+
requiredString(value, 'sessionId', { max: 128 }),
|
|
369
|
+
requiredString(value, 'state', {
|
|
370
|
+
max: 32,
|
|
371
|
+
}) as SandboxSessionState,
|
|
372
|
+
principal.accountId,
|
|
373
|
+
),
|
|
374
|
+
});
|
|
375
|
+
} catch (error) {
|
|
376
|
+
return failure(error);
|
|
377
|
+
}
|
|
378
|
+
},
|
|
379
|
+
});
|
|
380
|
+
|
|
381
|
+
/* Eject evidence, written by the sandbox after every step of a delivery
|
|
382
|
+
passed. Metadata is bounded scalars: what landed, never the sources. */
|
|
383
|
+
const recordEject = defineEndpoint({
|
|
384
|
+
id: 'sandbox.sessions.eject-record',
|
|
385
|
+
path: '/api/sandbox/sessions/eject',
|
|
386
|
+
methods: ['POST'],
|
|
387
|
+
access: { kind: 'permission', permission: SANDBOX_PERMISSIONS.eject },
|
|
388
|
+
resolveIdentity: endpointIdentityFromContext,
|
|
389
|
+
handler: async ({ octane }) => {
|
|
390
|
+
const denial = mutationDenial(octane, auth);
|
|
391
|
+
if (denial) return denial;
|
|
392
|
+
try {
|
|
393
|
+
const principal = principalFromContext(octane)!;
|
|
394
|
+
const value = await readJsonObject(octane.request);
|
|
395
|
+
return jsonResponse(
|
|
396
|
+
{
|
|
397
|
+
event: await (
|
|
398
|
+
await runtime.service(auth)
|
|
399
|
+
).recordEject(
|
|
400
|
+
principal.tenantId,
|
|
401
|
+
requiredString(value, 'sessionId', { max: 128 }),
|
|
402
|
+
principal.accountId,
|
|
403
|
+
ejectMetadata(value),
|
|
404
|
+
),
|
|
405
|
+
},
|
|
406
|
+
201,
|
|
407
|
+
);
|
|
408
|
+
} catch (error) {
|
|
409
|
+
return failure(error);
|
|
410
|
+
}
|
|
411
|
+
},
|
|
412
|
+
});
|
|
413
|
+
|
|
414
|
+
return [
|
|
415
|
+
authority.serverRoute,
|
|
416
|
+
registerSession.serverRoute,
|
|
417
|
+
updateSessionState.serverRoute,
|
|
418
|
+
recordEject.serverRoute,
|
|
419
|
+
access.serverRoute,
|
|
420
|
+
grant.serverRoute,
|
|
421
|
+
revoke.serverRoute,
|
|
422
|
+
sessions.serverRoute,
|
|
423
|
+
audit.serverRoute,
|
|
424
|
+
verifyAudit.serverRoute,
|
|
425
|
+
] as const;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
export const endpoints = [
|
|
429
|
+
'sandbox.authority.resolve',
|
|
430
|
+
'sandbox.sessions.register',
|
|
431
|
+
'sandbox.sessions.transition',
|
|
432
|
+
'sandbox.sessions.eject-record',
|
|
433
|
+
'sandbox.access.snapshot',
|
|
434
|
+
'sandbox.access.create-grant',
|
|
435
|
+
'sandbox.access.revoke-grant',
|
|
436
|
+
'sandbox.sessions.snapshot',
|
|
437
|
+
'sandbox.audit.snapshot',
|
|
438
|
+
'sandbox.audit.verify',
|
|
439
|
+
] as const;
|