@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.
Files changed (66) hide show
  1. package/.cursor/rules/cli-layout.mdc +75 -0
  2. package/.cursor/rules/project-rules.mdc +8 -0
  3. package/.npmrc.token +1 -0
  4. package/.nyc_output/55e9d034-ddab-4579-a706-e02a91d75c91.json +1 -0
  5. package/.nyc_output/processinfo/55e9d034-ddab-4579-a706-e02a91d75c91.json +1 -0
  6. package/.nyc_output/processinfo/index.json +1 -0
  7. package/jest.projects.js +15 -2
  8. package/lib/api/certificates.api.js +62 -0
  9. package/lib/api/index.js +11 -2
  10. package/lib/api/types/certificates.types.js +48 -0
  11. package/lib/api/validation-run.api.js +16 -4
  12. package/lib/api/validation-runner.js +13 -3
  13. package/lib/app/certification-show-enrich.js +129 -0
  14. package/lib/app/certification-verify-rows.js +60 -0
  15. package/lib/app/show-display.js +43 -0
  16. package/lib/app/show.js +92 -8
  17. package/lib/certification/cli-cert-sync-skip.js +21 -0
  18. package/lib/certification/merge-certification-from-artifact.js +185 -0
  19. package/lib/certification/post-unified-cert-sync.js +33 -0
  20. package/lib/certification/sync-after-external-command.js +52 -0
  21. package/lib/certification/sync-system-certification.js +197 -0
  22. package/lib/cli/setup-app.js +4 -0
  23. package/lib/cli/setup-app.test-commands.js +24 -8
  24. package/lib/cli/setup-external-system.js +22 -1
  25. package/lib/cli/setup-secrets.js +34 -13
  26. package/lib/cli/setup-utility.js +18 -2
  27. package/lib/commands/app.js +10 -1
  28. package/lib/commands/datasource-unified-test-cli.js +50 -117
  29. package/lib/commands/datasource-unified-test-cli.options.js +44 -2
  30. package/lib/commands/datasource-unified-test-e2e-cli-helpers.js +106 -0
  31. package/lib/commands/datasource-validation-cli.js +15 -1
  32. package/lib/commands/datasource.js +25 -2
  33. package/lib/commands/upload.js +17 -6
  34. package/lib/datasource/log-viewer.js +105 -14
  35. package/lib/datasource/test-e2e.js +35 -17
  36. package/lib/datasource/unified-validation-run-body.js +3 -0
  37. package/lib/datasource/unified-validation-run.js +2 -1
  38. package/lib/external-system/deploy.js +53 -18
  39. package/lib/infrastructure/compose.js +12 -3
  40. package/lib/infrastructure/helpers-docker-check.js +67 -0
  41. package/lib/infrastructure/helpers.js +47 -58
  42. package/lib/infrastructure/index.js +3 -1
  43. package/lib/infrastructure/services.js +4 -56
  44. package/lib/schema/external-system.schema.json +25 -3
  45. package/lib/schema/type/document-storage.json +15 -2
  46. package/lib/utils/api.js +28 -3
  47. package/lib/utils/configuration-env-resolver.js +11 -8
  48. package/lib/utils/credential-secrets-env.js +5 -5
  49. package/lib/utils/datasource-test-run-certificate-tty.js +82 -0
  50. package/lib/utils/datasource-test-run-display.js +19 -2
  51. package/lib/utils/datasource-test-run-exit.js +25 -0
  52. package/lib/utils/external-system-display.js +8 -0
  53. package/lib/utils/external-system-system-test-tty-overview.js +120 -0
  54. package/lib/utils/external-system-system-test-tty.js +417 -0
  55. package/lib/utils/paths.js +14 -0
  56. package/lib/utils/validation-run-poll.js +28 -5
  57. package/lib/utils/validation-run-post-retry.js +20 -8
  58. package/lib/utils/validation-run-request.js +18 -0
  59. package/lib/validation/validate-external-cert-sync.js +23 -0
  60. package/lib/validation/validate.js +4 -1
  61. package/package.json +4 -3
  62. package/scripts/install-local.js +4 -1
  63. package/scripts/pnpm-global-remove.js +48 -0
  64. package/templates/applications/dataplane/env.template +4 -0
  65. package/templates/infra/compose.yaml.hbs +15 -14
  66. 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, { method: 'GET', headers }, this.authConfig);
105
+ return await authenticatedApiCall(url, transport, this.authConfig);
101
106
  }
102
107
 
103
- return await makeApiCall(url, { method: 'GET', headers });
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
- return client.post(POST_PATH, { body, headers: hdrs || undefined });
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
- return client.get(path, { headers: hdrs || undefined });
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 postRes = await postValidationRunWithTransportRetry(dataplaneUrl, authConfig, body);
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 };
@@ -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);