@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
|
@@ -40,6 +40,8 @@ function buildUnifiedE2eRunOptions(options, timeoutMs, pk) {
|
|
|
40
40
|
minProcessed: options.minProcessed,
|
|
41
41
|
minRecordCount: options.minRecordCount,
|
|
42
42
|
capabilityKey: options.capabilityKey,
|
|
43
|
+
version: options.version,
|
|
44
|
+
syncMode: options.syncMode,
|
|
43
45
|
timeout: timeoutMs,
|
|
44
46
|
sync: options.sync === true,
|
|
45
47
|
force: options.force === true,
|
|
@@ -114,10 +116,13 @@ function resolveE2ePollTimeoutMs(options) {
|
|
|
114
116
|
* @returns {Object}
|
|
115
117
|
*/
|
|
116
118
|
function buildE2eRequestMeta(datasourceKey, options, pk) {
|
|
119
|
+
const includeDebug = includeDebugForRequest(options.debug);
|
|
117
120
|
return {
|
|
118
121
|
datasourceKey,
|
|
119
122
|
runType: 'e2e',
|
|
120
|
-
includeDebug
|
|
123
|
+
includeDebug,
|
|
124
|
+
explainCertification: includeDebug,
|
|
125
|
+
explainMetrics: includeDebug,
|
|
121
126
|
cleanup: options.cleanup,
|
|
122
127
|
runScenarios: options.runScenarios,
|
|
123
128
|
primaryKeyValue: pk !== undefined && pk !== null,
|
|
@@ -53,14 +53,17 @@ async function buildUnifiedValidationBody(params) {
|
|
|
53
53
|
})
|
|
54
54
|
: undefined;
|
|
55
55
|
|
|
56
|
+
const includeDebug = includeDebugForRequest(options.debug);
|
|
56
57
|
const body = buildExternalDataSourceValidationRequest({
|
|
57
58
|
systemKey,
|
|
58
59
|
datasourceKey,
|
|
59
60
|
runType,
|
|
60
61
|
payloadTemplate,
|
|
61
62
|
asyncRun: runType === 'e2e' && useAsync === true,
|
|
62
|
-
includeDebug
|
|
63
|
+
includeDebug,
|
|
63
64
|
explain: options.verbose === true,
|
|
65
|
+
explainCertification: includeDebug,
|
|
66
|
+
explainMetrics: includeDebug,
|
|
64
67
|
e2eOptions: e2eOptions && Object.keys(e2eOptions).length > 0 ? e2eOptions : undefined
|
|
65
68
|
});
|
|
66
69
|
return withStageOnValidationRunBody(body, runType);
|
|
@@ -121,7 +121,7 @@ async function runUnifiedDatasourceValidation(datasourceKey, options) {
|
|
|
121
121
|
|
|
122
122
|
const ctx = await prepareValidationRunContext(datasourceKey, options);
|
|
123
123
|
const useAsync = options.noAsync ? false : options.async !== false;
|
|
124
|
-
const timeoutMs = parseInt(String(options.timeout || '
|
|
124
|
+
const timeoutMs = parseInt(String(options.timeout || '60000'), 10) || 60000;
|
|
125
125
|
const body = await buildUnifiedValidationBody({
|
|
126
126
|
systemKey: ctx.systemKey,
|
|
127
127
|
datasourceKey,
|
|
@@ -24,37 +24,98 @@ function shouldUseDeployPollSpinner() {
|
|
|
24
24
|
*/
|
|
25
25
|
function createDeployPollHandlers(maxAttempts, options = {}) {
|
|
26
26
|
const silent = options && options.silent === true;
|
|
27
|
+
const noop = () => {};
|
|
27
28
|
if (silent) {
|
|
28
29
|
return {
|
|
29
|
-
|
|
30
|
-
|
|
30
|
+
setText: noop,
|
|
31
|
+
onPollProgress: noop,
|
|
32
|
+
onPollWait: noop,
|
|
33
|
+
finish: noop
|
|
31
34
|
};
|
|
32
35
|
}
|
|
33
36
|
if (shouldUseDeployPollSpinner()) {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
spinner
|
|
37
|
-
|
|
37
|
+
let spinner = null;
|
|
38
|
+
const ensureSpinner = (text) => {
|
|
39
|
+
if (!spinner) {
|
|
40
|
+
spinner = ora({
|
|
41
|
+
text,
|
|
42
|
+
spinner: 'dots'
|
|
43
|
+
}).start();
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
spinner.text = text;
|
|
47
|
+
};
|
|
38
48
|
return {
|
|
49
|
+
setText(text) {
|
|
50
|
+
ensureSpinner(text);
|
|
51
|
+
},
|
|
39
52
|
onPollProgress: (deploymentData, attempt, maxA) => {
|
|
40
|
-
|
|
53
|
+
ensureSpinner(buildDeployPollSpinnerText(deploymentData, attempt, maxA));
|
|
54
|
+
},
|
|
55
|
+
onPollWait: (attempt, maxA) => {
|
|
56
|
+
ensureSpinner(buildDeployPollWaitText(attempt, maxA));
|
|
41
57
|
},
|
|
42
58
|
finish: () => {
|
|
43
|
-
spinner
|
|
59
|
+
if (spinner) {
|
|
60
|
+
spinner.stop();
|
|
61
|
+
}
|
|
44
62
|
}
|
|
45
63
|
};
|
|
46
64
|
}
|
|
47
65
|
return {
|
|
66
|
+
setText: noop,
|
|
48
67
|
onPollProgress: (deploymentData, attempt, maxA) => {
|
|
49
|
-
const status = deploymentData
|
|
50
|
-
const progress =
|
|
68
|
+
const status = deploymentData?.status ?? 'pending';
|
|
69
|
+
const progress =
|
|
70
|
+
deploymentData && Number.isFinite(Number(deploymentData.progress))
|
|
71
|
+
? Number(deploymentData.progress)
|
|
72
|
+
: 0;
|
|
51
73
|
logger.log(chalk.gray(`Status: ${status} (${progress}%) (attempt ${attempt + 1}/${maxA})`));
|
|
52
74
|
},
|
|
53
|
-
|
|
75
|
+
onPollWait: noop,
|
|
76
|
+
finish: noop
|
|
54
77
|
};
|
|
55
78
|
}
|
|
56
79
|
|
|
80
|
+
/**
|
|
81
|
+
* Plain progress while awaiting the next status poll (HTTP in flight).
|
|
82
|
+
* @param {number} attempt
|
|
83
|
+
* @param {number} maxAttempts
|
|
84
|
+
* @returns {string}
|
|
85
|
+
*/
|
|
86
|
+
function buildDeployPollWaitText(attempt, maxAttempts) {
|
|
87
|
+
return `Deploying application... Checking status (attempt ${attempt + 1}/${maxAttempts})`;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Run async deploy follow-up work with ora on TTY (post-controller finalize, etc.).
|
|
92
|
+
*
|
|
93
|
+
* @async
|
|
94
|
+
* @param {string} label
|
|
95
|
+
* @param {Function} work
|
|
96
|
+
* @param {{ silent?: boolean }} [opts]
|
|
97
|
+
* @returns {Promise<*>}
|
|
98
|
+
*/
|
|
99
|
+
async function runWithDeployPollSpinner(label, work, opts = {}) {
|
|
100
|
+
if (opts.silent === true) {
|
|
101
|
+
return work();
|
|
102
|
+
}
|
|
103
|
+
if (!shouldUseDeployPollSpinner()) {
|
|
104
|
+
logger.log(chalk.blue(`⏳ ${label}`));
|
|
105
|
+
return work();
|
|
106
|
+
}
|
|
107
|
+
const handlers = createDeployPollHandlers(1, { silent: false });
|
|
108
|
+
handlers.setText(label);
|
|
109
|
+
try {
|
|
110
|
+
return await work();
|
|
111
|
+
} finally {
|
|
112
|
+
handlers.finish();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
57
116
|
module.exports = {
|
|
58
117
|
createDeployPollHandlers,
|
|
59
|
-
shouldUseDeployPollSpinner
|
|
118
|
+
shouldUseDeployPollSpinner,
|
|
119
|
+
buildDeployPollWaitText,
|
|
120
|
+
runWithDeployPollSpinner
|
|
60
121
|
};
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Controller deployment status polling (extracted from deployer.js for file size limits).
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview Deploy pipeline poll loop
|
|
5
|
+
* @author AI Fabrix Team
|
|
6
|
+
* @version 1.0.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const logger = require('../utils/logger');
|
|
12
|
+
const { validateEnvironmentKey } = require('../utils/deployment-validation');
|
|
13
|
+
const { getPipelineDeployment } = require('../api/pipeline.api');
|
|
14
|
+
const {
|
|
15
|
+
convertToPipelineAuthConfig,
|
|
16
|
+
processDeploymentStatusResponse
|
|
17
|
+
} = require('./deployer-status');
|
|
18
|
+
const { resolvePollIntervalFromController } = require('./poll-interval');
|
|
19
|
+
const { createDeployPollHandlers } = require('./deploy-poll-ui');
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Polls deployment status from controller.
|
|
23
|
+
*
|
|
24
|
+
* @async
|
|
25
|
+
* @param {string} deploymentId
|
|
26
|
+
* @param {string} controllerUrl
|
|
27
|
+
* @param {string} envKey
|
|
28
|
+
* @param {Object} authConfig
|
|
29
|
+
* @param {Object} [options]
|
|
30
|
+
* @returns {Promise<Object>}
|
|
31
|
+
*/
|
|
32
|
+
async function pollDeploymentStatus(deploymentId, controllerUrl, envKey, authConfig, options = {}) {
|
|
33
|
+
const interval = options.interval || 5000;
|
|
34
|
+
const maxAttempts = options.maxAttempts || 60;
|
|
35
|
+
|
|
36
|
+
const validatedEnvKey = validateEnvironmentKey(envKey);
|
|
37
|
+
const pipelineAuthConfig = convertToPipelineAuthConfig(authConfig);
|
|
38
|
+
|
|
39
|
+
const onPollProgress = typeof options.onPollProgress === 'function' ? options.onPollProgress : null;
|
|
40
|
+
const onPollWait = typeof options.onPollWait === 'function' ? options.onPollWait : null;
|
|
41
|
+
|
|
42
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
43
|
+
try {
|
|
44
|
+
if (onPollWait) {
|
|
45
|
+
onPollWait(attempt, maxAttempts);
|
|
46
|
+
}
|
|
47
|
+
const response = await getPipelineDeployment(controllerUrl, validatedEnvKey, deploymentId, pipelineAuthConfig);
|
|
48
|
+
const deploymentData = await processDeploymentStatusResponse(
|
|
49
|
+
response,
|
|
50
|
+
attempt,
|
|
51
|
+
maxAttempts,
|
|
52
|
+
interval,
|
|
53
|
+
deploymentId,
|
|
54
|
+
onPollProgress
|
|
55
|
+
);
|
|
56
|
+
if (deploymentData) {
|
|
57
|
+
return deploymentData;
|
|
58
|
+
}
|
|
59
|
+
} catch (error) {
|
|
60
|
+
if (error.message && error.message.includes('not found')) {
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
throw new Error('Deployment timeout: Maximum polling attempts reached');
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** Poll pipeline deployment to terminal status (TTY: ora spinner). */
|
|
71
|
+
async function pollDeployment(result, url, validatedEnvKey, authConfig, options) {
|
|
72
|
+
if (!options.poll || !result.deploymentId) {
|
|
73
|
+
return result;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const resolvedInterval = await resolvePollIntervalFromController(url, options.pollInterval);
|
|
77
|
+
const maxAttempts = options.pollMaxAttempts || 60;
|
|
78
|
+
const ownsPollUi = !options.pollUi;
|
|
79
|
+
const pollUi =
|
|
80
|
+
options.pollUi ||
|
|
81
|
+
createDeployPollHandlers(maxAttempts, { silent: options.silentPoll === true });
|
|
82
|
+
|
|
83
|
+
if (ownsPollUi) {
|
|
84
|
+
logger.log('');
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
try {
|
|
88
|
+
const status = await pollDeploymentStatus(
|
|
89
|
+
result.deploymentId,
|
|
90
|
+
url,
|
|
91
|
+
validatedEnvKey,
|
|
92
|
+
authConfig,
|
|
93
|
+
{
|
|
94
|
+
interval: resolvedInterval,
|
|
95
|
+
maxAttempts,
|
|
96
|
+
onPollProgress: pollUi.onPollProgress,
|
|
97
|
+
onPollWait: pollUi.onPollWait
|
|
98
|
+
}
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
result.status = status;
|
|
102
|
+
return result;
|
|
103
|
+
} finally {
|
|
104
|
+
if (ownsPollUi) {
|
|
105
|
+
pollUi.finish();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
module.exports = {
|
|
111
|
+
pollDeployment,
|
|
112
|
+
pollDeploymentStatus
|
|
113
|
+
};
|
|
@@ -15,16 +15,15 @@ const auditLogger = require('../core/audit-logger');
|
|
|
15
15
|
const logger = require('../utils/logger');
|
|
16
16
|
const { validateControllerUrl, validateEnvironmentKey } = require('../utils/deployment-validation');
|
|
17
17
|
const { handleDeploymentError, handleDeploymentErrors } = require('../utils/deployment-errors');
|
|
18
|
-
const { validatePipeline, deployPipeline
|
|
18
|
+
const { validatePipeline, deployPipeline } = require('../api/pipeline.api');
|
|
19
19
|
const { getAuthUser } = require('../api/auth.api');
|
|
20
20
|
const { handleValidationResponse } = require('../utils/deployment-validation-helpers');
|
|
21
21
|
const {
|
|
22
22
|
convertToPipelineAuthConfig,
|
|
23
|
-
processDeploymentStatusResponse,
|
|
24
23
|
isTokenOnlyPipelineAuth
|
|
25
24
|
} = require('./deployer-status');
|
|
26
|
-
const { resolvePollIntervalFromController } = require('./poll-interval');
|
|
27
25
|
const { createDeployPollHandlers } = require('./deploy-poll-ui');
|
|
26
|
+
const { pollDeployment, pollDeploymentStatus } = require('./deployer-poll-run');
|
|
28
27
|
|
|
29
28
|
/**
|
|
30
29
|
* For external systems, send full manifest (application + inline system + full dataSources).
|
|
@@ -274,52 +273,6 @@ async function sendDeploymentRequest(url, envKey, validateToken, authConfig, opt
|
|
|
274
273
|
throwDeploymentError(lastError, maxRetries);
|
|
275
274
|
}
|
|
276
275
|
|
|
277
|
-
/**
|
|
278
|
-
* Polls deployment status from controller
|
|
279
|
-
* Uses pipeline endpoint for CI/CD monitoring with minimal deployment info
|
|
280
|
-
*
|
|
281
|
-
* @async
|
|
282
|
-
* @param {string} deploymentId - Deployment ID to poll
|
|
283
|
-
* @param {string} controllerUrl - Controller URL
|
|
284
|
-
* @param {string} envKey - Environment key
|
|
285
|
-
* @param {Object} authConfig - Authentication configuration
|
|
286
|
-
* @param {Object} options - Polling options (interval, maxAttempts, etc.)
|
|
287
|
-
* @returns {Promise<Object>} Deployment status
|
|
288
|
-
*/
|
|
289
|
-
async function pollDeploymentStatus(deploymentId, controllerUrl, envKey, authConfig, options = {}) {
|
|
290
|
-
const interval = options.interval || 5000;
|
|
291
|
-
const maxAttempts = options.maxAttempts || 60;
|
|
292
|
-
|
|
293
|
-
const validatedEnvKey = validateEnvironmentKey(envKey);
|
|
294
|
-
const pipelineAuthConfig = convertToPipelineAuthConfig(authConfig);
|
|
295
|
-
|
|
296
|
-
const onPollProgress = typeof options.onPollProgress === 'function' ? options.onPollProgress : null;
|
|
297
|
-
|
|
298
|
-
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
299
|
-
try {
|
|
300
|
-
const response = await getPipelineDeployment(controllerUrl, validatedEnvKey, deploymentId, pipelineAuthConfig);
|
|
301
|
-
const deploymentData = await processDeploymentStatusResponse(
|
|
302
|
-
response,
|
|
303
|
-
attempt,
|
|
304
|
-
maxAttempts,
|
|
305
|
-
interval,
|
|
306
|
-
deploymentId,
|
|
307
|
-
onPollProgress
|
|
308
|
-
);
|
|
309
|
-
if (deploymentData) {
|
|
310
|
-
return deploymentData;
|
|
311
|
-
}
|
|
312
|
-
} catch (error) {
|
|
313
|
-
if (error.message && error.message.includes('not found')) {
|
|
314
|
-
throw error;
|
|
315
|
-
}
|
|
316
|
-
throw error;
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
throw new Error('Deployment timeout: Maximum polling attempts reached');
|
|
321
|
-
}
|
|
322
|
-
|
|
323
276
|
/**
|
|
324
277
|
* When using bearer token only (no client credentials), verify token is valid before deploy.
|
|
325
278
|
* @async
|
|
@@ -378,8 +331,9 @@ async function sendDeployment(url, validatedEnvKey, manifest, authConfig, option
|
|
|
378
331
|
logger.log(metadata(`Draft Deployment ID: ${validateResult.draftDeploymentId}`));
|
|
379
332
|
}
|
|
380
333
|
|
|
381
|
-
|
|
382
|
-
|
|
334
|
+
if (options.pollUi && typeof options.pollUi.setText === 'function') {
|
|
335
|
+
options.pollUi.setText('Submitting deployment to controller...');
|
|
336
|
+
} else if (options.poll === false) {
|
|
383
337
|
logger.log(formatProgress('Deploying application...'));
|
|
384
338
|
}
|
|
385
339
|
const result = await sendDeploymentRequest(url, validatedEnvKey, validateResult.validateToken, authConfig, {
|
|
@@ -395,39 +349,6 @@ async function sendDeployment(url, validatedEnvKey, manifest, authConfig, option
|
|
|
395
349
|
return result;
|
|
396
350
|
}
|
|
397
351
|
|
|
398
|
-
/** Poll pipeline deployment to terminal status (TTY: ora spinner). */
|
|
399
|
-
async function pollDeployment(result, url, validatedEnvKey, authConfig, options) {
|
|
400
|
-
if (!options.poll || !result.deploymentId) {
|
|
401
|
-
return result;
|
|
402
|
-
}
|
|
403
|
-
|
|
404
|
-
// Separate validation/draft block from deploy polling (matches guided CLI spacing)
|
|
405
|
-
logger.log('');
|
|
406
|
-
|
|
407
|
-
const resolvedInterval = await resolvePollIntervalFromController(url, options.pollInterval);
|
|
408
|
-
const maxAttempts = options.pollMaxAttempts || 60;
|
|
409
|
-
const pollUi = createDeployPollHandlers(maxAttempts, { silent: options.silentPoll === true });
|
|
410
|
-
|
|
411
|
-
try {
|
|
412
|
-
const status = await pollDeploymentStatus(
|
|
413
|
-
result.deploymentId,
|
|
414
|
-
url,
|
|
415
|
-
validatedEnvKey,
|
|
416
|
-
authConfig,
|
|
417
|
-
{
|
|
418
|
-
interval: resolvedInterval,
|
|
419
|
-
maxAttempts,
|
|
420
|
-
onPollProgress: pollUi.onPollProgress
|
|
421
|
-
}
|
|
422
|
-
);
|
|
423
|
-
|
|
424
|
-
result.status = status;
|
|
425
|
-
return result;
|
|
426
|
-
} finally {
|
|
427
|
-
pollUi.finish();
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
|
|
431
352
|
/**
|
|
432
353
|
* Deploys application to Miso Controller with authentication
|
|
433
354
|
* Supports both Bearer token and client credentials authentication
|
|
@@ -464,16 +385,25 @@ async function deployToController(manifest, controllerUrl, envKey, authConfig, o
|
|
|
464
385
|
|
|
465
386
|
const pipelineManifest = transformExternalManifestForPipeline(manifest);
|
|
466
387
|
|
|
388
|
+
const usePollUi = options.poll !== false && options.silentPoll !== true;
|
|
389
|
+
const pollUi = usePollUi
|
|
390
|
+
? createDeployPollHandlers(options.pollMaxAttempts || 60, { silent: false })
|
|
391
|
+
: null;
|
|
392
|
+
const deployOpts = pollUi ? { ...options, pollUi } : options;
|
|
393
|
+
|
|
467
394
|
try {
|
|
468
395
|
// Send deployment request
|
|
469
|
-
const result = await sendDeployment(url, validatedEnvKey, pipelineManifest, authConfig,
|
|
396
|
+
const result = await sendDeployment(url, validatedEnvKey, pipelineManifest, authConfig, deployOpts);
|
|
470
397
|
|
|
471
398
|
// Poll for deployment status if enabled
|
|
472
|
-
return await pollDeployment(result, url, validatedEnvKey, authConfig,
|
|
473
|
-
|
|
399
|
+
return await pollDeployment(result, url, validatedEnvKey, authConfig, deployOpts);
|
|
474
400
|
} catch (error) {
|
|
475
401
|
// Use unified error handler (already logged in deployToController, so pass alreadyLogged=true)
|
|
476
402
|
await handleDeploymentErrors(error, manifest.key, url, false);
|
|
403
|
+
} finally {
|
|
404
|
+
if (pollUi) {
|
|
405
|
+
pollUi.finish();
|
|
406
|
+
}
|
|
477
407
|
}
|
|
478
408
|
}
|
|
479
409
|
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Dataplane auth/url resolution for evidence commands.
|
|
3
|
+
* @author AI Fabrix Team
|
|
4
|
+
* @version 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
'use strict';
|
|
8
|
+
|
|
9
|
+
const { resolveProtectionDataplaneContext } = require('../protection/auth-context');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @param {Object} [options]
|
|
13
|
+
* @returns {Promise<{ environment: string, controllerUrl: string, dataplaneUrl: string, authConfig: Object }>}
|
|
14
|
+
*/
|
|
15
|
+
async function resolveEvidenceDataplaneContext(options = {}) {
|
|
16
|
+
return resolveProtectionDataplaneContext(options);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
module.exports = {
|
|
20
|
+
resolveEvidenceDataplaneContext
|
|
21
|
+
};
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview TTY display helpers for evidence commands.
|
|
3
|
+
* @author AI Fabrix Team
|
|
4
|
+
* @version 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
'use strict';
|
|
8
|
+
|
|
9
|
+
const chalk = require('chalk');
|
|
10
|
+
const { formatSuccessLine, headerKeyValue } = require('../utils/cli-layout-chalk');
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @param {string|null|undefined} roleKey
|
|
14
|
+
* @returns {string}
|
|
15
|
+
*/
|
|
16
|
+
function formatScopeLabel(roleKey) {
|
|
17
|
+
return roleKey && String(roleKey).trim() ? String(roleKey).trim() : 'Generic';
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* @param {Object[]} rows
|
|
22
|
+
* @returns {string}
|
|
23
|
+
*/
|
|
24
|
+
function formatEvidenceListTTY(rows) {
|
|
25
|
+
if (!rows.length) {
|
|
26
|
+
return chalk.gray('No evidence rows matched the filters.');
|
|
27
|
+
}
|
|
28
|
+
const lines = rows.map((row) => {
|
|
29
|
+
const scope = formatScopeLabel(row.roleKey);
|
|
30
|
+
return `${chalk.cyan(row.id)} ${row.title} ${chalk.gray(
|
|
31
|
+
`[${row.resourceType} · ${scope} · order ${row.order} · ${row.status}]`
|
|
32
|
+
)}`;
|
|
33
|
+
});
|
|
34
|
+
return `${headerKeyValue('Evidence rows', String(rows.length))}\n${lines.join('\n')}`;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* @param {Object} row
|
|
39
|
+
* @returns {string}
|
|
40
|
+
*/
|
|
41
|
+
function formatEvidenceGetTTY(row) {
|
|
42
|
+
return [
|
|
43
|
+
headerKeyValue('Evidence', row.title),
|
|
44
|
+
` id: ${row.id}`,
|
|
45
|
+
` resourceType: ${row.resourceType}`,
|
|
46
|
+
` scope: ${formatScopeLabel(row.roleKey)}`,
|
|
47
|
+
` order: ${row.order}`,
|
|
48
|
+
` status: ${row.status}`,
|
|
49
|
+
` when: ${row.when}`,
|
|
50
|
+
` expectedBehavior: ${row.expectedBehavior}`
|
|
51
|
+
].join('\n');
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* @param {Object} summary
|
|
56
|
+
* @returns {string}
|
|
57
|
+
*/
|
|
58
|
+
function formatEvidenceLoadSummaryTTY(summary) {
|
|
59
|
+
return formatSuccessLine(
|
|
60
|
+
`Load complete — inserted ${summary.inserted}, updated ${summary.updated}, skipped ${summary.skipped}`
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* @param {Object} summary
|
|
66
|
+
* @returns {string}
|
|
67
|
+
*/
|
|
68
|
+
function formatEvidenceExportSummaryTTY(summary) {
|
|
69
|
+
return formatSuccessLine(`Exported ${summary.count} row(s) to ${summary.file}`);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
module.exports = {
|
|
73
|
+
formatEvidenceListTTY,
|
|
74
|
+
formatEvidenceGetTTY,
|
|
75
|
+
formatEvidenceLoadSummaryTTY,
|
|
76
|
+
formatEvidenceExportSummaryTTY,
|
|
77
|
+
formatScopeLabel
|
|
78
|
+
};
|