@aifabrix/builder 2.49.2 → 2.51.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/plans/157.1-security-quality-violations-by-type.csv +374 -0
- package/.cursor/rules/assistant-driven-integration-build.mdc +40 -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/integration/hubspot-test/create-hubspot.js +1 -16
- package/jest.isolated-projects.js +31 -1
- package/jest.projects.js +87 -1
- package/lib/api/dev-server-https.js +1 -1
- package/lib/api/enterprise-knowledge.api.js +63 -0
- package/lib/api/evidence-kinds.api.js +128 -0
- package/lib/api/evidence.api.js +172 -0
- package/lib/api/external-systems.api.js +8 -2
- package/lib/api/pipeline.api.js +5 -1
- package/lib/api/resource-types.api.js +5 -4
- package/lib/api/roles.api.js +121 -0
- package/lib/api/types/enterprise-knowledge.types.js +46 -0
- package/lib/api/types/evidence-kinds.types.js +42 -0
- package/lib/api/types/evidence.types.js +67 -0
- package/lib/api/types/resource-types.types.js +2 -0
- package/lib/api/types/roles.types.js +36 -0
- package/lib/app/certification-verify-rows.js +1 -1
- 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 +39 -90
- 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/merge-certification-from-artifact.js +1 -1
- 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 +18 -5
- 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 +31 -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 +60 -130
- package/lib/cli/setup-app.test-commands.js +26 -52
- package/lib/cli/setup-certification-commands.js +4 -4
- package/lib/cli/setup-certification.help.js +9 -9
- package/lib/cli/setup-dev.js +30 -9
- 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-help-after.js +12 -0
- package/lib/cli/setup-utility-repair.js +26 -7
- package/lib/cli/setup-utility-validate.js +41 -2
- 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 +184 -0
- package/lib/commands/deploy-gate-orchestrator.js +368 -0
- package/lib/commands/dev-cli-handlers.js +7 -62
- package/lib/commands/dev-host-ops-params.js +91 -0
- package/lib/commands/dev-host-ops-poll.js +111 -0
- package/lib/commands/dev-host-ops.js +107 -94
- package/lib/commands/dev-init.js +6 -106
- package/lib/commands/dev-refresh.js +197 -0
- package/lib/commands/enterprise-knowledge.js +284 -0
- package/lib/commands/evidence-cli-leaves.js +250 -0
- package/lib/commands/evidence-kind.js +428 -0
- package/lib/commands/evidence.js +51 -0
- package/lib/commands/governance-cli-shared.js +2 -2
- package/lib/commands/governance-command-action.js +5 -3
- 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 +33 -8
- 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 +166 -44
- package/lib/commands/role.js +452 -0
- package/lib/commands/run-post-publish-data-sync.js +68 -0
- package/lib/commands/setup-modes.js +1 -1
- package/lib/commands/setup.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/validate-json.js +230 -0
- 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 +79 -41
- 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/audit-logger.js +1 -1
- package/lib/core/secrets-env-content.js +10 -4
- package/lib/core/secrets-env-write.js +2 -13
- package/lib/core/secrets-load.js +1 -3
- package/lib/datasource/agent-trust-run.js +3 -3
- package/lib/datasource/capability/relate-operations.js +1 -1
- 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/helpers.js +13 -5
- package/lib/generator/index.js +17 -2
- package/lib/generator/split-variables.js +9 -3
- package/lib/generator/wizard.js +3 -36
- package/lib/infrastructure/helpers-docker-check.js +6 -0
- package/lib/infrastructure/helpers.js +1 -1
- 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 +45 -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 +114 -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 +222 -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 +493 -0
- package/lib/programmatic/openapi-schema-descriptions-certify.js +139 -0
- package/lib/programmatic/openapi-schema-descriptions-core.js +162 -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 +108 -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 +62 -0
- package/lib/programmatic/run-template-workspace.js +74 -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/evidence-kind-file.js +230 -0
- package/lib/resolvers/resource-type-file.js +58 -1
- package/lib/resolvers/role-file.js +227 -0
- package/lib/schema/application-schema.json +22 -2
- package/lib/schema/external-datasource.schema.json +245 -2
- package/lib/schema/external-system.schema.json +259 -119
- package/lib/schema/flag-map-validation-run.json +3 -0
- package/lib/schema/infra.parameter.yaml +25 -1
- package/lib/schema/type/credential-field-registry.json +21 -5
- package/lib/schema/type/document-storage.json +9 -0
- package/lib/utils/agent-trust-run-display.js +1 -1
- package/lib/utils/api.js +8 -2
- package/lib/utils/app-path-resolve.js +168 -0
- package/lib/utils/app-register-config.js +4 -3
- package/lib/utils/authentication-env-template.js +222 -0
- package/lib/utils/cli-sync-options.js +62 -10
- package/lib/utils/cli-utils.js +15 -3
- 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-ca-install.js +5 -6
- package/lib/utils/dev-config.js +2 -2
- package/lib/utils/dev-init-ssh-merge.js +165 -23
- package/lib/utils/dev-list-sort.js +145 -0
- package/lib/utils/dev-pin-share-instructions.js +110 -0
- package/lib/utils/dev-platform-tls.js +0 -63
- package/lib/utils/dev-ssh-config-helper.js +177 -33
- package/lib/utils/docker-build.js +46 -27
- package/lib/utils/docker-daemon-tls-ca.js +1 -1
- package/lib/utils/docker-exec.js +91 -6
- package/lib/utils/enterprise-knowledge-paths.js +142 -0
- package/lib/utils/env-copy.js +3 -4
- package/lib/utils/env-dotenv-format.js +103 -0
- package/lib/utils/error-formatters/error-parser.js +0 -3
- package/lib/utils/external-env-template.js +5 -2
- package/lib/utils/external-system-display.js +5 -1
- package/lib/utils/external-system-readiness-compact-blocks.js +248 -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/health-check-request.js +2 -3
- package/lib/utils/help-builder.js +9 -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/image-name.js +22 -4
- package/lib/utils/integration-path-resolve.js +112 -0
- package/lib/utils/logger.js +37 -4
- package/lib/utils/manifest-source-emit.js +1 -1
- package/lib/utils/paths-reload-source.js +148 -0
- package/lib/utils/paths-system-builder-keys.js +25 -0
- package/lib/utils/paths.js +183 -30
- package/lib/utils/pipeline-upload-auth-retry.js +4 -0
- package/lib/utils/postgres-platform-bootstrap.js +24 -17
- package/lib/utils/postgres-wipe.js +5 -2
- package/lib/utils/remote-dev-auth.js +39 -4
- package/lib/utils/resolve-docker-image-ref.js +36 -6
- 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/token-manager.js +16 -0
- package/lib/utils/upload-sync-options.js +20 -2
- 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 +430 -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/lib/validation/validator.js +6 -5
- package/package.json +76 -37
- 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 +337 -0
- package/scripts/lib/plan-run-core.js +125 -0
- package/scripts/lib/plan-run-report.js +119 -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 +27 -5
- package/templates/applications/dataplane/env.template +38 -15
- package/templates/applications/dataplane/rbac.yaml +85 -3
- package/templates/applications/miso-controller/application.yaml +10 -1
- package/templates/applications/miso-controller/env.template +11 -10
- package/templates/applications/miso-controller/rbac.yaml +72 -0
- 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 +144 -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 +2 -2
- package/templates/typescript/docker-compose.hbs +11 -0
- package/lib/certification/cli-cert-sync-skip.js +0 -21
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Find integration/<systemKey> under aifabrix-work (sibling repos).
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview Worktree integration discovery for dev layouts (sibling repos under aifabrix-work)
|
|
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 { getAifabrixWork } = require('./paths');
|
|
14
|
+
const { resolveApplicationConfigPath } = require('./app-config-resolver');
|
|
15
|
+
const { discoverIntegrationFiles } = require('../commands/repair-internal');
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* @param {string} appPath
|
|
19
|
+
* @returns {boolean}
|
|
20
|
+
*/
|
|
21
|
+
function integrationFolderHasContent(appPath) {
|
|
22
|
+
if (!fs.existsSync(appPath)) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
const st = fs.statSync(appPath);
|
|
27
|
+
if (!st.isDirectory()) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
} catch {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
const { systemFiles, datasourceFiles } = discoverIntegrationFiles(appPath);
|
|
34
|
+
if (systemFiles.length > 0 || datasourceFiles.length > 0) {
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
try {
|
|
38
|
+
resolveApplicationConfigPath(appPath);
|
|
39
|
+
return true;
|
|
40
|
+
} catch {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* @param {string} work
|
|
47
|
+
* @param {string} systemKey
|
|
48
|
+
* @returns {{ integrationPath: string, tier: string }[]}
|
|
49
|
+
*/
|
|
50
|
+
function collectWorkRepoIntegrationHits(work, systemKey) {
|
|
51
|
+
/** @type {{ integrationPath: string, tier: string }[]} */
|
|
52
|
+
const hits = [];
|
|
53
|
+
let entries;
|
|
54
|
+
try {
|
|
55
|
+
entries = fs.readdirSync(work, { withFileTypes: true });
|
|
56
|
+
} catch {
|
|
57
|
+
return hits;
|
|
58
|
+
}
|
|
59
|
+
for (const ent of entries) {
|
|
60
|
+
if (!ent.isDirectory() || ent.name.startsWith('.')) {
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
const candidate = path.join(work, ent.name, 'integration', systemKey);
|
|
64
|
+
if (integrationFolderHasContent(candidate)) {
|
|
65
|
+
hits.push({ integrationPath: path.resolve(candidate), tier: 'work-repo-integration' });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return hits;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* @param {{ integrationPath: string, tier: string }[]} hits
|
|
73
|
+
* @param {string} systemKey
|
|
74
|
+
* @returns {{ integrationPath: string, tier: string }|null}
|
|
75
|
+
*/
|
|
76
|
+
function resolveUniqueIntegrationHit(hits, systemKey) {
|
|
77
|
+
if (hits.length === 1) {
|
|
78
|
+
return hits[0];
|
|
79
|
+
}
|
|
80
|
+
if (hits.length > 1) {
|
|
81
|
+
const err = new Error(
|
|
82
|
+
`Integration "${systemKey}" found in multiple repos under aifabrix-work: ${hits.map((h) => h.integrationPath).join(', ')}. ` +
|
|
83
|
+
'Run from the target repo or narrow with cwd.'
|
|
84
|
+
);
|
|
85
|
+
err.statusCode = 409;
|
|
86
|
+
throw err;
|
|
87
|
+
}
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* @param {string} systemKey
|
|
93
|
+
* @returns {{ integrationPath: string, tier: string }|null}
|
|
94
|
+
*/
|
|
95
|
+
function findIntegrationPathAcrossWorkTree(systemKey) {
|
|
96
|
+
const work = getAifabrixWork();
|
|
97
|
+
if (!work) {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const direct = path.join(work, 'integration', systemKey);
|
|
102
|
+
if (integrationFolderHasContent(direct)) {
|
|
103
|
+
return { integrationPath: path.resolve(direct), tier: 'work-integration' };
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return resolveUniqueIntegrationHit(collectWorkRepoIntegrationHits(work, systemKey), systemKey);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
module.exports = {
|
|
110
|
+
findIntegrationPathAcrossWorkTree,
|
|
111
|
+
integrationFolderHasContent
|
|
112
|
+
};
|
package/lib/utils/logger.js
CHANGED
|
@@ -11,6 +11,39 @@
|
|
|
11
11
|
|
|
12
12
|
/* eslint-disable no-console */
|
|
13
13
|
|
|
14
|
+
const SENSITIVE_KEY_RE = /(password|secret|token|apikey|apiKey|authorization|clientSecret|x-client-token)/i;
|
|
15
|
+
const BEARER_TOKEN_RE = /(Bearer\s+)[A-Za-z0-9._~-]+/gi;
|
|
16
|
+
|
|
17
|
+
function maskString(value) {
|
|
18
|
+
const asString = String(value);
|
|
19
|
+
return asString.replace(BEARER_TOKEN_RE, '$1[REDACTED]');
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function sanitizeValue(value) {
|
|
23
|
+
if (value instanceof Error) {
|
|
24
|
+
return value;
|
|
25
|
+
}
|
|
26
|
+
if (typeof value === 'string') {
|
|
27
|
+
return maskString(value);
|
|
28
|
+
}
|
|
29
|
+
if (Array.isArray(value)) {
|
|
30
|
+
return value.map((item) => sanitizeValue(item));
|
|
31
|
+
}
|
|
32
|
+
if (value && typeof value === 'object') {
|
|
33
|
+
/** @type {Record<string, any>} */
|
|
34
|
+
const out = {};
|
|
35
|
+
for (const [key, entry] of Object.entries(value)) {
|
|
36
|
+
if (SENSITIVE_KEY_RE.test(key)) {
|
|
37
|
+
out[key] = '[REDACTED]';
|
|
38
|
+
} else {
|
|
39
|
+
out[key] = sanitizeValue(entry);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return out;
|
|
43
|
+
}
|
|
44
|
+
return value;
|
|
45
|
+
}
|
|
46
|
+
|
|
14
47
|
/**
|
|
15
48
|
* Logger utility that wraps console methods
|
|
16
49
|
* All console statements should use this logger to avoid eslint warnings
|
|
@@ -21,7 +54,7 @@ const logger = {
|
|
|
21
54
|
* @param {...any} args - Arguments to log
|
|
22
55
|
*/
|
|
23
56
|
log: (...args) => {
|
|
24
|
-
console.log(...args);
|
|
57
|
+
console.log(...args.map((arg) => sanitizeValue(arg)));
|
|
25
58
|
},
|
|
26
59
|
|
|
27
60
|
/**
|
|
@@ -29,7 +62,7 @@ const logger = {
|
|
|
29
62
|
* @param {...any} args - Arguments to log
|
|
30
63
|
*/
|
|
31
64
|
error: (...args) => {
|
|
32
|
-
console.error(...args);
|
|
65
|
+
console.error(...args.map((arg) => sanitizeValue(arg)));
|
|
33
66
|
},
|
|
34
67
|
|
|
35
68
|
/**
|
|
@@ -37,7 +70,7 @@ const logger = {
|
|
|
37
70
|
* @param {...any} args - Arguments to log
|
|
38
71
|
*/
|
|
39
72
|
warn: (...args) => {
|
|
40
|
-
console.warn(...args);
|
|
73
|
+
console.warn(...args.map((arg) => sanitizeValue(arg)));
|
|
41
74
|
},
|
|
42
75
|
|
|
43
76
|
/**
|
|
@@ -45,7 +78,7 @@ const logger = {
|
|
|
45
78
|
* @param {...any} args - Arguments to log
|
|
46
79
|
*/
|
|
47
80
|
info: (...args) => {
|
|
48
|
-
console.log(...args);
|
|
81
|
+
console.log(...args.map((arg) => sanitizeValue(arg)));
|
|
49
82
|
}
|
|
50
83
|
};
|
|
51
84
|
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve product-repo source roots for platform app --reload bind mounts.
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview When builder manifests live under aifabrix-work/builder/<app>, build.context
|
|
5
|
+
* ../.. may point at the work root instead of the product repo; reload mounts must target
|
|
6
|
+
* the repo that contains app/ or packages/.
|
|
7
|
+
* @author AI Fabrix Team
|
|
8
|
+
* @version 1.0.0
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
'use strict';
|
|
12
|
+
|
|
13
|
+
const path = require('path');
|
|
14
|
+
const { isSystemBuilderAppName } = require('./paths-system-builder-keys');
|
|
15
|
+
|
|
16
|
+
const nodeFs = () => require('../internal/fs-real-sync');
|
|
17
|
+
|
|
18
|
+
/** @type {Readonly<Record<string, string[]>>} */
|
|
19
|
+
const SYSTEM_APP_SOURCE_REPO_DIR_NAMES = Object.freeze({
|
|
20
|
+
dataplane: ['aifabrix-dataplane'],
|
|
21
|
+
'miso-controller': ['aifabrix-miso'],
|
|
22
|
+
'builder-api': ['aifabrix-builder']
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
/** @type {Readonly<Record<string, string[]>>} */
|
|
26
|
+
const SYSTEM_APP_RELOAD_MARKERS = Object.freeze({
|
|
27
|
+
dataplane: ['app/main.py'],
|
|
28
|
+
'miso-controller': ['packages/miso-controller/package.json'],
|
|
29
|
+
'builder-api': ['lib/cli.js', 'bin/aifabrix.js']
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* @param {string} appName
|
|
34
|
+
* @param {string} rootPath
|
|
35
|
+
* @returns {boolean}
|
|
36
|
+
*/
|
|
37
|
+
function isValidReloadSourceRoot(appName, rootPath) {
|
|
38
|
+
if (!rootPath || typeof rootPath !== 'string') {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
const markers = SYSTEM_APP_RELOAD_MARKERS[appName];
|
|
42
|
+
if (!markers || markers.length === 0) {
|
|
43
|
+
return nodeFs().existsSync(rootPath);
|
|
44
|
+
}
|
|
45
|
+
return markers.some((rel) => nodeFs().existsSync(path.join(rootPath, rel)));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* @param {string} builderPath
|
|
50
|
+
* @param {string} [buildContext]
|
|
51
|
+
* @returns {string}
|
|
52
|
+
*/
|
|
53
|
+
function resolveBuildContextFromBuilder(builderPath, buildContext = '../..') {
|
|
54
|
+
const ctx = buildContext && typeof buildContext === 'string' ? buildContext : '.';
|
|
55
|
+
return path.resolve(builderPath, ctx);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* @param {{ getAifabrixWork?: () => (string|null), getCwdBuilderAppPath?: (string) => (string|null) }} deps
|
|
60
|
+
* @returns {{ getWork: () => (string|null), getCwdBuilder: (string) => (string|null) }}
|
|
61
|
+
*/
|
|
62
|
+
function resolveReloadDeps(deps) {
|
|
63
|
+
return {
|
|
64
|
+
getWork: deps.getAifabrixWork || (() => require('./paths').getAifabrixWork()),
|
|
65
|
+
getCwdBuilder: deps.getCwdBuilderAppPath || ((name) => require('./paths').getCwdBuilderAppPath(name))
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* @param {string} appName
|
|
71
|
+
* @param {string} builderPath
|
|
72
|
+
* @param {string} buildContext
|
|
73
|
+
* @param {{ getAifabrixWork?: () => (string|null), getCwdBuilderAppPath?: (string) => (string|null) }} deps
|
|
74
|
+
* @returns {string[]}
|
|
75
|
+
*/
|
|
76
|
+
function collectReloadSourceCandidates(appName, builderPath, buildContext, deps) {
|
|
77
|
+
const { getWork, getCwdBuilder } = resolveReloadDeps(deps);
|
|
78
|
+
const candidates = [];
|
|
79
|
+
const cwdHit = getCwdBuilder(appName);
|
|
80
|
+
if (cwdHit) {
|
|
81
|
+
candidates.push(resolveBuildContextFromBuilder(cwdHit, buildContext));
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const work = getWork();
|
|
85
|
+
if (!work) {
|
|
86
|
+
return candidates;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const repoNames = SYSTEM_APP_SOURCE_REPO_DIR_NAMES[appName] || [];
|
|
90
|
+
for (const repoName of repoNames) {
|
|
91
|
+
candidates.push(path.join(work, repoName));
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
for (const entry of nodeFs().readdirSync(work)) {
|
|
95
|
+
if (!entry || entry.startsWith('.')) continue;
|
|
96
|
+
const builderSub = path.join(work, entry, 'builder', appName);
|
|
97
|
+
if (nodeFs().existsSync(builderSub)) {
|
|
98
|
+
candidates.push(resolveBuildContextFromBuilder(builderSub, buildContext));
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
} catch {
|
|
102
|
+
// ignore unreadable work root
|
|
103
|
+
}
|
|
104
|
+
return candidates;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* @param {string} appName
|
|
109
|
+
* @param {string[]} candidates
|
|
110
|
+
* @param {string} fallback
|
|
111
|
+
* @returns {string}
|
|
112
|
+
*/
|
|
113
|
+
function pickFirstValidReloadRoot(appName, candidates, fallback) {
|
|
114
|
+
for (const candidate of candidates) {
|
|
115
|
+
if (isValidReloadSourceRoot(appName, candidate)) {
|
|
116
|
+
return candidate;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return fallback;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Resolve bind-mount source for `--reload` on platform system apps.
|
|
124
|
+
*
|
|
125
|
+
* @param {string} appName
|
|
126
|
+
* @param {string} builderPath - builder/<app> directory used for run
|
|
127
|
+
* @param {string} [buildContext='../..'] - build.context from application.yaml
|
|
128
|
+
* @param {{ getAifabrixWork?: () => (string|null), getCwdBuilderAppPath?: (string) => (string|null) }} [deps]
|
|
129
|
+
* @returns {string}
|
|
130
|
+
*/
|
|
131
|
+
function resolveSystemAppReloadSourceRoot(appName, builderPath, buildContext = '../..', deps = {}) {
|
|
132
|
+
const direct = resolveBuildContextFromBuilder(builderPath, buildContext);
|
|
133
|
+
if (!isSystemBuilderAppName(appName)) {
|
|
134
|
+
return direct;
|
|
135
|
+
}
|
|
136
|
+
if (isValidReloadSourceRoot(appName, direct)) {
|
|
137
|
+
return direct;
|
|
138
|
+
}
|
|
139
|
+
const candidates = collectReloadSourceCandidates(appName, builderPath, buildContext, deps);
|
|
140
|
+
return pickFirstValidReloadRoot(appName, candidates, direct);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
module.exports = {
|
|
144
|
+
SYSTEM_APP_SOURCE_REPO_DIR_NAMES,
|
|
145
|
+
SYSTEM_APP_RELOAD_MARKERS,
|
|
146
|
+
isValidReloadSourceRoot,
|
|
147
|
+
resolveSystemAppReloadSourceRoot
|
|
148
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Platform system builder app keys (shared to avoid circular requires in paths.js).
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview SYSTEM_BUILDER_APP_KEYS for dataplane, miso-controller, etc.
|
|
5
|
+
* @author AI Fabrix Team
|
|
6
|
+
* @version 1.0.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const SYSTEM_BUILDER_APP_KEYS = Object.freeze(['keycloak', 'miso-controller', 'dataplane', 'builder-api']);
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @param {string} appName
|
|
15
|
+
* @returns {boolean}
|
|
16
|
+
*/
|
|
17
|
+
function isSystemBuilderAppName(appName) {
|
|
18
|
+
if (!appName || typeof appName !== 'string') return false;
|
|
19
|
+
return SYSTEM_BUILDER_APP_KEYS.includes(appName);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
module.exports = {
|
|
23
|
+
SYSTEM_BUILDER_APP_KEYS,
|
|
24
|
+
isSystemBuilderAppName
|
|
25
|
+
};
|
package/lib/utils/paths.js
CHANGED
|
@@ -447,7 +447,7 @@ function getBuilderRoot() {
|
|
|
447
447
|
* {@link getSystemBuilderRoot} (= {@link getAppsMaterializationParent}`/builder`), never the global CLI package tree.
|
|
448
448
|
* @readonly
|
|
449
449
|
*/
|
|
450
|
-
const SYSTEM_BUILDER_APP_KEYS = Object.freeze(['keycloak', 'miso-controller', 'dataplane']);
|
|
450
|
+
const SYSTEM_BUILDER_APP_KEYS = Object.freeze(['keycloak', 'miso-controller', 'dataplane', 'builder-api']);
|
|
451
451
|
|
|
452
452
|
/**
|
|
453
453
|
* @param {string} appName
|
|
@@ -537,19 +537,45 @@ function isAppSubdirSync(root, name) {
|
|
|
537
537
|
}
|
|
538
538
|
|
|
539
539
|
/**
|
|
540
|
-
*
|
|
540
|
+
* True when an integration/builder app directory has application config (yaml/json or legacy variables.yaml).
|
|
541
|
+
* Skips helper folders such as fixtures/ and wizard-configs/.
|
|
542
|
+
* @param {string} appDir - Absolute path to candidate app directory
|
|
543
|
+
* @returns {boolean}
|
|
544
|
+
*/
|
|
545
|
+
function hasApplicationConfigSync(appDir) {
|
|
546
|
+
if (!appDir || typeof appDir !== 'string') return false;
|
|
547
|
+
const disk = nodeFs();
|
|
548
|
+
const names = [
|
|
549
|
+
'application.yaml',
|
|
550
|
+
'application.yml',
|
|
551
|
+
'application.json',
|
|
552
|
+
'variables.yaml'
|
|
553
|
+
];
|
|
554
|
+
return names.some((name) => {
|
|
555
|
+
try {
|
|
556
|
+
return disk.existsSync(path.join(appDir, name));
|
|
557
|
+
} catch {
|
|
558
|
+
return false;
|
|
559
|
+
}
|
|
560
|
+
});
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
/**
|
|
564
|
+
* Lists app names (directories) under integration root. Excludes dot-prefixed entries
|
|
565
|
+
* and directories without application config (e.g. fixtures/, wizard-configs/).
|
|
541
566
|
* Returns [] if root does not exist.
|
|
542
567
|
* @returns {string[]} Sorted list of app directory names
|
|
543
568
|
*/
|
|
544
569
|
function listIntegrationAppNames() {
|
|
545
570
|
const disk = nodeFs();
|
|
546
571
|
const names = new Set();
|
|
572
|
+
const withAppConfig = (root) => (name) => hasApplicationConfigSync(path.join(root, name));
|
|
547
573
|
const cwdRoot = getCwdIntegrationRoot();
|
|
548
574
|
if (cwdRoot) {
|
|
549
|
-
addBuilderSubdirNamesToSet(disk, cwdRoot, names,
|
|
575
|
+
addBuilderSubdirNamesToSet(disk, cwdRoot, names, withAppConfig(cwdRoot));
|
|
550
576
|
}
|
|
551
577
|
const matInt = getIntegrationRoot();
|
|
552
|
-
addBuilderSubdirNamesToSet(disk, matInt, names,
|
|
578
|
+
addBuilderSubdirNamesToSet(disk, matInt, names, withAppConfig(matInt));
|
|
553
579
|
return [...names].sort();
|
|
554
580
|
}
|
|
555
581
|
|
|
@@ -595,7 +621,9 @@ function listBuilderAppNames() {
|
|
|
595
621
|
}
|
|
596
622
|
roots.add(path.resolve(getSystemBuilderRoot()));
|
|
597
623
|
for (const r of roots) {
|
|
598
|
-
addBuilderSubdirNamesToSet(disk, r, names,
|
|
624
|
+
addBuilderSubdirNamesToSet(disk, r, names, (name) =>
|
|
625
|
+
hasApplicationConfigSync(path.join(r, name))
|
|
626
|
+
);
|
|
599
627
|
}
|
|
600
628
|
return [...names].sort();
|
|
601
629
|
}
|
|
@@ -611,6 +639,15 @@ function getIntegrationPath(appName) {
|
|
|
611
639
|
if (!appName || typeof appName !== 'string') {
|
|
612
640
|
throw new Error('App name is required and must be a string');
|
|
613
641
|
}
|
|
642
|
+
try {
|
|
643
|
+
const { getIntegrationPathScope } = require('../programmatic/integration-path-scope');
|
|
644
|
+
const scope = getIntegrationPathScope();
|
|
645
|
+
if (scope && typeof scope.resolveIntegrationPath === 'function') {
|
|
646
|
+
return scope.resolveIntegrationPath(appName);
|
|
647
|
+
}
|
|
648
|
+
} catch {
|
|
649
|
+
// programmatic module optional for CLI-only usage
|
|
650
|
+
}
|
|
614
651
|
const cwdInt = path.join(path.resolve(process.cwd()), 'integration', appName);
|
|
615
652
|
try {
|
|
616
653
|
if (nodeFs().existsSync(cwdInt)) {
|
|
@@ -727,25 +764,81 @@ function isExternalAppType(variables) {
|
|
|
727
764
|
* @param {string} appName - Application name
|
|
728
765
|
* @returns {Object|null} App type info or null if no config found
|
|
729
766
|
*/
|
|
730
|
-
function
|
|
731
|
-
const integrationPath = getIntegrationPath(appName);
|
|
732
|
-
let variables;
|
|
767
|
+
function isScopedIntegrationPathActive() {
|
|
733
768
|
try {
|
|
734
|
-
const
|
|
735
|
-
|
|
769
|
+
const { getIntegrationPathScope } = require('../programmatic/integration-path-scope');
|
|
770
|
+
const scope = getIntegrationPathScope();
|
|
771
|
+
return Boolean(scope && typeof scope.resolveIntegrationPath === 'function');
|
|
772
|
+
} catch {
|
|
773
|
+
return false;
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
function externalIntegrationFolderResult(appPath, baseDir = 'integration') {
|
|
778
|
+
return {
|
|
779
|
+
isExternal: true,
|
|
780
|
+
appPath,
|
|
781
|
+
appType: 'external',
|
|
782
|
+
baseDir
|
|
783
|
+
};
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
function isExistingAppDirectory(dirPath) {
|
|
787
|
+
try {
|
|
788
|
+
return fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory();
|
|
736
789
|
} catch {
|
|
790
|
+
return false;
|
|
791
|
+
}
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
function resolveExistingWorkspacePath(appName, options) {
|
|
795
|
+
const { resolveAppWorkspace } = require('./app-path-resolve');
|
|
796
|
+
const { appPath, baseDir } = resolveAppWorkspace(appName, options);
|
|
797
|
+
if (isExistingAppDirectory(appPath)) {
|
|
798
|
+
return { appPath, baseDir };
|
|
799
|
+
}
|
|
800
|
+
const altWorkspace =
|
|
801
|
+
baseDir === 'enterprise-knowledge' ? 'integration' : 'enterprise-knowledge';
|
|
802
|
+
const alt = resolveAppWorkspace(appName, { ...options, workspace: altWorkspace });
|
|
803
|
+
if (!isExistingAppDirectory(alt.appPath)) {
|
|
737
804
|
return null;
|
|
738
805
|
}
|
|
739
|
-
|
|
806
|
+
return { appPath: alt.appPath, baseDir: alt.baseDir };
|
|
807
|
+
}
|
|
808
|
+
|
|
809
|
+
function externalWorkspaceFolderFromConfig(appPath, baseDir, scopedWorkspace) {
|
|
810
|
+
try {
|
|
811
|
+
const configPath = resolveApplicationConfigPath(appPath);
|
|
812
|
+
const variables = loadConfigFile(configPath);
|
|
813
|
+
if (!variables) {
|
|
814
|
+
return null;
|
|
815
|
+
}
|
|
740
816
|
const isExternal = isExternalAppType(variables);
|
|
741
817
|
return {
|
|
742
818
|
isExternal,
|
|
743
|
-
appPath
|
|
819
|
+
appPath,
|
|
744
820
|
appType: isExternal ? 'external' : 'regular',
|
|
745
|
-
baseDir
|
|
821
|
+
baseDir
|
|
746
822
|
};
|
|
823
|
+
} catch {
|
|
824
|
+
if (scopedWorkspace && isExistingAppDirectory(appPath)) {
|
|
825
|
+
return externalIntegrationFolderResult(appPath, baseDir);
|
|
826
|
+
}
|
|
827
|
+
return null;
|
|
747
828
|
}
|
|
748
|
-
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
function checkExternalWorkspaceFolder(appName, options = {}) {
|
|
832
|
+
const located = resolveExistingWorkspacePath(appName, options);
|
|
833
|
+
if (!located) {
|
|
834
|
+
return null;
|
|
835
|
+
}
|
|
836
|
+
const { appPath, baseDir } = located;
|
|
837
|
+
const scopedWorkspace = isScopedIntegrationPathActive();
|
|
838
|
+
if (scopedWorkspace && !isExistingAppDirectory(appPath)) {
|
|
839
|
+
return null;
|
|
840
|
+
}
|
|
841
|
+
return externalWorkspaceFolderFromConfig(appPath, baseDir, scopedWorkspace);
|
|
749
842
|
}
|
|
750
843
|
|
|
751
844
|
/**
|
|
@@ -776,6 +869,41 @@ function checkBuilderFolder(appName) {
|
|
|
776
869
|
}
|
|
777
870
|
return null;
|
|
778
871
|
}
|
|
872
|
+
|
|
873
|
+
/**
|
|
874
|
+
* When {@link getBuilderPath} has no application config but the CLI ships
|
|
875
|
+
* `templates/applications/<appName>/`, materialize `builder/<appName>/` (same as
|
|
876
|
+
* `ensureAppFromTemplate` for platform apps on `up-miso` / `up-dataplane`).
|
|
877
|
+
*
|
|
878
|
+
* @param {string} appName
|
|
879
|
+
* @returns {Promise<boolean>} True when template was copied
|
|
880
|
+
*/
|
|
881
|
+
async function ensureShippedBuilderAppTemplate(appName) {
|
|
882
|
+
if (!appName || typeof appName !== 'string') {
|
|
883
|
+
return false;
|
|
884
|
+
}
|
|
885
|
+
if (isSystemBuilderAppName(appName)) {
|
|
886
|
+
return false;
|
|
887
|
+
}
|
|
888
|
+
const projectRoot = getProjectRoot();
|
|
889
|
+
const templateDir = path.join(projectRoot, 'templates', 'applications', appName);
|
|
890
|
+
if (!fs.existsSync(templateDir) || !fs.statSync(templateDir).isDirectory()) {
|
|
891
|
+
return false;
|
|
892
|
+
}
|
|
893
|
+
const builderPath = getBuilderPath(appName);
|
|
894
|
+
try {
|
|
895
|
+
resolveApplicationConfigPath(builderPath);
|
|
896
|
+
return false;
|
|
897
|
+
} catch {
|
|
898
|
+
// No application config under builder/<appName>; copy shipped template.
|
|
899
|
+
}
|
|
900
|
+
const { copyTemplateFiles } = require('../validation/template');
|
|
901
|
+
const { ensureReadmeForAppPath } = require('../app/readme');
|
|
902
|
+
await copyTemplateFiles(appName, builderPath);
|
|
903
|
+
await ensureReadmeForAppPath(builderPath, appName);
|
|
904
|
+
return true;
|
|
905
|
+
}
|
|
906
|
+
|
|
779
907
|
/**
|
|
780
908
|
* Detects if an app is external type by checking application config.
|
|
781
909
|
* Resolution order: integration/ first, then builder/; if neither exists, throws.
|
|
@@ -786,15 +914,20 @@ function checkBuilderFolder(appName) {
|
|
|
786
914
|
* @returns {Promise<{isExternal: boolean, appPath: string, appType: string, baseDir?: string}>}
|
|
787
915
|
* @throws {Error} When app not found in integration/ or builder/
|
|
788
916
|
*/
|
|
789
|
-
async function detectAppType(appName,
|
|
917
|
+
async function detectAppType(appName, options = {}) {
|
|
790
918
|
if (!appName || typeof appName !== 'string') {
|
|
791
919
|
throw new Error('App name is required and must be a string');
|
|
792
920
|
}
|
|
793
|
-
const
|
|
794
|
-
if (
|
|
921
|
+
const externalResult = checkExternalWorkspaceFolder(appName, options);
|
|
922
|
+
if (externalResult) return externalResult;
|
|
795
923
|
const builderResult = checkBuilderFolder(appName);
|
|
796
924
|
if (builderResult) return builderResult;
|
|
797
|
-
|
|
925
|
+
await ensureShippedBuilderAppTemplate(appName);
|
|
926
|
+
const builderAfterTemplate = checkBuilderFolder(appName);
|
|
927
|
+
if (builderAfterTemplate) return builderAfterTemplate;
|
|
928
|
+
throw new Error(
|
|
929
|
+
`App '${appName}' not found in integration/${appName}, enterprise-knowledge/${appName}, or builder/${appName}`
|
|
930
|
+
);
|
|
798
931
|
}
|
|
799
932
|
|
|
800
933
|
/**
|
|
@@ -808,19 +941,32 @@ async function detectAppType(appName, _options = {}) {
|
|
|
808
941
|
* @returns {Promise<{appPath: string, envOnly: boolean}>} appPath and envOnly (true when only env.template is used)
|
|
809
942
|
* @throws {Error} When app not found in integration or builder
|
|
810
943
|
*/
|
|
811
|
-
|
|
944
|
+
function tryResolveEnvOnlyPath(dirPath) {
|
|
945
|
+
const envTemplatePath = path.join(dirPath, 'env.template');
|
|
946
|
+
if (!fs.existsSync(dirPath) || !fs.existsSync(envTemplatePath)) {
|
|
947
|
+
return null;
|
|
948
|
+
}
|
|
949
|
+
try {
|
|
950
|
+
resolveApplicationConfigPath(dirPath);
|
|
951
|
+
return { appPath: dirPath, envOnly: false };
|
|
952
|
+
} catch {
|
|
953
|
+
return { appPath: dirPath, envOnly: true };
|
|
954
|
+
}
|
|
955
|
+
}
|
|
956
|
+
|
|
957
|
+
async function getResolveAppPath(appName, options = {}) {
|
|
812
958
|
if (!appName || typeof appName !== 'string') {
|
|
813
959
|
throw new Error('App name is required and must be a string');
|
|
814
960
|
}
|
|
815
|
-
const
|
|
816
|
-
const
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
961
|
+
const { resolveAppWorkspace } = require('./app-path-resolve');
|
|
962
|
+
const { appPath: workspacePath } = resolveAppWorkspace(appName, options);
|
|
963
|
+
const workspaceHit = tryResolveEnvOnlyPath(workspacePath);
|
|
964
|
+
if (workspaceHit) {
|
|
965
|
+
return workspaceHit;
|
|
966
|
+
}
|
|
967
|
+
const integrationHit = tryResolveEnvOnlyPath(getIntegrationPath(appName));
|
|
968
|
+
if (integrationHit) {
|
|
969
|
+
return integrationHit;
|
|
824
970
|
}
|
|
825
971
|
const { resolveApplicationManifestPathSync } = require('./manifest-location');
|
|
826
972
|
const manifestHit = resolveApplicationManifestPathSync({
|
|
@@ -831,7 +977,7 @@ async function getResolveAppPath(appName) {
|
|
|
831
977
|
if (manifestHit) {
|
|
832
978
|
return { appPath: manifestHit.absolutePath, envOnly: false };
|
|
833
979
|
}
|
|
834
|
-
const result = await detectAppType(appName);
|
|
980
|
+
const result = await detectAppType(appName, options);
|
|
835
981
|
return { appPath: result.appPath, envOnly: false };
|
|
836
982
|
}
|
|
837
983
|
|
|
@@ -918,9 +1064,16 @@ module.exports = {
|
|
|
918
1064
|
getDeployJsonPath,
|
|
919
1065
|
resolveApplicationConfigPath,
|
|
920
1066
|
resolveRbacPath,
|
|
1067
|
+
ensureShippedBuilderAppTemplate,
|
|
921
1068
|
detectAppType,
|
|
922
1069
|
getResolveAppPath,
|
|
923
1070
|
resolveIntegrationAppKeyFromCwd,
|
|
924
|
-
clearProjectRootCache
|
|
1071
|
+
clearProjectRootCache,
|
|
1072
|
+
resolveSystemAppReloadSourceRoot: require('./paths-reload-source').resolveSystemAppReloadSourceRoot,
|
|
1073
|
+
getEnterpriseKnowledgePath: require('./enterprise-knowledge-paths').getEnterpriseKnowledgePath,
|
|
1074
|
+
getEnterpriseKnowledgeRoot: require('./enterprise-knowledge-paths').getEnterpriseKnowledgeRoot,
|
|
1075
|
+
listEnterpriseKnowledgeAnchors: require('./enterprise-knowledge-paths').listEnterpriseKnowledgeAnchors,
|
|
1076
|
+
resolveAppWorkspace: require('./app-path-resolve').resolveAppWorkspace,
|
|
1077
|
+
resolveExternalSystemPath: require('./app-path-resolve').resolveExternalSystemPath
|
|
925
1078
|
};
|
|
926
1079
|
|
|
@@ -64,6 +64,10 @@ async function uploadApplicationViaPipelineWithAuthRetry(dataplaneUrl, authConfi
|
|
|
64
64
|
if (!isPipelineAuthFailure(first) || authConfig.type !== 'bearer') {
|
|
65
65
|
return first;
|
|
66
66
|
}
|
|
67
|
+
// Token-forward: do not swap the caller JWT for application client-token.
|
|
68
|
+
if (authConfig.preserveBearer) {
|
|
69
|
+
return first;
|
|
70
|
+
}
|
|
67
71
|
const clientAuth = await resolveClientTokenAuthForPipelineRetry(systemKey);
|
|
68
72
|
if (!clientAuth || clientAuth.type === 'bearer') {
|
|
69
73
|
return first;
|