@msn-control/liftoff 0.10.4 → 0.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DEVELOPER.md +220 -77
- package/README.md +28 -28
- package/assets/supported-stack.json +3 -136
- package/dist/adapters/azure/governance-assessment.d.ts +2 -0
- package/dist/adapters/azure/governance-assessment.js +21 -0
- package/dist/adapters/azure/governance-assessment.js.map +1 -0
- package/dist/adapters/filesystem/atomic-write.d.ts +2 -0
- package/dist/adapters/filesystem/atomic-write.js +74 -0
- package/dist/adapters/filesystem/atomic-write.js.map +1 -0
- package/dist/adapters/filesystem/errors.d.ts +2 -0
- package/dist/adapters/filesystem/errors.js +8 -0
- package/dist/adapters/filesystem/errors.js.map +1 -0
- package/dist/adapters/filesystem/manifest-file.d.ts +1 -0
- package/dist/adapters/filesystem/manifest-file.js +21 -0
- package/dist/adapters/filesystem/manifest-file.js.map +1 -0
- package/dist/adapters/filesystem/project-config.d.ts +4 -0
- package/dist/adapters/filesystem/project-config.js +157 -0
- package/dist/adapters/filesystem/project-config.js.map +1 -0
- package/dist/adapters/filesystem/project-discovery.d.ts +2 -0
- package/dist/adapters/filesystem/project-discovery.js +30 -0
- package/dist/adapters/filesystem/project-discovery.js.map +1 -0
- package/dist/adapters/filesystem/project-files.d.ts +6 -0
- package/dist/adapters/filesystem/project-files.js +68 -0
- package/dist/adapters/filesystem/project-files.js.map +1 -0
- package/dist/adapters/filesystem/project-lock.d.ts +8 -0
- package/dist/adapters/filesystem/project-lock.js +164 -0
- package/dist/adapters/filesystem/project-lock.js.map +1 -0
- package/dist/adapters/filesystem/project-paths.d.ts +2 -0
- package/dist/adapters/filesystem/project-paths.js +60 -0
- package/dist/adapters/filesystem/project-paths.js.map +1 -0
- package/dist/adapters/filesystem/project-transaction.d.ts +23 -0
- package/dist/adapters/filesystem/project-transaction.js +158 -0
- package/dist/adapters/filesystem/project-transaction.js.map +1 -0
- package/dist/adapters/git/governance-assessment.d.ts +22 -0
- package/dist/adapters/git/governance-assessment.js +161 -0
- package/dist/adapters/git/governance-assessment.js.map +1 -0
- package/dist/adapters/github/governance-assessment.d.ts +2 -0
- package/dist/adapters/github/governance-assessment.js +18 -0
- package/dist/adapters/github/governance-assessment.js.map +1 -0
- package/dist/adapters/packaged-assets/package-root.d.ts +3 -0
- package/dist/adapters/packaged-assets/package-root.js +21 -0
- package/dist/adapters/packaged-assets/package-root.js.map +1 -0
- package/dist/adapters/packaged-assets/supported-stack.d.ts +4 -0
- package/dist/adapters/packaged-assets/supported-stack.js +18 -0
- package/dist/adapters/packaged-assets/supported-stack.js.map +1 -0
- package/dist/adapters/packaged-assets/template-assets.d.ts +23 -0
- package/dist/adapters/packaged-assets/template-assets.js +36 -0
- package/dist/adapters/packaged-assets/template-assets.js.map +1 -0
- package/dist/adapters/process/shell-command.d.ts +5 -0
- package/dist/adapters/process/shell-command.js +21 -0
- package/dist/adapters/process/shell-command.js.map +1 -0
- package/dist/application/context.d.ts +20 -0
- package/dist/application/context.js +2 -0
- package/dist/application/context.js.map +1 -0
- package/dist/application/diagnose/doctor.d.ts +21 -0
- package/dist/application/diagnose/doctor.js +586 -0
- package/dist/application/diagnose/doctor.js.map +1 -0
- package/dist/application/diagnose/generated-project.d.ts +1 -0
- package/dist/application/diagnose/generated-project.js +105 -0
- package/dist/application/diagnose/generated-project.js.map +1 -0
- package/dist/application/diagnose/validate.d.ts +6 -0
- package/dist/application/diagnose/validate.js +27 -0
- package/dist/application/diagnose/validate.js.map +1 -0
- package/dist/application/initialize/fixture.d.ts +2 -0
- package/dist/application/initialize/fixture.js +39 -0
- package/dist/application/initialize/fixture.js.map +1 -0
- package/dist/application/initialize/inputs.d.ts +3 -0
- package/dist/application/initialize/inputs.js +35 -0
- package/dist/application/initialize/inputs.js.map +1 -0
- package/dist/application/initialize/use-case.d.ts +23 -0
- package/dist/application/initialize/use-case.js +360 -0
- package/dist/application/initialize/use-case.js.map +1 -0
- package/dist/application/migrate/use-case.d.ts +7 -0
- package/dist/application/migrate/use-case.js +378 -0
- package/dist/application/migrate/use-case.js.map +1 -0
- package/dist/application/project/catalog.d.ts +46 -0
- package/dist/application/project/catalog.js +12 -0
- package/dist/application/project/catalog.js.map +1 -0
- package/dist/application/project/manifest.d.ts +2 -0
- package/dist/application/project/manifest.js +29 -0
- package/dist/application/project/manifest.js.map +1 -0
- package/dist/application/project/planning.d.ts +6 -0
- package/dist/application/project/planning.js +12 -0
- package/dist/application/project/planning.js.map +1 -0
- package/dist/application/update/planning.d.ts +40 -0
- package/dist/application/update/planning.js +293 -0
- package/dist/application/update/planning.js.map +1 -0
- package/dist/application/update/reporting.d.ts +42 -0
- package/dist/application/update/reporting.js +325 -0
- package/dist/application/update/reporting.js.map +1 -0
- package/dist/application/update/use-case.d.ts +8 -0
- package/dist/application/update/use-case.js +600 -0
- package/dist/application/update/use-case.js.map +1 -0
- package/dist/application/upgrade/use-case.d.ts +6 -0
- package/dist/application/upgrade/use-case.js +82 -0
- package/dist/application/upgrade/use-case.js.map +1 -0
- package/dist/args.d.ts +5 -65
- package/dist/args.js +4 -472
- package/dist/args.js.map +1 -1
- package/dist/artifact-lifecycle.d.ts +1 -21
- package/dist/artifact-lifecycle.js +1 -75
- package/dist/artifact-lifecycle.js.map +1 -1
- package/dist/catalogs.d.ts +1 -50
- package/dist/catalogs.js +1 -472
- package/dist/catalogs.js.map +1 -1
- package/dist/cli/args/contracts.d.ts +51 -0
- package/dist/cli/args/contracts.js +2 -0
- package/dist/cli/args/contracts.js.map +1 -0
- package/dist/cli/args/definitions.d.ts +6 -0
- package/dist/cli/args/definitions.js +187 -0
- package/dist/cli/args/definitions.js.map +1 -0
- package/dist/cli/args/help.d.ts +5 -0
- package/dist/cli/args/help.js +130 -0
- package/dist/cli/args/help.js.map +1 -0
- package/dist/cli/args/parser.d.ts +5 -0
- package/dist/cli/args/parser.js +145 -0
- package/dist/cli/args/parser.js.map +1 -0
- package/dist/cli/args/readers.d.ts +4 -0
- package/dist/cli/args/readers.js +19 -0
- package/dist/cli/args/readers.js.map +1 -0
- package/dist/cli/commands/diagnose.d.ts +4 -0
- package/dist/cli/commands/diagnose.js +12 -0
- package/dist/cli/commands/diagnose.js.map +1 -0
- package/dist/cli/commands/dispatch.d.ts +3 -0
- package/dist/cli/commands/dispatch.js +94 -0
- package/dist/cli/commands/dispatch.js.map +1 -0
- package/dist/cli/commands/help.d.ts +3 -0
- package/dist/cli/commands/help.js +32 -0
- package/dist/cli/commands/help.js.map +1 -0
- package/dist/cli/commands/helpers.d.ts +8 -0
- package/dist/cli/commands/helpers.js +97 -0
- package/dist/cli/commands/helpers.js.map +1 -0
- package/dist/cli/commands/initialize.d.ts +3 -0
- package/dist/cli/commands/initialize.js +7 -0
- package/dist/cli/commands/initialize.js.map +1 -0
- package/dist/cli/commands/migrate.d.ts +3 -0
- package/dist/cli/commands/migrate.js +8 -0
- package/dist/cli/commands/migrate.js.map +1 -0
- package/dist/cli/commands/plan.d.ts +3 -0
- package/dist/cli/commands/plan.js +34 -0
- package/dist/cli/commands/plan.js.map +1 -0
- package/dist/cli/commands/reference.d.ts +5 -0
- package/dist/cli/commands/reference.js +43 -0
- package/dist/cli/commands/reference.js.map +1 -0
- package/dist/cli/commands/update.d.ts +3 -0
- package/dist/cli/commands/update.js +9 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/commands/upgrade.d.ts +3 -0
- package/dist/cli/commands/upgrade.js +7 -0
- package/dist/cli/commands/upgrade.js.map +1 -0
- package/dist/cli/context.d.ts +1 -0
- package/dist/cli/context.js +2 -0
- package/dist/cli/context.js.map +1 -0
- package/dist/cli/project-options.d.ts +3 -0
- package/dist/cli/project-options.js +41 -0
- package/dist/cli/project-options.js.map +1 -0
- package/dist/cli.d.ts +3 -3
- package/dist/cli.js +2 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands.d.ts +4 -35
- package/dist/commands.js +3 -2969
- package/dist/commands.js.map +1 -1
- package/dist/container-validation.d.ts +1 -1
- package/dist/domain/governance/activation/approvals.d.ts +351 -0
- package/dist/domain/governance/activation/approvals.js +528 -0
- package/dist/domain/governance/activation/approvals.js.map +1 -0
- package/dist/domain/governance/activation/canonical-json.d.ts +4 -0
- package/dist/domain/governance/activation/canonical-json.js +39 -0
- package/dist/domain/governance/activation/canonical-json.js.map +1 -0
- package/dist/domain/governance/activation/capabilities.d.ts +7 -0
- package/dist/domain/governance/activation/capabilities.js +33 -0
- package/dist/domain/governance/activation/capabilities.js.map +1 -0
- package/dist/domain/governance/activation/evidence.d.ts +63 -0
- package/dist/domain/governance/activation/evidence.js +444 -0
- package/dist/domain/governance/activation/evidence.js.map +1 -0
- package/dist/domain/governance/activation/graph.d.ts +397 -0
- package/dist/domain/governance/activation/graph.js +441 -0
- package/dist/domain/governance/activation/graph.js.map +1 -0
- package/dist/domain/governance/activation/inputs.d.ts +25 -0
- package/dist/domain/governance/activation/inputs.js +63 -0
- package/dist/domain/governance/activation/inputs.js.map +1 -0
- package/dist/domain/governance/activation/operations.d.ts +19 -0
- package/dist/domain/governance/activation/operations.js +181 -0
- package/dist/domain/governance/activation/operations.js.map +1 -0
- package/dist/domain/governance/activation/readiness.d.ts +27 -0
- package/dist/domain/governance/activation/readiness.js +269 -0
- package/dist/domain/governance/activation/readiness.js.map +1 -0
- package/dist/domain/governance/activation/types.d.ts +399 -0
- package/dist/domain/governance/activation/types.js +109 -0
- package/dist/domain/governance/activation/types.js.map +1 -0
- package/dist/domain/governance/activation/validators.d.ts +22 -0
- package/dist/domain/governance/activation/validators.js +1347 -0
- package/dist/domain/governance/activation/validators.js.map +1 -0
- package/dist/domain/governance/assessment/catalog.d.ts +14 -0
- package/dist/domain/governance/assessment/catalog.js +105 -0
- package/dist/domain/governance/assessment/catalog.js.map +1 -0
- package/dist/domain/governance/assessment/errors.d.ts +10 -0
- package/dist/domain/governance/assessment/errors.js +22 -0
- package/dist/domain/governance/assessment/errors.js.map +1 -0
- package/dist/domain/governance/assessment/index.d.ts +8 -0
- package/dist/domain/governance/assessment/index.js +9 -0
- package/dist/domain/governance/assessment/index.js.map +1 -0
- package/dist/domain/governance/assessment/live-normalize.d.ts +19 -0
- package/dist/domain/governance/assessment/live-normalize.js +403 -0
- package/dist/domain/governance/assessment/live-normalize.js.map +1 -0
- package/dist/domain/governance/assessment/predicates.d.ts +36 -0
- package/dist/domain/governance/assessment/predicates.js +545 -0
- package/dist/domain/governance/assessment/predicates.js.map +1 -0
- package/dist/domain/governance/assessment/report.d.ts +23 -0
- package/dist/domain/governance/assessment/report.js +266 -0
- package/dist/domain/governance/assessment/report.js.map +1 -0
- package/dist/domain/governance/assessment/sanitize.d.ts +8 -0
- package/dist/domain/governance/assessment/sanitize.js +60 -0
- package/dist/domain/governance/assessment/sanitize.js.map +1 -0
- package/dist/domain/governance/assessment/types.d.ts +174 -0
- package/dist/domain/governance/assessment/types.js +13 -0
- package/dist/domain/governance/assessment/types.js.map +1 -0
- package/dist/domain/governance/assessment/yaml.d.ts +6 -0
- package/dist/domain/governance/assessment/yaml.js +30 -0
- package/dist/domain/governance/assessment/yaml.js.map +1 -0
- package/dist/domain/governance/policy/identity.d.ts +64 -0
- package/dist/domain/governance/policy/identity.js +112 -0
- package/dist/domain/governance/policy/identity.js.map +1 -0
- package/dist/domain/migration/dependencies.d.ts +7 -0
- package/dist/domain/migration/dependencies.js +221 -0
- package/dist/domain/migration/dependencies.js.map +1 -0
- package/dist/domain/migration/inventory.d.ts +3 -0
- package/dist/domain/migration/inventory.js +15 -0
- package/dist/domain/migration/inventory.js.map +1 -0
- package/dist/domain/project/artifact-lifecycle.d.ts +69 -0
- package/dist/domain/project/artifact-lifecycle.js +137 -0
- package/dist/domain/project/artifact-lifecycle.js.map +1 -0
- package/dist/domain/project/catalog.d.ts +48 -0
- package/dist/domain/project/catalog.js +507 -0
- package/dist/domain/project/catalog.js.map +1 -0
- package/dist/domain/project/contracts.d.ts +247 -0
- package/dist/domain/project/contracts.js +2 -0
- package/dist/domain/project/contracts.js.map +1 -0
- package/dist/domain/project/errors.d.ts +3 -0
- package/dist/domain/project/errors.js +7 -0
- package/dist/domain/project/errors.js.map +1 -0
- package/dist/domain/project/infrastructure-layout.d.ts +26 -0
- package/dist/domain/project/infrastructure-layout.js +124 -0
- package/dist/domain/project/infrastructure-layout.js.map +1 -0
- package/dist/domain/project/inputs.d.ts +21 -0
- package/dist/domain/project/inputs.js +41 -0
- package/dist/domain/project/inputs.js.map +1 -0
- package/dist/domain/project/manifest/artifacts.d.ts +8 -0
- package/dist/domain/project/manifest/artifacts.js +150 -0
- package/dist/domain/project/manifest/artifacts.js.map +1 -0
- package/dist/domain/project/manifest/context.d.ts +13 -0
- package/dist/domain/project/manifest/context.js +2 -0
- package/dist/domain/project/manifest/context.js.map +1 -0
- package/dist/domain/project/manifest/fields.d.ts +6 -0
- package/dist/domain/project/manifest/fields.js +36 -0
- package/dist/domain/project/manifest/fields.js.map +1 -0
- package/dist/domain/project/manifest/governance.d.ts +8 -0
- package/dist/domain/project/manifest/governance.js +161 -0
- package/dist/domain/project/manifest/governance.js.map +1 -0
- package/dist/domain/project/manifest/project-identity.d.ts +6 -0
- package/dist/domain/project/manifest/project-identity.js +273 -0
- package/dist/domain/project/manifest/project-identity.js.map +1 -0
- package/dist/domain/project/manifest/reader.d.ts +9 -0
- package/dist/domain/project/manifest/reader.js +141 -0
- package/dist/domain/project/manifest/reader.js.map +1 -0
- package/dist/domain/project/paths.d.ts +2 -0
- package/dist/domain/project/paths.js +29 -0
- package/dist/domain/project/paths.js.map +1 -0
- package/dist/domain/project/planning.d.ts +19 -0
- package/dist/domain/project/planning.js +329 -0
- package/dist/domain/project/planning.js.map +1 -0
- package/dist/domain/project/retired-workload.d.ts +4 -0
- package/dist/domain/project/retired-workload.js +18 -0
- package/dist/domain/project/retired-workload.js.map +1 -0
- package/dist/domain/project/supported-stack.d.ts +113 -0
- package/dist/domain/project/supported-stack.js +426 -0
- package/dist/domain/project/supported-stack.js.map +1 -0
- package/dist/domain/workstation/constraints.d.ts +6 -0
- package/dist/domain/workstation/constraints.js +8 -0
- package/dist/domain/workstation/constraints.js.map +1 -0
- package/dist/file-system.d.ts +10 -44
- package/dist/file-system.js +9 -1245
- package/dist/file-system.js.map +1 -1
- package/dist/framework-adapters.d.ts +1 -1
- package/dist/framework-validation.d.ts +1 -1
- package/dist/framework-validation.js +1 -1
- package/dist/framework-validation.js.map +1 -1
- package/dist/genai-templates.d.ts +2 -9
- package/dist/genai-templates.js +4 -5
- package/dist/genai-templates.js.map +1 -1
- package/dist/generators/common/artifacts.d.ts +6 -0
- package/dist/generators/common/artifacts.js +30 -0
- package/dist/generators/common/artifacts.js.map +1 -0
- package/dist/generators/common/base.d.ts +17 -0
- package/dist/generators/common/base.js +421 -0
- package/dist/generators/common/base.js.map +1 -0
- package/dist/generators/common/dotenv-validation.d.ts +2 -0
- package/dist/generators/common/dotenv-validation.js +80 -0
- package/dist/generators/common/dotenv-validation.js.map +1 -0
- package/dist/generators/common/environments.d.ts +3 -0
- package/dist/generators/common/environments.js +15 -0
- package/dist/generators/common/environments.js.map +1 -0
- package/dist/generators/common/frontend.d.ts +15 -0
- package/dist/generators/common/frontend.js +166 -0
- package/dist/generators/common/frontend.js.map +1 -0
- package/dist/generators/common/python-settings.d.ts +2 -0
- package/dist/generators/common/python-settings.js +70 -0
- package/dist/generators/common/python-settings.js.map +1 -0
- package/dist/generators/common/spec-workflow.d.ts +28 -0
- package/dist/generators/common/spec-workflow.js +567 -0
- package/dist/generators/common/spec-workflow.js.map +1 -0
- package/dist/generators/common/values.d.ts +13 -0
- package/dist/generators/common/values.js +16 -0
- package/dist/generators/common/values.js.map +1 -0
- package/dist/generators/containers/compose.d.ts +7 -0
- package/dist/generators/containers/compose.js +196 -0
- package/dist/generators/containers/compose.js.map +1 -0
- package/dist/generators/containers/context.d.ts +1 -0
- package/dist/generators/containers/context.js +43 -0
- package/dist/generators/containers/context.js.map +1 -0
- package/dist/generators/containers/images.d.ts +7 -0
- package/dist/generators/containers/images.js +119 -0
- package/dist/generators/containers/images.js.map +1 -0
- package/dist/generators/context.d.ts +42 -0
- package/dist/generators/context.js +38 -0
- package/dist/generators/context.js.map +1 -0
- package/dist/generators/genai/backend.d.ts +20 -0
- package/dist/generators/genai/backend.js +667 -0
- package/dist/generators/genai/backend.js.map +1 -0
- package/dist/generators/genai/configuration.d.ts +3 -0
- package/dist/generators/genai/configuration.js +43 -0
- package/dist/generators/genai/configuration.js.map +1 -0
- package/dist/generators/genai/database.d.ts +7 -0
- package/dist/generators/genai/database.js +71 -0
- package/dist/generators/genai/database.js.map +1 -0
- package/dist/generators/genai/functions.d.ts +15 -0
- package/dist/generators/genai/functions.js +156 -0
- package/dist/generators/genai/functions.js.map +1 -0
- package/dist/generators/genai/index.d.ts +8 -0
- package/dist/generators/genai/index.js +11 -0
- package/dist/generators/genai/index.js.map +1 -0
- package/dist/generators/genai/patterns.d.ts +9 -0
- package/dist/generators/genai/patterns.js +309 -0
- package/dist/generators/genai/patterns.js.map +1 -0
- package/dist/generators/infrastructure/azure.d.ts +18 -0
- package/dist/generators/infrastructure/azure.js +655 -0
- package/dist/generators/infrastructure/azure.js.map +1 -0
- package/dist/generators/infrastructure/names.d.ts +23 -0
- package/dist/generators/infrastructure/names.js +51 -0
- package/dist/generators/infrastructure/names.js.map +1 -0
- package/dist/generators/standard/configuration.d.ts +3 -0
- package/dist/generators/standard/configuration.js +26 -0
- package/dist/generators/standard/configuration.js.map +1 -0
- package/dist/generators/standard/go.d.ts +17 -0
- package/dist/generators/standard/go.js +338 -0
- package/dist/generators/standard/go.js.map +1 -0
- package/dist/generators/standard/index.d.ts +12 -0
- package/dist/generators/standard/index.js +12 -0
- package/dist/generators/standard/index.js.map +1 -0
- package/dist/generators/standard/node.d.ts +20 -0
- package/dist/generators/standard/node.js +314 -0
- package/dist/generators/standard/node.js.map +1 -0
- package/dist/generators/standard/python.d.ts +18 -0
- package/dist/generators/standard/python.js +191 -0
- package/dist/generators/standard/python.js.map +1 -0
- package/dist/go-template-assets.js +3 -3
- package/dist/go-template-assets.js.map +1 -1
- package/dist/governance-activation/activation-state.d.ts +1 -1
- package/dist/governance-activation/activation-state.js +46 -9
- package/dist/governance-activation/activation-state.js.map +1 -1
- package/dist/governance-activation/approvals.d.ts +1 -188
- package/dist/governance-activation/approvals.js +1 -507
- package/dist/governance-activation/approvals.js.map +1 -1
- package/dist/governance-activation/canonical-json.d.ts +1 -3
- package/dist/governance-activation/canonical-json.js +1 -35
- package/dist/governance-activation/canonical-json.js.map +1 -1
- package/dist/governance-activation/commands.d.ts +1 -1
- package/dist/governance-activation/commands.js +72 -106
- package/dist/governance-activation/commands.js.map +1 -1
- package/dist/governance-activation/compatibility.d.ts +11 -3
- package/dist/governance-activation/compatibility.js +31 -4
- package/dist/governance-activation/compatibility.js.map +1 -1
- package/dist/governance-activation/credentials.d.ts +3 -3
- package/dist/governance-activation/credentials.js +5 -5
- package/dist/governance-activation/credentials.js.map +1 -1
- package/dist/governance-activation/doctor.d.ts +1 -1
- package/dist/governance-activation/doctor.js +28 -96
- package/dist/governance-activation/doctor.js.map +1 -1
- package/dist/governance-activation/evidence.d.ts +1 -49
- package/dist/governance-activation/evidence.js +1 -245
- package/dist/governance-activation/evidence.js.map +1 -1
- package/dist/governance-activation/git-ignore.d.ts +9 -0
- package/dist/governance-activation/git-ignore.js +76 -0
- package/dist/governance-activation/git-ignore.js.map +1 -0
- package/dist/governance-activation/graph.d.ts +1 -397
- package/dist/governance-activation/graph.js +1 -440
- package/dist/governance-activation/graph.js.map +1 -1
- package/dist/governance-activation/identity.d.ts +1 -35
- package/dist/governance-activation/identity.js +1 -88
- package/dist/governance-activation/identity.js.map +1 -1
- package/dist/governance-activation/index.d.ts +3 -0
- package/dist/governance-activation/index.js +3 -0
- package/dist/governance-activation/index.js.map +1 -1
- package/dist/governance-activation/inputs.d.ts +8 -0
- package/dist/governance-activation/inputs.js +146 -0
- package/dist/governance-activation/inputs.js.map +1 -0
- package/dist/governance-activation/migration.d.ts +4 -3
- package/dist/governance-activation/migration.js +14 -6
- package/dist/governance-activation/migration.js.map +1 -1
- package/dist/governance-activation/phase-bootstrap-state.d.ts +3 -0
- package/dist/governance-activation/phase-bootstrap-state.js +128 -0
- package/dist/governance-activation/phase-bootstrap-state.js.map +1 -0
- package/dist/governance-activation/phase-discovery.d.ts +2 -0
- package/dist/governance-activation/phase-discovery.js +88 -0
- package/dist/governance-activation/phase-discovery.js.map +1 -0
- package/dist/governance-activation/phase-governance.d.ts +4 -0
- package/dist/governance-activation/phase-governance.js +141 -0
- package/dist/governance-activation/phase-governance.js.map +1 -0
- package/dist/governance-activation/phase-publication.d.ts +8 -0
- package/dist/governance-activation/phase-publication.js +318 -0
- package/dist/governance-activation/phase-publication.js.map +1 -0
- package/dist/governance-activation/read-only.d.ts +30 -0
- package/dist/governance-activation/read-only.js +93 -0
- package/dist/governance-activation/read-only.js.map +1 -0
- package/dist/governance-activation/readiness.d.ts +1 -25
- package/dist/governance-activation/readiness.js +1 -222
- package/dist/governance-activation/readiness.js.map +1 -1
- package/dist/governance-activation/reconciliation.d.ts +1 -1
- package/dist/governance-activation/reconciliation.js +3 -3
- package/dist/governance-activation/reconciliation.js.map +1 -1
- package/dist/governance-activation/release-integrity.d.ts +1 -1
- package/dist/governance-activation/release-integrity.js +2 -2
- package/dist/governance-activation/release-integrity.js.map +1 -1
- package/dist/governance-activation/seed-lifecycle.d.ts +9 -1
- package/dist/governance-activation/seed-lifecycle.js +197 -63
- package/dist/governance-activation/seed-lifecycle.js.map +1 -1
- package/dist/governance-activation/source-of-truth.d.ts +5 -3
- package/dist/governance-activation/source-of-truth.js +32 -52
- package/dist/governance-activation/source-of-truth.js.map +1 -1
- package/dist/governance-activation/spec-kit-seed.d.ts +9 -0
- package/dist/governance-activation/spec-kit-seed.js +43 -0
- package/dist/governance-activation/spec-kit-seed.js.map +1 -0
- package/dist/governance-activation/task-projection.d.ts +1 -1
- package/dist/governance-activation/transition-planning.d.ts +15 -0
- package/dist/governance-activation/transition-planning.js +250 -0
- package/dist/governance-activation/transition-planning.js.map +1 -0
- package/dist/governance-activation/transition-ports.d.ts +150 -0
- package/dist/governance-activation/transition-ports.js +2 -0
- package/dist/governance-activation/transition-ports.js.map +1 -0
- package/dist/governance-activation/transition-process.d.ts +7 -0
- package/dist/governance-activation/transition-process.js +21 -0
- package/dist/governance-activation/transition-process.js.map +1 -0
- package/dist/governance-activation/transition-records.d.ts +56 -0
- package/dist/governance-activation/transition-records.js +208 -0
- package/dist/governance-activation/transition-records.js.map +1 -0
- package/dist/governance-activation/transitions.d.ts +6 -165
- package/dist/governance-activation/transitions.js +142 -2055
- package/dist/governance-activation/transitions.js.map +1 -1
- package/dist/governance-activation/types.d.ts +1 -390
- package/dist/governance-activation/types.js +1 -107
- package/dist/governance-activation/types.js.map +1 -1
- package/dist/governance-activation/validators.d.ts +1 -17
- package/dist/governance-activation/validators.js +1 -1304
- package/dist/governance-activation/validators.js.map +1 -1
- package/dist/governance-assessment/catalog.d.ts +1 -2
- package/dist/governance-assessment/catalog.js +18 -85
- package/dist/governance-assessment/catalog.js.map +1 -1
- package/dist/governance-assessment/command.d.ts +1 -1
- package/dist/governance-assessment/command.js +8 -12
- package/dist/governance-assessment/command.js.map +1 -1
- package/dist/governance-assessment/engine.d.ts +6 -11
- package/dist/governance-assessment/engine.js +463 -114
- package/dist/governance-assessment/engine.js.map +1 -1
- package/dist/governance-assessment/live-normalize.d.ts +1 -19
- package/dist/governance-assessment/live-normalize.js +1 -402
- package/dist/governance-assessment/live-normalize.js.map +1 -1
- package/dist/governance-assessment/live-transport.d.ts +2 -6
- package/dist/governance-assessment/live-transport.js +10 -22
- package/dist/governance-assessment/live-transport.js.map +1 -1
- package/dist/governance-assessment/live.js +55 -5
- package/dist/governance-assessment/live.js.map +1 -1
- package/dist/governance-assessment/predicates.d.ts +1 -27
- package/dist/governance-assessment/predicates.js +1 -329
- package/dist/governance-assessment/predicates.js.map +1 -1
- package/dist/governance-assessment/project.d.ts +13 -17
- package/dist/governance-assessment/project.js +59 -149
- package/dist/governance-assessment/project.js.map +1 -1
- package/dist/governance-assessment/readers.d.ts +1 -5
- package/dist/governance-assessment/readers.js +5 -13
- package/dist/governance-assessment/readers.js.map +1 -1
- package/dist/governance-assessment/report.d.ts +1 -23
- package/dist/governance-assessment/report.js +1 -265
- package/dist/governance-assessment/report.js.map +1 -1
- package/dist/governance-assessment/sanitize.d.ts +1 -8
- package/dist/governance-assessment/sanitize.js +1 -56
- package/dist/governance-assessment/sanitize.js.map +1 -1
- package/dist/governance-assessment/types.d.ts +1 -173
- package/dist/governance-assessment/types.js +1 -12
- package/dist/governance-assessment/types.js.map +1 -1
- package/dist/governance-assessment/yaml.d.ts +1 -6
- package/dist/governance-assessment/yaml.js +1 -29
- package/dist/governance-assessment/yaml.js.map +1 -1
- package/dist/init-filesystem.d.ts +1 -1
- package/dist/init-filesystem.js +126 -174
- package/dist/init-filesystem.js.map +1 -1
- package/dist/interactive.d.ts +2 -2
- package/dist/interactive.js +42 -41
- package/dist/interactive.js.map +1 -1
- package/dist/migrate-plan.d.ts +1 -1
- package/dist/migrate-plan.js +14 -8
- package/dist/migrate-plan.js.map +1 -1
- package/dist/npm-template-assets.js +5 -4
- package/dist/npm-template-assets.js.map +1 -1
- package/dist/openspec-profile.d.ts +1 -1
- package/dist/opentofu-template-assets.js +3 -3
- package/dist/opentofu-template-assets.js.map +1 -1
- package/dist/package-identity.d.ts +3 -0
- package/dist/package-identity.js +13 -2
- package/dist/package-identity.js.map +1 -1
- package/dist/planner.d.ts +1 -19
- package/dist/planner.js +1 -565
- package/dist/planner.js.map +1 -1
- package/dist/process-runner.d.ts +1 -1
- package/dist/project-dependencies.d.ts +5 -3
- package/dist/project-dependencies.js +74 -63
- package/dist/project-dependencies.js.map +1 -1
- package/dist/published-verifier.js +61 -30
- package/dist/published-verifier.js.map +1 -1
- package/dist/python-template-assets.js +6 -9
- package/dist/python-template-assets.js.map +1 -1
- package/dist/reconcile.d.ts +1 -1
- package/dist/reconcile.js +2 -2
- package/dist/reconcile.js.map +1 -1
- package/dist/repository-governance.d.ts +5 -2
- package/dist/repository-governance.js +126 -112
- package/dist/repository-governance.js.map +1 -1
- package/dist/runtime.js +1 -1
- package/dist/runtime.js.map +1 -1
- package/dist/scan.d.ts +6 -2
- package/dist/scan.js +78 -30
- package/dist/scan.js.map +1 -1
- package/dist/self-upgrade.d.ts +1 -1
- package/dist/self-upgrade.js +20 -7
- package/dist/self-upgrade.js.map +1 -1
- package/dist/stable-release.js +7 -1
- package/dist/stable-release.js.map +1 -1
- package/dist/standard-templates.d.ts +2 -2
- package/dist/standard-templates.js +6 -841
- package/dist/standard-templates.js.map +1 -1
- package/dist/supported-stack.d.ts +3 -115
- package/dist/supported-stack.js +4 -438
- package/dist/supported-stack.js.map +1 -1
- package/dist/telemetry/index.d.ts +1 -1
- package/dist/templates.d.ts +10 -20
- package/dist/templates.js +52 -3261
- package/dist/templates.js.map +1 -1
- package/dist/types.d.ts +1 -263
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/dist/version.js +2 -6
- package/dist/version.js.map +1 -1
- package/dist/workstation-catalog.d.ts +5 -2
- package/dist/workstation-catalog.js +33 -2
- package/dist/workstation-catalog.js.map +1 -1
- package/dist/workstation.d.ts +4 -3
- package/dist/workstation.js +86 -32
- package/dist/workstation.js.map +1 -1
- package/docs/assets/liftoff-terminal.svg +3 -3
- package/docs/azure-deployment.md +107 -10
- package/docs/cli-reference.md +49 -13
- package/docs/configuration-and-manifests.md +139 -34
- package/docs/existing-repositories.md +33 -6
- package/docs/getting-started.md +44 -31
- package/docs/prerequisites.md +34 -35
- package/docs/project-structure.md +39 -46
- package/docs/repository-governance.md +90 -24
- package/docs/safety-and-consent.md +65 -12
- package/docs/spec-workflows-and-agents.md +31 -28
- package/docs/supported-stack.md +11 -9
- package/docs/troubleshooting.md +107 -49
- package/docs/workloads.md +46 -62
- package/package.json +4 -7
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/UPSTREAM_LICENSE.txt +0 -21
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/catalog.json +0 -520
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/packaged/gitignore +0 -27
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/README.md +0 -25
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/components.json +0 -22
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/eslint.config.js +0 -23
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/index.html +0 -13
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/package-lock.json +0 -6156
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/package.json +0 -60
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/public/power-apps.svg +0 -55
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/App.tsx +0 -17
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/assets/react.svg +0 -1
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/mode-toggle.tsx +0 -37
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/badge.tsx +0 -46
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/button.tsx +0 -60
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/calendar.tsx +0 -211
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/card.tsx +0 -92
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/chart.tsx +0 -355
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/checkbox.tsx +0 -32
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/command.tsx +0 -184
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/dialog.tsx +0 -141
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/dropdown-menu.tsx +0 -257
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/input.tsx +0 -21
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/label.tsx +0 -22
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/popover.tsx +0 -46
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/progress.tsx +0 -29
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/select.tsx +0 -185
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/separator.tsx +0 -26
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/skeleton.tsx +0 -13
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/table.tsx +0 -114
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/tabs.tsx +0 -66
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/textarea.tsx +0 -18
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/components/ui/tooltip.tsx +0 -61
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/hooks/use-theme.ts +0 -11
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/index.css +0 -131
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/lib/utils.ts +0 -6
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/main.tsx +0 -10
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/pages/_layout.tsx +0 -31
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/pages/home.tsx +0 -59
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/pages/not-found.tsx +0 -14
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/providers/query-provider.tsx +0 -26
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/providers/sonner-provider.tsx +0 -23
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/providers/theme-provider.tsx +0 -64
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/src/router.tsx +0 -24
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/tsconfig.app.json +0 -34
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/tsconfig.json +0 -13
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/tsconfig.node.json +0 -26
- package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/vite.config.ts +0 -19
- package/assets/power-apps-code-app/README.md +0 -27
- package/dist/code-apps-plugin.d.ts +0 -13
- package/dist/code-apps-plugin.js +0 -69
- package/dist/code-apps-plugin.js.map +0 -1
- package/dist/power-apps-assets.d.ts +0 -30
- package/dist/power-apps-assets.js +0 -131
- package/dist/power-apps-assets.js.map +0 -1
- package/dist/power-apps-templates.d.ts +0 -3
- package/dist/power-apps-templates.js +0 -177
- package/dist/power-apps-templates.js.map +0 -1
- package/dist/power-apps-validation.d.ts +0 -1
- package/dist/power-apps-validation.js +0 -79
- package/dist/power-apps-validation.js.map +0 -1
|
@@ -0,0 +1,667 @@
|
|
|
1
|
+
import { genAiPattern } from '../common/values.js';
|
|
2
|
+
import { pyModule } from '../common/values.js';
|
|
3
|
+
import { titleCase } from '../common/values.js';
|
|
4
|
+
import { renderPythonRuntimeSettings } from '../common/python-settings.js';
|
|
5
|
+
export function addBackendArtifacts(add, plan, context) {
|
|
6
|
+
const routeModule = pyModule(genAiPattern(plan).id);
|
|
7
|
+
add('backend-pyproject', 'backend', ['backend', 'pyproject.toml'], renderBackendPyproject(plan, context));
|
|
8
|
+
add('backend-uv-lock', 'backend', ['backend', 'uv.lock'], context.python["genai"].lock);
|
|
9
|
+
add('backend-package', 'backend', ['backend', '__init__.py'], '');
|
|
10
|
+
add('backend-api-package', 'backend', ['backend', 'apis', '__init__.py'], '');
|
|
11
|
+
add('backend-main', 'backend', ['backend', 'apis', 'main.py'], renderFastApiMain(plan, routeModule));
|
|
12
|
+
add('backend-health-routes', 'backend', ['backend', 'apis', 'routes', 'health.py'], renderHealthRoutes());
|
|
13
|
+
add('backend-pattern-routes', 'backend', ['backend', 'apis', 'routes', `${routeModule}.py`], renderPatternRoutes(plan));
|
|
14
|
+
add('backend-routes-package', 'backend', ['backend', 'apis', 'routes', '__init__.py'], '');
|
|
15
|
+
add('backend-auth-dependency', 'backend', ['backend', 'apis', 'dependencies', 'auth.py'], renderAuthDependency());
|
|
16
|
+
add('backend-config-package', 'backend', ['backend', 'config', '__init__.py'], '');
|
|
17
|
+
add('backend-settings', 'backend', ['backend', 'config', 'settings.py'], renderSettings(plan));
|
|
18
|
+
add('backend-orchestration-package', 'backend', ['backend', 'orchestration', '__init__.py'], '');
|
|
19
|
+
add('backend-model-config', 'backend', ['backend', 'orchestration', 'model_config.py'], renderModelConfig(plan));
|
|
20
|
+
add('backend-messaging-tool', 'backend', ['backend', 'orchestration', 'tools', 'messaging.py'], renderMessagingBoundary());
|
|
21
|
+
add('backend-tools-package', 'backend', ['backend', 'orchestration', 'tools', '__init__.py'], '');
|
|
22
|
+
add('backend-observability', 'backend', ['backend', 'observability', 'tracing.py'], renderTracing());
|
|
23
|
+
add('backend-observability-package', 'backend', ['backend', 'observability', '__init__.py'], '');
|
|
24
|
+
add('backend-test-health', 'backend-test', ['backend', 'tests', 'test_health.py'], renderBackendHealthTest());
|
|
25
|
+
add('backend-test-messaging', 'backend-test', ['backend', 'tests', 'test_messaging.py'], renderMessagingTest());
|
|
26
|
+
add('backend-test-tracing', 'backend-test', ['backend', 'tests', 'test_tracing.py'], renderTracingTest());
|
|
27
|
+
}
|
|
28
|
+
export function renderBackendPyproject(plan, context) {
|
|
29
|
+
return context.python["genai"].project;
|
|
30
|
+
}
|
|
31
|
+
export function renderFastApiMain(plan, routeModule) {
|
|
32
|
+
return `from fastapi import FastAPI
|
|
33
|
+
from fastapi.middleware.cors import CORSMiddleware
|
|
34
|
+
|
|
35
|
+
try:
|
|
36
|
+
from scalar_fastapi import get_scalar_api_reference
|
|
37
|
+
except ImportError: # pragma: no cover - dependency is present in generated runtime
|
|
38
|
+
get_scalar_api_reference = None
|
|
39
|
+
|
|
40
|
+
from backend.apis.routes import health, ${routeModule}
|
|
41
|
+
from backend.config.settings import get_settings
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
settings = get_settings()
|
|
45
|
+
app = FastAPI(title=settings.app_name, version="0.1.0")
|
|
46
|
+
app.add_middleware(
|
|
47
|
+
CORSMiddleware,
|
|
48
|
+
allow_origins=[
|
|
49
|
+
origin.strip()
|
|
50
|
+
for origin in settings.cors_allowed_origins.split(",")
|
|
51
|
+
if origin.strip()
|
|
52
|
+
],
|
|
53
|
+
allow_methods=["*"],
|
|
54
|
+
allow_headers=["*"],
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
app.include_router(health.router)
|
|
58
|
+
app.include_router(${routeModule}.router)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
@app.get("/scalar", include_in_schema=False)
|
|
62
|
+
def scalar_reference():
|
|
63
|
+
if get_scalar_api_reference is None:
|
|
64
|
+
return {"message": "Install scalar-fastapi to enable the Scalar developer portal."}
|
|
65
|
+
return get_scalar_api_reference(openapi_url=app.openapi_url, title=f"{app.title} API")
|
|
66
|
+
`;
|
|
67
|
+
}
|
|
68
|
+
export function renderHealthRoutes() {
|
|
69
|
+
return `from fastapi import APIRouter
|
|
70
|
+
|
|
71
|
+
router = APIRouter(tags=["operations"])
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
@router.get("/health")
|
|
75
|
+
def health():
|
|
76
|
+
return {"status": "ok"}
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
@router.get("/ready")
|
|
80
|
+
def ready():
|
|
81
|
+
return {"status": "ready"}
|
|
82
|
+
`;
|
|
83
|
+
}
|
|
84
|
+
export function renderPatternRoutes(plan) {
|
|
85
|
+
const pattern = genAiPattern(plan);
|
|
86
|
+
const moduleName = pyModule(pattern.id);
|
|
87
|
+
const agentName = `${moduleName}_agent`;
|
|
88
|
+
const prefix = pattern.routePrefix;
|
|
89
|
+
if (pattern.id === 'streaming') {
|
|
90
|
+
return `from fastapi import APIRouter
|
|
91
|
+
from fastapi.responses import StreamingResponse
|
|
92
|
+
|
|
93
|
+
from backend.orchestration.agents.${agentName} import stream_response
|
|
94
|
+
|
|
95
|
+
router = APIRouter(prefix="${prefix}", tags=["${pattern.id}"])
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
@router.get("")
|
|
99
|
+
def stream(prompt: str):
|
|
100
|
+
return StreamingResponse(stream_response(prompt), media_type="text/event-stream")
|
|
101
|
+
`;
|
|
102
|
+
}
|
|
103
|
+
if (pattern.id === 'rag') {
|
|
104
|
+
return `from fastapi import APIRouter
|
|
105
|
+
from pydantic import BaseModel
|
|
106
|
+
|
|
107
|
+
from backend.orchestration.agents.${agentName} import answer_question, enqueue_ingestion
|
|
108
|
+
|
|
109
|
+
router = APIRouter(prefix="${prefix}", tags=["rag"])
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
class QueryRequest(BaseModel):
|
|
113
|
+
question: str
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
class IngestionRequest(BaseModel):
|
|
117
|
+
source_uri: str
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
@router.post("/query")
|
|
121
|
+
async def query(request: QueryRequest):
|
|
122
|
+
return await answer_question(request.question)
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
@router.post("/ingest")
|
|
126
|
+
async def ingest(request: IngestionRequest):
|
|
127
|
+
return await enqueue_ingestion(request.source_uri)
|
|
128
|
+
`;
|
|
129
|
+
}
|
|
130
|
+
const bodyClass = `${titleCase(pattern.id).replace(/\s/g, '')}Request`;
|
|
131
|
+
return `from fastapi import APIRouter
|
|
132
|
+
from pydantic import BaseModel
|
|
133
|
+
|
|
134
|
+
from backend.orchestration.agents.${agentName} import run_${moduleName}
|
|
135
|
+
|
|
136
|
+
router = APIRouter(prefix="${prefix}", tags=["${pattern.id}"])
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
class ${bodyClass}(BaseModel):
|
|
140
|
+
input: str
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
@router.post("/run")
|
|
144
|
+
async def run(request: ${bodyClass}):
|
|
145
|
+
return await run_${moduleName}(request.input)
|
|
146
|
+
`;
|
|
147
|
+
}
|
|
148
|
+
export function renderAuthDependency() {
|
|
149
|
+
return `from dataclasses import dataclass
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
@dataclass(frozen=True)
|
|
153
|
+
class CurrentUser:
|
|
154
|
+
subject: str = "local-developer"
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
async def get_current_user() -> CurrentUser:
|
|
158
|
+
return CurrentUser()
|
|
159
|
+
`;
|
|
160
|
+
}
|
|
161
|
+
export function renderSettings(plan) {
|
|
162
|
+
return renderPythonRuntimeSettings(plan);
|
|
163
|
+
}
|
|
164
|
+
export function renderModelConfig(plan) {
|
|
165
|
+
const pattern = genAiPattern(plan);
|
|
166
|
+
return `from dataclasses import dataclass
|
|
167
|
+
from typing import Protocol
|
|
168
|
+
|
|
169
|
+
from backend.config.settings import Settings, get_settings
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
class ModelConfigurationError(RuntimeError):
|
|
173
|
+
pass
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
class AgentRunner(Protocol):
|
|
177
|
+
async def run(self, prompt: str) -> str:
|
|
178
|
+
...
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
@dataclass(frozen=True)
|
|
182
|
+
class ModelConfig:
|
|
183
|
+
model_name: str
|
|
184
|
+
pattern: str = "${pattern.id}"
|
|
185
|
+
api_key: str = ""
|
|
186
|
+
base_url: str = "https://api.openai.com/v1"
|
|
187
|
+
|
|
188
|
+
@classmethod
|
|
189
|
+
def from_settings(cls, settings: Settings | None = None) -> "ModelConfig":
|
|
190
|
+
resolved = settings or get_settings()
|
|
191
|
+
model_name = resolved.pydantic_ai_model.strip()
|
|
192
|
+
if not model_name:
|
|
193
|
+
raise ModelConfigurationError(
|
|
194
|
+
"PYDANTIC_AI_MODEL is required before invoking production GenAI orchestration. "
|
|
195
|
+
"Use a PydanticAI model name such as 'openai:gpt-4.1-mini'."
|
|
196
|
+
)
|
|
197
|
+
return cls(
|
|
198
|
+
model_name=model_name,
|
|
199
|
+
api_key=resolved.openai_api_key,
|
|
200
|
+
base_url=resolved.openai_base_url,
|
|
201
|
+
)
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
class PydanticAgentRunner:
|
|
205
|
+
def __init__(self, config: ModelConfig):
|
|
206
|
+
from pydantic_ai import Agent
|
|
207
|
+
from pydantic_ai.models.openai import OpenAIChatModel, OpenAIResponsesModel
|
|
208
|
+
from pydantic_ai.providers.openai import OpenAIProvider
|
|
209
|
+
|
|
210
|
+
provider_name, separator, model_name = config.model_name.partition(":")
|
|
211
|
+
if not separator or not model_name or provider_name not in {
|
|
212
|
+
"openai", "openai-chat", "openai-responses"
|
|
213
|
+
}:
|
|
214
|
+
raise ModelConfigurationError(
|
|
215
|
+
"The locked starter supports openai:, openai-chat:, and openai-responses: models. "
|
|
216
|
+
"Other providers require a reviewed dependency and configuration change."
|
|
217
|
+
)
|
|
218
|
+
if not config.api_key.strip():
|
|
219
|
+
raise ModelConfigurationError("OPENAI_API_KEY is required for the selected model.")
|
|
220
|
+
provider = OpenAIProvider(api_key=config.api_key, base_url=config.base_url)
|
|
221
|
+
model_type = OpenAIChatModel if provider_name == "openai-chat" else OpenAIResponsesModel
|
|
222
|
+
self._agent = Agent(model_type(model_name, provider=provider))
|
|
223
|
+
|
|
224
|
+
async def run(self, prompt: str) -> str:
|
|
225
|
+
result = await self._agent.run(prompt)
|
|
226
|
+
output = getattr(result, "output", None)
|
|
227
|
+
if output is None:
|
|
228
|
+
output = getattr(result, "data", None)
|
|
229
|
+
if output is None:
|
|
230
|
+
raise RuntimeError("PydanticAI returned a result without output data.")
|
|
231
|
+
return str(output)
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
def build_agent_runner(config: ModelConfig | None = None) -> AgentRunner:
|
|
235
|
+
return PydanticAgentRunner(config or ModelConfig.from_settings())
|
|
236
|
+
`;
|
|
237
|
+
}
|
|
238
|
+
export function renderMessagingBoundary() {
|
|
239
|
+
return `import json
|
|
240
|
+
from collections.abc import Callable
|
|
241
|
+
from typing import Any, Protocol
|
|
242
|
+
|
|
243
|
+
from backend.config.settings import Settings, get_settings
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
class MessagingConfigurationError(RuntimeError):
|
|
247
|
+
pass
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
class MessagePublisher(Protocol):
|
|
251
|
+
async def publish(self, topic: str, payload: dict) -> None:
|
|
252
|
+
...
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
class RedisStreamClient(Protocol):
|
|
256
|
+
async def xadd(self, name: str, fields: dict[str, str]) -> Any:
|
|
257
|
+
...
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
class ServiceBusSender(Protocol):
|
|
261
|
+
async def __aenter__(self) -> "ServiceBusSender":
|
|
262
|
+
...
|
|
263
|
+
|
|
264
|
+
async def __aexit__(self, exc_type, exc, traceback) -> None:
|
|
265
|
+
...
|
|
266
|
+
|
|
267
|
+
async def send_messages(self, message: Any) -> None:
|
|
268
|
+
...
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
class ServiceBusClient(Protocol):
|
|
272
|
+
def get_queue_sender(self, *, queue_name: str) -> ServiceBusSender:
|
|
273
|
+
...
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
def _serialize(topic: str, payload: dict) -> str:
|
|
277
|
+
return json.dumps({"topic": topic, "payload": payload}, separators=(",", ":"), sort_keys=True)
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
class RedisStreamPublisher:
|
|
281
|
+
def __init__(self, client: RedisStreamClient, stream_name: str):
|
|
282
|
+
self._client = client
|
|
283
|
+
self._stream_name = stream_name
|
|
284
|
+
|
|
285
|
+
async def publish(self, topic: str, payload: dict) -> None:
|
|
286
|
+
await self._client.xadd(
|
|
287
|
+
self._stream_name,
|
|
288
|
+
{"topic": topic, "payload": _serialize(topic, payload)},
|
|
289
|
+
)
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
class AzureServiceBusPublisher:
|
|
293
|
+
def __init__(
|
|
294
|
+
self,
|
|
295
|
+
client: ServiceBusClient,
|
|
296
|
+
queue_name: str,
|
|
297
|
+
message_factory: Callable[[str], Any] | None = None,
|
|
298
|
+
):
|
|
299
|
+
self._client = client
|
|
300
|
+
self._queue_name = queue_name
|
|
301
|
+
self._message_factory = message_factory or self._default_message_factory
|
|
302
|
+
|
|
303
|
+
@staticmethod
|
|
304
|
+
def _default_message_factory(body: str) -> Any:
|
|
305
|
+
from azure.servicebus import ServiceBusMessage
|
|
306
|
+
|
|
307
|
+
return ServiceBusMessage(body)
|
|
308
|
+
|
|
309
|
+
async def publish(self, topic: str, payload: dict) -> None:
|
|
310
|
+
message = self._message_factory(_serialize(topic, payload))
|
|
311
|
+
async with self._client.get_queue_sender(queue_name=self._queue_name) as sender:
|
|
312
|
+
await sender.send_messages(message)
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
def build_message_publisher(
|
|
316
|
+
transport: str | None = None,
|
|
317
|
+
*,
|
|
318
|
+
settings: Settings | None = None,
|
|
319
|
+
redis_client: RedisStreamClient | None = None,
|
|
320
|
+
service_bus_client: ServiceBusClient | None = None,
|
|
321
|
+
message_factory: Callable[[str], Any] | None = None,
|
|
322
|
+
) -> MessagePublisher:
|
|
323
|
+
resolved = settings or get_settings()
|
|
324
|
+
transport = resolved.messaging_transport if transport is None else transport
|
|
325
|
+
if transport == "redis-streams":
|
|
326
|
+
stream_name = resolved.redis_stream_name.strip()
|
|
327
|
+
if not stream_name:
|
|
328
|
+
raise MessagingConfigurationError("REDIS_STREAM_NAME must not be empty.")
|
|
329
|
+
redis_url = resolved.redis_url.strip()
|
|
330
|
+
if not redis_url:
|
|
331
|
+
raise MessagingConfigurationError("REDIS_URL is required for redis-streams messaging.")
|
|
332
|
+
if redis_client is None:
|
|
333
|
+
from redis.asyncio import Redis
|
|
334
|
+
|
|
335
|
+
redis_client = Redis.from_url(redis_url, decode_responses=True)
|
|
336
|
+
return RedisStreamPublisher(redis_client, stream_name)
|
|
337
|
+
|
|
338
|
+
if transport == "azure-service-bus":
|
|
339
|
+
queue_name = resolved.service_bus_queue_name.strip()
|
|
340
|
+
if not queue_name:
|
|
341
|
+
raise MessagingConfigurationError(
|
|
342
|
+
"SERVICE_BUS_QUEUE_NAME is required for azure-service-bus messaging."
|
|
343
|
+
)
|
|
344
|
+
connection_string = resolved.service_bus_connection_string.strip()
|
|
345
|
+
namespace = resolved.service_bus_fully_qualified_namespace.strip()
|
|
346
|
+
client_id = resolved.azure_client_id.strip()
|
|
347
|
+
auth_mode = resolved.service_bus_auth_mode
|
|
348
|
+
if auth_mode == "connection-string":
|
|
349
|
+
if not connection_string:
|
|
350
|
+
raise MessagingConfigurationError(
|
|
351
|
+
"SERVICE_BUS_CONNECTION_STRING is required for connection-string authentication."
|
|
352
|
+
)
|
|
353
|
+
elif auth_mode == "managed-identity":
|
|
354
|
+
if not namespace or not client_id:
|
|
355
|
+
raise MessagingConfigurationError(
|
|
356
|
+
"SERVICE_BUS_FULLY_QUALIFIED_NAMESPACE and AZURE_CLIENT_ID are required "
|
|
357
|
+
"for managed-identity authentication."
|
|
358
|
+
)
|
|
359
|
+
if not namespace.endswith(".servicebus.windows.net") or "://" in namespace or "/" in namespace:
|
|
360
|
+
raise MessagingConfigurationError("SERVICE_BUS_FULLY_QUALIFIED_NAMESPACE must be a Service Bus hostname.")
|
|
361
|
+
else:
|
|
362
|
+
raise MessagingConfigurationError(
|
|
363
|
+
"SERVICE_BUS_AUTH_MODE must be 'managed-identity' or 'connection-string'."
|
|
364
|
+
)
|
|
365
|
+
if service_bus_client is None:
|
|
366
|
+
from azure.servicebus.aio import ServiceBusClient as AzureServiceBusClient
|
|
367
|
+
|
|
368
|
+
if auth_mode == "connection-string":
|
|
369
|
+
service_bus_client = AzureServiceBusClient.from_connection_string(connection_string)
|
|
370
|
+
else:
|
|
371
|
+
from azure.identity.aio import ManagedIdentityCredential
|
|
372
|
+
|
|
373
|
+
credential = ManagedIdentityCredential(client_id=client_id)
|
|
374
|
+
service_bus_client = AzureServiceBusClient(namespace, credential)
|
|
375
|
+
return AzureServiceBusPublisher(service_bus_client, queue_name, message_factory)
|
|
376
|
+
|
|
377
|
+
raise MessagingConfigurationError(
|
|
378
|
+
f"Unsupported MESSAGING_TRANSPORT '{transport}'. "
|
|
379
|
+
"Expected 'redis-streams' or 'azure-service-bus'."
|
|
380
|
+
)
|
|
381
|
+
`;
|
|
382
|
+
}
|
|
383
|
+
export function renderTracing() {
|
|
384
|
+
return `from contextlib import asynccontextmanager
|
|
385
|
+
from dataclasses import dataclass
|
|
386
|
+
from typing import Any, AsyncContextManager, Protocol
|
|
387
|
+
|
|
388
|
+
from backend.config.settings import Settings, get_settings
|
|
389
|
+
|
|
390
|
+
|
|
391
|
+
class TracingConfigurationError(RuntimeError):
|
|
392
|
+
pass
|
|
393
|
+
|
|
394
|
+
|
|
395
|
+
@dataclass
|
|
396
|
+
class TraceHandle:
|
|
397
|
+
enabled: bool
|
|
398
|
+
trace_id: str | None
|
|
399
|
+
output: Any = None
|
|
400
|
+
|
|
401
|
+
def set_output(self, output: Any) -> None:
|
|
402
|
+
self.output = output
|
|
403
|
+
|
|
404
|
+
|
|
405
|
+
class Tracer(Protocol):
|
|
406
|
+
def trace(self, name: str, input_data: Any = None) -> AsyncContextManager[TraceHandle]:
|
|
407
|
+
...
|
|
408
|
+
|
|
409
|
+
|
|
410
|
+
class DisabledTracer:
|
|
411
|
+
@asynccontextmanager
|
|
412
|
+
async def trace(self, name: str, input_data: Any = None):
|
|
413
|
+
del name, input_data
|
|
414
|
+
yield TraceHandle(enabled=False, trace_id=None)
|
|
415
|
+
|
|
416
|
+
|
|
417
|
+
class LangfuseTracer:
|
|
418
|
+
def __init__(self, client: Any):
|
|
419
|
+
self._client = client
|
|
420
|
+
|
|
421
|
+
|
|
422
|
+
@asynccontextmanager
|
|
423
|
+
async def trace(self, name: str, input_data: Any = None):
|
|
424
|
+
remote_trace = self._client.start_observation(
|
|
425
|
+
name=name,
|
|
426
|
+
as_type="span",
|
|
427
|
+
input=input_data,
|
|
428
|
+
)
|
|
429
|
+
remote_id = getattr(remote_trace, "trace_id", None)
|
|
430
|
+
handle = TraceHandle(
|
|
431
|
+
enabled=True,
|
|
432
|
+
trace_id=str(remote_id) if remote_id is not None else None,
|
|
433
|
+
)
|
|
434
|
+
try:
|
|
435
|
+
yield handle
|
|
436
|
+
except Exception as error:
|
|
437
|
+
remote_trace.update(level="ERROR", status_message=str(error))
|
|
438
|
+
raise
|
|
439
|
+
else:
|
|
440
|
+
remote_trace.update(output=handle.output)
|
|
441
|
+
finally:
|
|
442
|
+
remote_trace.end()
|
|
443
|
+
|
|
444
|
+
|
|
445
|
+
def build_tracer(
|
|
446
|
+
*,
|
|
447
|
+
settings: Settings | None = None,
|
|
448
|
+
client: Any = None,
|
|
449
|
+
public_key: str | None = None,
|
|
450
|
+
secret_key: str | None = None,
|
|
451
|
+
host: str | None = None,
|
|
452
|
+
) -> Tracer:
|
|
453
|
+
if client is not None:
|
|
454
|
+
return LangfuseTracer(client)
|
|
455
|
+
|
|
456
|
+
resolved = settings or get_settings()
|
|
457
|
+
resolved_public_key = resolved.langfuse_public_key.strip() if public_key is None else public_key
|
|
458
|
+
resolved_secret_key = resolved.langfuse_secret_key.strip() if secret_key is None else secret_key
|
|
459
|
+
if not resolved_public_key and not resolved_secret_key:
|
|
460
|
+
return DisabledTracer()
|
|
461
|
+
if not resolved_public_key or not resolved_secret_key:
|
|
462
|
+
raise TracingConfigurationError(
|
|
463
|
+
"LANGFUSE_PUBLIC_KEY and LANGFUSE_SECRET_KEY must be configured together."
|
|
464
|
+
)
|
|
465
|
+
|
|
466
|
+
from langfuse import Langfuse
|
|
467
|
+
|
|
468
|
+
resolved_host = (resolved.langfuse_host.strip() if host is None else host) or "https://cloud.langfuse.com"
|
|
469
|
+
kwargs = {
|
|
470
|
+
"public_key": resolved_public_key,
|
|
471
|
+
"secret_key": resolved_secret_key,
|
|
472
|
+
"host": resolved_host,
|
|
473
|
+
}
|
|
474
|
+
return LangfuseTracer(Langfuse(**kwargs))
|
|
475
|
+
`;
|
|
476
|
+
}
|
|
477
|
+
export function renderBackendHealthTest() {
|
|
478
|
+
return `from fastapi.testclient import TestClient
|
|
479
|
+
|
|
480
|
+
from backend.apis.main import app
|
|
481
|
+
|
|
482
|
+
|
|
483
|
+
def test_health():
|
|
484
|
+
client = TestClient(app)
|
|
485
|
+
response = client.get("/health")
|
|
486
|
+
assert response.status_code == 200
|
|
487
|
+
assert response.json()["status"] == "ok"
|
|
488
|
+
|
|
489
|
+
|
|
490
|
+
def test_cors_preflight_for_local_frontend():
|
|
491
|
+
response = TestClient(app).options(
|
|
492
|
+
"/health",
|
|
493
|
+
headers={
|
|
494
|
+
"Origin": "http://localhost:5173",
|
|
495
|
+
"Access-Control-Request-Method": "GET",
|
|
496
|
+
},
|
|
497
|
+
)
|
|
498
|
+
assert response.status_code == 200
|
|
499
|
+
assert response.headers["access-control-allow-origin"] == "http://localhost:5173"
|
|
500
|
+
`;
|
|
501
|
+
}
|
|
502
|
+
export function renderMessagingTest() {
|
|
503
|
+
return `import asyncio
|
|
504
|
+
import json
|
|
505
|
+
|
|
506
|
+
from backend.orchestration.tools.messaging import build_message_publisher
|
|
507
|
+
from backend.config.settings import Settings
|
|
508
|
+
|
|
509
|
+
|
|
510
|
+
class FakeRedisClient:
|
|
511
|
+
def __init__(self):
|
|
512
|
+
self.calls = []
|
|
513
|
+
|
|
514
|
+
async def xadd(self, name, fields):
|
|
515
|
+
self.calls.append((name, fields))
|
|
516
|
+
|
|
517
|
+
|
|
518
|
+
class FakeSender:
|
|
519
|
+
def __init__(self):
|
|
520
|
+
self.messages = []
|
|
521
|
+
|
|
522
|
+
async def __aenter__(self):
|
|
523
|
+
return self
|
|
524
|
+
|
|
525
|
+
async def __aexit__(self, exc_type, exc, traceback):
|
|
526
|
+
return None
|
|
527
|
+
|
|
528
|
+
async def send_messages(self, message):
|
|
529
|
+
self.messages.append(message)
|
|
530
|
+
|
|
531
|
+
|
|
532
|
+
class FakeServiceBusClient:
|
|
533
|
+
def __init__(self, sender):
|
|
534
|
+
self.sender = sender
|
|
535
|
+
self.queue_names = []
|
|
536
|
+
|
|
537
|
+
def get_queue_sender(self, *, queue_name):
|
|
538
|
+
self.queue_names.append(queue_name)
|
|
539
|
+
return self.sender
|
|
540
|
+
|
|
541
|
+
|
|
542
|
+
def test_redis_stream_publisher_uses_xadd():
|
|
543
|
+
client = FakeRedisClient()
|
|
544
|
+
settings = Settings(
|
|
545
|
+
_env_file=None,
|
|
546
|
+
database_url="postgresql://localhost/test",
|
|
547
|
+
redis_url="redis://localhost:6379/0",
|
|
548
|
+
redis_stream_name="orchestration-events",
|
|
549
|
+
)
|
|
550
|
+
publisher = build_message_publisher("redis-streams", settings=settings, redis_client=client)
|
|
551
|
+
|
|
552
|
+
asyncio.run(publisher.publish("rag.ingest", {"source_uri": "az://document"}))
|
|
553
|
+
|
|
554
|
+
stream_name, fields = client.calls[0]
|
|
555
|
+
assert stream_name == "orchestration-events"
|
|
556
|
+
assert fields["topic"] == "rag.ingest"
|
|
557
|
+
assert json.loads(fields["payload"]) == {
|
|
558
|
+
"payload": {"source_uri": "az://document"},
|
|
559
|
+
"topic": "rag.ingest",
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
|
|
563
|
+
def test_service_bus_publisher_uses_async_sender():
|
|
564
|
+
sender = FakeSender()
|
|
565
|
+
client = FakeServiceBusClient(sender)
|
|
566
|
+
publisher = build_message_publisher(
|
|
567
|
+
"azure-service-bus",
|
|
568
|
+
settings=Settings(
|
|
569
|
+
_env_file=None,
|
|
570
|
+
database_url="postgresql://localhost/test",
|
|
571
|
+
redis_url="redis://localhost:6379/0",
|
|
572
|
+
service_bus_queue_name="orchestration-jobs",
|
|
573
|
+
service_bus_auth_mode="managed-identity",
|
|
574
|
+
service_bus_fully_qualified_namespace="offline.servicebus.windows.net",
|
|
575
|
+
azure_client_id="00000000-0000-4000-8000-000000000001",
|
|
576
|
+
),
|
|
577
|
+
service_bus_client=client,
|
|
578
|
+
message_factory=lambda body: body,
|
|
579
|
+
)
|
|
580
|
+
|
|
581
|
+
asyncio.run(publisher.publish("workflow.run", {"job_id": "job-1"}))
|
|
582
|
+
|
|
583
|
+
assert client.queue_names == ["orchestration-jobs"]
|
|
584
|
+
assert json.loads(sender.messages[0]) == {
|
|
585
|
+
"payload": {"job_id": "job-1"},
|
|
586
|
+
"topic": "workflow.run",
|
|
587
|
+
}
|
|
588
|
+
`;
|
|
589
|
+
}
|
|
590
|
+
export function renderTracingTest() {
|
|
591
|
+
return `import asyncio
|
|
592
|
+
|
|
593
|
+
import pytest
|
|
594
|
+
|
|
595
|
+
from backend.observability.tracing import (
|
|
596
|
+
TracingConfigurationError,
|
|
597
|
+
build_tracer,
|
|
598
|
+
)
|
|
599
|
+
from backend.config.settings import get_settings
|
|
600
|
+
|
|
601
|
+
|
|
602
|
+
class FakeRemoteTrace:
|
|
603
|
+
trace_id = "trace-123"
|
|
604
|
+
|
|
605
|
+
def __init__(self):
|
|
606
|
+
self.updates = []
|
|
607
|
+
self.ended = False
|
|
608
|
+
|
|
609
|
+
def update(self, **values):
|
|
610
|
+
self.updates.append(values)
|
|
611
|
+
|
|
612
|
+
def end(self):
|
|
613
|
+
self.ended = True
|
|
614
|
+
|
|
615
|
+
|
|
616
|
+
class FakeLangfuse:
|
|
617
|
+
def __init__(self):
|
|
618
|
+
self.calls = []
|
|
619
|
+
self.remote_trace = FakeRemoteTrace()
|
|
620
|
+
|
|
621
|
+
def start_observation(self, **values):
|
|
622
|
+
self.calls.append(values)
|
|
623
|
+
return self.remote_trace
|
|
624
|
+
|
|
625
|
+
|
|
626
|
+
def test_unconfigured_tracing_is_explicitly_disabled(monkeypatch):
|
|
627
|
+
monkeypatch.setenv("LANGFUSE_PUBLIC_KEY", "")
|
|
628
|
+
monkeypatch.setenv("LANGFUSE_SECRET_KEY", "")
|
|
629
|
+
get_settings.cache_clear()
|
|
630
|
+
|
|
631
|
+
async def scenario():
|
|
632
|
+
async with build_tracer().trace("offline") as trace:
|
|
633
|
+
assert trace.enabled is False
|
|
634
|
+
assert trace.trace_id is None
|
|
635
|
+
|
|
636
|
+
asyncio.run(scenario())
|
|
637
|
+
|
|
638
|
+
|
|
639
|
+
def test_configured_tracing_updates_langfuse_operation():
|
|
640
|
+
client = FakeLangfuse()
|
|
641
|
+
|
|
642
|
+
async def scenario():
|
|
643
|
+
async with build_tracer(client=client).trace(
|
|
644
|
+
"agent.run",
|
|
645
|
+
{"prompt": "hello"},
|
|
646
|
+
) as trace:
|
|
647
|
+
assert trace.enabled is True
|
|
648
|
+
assert trace.trace_id == "trace-123"
|
|
649
|
+
trace.set_output({"answer": "world"})
|
|
650
|
+
|
|
651
|
+
asyncio.run(scenario())
|
|
652
|
+
assert client.calls == [
|
|
653
|
+
{"name": "agent.run", "as_type": "span", "input": {"prompt": "hello"}}
|
|
654
|
+
]
|
|
655
|
+
assert client.remote_trace.updates == [{"output": {"answer": "world"}}]
|
|
656
|
+
assert client.remote_trace.ended is True
|
|
657
|
+
|
|
658
|
+
|
|
659
|
+
def test_partial_langfuse_configuration_fails(monkeypatch):
|
|
660
|
+
monkeypatch.setenv("LANGFUSE_PUBLIC_KEY", "public")
|
|
661
|
+
monkeypatch.setenv("LANGFUSE_SECRET_KEY", "")
|
|
662
|
+
get_settings.cache_clear()
|
|
663
|
+
with pytest.raises(TracingConfigurationError, match="configured together"):
|
|
664
|
+
build_tracer()
|
|
665
|
+
`;
|
|
666
|
+
}
|
|
667
|
+
//# sourceMappingURL=backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.js","sourceRoot":"","sources":["../../../src/generators/genai/backend.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAI/C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAE3E,MAAM,UAAU,mBAAmB,CAAC,GAAgB,EAAE,IAAsB,EAAE,OAAyB;IACrG,MAAM,WAAW,GAAG,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;IACpD,GAAG,CAAC,mBAAmB,EAAE,SAAS,EAAE,CAAC,SAAS,EAAE,gBAAgB,CAAC,EAAE,sBAAsB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1G,GAAG,CAAC,iBAAiB,EAAE,SAAS,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC;IACxF,GAAG,CAAC,iBAAiB,EAAE,SAAS,EAAE,CAAC,SAAS,EAAE,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC;IAClE,GAAG,CAAC,qBAAqB,EAAE,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9E,GAAG,CAAC,cAAc,EAAE,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,iBAAiB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;IACrG,GAAG,CAAC,uBAAuB,EAAE,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC1G,GAAG,CAAC,wBAAwB,EAAE,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,WAAW,KAAK,CAAC,EAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;IACxH,GAAG,CAAC,wBAAwB,EAAE,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3F,GAAG,CAAC,yBAAyB,EAAE,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,SAAS,CAAC,EAAE,oBAAoB,EAAE,CAAC,CAAC;IAClH,GAAG,CAAC,wBAAwB,EAAE,SAAS,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC;IACnF,GAAG,CAAC,kBAAkB,EAAE,SAAS,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,aAAa,CAAC,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/F,GAAG,CAAC,+BAA+B,EAAE,SAAS,EAAE,CAAC,SAAS,EAAE,eAAe,EAAE,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC;IACjG,GAAG,CAAC,sBAAsB,EAAE,SAAS,EAAE,CAAC,SAAS,EAAE,eAAe,EAAE,iBAAiB,CAAC,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;IACjH,GAAG,CAAC,wBAAwB,EAAE,SAAS,EAAE,CAAC,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,cAAc,CAAC,EAAE,uBAAuB,EAAE,CAAC,CAAC;IAC3H,GAAG,CAAC,uBAAuB,EAAE,SAAS,EAAE,CAAC,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC;IAClG,GAAG,CAAC,uBAAuB,EAAE,SAAS,EAAE,CAAC,SAAS,EAAE,eAAe,EAAE,YAAY,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC;IACrG,GAAG,CAAC,+BAA+B,EAAE,SAAS,EAAE,CAAC,SAAS,EAAE,eAAe,EAAE,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC;IACjG,GAAG,CAAC,qBAAqB,EAAE,cAAc,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,gBAAgB,CAAC,EAAE,uBAAuB,EAAE,CAAC,CAAC;IAC9G,GAAG,CAAC,wBAAwB,EAAE,cAAc,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,mBAAmB,CAAC,EAAE,mBAAmB,EAAE,CAAC,CAAC;IAChH,GAAG,CAAC,sBAAsB,EAAE,cAAc,EAAE,CAAC,SAAS,EAAE,OAAO,EAAE,iBAAiB,CAAC,EAAE,iBAAiB,EAAE,CAAC,CAAC;AAC5G,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAsB,EAAE,OAAyB;IACtF,OAAO,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAsB,EAAE,WAAmB;IAC3E,OAAO;;;;;;;;0CAQiC,WAAW;;;;;;;;;;;;;;;;;;qBAkBhC,WAAW;;;;;;;;CAQ/B,CAAC;AACF,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO;;;;;;;;;;;;;CAaR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAsB;IACxD,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,GAAG,UAAU,QAAQ,CAAC;IACxC,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IACnC,IAAI,OAAO,CAAC,EAAE,KAAK,WAAW,EAAE,CAAC;QAC/B,OAAO;;;oCAGyB,SAAS;;6BAEhB,MAAM,aAAa,OAAO,CAAC,EAAE;;;;;;CAMzD,CAAC;IACA,CAAC;IAED,IAAI,OAAO,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;QACzB,OAAO;;;oCAGyB,SAAS;;6BAEhB,MAAM;;;;;;;;;;;;;;;;;;;CAmBlC,CAAC;IACA,CAAC;IAED,MAAM,SAAS,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC;IACvE,OAAO;;;oCAG2B,SAAS,eAAe,UAAU;;6BAEzC,MAAM,aAAa,OAAO,CAAC,EAAE;;;QAGlD,SAAS;;;;;yBAKQ,SAAS;uBACX,UAAU;CAChC,CAAC;AACF,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO;;;;;;;;;;CAUR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAsB;IACnD,OAAO,2BAA2B,CAAC,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAsB;IACtD,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACnC,OAAO;;;;;;;;;;;;;;;;;;sBAkBa,OAAO,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoD/B,CAAC;AACF,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8IR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2FR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO;;;;;;;;;;;;;;;;;;;;;;CAsBR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqFR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0ER,CAAC;AACF,CAAC"}
|