@aifabrix/builder 2.44.0 → 2.44.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/.cursor/rules/cli-layout.mdc +75 -0
- package/.cursor/rules/project-rules.mdc +8 -0
- package/.npmrc.token +1 -0
- package/.nyc_output/55e9d034-ddab-4579-a706-e02a91d75c91.json +1 -0
- package/.nyc_output/processinfo/55e9d034-ddab-4579-a706-e02a91d75c91.json +1 -0
- package/.nyc_output/processinfo/index.json +1 -0
- package/jest.projects.js +15 -2
- package/lib/api/certificates.api.js +62 -0
- package/lib/api/index.js +11 -2
- package/lib/api/types/certificates.types.js +48 -0
- package/lib/api/validation-run.api.js +16 -4
- package/lib/api/validation-runner.js +13 -3
- package/lib/app/certification-show-enrich.js +129 -0
- package/lib/app/certification-verify-rows.js +60 -0
- package/lib/app/show-display.js +43 -0
- package/lib/app/show.js +92 -8
- package/lib/certification/cli-cert-sync-skip.js +21 -0
- package/lib/certification/merge-certification-from-artifact.js +185 -0
- package/lib/certification/post-unified-cert-sync.js +33 -0
- package/lib/certification/sync-after-external-command.js +52 -0
- package/lib/certification/sync-system-certification.js +197 -0
- package/lib/cli/setup-app.js +4 -0
- package/lib/cli/setup-app.test-commands.js +24 -8
- package/lib/cli/setup-external-system.js +22 -1
- package/lib/cli/setup-secrets.js +34 -13
- package/lib/cli/setup-utility.js +18 -2
- package/lib/commands/app.js +10 -1
- package/lib/commands/datasource-unified-test-cli.js +50 -117
- package/lib/commands/datasource-unified-test-cli.options.js +44 -2
- package/lib/commands/datasource-unified-test-e2e-cli-helpers.js +106 -0
- package/lib/commands/datasource-validation-cli.js +15 -1
- package/lib/commands/datasource.js +25 -2
- package/lib/commands/upload.js +17 -6
- package/lib/datasource/log-viewer.js +105 -14
- package/lib/datasource/test-e2e.js +35 -17
- package/lib/datasource/unified-validation-run-body.js +3 -0
- package/lib/datasource/unified-validation-run.js +2 -1
- package/lib/external-system/deploy.js +53 -18
- package/lib/infrastructure/compose.js +12 -3
- package/lib/infrastructure/helpers-docker-check.js +67 -0
- package/lib/infrastructure/helpers.js +47 -58
- package/lib/infrastructure/index.js +3 -1
- package/lib/infrastructure/services.js +4 -56
- package/lib/schema/external-system.schema.json +25 -3
- package/lib/schema/type/document-storage.json +15 -2
- package/lib/utils/api.js +28 -3
- package/lib/utils/configuration-env-resolver.js +11 -8
- package/lib/utils/credential-secrets-env.js +5 -5
- package/lib/utils/datasource-test-run-certificate-tty.js +82 -0
- package/lib/utils/datasource-test-run-display.js +19 -2
- package/lib/utils/datasource-test-run-exit.js +25 -0
- package/lib/utils/external-system-display.js +8 -0
- package/lib/utils/external-system-system-test-tty-overview.js +120 -0
- package/lib/utils/external-system-system-test-tty.js +417 -0
- package/lib/utils/paths.js +14 -0
- package/lib/utils/validation-run-poll.js +28 -5
- package/lib/utils/validation-run-post-retry.js +20 -8
- package/lib/utils/validation-run-request.js +18 -0
- package/lib/validation/validate-external-cert-sync.js +23 -0
- package/lib/validation/validate.js +4 -1
- package/package.json +4 -3
- package/scripts/install-local.js +4 -1
- package/scripts/pnpm-global-remove.js +48 -0
- package/templates/applications/dataplane/env.template +4 -0
- package/templates/infra/compose.yaml.hbs +15 -14
- package/templates/infra/servers.json.hbs +3 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"parent":null,"pid":1159804,"argv":["/usr/bin/node","/workspace/aifabrix-builder/node_modules/nyc/bin/nyc.js","--reporter=text","--reporter=lcov","--reporter=html","jest","--config","jest.config.coverage.js","--runInBand"],"execArgv":[],"cwd":"/workspace/aifabrix-builder","time":1769846848380,"ppid":1159803,"coverageFilename":"/workspace/aifabrix-builder/.nyc_output/55e9d034-ddab-4579-a706-e02a91d75c91.json","externalId":"","uuid":"55e9d034-ddab-4579-a706-e02a91d75c91","files":["/workspace/aifabrix-builder/lib/api/applications.api.js","/workspace/aifabrix-builder/lib/api/auth.api.js","/workspace/aifabrix-builder/lib/api/datasources-core.api.js","/workspace/aifabrix-builder/lib/api/datasources-extended.api.js","/workspace/aifabrix-builder/lib/api/datasources.api.js","/workspace/aifabrix-builder/lib/api/deployments.api.js","/workspace/aifabrix-builder/lib/api/environments.api.js","/workspace/aifabrix-builder/lib/api/external-systems.api.js","/workspace/aifabrix-builder/lib/api/index.js","/workspace/aifabrix-builder/lib/api/pipeline.api.js","/workspace/aifabrix-builder/lib/api/types/applications.types.js","/workspace/aifabrix-builder/lib/api/types/auth.types.js","/workspace/aifabrix-builder/lib/api/types/datasources.types.js","/workspace/aifabrix-builder/lib/api/types/deployments.types.js","/workspace/aifabrix-builder/lib/api/types/environments.types.js","/workspace/aifabrix-builder/lib/api/types/external-systems.types.js","/workspace/aifabrix-builder/lib/api/types/pipeline.types.js","/workspace/aifabrix-builder/lib/api/types/wizard.types.js","/workspace/aifabrix-builder/lib/api/wizard.api.js","/workspace/aifabrix-builder/lib/app/config.js","/workspace/aifabrix-builder/lib/app/deploy-config.js","/workspace/aifabrix-builder/lib/app/deploy.js","/workspace/aifabrix-builder/lib/app/display.js","/workspace/aifabrix-builder/lib/app/dockerfile.js","/workspace/aifabrix-builder/lib/app/down.js","/workspace/aifabrix-builder/lib/app/helpers.js","/workspace/aifabrix-builder/lib/app/index.js","/workspace/aifabrix-builder/lib/app/list.js","/workspace/aifabrix-builder/lib/app/prompts.js","/workspace/aifabrix-builder/lib/app/push.js","/workspace/aifabrix-builder/lib/app/readme.js","/workspace/aifabrix-builder/lib/app/register.js","/workspace/aifabrix-builder/lib/app/rotate-secret.js","/workspace/aifabrix-builder/lib/app/run-helpers.js","/workspace/aifabrix-builder/lib/app/run.js","/workspace/aifabrix-builder/lib/app/show-display.js","/workspace/aifabrix-builder/lib/app/show.js","/workspace/aifabrix-builder/lib/build/index.js","/workspace/aifabrix-builder/lib/cli.js","/workspace/aifabrix-builder/lib/commands/app.js","/workspace/aifabrix-builder/lib/commands/auth-config.js","/workspace/aifabrix-builder/lib/commands/auth-status.js","/workspace/aifabrix-builder/lib/commands/datasource.js","/workspace/aifabrix-builder/lib/commands/login-credentials.js","/workspace/aifabrix-builder/lib/commands/login-device.js","/workspace/aifabrix-builder/lib/commands/login.js","/workspace/aifabrix-builder/lib/commands/logout.js","/workspace/aifabrix-builder/lib/commands/secrets-set.js","/workspace/aifabrix-builder/lib/commands/secure.js","/workspace/aifabrix-builder/lib/commands/up-common.js","/workspace/aifabrix-builder/lib/commands/up-dataplane.js","/workspace/aifabrix-builder/lib/commands/up-miso.js","/workspace/aifabrix-builder/lib/commands/wizard-config-normalizer.js","/workspace/aifabrix-builder/lib/commands/wizard-core-helpers.js","/workspace/aifabrix-builder/lib/commands/wizard-core.js","/workspace/aifabrix-builder/lib/commands/wizard-dataplane.js","/workspace/aifabrix-builder/lib/commands/wizard-headless.js","/workspace/aifabrix-builder/lib/commands/wizard-helpers.js","/workspace/aifabrix-builder/lib/commands/wizard.js","/workspace/aifabrix-builder/lib/core/audit-logger.js","/workspace/aifabrix-builder/lib/core/config.js","/workspace/aifabrix-builder/lib/core/diff.js","/workspace/aifabrix-builder/lib/core/env-reader.js","/workspace/aifabrix-builder/lib/core/key-generator.js","/workspace/aifabrix-builder/lib/core/secrets-docker-env.js","/workspace/aifabrix-builder/lib/core/secrets.js","/workspace/aifabrix-builder/lib/core/templates-env.js","/workspace/aifabrix-builder/lib/core/templates.js","/workspace/aifabrix-builder/lib/datasource/deploy.js","/workspace/aifabrix-builder/lib/datasource/diff.js","/workspace/aifabrix-builder/lib/datasource/list.js","/workspace/aifabrix-builder/lib/datasource/validate.js","/workspace/aifabrix-builder/lib/deployment/deployer.js","/workspace/aifabrix-builder/lib/deployment/environment.js","/workspace/aifabrix-builder/lib/deployment/push.js","/workspace/aifabrix-builder/lib/external-system/delete.js","/workspace/aifabrix-builder/lib/external-system/deploy-helpers.js","/workspace/aifabrix-builder/lib/external-system/deploy.js","/workspace/aifabrix-builder/lib/external-system/download-helpers.js","/workspace/aifabrix-builder/lib/external-system/download.js","/workspace/aifabrix-builder/lib/external-system/generator.js","/workspace/aifabrix-builder/lib/external-system/test-auth.js","/workspace/aifabrix-builder/lib/external-system/test-execution.js","/workspace/aifabrix-builder/lib/external-system/test-helpers.js","/workspace/aifabrix-builder/lib/external-system/test.js","/workspace/aifabrix-builder/lib/generator/builders.js","/workspace/aifabrix-builder/lib/generator/external-controller-manifest.js","/workspace/aifabrix-builder/lib/generator/external-schema-utils.js","/workspace/aifabrix-builder/lib/generator/external.js","/workspace/aifabrix-builder/lib/generator/github.js","/workspace/aifabrix-builder/lib/generator/helpers.js","/workspace/aifabrix-builder/lib/generator/index.js","/workspace/aifabrix-builder/lib/generator/split.js","/workspace/aifabrix-builder/lib/generator/wizard-prompts.js","/workspace/aifabrix-builder/lib/generator/wizard.js","/workspace/aifabrix-builder/lib/infrastructure/compose.js","/workspace/aifabrix-builder/lib/infrastructure/helpers.js","/workspace/aifabrix-builder/lib/infrastructure/index.js","/workspace/aifabrix-builder/lib/infrastructure/services.js","/workspace/aifabrix-builder/lib/utils/api-error-handler.js","/workspace/aifabrix-builder/lib/utils/api.js","/workspace/aifabrix-builder/lib/utils/app-existence.js","/workspace/aifabrix-builder/lib/utils/app-register-api.js","/workspace/aifabrix-builder/lib/utils/app-register-auth.js","/workspace/aifabrix-builder/lib/utils/app-register-config.js","/workspace/aifabrix-builder/lib/utils/app-register-display.js","/workspace/aifabrix-builder/lib/utils/app-register-validator.js","/workspace/aifabrix-builder/lib/utils/app-run-containers.js","/workspace/aifabrix-builder/lib/utils/auth-config-validator.js","/workspace/aifabrix-builder/lib/utils/auth-headers.js","/workspace/aifabrix-builder/lib/utils/build-copy.js","/workspace/aifabrix-builder/lib/utils/build-helpers.js","/workspace/aifabrix-builder/lib/utils/cli-utils.js","/workspace/aifabrix-builder/lib/utils/command-header.js","/workspace/aifabrix-builder/lib/utils/compose-generator.js","/workspace/aifabrix-builder/lib/utils/config-paths.js","/workspace/aifabrix-builder/lib/utils/config-tokens.js","/workspace/aifabrix-builder/lib/utils/controller-url.js","/workspace/aifabrix-builder/lib/utils/dataplane-health.js","/workspace/aifabrix-builder/lib/utils/dataplane-resolver.js","/workspace/aifabrix-builder/lib/utils/deployment-errors.js","/workspace/aifabrix-builder/lib/utils/deployment-validation-helpers.js","/workspace/aifabrix-builder/lib/utils/deployment-validation.js","/workspace/aifabrix-builder/lib/utils/dev-config.js","/workspace/aifabrix-builder/lib/utils/device-code.js","/workspace/aifabrix-builder/lib/utils/docker-build.js","/workspace/aifabrix-builder/lib/utils/docker.js","/workspace/aifabrix-builder/lib/utils/dockerfile-utils.js","/workspace/aifabrix-builder/lib/utils/env-config-loader.js","/workspace/aifabrix-builder/lib/utils/env-copy.js","/workspace/aifabrix-builder/lib/utils/env-endpoints.js","/workspace/aifabrix-builder/lib/utils/env-map.js","/workspace/aifabrix-builder/lib/utils/env-ports.js","/workspace/aifabrix-builder/lib/utils/env-template.js","/workspace/aifabrix-builder/lib/utils/environment-checker.js","/workspace/aifabrix-builder/lib/utils/error-formatter.js","/workspace/aifabrix-builder/lib/utils/error-formatters/error-parser.js","/workspace/aifabrix-builder/lib/utils/error-formatters/http-status-errors.js","/workspace/aifabrix-builder/lib/utils/error-formatters/network-errors.js","/workspace/aifabrix-builder/lib/utils/error-formatters/permission-errors.js","/workspace/aifabrix-builder/lib/utils/error-formatters/validation-errors.js","/workspace/aifabrix-builder/lib/utils/external-readme.js","/workspace/aifabrix-builder/lib/utils/external-system-display.js","/workspace/aifabrix-builder/lib/utils/external-system-env-helpers.js","/workspace/aifabrix-builder/lib/utils/external-system-test-helpers.js","/workspace/aifabrix-builder/lib/utils/external-system-validators.js","/workspace/aifabrix-builder/lib/utils/file-upload.js","/workspace/aifabrix-builder/lib/utils/health-check.js","/workspace/aifabrix-builder/lib/utils/help-builder.js","/workspace/aifabrix-builder/lib/utils/image-name.js","/workspace/aifabrix-builder/lib/utils/infra-containers.js","/workspace/aifabrix-builder/lib/utils/infra-status.js","/workspace/aifabrix-builder/lib/utils/local-secrets.js","/workspace/aifabrix-builder/lib/utils/logger.js","/workspace/aifabrix-builder/lib/utils/parse-image-ref.js","/workspace/aifabrix-builder/lib/utils/paths.js","/workspace/aifabrix-builder/lib/utils/port-resolver.js","/workspace/aifabrix-builder/lib/utils/schema-loader.js","/workspace/aifabrix-builder/lib/utils/schema-resolver.js","/workspace/aifabrix-builder/lib/utils/secrets-encryption.js","/workspace/aifabrix-builder/lib/utils/secrets-generator.js","/workspace/aifabrix-builder/lib/utils/secrets-helpers.js","/workspace/aifabrix-builder/lib/utils/secrets-path.js","/workspace/aifabrix-builder/lib/utils/secrets-url.js","/workspace/aifabrix-builder/lib/utils/secrets-utils.js","/workspace/aifabrix-builder/lib/utils/template-helpers.js","/workspace/aifabrix-builder/lib/utils/token-encryption.js","/workspace/aifabrix-builder/lib/utils/token-manager-refresh.js","/workspace/aifabrix-builder/lib/utils/token-manager.js","/workspace/aifabrix-builder/lib/utils/variable-transformer.js","/workspace/aifabrix-builder/lib/utils/yaml-preserve.js","/workspace/aifabrix-builder/lib/validation/external-manifest-validator.js","/workspace/aifabrix-builder/lib/validation/template.js","/workspace/aifabrix-builder/lib/validation/validate-display.js","/workspace/aifabrix-builder/lib/validation/validate.js","/workspace/aifabrix-builder/lib/validation/validator.js","/workspace/aifabrix-builder/lib/validation/wizard-config-validator.js"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"processes":{"55e9d034-ddab-4579-a706-e02a91d75c91":{"parent":null,"children":[]}},"files":{"/workspace/aifabrix-builder/lib/api/applications.api.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/api/auth.api.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/api/datasources-core.api.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/api/datasources-extended.api.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/api/datasources.api.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/api/deployments.api.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/api/environments.api.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/api/external-systems.api.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/api/index.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/api/pipeline.api.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/api/types/applications.types.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/api/types/auth.types.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/api/types/datasources.types.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/api/types/deployments.types.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/api/types/environments.types.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/api/types/external-systems.types.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/api/types/pipeline.types.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/api/types/wizard.types.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/api/wizard.api.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/app/config.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/app/deploy-config.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/app/deploy.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/app/display.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/app/dockerfile.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/app/down.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/app/helpers.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/app/index.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/app/list.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/app/prompts.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/app/push.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/app/readme.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/app/register.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/app/rotate-secret.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/app/run-helpers.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/app/run.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/app/show-display.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/app/show.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/build/index.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/cli.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/commands/app.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/commands/auth-config.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/commands/auth-status.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/commands/datasource.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/commands/login-credentials.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/commands/login-device.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/commands/login.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/commands/logout.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/commands/secrets-set.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/commands/secure.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/commands/up-common.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/commands/up-dataplane.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/commands/up-miso.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/commands/wizard-config-normalizer.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/commands/wizard-core-helpers.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/commands/wizard-core.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/commands/wizard-dataplane.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/commands/wizard-headless.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/commands/wizard-helpers.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/commands/wizard.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/core/audit-logger.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/core/config.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/core/diff.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/core/env-reader.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/core/key-generator.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/core/secrets-docker-env.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/core/secrets.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/core/templates-env.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/core/templates.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/datasource/deploy.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/datasource/diff.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/datasource/list.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/datasource/validate.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/deployment/deployer.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/deployment/environment.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/deployment/push.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/external-system/delete.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/external-system/deploy-helpers.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/external-system/deploy.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/external-system/download-helpers.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/external-system/download.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/external-system/generator.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/external-system/test-auth.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/external-system/test-execution.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/external-system/test-helpers.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/external-system/test.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/generator/builders.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/generator/external-controller-manifest.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/generator/external-schema-utils.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/generator/external.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/generator/github.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/generator/helpers.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/generator/index.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/generator/split.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/generator/wizard-prompts.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/generator/wizard.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/infrastructure/compose.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/infrastructure/helpers.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/infrastructure/index.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/infrastructure/services.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/api-error-handler.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/api.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/app-existence.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/app-register-api.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/app-register-auth.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/app-register-config.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/app-register-display.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/app-register-validator.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/app-run-containers.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/auth-config-validator.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/auth-headers.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/build-copy.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/build-helpers.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/cli-utils.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/command-header.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/compose-generator.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/config-paths.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/config-tokens.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/controller-url.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/dataplane-health.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/dataplane-resolver.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/deployment-errors.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/deployment-validation-helpers.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/deployment-validation.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/dev-config.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/device-code.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/docker-build.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/docker.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/dockerfile-utils.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/env-config-loader.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/env-copy.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/env-endpoints.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/env-map.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/env-ports.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/env-template.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/environment-checker.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/error-formatter.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/error-formatters/error-parser.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/error-formatters/http-status-errors.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/error-formatters/network-errors.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/error-formatters/permission-errors.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/error-formatters/validation-errors.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/external-readme.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/external-system-display.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/external-system-env-helpers.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/external-system-test-helpers.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/external-system-validators.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/file-upload.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/health-check.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/help-builder.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/image-name.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/infra-containers.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/infra-status.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/local-secrets.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/logger.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/parse-image-ref.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/paths.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/port-resolver.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/schema-loader.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/schema-resolver.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/secrets-encryption.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/secrets-generator.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/secrets-helpers.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/secrets-path.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/secrets-url.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/secrets-utils.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/template-helpers.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/token-encryption.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/token-manager-refresh.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/token-manager.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/variable-transformer.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/utils/yaml-preserve.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/validation/external-manifest-validator.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/validation/template.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/validation/validate-display.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/validation/validate.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/validation/validator.js":["55e9d034-ddab-4579-a706-e02a91d75c91"],"/workspace/aifabrix-builder/lib/validation/wizard-config-validator.js":["55e9d034-ddab-4579-a706-e02a91d75c91"]},"externalIds":{}}
|
package/jest.projects.js
CHANGED
|
@@ -69,6 +69,9 @@ const defaultProject = {
|
|
|
69
69
|
'lib/utils/datasource-validation-watch.test.js',
|
|
70
70
|
'dev-hosts-helper\\.test\\.js',
|
|
71
71
|
'declarative-url-matrix-d-reload\\.test\\.js',
|
|
72
|
+
'/tests/lib/datasource/log-viewer.test.js',
|
|
73
|
+
'\\\\tests\\\\lib\\\\datasource\\\\log-viewer.test.js',
|
|
74
|
+
'lib/datasource/log-viewer.test.js',
|
|
72
75
|
'/tests/lib/commands/parameters-validate.test.js',
|
|
73
76
|
'\\\\tests\\\\lib\\\\commands\\\\parameters-validate.test.js',
|
|
74
77
|
'lib/commands/parameters-validate.test.js',
|
|
@@ -175,6 +178,10 @@ const defaultProject = {
|
|
|
175
178
|
'\\\\tests\\\\lib\\\\generator\\\\generator-error-paths.test.js',
|
|
176
179
|
'lib/generator/generator-error-paths.test.js',
|
|
177
180
|
'generator-error-paths\\.test\\.js',
|
|
181
|
+
'/tests/lib/generator/generator-validation.test.js',
|
|
182
|
+
'\\\\tests\\\\lib\\\\generator\\\\generator-validation.test.js',
|
|
183
|
+
'lib/generator/generator-validation.test.js',
|
|
184
|
+
'generator-validation\\.test\\.js',
|
|
178
185
|
'/tests/lib/core/secrets-databaselog.test.js',
|
|
179
186
|
'\\\\tests\\\\lib\\\\core\\\\secrets-databaselog.test.js',
|
|
180
187
|
'lib/core/secrets-databaselog.test.js',
|
|
@@ -185,7 +192,10 @@ const defaultProject = {
|
|
|
185
192
|
'schema-241-alignment\\.test\\.js',
|
|
186
193
|
'/tests/lib/app/app.test.js',
|
|
187
194
|
'\\\\tests\\\\lib\\\\app\\\\app.test.js',
|
|
188
|
-
'lib/app/app.test.js'
|
|
195
|
+
'lib/app/app.test.js',
|
|
196
|
+
'/tests/lib/core/admin-secrets.test.js',
|
|
197
|
+
'\\\\tests\\\\lib\\\\core\\\\admin-secrets.test.js',
|
|
198
|
+
'lib/core/admin-secrets.test.js'
|
|
189
199
|
];
|
|
190
200
|
if (process.env.INCLUDE_LOCAL_TESTS !== 'true') {
|
|
191
201
|
patterns.push('/tests/local/');
|
|
@@ -212,6 +222,7 @@ const isolatedProjects = [
|
|
|
212
222
|
makeIsolatedProject('datasource-validation-watch', [
|
|
213
223
|
'**/tests/lib/utils/datasource-validation-watch.test.js'
|
|
214
224
|
]),
|
|
225
|
+
makeIsolatedProject('log-viewer', ['**/tests/lib/datasource/log-viewer.test.js']),
|
|
215
226
|
makeIsolatedProject('datasource-test-run-schema-sync', [
|
|
216
227
|
'**/tests/lib/utils/datasource-test-run-schema-sync.test.js'
|
|
217
228
|
]),
|
|
@@ -271,9 +282,11 @@ const isolatedProjects = [
|
|
|
271
282
|
'**/tests/lib/utils/ensure-dev-certs-for-remote-docker.test.js'
|
|
272
283
|
]),
|
|
273
284
|
makeIsolatedProject('generator-error-paths', ['**/tests/lib/generator/generator-error-paths.test.js']),
|
|
285
|
+
makeIsolatedProject('generator-validation', ['**/tests/lib/generator/generator-validation.test.js']),
|
|
274
286
|
makeIsolatedProject('secrets-databaselog', ['**/tests/lib/core/secrets-databaselog.test.js']),
|
|
275
287
|
makeIsolatedProject('schema-241-alignment', ['**/tests/lib/validation/schema-241-alignment.test.js']),
|
|
276
|
-
makeIsolatedProject('app-module', ['**/tests/lib/app/app.test.js'])
|
|
288
|
+
makeIsolatedProject('app-module', ['**/tests/lib/app/app.test.js']),
|
|
289
|
+
makeIsolatedProject('admin-secrets', ['**/tests/lib/core/admin-secrets.test.js'])
|
|
277
290
|
];
|
|
278
291
|
|
|
279
292
|
const allProjects = [defaultProject, ...isolatedProjects];
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Dataplane Trust API — integration certificates (active, list, verify).
|
|
3
|
+
* @author AI Fabrix Team
|
|
4
|
+
* @version 2.0.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const { ApiClient } = require('./index');
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Get active trusted integration certificate for a datasource.
|
|
11
|
+
* GET /api/v1/systems/{systemKey}/datasources/{datasourceKey}/certificates/active
|
|
12
|
+
* @requiresPermission {Dataplane} external-system:read
|
|
13
|
+
* @async
|
|
14
|
+
* @param {string} dataplaneUrl - Dataplane base URL
|
|
15
|
+
* @param {Object} authConfig - Auth (Bearer)
|
|
16
|
+
* @param {string} systemKey - External system key
|
|
17
|
+
* @param {string} datasourceKey - Datasource key
|
|
18
|
+
* @returns {Promise<Object>} API envelope `{ success, data?, status, ... }`
|
|
19
|
+
*/
|
|
20
|
+
async function getActiveIntegrationCertificate(dataplaneUrl, authConfig, systemKey, datasourceKey) {
|
|
21
|
+
const client = new ApiClient(dataplaneUrl, authConfig);
|
|
22
|
+
const path = `/api/v1/systems/${encodeURIComponent(systemKey)}/datasources/${encodeURIComponent(
|
|
23
|
+
datasourceKey
|
|
24
|
+
)}/certificates/active`;
|
|
25
|
+
return await client.get(path);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* List integration certificates (optional filters).
|
|
30
|
+
* GET /api/v1/certificates
|
|
31
|
+
* @requiresPermission {Dataplane} external-system:read
|
|
32
|
+
* @async
|
|
33
|
+
* @param {string} dataplaneUrl - Dataplane base URL
|
|
34
|
+
* @param {Object} authConfig - Auth
|
|
35
|
+
* @param {Object} [params] - Query: datasourceKey, systemIdOrKey, page, pageSize
|
|
36
|
+
* @returns {Promise<Object>}
|
|
37
|
+
*/
|
|
38
|
+
async function listIntegrationCertificates(dataplaneUrl, authConfig, params = {}) {
|
|
39
|
+
const client = new ApiClient(dataplaneUrl, authConfig);
|
|
40
|
+
return await client.get('/api/v1/certificates', { params });
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Verify a stored integration certificate (signature and optional hash).
|
|
45
|
+
* POST /api/v1/certificates/verify
|
|
46
|
+
* @requiresPermission {Dataplane} external-system:read
|
|
47
|
+
* @async
|
|
48
|
+
* @param {string} dataplaneUrl - Dataplane base URL
|
|
49
|
+
* @param {Object} authConfig - Auth
|
|
50
|
+
* @param {import('./types/certificates.types').CertificateVerifyRequest} body - Verify request
|
|
51
|
+
* @returns {Promise<Object>}
|
|
52
|
+
*/
|
|
53
|
+
async function verifyIntegrationCertificate(dataplaneUrl, authConfig, body) {
|
|
54
|
+
const client = new ApiClient(dataplaneUrl, authConfig);
|
|
55
|
+
return await client.post('/api/v1/certificates/verify', { body: body || {} });
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
module.exports = {
|
|
59
|
+
getActiveIntegrationCertificate,
|
|
60
|
+
listIntegrationCertificates,
|
|
61
|
+
verifyIntegrationCertificate
|
|
62
|
+
};
|
package/lib/api/index.js
CHANGED
|
@@ -95,12 +95,17 @@ class ApiClient {
|
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
97
|
|
|
98
|
+
const transport = { method: 'GET', headers };
|
|
99
|
+
if (options.timeoutMs !== undefined && options.timeoutMs !== null) {
|
|
100
|
+
transport.timeoutMs = options.timeoutMs;
|
|
101
|
+
}
|
|
102
|
+
|
|
98
103
|
if (this.authConfig.type === 'bearer' || this.authConfig.type === 'client-token') {
|
|
99
104
|
// Pass full authConfig to enable proper token refresh using controller URL
|
|
100
|
-
return await authenticatedApiCall(url,
|
|
105
|
+
return await authenticatedApiCall(url, transport, this.authConfig);
|
|
101
106
|
}
|
|
102
107
|
|
|
103
|
-
return await makeApiCall(url,
|
|
108
|
+
return await makeApiCall(url, transport);
|
|
104
109
|
}
|
|
105
110
|
|
|
106
111
|
/**
|
|
@@ -140,6 +145,10 @@ class ApiClient {
|
|
|
140
145
|
requestOptions.body = JSON.stringify(options.body);
|
|
141
146
|
}
|
|
142
147
|
|
|
148
|
+
if (options.timeoutMs !== undefined && options.timeoutMs !== null) {
|
|
149
|
+
requestOptions.timeoutMs = options.timeoutMs;
|
|
150
|
+
}
|
|
151
|
+
|
|
143
152
|
if (this.authConfig.type === 'bearer' || this.authConfig.type === 'client-token') {
|
|
144
153
|
// Pass full authConfig to enable proper token refresh using controller URL
|
|
145
154
|
return await authenticatedApiCall(url, requestOptions, this.authConfig);
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview JSDoc typedefs for dataplane Trust / integration certificate APIs (camelCase).
|
|
3
|
+
* @author AI Fabrix Team
|
|
4
|
+
* @version 2.0.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Integration certificate artifact (dataplane OpenAPI **CertificateArtifactResponse**).
|
|
9
|
+
*
|
|
10
|
+
* @typedef {Object} CertificateArtifactResponse
|
|
11
|
+
* @property {string|{id?: string}} [certificateId]
|
|
12
|
+
* @property {string} [systemKey]
|
|
13
|
+
* @property {string} [datasourceKey]
|
|
14
|
+
* @property {string} [version]
|
|
15
|
+
* @property {string|null} [certificateVersion]
|
|
16
|
+
* @property {string|null} [systemVersion]
|
|
17
|
+
* @property {string} [certificationLevel]
|
|
18
|
+
* @property {Object} [metrics]
|
|
19
|
+
* @property {string|null} [contractHash]
|
|
20
|
+
* @property {string|null} [integrationHash]
|
|
21
|
+
* @property {string} [issuedAt]
|
|
22
|
+
* @property {string} [issuedBy]
|
|
23
|
+
* @property {string} [licenseLevelIssuer]
|
|
24
|
+
* @property {string} [dataplaneVersion]
|
|
25
|
+
* @property {('RS256'|'HS256')} [algorithm] RS256 production; HS256 local dev HMAC signer only
|
|
26
|
+
* @property {string|null} [publicKey]
|
|
27
|
+
* @property {string|null} [publicKeyFingerprint]
|
|
28
|
+
* @property {Object} [metadata]
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* @typedef {Object} CertificateVerificationResponse
|
|
33
|
+
* @property {boolean} validSignature
|
|
34
|
+
* @property {boolean} validHash
|
|
35
|
+
* @property {boolean} overallValid
|
|
36
|
+
* @property {string[]} [reasons]
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* @typedef {Object} CertificateVerifyRequest
|
|
41
|
+
* @property {string|null} [certificateId]
|
|
42
|
+
* @property {Object|null} [certificate]
|
|
43
|
+
* @property {boolean} [verifyHash]
|
|
44
|
+
* @property {string|null} [systemIdOrKey]
|
|
45
|
+
* @property {string|null} [datasourceKey]
|
|
46
|
+
*/
|
|
47
|
+
|
|
48
|
+
module.exports = {};
|
|
@@ -45,13 +45,19 @@ function normalizeDataplaneAuth(authConfig) {
|
|
|
45
45
|
* @param {string} dataplaneUrl - Dataplane base URL
|
|
46
46
|
* @param {Object} authConfig - Authentication (token or apiKey)
|
|
47
47
|
* @param {import('./types/validation-run.types').ValidationRunRequestBody} body - Request JSON body
|
|
48
|
+
* @param {Object} [transportOpts]
|
|
49
|
+
* @param {number} [transportOpts.timeoutMs] - Per-request HTTP timeout (validation E2E POST can exceed 30s)
|
|
48
50
|
* @returns {Promise<Object>} ApiClient result: { success, data, status, ... }
|
|
49
51
|
*/
|
|
50
|
-
async function postValidationRun(dataplaneUrl, authConfig, body) {
|
|
52
|
+
async function postValidationRun(dataplaneUrl, authConfig, body, transportOpts = {}) {
|
|
51
53
|
const hdrs = buildClientCredentialHeaders(authConfig);
|
|
52
54
|
const clientAuth = hdrs ? {} : normalizeDataplaneAuth(authConfig);
|
|
53
55
|
const client = new ApiClient(dataplaneUrl, clientAuth);
|
|
54
|
-
|
|
56
|
+
const postOpts = { body, headers: hdrs || undefined };
|
|
57
|
+
if (Number.isFinite(transportOpts.timeoutMs) && transportOpts.timeoutMs > 0) {
|
|
58
|
+
postOpts.timeoutMs = transportOpts.timeoutMs;
|
|
59
|
+
}
|
|
60
|
+
return client.post(POST_PATH, postOpts);
|
|
55
61
|
}
|
|
56
62
|
|
|
57
63
|
/**
|
|
@@ -61,9 +67,11 @@ async function postValidationRun(dataplaneUrl, authConfig, body) {
|
|
|
61
67
|
* @param {string} dataplaneUrl - Dataplane base URL
|
|
62
68
|
* @param {Object} authConfig - Authentication
|
|
63
69
|
* @param {string} testRunId - Poll id from 202 / envelope
|
|
70
|
+
* @param {Object} [transportOpts]
|
|
71
|
+
* @param {number} [transportOpts.timeoutMs] - Per-request HTTP timeout (align with aggregate validation budget)
|
|
64
72
|
* @returns {Promise<Object>} ApiClient result
|
|
65
73
|
*/
|
|
66
|
-
async function getValidationRun(dataplaneUrl, authConfig, testRunId) {
|
|
74
|
+
async function getValidationRun(dataplaneUrl, authConfig, testRunId, transportOpts = {}) {
|
|
67
75
|
if (!testRunId || typeof testRunId !== 'string') {
|
|
68
76
|
throw new Error('testRunId is required for validation run poll');
|
|
69
77
|
}
|
|
@@ -71,7 +79,11 @@ async function getValidationRun(dataplaneUrl, authConfig, testRunId) {
|
|
|
71
79
|
const clientAuth = hdrs ? {} : normalizeDataplaneAuth(authConfig);
|
|
72
80
|
const client = new ApiClient(dataplaneUrl, clientAuth);
|
|
73
81
|
const path = `${POST_PATH}/${encodeURIComponent(testRunId)}`;
|
|
74
|
-
|
|
82
|
+
const getOpts = { headers: hdrs || undefined };
|
|
83
|
+
if (Number.isFinite(transportOpts.timeoutMs) && transportOpts.timeoutMs > 0) {
|
|
84
|
+
getOpts.timeoutMs = transportOpts.timeoutMs;
|
|
85
|
+
}
|
|
86
|
+
return client.get(path, getOpts);
|
|
75
87
|
}
|
|
76
88
|
|
|
77
89
|
/**
|
|
@@ -24,9 +24,16 @@ const { pollValidationRunUntilComplete } = require('../utils/validation-run-poll
|
|
|
24
24
|
*/
|
|
25
25
|
/* eslint-disable max-lines-per-function, max-statements, complexity -- POST + poll orchestration */
|
|
26
26
|
async function postValidationRunAndOptionalPoll(opts) {
|
|
27
|
-
const { dataplaneUrl, authConfig, body, timeoutMs, useAsync, noAsync } = opts;
|
|
27
|
+
const { dataplaneUrl, authConfig, body, timeoutMs, useAsync, noAsync, verbosePoll } = opts;
|
|
28
28
|
const started = Date.now();
|
|
29
|
-
const
|
|
29
|
+
const transportOpts =
|
|
30
|
+
Number.isFinite(timeoutMs) && timeoutMs > 0 ? { timeoutMs } : {};
|
|
31
|
+
const postRes = await postValidationRunWithTransportRetry(
|
|
32
|
+
dataplaneUrl,
|
|
33
|
+
authConfig,
|
|
34
|
+
body,
|
|
35
|
+
transportOpts
|
|
36
|
+
);
|
|
30
37
|
if (!postRes.success) {
|
|
31
38
|
return {
|
|
32
39
|
envelope: null,
|
|
@@ -51,7 +58,10 @@ async function postValidationRunAndOptionalPoll(opts) {
|
|
|
51
58
|
dataplaneUrl,
|
|
52
59
|
authConfig,
|
|
53
60
|
testRunId,
|
|
54
|
-
budgetMs: remaining
|
|
61
|
+
budgetMs: remaining,
|
|
62
|
+
verbosePoll: verbosePoll === true,
|
|
63
|
+
pollRequestTimeoutMs:
|
|
64
|
+
Number.isFinite(timeoutMs) && timeoutMs > 0 ? timeoutMs : undefined
|
|
55
65
|
});
|
|
56
66
|
if (!pollResult.lastApiResult || !pollResult.lastApiResult.success) {
|
|
57
67
|
return {
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Load local `certification` and optional dataplane verify for `aifabrix show` (external).
|
|
3
|
+
* @author AI Fabrix Team
|
|
4
|
+
* @version 2.0.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
'use strict';
|
|
8
|
+
|
|
9
|
+
const { resolvePrimarySystemFilePath } = require('../certification/sync-system-certification');
|
|
10
|
+
const { loadConfigFile } = require('../utils/config-format');
|
|
11
|
+
const { generateControllerManifest } = require('../generator/external-controller-manifest');
|
|
12
|
+
const { verifyRowForDatasource } = require('./certification-verify-rows');
|
|
13
|
+
|
|
14
|
+
const MAX_VERIFY_DATASOURCES = 12;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @param {string} pem
|
|
18
|
+
* @param {number} maxLen
|
|
19
|
+
* @returns {string}
|
|
20
|
+
*/
|
|
21
|
+
function truncatePublicKeyPreview(pem, maxLen = 52) {
|
|
22
|
+
if (!pem || typeof pem !== 'string') return '—';
|
|
23
|
+
const s = pem.trim();
|
|
24
|
+
if (s.length <= maxLen) return s;
|
|
25
|
+
return `${s.slice(0, maxLen)}… (${s.length} chars)`;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @param {Object|null|undefined} cert
|
|
30
|
+
* @returns {Object|null}
|
|
31
|
+
*/
|
|
32
|
+
function sanitizeCertificationForJson(cert) {
|
|
33
|
+
if (!cert || typeof cert !== 'object') return null;
|
|
34
|
+
const pk = cert.publicKey;
|
|
35
|
+
return {
|
|
36
|
+
enabled: cert.enabled,
|
|
37
|
+
algorithm: cert.algorithm,
|
|
38
|
+
issuer: cert.issuer,
|
|
39
|
+
version: cert.version,
|
|
40
|
+
publicKeyPreview: truncatePublicKeyPreview(pk, 96)
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* @param {string} appKey
|
|
46
|
+
* @returns {Object|null}
|
|
47
|
+
*/
|
|
48
|
+
function loadLocalCertificationFromSystemFile(appKey) {
|
|
49
|
+
const r = resolvePrimarySystemFilePath(appKey);
|
|
50
|
+
if (!r || !r.systemFilePath) return null;
|
|
51
|
+
try {
|
|
52
|
+
const sys = loadConfigFile(r.systemFilePath);
|
|
53
|
+
const c = sys && sys.certification;
|
|
54
|
+
if (!c || typeof c !== 'object') return null;
|
|
55
|
+
return c;
|
|
56
|
+
} catch {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* @param {Object} summary - show summary (mutated)
|
|
63
|
+
* @param {string} appKey
|
|
64
|
+
*/
|
|
65
|
+
function attachLocalCertification(summary, appKey) {
|
|
66
|
+
if (!summary || !summary.isExternal) return;
|
|
67
|
+
const cert = loadLocalCertificationFromSystemFile(appKey);
|
|
68
|
+
if (cert) summary.localCertification = cert;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Resolve dataplane URL + datasource keys for verify, or set summary errors.
|
|
73
|
+
* @returns {Promise<{ dataplaneUrl: string, authConfig: Object, systemKey: string, keys: string[] }|null>}
|
|
74
|
+
*/
|
|
75
|
+
async function resolveCertificationVerifyTargets(summary, appKey, authBundle) {
|
|
76
|
+
if (!authBundle || !authBundle.token || !authBundle.controllerUrl) {
|
|
77
|
+
summary.certificationVerifySkipped = true;
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
const { resolveEnvironment } = require('../core/config');
|
|
81
|
+
const { resolveDataplaneUrl } = require('../utils/dataplane-resolver');
|
|
82
|
+
const authConfig = { type: 'bearer', token: authBundle.token };
|
|
83
|
+
const environment = await resolveEnvironment();
|
|
84
|
+
let dataplaneUrl;
|
|
85
|
+
try {
|
|
86
|
+
dataplaneUrl = await resolveDataplaneUrl(authBundle.controllerUrl, environment, authConfig);
|
|
87
|
+
} catch (e) {
|
|
88
|
+
summary.certificationVerifyError = e.message || 'dataplane_unavailable';
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
let manifest;
|
|
92
|
+
try {
|
|
93
|
+
manifest = await generateControllerManifest(appKey, { type: 'external' });
|
|
94
|
+
} catch {
|
|
95
|
+
summary.certificationVerifyError = 'manifest_unavailable';
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
const systemKey = manifest.key || appKey;
|
|
99
|
+
const keys = (manifest.dataSources || []).map((ds) => ds && ds.key).filter(Boolean).slice(0, MAX_VERIFY_DATASOURCES);
|
|
100
|
+
return { dataplaneUrl, authConfig, systemKey, keys };
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Populate **certificationVerifyRows** on summary (mutates).
|
|
105
|
+
*
|
|
106
|
+
* @async
|
|
107
|
+
* @param {Object} summary
|
|
108
|
+
* @param {string} appKey
|
|
109
|
+
* @param {{ token: string, controllerUrl: string }} authBundle
|
|
110
|
+
* @returns {Promise<void>}
|
|
111
|
+
*/
|
|
112
|
+
async function attachCertificationVerifyFromDataplane(summary, appKey, authBundle) {
|
|
113
|
+
if (!summary || !summary.isExternal) return;
|
|
114
|
+
const ctx = await resolveCertificationVerifyTargets(summary, appKey, authBundle);
|
|
115
|
+
if (!ctx) return;
|
|
116
|
+
const rows = [];
|
|
117
|
+
for (const dk of ctx.keys) {
|
|
118
|
+
rows.push(await verifyRowForDatasource(ctx.dataplaneUrl, ctx.authConfig, ctx.systemKey, dk));
|
|
119
|
+
}
|
|
120
|
+
summary.certificationVerifyRows = rows;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
module.exports = {
|
|
124
|
+
attachLocalCertification,
|
|
125
|
+
attachCertificationVerifyFromDataplane,
|
|
126
|
+
sanitizeCertificationForJson,
|
|
127
|
+
truncatePublicKeyPreview,
|
|
128
|
+
loadLocalCertificationFromSystemFile
|
|
129
|
+
};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Build per-datasource certificate verify rows for show / enrich (small helpers for lint limits).
|
|
3
|
+
* @author AI Fabrix Team
|
|
4
|
+
* @version 2.0.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
'use strict';
|
|
8
|
+
|
|
9
|
+
const { unwrapApiData } = require('../utils/external-system-readiness-core');
|
|
10
|
+
const { getActiveIntegrationCertificate, verifyIntegrationCertificate } = require('../api/certificates.api');
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @param {*} id
|
|
14
|
+
* @returns {string|null}
|
|
15
|
+
*/
|
|
16
|
+
function certificateIdString(id) {
|
|
17
|
+
if (id === undefined || id === null) return null;
|
|
18
|
+
if (typeof id === 'string') return id.trim() || null;
|
|
19
|
+
if (typeof id === 'object' && id !== null && typeof id.id === 'string') return id.id.trim() || null;
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @param {string} dataplaneUrl
|
|
25
|
+
* @param {Object} authConfig
|
|
26
|
+
* @param {string} systemKey
|
|
27
|
+
* @param {string} dk
|
|
28
|
+
* @returns {Promise<Object>}
|
|
29
|
+
*/
|
|
30
|
+
async function verifyRowForDatasource(dataplaneUrl, authConfig, systemKey, dk) {
|
|
31
|
+
const activeRes = await getActiveIntegrationCertificate(dataplaneUrl, authConfig, systemKey, dk);
|
|
32
|
+
if (!activeRes || activeRes.success === false) {
|
|
33
|
+
return { datasourceKey: dk, error: 'active_unavailable' };
|
|
34
|
+
}
|
|
35
|
+
const art = unwrapApiData(activeRes);
|
|
36
|
+
const cid = certificateIdString(art && art.certificateId);
|
|
37
|
+
if (!cid) {
|
|
38
|
+
return { datasourceKey: dk, error: 'no_certificate_id' };
|
|
39
|
+
}
|
|
40
|
+
const verRes = await verifyIntegrationCertificate(dataplaneUrl, authConfig, {
|
|
41
|
+
certificateId: cid,
|
|
42
|
+
verifyHash: true,
|
|
43
|
+
systemIdOrKey: systemKey,
|
|
44
|
+
datasourceKey: dk
|
|
45
|
+
});
|
|
46
|
+
if (!verRes || verRes.success === false) {
|
|
47
|
+
return { datasourceKey: dk, certificateId: cid, error: 'verify_request_failed' };
|
|
48
|
+
}
|
|
49
|
+
const v = unwrapApiData(verRes);
|
|
50
|
+
return {
|
|
51
|
+
datasourceKey: dk,
|
|
52
|
+
certificateId: cid,
|
|
53
|
+
overallValid: !!(v && v.overallValid),
|
|
54
|
+
validSignature: !!(v && v.validSignature),
|
|
55
|
+
validHash: !!(v && v.validHash),
|
|
56
|
+
reasons: Array.isArray(v && v.reasons) ? v.reasons : []
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
module.exports = { verifyRowForDatasource, certificateIdString };
|
package/lib/app/show-display.js
CHANGED
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
const chalk = require('chalk');
|
|
13
13
|
const logger = require('../utils/logger');
|
|
14
|
+
const { truncatePublicKeyPreview } = require('./certification-show-enrich');
|
|
14
15
|
|
|
15
16
|
function logSourceAndHeader(summary) {
|
|
16
17
|
const isOffline = summary.source === 'offline';
|
|
@@ -261,6 +262,47 @@ function displayExternalAppBlock(summary) {
|
|
|
261
262
|
}
|
|
262
263
|
}
|
|
263
264
|
|
|
265
|
+
/**
|
|
266
|
+
* Local certification + optional verify rows (external integrations).
|
|
267
|
+
* @param {Object} summary
|
|
268
|
+
*/
|
|
269
|
+
function logCertificationSection(summary) {
|
|
270
|
+
if (!summary.isExternal) return;
|
|
271
|
+
logger.log('');
|
|
272
|
+
logger.log('🪪 Certification (local system file)');
|
|
273
|
+
const c = summary.localCertification;
|
|
274
|
+
if (!c || typeof c !== 'object') {
|
|
275
|
+
logger.log(' (none or unreadable)');
|
|
276
|
+
} else {
|
|
277
|
+
logger.log(` enabled: ${c.enabled}`);
|
|
278
|
+
logger.log(` algorithm: ${c.algorithm ?? '—'}`);
|
|
279
|
+
logger.log(` issuer: ${c.issuer ?? '—'}`);
|
|
280
|
+
logger.log(` version: ${c.version ?? '—'}`);
|
|
281
|
+
logger.log(` publicKey: ${truncatePublicKeyPreview(c.publicKey, 64)}`);
|
|
282
|
+
}
|
|
283
|
+
if (summary.certificationVerifyRows && summary.certificationVerifyRows.length > 0) {
|
|
284
|
+
logger.log('');
|
|
285
|
+
logger.log('🪪 Certification verify (dataplane)');
|
|
286
|
+
summary.certificationVerifyRows.forEach((row) => {
|
|
287
|
+
if (row.error) {
|
|
288
|
+
logger.log(` • ${row.datasourceKey}: ${row.error}`);
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
const ok = row.overallValid ? chalk.green('ok') : chalk.yellow('not ok');
|
|
292
|
+
logger.log(
|
|
293
|
+
` • ${row.datasourceKey}: ${ok} signature=${row.validSignature} hash=${row.validHash}`
|
|
294
|
+
);
|
|
295
|
+
if (row.reasons && row.reasons.length) {
|
|
296
|
+
logger.log(chalk.gray(` reasons: ${row.reasons.join('; ')}`));
|
|
297
|
+
}
|
|
298
|
+
});
|
|
299
|
+
} else if (summary.certificationVerifySkipped) {
|
|
300
|
+
logger.log(chalk.gray('\n Certification verify skipped (not logged in or no controller URL).'));
|
|
301
|
+
} else if (summary.certificationVerifyError) {
|
|
302
|
+
logger.log(chalk.yellow(`\n Certification verify error: ${summary.certificationVerifyError}`));
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
264
306
|
/**
|
|
265
307
|
* Format and print human-readable show output (offline or online).
|
|
266
308
|
* @param {Object} summary - Unified summary (buildOfflineSummaryFromDeployJson or buildOnlineSummary)
|
|
@@ -278,6 +320,7 @@ function display(summary, options = {}) {
|
|
|
278
320
|
}
|
|
279
321
|
logApplicationSection(ctx.a, summary);
|
|
280
322
|
if (summary.isExternal) displayExternalAppBlock(summary);
|
|
323
|
+
if (summary.isExternal) logCertificationSection(summary);
|
|
281
324
|
logRolesSection(ctx.roles);
|
|
282
325
|
logAuthSection(ctx.authentication);
|
|
283
326
|
logConfigurationsSection(ctx.portalInputConfigurations);
|