@aifabrix/builder 2.49.1 → 2.50.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cursor/process/README.md +9 -0
- package/.cursor/rules/deploy-rules/docker-image-ip-policy.mdc +49 -0
- package/.cursor/rules/plan-rules/application-lifecycle.mdc +30 -0
- package/.cursor/rules/plan-rules/plan-frontmatter.mdc +35 -0
- package/.cursor/rules/plan-rules/plan-lifecycle.mdc +31 -0
- package/.cursor/rules/plan-rules/plan-validation-gate.mdc +34 -0
- package/.cursor/skills/README.md +1 -0
- package/.dockerignore +52 -0
- package/.eslintignore +22 -0
- package/README.md +2 -0
- package/bin/builder-api-cleanup.js +26 -0
- package/bin/builder-api-nest.js +10 -0
- package/bin/builder-api-spike.js +19 -0
- package/enterprise-knowledge/README.md +50 -0
- package/enterprise-knowledge/enterprise-integration-lifecycle/README.md +22 -0
- package/enterprise-knowledge/enterprise-integration-lifecycle/application.json +15 -0
- package/enterprise-knowledge/enterprise-integration-lifecycle/deploy.js +69 -0
- package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-deploy.json +52 -0
- package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-system.json +29 -0
- package/enterprise-knowledge/enterprise-integration-lifecycle/env.template +2 -0
- package/integration/README.md +81 -0
- package/integration/github/README.md +53 -0
- package/integration/github/application.json +21 -0
- package/integration/github/deploy.js +72 -0
- package/integration/github/env.template +11 -0
- package/integration/github/github-datasource-issue-comments.json +239 -0
- package/integration/github/github-datasource-issues.json +399 -0
- package/integration/github/github-datasource-repository.json +354 -0
- package/integration/github/github-deploy.json +1202 -0
- package/integration/github/github-system.json +82 -0
- package/integration/hubspot-test/README.md +1 -1
- package/jest.isolated-projects.js +31 -1
- package/jest.projects.js +87 -1
- package/lib/api/dev-server-https.js +1 -1
- package/lib/api/dev.api.js +1 -0
- package/lib/api/enterprise-knowledge.api.js +63 -0
- package/lib/api/evidence.api.js +172 -0
- package/lib/api/external-systems.api.js +8 -2
- package/lib/api/host-ops.api.js +69 -0
- package/lib/api/resource-types.api.js +1 -0
- package/lib/api/types/enterprise-knowledge.types.js +46 -0
- package/lib/api/types/evidence.types.js +67 -0
- package/lib/api/types/resource-types.types.js +2 -0
- package/lib/app/controller-application-filter.js +36 -0
- package/lib/app/deploy.js +1 -1
- package/lib/app/list-external-systems.js +130 -0
- package/lib/app/list.js +20 -8
- package/lib/app/run.js +3 -1
- package/lib/app/show-display.js +8 -3
- package/lib/app/show-online.js +178 -0
- package/lib/app/show.js +37 -88
- package/lib/build/builder-api-docker-staging.js +47 -0
- package/lib/build/miso-controller-npm-sdk-guard.js +2 -2
- package/lib/build/standard-docker-build.js +2 -0
- package/lib/certification/post-unified-cert-sync.js +4 -31
- package/lib/certification/sync-after-external-command.js +0 -1
- package/lib/certification/sync-system-certification.js +0 -3
- package/lib/channels/add-channel.js +40 -34
- package/lib/channels/approval-guides/chatgpt.js +33 -0
- package/lib/channels/approval-guides/credential-portal.js +38 -0
- package/lib/channels/approval-guides/index.js +110 -0
- package/lib/channels/approval-guides/microsoft-copilot.js +34 -0
- package/lib/channels/approval-guides/slack.js +34 -0
- package/lib/channels/approval-guides/teams-bot.js +35 -0
- package/lib/channels/approval-guides/web-embed.js +32 -0
- package/lib/channels/channel-approval-guide.js +11 -0
- package/lib/channels/channel-artifact-generator.js +16 -4
- package/lib/channels/channel-audit.js +3 -0
- package/lib/channels/channel-auth-context.js +1 -1
- package/lib/channels/channel-description.js +59 -0
- package/lib/channels/channel-integration-generator.js +13 -230
- package/lib/channels/channel-integration-template.js +94 -0
- package/lib/channels/channel-runtime-resolver.js +43 -3
- package/lib/channels/channel-status-display.js +66 -26
- package/lib/channels/channel-targets.js +3 -3
- package/lib/cli/index.js +27 -3
- package/lib/cli/infra-guided.js +5 -1
- package/lib/cli/setup-app-external-create.js +111 -0
- package/lib/cli/setup-app.help.js +1 -1
- package/lib/cli/setup-app.js +38 -125
- package/lib/cli/setup-app.test-commands.js +26 -52
- package/lib/cli/setup-certification-commands.js +4 -4
- package/lib/cli/setup-certification.help.js +9 -9
- package/lib/cli/setup-dev-path-commands.js +24 -0
- package/lib/cli/setup-dev.js +115 -16
- package/lib/cli/setup-external-system-help.js +4 -6
- package/lib/cli/setup-external-system.js +58 -52
- package/lib/cli/setup-infra-up-builder-api-action.js +64 -0
- package/lib/cli/setup-infra-up-platform-action.js +3 -1
- package/lib/cli/setup-infra.js +15 -0
- package/lib/cli/setup-list.js +43 -0
- package/lib/cli/setup-utility-repair.js +26 -7
- package/lib/cli/setup-utility.js +5 -3
- package/lib/commands/app.js +15 -43
- package/lib/commands/channel-add-setup.js +110 -0
- package/lib/commands/channel.js +42 -8
- package/lib/commands/datasource-sync-display.js +96 -0
- package/lib/commands/datasource-sync-policy.js +210 -0
- package/lib/commands/datasource-test-trust-cli.js +6 -6
- package/lib/commands/datasource-unified-test-cli.js +2 -1
- package/lib/commands/datasource-unified-test-cli.options.js +33 -23
- package/lib/commands/deploy-gate-failure-details.js +163 -0
- package/lib/commands/deploy-gate-orchestrator.js +322 -0
- package/lib/commands/dev-cli-handlers.js +64 -61
- package/lib/commands/dev-host-ops-params.js +91 -0
- package/lib/commands/dev-host-ops-poll.js +111 -0
- package/lib/commands/dev-host-ops.js +252 -0
- package/lib/commands/dev-init.js +3 -1
- package/lib/commands/enterprise-knowledge.js +284 -0
- package/lib/commands/evidence-cli-leaves.js +250 -0
- package/lib/commands/evidence.js +51 -0
- package/lib/commands/governance-cli-shared.js +2 -2
- package/lib/commands/governance-command-action.js +2 -2
- package/lib/commands/governance-fixture-subjects.js +85 -0
- package/lib/commands/governance.js +1 -1
- package/lib/commands/lifecycle-command-action.js +2 -2
- package/lib/commands/lifecycle-external.js +3 -3
- package/lib/commands/manifest-cli-auth.js +29 -0
- package/lib/commands/manifest-cli-commands.js +170 -0
- package/lib/commands/manifest-cli-integration-path.js +63 -0
- package/lib/commands/manifest.js +21 -0
- package/lib/commands/protection-cli-leaves.js +3 -3
- package/lib/commands/repair-auth-apply.js +15 -1
- package/lib/commands/repair-authentications-454.js +169 -0
- package/lib/commands/repair-capability-openapi-warnings.js +126 -0
- package/lib/commands/repair-datasource-apply.js +135 -0
- package/lib/commands/repair-datasource-auto-rbac.js +62 -1
- package/lib/commands/repair-datasource-http-service-contract.js +239 -0
- package/lib/commands/repair-datasource-operation-security.js +180 -0
- package/lib/commands/repair-datasource-run.js +7 -2
- package/lib/commands/repair-datasource-sync-operations.js +177 -0
- package/lib/commands/repair-datasource-webhooks-sync-bridge.js +133 -0
- package/lib/commands/repair-datasource.js +12 -68
- package/lib/commands/repair-env-template.js +11 -1
- package/lib/commands/repair-external-run.js +121 -31
- package/lib/commands/repair-internal.js +1 -1
- package/lib/commands/repair-openapi-export.js +156 -0
- package/lib/commands/repair-openapi-sync.js +19 -2
- package/lib/commands/repair-orchestration-datasource-split.js +259 -0
- package/lib/commands/repair-persist.js +22 -1
- package/lib/commands/repair-rbac-platform-preset.js +204 -0
- package/lib/commands/repair-rbac-reader-roles.js +191 -0
- package/lib/commands/repair-rbac.js +163 -86
- package/lib/commands/repair-steps.js +83 -18
- package/lib/commands/repair-system-permissions.js +1 -0
- package/lib/commands/repair.js +1 -1
- package/lib/commands/resource-type.js +65 -26
- package/lib/commands/run-post-publish-data-sync.js +68 -0
- package/lib/commands/setup-modes.js +1 -1
- package/lib/commands/test-e2e-external.js +21 -8
- package/lib/commands/test-governance-cli-options.js +2 -2
- package/lib/commands/test-trust-cli-options.js +2 -2
- package/lib/commands/up-builder-api-bootstrap.js +71 -0
- package/lib/commands/up-builder-api-provision.js +241 -0
- package/lib/commands/up-builder-api.js +88 -0
- package/lib/commands/up-common.js +25 -1
- package/lib/commands/upload-credential-push-log.js +117 -0
- package/lib/commands/upload-data-sync-finalize.js +60 -0
- package/lib/commands/upload-probe.js +66 -0
- package/lib/commands/upload-publish-context.js +4 -1
- package/lib/commands/upload-sidecar-followups.js +55 -27
- package/lib/commands/upload.js +116 -157
- package/lib/commands/verify-governance-combined-external.js +1 -1
- package/lib/commands/verify-governance-db.js +2 -2
- package/lib/commands/verify-operations-command-action.js +2 -2
- package/lib/commands/verify-operations-step-plan.js +2 -2
- package/lib/commands/verify-operations-steps.js +2 -2
- package/lib/commands/verify-trust-command-action.js +1 -1
- package/lib/commands/wizard-core.js +1 -1
- package/lib/commands/wizard-headless.js +2 -1
- package/lib/core/admin-secrets.js +2 -6
- package/lib/core/secrets-env-content.js +10 -4
- package/lib/core/secrets-env-write.js +2 -13
- package/lib/datasource/agent-trust-run.js +3 -3
- package/lib/datasource/deploy.js +3 -1
- package/lib/datasource/test-e2e.js +6 -1
- package/lib/datasource/unified-validation-run-body.js +4 -1
- package/lib/datasource/unified-validation-run.js +1 -1
- package/lib/deployment/deploy-poll-ui.js +73 -12
- package/lib/deployment/deployer-poll-run.js +113 -0
- package/lib/deployment/deployer.js +17 -87
- package/lib/evidence/dataplane-context.js +21 -0
- package/lib/evidence/evidence-display.js +78 -0
- package/lib/evidence/evidence-service.js +392 -0
- package/lib/external-system/deploy.js +290 -112
- package/lib/external-system/download.js +7 -3
- package/lib/external-system/test-execution.js +1 -1
- package/lib/external-system/test-system-level.js +8 -10
- package/lib/external-system/test.js +12 -6
- package/lib/generator/deploy-script.js +73 -0
- package/lib/generator/external.js +2 -1
- package/lib/generator/index.js +17 -2
- package/lib/generator/wizard.js +3 -36
- package/lib/internal/fs-real-sync.js +22 -1
- package/lib/internal/node-fs.js +2 -0
- package/lib/lifecycle/lifecycle-governance-options.js +1 -1
- package/lib/lifecycle/verify-step-progress.js +1 -1
- package/lib/programmatic/access-log.js +26 -0
- package/lib/programmatic/auth-config.js +44 -0
- package/lib/programmatic/bearer-auth.js +176 -0
- package/lib/programmatic/builder-api-request.js +175 -0
- package/lib/programmatic/builder-api-route-dispatch.js +82 -0
- package/lib/programmatic/builder-api-runtime-config.js +42 -0
- package/lib/programmatic/builder-api-server.js +230 -0
- package/lib/programmatic/builder-help-authentication-catalog.js +282 -0
- package/lib/programmatic/builder-help-connected-system-ui.js +266 -0
- package/lib/programmatic/builder-help-enterprise-sync-fabrix.js +60 -0
- package/lib/programmatic/builder-help-envelope.js +36 -0
- package/lib/programmatic/builder-help-fixtures.js +200 -0
- package/lib/programmatic/builder-help-governance.js +172 -0
- package/lib/programmatic/builder-help-schema-catalog.js +92 -0
- package/lib/programmatic/builder-help.js +361 -0
- package/lib/programmatic/capability-registry.js +77 -0
- package/lib/programmatic/command-options.js +32 -0
- package/lib/programmatic/enterprise-mcp-client.js +98 -0
- package/lib/programmatic/http-problem-details.js +99 -0
- package/lib/programmatic/http-route-match.js +40 -0
- package/lib/programmatic/idempotency-cache.js +69 -0
- package/lib/programmatic/index.js +53 -0
- package/lib/programmatic/integration-path-scope.js +39 -0
- package/lib/programmatic/log-redaction.js +66 -0
- package/lib/programmatic/manifest-get-section.js +146 -0
- package/lib/programmatic/manifest-patch-section.js +252 -0
- package/lib/programmatic/manifest-repair.js +122 -0
- package/lib/programmatic/manifest-section-dependency-graph.js +160 -0
- package/lib/programmatic/manifest-section-io.js +225 -0
- package/lib/programmatic/manifest-section-quality.js +171 -0
- package/lib/programmatic/manifest-section-registry-data.js +269 -0
- package/lib/programmatic/manifest-section-registry.js +205 -0
- package/lib/programmatic/nest-http-bridge.js +34 -0
- package/lib/programmatic/openapi-component-schemas.js +68 -0
- package/lib/programmatic/openapi-description-enricher.js +117 -0
- package/lib/programmatic/openapi-descriptions.js +190 -0
- package/lib/programmatic/openapi-docs-serving.js +123 -0
- package/lib/programmatic/openapi-help-schemas.js +63 -0
- package/lib/programmatic/openapi-manifest-schemas.js +141 -0
- package/lib/programmatic/openapi-operation-bindings.js +274 -0
- package/lib/programmatic/openapi-request-schemas.js +155 -0
- package/lib/programmatic/openapi-result-schemas.js +476 -0
- package/lib/programmatic/openapi-schema-descriptions-certify.js +139 -0
- package/lib/programmatic/openapi-schema-descriptions-core.js +159 -0
- package/lib/programmatic/openapi-schema-descriptions-help.js +40 -0
- package/lib/programmatic/openapi-schema-descriptions-manifest.js +143 -0
- package/lib/programmatic/openapi-schema-descriptions-mcp.js +118 -0
- package/lib/programmatic/openapi-schema-descriptions-operations.js +281 -0
- package/lib/programmatic/openapi-schema-helpers.js +93 -0
- package/lib/programmatic/openapi-spec.js +203 -0
- package/lib/programmatic/orchestration-openapi-meta.js +159 -0
- package/lib/programmatic/platform-rbac-catalog.js +90 -0
- package/lib/programmatic/request-timeout.js +53 -0
- package/lib/programmatic/route-handler-map.js +143 -0
- package/lib/programmatic/route-handlers-context.js +29 -0
- package/lib/programmatic/route-handlers.js +33 -0
- package/lib/programmatic/run-certify.js +57 -0
- package/lib/programmatic/run-enterprise-mcp.js +32 -0
- package/lib/programmatic/run-lifecycle.js +29 -0
- package/lib/programmatic/run-repair.js +41 -0
- package/lib/programmatic/run-repository-emcp.js +54 -0
- package/lib/programmatic/run-template-workspace.js +61 -0
- package/lib/programmatic/run-test.js +49 -0
- package/lib/programmatic/run-upload.js +63 -0
- package/lib/programmatic/run-validate.js +53 -0
- package/lib/programmatic/run-wizard.js +40 -0
- package/lib/programmatic/system-key.js +48 -0
- package/lib/programmatic/wizard-config-normalize.js +118 -0
- package/lib/programmatic/workspace-cleanup.js +128 -0
- package/lib/programmatic/workspace-context.js +145 -0
- package/lib/programmatic/workspace-lock.js +75 -0
- package/lib/programmatic/workspace-meta.js +64 -0
- package/lib/programmatic/workspace-ops.js +149 -0
- package/lib/protection/run-commands-upload-sync.js +35 -0
- package/lib/protection/run-commands.js +2 -20
- package/lib/protection/upload-batch.js +11 -7
- package/lib/resolvers/resource-type-file.js +22 -0
- package/lib/schema/external-datasource.schema.json +161 -1
- package/lib/schema/external-system.schema.json +242 -4
- package/lib/schema/flag-map-validation-run.json +3 -0
- package/lib/schema/type/credential-field-registry.json +2 -2
- package/lib/schema/type/document-storage.json +9 -0
- package/lib/utils/agent-trust-run-display.js +1 -1
- package/lib/utils/app-path-resolve.js +168 -0
- package/lib/utils/authentication-env-template.js +222 -0
- package/lib/utils/cli-sync-options.js +7 -11
- package/lib/utils/cli-utils.js +4 -0
- package/lib/utils/cli-workspace-options.js +29 -0
- package/lib/utils/compose-generate-docker-compose.js +102 -0
- package/lib/utils/configuration-env-resolver.js +203 -27
- package/lib/utils/datasource-test-run-certificate-tty.js +28 -2
- package/lib/utils/datasource-test-run-certification-debug.js +130 -0
- package/lib/utils/datasource-test-run-debug-display.js +2 -0
- package/lib/utils/datasource-test-run-debug-slice.js +7 -0
- package/lib/utils/datasource-test-run-display.js +2 -1
- package/lib/utils/dev-init-ssh-merge.js +165 -23
- package/lib/utils/dev-pin-share-instructions.js +110 -0
- package/lib/utils/dev-ssh-config-helper.js +177 -33
- package/lib/utils/enterprise-knowledge-paths.js +142 -0
- package/lib/utils/env-copy.js +2 -1
- package/lib/utils/env-dotenv-format.js +103 -0
- package/lib/utils/external-env-template.js +4 -1
- package/lib/utils/external-system-display.js +5 -1
- package/lib/utils/external-system-readiness-compact-blocks.js +221 -0
- package/lib/utils/external-system-readiness-compact-display.js +324 -0
- package/lib/utils/external-system-readiness-core.js +16 -0
- package/lib/utils/external-system-readiness-deploy-display.js +29 -11
- package/lib/utils/external-system-readiness-display-internals.js +3 -1
- package/lib/utils/external-system-readiness-display.js +20 -30
- package/lib/utils/external-system-system-test-tty-certification.js +135 -0
- package/lib/utils/external-system-system-test-tty.js +5 -41
- package/lib/utils/help-builder.js +6 -1
- package/lib/utils/host-ops-job-labels.js +236 -0
- package/lib/utils/host-ops-job-result.js +61 -0
- package/lib/utils/host-ops-poll-ui.js +163 -0
- package/lib/utils/integration-path-resolve.js +112 -0
- package/lib/utils/paths-reload-source.js +148 -0
- package/lib/utils/paths-system-builder-keys.js +25 -0
- package/lib/utils/paths.js +151 -26
- package/lib/utils/runtime-configuration-values.js +64 -2
- package/lib/utils/secrets-helpers.js +5 -1
- package/lib/utils/ssh-known-hosts.js +130 -0
- package/lib/utils/test-target-cli-options.js +75 -0
- package/lib/utils/upload-sync-options.js +4 -0
- package/lib/utils/validation-run-request.js +11 -2
- package/lib/validation/external-manifest-validator.js +11 -1
- package/lib/validation/openapi-contract-surface-validator.js +426 -0
- package/lib/validation/openapi-contract-vendor-validation.js +238 -0
- package/lib/validation/validate-external-file.js +160 -0
- package/lib/validation/validate.js +6 -117
- package/package.json +46 -29
- package/packages/builder-api/README.md +120 -0
- package/packages/builder-api/package.json +30 -0
- package/packages/builder-api/src/app.module.ts +7 -0
- package/packages/builder-api/src/auth/auth.module.ts +5 -0
- package/packages/builder-api/src/external-system/external-system.module.ts +5 -0
- package/packages/builder-api/src/main.ts +16 -0
- package/packages/builder-api/tsconfig.json +15 -0
- package/scripts/check-builder-api-architecture-grep.js +79 -0
- package/scripts/docker_image_content_gate.js +47 -0
- package/scripts/docker_image_content_gate.sh +5 -0
- package/scripts/export-builder-api-evidence.js +262 -0
- package/scripts/lib/builder-api-docker-staging-copy.js +60 -0
- package/scripts/lib/builder-api-docker-staging-core.js +183 -0
- package/scripts/lib/docker-image-content-gate-core.js +166 -0
- package/scripts/lib/plan-actor.js +109 -0
- package/scripts/lib/plan-config.js +20 -0
- package/scripts/lib/plan-gates.js +154 -0
- package/scripts/lib/plan-meta.js +104 -0
- package/scripts/lib/plan-parse.js +162 -0
- package/scripts/lib/plan-prevalidate-gates.js +326 -0
- package/scripts/lib/plan-run-core.js +125 -0
- package/scripts/lib/plan-run-report.js +108 -0
- package/scripts/plan-approve.js +24 -0
- package/scripts/plan-archive.js +49 -0
- package/scripts/plan-run.js +13 -0
- package/scripts/plan-set-actor.js +21 -0
- package/scripts/plan-validate.js +80 -0
- package/scripts/pnpm/af.mjs +110 -0
- package/scripts/pnpm/check-quiet.mjs +32 -0
- package/scripts/pnpm/dev-install.mjs +29 -0
- package/scripts/pnpm/dev-reload.mjs +18 -0
- package/scripts/pnpm/help.mjs +55 -0
- package/scripts/pnpm/lib/dev-reload-core.mjs +189 -0
- package/scripts/pnpm/lib/dev-reload-log-capture.mjs +67 -0
- package/scripts/pnpm/lib/dev-reload-log-utils.mjs +32 -0
- package/scripts/pnpm/lib/resolve-aifabrix-bin.mjs +124 -0
- package/scripts/pnpm/lib/resolve-app-url.mjs +183 -0
- package/scripts/pnpm/lib/spinner.mjs +42 -0
- package/scripts/stage_builder_api_for_docker.js +65 -0
- package/scripts/sync-builder-api-template.js +44 -0
- package/templates/README.md +3 -0
- package/templates/applications/builder-api/Dockerfile +38 -0
- package/templates/applications/builder-api/application.yaml +75 -0
- package/templates/applications/builder-api/env.template +48 -0
- package/templates/applications/dataplane/application.yaml +1 -1
- package/templates/applications/dataplane/env.template +10 -6
- package/templates/applications/dataplane/rbac.yaml +21 -1
- package/templates/applications/miso-controller/application.yaml +1 -1
- package/templates/applications/miso-controller/env.template +1 -3
- package/templates/channels/README.md +18 -0
- package/templates/channels/ai-fabrix-icon.jpg +0 -0
- package/templates/channels/chatgpt/install.template.md.hbs +21 -24
- package/templates/channels/chatgpt/integration/README.md +11 -0
- package/templates/channels/chatgpt/integration/application.json +15 -0
- package/templates/channels/chatgpt/integration/chatgpt-system.json +29 -0
- package/templates/channels/chatgpt/integration/env.template +4 -0
- package/templates/channels/microsoft-copilot/install.template.md.hbs +20 -25
- package/templates/channels/microsoft-copilot/integration/README.md +11 -0
- package/templates/channels/microsoft-copilot/integration/application.json +15 -0
- package/templates/channels/microsoft-copilot/integration/env.template +6 -0
- package/templates/channels/microsoft-copilot/integration/microsoft-copilot-system.json +34 -0
- package/templates/channels/slack/install.template.md.hbs +48 -18
- package/templates/channels/slack/integration/README.md +38 -0
- package/templates/channels/slack/integration/application.json +18 -0
- package/templates/channels/slack/integration/env.template +29 -0
- package/templates/channels/slack/integration/slack-datasource-conversations.json +226 -0
- package/templates/channels/slack/integration/slack-datasource-messages.json +269 -0
- package/templates/channels/slack/integration/slack-system.json +86 -0
- package/templates/channels/slack/manifest.template.json.hbs +20 -10
- package/templates/channels/teams-bot/install.template.md.hbs +31 -17
- package/templates/channels/teams-bot/integration/README.md +18 -0
- package/templates/channels/teams-bot/integration/application.json +17 -0
- package/templates/channels/teams-bot/integration/env.template +5 -0
- package/templates/channels/teams-bot/integration/teams-bot-system.json +55 -0
- package/templates/channels/teams-bot/manifest.template.json.hbs +27 -0
- package/templates/channels/web-embed/install.template.md.hbs +16 -26
- package/templates/channels/web-embed/integration/README.md +11 -0
- package/templates/channels/web-embed/integration/application.json +15 -0
- package/templates/channels/web-embed/integration/env.template +4 -0
- package/templates/channels/web-embed/integration/web-embed-system.json +29 -0
- package/templates/openapi/redoc_page.html +86 -0
- package/templates/python/docker-compose.hbs +11 -0
- package/templates/python/requirements.txt +1 -1
- package/templates/typescript/docker-compose.hbs +11 -0
- package/lib/certification/cli-cert-sync-skip.js +0 -21
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enterprise Knowledge CLI commands (456.16).
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview enterprise-knowledge generate-manifest
|
|
5
|
+
* @author AI Fabrix Team
|
|
6
|
+
* @version 1.0.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const {
|
|
12
|
+
existsSync,
|
|
13
|
+
readFileSync,
|
|
14
|
+
mkdirSync,
|
|
15
|
+
writeFileSync
|
|
16
|
+
} = require('../internal/fs-real-sync');
|
|
17
|
+
const path = require('path');
|
|
18
|
+
const chalk = require('chalk');
|
|
19
|
+
const logger = require('../utils/logger');
|
|
20
|
+
const { resolveControllerUrl } = require('../utils/controller-url');
|
|
21
|
+
const { resolveDataplaneAndAuth } = require('./upload');
|
|
22
|
+
const { postGenerateManifest } = require('../api/enterprise-knowledge.api');
|
|
23
|
+
const { getEnterpriseKnowledgePath } = require('../utils/enterprise-knowledge-paths');
|
|
24
|
+
const { resolveAppWorkspace } = require('../utils/app-path-resolve');
|
|
25
|
+
const {
|
|
26
|
+
formatBlockingError,
|
|
27
|
+
formatSuccessLine,
|
|
28
|
+
formatWarningLine,
|
|
29
|
+
infoLine,
|
|
30
|
+
headerKeyValue
|
|
31
|
+
} = require('../utils/cli-layout-chalk');
|
|
32
|
+
const { formatApiError } = require('../utils/api-error-handler');
|
|
33
|
+
|
|
34
|
+
const DOMAIN_PATTERN = /^[a-z][a-z0-9-]*$/;
|
|
35
|
+
const GENERATED_DIR = 'generated-service-contracts';
|
|
36
|
+
const DEFAULT_PREVIEW_FILE = 'generate-manifest-preview.json';
|
|
37
|
+
|
|
38
|
+
const ENTERPRISE_KNOWLEDGE_HELP_AFTER = `
|
|
39
|
+
|
|
40
|
+
Examples:
|
|
41
|
+
$ aifabrix enterprise-knowledge generate-manifest --domain sales
|
|
42
|
+
$ aifabrix enterprise-knowledge generate-manifest --domain sales --source-system hubspot-e2e
|
|
43
|
+
$ aifabrix enterprise-knowledge generate-manifest --domain sales --output ./preview.json
|
|
44
|
+
|
|
45
|
+
Per-command help: aifabrix enterprise-knowledge <command> --help
|
|
46
|
+
`;
|
|
47
|
+
|
|
48
|
+
const GENERATE_MANIFEST_HELP_AFTER = `
|
|
49
|
+
|
|
50
|
+
Examples:
|
|
51
|
+
$ aifabrix enterprise-knowledge generate-manifest --domain sales
|
|
52
|
+
$ aifabrix enterprise-knowledge generate-manifest --domain sales --owner-system-key ek-sales
|
|
53
|
+
$ aifabrix enterprise-knowledge generate-manifest --domain sales --source-system vendor-crm --json
|
|
54
|
+
|
|
55
|
+
Preview only — review output before upload (candidate) and deploy.
|
|
56
|
+
|
|
57
|
+
`;
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* @param {string} raw
|
|
61
|
+
* @returns {string}
|
|
62
|
+
*/
|
|
63
|
+
function requireDomain(raw) {
|
|
64
|
+
const domain = String(raw || '').trim().toLowerCase();
|
|
65
|
+
if (!domain) {
|
|
66
|
+
throw new Error('--domain is required.');
|
|
67
|
+
}
|
|
68
|
+
if (!DOMAIN_PATTERN.test(domain)) {
|
|
69
|
+
throw new Error(
|
|
70
|
+
'domain must start with a lowercase letter and contain only lowercase letters, numbers, and hyphens.'
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
return domain;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* @param {string} domain
|
|
78
|
+
* @param {string|undefined|null} raw
|
|
79
|
+
* @returns {string}
|
|
80
|
+
*/
|
|
81
|
+
function resolveOwnerSystemKey(domain, raw) {
|
|
82
|
+
const key = String(raw || '').trim() || `ek-${domain}`;
|
|
83
|
+
if (!/^[a-z0-9-_]+$/.test(key)) {
|
|
84
|
+
throw new Error('owner-system-key must contain only lowercase letters, numbers, hyphens, and underscores.');
|
|
85
|
+
}
|
|
86
|
+
return key;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* @param {string} ownerSystemKey
|
|
91
|
+
* @returns {Object[]}
|
|
92
|
+
*/
|
|
93
|
+
function loadAnchorSubscriptions(ownerSystemKey) {
|
|
94
|
+
try {
|
|
95
|
+
const { appPath } = resolveAppWorkspace(ownerSystemKey, {
|
|
96
|
+
workspace: 'enterprise-knowledge'
|
|
97
|
+
});
|
|
98
|
+
const systemFile = path.join(appPath, `${ownerSystemKey}-system.json`);
|
|
99
|
+
if (!existsSync(systemFile)) {
|
|
100
|
+
return [];
|
|
101
|
+
}
|
|
102
|
+
const raw = JSON.parse(readFileSync(systemFile, 'utf8'));
|
|
103
|
+
return Array.isArray(raw.subscriptions) ? raw.subscriptions : [];
|
|
104
|
+
} catch {
|
|
105
|
+
return [];
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* @param {Object} options
|
|
111
|
+
* @param {string} domain
|
|
112
|
+
* @param {string} ownerSystemKey
|
|
113
|
+
* @returns {import('../api/types/enterprise-knowledge.types').GenerateManifestRequest}
|
|
114
|
+
*/
|
|
115
|
+
function buildGenerateManifestRequest(options, domain, ownerSystemKey) {
|
|
116
|
+
if (options.file) {
|
|
117
|
+
const filePath = path.resolve(String(options.file));
|
|
118
|
+
if (!existsSync(filePath)) {
|
|
119
|
+
throw new Error(`File not found: ${filePath}`);
|
|
120
|
+
}
|
|
121
|
+
const parsed = JSON.parse(readFileSync(filePath, 'utf8'));
|
|
122
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
123
|
+
throw new Error('Request file must be a JSON object.');
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
domain: requireDomain(parsed.domain || domain),
|
|
127
|
+
ownerSystemKey: resolveOwnerSystemKey(domain, parsed.ownerSystemKey || ownerSystemKey),
|
|
128
|
+
displayName: parsed.displayName,
|
|
129
|
+
description: parsed.description,
|
|
130
|
+
subscriptions: Array.isArray(parsed.subscriptions) ? parsed.subscriptions : [],
|
|
131
|
+
sourceSystemKeys: Array.isArray(parsed.sourceSystemKeys) ? parsed.sourceSystemKeys : [],
|
|
132
|
+
version: parsed.version
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const sourceKeys = [];
|
|
137
|
+
if (Array.isArray(options.sourceSystem)) {
|
|
138
|
+
sourceKeys.push(...options.sourceSystem.map((k) => String(k).trim()).filter(Boolean));
|
|
139
|
+
} else if (typeof options.sourceSystem === 'string' && options.sourceSystem.trim()) {
|
|
140
|
+
sourceKeys.push(options.sourceSystem.trim());
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const subscriptions = loadAnchorSubscriptions(ownerSystemKey);
|
|
144
|
+
const title = domain.replace(/-/g, ' ').replace(/\b\w/g, (c) => c.toUpperCase());
|
|
145
|
+
|
|
146
|
+
return {
|
|
147
|
+
domain,
|
|
148
|
+
ownerSystemKey,
|
|
149
|
+
displayName: options.displayName || `Enterprise Knowledge — ${title}`,
|
|
150
|
+
description:
|
|
151
|
+
options.description ||
|
|
152
|
+
`Domain enterprise-knowledge preview for ${domain}. Human approval required before upload.`,
|
|
153
|
+
subscriptions,
|
|
154
|
+
sourceSystemKeys: sourceKeys,
|
|
155
|
+
version: options.version || '1.0.0'
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* @param {string} ownerSystemKey
|
|
161
|
+
* @param {string|undefined|null} outputOption
|
|
162
|
+
* @returns {string}
|
|
163
|
+
*/
|
|
164
|
+
function resolveOutputPath(ownerSystemKey, outputOption) {
|
|
165
|
+
if (outputOption) {
|
|
166
|
+
return path.resolve(String(outputOption));
|
|
167
|
+
}
|
|
168
|
+
const anchorDir = getEnterpriseKnowledgePath(ownerSystemKey);
|
|
169
|
+
return path.join(anchorDir, GENERATED_DIR, DEFAULT_PREVIEW_FILE);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* @param {import('../api/types/enterprise-knowledge.types').GenerateManifestResponse} preview
|
|
174
|
+
* @returns {void}
|
|
175
|
+
*/
|
|
176
|
+
function logPreviewSummary(preview) {
|
|
177
|
+
headerKeyValue('Enterprise Knowledge manifest preview', preview.ownerSystemKey);
|
|
178
|
+
infoLine('Status', preview.previewOnly ? 'preview only (not published)' : 'unexpected');
|
|
179
|
+
infoLine('Version', preview.version || '1.0.0');
|
|
180
|
+
infoLine('Generated datasources', String((preview.externalDataSources || []).length));
|
|
181
|
+
const compilerCount = (preview.compilerFindings || []).length;
|
|
182
|
+
const trustCount = (preview.trustFindings || []).length;
|
|
183
|
+
if (compilerCount > 0) {
|
|
184
|
+
formatWarningLine(`${compilerCount} compiler finding(s) require review`);
|
|
185
|
+
}
|
|
186
|
+
if (trustCount > 0) {
|
|
187
|
+
formatWarningLine(`${trustCount} trust finding(s) require review`);
|
|
188
|
+
}
|
|
189
|
+
if (preview.message) {
|
|
190
|
+
logger.log(chalk.gray(preview.message));
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* @param {Object} options
|
|
196
|
+
* @returns {Promise<void>}
|
|
197
|
+
*/
|
|
198
|
+
async function runGenerateManifestCommand(options) {
|
|
199
|
+
const domain = requireDomain(options.domain);
|
|
200
|
+
const ownerSystemKey = resolveOwnerSystemKey(domain, options.ownerSystemKey);
|
|
201
|
+
const body = buildGenerateManifestRequest(options, domain, ownerSystemKey);
|
|
202
|
+
|
|
203
|
+
const { dataplaneUrl, authConfig } = await resolveDataplaneAndAuth(ownerSystemKey, {
|
|
204
|
+
silent: true
|
|
205
|
+
});
|
|
206
|
+
const controllerUrl = await resolveControllerUrl();
|
|
207
|
+
|
|
208
|
+
let preview;
|
|
209
|
+
try {
|
|
210
|
+
preview = await postGenerateManifest(dataplaneUrl, authConfig, body, { controllerUrl });
|
|
211
|
+
} catch (error) {
|
|
212
|
+
throw new Error(formatApiError(error, dataplaneUrl));
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
if (options.json) {
|
|
216
|
+
logger.log(JSON.stringify(preview, null, 2));
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
const outputPath = resolveOutputPath(ownerSystemKey, options.output);
|
|
221
|
+
mkdirSync(path.dirname(outputPath), { recursive: true });
|
|
222
|
+
writeFileSync(outputPath, `${JSON.stringify(preview, null, 2)}\n`, 'utf8');
|
|
223
|
+
|
|
224
|
+
logPreviewSummary(preview);
|
|
225
|
+
formatSuccessLine(`Preview written to ${outputPath}`);
|
|
226
|
+
logger.log(chalk.gray('Review and edit before upload (candidate) and deploy.'));
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* @param {import('commander').Command} ek
|
|
231
|
+
* @returns {void}
|
|
232
|
+
*/
|
|
233
|
+
function setupGenerateManifestCommand(ek) {
|
|
234
|
+
ek.command('generate-manifest')
|
|
235
|
+
.description('Preview full Enterprise Knowledge manifest from published Connected Systems')
|
|
236
|
+
.addHelpText('after', GENERATE_MANIFEST_HELP_AFTER)
|
|
237
|
+
.requiredOption('--domain <domain>', 'Business domain slug (e.g. sales)')
|
|
238
|
+
.option('--owner-system-key <key>', 'Enterprise Knowledge anchor key (default ek-<domain>)')
|
|
239
|
+
.option('--source-system <key>', 'Published Connected System key (repeatable)', collectValues, [])
|
|
240
|
+
.option('--display-name <name>', 'Enterprise Knowledge display name override')
|
|
241
|
+
.option('--description <text>', 'Enterprise Knowledge description override')
|
|
242
|
+
.option('--version <semver>', 'Manifest version label', '1.0.0')
|
|
243
|
+
.option('--file <path>', 'Full request JSON (overrides built-in body)')
|
|
244
|
+
.option('--output <path>', 'Write preview JSON to this path')
|
|
245
|
+
.option('--json', 'Print preview JSON to stdout instead of writing a file')
|
|
246
|
+
.action(async(options) => {
|
|
247
|
+
try {
|
|
248
|
+
await runGenerateManifestCommand(options);
|
|
249
|
+
} catch (error) {
|
|
250
|
+
formatBlockingError(error.message || String(error));
|
|
251
|
+
process.exit(1);
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* @param {string} value
|
|
258
|
+
* @param {string[]} previous
|
|
259
|
+
* @returns {string[]}
|
|
260
|
+
*/
|
|
261
|
+
function collectValues(value, previous) {
|
|
262
|
+
return previous.concat([value]);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* @param {import('commander').Command} program
|
|
267
|
+
* @returns {void}
|
|
268
|
+
*/
|
|
269
|
+
function setupEnterpriseKnowledgeCommands(program) {
|
|
270
|
+
const ek = program
|
|
271
|
+
.command('enterprise-knowledge')
|
|
272
|
+
.description('Enterprise Knowledge authoring helpers')
|
|
273
|
+
.addHelpText('after', ENTERPRISE_KNOWLEDGE_HELP_AFTER);
|
|
274
|
+
setupGenerateManifestCommand(ek);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
module.exports = {
|
|
278
|
+
setupEnterpriseKnowledgeCommands,
|
|
279
|
+
runGenerateManifestCommand,
|
|
280
|
+
buildGenerateManifestRequest,
|
|
281
|
+
resolveOutputPath,
|
|
282
|
+
requireDomain,
|
|
283
|
+
resolveOwnerSystemKey
|
|
284
|
+
};
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Evidence Fabrix v2 CLI leaf command registration.
|
|
3
|
+
* @author AI Fabrix Team
|
|
4
|
+
* @version 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
'use strict';
|
|
8
|
+
|
|
9
|
+
const logger = require('../utils/logger');
|
|
10
|
+
const { formatBlockingError } = require('../utils/cli-test-layout-chalk');
|
|
11
|
+
const {
|
|
12
|
+
exitCodeForEvidenceError,
|
|
13
|
+
runEvidenceList,
|
|
14
|
+
runEvidenceGet,
|
|
15
|
+
runEvidenceInsert,
|
|
16
|
+
runEvidenceUpdate,
|
|
17
|
+
runEvidenceDelete,
|
|
18
|
+
runEvidenceLoad,
|
|
19
|
+
runEvidenceExport,
|
|
20
|
+
DEFAULT_BULK_FILE
|
|
21
|
+
} = require('../evidence/evidence-service');
|
|
22
|
+
|
|
23
|
+
const SHARED_OPTS = [
|
|
24
|
+
['-e, --env <environment>', 'Environment key'],
|
|
25
|
+
['--json', 'Machine-readable JSON output']
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
const LIST_HELP = `
|
|
29
|
+
|
|
30
|
+
Examples:
|
|
31
|
+
$ aifabrix evidence list
|
|
32
|
+
$ aifabrix evidence list --resource-type deal --generic
|
|
33
|
+
$ aifabrix evidence list --role-key sales-executive --status active --json
|
|
34
|
+
`;
|
|
35
|
+
|
|
36
|
+
const GET_HELP = `
|
|
37
|
+
|
|
38
|
+
Examples:
|
|
39
|
+
$ aifabrix evidence get ev2_abc123
|
|
40
|
+
$ aifabrix evidence get ev2_abc123 --json
|
|
41
|
+
`;
|
|
42
|
+
|
|
43
|
+
const INSERT_HELP = `
|
|
44
|
+
|
|
45
|
+
Examples:
|
|
46
|
+
$ aifabrix evidence insert --resource-type deal --title "High-value review" --when "Amount over threshold" --expected-behavior "Procurement review first"
|
|
47
|
+
$ aifabrix evidence insert --file ./row.json
|
|
48
|
+
`;
|
|
49
|
+
|
|
50
|
+
const UPDATE_HELP = `
|
|
51
|
+
|
|
52
|
+
Examples:
|
|
53
|
+
$ aifabrix evidence update ev2_abc123 --title "Updated title"
|
|
54
|
+
$ aifabrix evidence update ev2_abc123 --file ./patch.json
|
|
55
|
+
`;
|
|
56
|
+
|
|
57
|
+
const DELETE_HELP = `
|
|
58
|
+
|
|
59
|
+
Examples:
|
|
60
|
+
$ aifabrix evidence delete ev2_abc123 --yes
|
|
61
|
+
$ aifabrix evidence delete ev2_abc123
|
|
62
|
+
|
|
63
|
+
Delete succeeds only when the row is not referenced by runtime execution.
|
|
64
|
+
`;
|
|
65
|
+
|
|
66
|
+
const LOAD_HELP = `
|
|
67
|
+
|
|
68
|
+
Examples:
|
|
69
|
+
$ aifabrix evidence load --file ${DEFAULT_BULK_FILE}
|
|
70
|
+
$ aifabrix evidence load --dry-run
|
|
71
|
+
`;
|
|
72
|
+
|
|
73
|
+
const EXPORT_HELP = `
|
|
74
|
+
|
|
75
|
+
Examples:
|
|
76
|
+
$ aifabrix evidence export --file ${DEFAULT_BULK_FILE}
|
|
77
|
+
$ aifabrix evidence export --resource-type deal --json
|
|
78
|
+
`;
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* @param {import('commander').Command} cmd
|
|
82
|
+
* @param {string} name
|
|
83
|
+
* @param {string} description
|
|
84
|
+
* @param {Function} action
|
|
85
|
+
* @param {Array<[string, string]>} extraOpts
|
|
86
|
+
* @param {string} helpAfter
|
|
87
|
+
*/
|
|
88
|
+
function addEvidenceLeaf(cmd, name, description, action, extraOpts = [], helpAfter = '') {
|
|
89
|
+
const leaf = cmd.command(name).description(description);
|
|
90
|
+
for (const [flags, desc] of [...SHARED_OPTS, ...extraOpts]) {
|
|
91
|
+
leaf.option(flags, desc);
|
|
92
|
+
}
|
|
93
|
+
if (helpAfter) {
|
|
94
|
+
leaf.addHelpText('after', helpAfter);
|
|
95
|
+
}
|
|
96
|
+
leaf.action(async(...args) => {
|
|
97
|
+
try {
|
|
98
|
+
const code = await action(...args);
|
|
99
|
+
if (code && code !== 0) {
|
|
100
|
+
process.exit(code);
|
|
101
|
+
}
|
|
102
|
+
} catch (err) {
|
|
103
|
+
logger.error(formatBlockingError(err.message || String(err)));
|
|
104
|
+
process.exit(exitCodeForEvidenceError(err));
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* @param {import('commander').Command} evidence
|
|
111
|
+
*/
|
|
112
|
+
function registerEvidenceList(evidence) {
|
|
113
|
+
addEvidenceLeaf(
|
|
114
|
+
evidence,
|
|
115
|
+
'list',
|
|
116
|
+
'List Evidence Fabrix v2 rows from the dataplane',
|
|
117
|
+
async(options) => runEvidenceList(options, logger),
|
|
118
|
+
[
|
|
119
|
+
['--resource-type <resourceType>', 'Filter by resource type'],
|
|
120
|
+
['--role-key <roleKey>', 'Filter by role-specific scope'],
|
|
121
|
+
['--generic', 'Generic rows only (no roleKey)'],
|
|
122
|
+
['--status <status>', 'Filter by active or disabled']
|
|
123
|
+
],
|
|
124
|
+
LIST_HELP
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* @param {import('commander').Command} evidence
|
|
130
|
+
*/
|
|
131
|
+
function registerEvidenceGet(evidence) {
|
|
132
|
+
addEvidenceLeaf(
|
|
133
|
+
evidence,
|
|
134
|
+
'get <evidenceId>',
|
|
135
|
+
'Get one evidence row by id',
|
|
136
|
+
async(evidenceId, options) => runEvidenceGet(evidenceId, options, logger),
|
|
137
|
+
[],
|
|
138
|
+
GET_HELP
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* @param {import('commander').Command} evidence
|
|
144
|
+
*/
|
|
145
|
+
function registerEvidenceInsert(evidence) {
|
|
146
|
+
addEvidenceLeaf(
|
|
147
|
+
evidence,
|
|
148
|
+
'insert',
|
|
149
|
+
'Insert a new evidence row',
|
|
150
|
+
async(options) => runEvidenceInsert(options, logger),
|
|
151
|
+
[
|
|
152
|
+
['--file <path>', 'Single evidence JSON object'],
|
|
153
|
+
['--resource-type <resourceType>', 'Resource type key'],
|
|
154
|
+
['--role-key <roleKey>', 'Optional role-specific scope'],
|
|
155
|
+
['--generic', 'Create generic evidence (no roleKey)'],
|
|
156
|
+
['--title <title>', 'Title'],
|
|
157
|
+
['--description <description>', 'Description'],
|
|
158
|
+
['--when <when>', 'Natural-language when condition'],
|
|
159
|
+
['--expected-behavior <text>', 'Expected business behavior'],
|
|
160
|
+
['--order <n>', 'Sort order within scope bucket', parseInt],
|
|
161
|
+
['--status <status>', 'active or disabled']
|
|
162
|
+
],
|
|
163
|
+
INSERT_HELP
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* @param {import('commander').Command} evidence
|
|
169
|
+
*/
|
|
170
|
+
function registerEvidenceUpdate(evidence) {
|
|
171
|
+
addEvidenceLeaf(
|
|
172
|
+
evidence,
|
|
173
|
+
'update <evidenceId>',
|
|
174
|
+
'Update an evidence row',
|
|
175
|
+
async(evidenceId, options) => runEvidenceUpdate(evidenceId, options, logger),
|
|
176
|
+
[
|
|
177
|
+
['--file <path>', 'Partial update JSON object'],
|
|
178
|
+
['--role-key <roleKey>', 'Role-specific scope'],
|
|
179
|
+
['--generic', 'Clear roleKey to generic scope'],
|
|
180
|
+
['--title <title>', 'Title'],
|
|
181
|
+
['--description <description>', 'Description'],
|
|
182
|
+
['--when <when>', 'When condition'],
|
|
183
|
+
['--expected-behavior <text>', 'Expected behavior'],
|
|
184
|
+
['--order <n>', 'Sort order', parseInt],
|
|
185
|
+
['--status <status>', 'active or disabled']
|
|
186
|
+
],
|
|
187
|
+
UPDATE_HELP
|
|
188
|
+
);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* @param {import('commander').Command} evidence
|
|
193
|
+
*/
|
|
194
|
+
function registerEvidenceDelete(evidence) {
|
|
195
|
+
addEvidenceLeaf(
|
|
196
|
+
evidence,
|
|
197
|
+
'delete <evidenceId>',
|
|
198
|
+
'Delete evidence when it is not referenced by runtime execution',
|
|
199
|
+
async(evidenceId, options) => runEvidenceDelete(evidenceId, options, logger),
|
|
200
|
+
[['--yes', 'Skip confirmation prompt']],
|
|
201
|
+
DELETE_HELP
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* @param {import('commander').Command} evidence
|
|
207
|
+
*/
|
|
208
|
+
function registerEvidenceLoad(evidence) {
|
|
209
|
+
addEvidenceLeaf(
|
|
210
|
+
evidence,
|
|
211
|
+
'load',
|
|
212
|
+
'Bulk insert or update evidence rows from a JSON array file',
|
|
213
|
+
async(options) => runEvidenceLoad(options, logger),
|
|
214
|
+
[
|
|
215
|
+
['--file <path>', `JSON array file (default: ${DEFAULT_BULK_FILE})`],
|
|
216
|
+
['--dry-run', 'Validate file without mutating dataplane']
|
|
217
|
+
],
|
|
218
|
+
LOAD_HELP
|
|
219
|
+
);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* @param {import('commander').Command} evidence
|
|
224
|
+
*/
|
|
225
|
+
function registerEvidenceExport(evidence) {
|
|
226
|
+
addEvidenceLeaf(
|
|
227
|
+
evidence,
|
|
228
|
+
'export',
|
|
229
|
+
'Export filtered evidence rows to a JSON array file',
|
|
230
|
+
async(options) => runEvidenceExport(options, logger),
|
|
231
|
+
[
|
|
232
|
+
['--file <path>', `Output file (default: ${DEFAULT_BULK_FILE})`],
|
|
233
|
+
['--resource-type <resourceType>', 'Filter by resource type'],
|
|
234
|
+
['--role-key <roleKey>', 'Filter by role-specific scope'],
|
|
235
|
+
['--generic', 'Generic rows only'],
|
|
236
|
+
['--status <status>', 'Filter by active or disabled']
|
|
237
|
+
],
|
|
238
|
+
EXPORT_HELP
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
module.exports = {
|
|
243
|
+
registerEvidenceList,
|
|
244
|
+
registerEvidenceGet,
|
|
245
|
+
registerEvidenceInsert,
|
|
246
|
+
registerEvidenceUpdate,
|
|
247
|
+
registerEvidenceDelete,
|
|
248
|
+
registerEvidenceLoad,
|
|
249
|
+
registerEvidenceExport
|
|
250
|
+
};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Evidence Fabrix v2 CLI commands.
|
|
3
|
+
* @author AI Fabrix Team
|
|
4
|
+
* @version 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
'use strict';
|
|
8
|
+
|
|
9
|
+
const {
|
|
10
|
+
registerEvidenceList,
|
|
11
|
+
registerEvidenceGet,
|
|
12
|
+
registerEvidenceInsert,
|
|
13
|
+
registerEvidenceUpdate,
|
|
14
|
+
registerEvidenceDelete,
|
|
15
|
+
registerEvidenceLoad,
|
|
16
|
+
registerEvidenceExport
|
|
17
|
+
} = require('./evidence-cli-leaves');
|
|
18
|
+
|
|
19
|
+
const EVIDENCE_HELP_AFTER = `
|
|
20
|
+
|
|
21
|
+
Examples:
|
|
22
|
+
$ aifabrix evidence list --resource-type deal
|
|
23
|
+
$ aifabrix evidence insert --resource-type deal --title "Review threshold" --when "..." --expected-behavior "..."
|
|
24
|
+
$ aifabrix evidence export --file .evidence/evidence.json
|
|
25
|
+
$ aifabrix evidence load --file .evidence/evidence.json --dry-run
|
|
26
|
+
$ aifabrix evidence delete ev2_abc123 --yes
|
|
27
|
+
|
|
28
|
+
Per-command help: aifabrix evidence <command> --help
|
|
29
|
+
`;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* @param {import('commander').Command} program
|
|
33
|
+
*/
|
|
34
|
+
function setupEvidenceCommands(program) {
|
|
35
|
+
const evidence = program
|
|
36
|
+
.command('evidence')
|
|
37
|
+
.description('Manage Evidence Fabrix v2 rows on the dataplane')
|
|
38
|
+
.addHelpText('after', EVIDENCE_HELP_AFTER);
|
|
39
|
+
|
|
40
|
+
registerEvidenceList(evidence);
|
|
41
|
+
registerEvidenceGet(evidence);
|
|
42
|
+
registerEvidenceInsert(evidence);
|
|
43
|
+
registerEvidenceUpdate(evidence);
|
|
44
|
+
registerEvidenceDelete(evidence);
|
|
45
|
+
registerEvidenceLoad(evidence);
|
|
46
|
+
registerEvidenceExport(evidence);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
module.exports = {
|
|
50
|
+
setupEvidenceCommands
|
|
51
|
+
};
|
|
@@ -9,7 +9,7 @@ const {
|
|
|
9
9
|
syncLocalIfRequested
|
|
10
10
|
} = require('./test-e2e-external');
|
|
11
11
|
const { resolveIntegrationAuth } = require('../external-system/integration-auth-context');
|
|
12
|
-
const {
|
|
12
|
+
const { cliOptsSkipPublish } = require('../utils/cli-sync-options');
|
|
13
13
|
const { fetchDataplaneGeneralHealth } = require('../api/dataplane-health.api');
|
|
14
14
|
const { formatNetworkError } = require('../utils/api-error-handler');
|
|
15
15
|
|
|
@@ -74,7 +74,7 @@ async function resolveGovernanceIntegrationContext(systemKey, options) {
|
|
|
74
74
|
dataplaneUrl: options.dataplaneUrl
|
|
75
75
|
};
|
|
76
76
|
}
|
|
77
|
-
if (!
|
|
77
|
+
if (!cliOptsSkipPublish(options)) {
|
|
78
78
|
const uploadCtx = await syncLocalIfRequested(resolvedKey, options);
|
|
79
79
|
if (uploadCtx?.authConfig && uploadCtx?.dataplaneUrl) {
|
|
80
80
|
options.authConfig = uploadCtx.authConfig;
|
|
@@ -35,7 +35,7 @@ function normalizeGovernanceOptions(options, cmd) {
|
|
|
35
35
|
return {
|
|
36
36
|
env: options.env || parent.env || 'dev',
|
|
37
37
|
verbose: options.verbose === true || parent.verbose === true,
|
|
38
|
-
|
|
38
|
+
noPublish: options.noPublish === true || parent.noPublish === true,
|
|
39
39
|
force: options.force === true || parent.force === true,
|
|
40
40
|
json: options.json === true || parent.json === true,
|
|
41
41
|
pack: options.pack,
|
|
@@ -109,7 +109,7 @@ async function governanceUploadHandler(systemKey, options, cmd) {
|
|
|
109
109
|
async function governanceDownloadHandler(systemKey, options, cmd) {
|
|
110
110
|
try {
|
|
111
111
|
const opts = normalizeGovernanceOptions(options, cmd);
|
|
112
|
-
opts.
|
|
112
|
+
opts.noPublish = true;
|
|
113
113
|
const result = await runGovernanceDownloadForExternalSystem(systemKey, opts);
|
|
114
114
|
if (opts.json) {
|
|
115
115
|
logger.log(JSON.stringify(buildJsonEnvelope(result, opts.verbose), null, 2));
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Resolve governance subject emails from integration fixture CSV.
|
|
3
|
+
* @author AI Fabrix Team
|
|
4
|
+
* @version 1.0.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
'use strict';
|
|
8
|
+
|
|
9
|
+
const path = require('path');
|
|
10
|
+
const { nodeFs } = require('../internal/node-fs');
|
|
11
|
+
const { getIntegrationPath } = require('../utils/paths');
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @param {string} line
|
|
15
|
+
* @returns {string[]}
|
|
16
|
+
*/
|
|
17
|
+
function parseCsvLine(line) {
|
|
18
|
+
const cells = [];
|
|
19
|
+
let current = '';
|
|
20
|
+
let inQuotes = false;
|
|
21
|
+
for (let index = 0; index < line.length; index += 1) {
|
|
22
|
+
const char = line[index];
|
|
23
|
+
if (char === '"') {
|
|
24
|
+
inQuotes = !inQuotes;
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
if (char === ',' && !inQuotes) {
|
|
28
|
+
cells.push(current.trim());
|
|
29
|
+
current = '';
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
current += char;
|
|
33
|
+
}
|
|
34
|
+
cells.push(current.trim());
|
|
35
|
+
return cells;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* @param {string[]} lines
|
|
40
|
+
* @param {number} emailIndex
|
|
41
|
+
* @returns {string[]}
|
|
42
|
+
*/
|
|
43
|
+
function collectUniqueEmailsFromRows(lines, emailIndex) {
|
|
44
|
+
const emails = [];
|
|
45
|
+
const seen = new Set();
|
|
46
|
+
for (let rowIndex = 1; rowIndex < lines.length; rowIndex += 1) {
|
|
47
|
+
const row = parseCsvLine(lines[rowIndex]);
|
|
48
|
+
const email = String(row[emailIndex] || '').trim().toLowerCase();
|
|
49
|
+
if (!email || seen.has(email)) {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
seen.add(email);
|
|
53
|
+
emails.push(email);
|
|
54
|
+
}
|
|
55
|
+
return emails;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* @param {string} systemKey
|
|
60
|
+
* @returns {string[]}
|
|
61
|
+
*/
|
|
62
|
+
function resolveGovernanceFixtureSubjectEmails(systemKey) {
|
|
63
|
+
const integrationPath = getIntegrationPath(systemKey);
|
|
64
|
+
const csvPath = path.join(integrationPath, 'fixtures', 'session-users.csv');
|
|
65
|
+
const disk = nodeFs();
|
|
66
|
+
if (!disk.existsSync(csvPath)) {
|
|
67
|
+
return [];
|
|
68
|
+
}
|
|
69
|
+
const raw = disk.readFileSync(csvPath, 'utf8');
|
|
70
|
+
const lines = raw.split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
|
|
71
|
+
if (lines.length < 2) {
|
|
72
|
+
return [];
|
|
73
|
+
}
|
|
74
|
+
const headers = parseCsvLine(lines[0]).map((header) => header.toLowerCase());
|
|
75
|
+
const emailIndex = headers.indexOf('email');
|
|
76
|
+
if (emailIndex < 0) {
|
|
77
|
+
return [];
|
|
78
|
+
}
|
|
79
|
+
return collectUniqueEmailsFromRows(lines, emailIndex);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
module.exports = {
|
|
83
|
+
parseCsvLine,
|
|
84
|
+
resolveGovernanceFixtureSubjectEmails
|
|
85
|
+
};
|