@aifabrix/builder 2.49.1 → 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/process/README.md +9 -0
- 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/dev.api.js +1 -0
- 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/host-ops.api.js +69 -0
- 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-path-commands.js +24 -0
- package/lib/cli/setup-dev.js +115 -16
- 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 +64 -61
- 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 +252 -0
- 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 +242 -4
- package/lib/schema/flag-map-validation-run.json +3 -0
- package/lib/schema/type/credential-field-registry.json +2 -2
- package/lib/schema/type/document-storage.json +9 -0
- package/lib/utils/agent-trust-run-display.js +1 -1
- package/lib/utils/app-path-resolve.js +168 -0
- package/lib/utils/authentication-env-template.js +222 -0
- package/lib/utils/cli-sync-options.js +7 -11
- package/lib/utils/cli-utils.js +4 -0
- package/lib/utils/cli-workspace-options.js +29 -0
- package/lib/utils/compose-generate-docker-compose.js +102 -0
- package/lib/utils/configuration-env-resolver.js +203 -27
- package/lib/utils/datasource-test-run-certificate-tty.js +28 -2
- package/lib/utils/datasource-test-run-certification-debug.js +130 -0
- package/lib/utils/datasource-test-run-debug-display.js +2 -0
- package/lib/utils/datasource-test-run-debug-slice.js +7 -0
- package/lib/utils/datasource-test-run-display.js +2 -1
- package/lib/utils/dev-init-ssh-merge.js +165 -23
- package/lib/utils/dev-pin-share-instructions.js +110 -0
- package/lib/utils/dev-ssh-config-helper.js +177 -33
- package/lib/utils/enterprise-knowledge-paths.js +142 -0
- package/lib/utils/env-copy.js +2 -1
- package/lib/utils/env-dotenv-format.js +103 -0
- package/lib/utils/external-env-template.js +4 -1
- package/lib/utils/external-system-display.js +5 -1
- package/lib/utils/external-system-readiness-compact-blocks.js +221 -0
- package/lib/utils/external-system-readiness-compact-display.js +324 -0
- package/lib/utils/external-system-readiness-core.js +16 -0
- package/lib/utils/external-system-readiness-deploy-display.js +29 -11
- package/lib/utils/external-system-readiness-display-internals.js +3 -1
- package/lib/utils/external-system-readiness-display.js +20 -30
- package/lib/utils/external-system-system-test-tty-certification.js +135 -0
- package/lib/utils/external-system-system-test-tty.js +5 -41
- package/lib/utils/help-builder.js +6 -1
- package/lib/utils/host-ops-job-labels.js +236 -0
- package/lib/utils/host-ops-job-result.js +61 -0
- package/lib/utils/host-ops-poll-ui.js +163 -0
- package/lib/utils/integration-path-resolve.js +112 -0
- package/lib/utils/paths-reload-source.js +148 -0
- package/lib/utils/paths-system-builder-keys.js +25 -0
- package/lib/utils/paths.js +151 -26
- package/lib/utils/runtime-configuration-values.js +64 -2
- package/lib/utils/secrets-helpers.js +5 -1
- package/lib/utils/ssh-known-hosts.js +130 -0
- package/lib/utils/test-target-cli-options.js +75 -0
- package/lib/utils/upload-sync-options.js +4 -0
- package/lib/utils/validation-run-request.js +11 -2
- package/lib/validation/external-manifest-validator.js +11 -1
- package/lib/validation/openapi-contract-surface-validator.js +426 -0
- package/lib/validation/openapi-contract-vendor-validation.js +238 -0
- package/lib/validation/validate-external-file.js +160 -0
- package/lib/validation/validate.js +6 -117
- package/package.json +46 -29
- package/packages/builder-api/README.md +120 -0
- package/packages/builder-api/package.json +30 -0
- package/packages/builder-api/src/app.module.ts +7 -0
- package/packages/builder-api/src/auth/auth.module.ts +5 -0
- package/packages/builder-api/src/external-system/external-system.module.ts +5 -0
- package/packages/builder-api/src/main.ts +16 -0
- package/packages/builder-api/tsconfig.json +15 -0
- package/scripts/check-builder-api-architecture-grep.js +79 -0
- package/scripts/docker_image_content_gate.js +47 -0
- package/scripts/docker_image_content_gate.sh +5 -0
- package/scripts/export-builder-api-evidence.js +262 -0
- package/scripts/lib/builder-api-docker-staging-copy.js +60 -0
- package/scripts/lib/builder-api-docker-staging-core.js +183 -0
- package/scripts/lib/docker-image-content-gate-core.js +166 -0
- package/scripts/lib/plan-actor.js +109 -0
- package/scripts/lib/plan-config.js +20 -0
- package/scripts/lib/plan-gates.js +154 -0
- package/scripts/lib/plan-meta.js +104 -0
- package/scripts/lib/plan-parse.js +162 -0
- package/scripts/lib/plan-prevalidate-gates.js +326 -0
- package/scripts/lib/plan-run-core.js +125 -0
- package/scripts/lib/plan-run-report.js +108 -0
- package/scripts/plan-approve.js +24 -0
- package/scripts/plan-archive.js +49 -0
- package/scripts/plan-run.js +13 -0
- package/scripts/plan-set-actor.js +21 -0
- package/scripts/plan-validate.js +80 -0
- package/scripts/pnpm/af.mjs +110 -0
- package/scripts/pnpm/check-quiet.mjs +32 -0
- package/scripts/pnpm/dev-install.mjs +29 -0
- package/scripts/pnpm/dev-reload.mjs +18 -0
- package/scripts/pnpm/help.mjs +55 -0
- package/scripts/pnpm/lib/dev-reload-core.mjs +189 -0
- package/scripts/pnpm/lib/dev-reload-log-capture.mjs +67 -0
- package/scripts/pnpm/lib/dev-reload-log-utils.mjs +32 -0
- package/scripts/pnpm/lib/resolve-aifabrix-bin.mjs +124 -0
- package/scripts/pnpm/lib/resolve-app-url.mjs +183 -0
- package/scripts/pnpm/lib/spinner.mjs +42 -0
- package/scripts/stage_builder_api_for_docker.js +65 -0
- package/scripts/sync-builder-api-template.js +44 -0
- package/templates/README.md +3 -0
- package/templates/applications/builder-api/Dockerfile +38 -0
- package/templates/applications/builder-api/application.yaml +75 -0
- package/templates/applications/builder-api/env.template +48 -0
- package/templates/applications/dataplane/application.yaml +1 -1
- package/templates/applications/dataplane/env.template +10 -6
- package/templates/applications/dataplane/rbac.yaml +21 -1
- package/templates/applications/miso-controller/application.yaml +1 -1
- package/templates/applications/miso-controller/env.template +1 -3
- package/templates/channels/README.md +18 -0
- package/templates/channels/ai-fabrix-icon.jpg +0 -0
- package/templates/channels/chatgpt/install.template.md.hbs +21 -24
- package/templates/channels/chatgpt/integration/README.md +11 -0
- package/templates/channels/chatgpt/integration/application.json +15 -0
- package/templates/channels/chatgpt/integration/chatgpt-system.json +29 -0
- package/templates/channels/chatgpt/integration/env.template +4 -0
- package/templates/channels/microsoft-copilot/install.template.md.hbs +20 -25
- package/templates/channels/microsoft-copilot/integration/README.md +11 -0
- package/templates/channels/microsoft-copilot/integration/application.json +15 -0
- package/templates/channels/microsoft-copilot/integration/env.template +6 -0
- package/templates/channels/microsoft-copilot/integration/microsoft-copilot-system.json +34 -0
- package/templates/channels/slack/install.template.md.hbs +48 -18
- package/templates/channels/slack/integration/README.md +38 -0
- package/templates/channels/slack/integration/application.json +18 -0
- package/templates/channels/slack/integration/env.template +29 -0
- package/templates/channels/slack/integration/slack-datasource-conversations.json +226 -0
- package/templates/channels/slack/integration/slack-datasource-messages.json +269 -0
- package/templates/channels/slack/integration/slack-system.json +86 -0
- package/templates/channels/slack/manifest.template.json.hbs +20 -10
- package/templates/channels/teams-bot/install.template.md.hbs +31 -17
- package/templates/channels/teams-bot/integration/README.md +18 -0
- package/templates/channels/teams-bot/integration/application.json +17 -0
- package/templates/channels/teams-bot/integration/env.template +5 -0
- package/templates/channels/teams-bot/integration/teams-bot-system.json +55 -0
- package/templates/channels/teams-bot/manifest.template.json.hbs +27 -0
- package/templates/channels/web-embed/install.template.md.hbs +16 -26
- package/templates/channels/web-embed/integration/README.md +11 -0
- package/templates/channels/web-embed/integration/application.json +15 -0
- package/templates/channels/web-embed/integration/env.template +4 -0
- package/templates/channels/web-embed/integration/web-embed-system.json +29 -0
- package/templates/openapi/redoc_page.html +86 -0
- package/templates/python/docker-compose.hbs +11 -0
- package/templates/python/requirements.txt +1 -1
- package/templates/typescript/docker-compose.hbs +11 -0
- package/lib/certification/cli-cert-sync-skip.js +0 -21
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Enterprise Knowledge API type definitions
|
|
3
|
+
* @author AI Fabrix Team
|
|
4
|
+
* @version 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @typedef {Object} GenerateManifestSubscription
|
|
9
|
+
* @property {string} key
|
|
10
|
+
* @property {string} [event]
|
|
11
|
+
* @property {Object<string, *>} [filter]
|
|
12
|
+
* @property {Object<string, *>} [task]
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @typedef {Object} GenerateManifestRequest
|
|
17
|
+
* @property {string} domain
|
|
18
|
+
* @property {string} ownerSystemKey
|
|
19
|
+
* @property {string} [displayName]
|
|
20
|
+
* @property {string} [description]
|
|
21
|
+
* @property {GenerateManifestSubscription[]} [subscriptions]
|
|
22
|
+
* @property {string[]} [sourceSystemKeys]
|
|
23
|
+
* @property {string} [version]
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* @typedef {Object} GenerateManifestFinding
|
|
28
|
+
* @property {string} code
|
|
29
|
+
* @property {string} severity
|
|
30
|
+
* @property {string} message
|
|
31
|
+
* @property {Object<string, *>} [context]
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* @typedef {Object} GenerateManifestResponse
|
|
36
|
+
* @property {boolean} previewOnly
|
|
37
|
+
* @property {string} ownerSystemKey
|
|
38
|
+
* @property {Object<string, *>} externalSystem
|
|
39
|
+
* @property {Object<string, *>[]} externalDataSources
|
|
40
|
+
* @property {string} version
|
|
41
|
+
* @property {GenerateManifestFinding[]} compilerFindings
|
|
42
|
+
* @property {GenerateManifestFinding[]} trustFindings
|
|
43
|
+
* @property {string} message
|
|
44
|
+
*/
|
|
45
|
+
|
|
46
|
+
module.exports = {};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview JSDoc types for Evidence Fabrix dataplane API.
|
|
3
|
+
* @author AI Fabrix Team
|
|
4
|
+
* @version 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* @typedef {'active' | 'disabled'} EvidenceStatus
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @typedef {'self' | 'role' | 'roleExceptSelf'} EvidenceApprover
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @typedef {Object} EvidenceApprovalPolicy
|
|
17
|
+
* @property {boolean} required
|
|
18
|
+
* @property {EvidenceApprover} approver
|
|
19
|
+
* @property {string|null} [roleKey]
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* @typedef {Object} EvidenceRow
|
|
24
|
+
* @property {string} id
|
|
25
|
+
* @property {string} resourceType
|
|
26
|
+
* @property {string|null} [roleKey]
|
|
27
|
+
* @property {string} title
|
|
28
|
+
* @property {string|null} [description]
|
|
29
|
+
* @property {string} when
|
|
30
|
+
* @property {string} expectedBehavior
|
|
31
|
+
* @property {number} order
|
|
32
|
+
* @property {EvidenceStatus} status
|
|
33
|
+
* @property {number|null} [generationConfidence]
|
|
34
|
+
* @property {string|null} [suggestionExplanation]
|
|
35
|
+
* @property {EvidenceApprovalPolicy} approval
|
|
36
|
+
* @property {'human' | 'assistant'} createdByType
|
|
37
|
+
* @property {string} createdById
|
|
38
|
+
* @property {string} createdAt
|
|
39
|
+
* @property {string} updatedAt
|
|
40
|
+
*/
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* @typedef {Object} EvidenceCreatePayload
|
|
44
|
+
* @property {string} resourceType
|
|
45
|
+
* @property {string|null} [roleKey]
|
|
46
|
+
* @property {string} title
|
|
47
|
+
* @property {string|null} [description]
|
|
48
|
+
* @property {string} when
|
|
49
|
+
* @property {string} expectedBehavior
|
|
50
|
+
* @property {number|null} [order]
|
|
51
|
+
* @property {EvidenceStatus} [status]
|
|
52
|
+
* @property {EvidenceApprovalPolicy} [approval]
|
|
53
|
+
*/
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* @typedef {Partial<EvidenceCreatePayload>} EvidenceUpdatePayload
|
|
57
|
+
*/
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* @typedef {Object} EvidenceListParams
|
|
61
|
+
* @property {string} [resourceType]
|
|
62
|
+
* @property {string} [roleKey]
|
|
63
|
+
* @property {boolean} [genericOnly]
|
|
64
|
+
* @property {EvidenceStatus} [status]
|
|
65
|
+
*/
|
|
66
|
+
|
|
67
|
+
module.exports = {};
|
|
@@ -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
|
+
};
|