@aifabrix/builder 2.49.2 → 2.50.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cursor/rules/deploy-rules/docker-image-ip-policy.mdc +49 -0
- package/.cursor/rules/plan-rules/application-lifecycle.mdc +30 -0
- package/.cursor/rules/plan-rules/plan-frontmatter.mdc +35 -0
- package/.cursor/rules/plan-rules/plan-lifecycle.mdc +31 -0
- package/.cursor/rules/plan-rules/plan-validation-gate.mdc +34 -0
- package/.cursor/skills/README.md +1 -0
- package/.dockerignore +52 -0
- package/.eslintignore +22 -0
- package/README.md +2 -0
- package/bin/builder-api-cleanup.js +26 -0
- package/bin/builder-api-nest.js +10 -0
- package/bin/builder-api-spike.js +19 -0
- package/enterprise-knowledge/README.md +50 -0
- package/enterprise-knowledge/enterprise-integration-lifecycle/README.md +22 -0
- package/enterprise-knowledge/enterprise-integration-lifecycle/application.json +15 -0
- package/enterprise-knowledge/enterprise-integration-lifecycle/deploy.js +69 -0
- package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-deploy.json +52 -0
- package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-system.json +29 -0
- package/enterprise-knowledge/enterprise-integration-lifecycle/env.template +2 -0
- package/integration/README.md +81 -0
- package/integration/github/README.md +53 -0
- package/integration/github/application.json +21 -0
- package/integration/github/deploy.js +72 -0
- package/integration/github/env.template +11 -0
- package/integration/github/github-datasource-issue-comments.json +239 -0
- package/integration/github/github-datasource-issues.json +399 -0
- package/integration/github/github-datasource-repository.json +354 -0
- package/integration/github/github-deploy.json +1202 -0
- package/integration/github/github-system.json +82 -0
- package/integration/hubspot-test/README.md +1 -1
- package/jest.isolated-projects.js +31 -1
- package/jest.projects.js +87 -1
- package/lib/api/dev-server-https.js +1 -1
- package/lib/api/enterprise-knowledge.api.js +63 -0
- package/lib/api/evidence.api.js +172 -0
- package/lib/api/external-systems.api.js +8 -2
- package/lib/api/resource-types.api.js +1 -0
- package/lib/api/types/enterprise-knowledge.types.js +46 -0
- package/lib/api/types/evidence.types.js +67 -0
- package/lib/api/types/resource-types.types.js +2 -0
- package/lib/app/controller-application-filter.js +36 -0
- package/lib/app/deploy.js +1 -1
- package/lib/app/list-external-systems.js +130 -0
- package/lib/app/list.js +20 -8
- package/lib/app/run.js +3 -1
- package/lib/app/show-display.js +8 -3
- package/lib/app/show-online.js +178 -0
- package/lib/app/show.js +37 -88
- package/lib/build/builder-api-docker-staging.js +47 -0
- package/lib/build/miso-controller-npm-sdk-guard.js +2 -2
- package/lib/build/standard-docker-build.js +2 -0
- package/lib/certification/post-unified-cert-sync.js +4 -31
- package/lib/certification/sync-after-external-command.js +0 -1
- package/lib/certification/sync-system-certification.js +0 -3
- package/lib/channels/add-channel.js +40 -34
- package/lib/channels/approval-guides/chatgpt.js +33 -0
- package/lib/channels/approval-guides/credential-portal.js +38 -0
- package/lib/channels/approval-guides/index.js +110 -0
- package/lib/channels/approval-guides/microsoft-copilot.js +34 -0
- package/lib/channels/approval-guides/slack.js +34 -0
- package/lib/channels/approval-guides/teams-bot.js +35 -0
- package/lib/channels/approval-guides/web-embed.js +32 -0
- package/lib/channels/channel-approval-guide.js +11 -0
- package/lib/channels/channel-artifact-generator.js +16 -4
- package/lib/channels/channel-audit.js +3 -0
- package/lib/channels/channel-auth-context.js +1 -1
- package/lib/channels/channel-description.js +59 -0
- package/lib/channels/channel-integration-generator.js +13 -230
- package/lib/channels/channel-integration-template.js +94 -0
- package/lib/channels/channel-runtime-resolver.js +43 -3
- package/lib/channels/channel-status-display.js +66 -26
- package/lib/channels/channel-targets.js +3 -3
- package/lib/cli/index.js +27 -3
- package/lib/cli/infra-guided.js +5 -1
- package/lib/cli/setup-app-external-create.js +111 -0
- package/lib/cli/setup-app.help.js +1 -1
- package/lib/cli/setup-app.js +38 -125
- package/lib/cli/setup-app.test-commands.js +26 -52
- package/lib/cli/setup-certification-commands.js +4 -4
- package/lib/cli/setup-certification.help.js +9 -9
- package/lib/cli/setup-dev.js +7 -2
- package/lib/cli/setup-external-system-help.js +4 -6
- package/lib/cli/setup-external-system.js +58 -52
- package/lib/cli/setup-infra-up-builder-api-action.js +64 -0
- package/lib/cli/setup-infra-up-platform-action.js +3 -1
- package/lib/cli/setup-infra.js +15 -0
- package/lib/cli/setup-list.js +43 -0
- package/lib/cli/setup-utility-repair.js +26 -7
- package/lib/cli/setup-utility.js +5 -3
- package/lib/commands/app.js +15 -43
- package/lib/commands/channel-add-setup.js +110 -0
- package/lib/commands/channel.js +42 -8
- package/lib/commands/datasource-sync-display.js +96 -0
- package/lib/commands/datasource-sync-policy.js +210 -0
- package/lib/commands/datasource-test-trust-cli.js +6 -6
- package/lib/commands/datasource-unified-test-cli.js +2 -1
- package/lib/commands/datasource-unified-test-cli.options.js +33 -23
- package/lib/commands/deploy-gate-failure-details.js +163 -0
- package/lib/commands/deploy-gate-orchestrator.js +322 -0
- package/lib/commands/dev-cli-handlers.js +1 -59
- package/lib/commands/dev-host-ops-params.js +91 -0
- package/lib/commands/dev-host-ops-poll.js +111 -0
- package/lib/commands/dev-host-ops.js +107 -94
- package/lib/commands/dev-init.js +3 -1
- package/lib/commands/enterprise-knowledge.js +284 -0
- package/lib/commands/evidence-cli-leaves.js +250 -0
- package/lib/commands/evidence.js +51 -0
- package/lib/commands/governance-cli-shared.js +2 -2
- package/lib/commands/governance-command-action.js +2 -2
- package/lib/commands/governance-fixture-subjects.js +85 -0
- package/lib/commands/governance.js +1 -1
- package/lib/commands/lifecycle-command-action.js +2 -2
- package/lib/commands/lifecycle-external.js +3 -3
- package/lib/commands/manifest-cli-auth.js +29 -0
- package/lib/commands/manifest-cli-commands.js +170 -0
- package/lib/commands/manifest-cli-integration-path.js +63 -0
- package/lib/commands/manifest.js +21 -0
- package/lib/commands/protection-cli-leaves.js +3 -3
- package/lib/commands/repair-auth-apply.js +15 -1
- package/lib/commands/repair-authentications-454.js +169 -0
- package/lib/commands/repair-capability-openapi-warnings.js +126 -0
- package/lib/commands/repair-datasource-apply.js +135 -0
- package/lib/commands/repair-datasource-auto-rbac.js +62 -1
- package/lib/commands/repair-datasource-http-service-contract.js +239 -0
- package/lib/commands/repair-datasource-operation-security.js +180 -0
- package/lib/commands/repair-datasource-run.js +7 -2
- package/lib/commands/repair-datasource-sync-operations.js +177 -0
- package/lib/commands/repair-datasource-webhooks-sync-bridge.js +133 -0
- package/lib/commands/repair-datasource.js +12 -68
- package/lib/commands/repair-env-template.js +11 -1
- package/lib/commands/repair-external-run.js +121 -31
- package/lib/commands/repair-internal.js +1 -1
- package/lib/commands/repair-openapi-export.js +156 -0
- package/lib/commands/repair-openapi-sync.js +19 -2
- package/lib/commands/repair-orchestration-datasource-split.js +259 -0
- package/lib/commands/repair-persist.js +22 -1
- package/lib/commands/repair-rbac-platform-preset.js +204 -0
- package/lib/commands/repair-rbac-reader-roles.js +191 -0
- package/lib/commands/repair-rbac.js +163 -86
- package/lib/commands/repair-steps.js +83 -18
- package/lib/commands/repair-system-permissions.js +1 -0
- package/lib/commands/repair.js +1 -1
- package/lib/commands/resource-type.js +65 -26
- package/lib/commands/run-post-publish-data-sync.js +68 -0
- package/lib/commands/setup-modes.js +1 -1
- package/lib/commands/test-e2e-external.js +21 -8
- package/lib/commands/test-governance-cli-options.js +2 -2
- package/lib/commands/test-trust-cli-options.js +2 -2
- package/lib/commands/up-builder-api-bootstrap.js +71 -0
- package/lib/commands/up-builder-api-provision.js +241 -0
- package/lib/commands/up-builder-api.js +88 -0
- package/lib/commands/up-common.js +25 -1
- package/lib/commands/upload-credential-push-log.js +117 -0
- package/lib/commands/upload-data-sync-finalize.js +60 -0
- package/lib/commands/upload-probe.js +66 -0
- package/lib/commands/upload-publish-context.js +4 -1
- package/lib/commands/upload-sidecar-followups.js +55 -27
- package/lib/commands/upload.js +116 -157
- package/lib/commands/verify-governance-combined-external.js +1 -1
- package/lib/commands/verify-governance-db.js +2 -2
- package/lib/commands/verify-operations-command-action.js +2 -2
- package/lib/commands/verify-operations-step-plan.js +2 -2
- package/lib/commands/verify-operations-steps.js +2 -2
- package/lib/commands/verify-trust-command-action.js +1 -1
- package/lib/commands/wizard-core.js +1 -1
- package/lib/commands/wizard-headless.js +2 -1
- package/lib/core/admin-secrets.js +2 -6
- package/lib/core/secrets-env-content.js +10 -4
- package/lib/core/secrets-env-write.js +2 -13
- package/lib/datasource/agent-trust-run.js +3 -3
- package/lib/datasource/deploy.js +3 -1
- package/lib/datasource/test-e2e.js +6 -1
- package/lib/datasource/unified-validation-run-body.js +4 -1
- package/lib/datasource/unified-validation-run.js +1 -1
- package/lib/deployment/deploy-poll-ui.js +73 -12
- package/lib/deployment/deployer-poll-run.js +113 -0
- package/lib/deployment/deployer.js +17 -87
- package/lib/evidence/dataplane-context.js +21 -0
- package/lib/evidence/evidence-display.js +78 -0
- package/lib/evidence/evidence-service.js +392 -0
- package/lib/external-system/deploy.js +290 -112
- package/lib/external-system/download.js +7 -3
- package/lib/external-system/test-execution.js +1 -1
- package/lib/external-system/test-system-level.js +8 -10
- package/lib/external-system/test.js +12 -6
- package/lib/generator/deploy-script.js +73 -0
- package/lib/generator/external.js +2 -1
- package/lib/generator/index.js +17 -2
- package/lib/generator/wizard.js +3 -36
- package/lib/internal/fs-real-sync.js +22 -1
- package/lib/internal/node-fs.js +2 -0
- package/lib/lifecycle/lifecycle-governance-options.js +1 -1
- package/lib/lifecycle/verify-step-progress.js +1 -1
- package/lib/programmatic/access-log.js +26 -0
- package/lib/programmatic/auth-config.js +44 -0
- package/lib/programmatic/bearer-auth.js +176 -0
- package/lib/programmatic/builder-api-request.js +175 -0
- package/lib/programmatic/builder-api-route-dispatch.js +82 -0
- package/lib/programmatic/builder-api-runtime-config.js +42 -0
- package/lib/programmatic/builder-api-server.js +230 -0
- package/lib/programmatic/builder-help-authentication-catalog.js +282 -0
- package/lib/programmatic/builder-help-connected-system-ui.js +266 -0
- package/lib/programmatic/builder-help-enterprise-sync-fabrix.js +60 -0
- package/lib/programmatic/builder-help-envelope.js +36 -0
- package/lib/programmatic/builder-help-fixtures.js +200 -0
- package/lib/programmatic/builder-help-governance.js +172 -0
- package/lib/programmatic/builder-help-schema-catalog.js +92 -0
- package/lib/programmatic/builder-help.js +361 -0
- package/lib/programmatic/capability-registry.js +77 -0
- package/lib/programmatic/command-options.js +32 -0
- package/lib/programmatic/enterprise-mcp-client.js +98 -0
- package/lib/programmatic/http-problem-details.js +99 -0
- package/lib/programmatic/http-route-match.js +40 -0
- package/lib/programmatic/idempotency-cache.js +69 -0
- package/lib/programmatic/index.js +53 -0
- package/lib/programmatic/integration-path-scope.js +39 -0
- package/lib/programmatic/log-redaction.js +66 -0
- package/lib/programmatic/manifest-get-section.js +146 -0
- package/lib/programmatic/manifest-patch-section.js +252 -0
- package/lib/programmatic/manifest-repair.js +122 -0
- package/lib/programmatic/manifest-section-dependency-graph.js +160 -0
- package/lib/programmatic/manifest-section-io.js +225 -0
- package/lib/programmatic/manifest-section-quality.js +171 -0
- package/lib/programmatic/manifest-section-registry-data.js +269 -0
- package/lib/programmatic/manifest-section-registry.js +205 -0
- package/lib/programmatic/nest-http-bridge.js +34 -0
- package/lib/programmatic/openapi-component-schemas.js +68 -0
- package/lib/programmatic/openapi-description-enricher.js +117 -0
- package/lib/programmatic/openapi-descriptions.js +190 -0
- package/lib/programmatic/openapi-docs-serving.js +123 -0
- package/lib/programmatic/openapi-help-schemas.js +63 -0
- package/lib/programmatic/openapi-manifest-schemas.js +141 -0
- package/lib/programmatic/openapi-operation-bindings.js +274 -0
- package/lib/programmatic/openapi-request-schemas.js +155 -0
- package/lib/programmatic/openapi-result-schemas.js +476 -0
- package/lib/programmatic/openapi-schema-descriptions-certify.js +139 -0
- package/lib/programmatic/openapi-schema-descriptions-core.js +159 -0
- package/lib/programmatic/openapi-schema-descriptions-help.js +40 -0
- package/lib/programmatic/openapi-schema-descriptions-manifest.js +143 -0
- package/lib/programmatic/openapi-schema-descriptions-mcp.js +118 -0
- package/lib/programmatic/openapi-schema-descriptions-operations.js +281 -0
- package/lib/programmatic/openapi-schema-helpers.js +93 -0
- package/lib/programmatic/openapi-spec.js +203 -0
- package/lib/programmatic/orchestration-openapi-meta.js +159 -0
- package/lib/programmatic/platform-rbac-catalog.js +90 -0
- package/lib/programmatic/request-timeout.js +53 -0
- package/lib/programmatic/route-handler-map.js +143 -0
- package/lib/programmatic/route-handlers-context.js +29 -0
- package/lib/programmatic/route-handlers.js +33 -0
- package/lib/programmatic/run-certify.js +57 -0
- package/lib/programmatic/run-enterprise-mcp.js +32 -0
- package/lib/programmatic/run-lifecycle.js +29 -0
- package/lib/programmatic/run-repair.js +41 -0
- package/lib/programmatic/run-repository-emcp.js +54 -0
- package/lib/programmatic/run-template-workspace.js +61 -0
- package/lib/programmatic/run-test.js +49 -0
- package/lib/programmatic/run-upload.js +63 -0
- package/lib/programmatic/run-validate.js +53 -0
- package/lib/programmatic/run-wizard.js +40 -0
- package/lib/programmatic/system-key.js +48 -0
- package/lib/programmatic/wizard-config-normalize.js +118 -0
- package/lib/programmatic/workspace-cleanup.js +128 -0
- package/lib/programmatic/workspace-context.js +145 -0
- package/lib/programmatic/workspace-lock.js +75 -0
- package/lib/programmatic/workspace-meta.js +64 -0
- package/lib/programmatic/workspace-ops.js +149 -0
- package/lib/protection/run-commands-upload-sync.js +35 -0
- package/lib/protection/run-commands.js +2 -20
- package/lib/protection/upload-batch.js +11 -7
- package/lib/resolvers/resource-type-file.js +22 -0
- package/lib/schema/external-datasource.schema.json +161 -1
- package/lib/schema/external-system.schema.json +244 -118
- package/lib/schema/flag-map-validation-run.json +3 -0
- package/lib/schema/type/credential-field-registry.json +2 -2
- package/lib/schema/type/document-storage.json +9 -0
- package/lib/utils/agent-trust-run-display.js +1 -1
- package/lib/utils/app-path-resolve.js +168 -0
- package/lib/utils/authentication-env-template.js +222 -0
- package/lib/utils/cli-sync-options.js +7 -11
- package/lib/utils/cli-utils.js +4 -0
- package/lib/utils/cli-workspace-options.js +29 -0
- package/lib/utils/compose-generate-docker-compose.js +102 -0
- package/lib/utils/configuration-env-resolver.js +203 -27
- package/lib/utils/datasource-test-run-certificate-tty.js +28 -2
- package/lib/utils/datasource-test-run-certification-debug.js +130 -0
- package/lib/utils/datasource-test-run-debug-display.js +2 -0
- package/lib/utils/datasource-test-run-debug-slice.js +7 -0
- package/lib/utils/datasource-test-run-display.js +2 -1
- package/lib/utils/dev-init-ssh-merge.js +165 -23
- package/lib/utils/dev-pin-share-instructions.js +110 -0
- package/lib/utils/dev-ssh-config-helper.js +177 -33
- package/lib/utils/enterprise-knowledge-paths.js +142 -0
- package/lib/utils/env-copy.js +2 -1
- package/lib/utils/env-dotenv-format.js +103 -0
- package/lib/utils/external-env-template.js +4 -1
- package/lib/utils/external-system-display.js +5 -1
- package/lib/utils/external-system-readiness-compact-blocks.js +221 -0
- package/lib/utils/external-system-readiness-compact-display.js +324 -0
- package/lib/utils/external-system-readiness-core.js +16 -0
- package/lib/utils/external-system-readiness-deploy-display.js +29 -11
- package/lib/utils/external-system-readiness-display-internals.js +3 -1
- package/lib/utils/external-system-readiness-display.js +20 -30
- package/lib/utils/external-system-system-test-tty-certification.js +135 -0
- package/lib/utils/external-system-system-test-tty.js +5 -41
- package/lib/utils/help-builder.js +6 -1
- package/lib/utils/host-ops-job-labels.js +236 -0
- package/lib/utils/host-ops-job-result.js +61 -0
- package/lib/utils/host-ops-poll-ui.js +163 -0
- package/lib/utils/integration-path-resolve.js +112 -0
- package/lib/utils/paths-reload-source.js +148 -0
- package/lib/utils/paths-system-builder-keys.js +25 -0
- package/lib/utils/paths.js +151 -26
- package/lib/utils/runtime-configuration-values.js +64 -2
- package/lib/utils/secrets-helpers.js +5 -1
- package/lib/utils/ssh-known-hosts.js +130 -0
- package/lib/utils/test-target-cli-options.js +75 -0
- package/lib/utils/upload-sync-options.js +4 -0
- package/lib/utils/validation-run-request.js +11 -2
- package/lib/validation/external-manifest-validator.js +11 -1
- package/lib/validation/openapi-contract-surface-validator.js +426 -0
- package/lib/validation/openapi-contract-vendor-validation.js +238 -0
- package/lib/validation/validate-external-file.js +160 -0
- package/lib/validation/validate.js +6 -117
- package/package.json +46 -29
- package/packages/builder-api/README.md +120 -0
- package/packages/builder-api/package.json +30 -0
- package/packages/builder-api/src/app.module.ts +7 -0
- package/packages/builder-api/src/auth/auth.module.ts +5 -0
- package/packages/builder-api/src/external-system/external-system.module.ts +5 -0
- package/packages/builder-api/src/main.ts +16 -0
- package/packages/builder-api/tsconfig.json +15 -0
- package/scripts/check-builder-api-architecture-grep.js +79 -0
- package/scripts/docker_image_content_gate.js +47 -0
- package/scripts/docker_image_content_gate.sh +5 -0
- package/scripts/export-builder-api-evidence.js +262 -0
- package/scripts/lib/builder-api-docker-staging-copy.js +60 -0
- package/scripts/lib/builder-api-docker-staging-core.js +183 -0
- package/scripts/lib/docker-image-content-gate-core.js +166 -0
- package/scripts/lib/plan-actor.js +109 -0
- package/scripts/lib/plan-config.js +20 -0
- package/scripts/lib/plan-gates.js +154 -0
- package/scripts/lib/plan-meta.js +104 -0
- package/scripts/lib/plan-parse.js +162 -0
- package/scripts/lib/plan-prevalidate-gates.js +326 -0
- package/scripts/lib/plan-run-core.js +125 -0
- package/scripts/lib/plan-run-report.js +108 -0
- package/scripts/plan-approve.js +24 -0
- package/scripts/plan-archive.js +49 -0
- package/scripts/plan-run.js +13 -0
- package/scripts/plan-set-actor.js +21 -0
- package/scripts/plan-validate.js +80 -0
- package/scripts/pnpm/af.mjs +110 -0
- package/scripts/pnpm/check-quiet.mjs +32 -0
- package/scripts/pnpm/dev-install.mjs +29 -0
- package/scripts/pnpm/dev-reload.mjs +18 -0
- package/scripts/pnpm/help.mjs +55 -0
- package/scripts/pnpm/lib/dev-reload-core.mjs +189 -0
- package/scripts/pnpm/lib/dev-reload-log-capture.mjs +67 -0
- package/scripts/pnpm/lib/dev-reload-log-utils.mjs +32 -0
- package/scripts/pnpm/lib/resolve-aifabrix-bin.mjs +124 -0
- package/scripts/pnpm/lib/resolve-app-url.mjs +183 -0
- package/scripts/pnpm/lib/spinner.mjs +42 -0
- package/scripts/stage_builder_api_for_docker.js +65 -0
- package/scripts/sync-builder-api-template.js +44 -0
- package/templates/README.md +3 -0
- package/templates/applications/builder-api/Dockerfile +38 -0
- package/templates/applications/builder-api/application.yaml +75 -0
- package/templates/applications/builder-api/env.template +48 -0
- package/templates/applications/dataplane/application.yaml +1 -1
- package/templates/applications/dataplane/env.template +10 -6
- package/templates/applications/dataplane/rbac.yaml +21 -1
- package/templates/applications/miso-controller/application.yaml +1 -1
- package/templates/applications/miso-controller/env.template +1 -3
- package/templates/channels/README.md +18 -0
- package/templates/channels/ai-fabrix-icon.jpg +0 -0
- package/templates/channels/chatgpt/install.template.md.hbs +21 -24
- package/templates/channels/chatgpt/integration/README.md +11 -0
- package/templates/channels/chatgpt/integration/application.json +15 -0
- package/templates/channels/chatgpt/integration/chatgpt-system.json +29 -0
- package/templates/channels/chatgpt/integration/env.template +4 -0
- package/templates/channels/microsoft-copilot/install.template.md.hbs +20 -25
- package/templates/channels/microsoft-copilot/integration/README.md +11 -0
- package/templates/channels/microsoft-copilot/integration/application.json +15 -0
- package/templates/channels/microsoft-copilot/integration/env.template +6 -0
- package/templates/channels/microsoft-copilot/integration/microsoft-copilot-system.json +34 -0
- package/templates/channels/slack/install.template.md.hbs +48 -18
- package/templates/channels/slack/integration/README.md +38 -0
- package/templates/channels/slack/integration/application.json +18 -0
- package/templates/channels/slack/integration/env.template +29 -0
- package/templates/channels/slack/integration/slack-datasource-conversations.json +226 -0
- package/templates/channels/slack/integration/slack-datasource-messages.json +269 -0
- package/templates/channels/slack/integration/slack-system.json +86 -0
- package/templates/channels/slack/manifest.template.json.hbs +20 -10
- package/templates/channels/teams-bot/install.template.md.hbs +31 -17
- package/templates/channels/teams-bot/integration/README.md +18 -0
- package/templates/channels/teams-bot/integration/application.json +17 -0
- package/templates/channels/teams-bot/integration/env.template +5 -0
- package/templates/channels/teams-bot/integration/teams-bot-system.json +55 -0
- package/templates/channels/teams-bot/manifest.template.json.hbs +27 -0
- package/templates/channels/web-embed/install.template.md.hbs +16 -26
- package/templates/channels/web-embed/integration/README.md +11 -0
- package/templates/channels/web-embed/integration/application.json +15 -0
- package/templates/channels/web-embed/integration/env.template +4 -0
- package/templates/channels/web-embed/integration/web-embed-system.json +29 -0
- package/templates/openapi/redoc_page.html +86 -0
- package/templates/python/docker-compose.hbs +11 -0
- package/templates/python/requirements.txt +1 -1
- package/templates/typescript/docker-compose.hbs +11 -0
- package/lib/certification/cli-cert-sync-skip.js +0 -21
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
* @property {ResourceTypeCategory} [category] - Catalog category
|
|
29
29
|
* @property {ResourceTypeRiskLevel} [defaultRiskLevel] - Default risk level
|
|
30
30
|
* @property {ResourceTypeStatus} [status] - Lifecycle status
|
|
31
|
+
* @property {string} domain - Enterprise domain (static dimension catalog)
|
|
31
32
|
*/
|
|
32
33
|
|
|
33
34
|
/**
|
|
@@ -40,6 +41,7 @@
|
|
|
40
41
|
* @property {ResourceTypeCategory} category - Category
|
|
41
42
|
* @property {ResourceTypeRiskLevel} defaultRiskLevel - Default risk
|
|
42
43
|
* @property {ResourceTypeStatus} status - Status
|
|
44
|
+
* @property {string} domain - Enterprise domain
|
|
43
45
|
*/
|
|
44
46
|
|
|
45
47
|
module.exports = {};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Distinguish controller pipeline applications from connected-system (external) registry rows.
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview Filter helpers for aifabrix app list vs connected systems list
|
|
5
|
+
* @author AI Fabrix Team
|
|
6
|
+
* @version 2.0.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @param {Object} app - Controller application row
|
|
11
|
+
* @returns {boolean} True when the row represents a connected system, not a runnable app
|
|
12
|
+
*/
|
|
13
|
+
function isControllerExternalApplication(app) {
|
|
14
|
+
if (!app || typeof app !== 'object') return false;
|
|
15
|
+
const cfg = app.configuration && typeof app.configuration === 'object' ? app.configuration : {};
|
|
16
|
+
const appType = app.type ?? cfg.type;
|
|
17
|
+
return String(appType || '').toLowerCase() === 'external';
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* @param {Array<Object>} applications - Controller application rows
|
|
22
|
+
* @returns {{ applications: Array<Object>, excludedCount: number }}
|
|
23
|
+
*/
|
|
24
|
+
function filterControllerApplications(applications) {
|
|
25
|
+
const list = Array.isArray(applications) ? applications : [];
|
|
26
|
+
const excludedCount = list.filter(isControllerExternalApplication).length;
|
|
27
|
+
return {
|
|
28
|
+
applications: list.filter((app) => !isControllerExternalApplication(app)),
|
|
29
|
+
excludedCount
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
module.exports = {
|
|
34
|
+
isControllerExternalApplication,
|
|
35
|
+
filterControllerApplications
|
|
36
|
+
};
|
package/lib/app/deploy.js
CHANGED
|
@@ -255,7 +255,7 @@ function displayDeploymentResults(result) {
|
|
|
255
255
|
* @returns {Promise<Object|null>} Deployment result if external, null otherwise
|
|
256
256
|
*/
|
|
257
257
|
async function handleExternalDeployment(appName, options) {
|
|
258
|
-
const { isExternal } = await detectAppType(appName);
|
|
258
|
+
const { isExternal } = await detectAppType(appName, options);
|
|
259
259
|
if (isExternal) {
|
|
260
260
|
const externalDeploy = require('../external-system/deploy');
|
|
261
261
|
await externalDeploy.deployExternalSystem(appName, options);
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* List connected systems published on the dataplane.
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview aifabrix list command — dataplane GET /api/v1/external/systems
|
|
5
|
+
* @author AI Fabrix Team
|
|
6
|
+
* @version 2.0.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const chalk = require('chalk');
|
|
10
|
+
const { formatBlockingError } = require('../utils/cli-test-layout-chalk');
|
|
11
|
+
const { getConfig, resolveEnvironment } = require('../core/config');
|
|
12
|
+
const { resolveControllerUrl } = require('../utils/controller-url');
|
|
13
|
+
const { resolveDataplaneUrl } = require('../utils/dataplane-resolver');
|
|
14
|
+
const { listExternalSystems } = require('../api/external-systems.api');
|
|
15
|
+
const { formatApiError } = require('../utils/api-error-handler');
|
|
16
|
+
const { getListAuthToken } = require('./list');
|
|
17
|
+
const logger = require('../utils/logger');
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Normalize list response shapes from the dataplane API client.
|
|
21
|
+
* @param {Object} response - API client response
|
|
22
|
+
* @returns {Array<Object>}
|
|
23
|
+
*/
|
|
24
|
+
function extractExternalSystems(response) {
|
|
25
|
+
const apiResponse = response?.data;
|
|
26
|
+
if (Array.isArray(apiResponse)) return apiResponse;
|
|
27
|
+
if (apiResponse && Array.isArray(apiResponse.items)) return apiResponse.items;
|
|
28
|
+
if (apiResponse && Array.isArray(apiResponse.data)) return apiResponse.data;
|
|
29
|
+
if (apiResponse && apiResponse.data && Array.isArray(apiResponse.data.items)) {
|
|
30
|
+
return apiResponse.data.items;
|
|
31
|
+
}
|
|
32
|
+
return [];
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @param {Array<Object>} systems
|
|
37
|
+
* @param {string} environment
|
|
38
|
+
* @param {string} dataplaneUrl
|
|
39
|
+
* @param {boolean} json
|
|
40
|
+
*/
|
|
41
|
+
function displayExternalSystems(systems, environment, dataplaneUrl, json) {
|
|
42
|
+
if (json) {
|
|
43
|
+
logger.log(JSON.stringify({ environment, dataplaneUrl, systems }, null, 2));
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const environmentName = environment || 'miso';
|
|
48
|
+
const header = `Connected systems in ${environmentName} (${dataplaneUrl})`;
|
|
49
|
+
if (systems.length === 0) {
|
|
50
|
+
logger.log(chalk.bold(`\n🔗 ${header}:\n`));
|
|
51
|
+
logger.log(chalk.gray(' No connected systems found on the dataplane.\n'));
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
logger.log(chalk.bold(`\n🔗 ${header}:\n`));
|
|
56
|
+
systems.forEach((system) => {
|
|
57
|
+
const key = system.key || system.systemKey || system.id || '—';
|
|
58
|
+
const displayName = system.displayName || key;
|
|
59
|
+
const status = system.status || 'unknown';
|
|
60
|
+
logger.log(`✔ ${chalk.cyan(key)} - ${displayName} (${status})`);
|
|
61
|
+
});
|
|
62
|
+
logger.log(chalk.gray(' To show details: aifabrix show <systemKey> --online\n'));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* @param {Object} [options]
|
|
67
|
+
* @returns {Promise<{ environment: string, authConfig: Object, dataplaneUrl: string }|null>}
|
|
68
|
+
*/
|
|
69
|
+
async function resolveDataplaneListContext(options = {}) {
|
|
70
|
+
const controllerUrl = options.controller || (await resolveControllerUrl());
|
|
71
|
+
if (!controllerUrl) {
|
|
72
|
+
logger.error(formatBlockingError('Controller URL is required. Run "aifabrix login".'));
|
|
73
|
+
process.exit(1);
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const environment = options.environment || (await resolveEnvironment());
|
|
78
|
+
const config = await getConfig();
|
|
79
|
+
const { token, actualControllerUrl } = await getListAuthToken(controllerUrl, config);
|
|
80
|
+
if (!token || !actualControllerUrl) {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const authConfig = { type: 'bearer', token };
|
|
85
|
+
try {
|
|
86
|
+
const dataplaneUrl = await resolveDataplaneUrl(actualControllerUrl, environment, authConfig);
|
|
87
|
+
return { environment, authConfig, dataplaneUrl };
|
|
88
|
+
} catch (error) {
|
|
89
|
+
logger.error(formatBlockingError(`Failed to resolve dataplane URL: ${error.message}`));
|
|
90
|
+
process.exit(1);
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* List connected systems on the dataplane for the current environment.
|
|
97
|
+
* @async
|
|
98
|
+
* @param {Object} [options]
|
|
99
|
+
* @param {string} [options.controller]
|
|
100
|
+
* @param {string} [options.environment]
|
|
101
|
+
* @param {boolean} [options.json]
|
|
102
|
+
*/
|
|
103
|
+
async function listExternalSystemsOnDataplane(options = {}) {
|
|
104
|
+
const ctx = await resolveDataplaneListContext(options);
|
|
105
|
+
if (!ctx) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
try {
|
|
110
|
+
const response = await listExternalSystems(ctx.dataplaneUrl, ctx.authConfig, { pageSize: 100 });
|
|
111
|
+
if (!response.success) {
|
|
112
|
+
const formatted = response.formattedError || formatApiError(response, ctx.dataplaneUrl);
|
|
113
|
+
logger.error(formatted);
|
|
114
|
+
process.exit(1);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const systems = extractExternalSystems(response);
|
|
118
|
+
displayExternalSystems(systems, ctx.environment, ctx.dataplaneUrl, Boolean(options.json));
|
|
119
|
+
} catch (error) {
|
|
120
|
+
logger.error(formatBlockingError(`Failed to list connected systems from dataplane: ${ctx.dataplaneUrl}`));
|
|
121
|
+
logger.error(chalk.gray(`Error: ${error.message}`));
|
|
122
|
+
process.exit(1);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
module.exports = {
|
|
127
|
+
listExternalSystemsOnDataplane,
|
|
128
|
+
extractExternalSystems,
|
|
129
|
+
displayExternalSystems
|
|
130
|
+
};
|
package/lib/app/list.js
CHANGED
|
@@ -16,6 +16,7 @@ const { listEnvironmentApplications } = require('../api/environments.api');
|
|
|
16
16
|
const { formatApiError } = require('../utils/api-error-handler');
|
|
17
17
|
const { formatAuthenticationError } = require('../utils/error-formatters/http-status-errors');
|
|
18
18
|
const logger = require('../utils/logger');
|
|
19
|
+
const { filterControllerApplications } = require('./controller-application-filter');
|
|
19
20
|
|
|
20
21
|
/**
|
|
21
22
|
* Extract wrapped array format: { success: true, data: { success: true, data: [...] } }
|
|
@@ -153,24 +154,30 @@ function formatUrlAndPort(app) {
|
|
|
153
154
|
* @param {string} environment - Environment name or key
|
|
154
155
|
* @param {string} controllerUrl - Controller URL
|
|
155
156
|
*/
|
|
156
|
-
function displayApplications(applications, environment, controllerUrl) {
|
|
157
|
+
function displayApplications(applications, environment, controllerUrl, excludedCount = 0) {
|
|
157
158
|
const environmentName = environment || 'miso';
|
|
158
159
|
const header = `Applications in ${environmentName} environment (${controllerUrl})`;
|
|
159
160
|
|
|
160
161
|
if (applications.length === 0) {
|
|
161
162
|
logger.log(chalk.bold(`\n📱 ${header}:\n`));
|
|
163
|
+
if (excludedCount > 0) {
|
|
164
|
+
logger.log(chalk.gray(` No controller applications found (${excludedCount} connected system(s) hidden).`));
|
|
165
|
+
logger.log(chalk.gray(' List connected systems: aifabrix list\n'));
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
162
168
|
logger.log(chalk.gray(' No applications found in this environment.\n'));
|
|
163
169
|
return;
|
|
164
170
|
}
|
|
165
171
|
|
|
166
172
|
logger.log(chalk.bold(`\n📱 ${header}:\n`));
|
|
167
173
|
applications.forEach((app) => {
|
|
168
|
-
const isExternal = app.configuration?.type === 'external';
|
|
169
|
-
const externalIcon = isExternal ? '🔗 ' : '';
|
|
170
174
|
const hasPipeline = app.configuration?.pipeline?.isActive ? '✔' : '✖';
|
|
171
175
|
const urlAndPort = formatUrlAndPort(app);
|
|
172
|
-
logger.log(`${
|
|
176
|
+
logger.log(`${hasPipeline} ${chalk.cyan(app.key)} - ${app.displayName} (${app.status || 'unknown'})${urlAndPort}`);
|
|
173
177
|
});
|
|
178
|
+
if (excludedCount > 0) {
|
|
179
|
+
logger.log(chalk.gray(` (${excludedCount} connected system(s) omitted — use: aifabrix list)`));
|
|
180
|
+
}
|
|
174
181
|
logger.log(chalk.gray(' To show details for an app: aifabrix app show <app>\n'));
|
|
175
182
|
}
|
|
176
183
|
|
|
@@ -295,6 +302,13 @@ function handleListResponse(response, actualControllerUrl) {
|
|
|
295
302
|
* @param {Object} [_options] - Command options (reserved)
|
|
296
303
|
* @throws {Error} If listing fails
|
|
297
304
|
*/
|
|
305
|
+
async function fetchAndDisplayApplications(actualControllerUrl, environment, authConfig) {
|
|
306
|
+
const response = await listEnvironmentApplications(actualControllerUrl, environment, authConfig);
|
|
307
|
+
const applications = handleListResponse(response, actualControllerUrl);
|
|
308
|
+
const { applications: controllerApps, excludedCount } = filterControllerApplications(applications);
|
|
309
|
+
displayApplications(controllerApps, environment, actualControllerUrl, excludedCount);
|
|
310
|
+
}
|
|
311
|
+
|
|
298
312
|
async function listApplications(options = {}) {
|
|
299
313
|
const { resolveControllerUrl } = require('../utils/controller-url');
|
|
300
314
|
const { resolveEnvironment } = require('../core/config');
|
|
@@ -318,9 +332,7 @@ async function listApplications(options = {}) {
|
|
|
318
332
|
// Use centralized API client
|
|
319
333
|
const authConfig = { type: 'bearer', token: token };
|
|
320
334
|
try {
|
|
321
|
-
|
|
322
|
-
const applications = handleListResponse(response, actualControllerUrl);
|
|
323
|
-
displayApplications(applications, environment, actualControllerUrl);
|
|
335
|
+
await fetchAndDisplayApplications(actualControllerUrl, environment, authConfig);
|
|
324
336
|
} catch (error) {
|
|
325
337
|
logger.error(formatBlockingError(`Failed to list applications from controller: ${actualControllerUrl}`));
|
|
326
338
|
logger.error(chalk.gray(`Error: ${error.message}`));
|
|
@@ -328,5 +340,5 @@ async function listApplications(options = {}) {
|
|
|
328
340
|
}
|
|
329
341
|
}
|
|
330
342
|
|
|
331
|
-
module.exports = { listApplications };
|
|
343
|
+
module.exports = { listApplications, getListAuthToken };
|
|
332
344
|
|
package/lib/app/run.js
CHANGED
|
@@ -229,7 +229,9 @@ async function resolveRunOptions(appName, appConfig, options, envKey, debug, eff
|
|
|
229
229
|
effectiveEnvironmentScopedResources: Boolean(effectiveEnvironmentScopedResources)
|
|
230
230
|
};
|
|
231
231
|
const builderPath = pathsUtil.getBuilderPath(appName);
|
|
232
|
-
const
|
|
232
|
+
const buildContext = appConfig.build?.context || '.';
|
|
233
|
+
const { resolveSystemAppReloadSourceRoot } = require('../utils/paths-reload-source');
|
|
234
|
+
const codePath = resolveSystemAppReloadSourceRoot(appName, builderPath, buildContext);
|
|
233
235
|
if (options.reload && envKey === 'dev') {
|
|
234
236
|
const remoteSyncPath = appConfig.build?.remoteSyncPath;
|
|
235
237
|
const reloadSummary = await ensureReloadSync(appName, appConfig.developerId, debug, codePath, remoteSyncPath);
|
package/lib/app/show-display.js
CHANGED
|
@@ -14,9 +14,14 @@ const logger = require('../utils/logger');
|
|
|
14
14
|
|
|
15
15
|
function logSourceAndHeader(summary) {
|
|
16
16
|
const isOffline = summary.source === 'offline';
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
let sourceLabel;
|
|
18
|
+
if (isOffline) {
|
|
19
|
+
sourceLabel = `🔴 Source: offline (${summary.path || '—'})`;
|
|
20
|
+
} else if (summary.externalOnly && summary.dataplaneUrl) {
|
|
21
|
+
sourceLabel = `🟢 Source: online (dataplane ${summary.dataplaneUrl})`;
|
|
22
|
+
} else {
|
|
23
|
+
sourceLabel = `🟢 Source: online (${summary.controllerUrl || '—'})`;
|
|
24
|
+
}
|
|
20
25
|
logger.log(sourceLabel);
|
|
21
26
|
logger.log('');
|
|
22
27
|
}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Online show resolution: controller applications vs dataplane connected systems.
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview aifabrix show --online and app show routing
|
|
5
|
+
* @author AI Fabrix Team
|
|
6
|
+
* @version 2.0.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const logger = require('../utils/logger');
|
|
10
|
+
const { getConfig } = require('../core/config');
|
|
11
|
+
const { resolveControllerUrl } = require('../utils/controller-url');
|
|
12
|
+
const { resolveEnvironment } = require('../core/config');
|
|
13
|
+
const { getApplication } = require('../api/applications.api');
|
|
14
|
+
const { resolveDataplaneUrl } = require('../utils/dataplane-resolver');
|
|
15
|
+
const { formatApiError } = require('../utils/api-error-handler');
|
|
16
|
+
const { isControllerExternalApplication } = require('./controller-application-filter');
|
|
17
|
+
const {
|
|
18
|
+
getShowAuthToken,
|
|
19
|
+
buildOnlineSummary,
|
|
20
|
+
fetchExternalSystemFromDataplane,
|
|
21
|
+
enrichExternalShowSummary,
|
|
22
|
+
attachRunDefaultsFromUserConfig,
|
|
23
|
+
attachDeclarativeUrlsToShowApplication,
|
|
24
|
+
outputOnlineJson,
|
|
25
|
+
tryGetLocalManifestSourceForJson
|
|
26
|
+
} = require('./show');
|
|
27
|
+
|
|
28
|
+
async function resolveOnlineAuth(controllerUrl) {
|
|
29
|
+
const config = await getConfig();
|
|
30
|
+
const authResult = await getShowAuthToken(controllerUrl, config);
|
|
31
|
+
return { authConfig: { type: 'bearer', token: authResult.token }, authResult };
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function ensureControllerApplicationResponse(response, appKey, authResult, appsOnly) {
|
|
35
|
+
if (response.success) {
|
|
36
|
+
const app = response.data?.data || response.data || response;
|
|
37
|
+
if (appsOnly && isControllerExternalApplication(app)) {
|
|
38
|
+
throw new Error(
|
|
39
|
+
`"${appKey}" is a connected system, not a controller application. Use: aifabrix show ${appKey} --online`
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
return response.data || response;
|
|
43
|
+
}
|
|
44
|
+
if (response.status === 404) {
|
|
45
|
+
if (appsOnly) {
|
|
46
|
+
throw new Error(`Application "${appKey}" not found on controller.`);
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
const formatted = response.formattedError || formatApiError(response, authResult.actualControllerUrl);
|
|
51
|
+
logger.error(formatted);
|
|
52
|
+
throw new Error('Failed to get application from controller.');
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function buildOnlineSummaryFromDataplane(appKey, controllerUrl, dataplaneUrl, externalSystem) {
|
|
56
|
+
const es = externalSystem && !externalSystem.error ? externalSystem : null;
|
|
57
|
+
const application = {
|
|
58
|
+
key: appKey,
|
|
59
|
+
displayName: es?.displayName || appKey,
|
|
60
|
+
description: es?.application?.description || '—',
|
|
61
|
+
type: 'external',
|
|
62
|
+
status: es?.status || es?.dataplaneStatus || '—',
|
|
63
|
+
version: es?.version || '—',
|
|
64
|
+
deploymentKey: '—',
|
|
65
|
+
image: '—',
|
|
66
|
+
registryMode: '—',
|
|
67
|
+
port: '—',
|
|
68
|
+
healthCheck: '—',
|
|
69
|
+
build: '—',
|
|
70
|
+
roles: es?.application?.roles,
|
|
71
|
+
permissions: es?.application?.permissions
|
|
72
|
+
};
|
|
73
|
+
return {
|
|
74
|
+
source: 'online',
|
|
75
|
+
controllerUrl,
|
|
76
|
+
dataplaneUrl,
|
|
77
|
+
appKey,
|
|
78
|
+
application,
|
|
79
|
+
roles: es?.application?.roles || [],
|
|
80
|
+
permissions: es?.application?.permissions || [],
|
|
81
|
+
authentication: null,
|
|
82
|
+
portalInputConfigurations: [],
|
|
83
|
+
databases: [],
|
|
84
|
+
isExternal: true,
|
|
85
|
+
externalOnly: true,
|
|
86
|
+
externalSystem: es || externalSystem
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
async function finishOnlineShow(summary, appKey, json, permissionsOnly, verifyCert, authBundle) {
|
|
91
|
+
await enrichExternalShowSummary(summary, appKey, verifyCert, authBundle);
|
|
92
|
+
attachRunDefaultsFromUserConfig(summary, appKey, await getConfig());
|
|
93
|
+
await attachDeclarativeUrlsToShowApplication(summary, appKey);
|
|
94
|
+
if (json) {
|
|
95
|
+
const manifestSource = await tryGetLocalManifestSourceForJson(appKey);
|
|
96
|
+
outputOnlineJson(summary, permissionsOnly, manifestSource);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const { display: displayShow } = require('./show-display');
|
|
100
|
+
displayShow(summary, { permissionsOnly: !!permissionsOnly });
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
async function runOnlineFromDataplane(appKey, json, permissionsOnly, verifyCert, authConfig, authResult) {
|
|
104
|
+
const environment = await resolveEnvironment();
|
|
105
|
+
const dataplaneUrl = await resolveDataplaneUrl(authResult.actualControllerUrl, environment, authConfig);
|
|
106
|
+
const externalSystem = await fetchExternalSystemFromDataplane(dataplaneUrl, appKey, authConfig);
|
|
107
|
+
if (!externalSystem || externalSystem.error) {
|
|
108
|
+
throw new Error(
|
|
109
|
+
`"${appKey}" was not found as a controller application or connected system on the dataplane.`
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
const summary = buildOnlineSummaryFromDataplane(
|
|
113
|
+
appKey,
|
|
114
|
+
authResult.actualControllerUrl,
|
|
115
|
+
dataplaneUrl,
|
|
116
|
+
externalSystem
|
|
117
|
+
);
|
|
118
|
+
await finishOnlineShow(summary, appKey, json, permissionsOnly, verifyCert, {
|
|
119
|
+
token: authConfig.token,
|
|
120
|
+
controllerUrl: authResult.actualControllerUrl
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* @param {string} appKey
|
|
126
|
+
* @param {Object} appData
|
|
127
|
+
* @param {Object} authConfig
|
|
128
|
+
* @param {Object} authResult
|
|
129
|
+
* @returns {Promise<Object|null>}
|
|
130
|
+
*/
|
|
131
|
+
async function loadExternalSystemForOnlineShow(appKey, appData, authConfig, authResult) {
|
|
132
|
+
const cfg = appData.configuration && typeof appData.configuration === 'object' ? appData.configuration : {};
|
|
133
|
+
const isExternalApp = appData.type === 'external' || cfg.type === 'external';
|
|
134
|
+
if (!isExternalApp) {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
const environment = await resolveEnvironment();
|
|
138
|
+
const dataplaneUrl = await resolveDataplaneUrl(authResult.actualControllerUrl, environment, authConfig);
|
|
139
|
+
return fetchExternalSystemFromDataplane(dataplaneUrl, appKey, authConfig);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* @param {string} appKey
|
|
144
|
+
* @param {{ json?: boolean, permissionsOnly?: boolean, verifyCert?: boolean, appsOnly?: boolean }} options
|
|
145
|
+
*/
|
|
146
|
+
async function runOnlineShow(appKey, options = {}) {
|
|
147
|
+
const controllerUrl = await resolveControllerUrl();
|
|
148
|
+
if (!controllerUrl) {
|
|
149
|
+
throw new Error('Controller URL is required for --online. Run aifabrix login to set the controller URL in config.yaml.');
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const json = Boolean(options.json);
|
|
153
|
+
const permissionsOnly = Boolean(options.permissionsOnly);
|
|
154
|
+
const verifyCert = Boolean(options.verifyCert);
|
|
155
|
+
const appsOnly = Boolean(options.appsOnly);
|
|
156
|
+
|
|
157
|
+
const { authConfig, authResult } = await resolveOnlineAuth(controllerUrl);
|
|
158
|
+
const response = await getApplication(controllerUrl, appKey, authConfig);
|
|
159
|
+
const apiApp = ensureControllerApplicationResponse(response, appKey, authResult, appsOnly);
|
|
160
|
+
if (!apiApp) {
|
|
161
|
+
await runOnlineFromDataplane(appKey, json, permissionsOnly, verifyCert, authConfig, authResult);
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const appData = apiApp.data || apiApp;
|
|
166
|
+
const externalSystem = await loadExternalSystemForOnlineShow(appKey, appData, authConfig, authResult);
|
|
167
|
+
const summary = buildOnlineSummary(apiApp, authResult.actualControllerUrl, externalSystem);
|
|
168
|
+
await finishOnlineShow(summary, appKey, json, permissionsOnly, verifyCert, {
|
|
169
|
+
token: authConfig.token,
|
|
170
|
+
controllerUrl: authResult.actualControllerUrl
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
module.exports = {
|
|
175
|
+
runOnlineShow,
|
|
176
|
+
buildOnlineSummaryFromDataplane,
|
|
177
|
+
ensureControllerApplicationResponse
|
|
178
|
+
};
|
package/lib/app/show.js
CHANGED
|
@@ -20,16 +20,12 @@ const generator = require('../generator');
|
|
|
20
20
|
const { getConfig, normalizeControllerUrl } = require('../core/config');
|
|
21
21
|
const { getOrRefreshDeviceToken } = require('../utils/token-manager');
|
|
22
22
|
const { resolveControllerUrl } = require('../utils/controller-url');
|
|
23
|
-
const { resolveEnvironment } = require('../core/config');
|
|
24
|
-
const { getApplication } = require('../api/applications.api');
|
|
25
23
|
const {
|
|
26
24
|
getExternalSystem,
|
|
27
25
|
getExternalSystemConfig,
|
|
28
26
|
listOpenAPIFiles,
|
|
29
27
|
listOpenAPIEndpoints
|
|
30
28
|
} = require('../api/external-systems.api');
|
|
31
|
-
const { resolveDataplaneUrl } = require('../utils/dataplane-resolver');
|
|
32
|
-
const { formatApiError } = require('../utils/api-error-handler');
|
|
33
29
|
const { formatAuthenticationError } = require('../utils/error-formatters/http-status-errors');
|
|
34
30
|
const { display: displayShow } = require('./show-display');
|
|
35
31
|
const {
|
|
@@ -790,31 +786,27 @@ async function runOffline(appKey, json, permissionsOnly, verifyCert = false) {
|
|
|
790
786
|
displayShow(summary, { permissionsOnly: !!permissionsOnly });
|
|
791
787
|
}
|
|
792
788
|
|
|
793
|
-
async function
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
return { authConfig: { type: 'bearer', token: authResult.token }, authResult };
|
|
797
|
-
}
|
|
798
|
-
|
|
799
|
-
function ensureApplicationResponse(response, appKey, authResult) {
|
|
800
|
-
if (!response.success) {
|
|
801
|
-
if (response.status === 404) {
|
|
802
|
-
throw new Error(`Application "${appKey}" not found on controller.`);
|
|
803
|
-
}
|
|
804
|
-
const formatted = response.formattedError || formatApiError(response, authResult.actualControllerUrl);
|
|
805
|
-
logger.error(formatted);
|
|
806
|
-
throw new Error('Failed to get application from controller.');
|
|
789
|
+
async function showApp(appKey, options = {}) {
|
|
790
|
+
if (!appKey || typeof appKey !== 'string') {
|
|
791
|
+
throw new Error('appKey is required');
|
|
807
792
|
}
|
|
808
|
-
return response.data || response;
|
|
809
|
-
}
|
|
810
793
|
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
794
|
+
const online = Boolean(options.online);
|
|
795
|
+
const json = Boolean(options.json);
|
|
796
|
+
const permissions = Boolean(options.permissions);
|
|
797
|
+
const verifyCert = Boolean(options.verifyCert);
|
|
798
|
+
const appsOnly = Boolean(options.appsOnly);
|
|
799
|
+
|
|
800
|
+
if (online) {
|
|
801
|
+
const { runOnlineShow } = require('./show-online');
|
|
802
|
+
await runOnlineShow(appKey, {
|
|
803
|
+
json,
|
|
804
|
+
permissionsOnly: permissions,
|
|
805
|
+
verifyCert,
|
|
806
|
+
appsOnly
|
|
807
|
+
});
|
|
808
|
+
} else {
|
|
809
|
+
await runOffline(appKey, json, permissions, verifyCert);
|
|
818
810
|
}
|
|
819
811
|
}
|
|
820
812
|
|
|
@@ -861,6 +853,12 @@ function outputOnlineJson(summary, permissionsOnly, manifestSource) {
|
|
|
861
853
|
if (summary.localRunProfile) {
|
|
862
854
|
out.localRunProfile = summary.localRunProfile;
|
|
863
855
|
}
|
|
856
|
+
if (summary.dataplaneUrl) {
|
|
857
|
+
out.dataplaneUrl = summary.dataplaneUrl;
|
|
858
|
+
}
|
|
859
|
+
if (summary.externalOnly) {
|
|
860
|
+
out.externalOnly = true;
|
|
861
|
+
}
|
|
864
862
|
if (summary.externalSystem !== undefined && summary.externalSystem !== null) {
|
|
865
863
|
out.externalSystem = summary.externalSystem && summary.externalSystem.error
|
|
866
864
|
? { error: summary.externalSystem.error }
|
|
@@ -872,67 +870,11 @@ function outputOnlineJson(summary, permissionsOnly, manifestSource) {
|
|
|
872
870
|
|
|
873
871
|
/**
|
|
874
872
|
* Run show in online mode: getApplication, optionally dataplane for external, display or JSON.
|
|
875
|
-
* @
|
|
876
|
-
* @param {boolean} json - Output as JSON
|
|
877
|
-
* @param {boolean} [permissionsOnly] - When true, output only permissions
|
|
878
|
-
* @param {boolean} [verifyCert] - When true, attempt dataplane verify for external apps
|
|
879
|
-
* @throws {Error} On auth failure, 404, or API error
|
|
873
|
+
* @deprecated Use ./show-online runOnlineShow
|
|
880
874
|
*/
|
|
881
|
-
async function runOnline(appKey, json, permissionsOnly, verifyCert = false) {
|
|
882
|
-
const
|
|
883
|
-
|
|
884
|
-
throw new Error('Controller URL is required for --online. Run aifabrix login to set the controller URL in config.yaml.');
|
|
885
|
-
}
|
|
886
|
-
const { authConfig, authResult } = await resolveOnlineAuth(controllerUrl);
|
|
887
|
-
const response = await getApplication(controllerUrl, appKey, authConfig);
|
|
888
|
-
const apiApp = ensureApplicationResponse(response, appKey, authResult);
|
|
889
|
-
const appData = apiApp.data || apiApp;
|
|
890
|
-
const cfg = appData.configuration && typeof appData.configuration === 'object' ? appData.configuration : {};
|
|
891
|
-
const isExternalApp = appData.type === 'external' || cfg.type === 'external';
|
|
892
|
-
const externalSystem = isExternalApp
|
|
893
|
-
? await fetchExternalSystemForOnline(controllerUrl, appKey, authConfig)
|
|
894
|
-
: null;
|
|
895
|
-
const summary = buildOnlineSummary(apiApp, authResult.actualControllerUrl, externalSystem);
|
|
896
|
-
await enrichExternalShowSummary(summary, appKey, verifyCert, {
|
|
897
|
-
token: authConfig.token,
|
|
898
|
-
controllerUrl: authResult.actualControllerUrl
|
|
899
|
-
});
|
|
900
|
-
attachRunDefaultsFromUserConfig(summary, appKey, await getConfig());
|
|
901
|
-
await attachDeclarativeUrlsToShowApplication(summary, appKey);
|
|
902
|
-
if (json) {
|
|
903
|
-
const manifestSource = await tryGetLocalManifestSourceForJson(appKey);
|
|
904
|
-
outputOnlineJson(summary, permissionsOnly, manifestSource);
|
|
905
|
-
return;
|
|
906
|
-
}
|
|
907
|
-
displayShow(summary, { permissionsOnly: !!permissionsOnly });
|
|
908
|
-
}
|
|
909
|
-
|
|
910
|
-
/**
|
|
911
|
-
* Show application info (offline by default, or from controller with --online).
|
|
912
|
-
* @async
|
|
913
|
-
* @param {string} appKey - Application key
|
|
914
|
-
* @param {Object} options - Options
|
|
915
|
-
* @param {boolean} [options.online] - Fetch from controller
|
|
916
|
-
* @param {boolean} [options.json] - Output as JSON
|
|
917
|
-
* @param {boolean} [options.permissions] - When true, output only permissions (app show --permissions)
|
|
918
|
-
* @param {boolean} [options.verifyCert] - When true, attach dataplane certificate verify rows (external)
|
|
919
|
-
* @throws {Error} If file missing/invalid (offline) or API/auth error (online)
|
|
920
|
-
*/
|
|
921
|
-
async function showApp(appKey, options = {}) {
|
|
922
|
-
if (!appKey || typeof appKey !== 'string') {
|
|
923
|
-
throw new Error('appKey is required');
|
|
924
|
-
}
|
|
925
|
-
|
|
926
|
-
const online = Boolean(options.online);
|
|
927
|
-
const json = Boolean(options.json);
|
|
928
|
-
const permissions = Boolean(options.permissions);
|
|
929
|
-
const verifyCert = Boolean(options.verifyCert);
|
|
930
|
-
|
|
931
|
-
if (online) {
|
|
932
|
-
await runOnline(appKey, json, permissions, verifyCert);
|
|
933
|
-
} else {
|
|
934
|
-
await runOffline(appKey, json, permissions, verifyCert);
|
|
935
|
-
}
|
|
875
|
+
async function runOnline(appKey, json, permissionsOnly, verifyCert = false, appsOnly = false) {
|
|
876
|
+
const { runOnlineShow } = require('./show-online');
|
|
877
|
+
await runOnlineShow(appKey, { json, permissionsOnly, verifyCert, appsOnly });
|
|
936
878
|
}
|
|
937
879
|
|
|
938
880
|
module.exports = {
|
|
@@ -944,5 +886,12 @@ module.exports = {
|
|
|
944
886
|
buildOnlineSummary,
|
|
945
887
|
formatHealthCheckForDisplay,
|
|
946
888
|
formatBuildForDisplay,
|
|
947
|
-
getShowAuthToken
|
|
889
|
+
getShowAuthToken,
|
|
890
|
+
fetchExternalSystemFromDataplane,
|
|
891
|
+
enrichExternalShowSummary,
|
|
892
|
+
attachRunDefaultsFromUserConfig,
|
|
893
|
+
attachDeclarativeUrlsToShowApplication,
|
|
894
|
+
outputOnlineJson,
|
|
895
|
+
tryGetLocalManifestSourceForJson,
|
|
896
|
+
runOnline
|
|
948
897
|
};
|