@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,86 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: test-hardening
|
|
3
|
+
description: >-
|
|
4
|
+
Make a module test suite prove behaviour: where tests live and run, the route
|
|
5
|
+
recipe, the embedded PostgreSQL provider, the denial and isolation cases every
|
|
6
|
+
endpoint needs, and the break-the-implementation check.
|
|
7
|
+
roles:
|
|
8
|
+
- backend-engineer
|
|
9
|
+
- frontend-engineer
|
|
10
|
+
- reviewer
|
|
11
|
+
- module-executor
|
|
12
|
+
when: A module has few or tautological tests, a bug escaped the suite, or a reviewer asks whether the tests guard the change.
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Harden a test suite
|
|
16
|
+
|
|
17
|
+
## 1. Where tests live and run
|
|
18
|
+
|
|
19
|
+
- `tests/module.test.ts` (one file per module today; more files are fine). `tsconfig.json` includes `src/**/*` and `tests/**/*.ts`, so a test file is `.ts`; `.tsrx` components are not compiled by vitest here. Testable client logic (formatting, filtering, mapping, state transitions) goes into a `.ts` helper next to the view and is imported by the test.
|
|
20
|
+
- Runner: `vitest run` (`pnpm --filter @flowdular/module-<dir> test`). In the sandbox the `tests` gate runs `vitest run --passWithNoTests` inside the module directory, so a module with no tests passes the gate. Treat an empty or trivial suite as a defect, not a pass.
|
|
21
|
+
- Pinned: vitest 4.1.10, typescript 5.9.3, `@types/node` 24.13.3 (`.ai/references/catalog/package.json`).
|
|
22
|
+
|
|
23
|
+
## 2. Repositories on an embedded PostgreSQL
|
|
24
|
+
|
|
25
|
+
`createPgliteTestProvider()` from `@flowdular/sdk/database-testing` runs a real PostgreSQL inside the test process, with the same `coreloom_runtime` and `coreloom_background` roles and the same forced row-level security a deployment enforces. Booting it costs about two seconds, so a suite opens one provider per test file, migrates it once, and truncates the module's tables between cases; `.ai/references/catalog/tests/support/database.ts` is the shape (`createCatalogTestDatabase` hands out a lease per fixture, `closeCatalogTestDatabases` runs in `afterAll`). Build the service on top: `new CatalogService((await createCatalogTestDatabase()).repository)`. A database module also keeps `tests/migrations.test.ts` for SQL byte parity, fresh apply, safe pre-ledger adoption, and a clean second start. A module whose spec has no `database` capability gets a `MemoryXRepository` from the scaffold instead; a module with a database tests the database repository, never a hand-written fake, because the SQL, the ledger and the row-level security are what need testing.
|
|
26
|
+
|
|
27
|
+
## 3. Route recipe (from `modules/auth/tests/endpoints.test.ts`)
|
|
28
|
+
|
|
29
|
+
```ts
|
|
30
|
+
import { createContext } from '@octanejs/app-core';
|
|
31
|
+
import { createAuthenticationMiddleware } from '@flowdular/sdk/modules/auth/server';
|
|
32
|
+
// build an AuthRuntime around a DatabaseAuthRepository on a createPgliteTestProvider() lease and a cheap scrypt cost,
|
|
33
|
+
// sign up through the auth sign-up route to obtain a cookie and csrfToken, then:
|
|
34
|
+
const routes = createCatalogRoutes(auth, runtime);
|
|
35
|
+
const create = routes.find(
|
|
36
|
+
(route) =>
|
|
37
|
+
route.path === '/api/catalog/items' && route.methods.includes('POST'),
|
|
38
|
+
)!;
|
|
39
|
+
const response = await create.handler(
|
|
40
|
+
createContext(
|
|
41
|
+
new Request('https://erp.example/api/catalog/items', {
|
|
42
|
+
method: 'POST',
|
|
43
|
+
headers: {
|
|
44
|
+
'content-type': 'application/json',
|
|
45
|
+
origin: 'https://erp.example',
|
|
46
|
+
cookie,
|
|
47
|
+
'x-csrf-token': csrfToken,
|
|
48
|
+
},
|
|
49
|
+
body: JSON.stringify(input),
|
|
50
|
+
}),
|
|
51
|
+
{},
|
|
52
|
+
),
|
|
53
|
+
);
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
The auth middleware must have set the principal for `endpointIdentityFromContext` to find it: either run `auth.middleware(context, next)` before the handler or resolve the session and set `AUTH_PRINCIPAL_STATE_KEY` on `context.state` (both exported from `@flowdular/sdk/modules/auth/server`). Read `modules/auth/tests/endpoints.test.ts` for the runtime shape (`cookie`, `settings`, `service`, `middleware`).
|
|
57
|
+
|
|
58
|
+
## 4. Cases every endpoint needs
|
|
59
|
+
|
|
60
|
+
- 401 `UNAUTHENTICATED`: no cookie, no bearer token.
|
|
61
|
+
- 403 `FORBIDDEN`: a principal whose scopes lack the permission.
|
|
62
|
+
- 403 on a mutation without `x-csrf-token` (`CSRF_REJECTED`) and without `origin` (`ORIGIN_REQUIRED`).
|
|
63
|
+
- 400 with the stable code for each validation bound (`INVALID_INPUT`, module codes such as `INVALID_ITEM_KIND`).
|
|
64
|
+
- 409 for the tenant-scoped uniqueness rule, and success for the same key in another tenant.
|
|
65
|
+
- Tenant isolation: rows created for `tenant-a` are invisible to `list('tenant-b')`. The provider hands the suite the non-bypass `coreloom_runtime` role, so this runs against real forced row-level security; also assert that a call without tenant context fails with `TENANT_CONTEXT_REQUIRED`.
|
|
66
|
+
- Identity: `moduleDefinition.manifest.id` equals the module id (keeps `module.json` and `src/index.ts` aligned). The scaffold writes this and the isolation case; everything else in this list is yours.
|
|
67
|
+
|
|
68
|
+
Assert at the observation boundary: status code, `error.code`, returned record fields. Do not assert internal helper names, call order, or SQL text.
|
|
69
|
+
|
|
70
|
+
## 5. Break the implementation
|
|
71
|
+
|
|
72
|
+
A regression test that never failed proves nothing. For each new test: comment out the guard it protects (`if (denial) return denial;`, the `WHERE tenant_id = $1`, the `UNIQUE` constraint), run the suite, confirm the test fails, restore the code. Record in the handoff which tests were verified this way.
|
|
73
|
+
|
|
74
|
+
## 6. Flake sources here
|
|
75
|
+
|
|
76
|
+
`Date.now()` in `createdAt` (sort by `sku`, not by time); `randomUUID()` ids (never assert them); scrypt with the default cost is slow, so tests pass `passwordHash: { cost: 2 ** 12, ... }` as `modules/auth/tests/endpoints.test.ts` does; two tests sharing one provider see each other's rows unless the tables are truncated between them, so take a fresh fixture per test from the file's `tests/support/database.ts` helper.
|
|
77
|
+
|
|
78
|
+
## 7. Landing
|
|
79
|
+
|
|
80
|
+
Sandbox: the `tests` gate output appears in the chat after your turn. Repository root: `pnpm --filter @flowdular/module-<dir> test`, then `pnpm verify` before a PR.
|
|
81
|
+
|
|
82
|
+
## Pitfalls
|
|
83
|
+
|
|
84
|
+
- `expect(() => service.create(...)).toThrowError(/active tenant/)` pins a message; prefer the error `code` (`DUPLICATE_SKU`) when the class exposes one.
|
|
85
|
+
- A test that imports `@flowdular/sdk/ui` pulls fonts and CSS; keep client tests to `.ts` helpers.
|
|
86
|
+
- `vitest run` picks up `tests/**/*.test.ts`; a `.spec.ts` name also works but keep one convention.
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: translations-i18n
|
|
3
|
+
description: >-
|
|
4
|
+
Add or review Flowdular UI translations through the shared client runtime,
|
|
5
|
+
module bundles, locale-aware formatting, and validation gates.
|
|
6
|
+
roles:
|
|
7
|
+
- business-manager
|
|
8
|
+
- frontend-engineer
|
|
9
|
+
- ux-designer
|
|
10
|
+
- module-executor
|
|
11
|
+
when: A module adds user-facing copy, a locale changes, a raw translation key appears, or UI must support another language.
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Translate Flowdular UI
|
|
15
|
+
|
|
16
|
+
Flowdular loads translations at runtime. The shell owns locale selection and the fallback chain; each module owns its copy.
|
|
17
|
+
|
|
18
|
+
## Runtime contract
|
|
19
|
+
|
|
20
|
+
- `packages/client/src/i18n` registers the shell bundle and every enabled module bundle. Resolution is active locale, then `en`, then the key itself so a missing key stays visible.
|
|
21
|
+
- A module contribution imports `translations/en.json` and every declared locale, then returns `translations: { en, pl }` with its `moduleId`.
|
|
22
|
+
- Use fully qualified keys with `t()`, for example `t('catalog.items.title')`. In `.tsrx`, import from `@flowdular/sdk/client`. In plain `.ts` helpers, import from `@flowdular/sdk/client/i18n` so tests do not pull the TSRX shell entry.
|
|
23
|
+
- Navigation and account-menu labels use getters. Contributions are created before their bundles are registered, so eager `label: t(...)` can paint a raw key.
|
|
24
|
+
- Locale-sensitive dates, numbers and currency use `activeLocale()` with `Intl.DateTimeFormat` or `Intl.NumberFormat`.
|
|
25
|
+
- The personal locale selector lives in Profile and applies immediately. The tenant default remains an Administration setting and is the fallback when the browser has no personal choice.
|
|
26
|
+
|
|
27
|
+
## Module workflow
|
|
28
|
+
|
|
29
|
+
1. Keep the same locale list in `spec/module.yaml`, `module.json` and `flowdular.json`. Every module ships `en`.
|
|
30
|
+
2. Put all user-facing labels, hints, empty states, errors and accessible names in `translations/<locale>.json`. Keep flat, module-local keys such as `items.form.save`; the runtime adds the module namespace.
|
|
31
|
+
3. Add the same key to every locale in the same change. Write natural copy in each language.
|
|
32
|
+
4. Import the bundles in `src/client/contribution.tsrx` and expose them through `translations`.
|
|
33
|
+
5. Replace literals with `t('<module>.<key>')`. Dynamic families such as `t('expenses.status.' + status)` require every possible suffix in every bundle.
|
|
34
|
+
6. For a new locale-sensitive helper, add a test that changes the active locale and proves both the text and formatting.
|
|
35
|
+
|
|
36
|
+
Navigation pattern:
|
|
37
|
+
|
|
38
|
+
```ts
|
|
39
|
+
import { t, type ModuleClientContribution } from '@flowdular/sdk/client';
|
|
40
|
+
import translationsEn from '../../translations/en.json';
|
|
41
|
+
import translationsPl from '../../translations/pl.json';
|
|
42
|
+
|
|
43
|
+
return {
|
|
44
|
+
moduleId: 'inventory.core',
|
|
45
|
+
translations: { en: translationsEn, pl: translationsPl },
|
|
46
|
+
navigation: [
|
|
47
|
+
{
|
|
48
|
+
get label() {
|
|
49
|
+
return t('inventory.navigation.label');
|
|
50
|
+
},
|
|
51
|
+
get description() {
|
|
52
|
+
return t('inventory.navigation.description');
|
|
53
|
+
},
|
|
54
|
+
// remaining contribution fields
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
};
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Validation
|
|
61
|
+
|
|
62
|
+
Run:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
pnpm flowdular module validate --module <module-id>
|
|
66
|
+
pnpm --filter @flowdular/module-<dir> typecheck
|
|
67
|
+
pnpm --filter @flowdular/module-<dir> test
|
|
68
|
+
pnpm format:check
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
`module validate` rejects a missing locale file, mismatched locale key sets, and a static `t('module.key')` whose module bundle does not contain the key. A dynamic key cannot be proven statically, so test its complete value set.
|
|
72
|
+
|
|
73
|
+
When a raw key appears in the UI, check in this order:
|
|
74
|
+
|
|
75
|
+
1. The key exists in `translations/en.json` and the active locale.
|
|
76
|
+
2. The contribution exposes the bundle under the correct `moduleId` namespace.
|
|
77
|
+
3. Navigation copy is lazy through getters.
|
|
78
|
+
4. The running dev server has rebuilt after the contribution changed.
|
|
79
|
+
|
|
80
|
+
## Do not
|
|
81
|
+
|
|
82
|
+
- Add a module-local translation runtime or import JSON directly in each view.
|
|
83
|
+
- Leave English fallbacks in client API helpers. Use a translated fallback and preserve server messages when present.
|
|
84
|
+
- Translate identifiers, provider names, currency codes, shortcuts or stable error codes.
|
|
85
|
+
- Hide a missing key with an empty string.
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ux-design
|
|
3
|
+
description: >-
|
|
4
|
+
Design a module screen on the shared design system, with the record-screen
|
|
5
|
+
recipe, the five states, the component and class inventory, and the icon keys.
|
|
6
|
+
roles:
|
|
7
|
+
- ux-designer
|
|
8
|
+
- frontend-engineer
|
|
9
|
+
when: A screen, drawer form, dashboard widget, or copy is being designed or reviewed.
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Design a screen
|
|
13
|
+
|
|
14
|
+
`docs/design-system.md` (in a session: `reference/design-system.md`) is the only source of visual decisions. Primitives live in `packages/ui` (`reference/packages/ui/components/*.tsrx` and `components.css`). The reference screen is `.ai/references/catalog/src/client/CatalogView.tsrx` with `CatalogItemForm.tsrx`.
|
|
15
|
+
|
|
16
|
+
## 1. Rules (design-system.md, section Rules)
|
|
17
|
+
|
|
18
|
+
1. Primitives first: a `ui-*` class or an exported component before any new visual code.
|
|
19
|
+
2. Colors, fonts, sizes, radii and shadows only from tokens (`var(--...)`); no hex in module CSS.
|
|
20
|
+
3. Never restyle or override a `ui-*` class outside `packages/ui`.
|
|
21
|
+
4. A missing primitive becomes a module-local component on tokens, flagged as a promotion candidate for `packages/ui`.
|
|
22
|
+
5. Blue is action and selection; green, amber and red are state; copper is the brand only.
|
|
23
|
+
6. Minimum text size 12 px; labels `--text-xs` uppercase; numbers tabular (`.num`, `ui-kpi__value`).
|
|
24
|
+
7. Containment is owned by the primitives: children of `ui-view`, `ui-two-col`, `ui-grid-2`, `ui-kpi-grid` shrink, long words wrap, wide content scrolls inside `ui-table-wrap`.
|
|
25
|
+
8. `Kpi` is a stat tile: the value is a number or a short state word; identifiers, addresses and paths go into `note` or a `ui-mono` line.
|
|
26
|
+
9. Records own the page; creating and editing happens in a `Drawer`. Never split the width between a table and a form.
|
|
27
|
+
|
|
28
|
+
## 2. Record screen recipe
|
|
29
|
+
|
|
30
|
+
```text
|
|
31
|
+
div.ui-view
|
|
32
|
+
PageHeader eyebrow title description actions: Button sm [Icon refresh 14] Refresh, Button sm primary [Icon plus 14] New ...
|
|
33
|
+
Alert only when error && !formOpen
|
|
34
|
+
TableCard title count head is one line: title with its count left, SearchField and Filters right
|
|
35
|
+
search SearchField value placeholder label onInput
|
|
36
|
+
filters Filters open onToggle activeCount; the controls live inside the dropdown
|
|
37
|
+
columns rows rowKey columns is a module-level readonly TableColumn<Row>[] outside the component
|
|
38
|
+
status 'loading' | 'idle' 'loading' only while status === 'loading' && rows.length === 0
|
|
39
|
+
empty emptyFiltered filtered filtered picks which of the two the table renders
|
|
40
|
+
actions actionsLabel visible compact buttons; undefined when the scope is missing
|
|
41
|
+
note one constraint worth stating
|
|
42
|
+
Drawer open title subtitle onClose form keyed by 'form-' + formSession
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
`TableCard` is the record card and `Table` is the only table in the product: never hand-roll `table.ui-table` again, and never rebuild the head, the loading row or the empty state that these already own. `actions(row)` returns `TableAction[]`; the component renders visible compact buttons in its narrow trailing column. Do not build a dropdown or module-owned action markup. Fixed column widths apply through loading, empty and populated states. A cell returns nodes: `span.ui-cell` (`<b>` primary, `<small>` secondary), `ui-mono` for an identifier, `Tag` for state, `numeric: true` on the column for tabular figures.
|
|
46
|
+
|
|
47
|
+
The shared `Table` is backed by the official `@octanejs/tanstack-table` adapter. A module never imports TanStack directly. It supplies the Flowdular columns, rows and actions above, while `@flowdular/sdk/ui` owns the features, row model, header model and cell rendering.
|
|
48
|
+
|
|
49
|
+
Every column declares `width`. Primary identity and descriptions get the largest share, dates and identifiers a medium share, and counts or status the smallest. For a table with actions, data widths normally add up to about 90 percent because the shared action column is 160 px. Without actions they add up to 100 percent. Do not leave all columns unspecified: equal distribution wastes space and weakens the hierarchy.
|
|
50
|
+
|
|
51
|
+
Drawer form: `form.ui-drawer__form > div.ui-drawer__body > div.ui-form > div.ui-form__row > FormField label required help` wrapping a native `input.ui-input`, `select.ui-select` or `textarea.ui-textarea`; `Alert` inside the body for the submit error; `div.ui-drawer__foot` with `<small>` for the constraint and `div.ui-form__actions` (Cancel, primary submit with `disabled={busy}` and a progressive label `Creating…`). `Drawer width="lg"` when rows have two columns or an editor.
|
|
52
|
+
|
|
53
|
+
Read-only master-detail (runs, playground) keeps `ui-two-col` (+ `--wide-aside`). Admin overviews use `ui-kpi-grid` with several `Kpi`; a module dashboard widget is one `Kpi` with `href` and `linkLabel`, rendered by the shell in `dashboard.metrics`.
|
|
54
|
+
|
|
55
|
+
## 3. Five states
|
|
56
|
+
|
|
57
|
+
- Loading: `Table status="loading"` while `status === 'loading' && rows.length === 0`, so a refresh never blanks rows the user is reading.
|
|
58
|
+
- Empty: `empty` with an icon and a sentence that names the first action; `emptyFiltered` says no match and is chosen by `filtered`.
|
|
59
|
+
- Error: `Alert` (tone `danger` default) under the header, or inside the drawer while the form is open.
|
|
60
|
+
- Populated: the `Table` rows, or a list where records are not tabular.
|
|
61
|
+
- Denied: the shell already hides navigation and widgets whose `scope` the principal lacks. Inside a view, pass booleans derived from `ModuleClientContext.scopes` (`canManage={options.scopes.includes(X_PERMISSIONS.manage)}` in `contribution.tsrx`, as `modules/agents` does) and do not render the action. A 403 from the server still becomes an `Alert`; it is never a crash.
|
|
62
|
+
|
|
63
|
+
## 4. Component and prop inventory (`packages/ui/src/components`)
|
|
64
|
+
|
|
65
|
+
- `Button`: `variant` primary, secondary (default), ghost, danger; `size` sm, md, lg; `type` button, submit; `block`; `disabled`; `onClick`.
|
|
66
|
+
- `FormField`: `label`, `required`, `help`, `error`; one control child with `ui-input`, `ui-select` or `ui-textarea`.
|
|
67
|
+
- `SearchField`: `value`, `placeholder`, `label` (accessible name), `onInput(value)`.
|
|
68
|
+
- `Table`: `columns: TableColumn<Row>[]` (`key`, `header`, required `width`, `cell(row)`, `numeric`), `rows`, `rowKey(row)`, `status`, `loadingLabel`, `empty`, `emptyFiltered`, `filtered`, `actions(row): TableAction[]`, `actionsLabel`, optional stable `actionsWidth` (160 px default, 280 px for two actions), `onSelect(row)`, `selectedKey`, `caption`.
|
|
69
|
+
- `TableCard`: every `Table` prop plus `title`, `count`, `head`, `search`, `filters`, `before`, `after`, `note`, `noteIcon`.
|
|
70
|
+
- `Filters`: `open`, `onToggle`, `activeCount`, `label`; children are the filter controls, which belong in the dropdown and nowhere else.
|
|
71
|
+
- `CheckGrid`: `groups: { label, options: { value, label, hint? }[] }[]`, `value: string[]`, `mono`, `disabled`, `onChange(next)`.
|
|
72
|
+
- `Drawer`: `open`, `title`, `subtitle`, `width` md or lg, `onClose`; child is `ui-drawer__form` or `ui-drawer__body`. Escape and the scrim close it.
|
|
73
|
+
- `Tag`: `tone` neutral, success, warning, danger, info, ink; `dot`; `mono`.
|
|
74
|
+
- `Kpi`: `label`, `value` (string), `unit`, `badge`, `note`, `href`, `linkLabel`.
|
|
75
|
+
- `PageHeader`: `eyebrow`, `title`, `description`; children are the right-side actions.
|
|
76
|
+
- `EmptyState`: `icon`, `title`, `code`, children as the sentence.
|
|
77
|
+
- `Alert`: `tone` danger (default), warning, info.
|
|
78
|
+
- `Avatar`: `name`, `square` (organizations), `large`.
|
|
79
|
+
- `Icon`: `name`, `size` (18 default, 16 in controls, 14 in `Button size="sm"`), `strokeWidth`.
|
|
80
|
+
- `BrandMark`: `size`, `signature`, `tone`; brand moments only.
|
|
81
|
+
|
|
82
|
+
Icon keys (`ICON_PATHS`, `packages/ui/src/icons/Icon.tsrx`): `dashboard`, `parties`, `catalog`, `user`, `users`, `shield`, `code`, `modules`, `file-text`, `play`, `bot`, `flask`, `activity`, `plug`, `search`, `chevron-down`, `chevrons-up-down`, `plus`, `panel-left`, `check`, `filter`, `download`, `more`, `external`, `alert`, `x`, `sign-out`, `refresh`, `help`, `key`, `settings`, `braces`. An unknown name renders `modules` silently, so check the list.
|
|
83
|
+
|
|
84
|
+
## 5. Classes a module writes by hand (`packages/ui/src/styles/components.css`)
|
|
85
|
+
|
|
86
|
+
Layout `ui-view`, `ui-two-col` (+`--wide-aside`), `ui-grid-2`, `ui-kpi-grid`, `ui-tag-cloud`, `ui-section-head` (h2 plus actions inside a view), `ui-toolbar` (+`__spacer`). Surfaces `ui-card` (+`__head`, `__title`, `__body`). Data `ui-table` (+`ui-table-wrap`, `ui-table__empty`, `ui-table__state` for a dot plus label, `.num`), `ui-cell` (+`ui-cell__muted`), `ui-mono`, `ui-code`, `ui-dot` (+`--muted`). Row action classes are component-owned and are never written by a module. Forms `ui-form` (+`__row`, `__row--4`, `__foot`, `__actions`), `ui-input` (+`--error`), `ui-select`, `ui-textarea` (+`--error`), `ui-checkbox`, `ui-label`, `ui-help` (+`--error`). Drawer `ui-drawer__form`, `ui-drawer__body`, `ui-drawer__foot`. Bits `ui-kbd`, `ui-note`, `ui-menu` (+`__label`, `__item`, `__item--active`, `__item--danger`, `__sep`), `ui-btn ui-btn--icon` for an icon-only button. Classes rendered by components (`ui-drawer__panel`, `ui-search`, `ui-page-head*`, `ui-field`, `ui-empty*`, `ui-alert*`, `ui-tag*`, `ui-kpi__*`, `ui-checks*`, `ui-avatar*`) are not written by hand.
|
|
87
|
+
|
|
88
|
+
## 6. Copy
|
|
89
|
+
|
|
90
|
+
User-facing copy lives in every declared `translations/*.json` bundle and is read with fully qualified `t()` keys. Eyebrow names the domain, title names the records, and description is one sentence. Table headers say what the value is. Buttons start with a verb. Loading text ends with `…`. Drawer footer states the constraint the user cannot see. Write natural copy in each locale, with no exclamation marks or database jargon.
|
|
91
|
+
|
|
92
|
+
## Pitfalls
|
|
93
|
+
|
|
94
|
+
- `Kpi value={items.length}` does not typecheck; use `String(items.length)`.
|
|
95
|
+
- A `Tag` for a lifecycle state uses `success` for active and `neutral` for archived, with `dot`.
|
|
96
|
+
- An `Icon` inside `Button size="sm"` is 14, not 18.
|
|
97
|
+
- A new component file per screen, form, table, or stateful region; a page composes them.
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: variables
|
|
3
|
+
description: >-
|
|
4
|
+
Build variable-aware fields and templates on the {{ }} contract, the scope
|
|
5
|
+
mask, and server-side resolution, with agents.core as the worked example.
|
|
6
|
+
roles:
|
|
7
|
+
- frontend-engineer
|
|
8
|
+
- ux-designer
|
|
9
|
+
- agentic-engineer
|
|
10
|
+
- backend-engineer
|
|
11
|
+
- module-executor
|
|
12
|
+
when: A field must let a value embed {{ variable }} tokens filled from other fields, the request context, or another module.
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Variables (templating and linked fields)
|
|
16
|
+
|
|
17
|
+
A variable field lets a stored value embed `{{ key }}` tokens that are filled at
|
|
18
|
+
run time from context or another module's data. The contract is pure and lives
|
|
19
|
+
in `@flowdular/sdk/contracts` (`packages/contracts/src/variables.ts`); the fields are
|
|
20
|
+
presentational primitives in `@flowdular/sdk/ui`; resolution happens on the server
|
|
21
|
+
before the consumer sees the text. `agents.core` is the worked example: an agent
|
|
22
|
+
author writes instructions as a template and the run snapshot carries the
|
|
23
|
+
resolved text.
|
|
24
|
+
|
|
25
|
+
## The `{{ }}` contract
|
|
26
|
+
|
|
27
|
+
`VariableDefinition { key, label, kind, scope?, sample?, description? }` is one
|
|
28
|
+
offerable variable. `kind` is `text | number | date | money | identifier`.
|
|
29
|
+
`key` is a dot path whose segments start lowercase and may continue in
|
|
30
|
+
camelCase (`context.user.displayName`), matched by `VARIABLE_KEY_PATTERN` /
|
|
31
|
+
`isVariableKey`.
|
|
32
|
+
|
|
33
|
+
- `extractVariables(template)`: the distinct trimmed `{{ key }}` tokens, in
|
|
34
|
+
first-seen order.
|
|
35
|
+
- `validateTemplate(template, available, allowedScopes?)`: `{ unknown, forbidden }`.
|
|
36
|
+
`unknown` are tokens not in `available`; `forbidden` are tokens whose def
|
|
37
|
+
declares a `scope` not present in `allowedScopes` (omit `allowedScopes` to skip
|
|
38
|
+
the scope check).
|
|
39
|
+
- `resolveTemplate(template, values, { onMissing })`: substitutes each
|
|
40
|
+
`{{ key }}` with `values[key]`. `onMissing` is `keep` (default, leave the token
|
|
41
|
+
verbatim) or `blank`.
|
|
42
|
+
- `tokenizeTemplate(template)`: the segments the UI overlay highlights; the
|
|
43
|
+
`text` fields concatenate back to the exact input.
|
|
44
|
+
|
|
45
|
+
Rules the resolver guarantees: tokens are `{{ key }}` with optional inner spaces;
|
|
46
|
+
`\{{` outputs a literal `{{`; substitution is a single pass, so a value that
|
|
47
|
+
itself looks like a token is emitted verbatim (never recursive); only own,
|
|
48
|
+
string keys resolve, so prototype keys (`__proto__`, `toString`) never resolve.
|
|
49
|
+
No eval, no expressions, only key substitution.
|
|
50
|
+
|
|
51
|
+
## The scope mask
|
|
52
|
+
|
|
53
|
+
`VariableDefinition.scope` is the permission required to read the source. A
|
|
54
|
+
variable is offered and resolved only when the principal holds that scope:
|
|
55
|
+
|
|
56
|
+
- The UI fields never fetch and never check scopes. The caller passes
|
|
57
|
+
`variables` already filtered to what this principal may use, so a variable the
|
|
58
|
+
principal cannot read is simply absent from the menu and highlights as an error
|
|
59
|
+
pill if typed.
|
|
60
|
+
- On the server, filter the definition list by the principal's scopes before
|
|
61
|
+
building `values`, or call `validateTemplate(..., allowedScopes)` and refuse a
|
|
62
|
+
template whose `forbidden` is non-empty. A scope-less variable
|
|
63
|
+
(`context.*`) is always allowed.
|
|
64
|
+
|
|
65
|
+
## The UI fields (`@flowdular/sdk/ui`)
|
|
66
|
+
|
|
67
|
+
`VariableTextarea` (multiline), `VariableInput` (single line), and
|
|
68
|
+
`VariableSelect` (one literal option or one variable token) are presentational.
|
|
69
|
+
All take `value`, `onInput`, `variables: readonly VariableDefinition[]`, optional
|
|
70
|
+
`sampleValues?: Record<string,string>`, required translated `label` (accessible
|
|
71
|
+
name), `name` (so a `FormData` submit still captures it), `required`, `disabled`,
|
|
72
|
+
and `error`. Input and textarea also require translated `insertLabel`,
|
|
73
|
+
`variablesLabel`, and `emptyLabel`; the shared primitive has no English copy to
|
|
74
|
+
fall back to. Select takes `options: readonly VariableSelectLiteralOption[]` and
|
|
75
|
+
requires translated `literalGroupLabel` and `variablesGroupLabel`. A caller also
|
|
76
|
+
localizes every `VariableDefinition.label` before passing the definitions, since
|
|
77
|
+
that label is visible in the picker.
|
|
78
|
+
|
|
79
|
+
- The `braces` affordance (a `{}` icon in `ICON_PATHS`) opens a menu of the
|
|
80
|
+
available variables with label, key, and current or sample value; picking one
|
|
81
|
+
inserts `{{ key }}` at the caret. Typing `{{` opens the same menu filtered by
|
|
82
|
+
what follows; ArrowUp/Down and Enter pick, Escape closes.
|
|
83
|
+
- Tokens are highlighted by an overlay layer (`tokenizeTemplate`) sitting behind
|
|
84
|
+
a transparent control, so `{{ key }}` reads as a pill while the real value
|
|
85
|
+
stays plain text; an unknown or forbidden token gets the error pill. All
|
|
86
|
+
color comes from tokens; measurement is client-only in an effect, so SSR is
|
|
87
|
+
safe. See `packages/ui/src/components/VariableField.tsrx` and its wrappers.
|
|
88
|
+
- `VariableSelect` stays a native `<select>`. Literal values and allowed
|
|
89
|
+
`{{ key }}` tokens are real `<option>` values, so keyboard navigation,
|
|
90
|
+
validation, disabled state, accessible naming, and `FormData` submission keep
|
|
91
|
+
browser semantics. Samples appear only in option labels. The component never
|
|
92
|
+
resolves the selected token.
|
|
93
|
+
|
|
94
|
+
Keep the fields presentational: the caller supplies `variables` and
|
|
95
|
+
`sampleValues`, the component never fetches.
|
|
96
|
+
|
|
97
|
+
The platform variable registry (`@flowdular/sdk/kernel`) registers definitions and
|
|
98
|
+
their execution-time resolvers. Reach the shared instance with
|
|
99
|
+
`platformVariableRegistry(context.capabilities)`. `list(scopes)` requires an
|
|
100
|
+
explicit permission snapshot and is the only
|
|
101
|
+
definition list a server sends to a field. `resolve(template, request)` takes a
|
|
102
|
+
trusted tenant id, actor, immutable permission snapshot, `AbortSignal`, explicit
|
|
103
|
+
record bindings and optional values owned by the consumer. It validates the
|
|
104
|
+
whole template before invoking a source. An unknown token, missing scope,
|
|
105
|
+
missing binding, aborted request, unavailable record, or source failure is a
|
|
106
|
+
refusal. Source exceptions are replaced with a generic error so SQL, provider,
|
|
107
|
+
and record details do not cross the module boundary.
|
|
108
|
+
|
|
109
|
+
The source declares `requiredBindings` per variable. For example, `party.name`
|
|
110
|
+
requires `partyId`; the resolver receives that id explicitly and asks the
|
|
111
|
+
parties public capability or read tool under `request.tenantId`. It never infers
|
|
112
|
+
a record from browser state and never reads the parties database. Local form
|
|
113
|
+
values go in `request.values`, while cross-module values must come from the
|
|
114
|
+
registered resolver. The resolved text is returned to the server consumer only;
|
|
115
|
+
the raw template remains stored.
|
|
116
|
+
|
|
117
|
+
## Server-side resolution rule
|
|
118
|
+
|
|
119
|
+
Resolve the template before the consumer sees it, and keep the raw template
|
|
120
|
+
stored. The stored record keeps the `{{ }}` template; the run or send snapshot
|
|
121
|
+
carries the resolved text. Never resolve in the client and never store the
|
|
122
|
+
resolved text back onto the definition.
|
|
123
|
+
|
|
124
|
+
Worked example in `agents.core`:
|
|
125
|
+
|
|
126
|
+
- `modules/agents/src/domain/context-variables.ts` declares
|
|
127
|
+
`AGENT_CONTEXT_VARIABLES` (`context.tenantName`, `context.today`,
|
|
128
|
+
`context.user.displayName`, `context.user.email`, all scope-less) and
|
|
129
|
+
`agentContextValues(input)` that builds their values from the run's
|
|
130
|
+
tenant/principal/date.
|
|
131
|
+
- `AgentService.enqueueRun` (`services/agent-service.ts`) resolves
|
|
132
|
+
`agent.instructions` with `resolveTemplate` against those values before it
|
|
133
|
+
builds the instruction snapshot; the stored definition is untouched. The
|
|
134
|
+
endpoint (`api/endpoints.ts`) supplies the tenant name and principal from the
|
|
135
|
+
request; `today` comes from the queue timestamp.
|
|
136
|
+
- `AgentDefinitionForm.tsrx` feeds `VariableTextarea` the context variable list
|
|
137
|
+
and sample values, so an author gets the menu and highlighting.
|
|
138
|
+
|
|
139
|
+
## Adding a variable source via a capability or tool
|
|
140
|
+
|
|
141
|
+
Business-data variables (for example `{{ party.name }}`) resolve through a
|
|
142
|
+
public capability or an agent read tool owned by the source module:
|
|
143
|
+
|
|
144
|
+
1. Declare the `VariableDefinition` with `scope` equal to the source tool's
|
|
145
|
+
`requiredPermissions` (`AgentTool` in `packages/harness/src/runtime.ts`). The
|
|
146
|
+
tool's permission is the mask: one source of truth, no parallel table.
|
|
147
|
+
2. Register the source on the shared registry during module composition. Declare
|
|
148
|
+
the record id in `requiredBindings`; do not accept a tenant binding.
|
|
149
|
+
3. Offer it only through `registry.list(principal.scopes)`. The UI fields take
|
|
150
|
+
this already-filtered list and never fetch.
|
|
151
|
+
4. Call `registry.resolve` on the server with the trusted tenant, actor,
|
|
152
|
+
permission snapshot, signal, and explicit bindings. The source invokes only
|
|
153
|
+
its owning public capability or read tool and maps the bounded result to
|
|
154
|
+
strings. The registry refuses before the source runs if the scope or binding
|
|
155
|
+
is absent.
|
|
156
|
+
|
|
157
|
+
`automations.core` is the live cross-module example. `agent.name` requires the
|
|
158
|
+
schedule's explicit `agentId`, and its resolver calls the `agents.run-queue`
|
|
159
|
+
capability with the active tenant. A binding containing an agent from another
|
|
160
|
+
tenant resolves to no record and the run is refused. The schedule keeps the raw
|
|
161
|
+
template; only the queued run receives the resolved input.
|
|
162
|
+
|
|
163
|
+
Register a new tool with the `agent-tool-design` skill; this skill covers only
|
|
164
|
+
how its output becomes a resolvable variable.
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: workflow-development
|
|
3
|
+
description: >-
|
|
4
|
+
Build, publish, invoke, and test a workflows.core DAG through its typed graph
|
|
5
|
+
and public execution capability without bypassing agent, action, tenant, or
|
|
6
|
+
audit boundaries.
|
|
7
|
+
roles:
|
|
8
|
+
- agentic-engineer
|
|
9
|
+
- backend-engineer
|
|
10
|
+
- frontend-engineer
|
|
11
|
+
- module-executor
|
|
12
|
+
when: A brief asks for a workflow, pipeline, canvas node, workflow action, or a module feature that starts a workflow.
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Build and integrate an agentic workflow
|
|
16
|
+
|
|
17
|
+
`workflows.core` owns durable directed acyclic workflows. A workflow coordinates
|
|
18
|
+
pinned agent revisions, deterministic gates, schema validators, registered
|
|
19
|
+
module actions, data mappings, and terminal output. It does not own schedules or
|
|
20
|
+
webhook secrets. Those remain optional concerns of `automations.core`.
|
|
21
|
+
|
|
22
|
+
Read `docs/adr/0006-agentic-workflows.md`, the approved
|
|
23
|
+
`modules/workflows/spec/module.yaml`, and the contracts in
|
|
24
|
+
`modules/workflows/src/domain/types.ts` before changing a workflow surface.
|
|
25
|
+
|
|
26
|
+
## Pick the correct extension point
|
|
27
|
+
|
|
28
|
+
- A workflow definition belongs in `workflows.core` and is edited through its
|
|
29
|
+
API or canvas. Do not hardcode a tenant workflow in source.
|
|
30
|
+
- A business operation that a workflow may call is a versioned agent action.
|
|
31
|
+
Register it through the agents action catalog. If missing, implement it in a
|
|
32
|
+
separate `agent-tool-design` phase with permission, input, output, timeout,
|
|
33
|
+
idempotency and audit tests before returning to workflow integration.
|
|
34
|
+
- A business module that starts a workflow resolves
|
|
35
|
+
`workflows.execution.v1` from `context.capabilities`. It never imports a
|
|
36
|
+
workflow repository or database.
|
|
37
|
+
- A schedule or signed webhook remains in `automations.core`. Its optional
|
|
38
|
+
bridge invokes the workflow capability with a service actor and a separate
|
|
39
|
+
schedule or webhook origin.
|
|
40
|
+
- If the workflow module is absent, the capability registry returns `null`.
|
|
41
|
+
Hide an optional feature or return a clear stable refusal.
|
|
42
|
+
|
|
43
|
+
## Graph contract
|
|
44
|
+
|
|
45
|
+
Version one is a bounded DAG. The graph contains:
|
|
46
|
+
|
|
47
|
+
- `input`: accepts the invocation envelope.
|
|
48
|
+
- `agent`: calls one exact immutable agent revision and validates structured
|
|
49
|
+
output.
|
|
50
|
+
- `agent-decision`: produces one schema-valid `pass` or `fail` outcome.
|
|
51
|
+
- `gate`: evaluates the versioned allowlisted logic language.
|
|
52
|
+
- `validator`: validates an envelope against a pinned JSON schema.
|
|
53
|
+
- `action`: calls one exact registered action contract version.
|
|
54
|
+
- `merge`: waits for all declared incoming paths.
|
|
55
|
+
- `output`: settles the workflow with a typed result.
|
|
56
|
+
|
|
57
|
+
Every port names a schema. Every edge connects compatible ports. Mappings are
|
|
58
|
+
declarative literals, JSON pointer paths, or templates with explicit variable
|
|
59
|
+
bindings. Never add JavaScript, dynamic imports, shell commands, downloaded
|
|
60
|
+
code, arbitrary expressions, or hidden provider decisions to graph data.
|
|
61
|
+
|
|
62
|
+
The hard limits live in `WORKFLOW_LIMITS` in
|
|
63
|
+
`modules/workflows/src/domain/types.ts`. Validation must reject a cycle,
|
|
64
|
+
dangling edge, unreachable node, missing terminal output, incompatible port,
|
|
65
|
+
missing exact dependency, oversized graph, or unsupported action risk before
|
|
66
|
+
publication.
|
|
67
|
+
|
|
68
|
+
## Revisions and publication
|
|
69
|
+
|
|
70
|
+
Draft saves use optimistic concurrency through `expectedRevision`. A successful
|
|
71
|
+
save creates the next draft revision. A conflict never overwrites another
|
|
72
|
+
editor.
|
|
73
|
+
|
|
74
|
+
Publication:
|
|
75
|
+
|
|
76
|
+
1. Validates and compiles the graph.
|
|
77
|
+
2. Resolves exact agent revisions and exact action contract versions.
|
|
78
|
+
3. Rejects missing, archived, incompatible, external, or destructive
|
|
79
|
+
dependencies.
|
|
80
|
+
4. Stores an immutable content-addressed published revision.
|
|
81
|
+
5. Leaves earlier revisions and their run evidence unchanged.
|
|
82
|
+
|
|
83
|
+
Never replace a pinned dependency with its latest version during execution.
|
|
84
|
+
Editing after publication creates another draft.
|
|
85
|
+
|
|
86
|
+
## Execution modes
|
|
87
|
+
|
|
88
|
+
Use the smallest mode that proves the change:
|
|
89
|
+
|
|
90
|
+
- Dry-run validates a draft and returns issues, compiled order, references,
|
|
91
|
+
permissions, checksum, and limits. It creates no run and invokes nothing.
|
|
92
|
+
- Simulation persists a run history but uses fixtures for nondeterministic
|
|
93
|
+
nodes. It advances virtual time without sleeping and never calls a provider,
|
|
94
|
+
action, or business mutation.
|
|
95
|
+
- Live runs only published revisions. It may call pinned agents and approved
|
|
96
|
+
read or workspace-write actions under the initiating permission snapshot.
|
|
97
|
+
|
|
98
|
+
Do not disguise simulation as live execution. Do not use live mode to test an
|
|
99
|
+
invalid draft.
|
|
100
|
+
|
|
101
|
+
## Invoke a published workflow from a module
|
|
102
|
+
|
|
103
|
+
Resolve the capability at request or service call time, after platform
|
|
104
|
+
composition has completed:
|
|
105
|
+
|
|
106
|
+
```ts
|
|
107
|
+
import {
|
|
108
|
+
WORKFLOW_EXECUTION_CAPABILITY,
|
|
109
|
+
type WorkflowExecutionCapability,
|
|
110
|
+
} from '@flowdular/sdk/modules/workflows/server';
|
|
111
|
+
|
|
112
|
+
const workflows = context.capabilities.get<WorkflowExecutionCapability>(
|
|
113
|
+
WORKFLOW_EXECUTION_CAPABILITY,
|
|
114
|
+
);
|
|
115
|
+
if (!workflows) throw new ModuleError('WORKFLOWS_UNAVAILABLE');
|
|
116
|
+
|
|
117
|
+
const accepted = await workflows.enqueue(
|
|
118
|
+
{
|
|
119
|
+
workflowKey: 'catalog-enrichment',
|
|
120
|
+
input: { itemId },
|
|
121
|
+
idempotencyKey: `catalog:${itemId}:${version}`,
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
tenantId,
|
|
125
|
+
actor,
|
|
126
|
+
origin: {
|
|
127
|
+
kind: 'module',
|
|
128
|
+
moduleId: 'catalog.core',
|
|
129
|
+
operationId: 'catalog.enrichment.start',
|
|
130
|
+
},
|
|
131
|
+
permissionSnapshot,
|
|
132
|
+
},
|
|
133
|
+
);
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
The module manifest declares `workflows.core` only when workflow support is a
|
|
137
|
+
required feature. An optional integration belongs in a small bridge module that
|
|
138
|
+
depends on both sides. Do not duplicate the capability interface locally to
|
|
139
|
+
avoid a dependency declaration.
|
|
140
|
+
|
|
141
|
+
Trusted context and business input are separate. Tenant, actor, origin, and
|
|
142
|
+
permission snapshot never come from the request body. The idempotency key is
|
|
143
|
+
stable for one logical operation. Reusing it with different input is a
|
|
144
|
+
conflict, not a second run.
|
|
145
|
+
|
|
146
|
+
## Actor and permission rules
|
|
147
|
+
|
|
148
|
+
- A user action uses the real user actor.
|
|
149
|
+
- A tool invoked by an agent uses the real agent actor and child run
|
|
150
|
+
correlation supplied by `AgentToolContext`.
|
|
151
|
+
- A schedule or webhook uses a service actor whose `configuredBy` is the real
|
|
152
|
+
user who configured it. Origin stays `schedule` or `webhook`.
|
|
153
|
+
- A workflow definition grants no scope. Live execution intersects the caller
|
|
154
|
+
snapshot with each node's agent or action requirements.
|
|
155
|
+
- A cross-tenant id, foreign cursor, missing scope, absent dependency, or
|
|
156
|
+
mismatched action version is refused before data or provider work.
|
|
157
|
+
|
|
158
|
+
## History, recovery, and cancellation
|
|
159
|
+
|
|
160
|
+
The browser observes execution. It never owns execution. Enqueue persists the
|
|
161
|
+
run before returning. Workers use leases and recover expired work from stored
|
|
162
|
+
node state, child ids, and stable side-effect idempotency keys.
|
|
163
|
+
|
|
164
|
+
Every transition appends an ordered schema-versioned event. Run, node,
|
|
165
|
+
attempt, and edge states are separate projections. `pass` and `fail` are normal
|
|
166
|
+
outcome ports, not technical statuses.
|
|
167
|
+
|
|
168
|
+
Cancellation is durable and cooperative. It prevents new nodes, asks the
|
|
169
|
+
current child agent or action to cancel, records whether it acknowledged, and
|
|
170
|
+
ignores late output for routing while keeping its safe evidence.
|
|
171
|
+
|
|
172
|
+
History responses contain redacted bounded evidence. They never expose provider
|
|
173
|
+
credentials, session tokens, hidden reasoning, encrypted payload blobs, or
|
|
174
|
+
unrestricted request bodies.
|
|
175
|
+
|
|
176
|
+
## Required tests
|
|
177
|
+
|
|
178
|
+
For a graph or runtime change, prove:
|
|
179
|
+
|
|
180
|
+
1. Deterministic compile order and rejection of cycles, dangling edges,
|
|
181
|
+
incompatible ports, unreachable nodes, and missing output.
|
|
182
|
+
2. Tenant isolation plus one unauthenticated and one unscoped refusal for every
|
|
183
|
+
endpoint group.
|
|
184
|
+
3. Exact agent and action revision refusal with no latest-version fallback.
|
|
185
|
+
4. Dry-run produces no run, provider call, action call, or business write.
|
|
186
|
+
5. Simulation uses fixtures and virtual duration with no real wait.
|
|
187
|
+
6. Live enqueue is idempotent and persists before acceptance.
|
|
188
|
+
7. Recovery before and after child enqueue does not duplicate work.
|
|
189
|
+
8. Retry records the chosen delay before waiting and reuses the side-effect
|
|
190
|
+
idempotency key.
|
|
191
|
+
9. Cancellation prevents downstream work and records late results safely.
|
|
192
|
+
10. Event replay, cursor binding, payload redaction, retention, usage, cost,
|
|
193
|
+
and audit hash-chain integrity.
|
|
194
|
+
11. The canvas shows validation, loading, empty, error, denied, simulation,
|
|
195
|
+
live, cancelled, and recovered states, including small-screen read mode.
|
|
196
|
+
|
|
197
|
+
Run the module typecheck and tests, `pnpm flowdular module validate`, then the
|
|
198
|
+
full `pnpm verify`. For a new module integration, update its approved spec and
|
|
199
|
+
move `specVersion`, `module.json` version, and package version together.
|