@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,266 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Connected Systems UI URL catalog for builder-api LLM help (plan 154.6).
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview Structured paths and tab aliases for post-upload authentication handoff
|
|
5
|
+
* @author AI Fabrix Team
|
|
6
|
+
* @version 1.0.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const { buildHelpEnvelope } = require('./builder-help-envelope');
|
|
12
|
+
const {
|
|
13
|
+
buildAuthenticationCatalog,
|
|
14
|
+
buildAuthenticationHandoffForManifest
|
|
15
|
+
} = require('./builder-help-authentication-catalog');
|
|
16
|
+
|
|
17
|
+
/** @type {ReadonlyArray<Object>} */
|
|
18
|
+
const SYSTEM_TABS = Object.freeze([
|
|
19
|
+
{ uiLabel: 'Overview', urlTab: null, aliases: ['overview'], omitTabParam: true },
|
|
20
|
+
{ uiLabel: 'Technical readiness', urlTab: 'technical-readiness', aliases: [] },
|
|
21
|
+
{ uiLabel: 'Business Entities', urlTab: 'datasources', aliases: ['business-entities'] },
|
|
22
|
+
{ uiLabel: 'Business Policies', urlTab: 'rules', aliases: ['business-policies'] },
|
|
23
|
+
{ uiLabel: 'Authentication', urlTab: 'authentication', aliases: ['Authentication'] },
|
|
24
|
+
{ uiLabel: 'Configuration', urlTab: 'configuration', aliases: [] },
|
|
25
|
+
{ uiLabel: 'AI Interfaces', urlTab: 'openapi', aliases: ['ai-interfaces'] },
|
|
26
|
+
{ uiLabel: 'Policies & Security', urlTab: 'policies', aliases: [], note: 'When policy management is enabled in dataplane.' },
|
|
27
|
+
{ uiLabel: 'Audit & History', urlTab: 'audit', aliases: ['audit-history'] }
|
|
28
|
+
]);
|
|
29
|
+
|
|
30
|
+
/** @type {ReadonlyArray<Object>} */
|
|
31
|
+
const DATASOURCE_TABS = Object.freeze([
|
|
32
|
+
{
|
|
33
|
+
uiLabel: 'Overview',
|
|
34
|
+
urlTab: 'business-context',
|
|
35
|
+
aliases: ['business-overview'],
|
|
36
|
+
omitTabParam: true,
|
|
37
|
+
note: 'First tab id is business-context. URL value overview opens Technical readiness.'
|
|
38
|
+
},
|
|
39
|
+
{ uiLabel: 'Technical readiness', urlTab: 'overview', aliases: ['technical-readiness'] },
|
|
40
|
+
{ uiLabel: 'Data Flow', urlTab: 'cip', aliases: ['data-flow', 'Data Flow'] },
|
|
41
|
+
{ uiLabel: 'Business Vocabulary', urlTab: 'mappings', aliases: ['business-vocabulary'] },
|
|
42
|
+
{ uiLabel: 'AI Contract', urlTab: 'exposure', aliases: ['ai-contract'] },
|
|
43
|
+
{ uiLabel: 'Business Policies', urlTab: 'abac', aliases: ['business-policies'] },
|
|
44
|
+
{ uiLabel: 'Quality', urlTab: 'quality', aliases: [] },
|
|
45
|
+
{ uiLabel: 'Sync', urlTab: 'sync', aliases: [] },
|
|
46
|
+
{ uiLabel: 'Doc Processing', urlTab: 'document-processing', aliases: ['doc-processing'] },
|
|
47
|
+
{ uiLabel: 'Operations', urlTab: 'openapi', aliases: ['operations'] },
|
|
48
|
+
{ uiLabel: 'Configuration', urlTab: 'configuration', aliases: [] },
|
|
49
|
+
{ uiLabel: 'YAML', urlTab: 'yaml', aliases: [] },
|
|
50
|
+
{ uiLabel: 'Logs', urlTab: 'logs', aliases: ['audit-logs', 'execution-logs'] }
|
|
51
|
+
]);
|
|
52
|
+
|
|
53
|
+
/** @type {Readonly<Object>} */
|
|
54
|
+
const URL_TEMPLATES = Object.freeze({
|
|
55
|
+
dataplanePublicBasePlaceholder: '{dataplanePublicBase}',
|
|
56
|
+
systemPath: '/connected-systems/{systemKey}',
|
|
57
|
+
systemPathWithTab: '/connected-systems/{systemKey}?tab={tab}',
|
|
58
|
+
datasourcePath: '/connected-systems/{systemKey}/datasources/{datasourceKey}',
|
|
59
|
+
datasourcePathWithTab: '/connected-systems/{systemKey}/datasources/{datasourceKey}?tab={tab}',
|
|
60
|
+
composedSystemUrl: '{dataplanePublicBase}/connected-systems/{systemKey}?tab={tab}',
|
|
61
|
+
composedDatasourceUrl:
|
|
62
|
+
'{dataplanePublicBase}/connected-systems/{systemKey}/datasources/{datasourceKey}?tab={tab}',
|
|
63
|
+
routeHelper:
|
|
64
|
+
'Dataplane UI route helper: CONNECTED_SYSTEM_ROUTES.DATASOURCE_TAB(systemKey, datasourceKey, tab).'
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
/** @type {ReadonlyArray<string>} */
|
|
68
|
+
const AGENT_RULES = Object.freeze([
|
|
69
|
+
'Run validate, test, test-integration, and upload without requiring resolved integration secrets in Builder API scope.',
|
|
70
|
+
'Upload publishes manifest authentication.credential.variables (non-secrets) pre-filled in the UI; kv:// security placeholders stay unresolved until the user adds live secrets.',
|
|
71
|
+
'Before post-upload handoff, read system.authentications[] (or legacy authentication) and identify authType, usage (api, webhookInbound, syncExecution), and credential.method when applicable.',
|
|
72
|
+
'Set all non-secret auth config in credential.variables during manifest editing — do not ask the user to re-enter baseUrl, headerName, tokenUrl, or similar after upload.',
|
|
73
|
+
'After upload succeeds, ask the user to open Connected Systems Authentication and add only requiredSecretKeys (for example apiKey token, webhookInbound signingSecret) — not variables already published.',
|
|
74
|
+
'When webhook.enabled or syncBridge is active, direct the user to datasource Sync tab (tab=sync) for webhook activation markdown and syncBridge read-only status.',
|
|
75
|
+
'Combine the user dataplane public base (origin including /data) with paths from urlTemplates.',
|
|
76
|
+
'Do not ask the user to paste vendor tokens into Builder API requests or workspace files when UI authentication is the intended path.',
|
|
77
|
+
'Tab query values are case-insensitive; aliases in systemTabs and datasourceTabs are accepted on load.'
|
|
78
|
+
]);
|
|
79
|
+
|
|
80
|
+
/** @type {ReadonlyArray<Object>} */
|
|
81
|
+
const POST_UPLOAD_AUTH_WORKFLOW = Object.freeze([
|
|
82
|
+
{ order: 1, capability: 'validate', goal: 'Confirm workspace manifest structure before publish.' },
|
|
83
|
+
{ order: 2, capability: 'test', goal: 'Run local manifest tests without live vendor credentials.' },
|
|
84
|
+
{
|
|
85
|
+
order: 3,
|
|
86
|
+
capability: 'test-integration',
|
|
87
|
+
goal: 'Exercise pipeline integration tests; credential gaps may remain until UI auth is set.'
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
order: 4,
|
|
91
|
+
capability: 'upload',
|
|
92
|
+
goal: 'Publish external system draft without embedding resolved secrets in the workspace.'
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
order: 5,
|
|
96
|
+
capability: 'ui-authentication-handoff',
|
|
97
|
+
goal:
|
|
98
|
+
'Read authentications[] usage slots and credential.method from manifest; provide Authentication URL and method-specific secret field guidance from authentication catalog. Include webhookInbound and syncExecution when configured.'
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
order: 6,
|
|
102
|
+
capability: 'ui-sync-fabrix-handoff',
|
|
103
|
+
goal:
|
|
104
|
+
'When webhook or syncBridge is enabled, provide datasource Sync tab URL (tab=sync) for activation guide and read-only fabrix status.'
|
|
105
|
+
},
|
|
106
|
+
{ order: 7, capability: 'test-e2e', goal: 'After UI auth is configured, user or agent re-runs E2E against live vendor APIs.' }
|
|
107
|
+
]);
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* @param {string} input
|
|
111
|
+
* @param {ReadonlyArray<Object>} catalog
|
|
112
|
+
* @returns {string|null}
|
|
113
|
+
*/
|
|
114
|
+
function resolveTabFromCatalog(input, catalog) {
|
|
115
|
+
if (!input) {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
const normalized = String(input).toLowerCase();
|
|
119
|
+
for (const entry of catalog) {
|
|
120
|
+
if (entry.urlTab && entry.urlTab.toLowerCase() === normalized) {
|
|
121
|
+
return entry.urlTab;
|
|
122
|
+
}
|
|
123
|
+
for (const alias of entry.aliases || []) {
|
|
124
|
+
if (String(alias).toLowerCase() === normalized) {
|
|
125
|
+
return entry.urlTab;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
if (entry.omitTabParam && normalized === 'overview') {
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return String(input);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* @param {string} systemKey
|
|
137
|
+
* @param {string|null|undefined} tabInput
|
|
138
|
+
* @returns {string}
|
|
139
|
+
*/
|
|
140
|
+
function buildSystemRelativePath(systemKey, tabInput) {
|
|
141
|
+
const encodedKey = encodeURIComponent(systemKey);
|
|
142
|
+
const tab = resolveTabFromCatalog(tabInput, SYSTEM_TABS);
|
|
143
|
+
const base = `/connected-systems/${encodedKey}`;
|
|
144
|
+
if (!tab) {
|
|
145
|
+
return base;
|
|
146
|
+
}
|
|
147
|
+
return `${base}?tab=${encodeURIComponent(tab)}`;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* @param {string} systemKey
|
|
152
|
+
* @param {string} datasourceKey
|
|
153
|
+
* @param {string|null|undefined} tabInput
|
|
154
|
+
* @returns {string}
|
|
155
|
+
*/
|
|
156
|
+
function buildDatasourceRelativePath(systemKey, datasourceKey, tabInput) {
|
|
157
|
+
const tab = resolveTabFromCatalog(tabInput, DATASOURCE_TABS);
|
|
158
|
+
const base = `/connected-systems/${encodeURIComponent(systemKey)}/datasources/${encodeURIComponent(datasourceKey)}`;
|
|
159
|
+
if (!tab) {
|
|
160
|
+
return base;
|
|
161
|
+
}
|
|
162
|
+
return `${base}?tab=${encodeURIComponent(tab)}`;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* @param {string} publicBase
|
|
167
|
+
* @param {string} relativePath
|
|
168
|
+
* @returns {string}
|
|
169
|
+
*/
|
|
170
|
+
function composePublicUrl(publicBase, relativePath) {
|
|
171
|
+
const trimmedBase = String(publicBase).replace(/\/$/, '');
|
|
172
|
+
const trimmedPath = relativePath.startsWith('/') ? relativePath : `/${relativePath}`;
|
|
173
|
+
return `${trimmedBase}${trimmedPath}`;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* @param {Object} data
|
|
178
|
+
* @param {Object} params
|
|
179
|
+
* @returns {void}
|
|
180
|
+
*/
|
|
181
|
+
function attachConnectedSystemResolvedPaths(data, params) {
|
|
182
|
+
const { systemKey, tab, datasourceKey, datasourceTab, publicBase } = params;
|
|
183
|
+
const authenticationPath = buildSystemRelativePath(systemKey, 'authentication');
|
|
184
|
+
const requestedSystemPath = buildSystemRelativePath(systemKey, tab);
|
|
185
|
+
data.resolved = {
|
|
186
|
+
systemKey,
|
|
187
|
+
authenticationPath,
|
|
188
|
+
requestedSystemPath
|
|
189
|
+
};
|
|
190
|
+
if (publicBase) {
|
|
191
|
+
data.resolved.authenticationUrl = composePublicUrl(publicBase, authenticationPath);
|
|
192
|
+
data.resolved.requestedSystemUrl = composePublicUrl(publicBase, requestedSystemPath);
|
|
193
|
+
}
|
|
194
|
+
if (datasourceKey) {
|
|
195
|
+
const datasourcePath = buildDatasourceRelativePath(systemKey, datasourceKey, datasourceTab);
|
|
196
|
+
data.resolved.datasourceKey = datasourceKey;
|
|
197
|
+
data.resolved.datasourcePath = datasourcePath;
|
|
198
|
+
if (publicBase) {
|
|
199
|
+
data.resolved.datasourceUrl = composePublicUrl(publicBase, datasourcePath);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/**
|
|
205
|
+
* @param {Object} query
|
|
206
|
+
* @returns {Object}
|
|
207
|
+
*/
|
|
208
|
+
function buildConnectedSystemUiTopic(query) {
|
|
209
|
+
const systemKey = query.systemKey ? String(query.systemKey) : null;
|
|
210
|
+
const datasourceKey = query.datasourceKey ? String(query.datasourceKey) : null;
|
|
211
|
+
const tab = query.tab || 'authentication';
|
|
212
|
+
const datasourceTab = query.datasourceTab || null;
|
|
213
|
+
const publicBase = query.dataplanePublicBase ? String(query.dataplanePublicBase) : null;
|
|
214
|
+
|
|
215
|
+
/** @type {Object} */
|
|
216
|
+
const data = {
|
|
217
|
+
urlTemplates: URL_TEMPLATES,
|
|
218
|
+
systemTabs: SYSTEM_TABS,
|
|
219
|
+
datasourceTabs: DATASOURCE_TABS,
|
|
220
|
+
authentication: buildAuthenticationCatalog(),
|
|
221
|
+
agentRules: AGENT_RULES,
|
|
222
|
+
postUploadAuthWorkflow: POST_UPLOAD_AUTH_WORKFLOW,
|
|
223
|
+
behavior: {
|
|
224
|
+
tabQuerySelectsTabOnLoad: true,
|
|
225
|
+
tabSwitchUpdatesUrl: true,
|
|
226
|
+
navigationClearsStaleTabState: true,
|
|
227
|
+
staticUiRebuildNote: 'Rebuild dataplane static UI after UI route changes when using Docker dev-reload (make ui-build).'
|
|
228
|
+
}
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
const manifestHandoff = buildAuthenticationHandoffForManifest(query);
|
|
232
|
+
if (manifestHandoff) {
|
|
233
|
+
data.manifestHandoff = manifestHandoff;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
if (systemKey) {
|
|
237
|
+
attachConnectedSystemResolvedPaths(data, {
|
|
238
|
+
systemKey,
|
|
239
|
+
tab,
|
|
240
|
+
datasourceKey,
|
|
241
|
+
datasourceTab,
|
|
242
|
+
publicBase
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
return buildHelpEnvelope({
|
|
247
|
+
topic: 'connectedSystemUi',
|
|
248
|
+
key: systemKey || 'connectedSystemUi',
|
|
249
|
+
title: 'Connected Systems UI navigation',
|
|
250
|
+
summary:
|
|
251
|
+
'Shareable dataplane UI paths, tab aliases, and external-system authentication catalog for post-upload handoff without Builder API secrets.',
|
|
252
|
+
data,
|
|
253
|
+
related: ['workflow', 'subscriptionGuide', 'evidencePatterns'],
|
|
254
|
+
recommendedNext: ['workflow', 'evidencePatterns']
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
module.exports = {
|
|
259
|
+
SYSTEM_TABS,
|
|
260
|
+
DATASOURCE_TABS,
|
|
261
|
+
URL_TEMPLATES,
|
|
262
|
+
buildSystemRelativePath,
|
|
263
|
+
buildDatasourceRelativePath,
|
|
264
|
+
composePublicUrl,
|
|
265
|
+
buildConnectedSystemUiTopic
|
|
266
|
+
};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Enterprise Synchronization Fabrix help topic (webhooks + syncBridge).
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview Builder-api LLM help for webhook activation and syncBridge
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
'use strict';
|
|
8
|
+
|
|
9
|
+
const fs = require('fs');
|
|
10
|
+
const path = require('path');
|
|
11
|
+
const { buildHelpEnvelope } = require('./builder-help-envelope');
|
|
12
|
+
|
|
13
|
+
const HELP_MD_DIR = path.join(__dirname, 'help-content');
|
|
14
|
+
|
|
15
|
+
/** @type {ReadonlyArray<string>} */
|
|
16
|
+
const REPAIR_COMMANDS = Object.freeze([
|
|
17
|
+
'aifabrix repair <systemKey>',
|
|
18
|
+
'aifabrix repair <systemKey> --auth <method>',
|
|
19
|
+
'aifabrix repair <systemKey> --auth-webhook',
|
|
20
|
+
'aifabrix repair <systemKey> --auth-sync',
|
|
21
|
+
'aifabrix validate <app>',
|
|
22
|
+
'aifabrix upload <app>'
|
|
23
|
+
]);
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* @param {Object} query
|
|
27
|
+
* @returns {Object}
|
|
28
|
+
*/
|
|
29
|
+
function buildEnterpriseSyncFabrixTopic(query) {
|
|
30
|
+
const raw = fs.readFileSync(
|
|
31
|
+
path.join(HELP_MD_DIR, 'enterprise-sync-fabrix.md'),
|
|
32
|
+
'utf8'
|
|
33
|
+
);
|
|
34
|
+
const systemKey = query.systemKey ? String(query.systemKey) : '';
|
|
35
|
+
return buildHelpEnvelope({
|
|
36
|
+
topic: 'enterpriseSyncFabrix',
|
|
37
|
+
key: systemKey || 'enterpriseSyncFabrix',
|
|
38
|
+
title: 'Enterprise Synchronization Fabrix',
|
|
39
|
+
summary:
|
|
40
|
+
'Webhook change signals, syncBridge propagation, authentications[] usage slots, and activation workflow.',
|
|
41
|
+
data: {
|
|
42
|
+
authenticationsUsageSlots: ['api', 'webhookInbound', 'syncExecution'],
|
|
43
|
+
syncBridgeModes: ['disabled', 'master', 'bidirectional'],
|
|
44
|
+
webhookEndpointModes: ['system', 'datasource', 'event'],
|
|
45
|
+
repairCommands: [...REPAIR_COMMANDS],
|
|
46
|
+
postUploadTabs: {
|
|
47
|
+
systemAuthentication: 'authentication',
|
|
48
|
+
datasourceSync: 'sync',
|
|
49
|
+
datasourceLogs: 'logs'
|
|
50
|
+
},
|
|
51
|
+
bodyText: raw.replace(/\s{2,}/g, ' ').trim()
|
|
52
|
+
},
|
|
53
|
+
related: ['connectedSystemUi', 'workflow', 'schemaCatalog'],
|
|
54
|
+
recommendedNext: ['connectedSystemUi', 'workflow']
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
module.exports = {
|
|
59
|
+
buildEnterpriseSyncFabrixTopic
|
|
60
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Help response envelope builder (plan 154.5).
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview Shared constants and envelope shape for builder-api help
|
|
5
|
+
* @author AI Fabrix Team
|
|
6
|
+
* @version 1.0.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const HELP_CONTENT_VERSION = '154.7';
|
|
12
|
+
const HELP_SCHEMA_VERSION = '1.0.0';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @param {Object} input
|
|
16
|
+
* @returns {Object}
|
|
17
|
+
*/
|
|
18
|
+
function buildHelpEnvelope(input) {
|
|
19
|
+
return {
|
|
20
|
+
version: HELP_CONTENT_VERSION,
|
|
21
|
+
schemaVersion: HELP_SCHEMA_VERSION,
|
|
22
|
+
topic: input.topic,
|
|
23
|
+
key: input.key,
|
|
24
|
+
title: input.title,
|
|
25
|
+
summary: input.summary,
|
|
26
|
+
data: input.data || {},
|
|
27
|
+
related: input.related || [],
|
|
28
|
+
recommendedNext: input.recommendedNext || []
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
module.exports = {
|
|
33
|
+
HELP_CONTENT_VERSION,
|
|
34
|
+
HELP_SCHEMA_VERSION,
|
|
35
|
+
buildHelpEnvelope
|
|
36
|
+
};
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Golden examples and evidence pattern loaders for builder-api help (plan 154.6).
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview Fixture-backed help topics
|
|
5
|
+
* @author AI Fabrix Team
|
|
6
|
+
* @version 1.0.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const fs = require('fs');
|
|
12
|
+
const path = require('path');
|
|
13
|
+
const { buildHelpEnvelope } = require('./builder-help-envelope');
|
|
14
|
+
|
|
15
|
+
const REPO_ROOT = path.join(__dirname, '..', '..');
|
|
16
|
+
const GOLDEN_DIR = path.join(REPO_ROOT, 'docs', 'builder-help', 'golden-examples');
|
|
17
|
+
const EVIDENCE_PATH = path.join(REPO_ROOT, 'docs', 'builder-help', 'evidence-patterns.json');
|
|
18
|
+
|
|
19
|
+
/** @type {Record<string, Object>|null} */
|
|
20
|
+
let evidenceCache = null;
|
|
21
|
+
/** @type {Record<string, Object>|null} */
|
|
22
|
+
let goldenCache = null;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* @param {string} message
|
|
26
|
+
* @returns {Error}
|
|
27
|
+
*/
|
|
28
|
+
function validationError(message) {
|
|
29
|
+
const err = new Error(message);
|
|
30
|
+
err.statusCode = 400;
|
|
31
|
+
return err;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* @param {string} message
|
|
36
|
+
* @returns {Error}
|
|
37
|
+
*/
|
|
38
|
+
function notFoundError(message) {
|
|
39
|
+
const err = new Error(message);
|
|
40
|
+
err.statusCode = 404;
|
|
41
|
+
return err;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* @returns {Record<string, Object>}
|
|
46
|
+
*/
|
|
47
|
+
function loadGoldenExamplesMap() {
|
|
48
|
+
if (goldenCache) {
|
|
49
|
+
return goldenCache;
|
|
50
|
+
}
|
|
51
|
+
/** @type {Record<string, Object>} */
|
|
52
|
+
const map = {};
|
|
53
|
+
for (const file of fs.readdirSync(GOLDEN_DIR).sort()) {
|
|
54
|
+
if (!file.endsWith('.json')) {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
const doc = JSON.parse(fs.readFileSync(path.join(GOLDEN_DIR, file), 'utf8'));
|
|
58
|
+
map[doc.key || path.basename(file, '.json')] = doc;
|
|
59
|
+
}
|
|
60
|
+
goldenCache = map;
|
|
61
|
+
return map;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* @param {Object} item
|
|
66
|
+
* @param {Object} query
|
|
67
|
+
* @returns {boolean}
|
|
68
|
+
*/
|
|
69
|
+
function matchesResourceRoleFilter(item, query) {
|
|
70
|
+
if (query.resourceType && item.resourceType !== query.resourceType) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
if (query.role && item.role !== query.role) {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* @param {Object} query
|
|
81
|
+
* @returns {Object}
|
|
82
|
+
*/
|
|
83
|
+
function buildGoldenExamplesTopic(query) {
|
|
84
|
+
const map = loadGoldenExamplesMap();
|
|
85
|
+
const examples = Object.values(map)
|
|
86
|
+
.filter((item) => matchesResourceRoleFilter(item, query))
|
|
87
|
+
.map((item) => ({
|
|
88
|
+
key: item.key,
|
|
89
|
+
title: item.title,
|
|
90
|
+
summary: item.summary,
|
|
91
|
+
resourceType: item.resourceType,
|
|
92
|
+
role: item.role,
|
|
93
|
+
roleAssistantExamples: item.roleAssistantExamples || [],
|
|
94
|
+
recommendedSectionKeys: item.recommendedSectionKeys || []
|
|
95
|
+
}))
|
|
96
|
+
.sort((a, b) => a.key.localeCompare(b.key));
|
|
97
|
+
return buildHelpEnvelope({
|
|
98
|
+
topic: 'goldenExamples',
|
|
99
|
+
key: 'goldenExamples',
|
|
100
|
+
title: 'Golden manifest examples',
|
|
101
|
+
summary: 'Reference patterns for common external integration shapes.',
|
|
102
|
+
data: { examples },
|
|
103
|
+
related: ['goldenExample', 'workflow', 'subscriptionGuide'],
|
|
104
|
+
recommendedNext: ['goldenExample', 'evidencePatterns', 'schemaCatalog']
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* @param {Object} query
|
|
110
|
+
* @returns {Object}
|
|
111
|
+
*/
|
|
112
|
+
function buildGoldenExampleTopic(query) {
|
|
113
|
+
if (!query.exampleKey) {
|
|
114
|
+
throw validationError('exampleKey is required when topic=goldenExample');
|
|
115
|
+
}
|
|
116
|
+
const map = loadGoldenExamplesMap();
|
|
117
|
+
const doc = map[String(query.exampleKey)];
|
|
118
|
+
if (!doc) {
|
|
119
|
+
throw notFoundError(`Unknown exampleKey: ${query.exampleKey}`);
|
|
120
|
+
}
|
|
121
|
+
return buildHelpEnvelope({
|
|
122
|
+
topic: 'goldenExample',
|
|
123
|
+
key: String(query.exampleKey),
|
|
124
|
+
title: doc.title,
|
|
125
|
+
summary: doc.summary,
|
|
126
|
+
data: { example: doc },
|
|
127
|
+
related: ['goldenExamples', 'section'],
|
|
128
|
+
recommendedNext: ['section', 'workflow']
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* @returns {Object}
|
|
134
|
+
*/
|
|
135
|
+
function loadEvidencePatternsDoc() {
|
|
136
|
+
if (evidenceCache) {
|
|
137
|
+
return evidenceCache;
|
|
138
|
+
}
|
|
139
|
+
evidenceCache = JSON.parse(fs.readFileSync(EVIDENCE_PATH, 'utf8'));
|
|
140
|
+
return evidenceCache;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* @param {Object} query
|
|
145
|
+
* @returns {Object}
|
|
146
|
+
*/
|
|
147
|
+
function buildEvidencePatternsTopic(query) {
|
|
148
|
+
const doc = loadEvidencePatternsDoc();
|
|
149
|
+
const patterns = (doc.patterns || [])
|
|
150
|
+
.filter((item) => matchesResourceRoleFilter(item, query))
|
|
151
|
+
.map((item) => ({
|
|
152
|
+
key: item.key,
|
|
153
|
+
title: item.title,
|
|
154
|
+
summary: item.summary,
|
|
155
|
+
role: item.role,
|
|
156
|
+
resourceType: item.resourceType,
|
|
157
|
+
relatedTopics: item.relatedTopics || []
|
|
158
|
+
}))
|
|
159
|
+
.sort((a, b) => a.key.localeCompare(b.key));
|
|
160
|
+
return buildHelpEnvelope({
|
|
161
|
+
topic: 'evidencePatterns',
|
|
162
|
+
key: 'evidencePatterns',
|
|
163
|
+
title: 'Evidence patterns',
|
|
164
|
+
summary: 'Expected agent evidence steps for manifest editing workflows.',
|
|
165
|
+
data: { schemaVersion: doc.schemaVersion, patterns },
|
|
166
|
+
related: ['evidencePattern', 'workflow'],
|
|
167
|
+
recommendedNext: ['evidencePattern', 'goldenExamples']
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* @param {Object} query
|
|
173
|
+
* @returns {Object}
|
|
174
|
+
*/
|
|
175
|
+
function buildEvidencePatternTopic(query) {
|
|
176
|
+
if (!query.exampleKey) {
|
|
177
|
+
throw validationError('exampleKey is required when topic=evidencePattern');
|
|
178
|
+
}
|
|
179
|
+
const doc = loadEvidencePatternsDoc();
|
|
180
|
+
const pattern = (doc.patterns || []).find((item) => item.key === String(query.exampleKey));
|
|
181
|
+
if (!pattern) {
|
|
182
|
+
throw notFoundError(`Unknown evidence pattern key: ${query.exampleKey}`);
|
|
183
|
+
}
|
|
184
|
+
return buildHelpEnvelope({
|
|
185
|
+
topic: 'evidencePattern',
|
|
186
|
+
key: String(query.exampleKey),
|
|
187
|
+
title: pattern.title,
|
|
188
|
+
summary: pattern.summary,
|
|
189
|
+
data: { pattern },
|
|
190
|
+
related: ['evidencePatterns', 'workflow'],
|
|
191
|
+
recommendedNext: ['workflow', 'repairRules']
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
module.exports = {
|
|
196
|
+
buildGoldenExamplesTopic,
|
|
197
|
+
buildGoldenExampleTopic,
|
|
198
|
+
buildEvidencePatternsTopic,
|
|
199
|
+
buildEvidencePatternTopic
|
|
200
|
+
};
|