@aifabrix/builder 2.49.2 → 2.50.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/.cursor/rules/deploy-rules/docker-image-ip-policy.mdc +49 -0
- package/.cursor/rules/plan-rules/application-lifecycle.mdc +30 -0
- package/.cursor/rules/plan-rules/plan-frontmatter.mdc +35 -0
- package/.cursor/rules/plan-rules/plan-lifecycle.mdc +31 -0
- package/.cursor/rules/plan-rules/plan-validation-gate.mdc +34 -0
- package/.cursor/skills/README.md +1 -0
- package/.dockerignore +52 -0
- package/.eslintignore +22 -0
- package/README.md +2 -0
- package/bin/builder-api-cleanup.js +26 -0
- package/bin/builder-api-nest.js +10 -0
- package/bin/builder-api-spike.js +19 -0
- package/enterprise-knowledge/README.md +50 -0
- package/enterprise-knowledge/enterprise-integration-lifecycle/README.md +22 -0
- package/enterprise-knowledge/enterprise-integration-lifecycle/application.json +15 -0
- package/enterprise-knowledge/enterprise-integration-lifecycle/deploy.js +69 -0
- package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-deploy.json +52 -0
- package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-system.json +29 -0
- package/enterprise-knowledge/enterprise-integration-lifecycle/env.template +2 -0
- package/integration/README.md +81 -0
- package/integration/github/README.md +53 -0
- package/integration/github/application.json +21 -0
- package/integration/github/deploy.js +72 -0
- package/integration/github/env.template +11 -0
- package/integration/github/github-datasource-issue-comments.json +239 -0
- package/integration/github/github-datasource-issues.json +399 -0
- package/integration/github/github-datasource-repository.json +354 -0
- package/integration/github/github-deploy.json +1202 -0
- package/integration/github/github-system.json +82 -0
- package/integration/hubspot-test/README.md +1 -1
- package/jest.isolated-projects.js +31 -1
- package/jest.projects.js +87 -1
- package/lib/api/dev-server-https.js +1 -1
- package/lib/api/enterprise-knowledge.api.js +63 -0
- package/lib/api/evidence.api.js +172 -0
- package/lib/api/external-systems.api.js +8 -2
- package/lib/api/resource-types.api.js +1 -0
- package/lib/api/types/enterprise-knowledge.types.js +46 -0
- package/lib/api/types/evidence.types.js +67 -0
- package/lib/api/types/resource-types.types.js +2 -0
- package/lib/app/controller-application-filter.js +36 -0
- package/lib/app/deploy.js +1 -1
- package/lib/app/list-external-systems.js +130 -0
- package/lib/app/list.js +20 -8
- package/lib/app/run.js +3 -1
- package/lib/app/show-display.js +8 -3
- package/lib/app/show-online.js +178 -0
- package/lib/app/show.js +37 -88
- package/lib/build/builder-api-docker-staging.js +47 -0
- package/lib/build/miso-controller-npm-sdk-guard.js +2 -2
- package/lib/build/standard-docker-build.js +2 -0
- package/lib/certification/post-unified-cert-sync.js +4 -31
- package/lib/certification/sync-after-external-command.js +0 -1
- package/lib/certification/sync-system-certification.js +0 -3
- package/lib/channels/add-channel.js +40 -34
- package/lib/channels/approval-guides/chatgpt.js +33 -0
- package/lib/channels/approval-guides/credential-portal.js +38 -0
- package/lib/channels/approval-guides/index.js +110 -0
- package/lib/channels/approval-guides/microsoft-copilot.js +34 -0
- package/lib/channels/approval-guides/slack.js +34 -0
- package/lib/channels/approval-guides/teams-bot.js +35 -0
- package/lib/channels/approval-guides/web-embed.js +32 -0
- package/lib/channels/channel-approval-guide.js +11 -0
- package/lib/channels/channel-artifact-generator.js +16 -4
- package/lib/channels/channel-audit.js +3 -0
- package/lib/channels/channel-auth-context.js +1 -1
- package/lib/channels/channel-description.js +59 -0
- package/lib/channels/channel-integration-generator.js +13 -230
- package/lib/channels/channel-integration-template.js +94 -0
- package/lib/channels/channel-runtime-resolver.js +43 -3
- package/lib/channels/channel-status-display.js +66 -26
- package/lib/channels/channel-targets.js +3 -3
- package/lib/cli/index.js +27 -3
- package/lib/cli/infra-guided.js +5 -1
- package/lib/cli/setup-app-external-create.js +111 -0
- package/lib/cli/setup-app.help.js +1 -1
- package/lib/cli/setup-app.js +38 -125
- package/lib/cli/setup-app.test-commands.js +26 -52
- package/lib/cli/setup-certification-commands.js +4 -4
- package/lib/cli/setup-certification.help.js +9 -9
- package/lib/cli/setup-dev.js +7 -2
- package/lib/cli/setup-external-system-help.js +4 -6
- package/lib/cli/setup-external-system.js +58 -52
- package/lib/cli/setup-infra-up-builder-api-action.js +64 -0
- package/lib/cli/setup-infra-up-platform-action.js +3 -1
- package/lib/cli/setup-infra.js +15 -0
- package/lib/cli/setup-list.js +43 -0
- package/lib/cli/setup-utility-repair.js +26 -7
- package/lib/cli/setup-utility.js +5 -3
- package/lib/commands/app.js +15 -43
- package/lib/commands/channel-add-setup.js +110 -0
- package/lib/commands/channel.js +42 -8
- package/lib/commands/datasource-sync-display.js +96 -0
- package/lib/commands/datasource-sync-policy.js +210 -0
- package/lib/commands/datasource-test-trust-cli.js +6 -6
- package/lib/commands/datasource-unified-test-cli.js +2 -1
- package/lib/commands/datasource-unified-test-cli.options.js +33 -23
- package/lib/commands/deploy-gate-failure-details.js +163 -0
- package/lib/commands/deploy-gate-orchestrator.js +322 -0
- package/lib/commands/dev-cli-handlers.js +1 -59
- package/lib/commands/dev-host-ops-params.js +91 -0
- package/lib/commands/dev-host-ops-poll.js +111 -0
- package/lib/commands/dev-host-ops.js +107 -94
- package/lib/commands/dev-init.js +3 -1
- package/lib/commands/enterprise-knowledge.js +284 -0
- package/lib/commands/evidence-cli-leaves.js +250 -0
- package/lib/commands/evidence.js +51 -0
- package/lib/commands/governance-cli-shared.js +2 -2
- package/lib/commands/governance-command-action.js +2 -2
- package/lib/commands/governance-fixture-subjects.js +85 -0
- package/lib/commands/governance.js +1 -1
- package/lib/commands/lifecycle-command-action.js +2 -2
- package/lib/commands/lifecycle-external.js +3 -3
- package/lib/commands/manifest-cli-auth.js +29 -0
- package/lib/commands/manifest-cli-commands.js +170 -0
- package/lib/commands/manifest-cli-integration-path.js +63 -0
- package/lib/commands/manifest.js +21 -0
- package/lib/commands/protection-cli-leaves.js +3 -3
- package/lib/commands/repair-auth-apply.js +15 -1
- package/lib/commands/repair-authentications-454.js +169 -0
- package/lib/commands/repair-capability-openapi-warnings.js +126 -0
- package/lib/commands/repair-datasource-apply.js +135 -0
- package/lib/commands/repair-datasource-auto-rbac.js +62 -1
- package/lib/commands/repair-datasource-http-service-contract.js +239 -0
- package/lib/commands/repair-datasource-operation-security.js +180 -0
- package/lib/commands/repair-datasource-run.js +7 -2
- package/lib/commands/repair-datasource-sync-operations.js +177 -0
- package/lib/commands/repair-datasource-webhooks-sync-bridge.js +133 -0
- package/lib/commands/repair-datasource.js +12 -68
- package/lib/commands/repair-env-template.js +11 -1
- package/lib/commands/repair-external-run.js +121 -31
- package/lib/commands/repair-internal.js +1 -1
- package/lib/commands/repair-openapi-export.js +156 -0
- package/lib/commands/repair-openapi-sync.js +19 -2
- package/lib/commands/repair-orchestration-datasource-split.js +259 -0
- package/lib/commands/repair-persist.js +22 -1
- package/lib/commands/repair-rbac-platform-preset.js +204 -0
- package/lib/commands/repair-rbac-reader-roles.js +191 -0
- package/lib/commands/repair-rbac.js +163 -86
- package/lib/commands/repair-steps.js +83 -18
- package/lib/commands/repair-system-permissions.js +1 -0
- package/lib/commands/repair.js +1 -1
- package/lib/commands/resource-type.js +65 -26
- package/lib/commands/run-post-publish-data-sync.js +68 -0
- package/lib/commands/setup-modes.js +1 -1
- package/lib/commands/test-e2e-external.js +21 -8
- package/lib/commands/test-governance-cli-options.js +2 -2
- package/lib/commands/test-trust-cli-options.js +2 -2
- package/lib/commands/up-builder-api-bootstrap.js +71 -0
- package/lib/commands/up-builder-api-provision.js +241 -0
- package/lib/commands/up-builder-api.js +88 -0
- package/lib/commands/up-common.js +25 -1
- package/lib/commands/upload-credential-push-log.js +117 -0
- package/lib/commands/upload-data-sync-finalize.js +60 -0
- package/lib/commands/upload-probe.js +66 -0
- package/lib/commands/upload-publish-context.js +4 -1
- package/lib/commands/upload-sidecar-followups.js +55 -27
- package/lib/commands/upload.js +116 -157
- package/lib/commands/verify-governance-combined-external.js +1 -1
- package/lib/commands/verify-governance-db.js +2 -2
- package/lib/commands/verify-operations-command-action.js +2 -2
- package/lib/commands/verify-operations-step-plan.js +2 -2
- package/lib/commands/verify-operations-steps.js +2 -2
- package/lib/commands/verify-trust-command-action.js +1 -1
- package/lib/commands/wizard-core.js +1 -1
- package/lib/commands/wizard-headless.js +2 -1
- package/lib/core/admin-secrets.js +2 -6
- package/lib/core/secrets-env-content.js +10 -4
- package/lib/core/secrets-env-write.js +2 -13
- package/lib/datasource/agent-trust-run.js +3 -3
- package/lib/datasource/deploy.js +3 -1
- package/lib/datasource/test-e2e.js +6 -1
- package/lib/datasource/unified-validation-run-body.js +4 -1
- package/lib/datasource/unified-validation-run.js +1 -1
- package/lib/deployment/deploy-poll-ui.js +73 -12
- package/lib/deployment/deployer-poll-run.js +113 -0
- package/lib/deployment/deployer.js +17 -87
- package/lib/evidence/dataplane-context.js +21 -0
- package/lib/evidence/evidence-display.js +78 -0
- package/lib/evidence/evidence-service.js +392 -0
- package/lib/external-system/deploy.js +290 -112
- package/lib/external-system/download.js +7 -3
- package/lib/external-system/test-execution.js +1 -1
- package/lib/external-system/test-system-level.js +8 -10
- package/lib/external-system/test.js +12 -6
- package/lib/generator/deploy-script.js +73 -0
- package/lib/generator/external.js +2 -1
- package/lib/generator/index.js +17 -2
- package/lib/generator/wizard.js +3 -36
- package/lib/internal/fs-real-sync.js +22 -1
- package/lib/internal/node-fs.js +2 -0
- package/lib/lifecycle/lifecycle-governance-options.js +1 -1
- package/lib/lifecycle/verify-step-progress.js +1 -1
- package/lib/programmatic/access-log.js +26 -0
- package/lib/programmatic/auth-config.js +44 -0
- package/lib/programmatic/bearer-auth.js +176 -0
- package/lib/programmatic/builder-api-request.js +175 -0
- package/lib/programmatic/builder-api-route-dispatch.js +82 -0
- package/lib/programmatic/builder-api-runtime-config.js +42 -0
- package/lib/programmatic/builder-api-server.js +230 -0
- package/lib/programmatic/builder-help-authentication-catalog.js +282 -0
- package/lib/programmatic/builder-help-connected-system-ui.js +266 -0
- package/lib/programmatic/builder-help-enterprise-sync-fabrix.js +60 -0
- package/lib/programmatic/builder-help-envelope.js +36 -0
- package/lib/programmatic/builder-help-fixtures.js +200 -0
- package/lib/programmatic/builder-help-governance.js +172 -0
- package/lib/programmatic/builder-help-schema-catalog.js +92 -0
- package/lib/programmatic/builder-help.js +361 -0
- package/lib/programmatic/capability-registry.js +77 -0
- package/lib/programmatic/command-options.js +32 -0
- package/lib/programmatic/enterprise-mcp-client.js +98 -0
- package/lib/programmatic/http-problem-details.js +99 -0
- package/lib/programmatic/http-route-match.js +40 -0
- package/lib/programmatic/idempotency-cache.js +69 -0
- package/lib/programmatic/index.js +53 -0
- package/lib/programmatic/integration-path-scope.js +39 -0
- package/lib/programmatic/log-redaction.js +66 -0
- package/lib/programmatic/manifest-get-section.js +146 -0
- package/lib/programmatic/manifest-patch-section.js +252 -0
- package/lib/programmatic/manifest-repair.js +122 -0
- package/lib/programmatic/manifest-section-dependency-graph.js +160 -0
- package/lib/programmatic/manifest-section-io.js +225 -0
- package/lib/programmatic/manifest-section-quality.js +171 -0
- package/lib/programmatic/manifest-section-registry-data.js +269 -0
- package/lib/programmatic/manifest-section-registry.js +205 -0
- package/lib/programmatic/nest-http-bridge.js +34 -0
- package/lib/programmatic/openapi-component-schemas.js +68 -0
- package/lib/programmatic/openapi-description-enricher.js +117 -0
- package/lib/programmatic/openapi-descriptions.js +190 -0
- package/lib/programmatic/openapi-docs-serving.js +123 -0
- package/lib/programmatic/openapi-help-schemas.js +63 -0
- package/lib/programmatic/openapi-manifest-schemas.js +141 -0
- package/lib/programmatic/openapi-operation-bindings.js +274 -0
- package/lib/programmatic/openapi-request-schemas.js +155 -0
- package/lib/programmatic/openapi-result-schemas.js +476 -0
- package/lib/programmatic/openapi-schema-descriptions-certify.js +139 -0
- package/lib/programmatic/openapi-schema-descriptions-core.js +159 -0
- package/lib/programmatic/openapi-schema-descriptions-help.js +40 -0
- package/lib/programmatic/openapi-schema-descriptions-manifest.js +143 -0
- package/lib/programmatic/openapi-schema-descriptions-mcp.js +118 -0
- package/lib/programmatic/openapi-schema-descriptions-operations.js +281 -0
- package/lib/programmatic/openapi-schema-helpers.js +93 -0
- package/lib/programmatic/openapi-spec.js +203 -0
- package/lib/programmatic/orchestration-openapi-meta.js +159 -0
- package/lib/programmatic/platform-rbac-catalog.js +90 -0
- package/lib/programmatic/request-timeout.js +53 -0
- package/lib/programmatic/route-handler-map.js +143 -0
- package/lib/programmatic/route-handlers-context.js +29 -0
- package/lib/programmatic/route-handlers.js +33 -0
- package/lib/programmatic/run-certify.js +57 -0
- package/lib/programmatic/run-enterprise-mcp.js +32 -0
- package/lib/programmatic/run-lifecycle.js +29 -0
- package/lib/programmatic/run-repair.js +41 -0
- package/lib/programmatic/run-repository-emcp.js +54 -0
- package/lib/programmatic/run-template-workspace.js +61 -0
- package/lib/programmatic/run-test.js +49 -0
- package/lib/programmatic/run-upload.js +63 -0
- package/lib/programmatic/run-validate.js +53 -0
- package/lib/programmatic/run-wizard.js +40 -0
- package/lib/programmatic/system-key.js +48 -0
- package/lib/programmatic/wizard-config-normalize.js +118 -0
- package/lib/programmatic/workspace-cleanup.js +128 -0
- package/lib/programmatic/workspace-context.js +145 -0
- package/lib/programmatic/workspace-lock.js +75 -0
- package/lib/programmatic/workspace-meta.js +64 -0
- package/lib/programmatic/workspace-ops.js +149 -0
- package/lib/protection/run-commands-upload-sync.js +35 -0
- package/lib/protection/run-commands.js +2 -20
- package/lib/protection/upload-batch.js +11 -7
- package/lib/resolvers/resource-type-file.js +22 -0
- package/lib/schema/external-datasource.schema.json +161 -1
- package/lib/schema/external-system.schema.json +244 -118
- package/lib/schema/flag-map-validation-run.json +3 -0
- package/lib/schema/type/credential-field-registry.json +2 -2
- package/lib/schema/type/document-storage.json +9 -0
- package/lib/utils/agent-trust-run-display.js +1 -1
- package/lib/utils/app-path-resolve.js +168 -0
- package/lib/utils/authentication-env-template.js +222 -0
- package/lib/utils/cli-sync-options.js +7 -11
- package/lib/utils/cli-utils.js +4 -0
- package/lib/utils/cli-workspace-options.js +29 -0
- package/lib/utils/compose-generate-docker-compose.js +102 -0
- package/lib/utils/configuration-env-resolver.js +203 -27
- package/lib/utils/datasource-test-run-certificate-tty.js +28 -2
- package/lib/utils/datasource-test-run-certification-debug.js +130 -0
- package/lib/utils/datasource-test-run-debug-display.js +2 -0
- package/lib/utils/datasource-test-run-debug-slice.js +7 -0
- package/lib/utils/datasource-test-run-display.js +2 -1
- package/lib/utils/dev-init-ssh-merge.js +165 -23
- package/lib/utils/dev-pin-share-instructions.js +110 -0
- package/lib/utils/dev-ssh-config-helper.js +177 -33
- package/lib/utils/enterprise-knowledge-paths.js +142 -0
- package/lib/utils/env-copy.js +2 -1
- package/lib/utils/env-dotenv-format.js +103 -0
- package/lib/utils/external-env-template.js +4 -1
- package/lib/utils/external-system-display.js +5 -1
- package/lib/utils/external-system-readiness-compact-blocks.js +221 -0
- package/lib/utils/external-system-readiness-compact-display.js +324 -0
- package/lib/utils/external-system-readiness-core.js +16 -0
- package/lib/utils/external-system-readiness-deploy-display.js +29 -11
- package/lib/utils/external-system-readiness-display-internals.js +3 -1
- package/lib/utils/external-system-readiness-display.js +20 -30
- package/lib/utils/external-system-system-test-tty-certification.js +135 -0
- package/lib/utils/external-system-system-test-tty.js +5 -41
- package/lib/utils/help-builder.js +6 -1
- package/lib/utils/host-ops-job-labels.js +236 -0
- package/lib/utils/host-ops-job-result.js +61 -0
- package/lib/utils/host-ops-poll-ui.js +163 -0
- package/lib/utils/integration-path-resolve.js +112 -0
- package/lib/utils/paths-reload-source.js +148 -0
- package/lib/utils/paths-system-builder-keys.js +25 -0
- package/lib/utils/paths.js +151 -26
- package/lib/utils/runtime-configuration-values.js +64 -2
- package/lib/utils/secrets-helpers.js +5 -1
- package/lib/utils/ssh-known-hosts.js +130 -0
- package/lib/utils/test-target-cli-options.js +75 -0
- package/lib/utils/upload-sync-options.js +4 -0
- package/lib/utils/validation-run-request.js +11 -2
- package/lib/validation/external-manifest-validator.js +11 -1
- package/lib/validation/openapi-contract-surface-validator.js +426 -0
- package/lib/validation/openapi-contract-vendor-validation.js +238 -0
- package/lib/validation/validate-external-file.js +160 -0
- package/lib/validation/validate.js +6 -117
- package/package.json +46 -29
- package/packages/builder-api/README.md +120 -0
- package/packages/builder-api/package.json +30 -0
- package/packages/builder-api/src/app.module.ts +7 -0
- package/packages/builder-api/src/auth/auth.module.ts +5 -0
- package/packages/builder-api/src/external-system/external-system.module.ts +5 -0
- package/packages/builder-api/src/main.ts +16 -0
- package/packages/builder-api/tsconfig.json +15 -0
- package/scripts/check-builder-api-architecture-grep.js +79 -0
- package/scripts/docker_image_content_gate.js +47 -0
- package/scripts/docker_image_content_gate.sh +5 -0
- package/scripts/export-builder-api-evidence.js +262 -0
- package/scripts/lib/builder-api-docker-staging-copy.js +60 -0
- package/scripts/lib/builder-api-docker-staging-core.js +183 -0
- package/scripts/lib/docker-image-content-gate-core.js +166 -0
- package/scripts/lib/plan-actor.js +109 -0
- package/scripts/lib/plan-config.js +20 -0
- package/scripts/lib/plan-gates.js +154 -0
- package/scripts/lib/plan-meta.js +104 -0
- package/scripts/lib/plan-parse.js +162 -0
- package/scripts/lib/plan-prevalidate-gates.js +326 -0
- package/scripts/lib/plan-run-core.js +125 -0
- package/scripts/lib/plan-run-report.js +108 -0
- package/scripts/plan-approve.js +24 -0
- package/scripts/plan-archive.js +49 -0
- package/scripts/plan-run.js +13 -0
- package/scripts/plan-set-actor.js +21 -0
- package/scripts/plan-validate.js +80 -0
- package/scripts/pnpm/af.mjs +110 -0
- package/scripts/pnpm/check-quiet.mjs +32 -0
- package/scripts/pnpm/dev-install.mjs +29 -0
- package/scripts/pnpm/dev-reload.mjs +18 -0
- package/scripts/pnpm/help.mjs +55 -0
- package/scripts/pnpm/lib/dev-reload-core.mjs +189 -0
- package/scripts/pnpm/lib/dev-reload-log-capture.mjs +67 -0
- package/scripts/pnpm/lib/dev-reload-log-utils.mjs +32 -0
- package/scripts/pnpm/lib/resolve-aifabrix-bin.mjs +124 -0
- package/scripts/pnpm/lib/resolve-app-url.mjs +183 -0
- package/scripts/pnpm/lib/spinner.mjs +42 -0
- package/scripts/stage_builder_api_for_docker.js +65 -0
- package/scripts/sync-builder-api-template.js +44 -0
- package/templates/README.md +3 -0
- package/templates/applications/builder-api/Dockerfile +38 -0
- package/templates/applications/builder-api/application.yaml +75 -0
- package/templates/applications/builder-api/env.template +48 -0
- package/templates/applications/dataplane/application.yaml +1 -1
- package/templates/applications/dataplane/env.template +10 -6
- package/templates/applications/dataplane/rbac.yaml +21 -1
- package/templates/applications/miso-controller/application.yaml +1 -1
- package/templates/applications/miso-controller/env.template +1 -3
- package/templates/channels/README.md +18 -0
- package/templates/channels/ai-fabrix-icon.jpg +0 -0
- package/templates/channels/chatgpt/install.template.md.hbs +21 -24
- package/templates/channels/chatgpt/integration/README.md +11 -0
- package/templates/channels/chatgpt/integration/application.json +15 -0
- package/templates/channels/chatgpt/integration/chatgpt-system.json +29 -0
- package/templates/channels/chatgpt/integration/env.template +4 -0
- package/templates/channels/microsoft-copilot/install.template.md.hbs +20 -25
- package/templates/channels/microsoft-copilot/integration/README.md +11 -0
- package/templates/channels/microsoft-copilot/integration/application.json +15 -0
- package/templates/channels/microsoft-copilot/integration/env.template +6 -0
- package/templates/channels/microsoft-copilot/integration/microsoft-copilot-system.json +34 -0
- package/templates/channels/slack/install.template.md.hbs +48 -18
- package/templates/channels/slack/integration/README.md +38 -0
- package/templates/channels/slack/integration/application.json +18 -0
- package/templates/channels/slack/integration/env.template +29 -0
- package/templates/channels/slack/integration/slack-datasource-conversations.json +226 -0
- package/templates/channels/slack/integration/slack-datasource-messages.json +269 -0
- package/templates/channels/slack/integration/slack-system.json +86 -0
- package/templates/channels/slack/manifest.template.json.hbs +20 -10
- package/templates/channels/teams-bot/install.template.md.hbs +31 -17
- package/templates/channels/teams-bot/integration/README.md +18 -0
- package/templates/channels/teams-bot/integration/application.json +17 -0
- package/templates/channels/teams-bot/integration/env.template +5 -0
- package/templates/channels/teams-bot/integration/teams-bot-system.json +55 -0
- package/templates/channels/teams-bot/manifest.template.json.hbs +27 -0
- package/templates/channels/web-embed/install.template.md.hbs +16 -26
- package/templates/channels/web-embed/integration/README.md +11 -0
- package/templates/channels/web-embed/integration/application.json +15 -0
- package/templates/channels/web-embed/integration/env.template +4 -0
- package/templates/channels/web-embed/integration/web-embed-system.json +29 -0
- package/templates/openapi/redoc_page.html +86 -0
- package/templates/python/docker-compose.hbs +11 -0
- package/templates/python/requirements.txt +1 -1
- package/templates/typescript/docker-compose.hbs +11 -0
- package/lib/certification/cli-cert-sync-skip.js +0 -21
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve on-disk integration path for manifest CLI (plan 141).
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview cwd/integration → cwd/builder → ~/.aifabrix materialization
|
|
5
|
+
* @author AI Fabrix Team
|
|
6
|
+
* @version 1.0.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const fs = require('../internal/fs-real-sync');
|
|
12
|
+
const path = require('path');
|
|
13
|
+
const { resolveApplicationManifestPathSync } = require('../utils/manifest-location');
|
|
14
|
+
const { getIntegrationPath } = require('../utils/paths');
|
|
15
|
+
const { findIntegrationPathAcrossWorkTree } = require('../utils/integration-path-resolve');
|
|
16
|
+
const { discoverIntegrationFiles } = require('./repair-internal');
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @param {string} systemKey
|
|
20
|
+
* @returns {{ integrationPath: string, tier: string }}
|
|
21
|
+
*/
|
|
22
|
+
function resolveManifestCliIntegrationPath(systemKey) {
|
|
23
|
+
const manifestHit = resolveApplicationManifestPathSync({ targetKey: systemKey, mode: 'auto' });
|
|
24
|
+
if (manifestHit) {
|
|
25
|
+
return { integrationPath: manifestHit.absolutePath, tier: manifestHit.tier };
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const fallback = getIntegrationPath(systemKey);
|
|
29
|
+
if (fs.existsSync(fallback)) {
|
|
30
|
+
const { systemFiles, datasourceFiles } = discoverIntegrationFiles(fallback);
|
|
31
|
+
if (systemFiles.length > 0 || datasourceFiles.length > 0) {
|
|
32
|
+
return { integrationPath: fallback, tier: 'paths-fallback' };
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const workHit = findIntegrationPathAcrossWorkTree(systemKey);
|
|
37
|
+
if (workHit) {
|
|
38
|
+
return workHit;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const err = new Error(
|
|
42
|
+
`Integration "${systemKey}" not found. Looked under cwd/integration/${systemKey}/, ` +
|
|
43
|
+
'aifabrix-work sibling repos (*/integration/), and materialized ~/.aifabrix/.../integration/. ' +
|
|
44
|
+
'Run from the repo that contains the integration, set aifabrix-work, or set WORKSPACE_ROOT for builder-api workspaces.'
|
|
45
|
+
);
|
|
46
|
+
err.statusCode = 404;
|
|
47
|
+
throw err;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* @param {string} integrationPath
|
|
52
|
+
* @param {string} systemKey
|
|
53
|
+
*/
|
|
54
|
+
function assertIntegrationPathMatchesSystemKey(integrationPath, systemKey) {
|
|
55
|
+
if (path.basename(path.resolve(integrationPath)) !== systemKey) {
|
|
56
|
+
throw new Error(`integrationPath must end with systemKey "${systemKey}"`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
module.exports = {
|
|
61
|
+
resolveManifestCliIntegrationPath,
|
|
62
|
+
assertIntegrationPathMatchesSystemKey
|
|
63
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI manifest command group (plan 154.4).
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview Thin wrapper registering manifest subcommands
|
|
5
|
+
* @author AI Fabrix Team
|
|
6
|
+
* @version 1.0.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const { registerManifestSubcommands } = require('./manifest-cli-commands');
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @param {import('commander').Command} program
|
|
15
|
+
*/
|
|
16
|
+
function setupManifestCommands(program) {
|
|
17
|
+
const manifest = program.command('manifest').description('Governed manifest section editing (get, patch, repair)');
|
|
18
|
+
registerManifestSubcommands(manifest);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
module.exports = { setupManifestCommands };
|
|
@@ -47,7 +47,7 @@ const PROTECTION_UPLOAD_HELP_AFTER = `
|
|
|
47
47
|
Examples:
|
|
48
48
|
$ aifabrix protection upload hubspot-companies
|
|
49
49
|
$ aifabrix protection upload hubspot-companies --dry-run
|
|
50
|
-
$ aifabrix protection upload hubspot-companies --
|
|
50
|
+
$ aifabrix protection upload hubspot-companies --sync
|
|
51
51
|
`;
|
|
52
52
|
|
|
53
53
|
const PROTECTION_LIST_HELP_AFTER = `
|
|
@@ -194,13 +194,13 @@ function registerProtectionUpload(protection) {
|
|
|
194
194
|
manifestPath: resolved.manifestPath,
|
|
195
195
|
warningsAsErrors: options.warningsAsErrors === true,
|
|
196
196
|
dryRun: options.dryRun === true,
|
|
197
|
-
|
|
197
|
+
sync: options.sync === true,
|
|
198
198
|
verbose: options.verbose === true
|
|
199
199
|
}, logger);
|
|
200
200
|
},
|
|
201
201
|
[
|
|
202
202
|
['--dry-run', 'Validate only; no upload or sync'],
|
|
203
|
-
['--
|
|
203
|
+
['--sync', 'Force full datasource data sync after upload (default: bootstrap-if-empty)']
|
|
204
204
|
],
|
|
205
205
|
PROTECTION_UPLOAD_HELP_AFTER
|
|
206
206
|
);
|
|
@@ -27,7 +27,8 @@ const ALLOWED_REPAIR_AUTH = [
|
|
|
27
27
|
'queryparam',
|
|
28
28
|
'oidc',
|
|
29
29
|
'hmac',
|
|
30
|
-
'none'
|
|
30
|
+
'none',
|
|
31
|
+
'bearerforward'
|
|
31
32
|
];
|
|
32
33
|
|
|
33
34
|
const PRESERVED_VARIABLE_KEYS = ['baseUrl', 'testEndpoint'];
|
|
@@ -56,6 +57,9 @@ function isAllowedRepairAuth(authOption) {
|
|
|
56
57
|
*/
|
|
57
58
|
function buildAuthenticationForRepair(systemKey, authOption) {
|
|
58
59
|
const normalized = normalizeRepairAuthOption(authOption);
|
|
60
|
+
if (normalized === 'bearerforward') {
|
|
61
|
+
return buildBearerForwardAuthentication();
|
|
62
|
+
}
|
|
59
63
|
const schemaMethod =
|
|
60
64
|
normalized === 'queryparam'
|
|
61
65
|
? 'queryParam'
|
|
@@ -65,6 +69,14 @@ function buildAuthenticationForRepair(systemKey, authOption) {
|
|
|
65
69
|
return buildAuthenticationFromMethod(systemKey, schemaMethod);
|
|
66
70
|
}
|
|
67
71
|
|
|
72
|
+
/**
|
|
73
|
+
* Facade APIs that forward the caller Bearer token — no workspace kv secret.
|
|
74
|
+
* @returns {{ authType: 'none' }}
|
|
75
|
+
*/
|
|
76
|
+
function buildBearerForwardAuthentication() {
|
|
77
|
+
return { authType: 'none' };
|
|
78
|
+
}
|
|
79
|
+
|
|
68
80
|
/**
|
|
69
81
|
* Merges preserved connectivity fields from existing auth into template variables.
|
|
70
82
|
* @param {Object} mergedVariables - Target variables object (mutated)
|
|
@@ -87,6 +99,7 @@ function mergePreservedAuthVariables(mergedVariables, existingVars) {
|
|
|
87
99
|
function repairAuthChangeLabel(authOption) {
|
|
88
100
|
const normalized = normalizeRepairAuthOption(authOption);
|
|
89
101
|
if (normalized === 'bearertoken' || normalized === 'bearerkey') return 'bearerToken';
|
|
102
|
+
if (normalized === 'bearerforward') return 'bearerForward';
|
|
90
103
|
return normalized;
|
|
91
104
|
}
|
|
92
105
|
|
|
@@ -144,6 +157,7 @@ module.exports = {
|
|
|
144
157
|
normalizeRepairAuthOption,
|
|
145
158
|
isAllowedRepairAuth,
|
|
146
159
|
buildAuthenticationForRepair,
|
|
160
|
+
buildBearerForwardAuthentication,
|
|
147
161
|
mergePreservedAuthVariables,
|
|
148
162
|
repairAuthChangeLabel,
|
|
149
163
|
appendTestEndpointWarningIfMissing,
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Repair authentications[] normalization for 454.0 webhooks/syncBridge.
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview Normalize legacy authentication to authentications[] slots
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
'use strict';
|
|
8
|
+
|
|
9
|
+
const { migrateAuthenticationToNestedSchema } = require('../utils/authentication-shape');
|
|
10
|
+
|
|
11
|
+
const AUTH_USAGE_API = 'api';
|
|
12
|
+
const AUTH_USAGE_WEBHOOK_INBOUND = 'webhookInbound';
|
|
13
|
+
const AUTH_USAGE_SYNC_EXECUTION = 'syncExecution';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @param {string} systemKey
|
|
17
|
+
* @returns {object}
|
|
18
|
+
*/
|
|
19
|
+
function buildWebhookInboundAuthSlot(systemKey) {
|
|
20
|
+
const key = systemKey || 'system';
|
|
21
|
+
return {
|
|
22
|
+
key: 'webhookInbound',
|
|
23
|
+
usage: AUTH_USAGE_WEBHOOK_INBOUND,
|
|
24
|
+
authType: 'credential',
|
|
25
|
+
credential: {
|
|
26
|
+
credentialKey: `${key}-webhook-inbound`,
|
|
27
|
+
method: 'hmac',
|
|
28
|
+
variables: {
|
|
29
|
+
algorithm: 'sha256',
|
|
30
|
+
signatureHeader: 'X-Webhook-Signature',
|
|
31
|
+
timestampHeader: 'X-Webhook-Timestamp',
|
|
32
|
+
signaturePrefix: 'v0='
|
|
33
|
+
},
|
|
34
|
+
security: {
|
|
35
|
+
signingSecret: `kv://${key}/webhookInbound/signingSecret`
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* @param {string} systemKey
|
|
43
|
+
* @returns {object}
|
|
44
|
+
*/
|
|
45
|
+
function buildSyncExecutionAuthSlot(systemKey) {
|
|
46
|
+
const key = systemKey || 'system';
|
|
47
|
+
return {
|
|
48
|
+
key: 'syncExecution',
|
|
49
|
+
usage: AUTH_USAGE_SYNC_EXECUTION,
|
|
50
|
+
authType: 'credential',
|
|
51
|
+
credential: {
|
|
52
|
+
credentialKey: `${key}-sync-execution`,
|
|
53
|
+
method: 'apikey',
|
|
54
|
+
variables: {
|
|
55
|
+
baseUrl: 'https://api.example.com',
|
|
56
|
+
headerName: 'X-API-Key',
|
|
57
|
+
testEndpoint: '/health'
|
|
58
|
+
},
|
|
59
|
+
security: {
|
|
60
|
+
apiKey: `kv://${key}/syncExecution/apiKey`
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Normalize legacy authentication to authentications[] when missing.
|
|
68
|
+
* @param {object} systemJson - Parsed external system manifest
|
|
69
|
+
* @returns {{ changed: boolean, warnings: string[] }}
|
|
70
|
+
*/
|
|
71
|
+
function repairAuthenticationsArray(systemJson) {
|
|
72
|
+
const warnings = [];
|
|
73
|
+
if (!systemJson || typeof systemJson !== 'object') {
|
|
74
|
+
return { changed: false, warnings };
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
migrateAuthenticationToNestedSchema(systemJson);
|
|
78
|
+
|
|
79
|
+
const existing = systemJson.authentications;
|
|
80
|
+
if (Array.isArray(existing) && existing.length > 0) {
|
|
81
|
+
return { changed: false, warnings };
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const legacy = systemJson.authentication;
|
|
85
|
+
if (!legacy || typeof legacy !== 'object') {
|
|
86
|
+
return { changed: false, warnings };
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
systemJson.authentications = [
|
|
90
|
+
{
|
|
91
|
+
key: 'default',
|
|
92
|
+
usage: AUTH_USAGE_API,
|
|
93
|
+
...legacy
|
|
94
|
+
}
|
|
95
|
+
];
|
|
96
|
+
warnings.push(
|
|
97
|
+
'Normalized legacy authentication to authentications[{key:default, usage:api}].'
|
|
98
|
+
);
|
|
99
|
+
return { changed: true, warnings };
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Ensure webhook/sync auth slots exist when repair flags request them.
|
|
104
|
+
* @param {object} systemJson
|
|
105
|
+
* @param {{ authWebhook?: boolean, authSync?: boolean, systemKey: string, authMethod?: string }} options
|
|
106
|
+
* @returns {{ changed: boolean, warnings: string[] }}
|
|
107
|
+
*/
|
|
108
|
+
function ensureAuthUsageSlots(systemJson, options) {
|
|
109
|
+
const warnings = [];
|
|
110
|
+
const { repairAuthenticationsArray: normalize } = { repairAuthenticationsArray };
|
|
111
|
+
const base = normalize(systemJson);
|
|
112
|
+
warnings.push(...base.warnings);
|
|
113
|
+
let changed = base.changed;
|
|
114
|
+
|
|
115
|
+
if (!Array.isArray(systemJson.authentications)) {
|
|
116
|
+
systemJson.authentications = [];
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const ensureSlot = (usage, slotKey, slotFactory) => {
|
|
120
|
+
const found = systemJson.authentications.some(
|
|
121
|
+
(row) => row && row.usage === usage
|
|
122
|
+
);
|
|
123
|
+
if (found) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
if (typeof slotFactory === 'function') {
|
|
127
|
+
systemJson.authentications.push(slotFactory(options.systemKey));
|
|
128
|
+
warnings.push(`Added authentications slot usage=${usage} key=${slotKey}.`);
|
|
129
|
+
changed = true;
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
const template = systemJson.authentications[0] || systemJson.authentication;
|
|
133
|
+
if (!template || typeof template !== 'object') {
|
|
134
|
+
warnings.push(`Cannot add ${usage} slot — no authentication template available.`);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
const { key: _ignored, usage: _u, ...rest } = template;
|
|
138
|
+
systemJson.authentications.push({ key: slotKey, usage, ...rest });
|
|
139
|
+
warnings.push(`Added authentications slot usage=${usage} key=${slotKey}.`);
|
|
140
|
+
changed = true;
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
if (options.authWebhook) {
|
|
144
|
+
ensureSlot(
|
|
145
|
+
AUTH_USAGE_WEBHOOK_INBOUND,
|
|
146
|
+
'webhookInbound',
|
|
147
|
+
buildWebhookInboundAuthSlot
|
|
148
|
+
);
|
|
149
|
+
}
|
|
150
|
+
if (options.authSync) {
|
|
151
|
+
ensureSlot(
|
|
152
|
+
AUTH_USAGE_SYNC_EXECUTION,
|
|
153
|
+
'syncExecution',
|
|
154
|
+
buildSyncExecutionAuthSlot
|
|
155
|
+
);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return { changed, warnings };
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
module.exports = {
|
|
162
|
+
repairAuthenticationsArray,
|
|
163
|
+
ensureAuthUsageSlots,
|
|
164
|
+
buildWebhookInboundAuthSlot,
|
|
165
|
+
buildSyncExecutionAuthSlot,
|
|
166
|
+
AUTH_USAGE_API,
|
|
167
|
+
AUTH_USAGE_WEBHOOK_INBOUND,
|
|
168
|
+
AUTH_USAGE_SYNC_EXECUTION
|
|
169
|
+
};
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Warn when datasource capabilities lack matching openapi.operations (autoRbac).
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview repair-capability-openapi-warnings
|
|
5
|
+
* @author AI Fabrix Team
|
|
6
|
+
* @version 1.0.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const path = require('path');
|
|
12
|
+
const fs = require('fs');
|
|
13
|
+
const { loadConfigFile } = require('../utils/config-format');
|
|
14
|
+
const { capabilityKeysFromManifest } = require('./repair-datasource-sync-operations');
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @param {string} opKey
|
|
18
|
+
* @returns {string}
|
|
19
|
+
*/
|
|
20
|
+
function normalizeRbacOperationKey(opKey) {
|
|
21
|
+
const s = typeof opKey === 'string' ? opKey.trim() : '';
|
|
22
|
+
if (!s) return '';
|
|
23
|
+
if (/^[a-z][a-zA-Z0-9]*$/.test(s)) return s.toLowerCase();
|
|
24
|
+
const withHyphens = s.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();
|
|
25
|
+
const cleaned = withHyphens.replace(/[^a-z0-9-]+/g, '-');
|
|
26
|
+
return cleaned.replace(/-+/g, '-').replace(/^-+|-+$/g, '');
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* @param {Object} parsed
|
|
31
|
+
* @returns {boolean}
|
|
32
|
+
*/
|
|
33
|
+
function hasAutoRbacOpenApi(parsed) {
|
|
34
|
+
const openapi = parsed?.openapi;
|
|
35
|
+
return (
|
|
36
|
+
openapi &&
|
|
37
|
+
typeof openapi === 'object' &&
|
|
38
|
+
openapi.autoRbac === true &&
|
|
39
|
+
openapi.operations &&
|
|
40
|
+
typeof openapi.operations === 'object' &&
|
|
41
|
+
!Array.isArray(openapi.operations)
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* @param {Object} parsed
|
|
47
|
+
* @returns {Set<string>}
|
|
48
|
+
*/
|
|
49
|
+
function normalizedOpenApiOperationKeys(parsed) {
|
|
50
|
+
const ops = parsed?.openapi?.operations;
|
|
51
|
+
const out = new Set();
|
|
52
|
+
if (!ops || typeof ops !== 'object') {
|
|
53
|
+
return out;
|
|
54
|
+
}
|
|
55
|
+
for (const key of Object.keys(ops)) {
|
|
56
|
+
const norm = normalizeRbacOperationKey(key) || key;
|
|
57
|
+
if (norm) out.add(norm);
|
|
58
|
+
}
|
|
59
|
+
return out;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* @param {Object} parsed
|
|
64
|
+
* @returns {string[]}
|
|
65
|
+
*/
|
|
66
|
+
function findCapabilityKeysMissingFromOpenApi(parsed) {
|
|
67
|
+
if (!hasAutoRbacOpenApi(parsed)) {
|
|
68
|
+
return [];
|
|
69
|
+
}
|
|
70
|
+
const capKeys = capabilityKeysFromManifest(parsed?.capabilities);
|
|
71
|
+
if (capKeys.length === 0) {
|
|
72
|
+
return [];
|
|
73
|
+
}
|
|
74
|
+
const openApiKeys = normalizedOpenApiOperationKeys(parsed);
|
|
75
|
+
return capKeys.filter((key) => !openApiKeys.has(normalizeRbacOperationKey(key) || key));
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* @param {string} fileName
|
|
80
|
+
* @param {Object} parsed
|
|
81
|
+
* @param {string[]} missingKeys
|
|
82
|
+
* @returns {string}
|
|
83
|
+
*/
|
|
84
|
+
function formatCapabilityOpenApiDriftWarning(fileName, parsed, missingKeys) {
|
|
85
|
+
const dsKey = typeof parsed?.key === 'string' && parsed.key.trim() ? parsed.key.trim() : fileName;
|
|
86
|
+
return (
|
|
87
|
+
`${dsKey}: capabilities declare ${missingKeys.join(', ')} but openapi.operations is missing them — ` +
|
|
88
|
+
'RBAC repair may omit matching permissions; operations sync runs automatically with --rbac'
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* @param {string} appPath
|
|
94
|
+
* @param {string[]} datasourceFiles
|
|
95
|
+
* @param {string[]} warnings
|
|
96
|
+
* @returns {number}
|
|
97
|
+
*/
|
|
98
|
+
function collectCapabilityOpenApiDriftWarnings(appPath, datasourceFiles, warnings) {
|
|
99
|
+
if (!Array.isArray(warnings) || !Array.isArray(datasourceFiles)) {
|
|
100
|
+
return 0;
|
|
101
|
+
}
|
|
102
|
+
let count = 0;
|
|
103
|
+
for (const fileName of datasourceFiles) {
|
|
104
|
+
const filePath = path.join(appPath, fileName);
|
|
105
|
+
if (!fs.existsSync(filePath)) continue;
|
|
106
|
+
let parsed;
|
|
107
|
+
try {
|
|
108
|
+
parsed = loadConfigFile(filePath);
|
|
109
|
+
} catch {
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
const missingKeys = findCapabilityKeysMissingFromOpenApi(parsed);
|
|
113
|
+
if (missingKeys.length === 0) continue;
|
|
114
|
+
warnings.push(formatCapabilityOpenApiDriftWarning(fileName, parsed, missingKeys));
|
|
115
|
+
count += 1;
|
|
116
|
+
}
|
|
117
|
+
return count;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
module.exports = {
|
|
121
|
+
normalizeRbacOperationKey,
|
|
122
|
+
hasAutoRbacOpenApi,
|
|
123
|
+
findCapabilityKeysMissingFromOpenApi,
|
|
124
|
+
collectCapabilityOpenApiDriftWarnings,
|
|
125
|
+
formatCapabilityOpenApiDriftWarning
|
|
126
|
+
};
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Datasource repair orchestration (service contract, base/openapi/optional passes).
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview Repair datasource file apply orchestration
|
|
5
|
+
* @author AI Fabrix Team
|
|
6
|
+
* @version 1.0.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const { repairOpenapiSection } = require('./repair-datasource-openapi');
|
|
12
|
+
const { repairSyncOperationsFromCapabilities } = require('./repair-datasource-sync-operations');
|
|
13
|
+
const { normalizeAutoRbacOperationKeys } = require('./repair-datasource-auto-rbac');
|
|
14
|
+
const { repairTestPayload } = require('./repair-datasource-test-payload');
|
|
15
|
+
const { repairComV2Manifest } = require('./repair-datasource-com-v2');
|
|
16
|
+
const {
|
|
17
|
+
isDeprecatedNoneLlmManifest,
|
|
18
|
+
repairNoneLlmToServiceContract
|
|
19
|
+
} = require('./repair-datasource-service-contract');
|
|
20
|
+
const {
|
|
21
|
+
isDeprecatedNoneOpenapiHttpManifest,
|
|
22
|
+
repairNoneOpenapiHttpToServiceContract,
|
|
23
|
+
normalizeCipOpenapiRefs
|
|
24
|
+
} = require('./repair-datasource-http-service-contract');
|
|
25
|
+
const {
|
|
26
|
+
repairWebhookSection,
|
|
27
|
+
repairSyncBridgeSection,
|
|
28
|
+
collectWebhookSyncBridgeSystemWarnings
|
|
29
|
+
} = require('./repair-datasource-webhooks-sync-bridge');
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* @param {Object} parsed
|
|
33
|
+
* @param {Object} options
|
|
34
|
+
* @returns {boolean}
|
|
35
|
+
*/
|
|
36
|
+
function shouldApplyServiceContractRepair(parsed, options) {
|
|
37
|
+
return (
|
|
38
|
+
isDeprecatedNoneLlmManifest(parsed) ||
|
|
39
|
+
isDeprecatedNoneOpenapiHttpManifest(parsed) ||
|
|
40
|
+
(options.serviceContract && parsed?.resourceType === 'llm')
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* @param {Object} parsed
|
|
46
|
+
* @param {Object} options
|
|
47
|
+
* @param {boolean} none
|
|
48
|
+
* @param {string[]} changes
|
|
49
|
+
* @param {Object} helpers
|
|
50
|
+
* @returns {boolean}
|
|
51
|
+
*/
|
|
52
|
+
function applyOptionalDatasourceRepairs(parsed, options, none, changes, helpers) {
|
|
53
|
+
let updated = false;
|
|
54
|
+
if (options.operations) {
|
|
55
|
+
updated = repairSyncOperationsFromCapabilities(parsed, changes) || updated;
|
|
56
|
+
}
|
|
57
|
+
if (options.expose) {
|
|
58
|
+
updated = helpers.repairExposeFromAttributes(parsed, changes) || updated;
|
|
59
|
+
}
|
|
60
|
+
if (!none && options.sync) {
|
|
61
|
+
updated = helpers.repairSyncSection(parsed, changes) || updated;
|
|
62
|
+
}
|
|
63
|
+
if (options.test) {
|
|
64
|
+
helpers.sanitizeTestPayloadTopLevel(parsed, changes);
|
|
65
|
+
updated = repairTestPayload(parsed, changes) || updated;
|
|
66
|
+
updated = helpers.sanitizeTestPayloadTopLevel(parsed, changes) || updated;
|
|
67
|
+
}
|
|
68
|
+
return updated;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* @param {Object} parsed
|
|
73
|
+
* @param {boolean} none
|
|
74
|
+
* @param {string[]} changes
|
|
75
|
+
* @param {Object} [options]
|
|
76
|
+
* @param {Object} helpers
|
|
77
|
+
* @returns {boolean}
|
|
78
|
+
*/
|
|
79
|
+
function applyBaseDatasourceRepairs(parsed, none, changes, options, helpers) {
|
|
80
|
+
let updated = repairComV2Manifest(parsed, changes);
|
|
81
|
+
if (none) return updated;
|
|
82
|
+
updated = helpers.repairDimensionBindingShape(parsed, changes) || updated;
|
|
83
|
+
updated = helpers.repairRootDimensionsFromAttributes(parsed, changes) || updated;
|
|
84
|
+
updated = helpers.repairMetadataSchemaFromAttributes(parsed, changes) || updated;
|
|
85
|
+
const warnings = Array.isArray(options.warnings) ? options.warnings : [];
|
|
86
|
+
updated = repairWebhookSection(parsed, changes, warnings) || updated;
|
|
87
|
+
updated = repairSyncBridgeSection(parsed, changes, warnings) || updated;
|
|
88
|
+
collectWebhookSyncBridgeSystemWarnings(parsed, options.systemParsed, warnings);
|
|
89
|
+
return updated;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* @param {Object} parsed
|
|
94
|
+
* @param {string[]} changes
|
|
95
|
+
* @returns {boolean}
|
|
96
|
+
*/
|
|
97
|
+
function applyOpenapiDatasourceRepairs(parsed, changes) {
|
|
98
|
+
let updated = false;
|
|
99
|
+
updated = repairOpenapiSection(parsed, changes) || updated;
|
|
100
|
+
updated = normalizeAutoRbacOperationKeys(parsed, changes) || updated;
|
|
101
|
+
return updated;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Runs all requested datasource repairs.
|
|
106
|
+
*
|
|
107
|
+
* @param {Object} parsed - Parsed datasource object (mutated)
|
|
108
|
+
* @param {Object} options - Repair flags
|
|
109
|
+
* @param {string[]} changes - Change log
|
|
110
|
+
* @param {Object} helpers - Functions from repair-datasource.js
|
|
111
|
+
* @returns {{ updated: boolean, changes: string[] }}
|
|
112
|
+
*/
|
|
113
|
+
function runRepairDatasourceFile(parsed, options, changes, helpers) {
|
|
114
|
+
const out = Array.isArray(changes) ? changes : [];
|
|
115
|
+
let updated = helpers.stripDeprecatedServiceCategory(parsed, out);
|
|
116
|
+
|
|
117
|
+
if (shouldApplyServiceContractRepair(parsed, options)) {
|
|
118
|
+
updated = repairNoneLlmToServiceContract(parsed, out) || updated;
|
|
119
|
+
updated = repairNoneOpenapiHttpToServiceContract(parsed, out) || updated;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
updated = normalizeCipOpenapiRefs(parsed, out) || updated;
|
|
123
|
+
|
|
124
|
+
const none = helpers.isNoneEntityType(parsed?.entityType);
|
|
125
|
+
|
|
126
|
+
updated = applyBaseDatasourceRepairs(parsed, none, out, options, helpers) || updated;
|
|
127
|
+
updated = applyOpenapiDatasourceRepairs(parsed, out) || updated;
|
|
128
|
+
updated = applyOptionalDatasourceRepairs(parsed, options, none, out, helpers) || updated;
|
|
129
|
+
|
|
130
|
+
return { updated, changes: out };
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
module.exports = {
|
|
134
|
+
runRepairDatasourceFile
|
|
135
|
+
};
|
|
@@ -120,12 +120,71 @@ function renameScenarioOperations(parsed, renameMap) {
|
|
|
120
120
|
return updated;
|
|
121
121
|
}
|
|
122
122
|
|
|
123
|
+
/**
|
|
124
|
+
* @param {unknown} cap
|
|
125
|
+
* @param {string[]} caps
|
|
126
|
+
* @param {Object} renameMap
|
|
127
|
+
* @returns {boolean}
|
|
128
|
+
*/
|
|
129
|
+
function renameStringCapabilityKey(caps, cap, renameMap) {
|
|
130
|
+
if (typeof cap !== 'string') {
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
const newKey = renameMap[cap];
|
|
134
|
+
if (!newKey || newKey === cap) {
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
const idx = caps.indexOf(cap);
|
|
138
|
+
if (idx >= 0) {
|
|
139
|
+
caps[idx] = newKey;
|
|
140
|
+
}
|
|
141
|
+
return true;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* @param {Object} cap
|
|
146
|
+
* @param {Object} renameMap
|
|
147
|
+
* @returns {boolean}
|
|
148
|
+
*/
|
|
149
|
+
function renameObjectCapabilityKey(cap, renameMap) {
|
|
150
|
+
if (!cap || typeof cap !== 'object') {
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
const k = safeString(cap.key);
|
|
154
|
+
if (!k) {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
const newKey = renameMap[k];
|
|
158
|
+
if (!newKey || newKey === k) {
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
cap.key = newKey;
|
|
162
|
+
return true;
|
|
163
|
+
}
|
|
164
|
+
|
|
123
165
|
/**
|
|
124
166
|
* When OpenAPI autoRbac is enabled, ensure operation keys are schema-valid and consistent across:
|
|
125
167
|
* - openapi.operations
|
|
126
168
|
* - execution.cip.operations
|
|
127
169
|
* - testPayload.scenarios[].operation
|
|
128
170
|
*/
|
|
171
|
+
function renameCapabilitiesKeys(parsed, renameMap, changes) {
|
|
172
|
+
const caps = parsed?.capabilities;
|
|
173
|
+
if (!Array.isArray(caps) || !renameMap || typeof renameMap !== 'object') {
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
let updated = false;
|
|
177
|
+
for (const cap of caps) {
|
|
178
|
+
if (renameStringCapabilityKey(caps, cap, renameMap) || renameObjectCapabilityKey(cap, renameMap)) {
|
|
179
|
+
updated = true;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
if (updated && Array.isArray(changes)) {
|
|
183
|
+
changes.push('Aligned capabilities[].key with normalized autoRbac operation keys');
|
|
184
|
+
}
|
|
185
|
+
return updated;
|
|
186
|
+
}
|
|
187
|
+
|
|
129
188
|
function normalizeAutoRbacOperationKeys(parsed, changes) {
|
|
130
189
|
const openapi = parsed?.openapi;
|
|
131
190
|
if (!openapi || typeof openapi !== 'object') return false;
|
|
@@ -148,6 +207,7 @@ function normalizeAutoRbacOperationKeys(parsed, changes) {
|
|
|
148
207
|
updated = renameKeysInObject(wsAllowed, renameMap) || updated;
|
|
149
208
|
// If both alias + canonical exist, merge and drop alias (schema requires canonical camelCase keys).
|
|
150
209
|
updated = mergeAndDeleteAliasKeys(wsAllowed, renameMap) || updated;
|
|
210
|
+
updated = renameCapabilitiesKeys(parsed, renameMap, changes) || updated;
|
|
151
211
|
|
|
152
212
|
if (updated && Array.isArray(changes)) {
|
|
153
213
|
const pairs = keysToRename.map((k) => `${k}→${renameMap[k]}`).join(', ');
|
|
@@ -161,6 +221,7 @@ function normalizeAutoRbacOperationKeys(parsed, changes) {
|
|
|
161
221
|
|
|
162
222
|
module.exports = {
|
|
163
223
|
normalizeAutoRbacOperationKeys,
|
|
164
|
-
toCamelCaseKey
|
|
224
|
+
toCamelCaseKey,
|
|
225
|
+
toKebabAliasKey
|
|
165
226
|
};
|
|
166
227
|
|