@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
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
|
};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pre-build staging for builder-api Docker images.
|
|
3
|
+
* @fileoverview Runs scripts/stage_builder_api_for_docker.js before docker build
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
'use strict';
|
|
7
|
+
|
|
8
|
+
const fsSync = require('fs');
|
|
9
|
+
const path = require('path');
|
|
10
|
+
const { spawnSync } = require('child_process');
|
|
11
|
+
const logger = require('../utils/logger');
|
|
12
|
+
const { formatProgress, formatSuccessLine } = require('../utils/cli-test-layout-chalk');
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @param {string} contextPath
|
|
16
|
+
* @returns {void}
|
|
17
|
+
*/
|
|
18
|
+
function runBuilderApiDockerStaging(contextPath) {
|
|
19
|
+
const scriptPath = path.join(contextPath, 'scripts/stage_builder_api_for_docker.js');
|
|
20
|
+
if (!fsSync.existsSync(scriptPath)) {
|
|
21
|
+
throw new Error(`Missing builder-api staging script: ${scriptPath}`);
|
|
22
|
+
}
|
|
23
|
+
logger.log(formatProgress('Staging builder-api runtime tree for Docker…'));
|
|
24
|
+
const result = spawnSync(process.execPath, [scriptPath], {
|
|
25
|
+
cwd: contextPath,
|
|
26
|
+
encoding: 'utf8'
|
|
27
|
+
});
|
|
28
|
+
if (result.status !== 0) {
|
|
29
|
+
const detail = (result.stderr || result.stdout || '').trim();
|
|
30
|
+
throw new Error(detail || 'builder-api Docker staging failed');
|
|
31
|
+
}
|
|
32
|
+
logger.log(formatSuccessLine('Builder-api runtime staging ready'));
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @param {string} contextPath
|
|
37
|
+
* @param {string} appName
|
|
38
|
+
* @returns {Promise<void>}
|
|
39
|
+
*/
|
|
40
|
+
async function maybeStageBuilderApiForDockerBuild(contextPath, appName) {
|
|
41
|
+
if (String(appName || '').trim() !== 'builder-api') {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
runBuilderApiDockerStaging(contextPath);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
module.exports = { maybeStageBuilderApiForDockerBuild, runBuilderApiDockerStaging };
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
const { execFileSync } = require('child_process');
|
|
7
|
-
const fs = require('fs');
|
|
8
7
|
const path = require('path');
|
|
8
|
+
const { existsSync } = require('../internal/fs-real-sync');
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* @param {string} repoRoot - aifabrix-miso repo root (Docker build context)
|
|
@@ -16,7 +16,7 @@ function assertMisoControllerNpmSdkDeps(repoRoot) {
|
|
|
16
16
|
repoRoot,
|
|
17
17
|
'packages/miso-controller/scripts/assert-npm-sdk-deps.js'
|
|
18
18
|
);
|
|
19
|
-
if (!
|
|
19
|
+
if (!existsSync(script)) {
|
|
20
20
|
throw new Error(`miso-controller SDK guard not found: ${script}`);
|
|
21
21
|
}
|
|
22
22
|
execFileSync('node', [script], { cwd: repoRoot, stdio: 'inherit' });
|
|
@@ -14,6 +14,7 @@ const { ensureRunSecretsForApp } = require('../app/run-env-compose');
|
|
|
14
14
|
const { formatSuccessParagraph } = require('../utils/cli-test-layout-chalk');
|
|
15
15
|
const { resolveDockerBuildArgsForApp } = require('./docker-build-args');
|
|
16
16
|
const { maybeStageIntegrationForDockerBuild } = require('./integration-docker-staging');
|
|
17
|
+
const { maybeStageBuilderApiForDockerBuild } = require('./builder-api-docker-staging');
|
|
17
18
|
|
|
18
19
|
/**
|
|
19
20
|
* Lazy require breaks circular dependency with lib/build/index.js.
|
|
@@ -70,6 +71,7 @@ async function executeDockerImageBuild(appName, options, buildConfig) {
|
|
|
70
71
|
);
|
|
71
72
|
const contextPath = prepareBuildContext(buildConfig, devDir);
|
|
72
73
|
await maybeStageIntegrationForDockerBuild(contextPath);
|
|
74
|
+
await maybeStageBuilderApiForDockerBuild(contextPath, appName);
|
|
73
75
|
const dockerfilePath = await handleDockerfileGeneration(
|
|
74
76
|
appName,
|
|
75
77
|
{ devDir, buildConfig, contextPath, appConfig },
|
|
@@ -1,44 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview
|
|
2
|
+
* @fileoverview Post-unified-test certification sync (removed — use validate --cert-sync).
|
|
3
3
|
* @author AI Fabrix Team
|
|
4
4
|
* @version 2.0.0
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
'use strict';
|
|
8
8
|
|
|
9
|
-
const chalk = require('chalk');
|
|
10
|
-
const logger = require('../utils/logger');
|
|
11
|
-
const { trySyncCertificationFromDataplaneForExternalApp } = require('./sync-after-external-command');
|
|
12
|
-
const { cliOptsSkipCertSync } = require('./cli-cert-sync-skip');
|
|
13
|
-
const { resolveDebugDisplayMode } = require('../utils/datasource-test-run-debug-display');
|
|
14
|
-
|
|
15
9
|
/**
|
|
16
|
-
*
|
|
17
|
-
* @param {number} exitCode
|
|
18
|
-
* @param {string} datasourceKey
|
|
19
|
-
* @param {Object} options - CLI flags (app, noCertSync)
|
|
20
|
-
* @param {string} label - Log label
|
|
21
|
-
* @param {Object|null} [envelope] - Last DatasourceTestRun (optional); used for certificateIssuance failed hint
|
|
10
|
+
* No-op: local certification block sync is opt-in via `aifabrix validate --cert-sync` only.
|
|
22
11
|
* @returns {Promise<void>}
|
|
23
12
|
*/
|
|
24
|
-
async function afterUnifiedValidationCertSync(
|
|
25
|
-
|
|
26
|
-
try {
|
|
27
|
-
const { resolveAppKeyForDatasource } = require('../datasource/resolve-app');
|
|
28
|
-
const { appKey } = await resolveAppKeyForDatasource(datasourceKey, options.app);
|
|
29
|
-
let issuanceFailureHint = null;
|
|
30
|
-
if (envelope && envelope.certificateIssuance && envelope.certificateIssuance.status === 'failed') {
|
|
31
|
-
const ci = envelope.certificateIssuance;
|
|
32
|
-
issuanceFailureHint = [ci.reasonCode, ci.message].filter(Boolean).join(': ');
|
|
33
|
-
}
|
|
34
|
-
const verboseCertHints = resolveDebugDisplayMode(options.debug) !== null;
|
|
35
|
-
await trySyncCertificationFromDataplaneForExternalApp(appKey, label, {
|
|
36
|
-
issuanceFailureHint,
|
|
37
|
-
verboseCertHints
|
|
38
|
-
});
|
|
39
|
-
} catch (e) {
|
|
40
|
-
logger.log(chalk.yellow(`⚠ Certification sync (${label}) skipped: ${e.message}`));
|
|
41
|
-
}
|
|
13
|
+
async function afterUnifiedValidationCertSync() {
|
|
14
|
+
return undefined;
|
|
42
15
|
}
|
|
43
16
|
|
|
44
17
|
module.exports = { afterUnifiedValidationCertSync };
|
|
@@ -39,7 +39,6 @@ async function trySyncCertificationFromDataplaneForExternalApp(appKey, label, ex
|
|
|
39
39
|
const dsKeys = (manifest.dataSources || []).map((ds) => ds && ds.key).filter(Boolean);
|
|
40
40
|
await maybeSyncSystemCertificationFromDataplane({
|
|
41
41
|
label,
|
|
42
|
-
noCertSync: false,
|
|
43
42
|
systemKey: manifest.key,
|
|
44
43
|
dataplaneUrl,
|
|
45
44
|
authConfig,
|
|
@@ -185,7 +185,6 @@ async function syncSystemCertificationFromDataplane(params) {
|
|
|
185
185
|
* @async
|
|
186
186
|
* @param {Object} params
|
|
187
187
|
* @param {string} [params.label] - e.g. "upload"
|
|
188
|
-
* @param {boolean} [params.noCertSync]
|
|
189
188
|
* @returns {Promise<void>}
|
|
190
189
|
*/
|
|
191
190
|
function logCertificationSyncNotWritten(r, label, verboseCertHints = false) {
|
|
@@ -205,7 +204,6 @@ function logCertificationSyncNotWritten(r, label, verboseCertHints = false) {
|
|
|
205
204
|
async function maybeSyncSystemCertificationFromDataplane(params) {
|
|
206
205
|
const {
|
|
207
206
|
label,
|
|
208
|
-
noCertSync,
|
|
209
207
|
systemKey,
|
|
210
208
|
dataplaneUrl,
|
|
211
209
|
authConfig,
|
|
@@ -214,7 +212,6 @@ async function maybeSyncSystemCertificationFromDataplane(params) {
|
|
|
214
212
|
verboseCertHints,
|
|
215
213
|
silent
|
|
216
214
|
} = params;
|
|
217
|
-
if (noCertSync === true) return;
|
|
218
215
|
try {
|
|
219
216
|
const r = await syncSystemCertificationFromDataplane({
|
|
220
217
|
systemKey,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Orchestrate aifabrix
|
|
2
|
+
* Orchestrate aifabrix channel add (plan 152).
|
|
3
3
|
*
|
|
4
4
|
* @fileoverview Channel install after communication external system deploy
|
|
5
5
|
* @author AI Fabrix Team
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
'use strict';
|
|
10
10
|
|
|
11
11
|
const { getChannelTarget, getDefaultChannelDescription } = require('./channel-targets');
|
|
12
|
+
const { resolveAppDescription } = require('./channel-description');
|
|
12
13
|
const { resolveChannelRuntimeValues } = require('./channel-runtime-resolver');
|
|
13
14
|
const { generateChannelArtifact } = require('./channel-artifact-generator');
|
|
14
15
|
const {
|
|
@@ -27,6 +28,10 @@ const {
|
|
|
27
28
|
const { runChannelProbe } = require('./channel-probe');
|
|
28
29
|
const { resolveChannelAuthContext } = require('./channel-auth-context');
|
|
29
30
|
const { ensureChannelCredential } = require('./channel-credential');
|
|
31
|
+
const {
|
|
32
|
+
buildChannelApprovalGuide,
|
|
33
|
+
resolveApprovalPortalUrl
|
|
34
|
+
} = require('./channel-approval-guide');
|
|
30
35
|
const {
|
|
31
36
|
normalizeBaseChannelName,
|
|
32
37
|
resolveChannelDisplayName
|
|
@@ -40,24 +45,6 @@ const {
|
|
|
40
45
|
/**
|
|
41
46
|
* @param {typeof import('./channel-targets').CHANNEL_TARGETS[string]} target
|
|
42
47
|
* @param {Object} channelExt
|
|
43
|
-
* @param {Object} [context]
|
|
44
|
-
* @returns {string|null}
|
|
45
|
-
*/
|
|
46
|
-
function resolveApprovalUrl(target, channelExt, context = {}) {
|
|
47
|
-
if (!target.approvalRequired) return null;
|
|
48
|
-
if (channelExt?.status === 'installed' || channelExt?.status === 'validated') return null;
|
|
49
|
-
if (target.key === 'slack' && context.artifactPath) {
|
|
50
|
-
return `https://api.slack.com/apps/new — upload manifest: ${context.artifactPath}`;
|
|
51
|
-
}
|
|
52
|
-
if (target.key === 'teams-bot') {
|
|
53
|
-
return 'https://admin.teams.microsoft.com/ — configure Bot Channel Registration for this tenant';
|
|
54
|
-
}
|
|
55
|
-
return `https://platform-admin.example/configure/${target.key}`;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* @param {Object} target
|
|
60
|
-
* @param {Object} channelExt
|
|
61
48
|
* @param {boolean} dryRun
|
|
62
49
|
* @returns {string}
|
|
63
50
|
*/
|
|
@@ -88,7 +75,7 @@ function toValidationDisplay(validation) {
|
|
|
88
75
|
* @returns {Object|null}
|
|
89
76
|
*/
|
|
90
77
|
function showExistingChannelStatus(params) {
|
|
91
|
-
const { existing, options,
|
|
78
|
+
const { existing, options, channelTarget, name, baseName, ctx } = params;
|
|
92
79
|
if (!existing || options.force || options.dryRun) return null;
|
|
93
80
|
const sameInstall =
|
|
94
81
|
(existing.baseName && existing.baseName === baseName) ||
|
|
@@ -99,11 +86,21 @@ function showExistingChannelStatus(params) {
|
|
|
99
86
|
`Use --force to replace with "${name}".`
|
|
100
87
|
);
|
|
101
88
|
}
|
|
89
|
+
const projectRoot = options.projectRoot || process.cwd();
|
|
90
|
+
const approvalGuide =
|
|
91
|
+
existing.status === 'approvalRequired'
|
|
92
|
+
? buildChannelApprovalGuide(channelTarget, {
|
|
93
|
+
projectRoot,
|
|
94
|
+
name: existing.name || name,
|
|
95
|
+
baseName,
|
|
96
|
+
dataplaneBaseUrl: ctx?.dataplaneUrl
|
|
97
|
+
})
|
|
98
|
+
: null;
|
|
102
99
|
displayExistingChannelStatus({
|
|
103
100
|
channelTarget,
|
|
104
101
|
name: existing.name || name,
|
|
105
102
|
channelExt: existing,
|
|
106
|
-
|
|
103
|
+
approvalGuide
|
|
107
104
|
});
|
|
108
105
|
return { skipped: true, channelExt: existing };
|
|
109
106
|
}
|
|
@@ -183,16 +180,17 @@ async function prepareChannelContext(channelTarget, options) {
|
|
|
183
180
|
);
|
|
184
181
|
}
|
|
185
182
|
if (!options.name || typeof options.name !== 'string' || !options.name.trim()) {
|
|
186
|
-
throw new Error('--name is required for
|
|
183
|
+
throw new Error('--name is required for channel add');
|
|
187
184
|
}
|
|
188
185
|
|
|
189
186
|
const baseName = normalizeBaseChannelName(options.name);
|
|
190
187
|
const ctx = await resolveChannelAuthContext(channelTarget, { silent: options.quiet });
|
|
191
188
|
const name = resolveChannelDisplayName(baseName, ctx.environment);
|
|
192
|
-
const
|
|
189
|
+
const rawDescription =
|
|
193
190
|
options.description && String(options.description).trim()
|
|
194
191
|
? String(options.description).trim()
|
|
195
192
|
: getDefaultChannelDescription();
|
|
193
|
+
const description = resolveAppDescription(channelTarget, rawDescription);
|
|
196
194
|
|
|
197
195
|
const system = await fetchCommunicationSystem({
|
|
198
196
|
dataplaneUrl: ctx.dataplaneUrl,
|
|
@@ -219,12 +217,19 @@ async function completeLiveInstall(params) {
|
|
|
219
217
|
|
|
220
218
|
await patchConfigWithAudit(ctx, channelTarget, channelBlock, status, artifact.artifactHash);
|
|
221
219
|
|
|
222
|
-
const
|
|
220
|
+
const projectRoot = options.projectRoot || process.cwd();
|
|
221
|
+
const approvalGuide =
|
|
223
222
|
status === 'approvalRequired'
|
|
224
|
-
?
|
|
223
|
+
? buildChannelApprovalGuide(channelTarget, {
|
|
224
|
+
projectRoot,
|
|
225
|
+
name,
|
|
226
|
+
baseName,
|
|
227
|
+
artifactPath: artifact.outputPath,
|
|
228
|
+
dataplaneBaseUrl: ctx.dataplaneUrl
|
|
229
|
+
})
|
|
225
230
|
: null;
|
|
226
|
-
if (
|
|
227
|
-
auditApprovalRequired(channelTarget, { approvalUrl });
|
|
231
|
+
if (approvalGuide?.portalUrl) {
|
|
232
|
+
auditApprovalRequired(channelTarget, { approvalUrl: approvalGuide.portalUrl });
|
|
228
233
|
}
|
|
229
234
|
|
|
230
235
|
const validation = await maybeRunProbe(ctx, channelBlock, channelTarget, options.probe);
|
|
@@ -239,10 +244,10 @@ async function completeLiveInstall(params) {
|
|
|
239
244
|
artifactPath: artifact.outputPath,
|
|
240
245
|
installGuidePath: artifact.installPath,
|
|
241
246
|
validation: toValidationDisplay(validation),
|
|
242
|
-
|
|
247
|
+
approvalGuide
|
|
243
248
|
});
|
|
244
249
|
|
|
245
|
-
return { channelBlock, artifact, validation,
|
|
250
|
+
return { channelBlock, artifact, validation, approvalGuide };
|
|
246
251
|
}
|
|
247
252
|
|
|
248
253
|
/**
|
|
@@ -277,10 +282,10 @@ async function runAddChannel(channelTarget, options = {}) {
|
|
|
277
282
|
const skipped = showExistingChannelStatus({
|
|
278
283
|
existing,
|
|
279
284
|
options,
|
|
280
|
-
target,
|
|
281
285
|
channelTarget,
|
|
282
286
|
name,
|
|
283
|
-
baseName
|
|
287
|
+
baseName,
|
|
288
|
+
ctx
|
|
284
289
|
});
|
|
285
290
|
if (skipped) return skipped;
|
|
286
291
|
|
|
@@ -291,7 +296,8 @@ async function runAddChannel(channelTarget, options = {}) {
|
|
|
291
296
|
baseName,
|
|
292
297
|
environment: ctx.environment,
|
|
293
298
|
appDescription: description,
|
|
294
|
-
icon: options.icon
|
|
299
|
+
icon: options.icon,
|
|
300
|
+
commandPrefix: options.commandPrefix
|
|
295
301
|
});
|
|
296
302
|
|
|
297
303
|
const projectRoot = options.projectRoot || process.cwd();
|
|
@@ -341,8 +347,8 @@ async function addChannelCommand(channelTarget, options = {}) {
|
|
|
341
347
|
module.exports = {
|
|
342
348
|
runAddChannel,
|
|
343
349
|
addChannelCommand,
|
|
344
|
-
resolveApprovalUrl,
|
|
345
350
|
resolveInstallStatus,
|
|
346
351
|
normalizeBaseChannelName,
|
|
347
|
-
resolveChannelDisplayName
|
|
352
|
+
resolveChannelDisplayName,
|
|
353
|
+
resolveApprovalPortalUrl
|
|
348
354
|
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ChatGPT enterprise channel admin approval steps (plan 152).
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview OpenAI Platform / workspace connector guide
|
|
5
|
+
* @author AI Fabrix Team
|
|
6
|
+
* @version 1.0.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const { formatCredentialPortalStep } = require('./credential-portal');
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @param {Object} ctx
|
|
15
|
+
* @returns {{ portalUrl: string, steps: string[] }}
|
|
16
|
+
*/
|
|
17
|
+
function buildChatGptApprovalGuide(ctx) {
|
|
18
|
+
return {
|
|
19
|
+
portalUrl: 'https://platform.openai.com/',
|
|
20
|
+
steps: [
|
|
21
|
+
'Sign in to OpenAI Platform (https://platform.openai.com/) or your ChatGPT Enterprise workspace admin console.',
|
|
22
|
+
'Create a custom GPT, workspace connector, or MCP integration using the generated manifest (path shown below).',
|
|
23
|
+
'Configure the OpenAPI specification URL and MCP endpoint from INSTALL.md (dataplane ChatGPT routes).',
|
|
24
|
+
'Complete OAuth or API key setup as required by your ChatGPT deployment model.',
|
|
25
|
+
formatCredentialPortalStep(ctx, 'the API key or OAuth client credentials'),
|
|
26
|
+
'Publish the connector to your workspace and complete admin approval if your org requires it.',
|
|
27
|
+
`After ChatGPT lists the connector as active, re-run: ${ctx.resumeCommand}`,
|
|
28
|
+
'Optional: add --probe when dataplane ChatGPT runtime routes are live on your environment.'
|
|
29
|
+
]
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
module.exports = { buildChatGptApprovalGuide };
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dataplane Connected Systems authentication portal URLs (plan 152).
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview Credential UI deep links for channel install guides
|
|
5
|
+
* @author AI Fabrix Team
|
|
6
|
+
* @version 1.0.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const { joinUrl, normalizeBaseUrl } = require('../channel-runtime-resolver');
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @param {string} dataplaneBaseUrl
|
|
15
|
+
* @param {string} channelTarget
|
|
16
|
+
* @returns {string}
|
|
17
|
+
*/
|
|
18
|
+
function buildCredentialPortalUrl(dataplaneBaseUrl, channelTarget) {
|
|
19
|
+
const base = normalizeBaseUrl(dataplaneBaseUrl);
|
|
20
|
+
return joinUrl(base, `/connected-systems/${channelTarget}?tab=authentication`);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @param {Object} ctx
|
|
25
|
+
* @param {string} secretHint - e.g. "the Bot User OAuth Token and Signing Secret"
|
|
26
|
+
* @returns {string}
|
|
27
|
+
*/
|
|
28
|
+
function formatCredentialPortalStep(ctx, secretHint) {
|
|
29
|
+
if (ctx.credentialPortalUrl) {
|
|
30
|
+
return `In AI Fabrix, open ${ctx.credentialPortalUrl} and save ${secretHint}.`;
|
|
31
|
+
}
|
|
32
|
+
return `In AI Fabrix, open Connected Systems → ${ctx.channelTarget} → Authentication and save ${secretHint}.`;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
module.exports = {
|
|
36
|
+
buildCredentialPortalUrl,
|
|
37
|
+
formatCredentialPortalStep
|
|
38
|
+
};
|