@aifabrix/builder 2.49.2 → 2.50.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cursor/rules/deploy-rules/docker-image-ip-policy.mdc +49 -0
- package/.cursor/rules/plan-rules/application-lifecycle.mdc +30 -0
- package/.cursor/rules/plan-rules/plan-frontmatter.mdc +35 -0
- package/.cursor/rules/plan-rules/plan-lifecycle.mdc +31 -0
- package/.cursor/rules/plan-rules/plan-validation-gate.mdc +34 -0
- package/.cursor/skills/README.md +1 -0
- package/.dockerignore +52 -0
- package/.eslintignore +22 -0
- package/README.md +2 -0
- package/bin/builder-api-cleanup.js +26 -0
- package/bin/builder-api-nest.js +10 -0
- package/bin/builder-api-spike.js +19 -0
- package/enterprise-knowledge/README.md +50 -0
- package/enterprise-knowledge/enterprise-integration-lifecycle/README.md +22 -0
- package/enterprise-knowledge/enterprise-integration-lifecycle/application.json +15 -0
- package/enterprise-knowledge/enterprise-integration-lifecycle/deploy.js +69 -0
- package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-deploy.json +52 -0
- package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-system.json +29 -0
- package/enterprise-knowledge/enterprise-integration-lifecycle/env.template +2 -0
- package/integration/README.md +81 -0
- package/integration/github/README.md +53 -0
- package/integration/github/application.json +21 -0
- package/integration/github/deploy.js +72 -0
- package/integration/github/env.template +11 -0
- package/integration/github/github-datasource-issue-comments.json +239 -0
- package/integration/github/github-datasource-issues.json +399 -0
- package/integration/github/github-datasource-repository.json +354 -0
- package/integration/github/github-deploy.json +1202 -0
- package/integration/github/github-system.json +82 -0
- package/integration/hubspot-test/README.md +1 -1
- package/jest.isolated-projects.js +31 -1
- package/jest.projects.js +87 -1
- package/lib/api/dev-server-https.js +1 -1
- package/lib/api/enterprise-knowledge.api.js +63 -0
- package/lib/api/evidence.api.js +172 -0
- package/lib/api/external-systems.api.js +8 -2
- package/lib/api/resource-types.api.js +1 -0
- package/lib/api/types/enterprise-knowledge.types.js +46 -0
- package/lib/api/types/evidence.types.js +67 -0
- package/lib/api/types/resource-types.types.js +2 -0
- package/lib/app/controller-application-filter.js +36 -0
- package/lib/app/deploy.js +1 -1
- package/lib/app/list-external-systems.js +130 -0
- package/lib/app/list.js +20 -8
- package/lib/app/run.js +3 -1
- package/lib/app/show-display.js +8 -3
- package/lib/app/show-online.js +178 -0
- package/lib/app/show.js +37 -88
- package/lib/build/builder-api-docker-staging.js +47 -0
- package/lib/build/miso-controller-npm-sdk-guard.js +2 -2
- package/lib/build/standard-docker-build.js +2 -0
- package/lib/certification/post-unified-cert-sync.js +4 -31
- package/lib/certification/sync-after-external-command.js +0 -1
- package/lib/certification/sync-system-certification.js +0 -3
- package/lib/channels/add-channel.js +40 -34
- package/lib/channels/approval-guides/chatgpt.js +33 -0
- package/lib/channels/approval-guides/credential-portal.js +38 -0
- package/lib/channels/approval-guides/index.js +110 -0
- package/lib/channels/approval-guides/microsoft-copilot.js +34 -0
- package/lib/channels/approval-guides/slack.js +34 -0
- package/lib/channels/approval-guides/teams-bot.js +35 -0
- package/lib/channels/approval-guides/web-embed.js +32 -0
- package/lib/channels/channel-approval-guide.js +11 -0
- package/lib/channels/channel-artifact-generator.js +16 -4
- package/lib/channels/channel-audit.js +3 -0
- package/lib/channels/channel-auth-context.js +1 -1
- package/lib/channels/channel-description.js +59 -0
- package/lib/channels/channel-integration-generator.js +13 -230
- package/lib/channels/channel-integration-template.js +94 -0
- package/lib/channels/channel-runtime-resolver.js +43 -3
- package/lib/channels/channel-status-display.js +66 -26
- package/lib/channels/channel-targets.js +3 -3
- package/lib/cli/index.js +27 -3
- package/lib/cli/infra-guided.js +5 -1
- package/lib/cli/setup-app-external-create.js +111 -0
- package/lib/cli/setup-app.help.js +1 -1
- package/lib/cli/setup-app.js +38 -125
- package/lib/cli/setup-app.test-commands.js +26 -52
- package/lib/cli/setup-certification-commands.js +4 -4
- package/lib/cli/setup-certification.help.js +9 -9
- package/lib/cli/setup-dev.js +7 -2
- package/lib/cli/setup-external-system-help.js +4 -6
- package/lib/cli/setup-external-system.js +58 -52
- package/lib/cli/setup-infra-up-builder-api-action.js +64 -0
- package/lib/cli/setup-infra-up-platform-action.js +3 -1
- package/lib/cli/setup-infra.js +15 -0
- package/lib/cli/setup-list.js +43 -0
- package/lib/cli/setup-utility-repair.js +26 -7
- package/lib/cli/setup-utility.js +5 -3
- package/lib/commands/app.js +15 -43
- package/lib/commands/channel-add-setup.js +110 -0
- package/lib/commands/channel.js +42 -8
- package/lib/commands/datasource-sync-display.js +96 -0
- package/lib/commands/datasource-sync-policy.js +210 -0
- package/lib/commands/datasource-test-trust-cli.js +6 -6
- package/lib/commands/datasource-unified-test-cli.js +2 -1
- package/lib/commands/datasource-unified-test-cli.options.js +33 -23
- package/lib/commands/deploy-gate-failure-details.js +163 -0
- package/lib/commands/deploy-gate-orchestrator.js +322 -0
- package/lib/commands/dev-cli-handlers.js +1 -59
- package/lib/commands/dev-host-ops-params.js +91 -0
- package/lib/commands/dev-host-ops-poll.js +111 -0
- package/lib/commands/dev-host-ops.js +107 -94
- package/lib/commands/dev-init.js +3 -1
- package/lib/commands/enterprise-knowledge.js +284 -0
- package/lib/commands/evidence-cli-leaves.js +250 -0
- package/lib/commands/evidence.js +51 -0
- package/lib/commands/governance-cli-shared.js +2 -2
- package/lib/commands/governance-command-action.js +2 -2
- package/lib/commands/governance-fixture-subjects.js +85 -0
- package/lib/commands/governance.js +1 -1
- package/lib/commands/lifecycle-command-action.js +2 -2
- package/lib/commands/lifecycle-external.js +3 -3
- package/lib/commands/manifest-cli-auth.js +29 -0
- package/lib/commands/manifest-cli-commands.js +170 -0
- package/lib/commands/manifest-cli-integration-path.js +63 -0
- package/lib/commands/manifest.js +21 -0
- package/lib/commands/protection-cli-leaves.js +3 -3
- package/lib/commands/repair-auth-apply.js +15 -1
- package/lib/commands/repair-authentications-454.js +169 -0
- package/lib/commands/repair-capability-openapi-warnings.js +126 -0
- package/lib/commands/repair-datasource-apply.js +135 -0
- package/lib/commands/repair-datasource-auto-rbac.js +62 -1
- package/lib/commands/repair-datasource-http-service-contract.js +239 -0
- package/lib/commands/repair-datasource-operation-security.js +180 -0
- package/lib/commands/repair-datasource-run.js +7 -2
- package/lib/commands/repair-datasource-sync-operations.js +177 -0
- package/lib/commands/repair-datasource-webhooks-sync-bridge.js +133 -0
- package/lib/commands/repair-datasource.js +12 -68
- package/lib/commands/repair-env-template.js +11 -1
- package/lib/commands/repair-external-run.js +121 -31
- package/lib/commands/repair-internal.js +1 -1
- package/lib/commands/repair-openapi-export.js +156 -0
- package/lib/commands/repair-openapi-sync.js +19 -2
- package/lib/commands/repair-orchestration-datasource-split.js +259 -0
- package/lib/commands/repair-persist.js +22 -1
- package/lib/commands/repair-rbac-platform-preset.js +204 -0
- package/lib/commands/repair-rbac-reader-roles.js +191 -0
- package/lib/commands/repair-rbac.js +163 -86
- package/lib/commands/repair-steps.js +83 -18
- package/lib/commands/repair-system-permissions.js +1 -0
- package/lib/commands/repair.js +1 -1
- package/lib/commands/resource-type.js +65 -26
- package/lib/commands/run-post-publish-data-sync.js +68 -0
- package/lib/commands/setup-modes.js +1 -1
- package/lib/commands/test-e2e-external.js +21 -8
- package/lib/commands/test-governance-cli-options.js +2 -2
- package/lib/commands/test-trust-cli-options.js +2 -2
- package/lib/commands/up-builder-api-bootstrap.js +71 -0
- package/lib/commands/up-builder-api-provision.js +241 -0
- package/lib/commands/up-builder-api.js +88 -0
- package/lib/commands/up-common.js +25 -1
- package/lib/commands/upload-credential-push-log.js +117 -0
- package/lib/commands/upload-data-sync-finalize.js +60 -0
- package/lib/commands/upload-probe.js +66 -0
- package/lib/commands/upload-publish-context.js +4 -1
- package/lib/commands/upload-sidecar-followups.js +55 -27
- package/lib/commands/upload.js +116 -157
- package/lib/commands/verify-governance-combined-external.js +1 -1
- package/lib/commands/verify-governance-db.js +2 -2
- package/lib/commands/verify-operations-command-action.js +2 -2
- package/lib/commands/verify-operations-step-plan.js +2 -2
- package/lib/commands/verify-operations-steps.js +2 -2
- package/lib/commands/verify-trust-command-action.js +1 -1
- package/lib/commands/wizard-core.js +1 -1
- package/lib/commands/wizard-headless.js +2 -1
- package/lib/core/admin-secrets.js +2 -6
- package/lib/core/secrets-env-content.js +10 -4
- package/lib/core/secrets-env-write.js +2 -13
- package/lib/datasource/agent-trust-run.js +3 -3
- package/lib/datasource/deploy.js +3 -1
- package/lib/datasource/test-e2e.js +6 -1
- package/lib/datasource/unified-validation-run-body.js +4 -1
- package/lib/datasource/unified-validation-run.js +1 -1
- package/lib/deployment/deploy-poll-ui.js +73 -12
- package/lib/deployment/deployer-poll-run.js +113 -0
- package/lib/deployment/deployer.js +17 -87
- package/lib/evidence/dataplane-context.js +21 -0
- package/lib/evidence/evidence-display.js +78 -0
- package/lib/evidence/evidence-service.js +392 -0
- package/lib/external-system/deploy.js +290 -112
- package/lib/external-system/download.js +7 -3
- package/lib/external-system/test-execution.js +1 -1
- package/lib/external-system/test-system-level.js +8 -10
- package/lib/external-system/test.js +12 -6
- package/lib/generator/deploy-script.js +73 -0
- package/lib/generator/external.js +2 -1
- package/lib/generator/index.js +17 -2
- package/lib/generator/wizard.js +3 -36
- package/lib/internal/fs-real-sync.js +22 -1
- package/lib/internal/node-fs.js +2 -0
- package/lib/lifecycle/lifecycle-governance-options.js +1 -1
- package/lib/lifecycle/verify-step-progress.js +1 -1
- package/lib/programmatic/access-log.js +26 -0
- package/lib/programmatic/auth-config.js +44 -0
- package/lib/programmatic/bearer-auth.js +176 -0
- package/lib/programmatic/builder-api-request.js +175 -0
- package/lib/programmatic/builder-api-route-dispatch.js +82 -0
- package/lib/programmatic/builder-api-runtime-config.js +42 -0
- package/lib/programmatic/builder-api-server.js +230 -0
- package/lib/programmatic/builder-help-authentication-catalog.js +282 -0
- package/lib/programmatic/builder-help-connected-system-ui.js +266 -0
- package/lib/programmatic/builder-help-enterprise-sync-fabrix.js +60 -0
- package/lib/programmatic/builder-help-envelope.js +36 -0
- package/lib/programmatic/builder-help-fixtures.js +200 -0
- package/lib/programmatic/builder-help-governance.js +172 -0
- package/lib/programmatic/builder-help-schema-catalog.js +92 -0
- package/lib/programmatic/builder-help.js +361 -0
- package/lib/programmatic/capability-registry.js +77 -0
- package/lib/programmatic/command-options.js +32 -0
- package/lib/programmatic/enterprise-mcp-client.js +98 -0
- package/lib/programmatic/http-problem-details.js +99 -0
- package/lib/programmatic/http-route-match.js +40 -0
- package/lib/programmatic/idempotency-cache.js +69 -0
- package/lib/programmatic/index.js +53 -0
- package/lib/programmatic/integration-path-scope.js +39 -0
- package/lib/programmatic/log-redaction.js +66 -0
- package/lib/programmatic/manifest-get-section.js +146 -0
- package/lib/programmatic/manifest-patch-section.js +252 -0
- package/lib/programmatic/manifest-repair.js +122 -0
- package/lib/programmatic/manifest-section-dependency-graph.js +160 -0
- package/lib/programmatic/manifest-section-io.js +225 -0
- package/lib/programmatic/manifest-section-quality.js +171 -0
- package/lib/programmatic/manifest-section-registry-data.js +269 -0
- package/lib/programmatic/manifest-section-registry.js +205 -0
- package/lib/programmatic/nest-http-bridge.js +34 -0
- package/lib/programmatic/openapi-component-schemas.js +68 -0
- package/lib/programmatic/openapi-description-enricher.js +117 -0
- package/lib/programmatic/openapi-descriptions.js +190 -0
- package/lib/programmatic/openapi-docs-serving.js +123 -0
- package/lib/programmatic/openapi-help-schemas.js +63 -0
- package/lib/programmatic/openapi-manifest-schemas.js +141 -0
- package/lib/programmatic/openapi-operation-bindings.js +274 -0
- package/lib/programmatic/openapi-request-schemas.js +155 -0
- package/lib/programmatic/openapi-result-schemas.js +476 -0
- package/lib/programmatic/openapi-schema-descriptions-certify.js +139 -0
- package/lib/programmatic/openapi-schema-descriptions-core.js +159 -0
- package/lib/programmatic/openapi-schema-descriptions-help.js +40 -0
- package/lib/programmatic/openapi-schema-descriptions-manifest.js +143 -0
- package/lib/programmatic/openapi-schema-descriptions-mcp.js +118 -0
- package/lib/programmatic/openapi-schema-descriptions-operations.js +281 -0
- package/lib/programmatic/openapi-schema-helpers.js +93 -0
- package/lib/programmatic/openapi-spec.js +203 -0
- package/lib/programmatic/orchestration-openapi-meta.js +159 -0
- package/lib/programmatic/platform-rbac-catalog.js +90 -0
- package/lib/programmatic/request-timeout.js +53 -0
- package/lib/programmatic/route-handler-map.js +143 -0
- package/lib/programmatic/route-handlers-context.js +29 -0
- package/lib/programmatic/route-handlers.js +33 -0
- package/lib/programmatic/run-certify.js +57 -0
- package/lib/programmatic/run-enterprise-mcp.js +32 -0
- package/lib/programmatic/run-lifecycle.js +29 -0
- package/lib/programmatic/run-repair.js +41 -0
- package/lib/programmatic/run-repository-emcp.js +54 -0
- package/lib/programmatic/run-template-workspace.js +61 -0
- package/lib/programmatic/run-test.js +49 -0
- package/lib/programmatic/run-upload.js +63 -0
- package/lib/programmatic/run-validate.js +53 -0
- package/lib/programmatic/run-wizard.js +40 -0
- package/lib/programmatic/system-key.js +48 -0
- package/lib/programmatic/wizard-config-normalize.js +118 -0
- package/lib/programmatic/workspace-cleanup.js +128 -0
- package/lib/programmatic/workspace-context.js +145 -0
- package/lib/programmatic/workspace-lock.js +75 -0
- package/lib/programmatic/workspace-meta.js +64 -0
- package/lib/programmatic/workspace-ops.js +149 -0
- package/lib/protection/run-commands-upload-sync.js +35 -0
- package/lib/protection/run-commands.js +2 -20
- package/lib/protection/upload-batch.js +11 -7
- package/lib/resolvers/resource-type-file.js +22 -0
- package/lib/schema/external-datasource.schema.json +161 -1
- package/lib/schema/external-system.schema.json +244 -118
- package/lib/schema/flag-map-validation-run.json +3 -0
- package/lib/schema/type/credential-field-registry.json +2 -2
- package/lib/schema/type/document-storage.json +9 -0
- package/lib/utils/agent-trust-run-display.js +1 -1
- package/lib/utils/app-path-resolve.js +168 -0
- package/lib/utils/authentication-env-template.js +222 -0
- package/lib/utils/cli-sync-options.js +7 -11
- package/lib/utils/cli-utils.js +4 -0
- package/lib/utils/cli-workspace-options.js +29 -0
- package/lib/utils/compose-generate-docker-compose.js +102 -0
- package/lib/utils/configuration-env-resolver.js +203 -27
- package/lib/utils/datasource-test-run-certificate-tty.js +28 -2
- package/lib/utils/datasource-test-run-certification-debug.js +130 -0
- package/lib/utils/datasource-test-run-debug-display.js +2 -0
- package/lib/utils/datasource-test-run-debug-slice.js +7 -0
- package/lib/utils/datasource-test-run-display.js +2 -1
- package/lib/utils/dev-init-ssh-merge.js +165 -23
- package/lib/utils/dev-pin-share-instructions.js +110 -0
- package/lib/utils/dev-ssh-config-helper.js +177 -33
- package/lib/utils/enterprise-knowledge-paths.js +142 -0
- package/lib/utils/env-copy.js +2 -1
- package/lib/utils/env-dotenv-format.js +103 -0
- package/lib/utils/external-env-template.js +4 -1
- package/lib/utils/external-system-display.js +5 -1
- package/lib/utils/external-system-readiness-compact-blocks.js +221 -0
- package/lib/utils/external-system-readiness-compact-display.js +324 -0
- package/lib/utils/external-system-readiness-core.js +16 -0
- package/lib/utils/external-system-readiness-deploy-display.js +29 -11
- package/lib/utils/external-system-readiness-display-internals.js +3 -1
- package/lib/utils/external-system-readiness-display.js +20 -30
- package/lib/utils/external-system-system-test-tty-certification.js +135 -0
- package/lib/utils/external-system-system-test-tty.js +5 -41
- package/lib/utils/help-builder.js +6 -1
- package/lib/utils/host-ops-job-labels.js +236 -0
- package/lib/utils/host-ops-job-result.js +61 -0
- package/lib/utils/host-ops-poll-ui.js +163 -0
- package/lib/utils/integration-path-resolve.js +112 -0
- package/lib/utils/paths-reload-source.js +148 -0
- package/lib/utils/paths-system-builder-keys.js +25 -0
- package/lib/utils/paths.js +151 -26
- package/lib/utils/runtime-configuration-values.js +64 -2
- package/lib/utils/secrets-helpers.js +5 -1
- package/lib/utils/ssh-known-hosts.js +130 -0
- package/lib/utils/test-target-cli-options.js +75 -0
- package/lib/utils/upload-sync-options.js +4 -0
- package/lib/utils/validation-run-request.js +11 -2
- package/lib/validation/external-manifest-validator.js +11 -1
- package/lib/validation/openapi-contract-surface-validator.js +426 -0
- package/lib/validation/openapi-contract-vendor-validation.js +238 -0
- package/lib/validation/validate-external-file.js +160 -0
- package/lib/validation/validate.js +6 -117
- package/package.json +46 -29
- package/packages/builder-api/README.md +120 -0
- package/packages/builder-api/package.json +30 -0
- package/packages/builder-api/src/app.module.ts +7 -0
- package/packages/builder-api/src/auth/auth.module.ts +5 -0
- package/packages/builder-api/src/external-system/external-system.module.ts +5 -0
- package/packages/builder-api/src/main.ts +16 -0
- package/packages/builder-api/tsconfig.json +15 -0
- package/scripts/check-builder-api-architecture-grep.js +79 -0
- package/scripts/docker_image_content_gate.js +47 -0
- package/scripts/docker_image_content_gate.sh +5 -0
- package/scripts/export-builder-api-evidence.js +262 -0
- package/scripts/lib/builder-api-docker-staging-copy.js +60 -0
- package/scripts/lib/builder-api-docker-staging-core.js +183 -0
- package/scripts/lib/docker-image-content-gate-core.js +166 -0
- package/scripts/lib/plan-actor.js +109 -0
- package/scripts/lib/plan-config.js +20 -0
- package/scripts/lib/plan-gates.js +154 -0
- package/scripts/lib/plan-meta.js +104 -0
- package/scripts/lib/plan-parse.js +162 -0
- package/scripts/lib/plan-prevalidate-gates.js +326 -0
- package/scripts/lib/plan-run-core.js +125 -0
- package/scripts/lib/plan-run-report.js +108 -0
- package/scripts/plan-approve.js +24 -0
- package/scripts/plan-archive.js +49 -0
- package/scripts/plan-run.js +13 -0
- package/scripts/plan-set-actor.js +21 -0
- package/scripts/plan-validate.js +80 -0
- package/scripts/pnpm/af.mjs +110 -0
- package/scripts/pnpm/check-quiet.mjs +32 -0
- package/scripts/pnpm/dev-install.mjs +29 -0
- package/scripts/pnpm/dev-reload.mjs +18 -0
- package/scripts/pnpm/help.mjs +55 -0
- package/scripts/pnpm/lib/dev-reload-core.mjs +189 -0
- package/scripts/pnpm/lib/dev-reload-log-capture.mjs +67 -0
- package/scripts/pnpm/lib/dev-reload-log-utils.mjs +32 -0
- package/scripts/pnpm/lib/resolve-aifabrix-bin.mjs +124 -0
- package/scripts/pnpm/lib/resolve-app-url.mjs +183 -0
- package/scripts/pnpm/lib/spinner.mjs +42 -0
- package/scripts/stage_builder_api_for_docker.js +65 -0
- package/scripts/sync-builder-api-template.js +44 -0
- package/templates/README.md +3 -0
- package/templates/applications/builder-api/Dockerfile +38 -0
- package/templates/applications/builder-api/application.yaml +75 -0
- package/templates/applications/builder-api/env.template +48 -0
- package/templates/applications/dataplane/application.yaml +1 -1
- package/templates/applications/dataplane/env.template +10 -6
- package/templates/applications/dataplane/rbac.yaml +21 -1
- package/templates/applications/miso-controller/application.yaml +1 -1
- package/templates/applications/miso-controller/env.template +1 -3
- package/templates/channels/README.md +18 -0
- package/templates/channels/ai-fabrix-icon.jpg +0 -0
- package/templates/channels/chatgpt/install.template.md.hbs +21 -24
- package/templates/channels/chatgpt/integration/README.md +11 -0
- package/templates/channels/chatgpt/integration/application.json +15 -0
- package/templates/channels/chatgpt/integration/chatgpt-system.json +29 -0
- package/templates/channels/chatgpt/integration/env.template +4 -0
- package/templates/channels/microsoft-copilot/install.template.md.hbs +20 -25
- package/templates/channels/microsoft-copilot/integration/README.md +11 -0
- package/templates/channels/microsoft-copilot/integration/application.json +15 -0
- package/templates/channels/microsoft-copilot/integration/env.template +6 -0
- package/templates/channels/microsoft-copilot/integration/microsoft-copilot-system.json +34 -0
- package/templates/channels/slack/install.template.md.hbs +48 -18
- package/templates/channels/slack/integration/README.md +38 -0
- package/templates/channels/slack/integration/application.json +18 -0
- package/templates/channels/slack/integration/env.template +29 -0
- package/templates/channels/slack/integration/slack-datasource-conversations.json +226 -0
- package/templates/channels/slack/integration/slack-datasource-messages.json +269 -0
- package/templates/channels/slack/integration/slack-system.json +86 -0
- package/templates/channels/slack/manifest.template.json.hbs +20 -10
- package/templates/channels/teams-bot/install.template.md.hbs +31 -17
- package/templates/channels/teams-bot/integration/README.md +18 -0
- package/templates/channels/teams-bot/integration/application.json +17 -0
- package/templates/channels/teams-bot/integration/env.template +5 -0
- package/templates/channels/teams-bot/integration/teams-bot-system.json +55 -0
- package/templates/channels/teams-bot/manifest.template.json.hbs +27 -0
- package/templates/channels/web-embed/install.template.md.hbs +16 -26
- package/templates/channels/web-embed/integration/README.md +11 -0
- package/templates/channels/web-embed/integration/application.json +15 -0
- package/templates/channels/web-embed/integration/env.template +4 -0
- package/templates/channels/web-embed/integration/web-embed-system.json +29 -0
- package/templates/openapi/redoc_page.html +86 -0
- package/templates/python/docker-compose.hbs +11 -0
- package/templates/python/requirements.txt +1 -1
- package/templates/typescript/docker-compose.hbs +11 -0
- package/lib/certification/cli-cert-sync-skip.js +0 -21
|
@@ -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
|
+
};
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Channel approval / go-live guide registry (plan 152).
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview Per-target admin steps for channel add TTY output
|
|
5
|
+
* @author AI Fabrix Team
|
|
6
|
+
* @version 1.0.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const path = require('path');
|
|
12
|
+
const { getArtifactOutputPath } = require('../channel-artifact-generator');
|
|
13
|
+
const { getChannelTarget } = require('../channel-targets');
|
|
14
|
+
const { buildSlackApprovalGuide } = require('./slack');
|
|
15
|
+
const { buildTeamsBotApprovalGuide } = require('./teams-bot');
|
|
16
|
+
const { buildMicrosoftCopilotApprovalGuide } = require('./microsoft-copilot');
|
|
17
|
+
const { buildChatGptApprovalGuide } = require('./chatgpt');
|
|
18
|
+
const { buildWebEmbedInstallGuide } = require('./web-embed');
|
|
19
|
+
const { buildCredentialPortalUrl } = require('./credential-portal');
|
|
20
|
+
|
|
21
|
+
/** @type {Record<string, (ctx: Object) => { portalUrl: string|null, steps: string[] }>} */
|
|
22
|
+
const GUIDE_BUILDERS = {
|
|
23
|
+
slack: buildSlackApprovalGuide,
|
|
24
|
+
'teams-bot': buildTeamsBotApprovalGuide,
|
|
25
|
+
'microsoft-copilot': buildMicrosoftCopilotApprovalGuide,
|
|
26
|
+
chatgpt: buildChatGptApprovalGuide,
|
|
27
|
+
'web-embed': buildWebEmbedInstallGuide
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* @param {string} projectRoot
|
|
32
|
+
* @param {string} channelTarget
|
|
33
|
+
* @param {string} [artifactPath]
|
|
34
|
+
* @returns {string}
|
|
35
|
+
*/
|
|
36
|
+
function resolveArtifactPath(projectRoot, channelTarget, artifactPath) {
|
|
37
|
+
if (artifactPath && String(artifactPath).trim()) {
|
|
38
|
+
return path.resolve(artifactPath);
|
|
39
|
+
}
|
|
40
|
+
return getArtifactOutputPath(projectRoot, channelTarget);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* @param {string} channelTarget
|
|
45
|
+
* @param {string} name
|
|
46
|
+
* @returns {string}
|
|
47
|
+
*/
|
|
48
|
+
function buildResumeCommand(channelTarget, name) {
|
|
49
|
+
return `aifabrix channel add ${channelTarget} --name "${name}"`;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* @param {string} channelTarget
|
|
54
|
+
* @param {Object} [context]
|
|
55
|
+
* @returns {Object}
|
|
56
|
+
*/
|
|
57
|
+
function buildChannelApprovalGuide(channelTarget, context = {}) {
|
|
58
|
+
const target = getChannelTarget(channelTarget);
|
|
59
|
+
const builder = GUIDE_BUILDERS[channelTarget];
|
|
60
|
+
if (!builder) {
|
|
61
|
+
throw new Error(`No approval guide for channel target "${channelTarget}"`);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const projectRoot = context.projectRoot || process.cwd();
|
|
65
|
+
const name = context.name || '';
|
|
66
|
+
const artifactPath = resolveArtifactPath(projectRoot, channelTarget, context.artifactPath);
|
|
67
|
+
const installGuidePath = path.join(path.dirname(artifactPath), 'INSTALL.md');
|
|
68
|
+
const resumeCommand = buildResumeCommand(channelTarget, name);
|
|
69
|
+
const credentialPortalUrl = context.dataplaneBaseUrl
|
|
70
|
+
? buildCredentialPortalUrl(context.dataplaneBaseUrl, channelTarget)
|
|
71
|
+
: null;
|
|
72
|
+
const baseCtx = {
|
|
73
|
+
channelTarget,
|
|
74
|
+
artifactPath,
|
|
75
|
+
resumeCommand,
|
|
76
|
+
credentialKey: target.credentialKey,
|
|
77
|
+
credentialPortalUrl
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
const guide = builder(baseCtx);
|
|
81
|
+
|
|
82
|
+
return {
|
|
83
|
+
channelTarget,
|
|
84
|
+
portalUrl: guide.portalUrl,
|
|
85
|
+
artifactPath,
|
|
86
|
+
installGuidePath,
|
|
87
|
+
resumeCommand,
|
|
88
|
+
credentialKey: target.credentialKey,
|
|
89
|
+
credentialPortalUrl,
|
|
90
|
+
steps: guide.steps,
|
|
91
|
+
approvalRequired: target.approvalRequired === true
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* @param {string} channelTarget
|
|
97
|
+
* @param {Object} [context]
|
|
98
|
+
* @returns {string|null}
|
|
99
|
+
*/
|
|
100
|
+
function resolveApprovalPortalUrl(channelTarget, context = {}) {
|
|
101
|
+
return buildChannelApprovalGuide(channelTarget, context).portalUrl;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
module.exports = {
|
|
105
|
+
GUIDE_BUILDERS,
|
|
106
|
+
buildChannelApprovalGuide,
|
|
107
|
+
resolveApprovalPortalUrl,
|
|
108
|
+
resolveArtifactPath,
|
|
109
|
+
buildResumeCommand
|
|
110
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Microsoft Copilot channel admin approval steps (plan 152).
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview Copilot Studio / M365 admin 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 buildMicrosoftCopilotApprovalGuide(ctx) {
|
|
18
|
+
return {
|
|
19
|
+
portalUrl: 'https://admin.cloud.microsoft.com/',
|
|
20
|
+
steps: [
|
|
21
|
+
'Sign in to Microsoft 365 admin (https://admin.cloud.microsoft.com/) or Copilot Studio as a tenant admin.',
|
|
22
|
+
'Create or open a Copilot extensibility project (declarative agent or API plugin).',
|
|
23
|
+
'Import or configure using the generated manifest artifact (path shown below).',
|
|
24
|
+
'Point the OpenAPI / action endpoints to the URLs in INSTALL.md (dataplane Copilot routes).',
|
|
25
|
+
'Register OAuth client credentials for the API provider connection if the platform prompts for them.',
|
|
26
|
+
formatCredentialPortalStep(ctx, 'the OAuth client ID and client secret'),
|
|
27
|
+
'Submit for M365 admin approval and publish to your organization when review completes.',
|
|
28
|
+
`After Copilot shows the extension as available, re-run: ${ctx.resumeCommand}`,
|
|
29
|
+
'Optional: add --probe when dataplane Copilot runtime routes are live on your environment.'
|
|
30
|
+
]
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
module.exports = { buildMicrosoftCopilotApprovalGuide };
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Slack channel admin approval steps (plan 152).
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview Slack app manifest install 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 buildSlackApprovalGuide(ctx) {
|
|
18
|
+
return {
|
|
19
|
+
portalUrl: 'https://api.slack.com/apps',
|
|
20
|
+
steps: [
|
|
21
|
+
'Open https://api.slack.com/apps and sign in as a Slack workspace admin.',
|
|
22
|
+
'Click Create New App → From an app manifest.',
|
|
23
|
+
'Select your workspace, then paste or upload the Slack app manifest (path shown below).',
|
|
24
|
+
'Review callback URLs and OAuth scopes (pre-filled from AI Fabrix), then create the app.',
|
|
25
|
+
'Open Install App → Install to Workspace and approve the installation.',
|
|
26
|
+
'Copy the Bot User OAuth Token and Signing Secret from the Slack app settings.',
|
|
27
|
+
formatCredentialPortalStep(ctx, 'the Bot User OAuth Token and Signing Secret'),
|
|
28
|
+
`When Slack shows the app as installed, re-run: ${ctx.resumeCommand}`,
|
|
29
|
+
'Optional: add --probe to verify callbacks and the assistant catalog.'
|
|
30
|
+
]
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
module.exports = { buildSlackApprovalGuide };
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Microsoft Teams bot channel admin approval steps (plan 152).
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview Teams Developer Portal + Azure Bot registration 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 buildTeamsBotApprovalGuide(ctx) {
|
|
18
|
+
return {
|
|
19
|
+
portalUrl: 'https://dev.teams.microsoft.com/',
|
|
20
|
+
steps: [
|
|
21
|
+
'Open the Teams Developer Portal (https://dev.teams.microsoft.com/) as a Teams tenant admin.',
|
|
22
|
+
'Create a new app or import the Bot Framework manifest JSON (path shown below).',
|
|
23
|
+
'Set the bot messaging endpoint to the Bot messages URL in INSTALL.md (your dataplane /messages route).',
|
|
24
|
+
'In Azure Portal, register or link the Azure Bot resource and copy the Microsoft App ID.',
|
|
25
|
+
'Create a client secret (or upload certificate) for the bot app registration in Microsoft Entra.',
|
|
26
|
+
'Enable the Microsoft Teams channel on the Azure Bot resource.',
|
|
27
|
+
formatCredentialPortalStep(ctx, 'the Microsoft App ID and client secret'),
|
|
28
|
+
'Publish the app to your org (or sideload for lab) and complete tenant admin approval if prompted.',
|
|
29
|
+
`After the bot is live in Teams, re-run: ${ctx.resumeCommand}`,
|
|
30
|
+
'Optional: add --probe to verify inbound JWT validation and the assistant catalog.'
|
|
31
|
+
]
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
module.exports = { buildTeamsBotApprovalGuide };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web embed channel go-live steps (plan 152) — no platform admin approval.
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview Customer-site embed configuration 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: null, steps: string[] }}
|
|
16
|
+
*/
|
|
17
|
+
function buildWebEmbedInstallGuide(ctx) {
|
|
18
|
+
return {
|
|
19
|
+
portalUrl: null,
|
|
20
|
+
steps: [
|
|
21
|
+
'Review the generated embed configuration JSON (path shown below).',
|
|
22
|
+
'Confirm allowed origins and the embed config URL in INSTALL.md match your customer site.',
|
|
23
|
+
formatCredentialPortalStep(ctx, 'the embed API key'),
|
|
24
|
+
'Add the embed snippet or widget loader to your web application (see INSTALL.md).',
|
|
25
|
+
'No Slack/Teams-style admin approval is required — validate in your browser after deploy.',
|
|
26
|
+
`Re-run: ${ctx.resumeCommand}`,
|
|
27
|
+
'Optional: add --probe to verify the config endpoint and assistant catalog.'
|
|
28
|
+
]
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
module.exports = { buildWebEmbedInstallGuide };
|