@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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Dev CA Install – SSL untrusted detection, fetch CA from Builder Server, install into OS trust store.
|
|
3
|
-
* Used by `aifabrix dev init` when the server certificate is self-signed.
|
|
4
|
-
*
|
|
3
|
+
* Used by `aifabrix dev init` when the server certificate is self-signed.
|
|
4
|
+
* Requests keep TLS verification enabled by default.
|
|
5
5
|
*
|
|
6
6
|
* @fileoverview CA install utilities for development Builder Server
|
|
7
7
|
* @author AI Fabrix Team
|
|
@@ -163,7 +163,7 @@ function finalizeInstallCaResponse(res, absoluteUrl, chunks, resolve, reject) {
|
|
|
163
163
|
}
|
|
164
164
|
|
|
165
165
|
/**
|
|
166
|
-
* GET absolute install-ca URL with
|
|
166
|
+
* GET absolute install-ca URL with TLS verification enabled; follow redirects.
|
|
167
167
|
* @param {string} absoluteUrl - Full https URL
|
|
168
168
|
* @param {number} redirectCount - Redirect depth
|
|
169
169
|
* @returns {Promise<Buffer>} CA PEM
|
|
@@ -179,10 +179,9 @@ function fetchInstallCaAbsolute(absoluteUrl, redirectCount) {
|
|
|
179
179
|
reject(new Error('install-ca requires https URL'));
|
|
180
180
|
return;
|
|
181
181
|
}
|
|
182
|
-
const agent = new https.Agent({ rejectUnauthorized: false });
|
|
183
182
|
const req = https.get(
|
|
184
183
|
absoluteUrl,
|
|
185
|
-
{
|
|
184
|
+
{},
|
|
186
185
|
(res) => {
|
|
187
186
|
if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {
|
|
188
187
|
res.destroy();
|
|
@@ -208,7 +207,7 @@ function fetchInstallCaAbsolute(absoluteUrl, redirectCount) {
|
|
|
208
207
|
|
|
209
208
|
/**
|
|
210
209
|
* Fetch CA PEM from Builder Server via GET {baseUrl}/install-ca.
|
|
211
|
-
* Uses
|
|
210
|
+
* Uses default TLS verification for this endpoint.
|
|
212
211
|
* @param {string} baseUrl - Builder Server base URL (no trailing slash)
|
|
213
212
|
* @returns {Promise<Buffer>} CA certificate PEM
|
|
214
213
|
*/
|
package/lib/utils/dev-config.js
CHANGED
|
@@ -44,8 +44,8 @@ function getDevPorts(developerId) {
|
|
|
44
44
|
throw new Error('Developer ID must be a positive number');
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
// Handle
|
|
48
|
-
if (
|
|
47
|
+
// Handle invalid numeric values
|
|
48
|
+
if (Number.isNaN(developerId)) {
|
|
49
49
|
throw new Error('Developer ID must be a positive number');
|
|
50
50
|
}
|
|
51
51
|
if (developerId < 0 || !Number.isInteger(developerId)) {
|
|
@@ -2,10 +2,17 @@
|
|
|
2
2
|
* @fileoverview After dev init: merge SSH config Host alias from sync settings / server URL.
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
+
const path = require('path');
|
|
5
6
|
const chalk = require('chalk');
|
|
6
7
|
const config = require('../core/config');
|
|
7
8
|
const logger = require('./logger');
|
|
8
|
-
const { ensureDevSshConfigBlock } = require('./dev-ssh-config-helper');
|
|
9
|
+
const { ensureDevSshConfigBlock, listHostAliasesForUserHost } = require('./dev-ssh-config-helper');
|
|
10
|
+
const { ensureSshDir } = require('./ssh-key-helper');
|
|
11
|
+
const { nodeFs } = require('../internal/node-fs');
|
|
12
|
+
const {
|
|
13
|
+
collectDevSshKnownHostCandidates,
|
|
14
|
+
refreshDevSshKnownHosts
|
|
15
|
+
} = require('./ssh-known-hosts');
|
|
9
16
|
const { successGlyph } = require('./cli-layout-chalk');
|
|
10
17
|
|
|
11
18
|
/**
|
|
@@ -24,6 +31,134 @@ function hostnameFromBaseUrl(baseUrl) {
|
|
|
24
31
|
}
|
|
25
32
|
}
|
|
26
33
|
|
|
34
|
+
/**
|
|
35
|
+
* @param {string} sshDir
|
|
36
|
+
* @returns {Promise<string>}
|
|
37
|
+
*/
|
|
38
|
+
async function readSshConfigContent(sshDir) {
|
|
39
|
+
const configPath = path.join(ensureSshDir(sshDir), 'config');
|
|
40
|
+
try {
|
|
41
|
+
return await nodeFs().promises.readFile(configPath, 'utf8');
|
|
42
|
+
} catch (e) {
|
|
43
|
+
if (e.code === 'ENOENT') {
|
|
44
|
+
return '';
|
|
45
|
+
}
|
|
46
|
+
throw e;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* @param {Object} p
|
|
52
|
+
* @param {string} p.baseUrl
|
|
53
|
+
* @param {string} p.syncHost
|
|
54
|
+
* @param {string} p.syncUser
|
|
55
|
+
* @param {string} p.hostAlias
|
|
56
|
+
* @param {string} p.existingSshConfig
|
|
57
|
+
* @param {string|number} [p.developerId]
|
|
58
|
+
* @param {string} [p.developerRootDomain]
|
|
59
|
+
* @returns {Promise<void>}
|
|
60
|
+
*/
|
|
61
|
+
async function refreshKnownHostsForDevSsh(p) {
|
|
62
|
+
const legacyHostAliases = listHostAliasesForUserHost(
|
|
63
|
+
p.existingSshConfig,
|
|
64
|
+
p.syncHost,
|
|
65
|
+
p.syncUser
|
|
66
|
+
);
|
|
67
|
+
const candidates = collectDevSshKnownHostCandidates({
|
|
68
|
+
syncHost: p.syncHost,
|
|
69
|
+
syncUser: p.syncUser,
|
|
70
|
+
hostAlias: p.hostAlias,
|
|
71
|
+
baseUrl: p.baseUrl,
|
|
72
|
+
developerId: p.developerId,
|
|
73
|
+
developerRootDomain: p.developerRootDomain,
|
|
74
|
+
legacyHostAliases
|
|
75
|
+
});
|
|
76
|
+
const { cleared, failed } = await refreshDevSshKnownHosts(candidates);
|
|
77
|
+
if (cleared.length > 0) {
|
|
78
|
+
logger.log(
|
|
79
|
+
`${chalk.green(' ')}${successGlyph()}${chalk.green(' Cleared stale SSH host keys for ')}` +
|
|
80
|
+
chalk.cyan(cleared.join(', ')) +
|
|
81
|
+
chalk.gray(' (accept the new key on first connect if prompted).')
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
if (failed.some((row) => row.error === 'ssh-keygen not found')) {
|
|
85
|
+
logger.log(
|
|
86
|
+
chalk.yellow(
|
|
87
|
+
' ⚠ ssh-keygen not found; if SSH reports "REMOTE HOST IDENTIFICATION HAS CHANGED", ' +
|
|
88
|
+
`run: ssh-keygen -R ${p.syncHost}`
|
|
89
|
+
)
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* @param {string|undefined} developerRootDomain
|
|
96
|
+
* @returns {string|undefined}
|
|
97
|
+
*/
|
|
98
|
+
function trimDeveloperRootDomain(developerRootDomain) {
|
|
99
|
+
const trimmed = developerRootDomain && String(developerRootDomain).trim();
|
|
100
|
+
return trimmed || undefined;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* @param {Object} res
|
|
105
|
+
* @param {string} syncUser
|
|
106
|
+
* @param {string} syncHost
|
|
107
|
+
* @returns {void}
|
|
108
|
+
*/
|
|
109
|
+
function logSshConfigMergeResult(res, syncUser, syncHost) {
|
|
110
|
+
if (res.skippedDuplicate) {
|
|
111
|
+
logger.log(
|
|
112
|
+
chalk.gray(' SSH config already has ') +
|
|
113
|
+
chalk.cyan(`${syncUser}@${syncHost}`) +
|
|
114
|
+
chalk.gray(` (Host ${res.hostAlias}); left unchanged.`)
|
|
115
|
+
);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const prefix =
|
|
119
|
+
`${chalk.green(' ')}${successGlyph()}${chalk.green(' SSH config updated: ')}` +
|
|
120
|
+
chalk.cyan(`Host ${res.hostAlias}`);
|
|
121
|
+
const suffix = res.migratedFrom
|
|
122
|
+
? chalk.gray(` (was ${res.migratedFrom}) → ${res.configPath}`)
|
|
123
|
+
: chalk.gray(` → ${res.configPath}`);
|
|
124
|
+
logger.log(prefix + suffix);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* @param {Object} p
|
|
129
|
+
* @param {string} p.baseUrl
|
|
130
|
+
* @param {string} p.devId
|
|
131
|
+
* @param {string} p.syncUser
|
|
132
|
+
* @param {string} p.syncHost
|
|
133
|
+
* @param {string|undefined} p.rootTrimmed
|
|
134
|
+
* @returns {Promise<{ hostAlias: string|null, syncUser: string, syncHost: string }>}
|
|
135
|
+
*/
|
|
136
|
+
async function mergeDevSshConfigBlock(p) {
|
|
137
|
+
const sshDir = ensureSshDir();
|
|
138
|
+
const existingSshConfig = await readSshConfigContent(sshDir);
|
|
139
|
+
const res = await ensureDevSshConfigBlock(p.syncUser, p.syncHost, sshDir, {
|
|
140
|
+
developerId: p.devId,
|
|
141
|
+
developerRootDomain: p.rootTrimmed
|
|
142
|
+
});
|
|
143
|
+
if (!res.ok || !res.configPath || !res.hostAlias) {
|
|
144
|
+
if (!res.ok && res.error) {
|
|
145
|
+
logger.log(chalk.yellow(` ⚠ Could not update SSH config: ${res.error}`));
|
|
146
|
+
}
|
|
147
|
+
return { hostAlias: null, syncUser: p.syncUser, syncHost: p.syncHost };
|
|
148
|
+
}
|
|
149
|
+
await refreshKnownHostsForDevSsh({
|
|
150
|
+
baseUrl: p.baseUrl,
|
|
151
|
+
syncHost: p.syncHost,
|
|
152
|
+
syncUser: p.syncUser,
|
|
153
|
+
hostAlias: res.hostAlias,
|
|
154
|
+
existingSshConfig,
|
|
155
|
+
developerId: p.devId,
|
|
156
|
+
developerRootDomain: p.rootTrimmed
|
|
157
|
+
});
|
|
158
|
+
logSshConfigMergeResult(res, p.syncUser, p.syncHost);
|
|
159
|
+
return { hostAlias: res.hostAlias, syncUser: p.syncUser, syncHost: p.syncHost };
|
|
160
|
+
}
|
|
161
|
+
|
|
27
162
|
/**
|
|
28
163
|
* Update ~/.ssh/config with Host <user>.<host> for interactive SSH; log result.
|
|
29
164
|
* @param {string} baseUrl - Builder Server base URL
|
|
@@ -37,30 +172,37 @@ async function mergeDevSshConfigAfterInit(baseUrl, devId) {
|
|
|
37
172
|
return { hostAlias: null, syncUser, syncHost: null };
|
|
38
173
|
}
|
|
39
174
|
try {
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
} else {
|
|
49
|
-
logger.log(
|
|
50
|
-
`${chalk.green(' ')}${successGlyph()}${chalk.green(' SSH config updated: ')}` +
|
|
51
|
-
chalk.cyan(`Host ${res.hostAlias}`) +
|
|
52
|
-
chalk.gray(` → ${res.configPath}`)
|
|
53
|
-
);
|
|
54
|
-
}
|
|
55
|
-
return { hostAlias: res.hostAlias, syncUser, syncHost };
|
|
56
|
-
}
|
|
57
|
-
if (!res.ok && res.error) {
|
|
58
|
-
logger.log(chalk.yellow(` ⚠ Could not update SSH config: ${res.error}`));
|
|
59
|
-
}
|
|
175
|
+
const rootTrimmed = trimDeveloperRootDomain(await config.getDeveloperRootDomain());
|
|
176
|
+
return await mergeDevSshConfigBlock({
|
|
177
|
+
baseUrl,
|
|
178
|
+
devId,
|
|
179
|
+
syncUser,
|
|
180
|
+
syncHost,
|
|
181
|
+
rootTrimmed
|
|
182
|
+
});
|
|
60
183
|
} catch (e) {
|
|
61
184
|
logger.log(chalk.yellow(` ⚠ Could not update SSH config: ${e.message || e}`));
|
|
185
|
+
return { hostAlias: null, syncUser, syncHost };
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* @param {{ hostAlias: string|null }} sshInfo
|
|
191
|
+
* @returns {void}
|
|
192
|
+
*/
|
|
193
|
+
function logDevSshConnectHint(sshInfo) {
|
|
194
|
+
if (!sshInfo || !sshInfo.hostAlias) {
|
|
195
|
+
return;
|
|
62
196
|
}
|
|
63
|
-
|
|
197
|
+
logger.log(
|
|
198
|
+
chalk.gray(' SSH: ') +
|
|
199
|
+
chalk.cyan(`ssh ${sshInfo.hostAlias}`) +
|
|
200
|
+
chalk.gray(' (host keys refreshed if the server was reprovisioned).')
|
|
201
|
+
);
|
|
64
202
|
}
|
|
65
203
|
|
|
66
|
-
module.exports = {
|
|
204
|
+
module.exports = {
|
|
205
|
+
mergeDevSshConfigAfterInit,
|
|
206
|
+
logDevSshConnectHint,
|
|
207
|
+
hostnameFromBaseUrl
|
|
208
|
+
};
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Client-side sort for aifabrix dev list (--sort field / -field).
|
|
3
|
+
* @author AI Fabrix Team
|
|
4
|
+
* @version 2.0.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const ALLOWED_SORT_FIELDS = Object.freeze(['id', 'name', 'email', 'until']);
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* @param {unknown} id
|
|
11
|
+
* @returns {string}
|
|
12
|
+
*/
|
|
13
|
+
function normalizeIdKey(id) {
|
|
14
|
+
const trimmed = String(id ?? '').trim();
|
|
15
|
+
if (!/^\d+$/.test(trimmed)) {
|
|
16
|
+
return trimmed;
|
|
17
|
+
}
|
|
18
|
+
return String(parseInt(trimmed, 10)).padStart(2, '0');
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* @param {unknown} a
|
|
23
|
+
* @param {unknown} b
|
|
24
|
+
* @returns {number}
|
|
25
|
+
*/
|
|
26
|
+
function compareIds(a, b) {
|
|
27
|
+
const sa = String(a ?? '').trim();
|
|
28
|
+
const sb = String(b ?? '').trim();
|
|
29
|
+
if (/^\d+$/.test(sa) && /^\d+$/.test(sb)) {
|
|
30
|
+
return parseInt(sa, 10) - parseInt(sb, 10);
|
|
31
|
+
}
|
|
32
|
+
return normalizeIdKey(sa).localeCompare(normalizeIdKey(sb), undefined, { sensitivity: 'base' });
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @param {string} a
|
|
37
|
+
* @param {string} b
|
|
38
|
+
* @returns {number}
|
|
39
|
+
*/
|
|
40
|
+
function compareText(a, b) {
|
|
41
|
+
return a.localeCompare(b, undefined, { sensitivity: 'base' });
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* @param {Object} user
|
|
46
|
+
* @returns {string}
|
|
47
|
+
*/
|
|
48
|
+
function untilValue(user) {
|
|
49
|
+
const raw = user && user.certificateValidNotAfter;
|
|
50
|
+
return typeof raw === 'string' ? raw.trim() : '';
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Parse --sort option. Default: name ascending.
|
|
55
|
+
* @param {string|undefined|null} sortOption
|
|
56
|
+
* @returns {{ field: string, descending: boolean }}
|
|
57
|
+
* @throws {Error} When field is empty or not allowed
|
|
58
|
+
*/
|
|
59
|
+
function parseSortSpec(sortOption) {
|
|
60
|
+
if (sortOption === undefined || sortOption === null) {
|
|
61
|
+
return { field: 'name', descending: false };
|
|
62
|
+
}
|
|
63
|
+
const trimmed = String(sortOption).trim();
|
|
64
|
+
if (!trimmed) {
|
|
65
|
+
throw new Error(
|
|
66
|
+
'Invalid --sort value "". Allowed: id, name, email, until (prefix - for descending).'
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
let descending = false;
|
|
70
|
+
let fieldPart = trimmed;
|
|
71
|
+
if (fieldPart.startsWith('-')) {
|
|
72
|
+
descending = true;
|
|
73
|
+
fieldPart = fieldPart.slice(1).trim();
|
|
74
|
+
}
|
|
75
|
+
if (!fieldPart) {
|
|
76
|
+
throw new Error(
|
|
77
|
+
'Invalid --sort value "-". Allowed: id, name, email, until (prefix - for descending).'
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
const field = fieldPart.toLowerCase();
|
|
81
|
+
if (!ALLOWED_SORT_FIELDS.includes(field)) {
|
|
82
|
+
throw new Error(
|
|
83
|
+
`Invalid --sort value "${trimmed}". Allowed: id, name, email, until (prefix - for descending).`
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
return { field, descending };
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* @param {Object} a
|
|
91
|
+
* @param {Object} b
|
|
92
|
+
* @param {string} field
|
|
93
|
+
* @returns {number}
|
|
94
|
+
*/
|
|
95
|
+
function compareByField(a, b, field) {
|
|
96
|
+
if (field === 'id') {
|
|
97
|
+
return compareIds(a.id, b.id);
|
|
98
|
+
}
|
|
99
|
+
if (field === 'name') {
|
|
100
|
+
return compareText(String(a.name || ''), String(b.name || ''));
|
|
101
|
+
}
|
|
102
|
+
if (field === 'email') {
|
|
103
|
+
return compareText(String(a.email || ''), String(b.email || ''));
|
|
104
|
+
}
|
|
105
|
+
const ua = untilValue(a);
|
|
106
|
+
const ub = untilValue(b);
|
|
107
|
+
if (!ua && !ub) {
|
|
108
|
+
return 0;
|
|
109
|
+
}
|
|
110
|
+
if (!ua) {
|
|
111
|
+
return 1;
|
|
112
|
+
}
|
|
113
|
+
if (!ub) {
|
|
114
|
+
return -1;
|
|
115
|
+
}
|
|
116
|
+
return compareText(ua, ub);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Sort developer users without mutating the input array.
|
|
121
|
+
* @param {Object[]} users
|
|
122
|
+
* @param {string|undefined|null} sortOption
|
|
123
|
+
* @returns {Object[]}
|
|
124
|
+
*/
|
|
125
|
+
function sortDevUsers(users, sortOption) {
|
|
126
|
+
const { field, descending } = parseSortSpec(sortOption);
|
|
127
|
+
const list = Array.isArray(users) ? [...users] : [];
|
|
128
|
+
list.sort((a, b) => {
|
|
129
|
+
let cmp = compareByField(a, b, field);
|
|
130
|
+
if (descending) {
|
|
131
|
+
cmp = -cmp;
|
|
132
|
+
}
|
|
133
|
+
if (cmp !== 0) {
|
|
134
|
+
return cmp;
|
|
135
|
+
}
|
|
136
|
+
return compareIds(a.id, b.id);
|
|
137
|
+
});
|
|
138
|
+
return list;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
module.exports = {
|
|
142
|
+
ALLOWED_SORT_FIELDS,
|
|
143
|
+
parseSortSpec,
|
|
144
|
+
sortDevUsers
|
|
145
|
+
};
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copy-paste onboarding block for `aifabrix dev pin` (admin → developer).
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview Dev PIN share instructions with platform prerequisites
|
|
5
|
+
* @author AI Fabrix Team
|
|
6
|
+
* @version 1.0.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const chalk = require('chalk');
|
|
12
|
+
const logger = require('./logger');
|
|
13
|
+
const { formatSuccessLine } = require('./cli-test-layout-chalk');
|
|
14
|
+
|
|
15
|
+
const NODE_INSTALL_URL = 'https://nodejs.org/';
|
|
16
|
+
const BUILDER_INSTALL_CMD = 'npm install -g @aifabrix/builder';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @returns {void}
|
|
20
|
+
*/
|
|
21
|
+
function logDevPinPrerequisites() {
|
|
22
|
+
logger.log(chalk.bold('Prerequisites (once per machine):'));
|
|
23
|
+
logger.log('');
|
|
24
|
+
logger.log(chalk.cyan('Windows'));
|
|
25
|
+
logger.log(chalk.gray(` 1. Install Node.js 18+ from ${NODE_INSTALL_URL}`));
|
|
26
|
+
logger.log(` 2. ${BUILDER_INSTALL_CMD}`);
|
|
27
|
+
logger.log('');
|
|
28
|
+
logger.log(chalk.cyan('Linux & macOS'));
|
|
29
|
+
logger.log(
|
|
30
|
+
chalk.gray(` 1. Install Node.js 18+ (${NODE_INSTALL_URL} or your package manager)`)
|
|
31
|
+
);
|
|
32
|
+
logger.log(` 2. ${BUILDER_INSTALL_CMD}`);
|
|
33
|
+
logger.log('');
|
|
34
|
+
logger.log(chalk.gray(' After install, `af` is a shortcut for `aifabrix`.'));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* @param {string} baseInit
|
|
39
|
+
* @param {string} id
|
|
40
|
+
* @param {string} [hostsIp]
|
|
41
|
+
* @returns {void}
|
|
42
|
+
*/
|
|
43
|
+
function logPinHostsVariantLines(baseInit, id, hostsIp) {
|
|
44
|
+
logger.log(
|
|
45
|
+
chalk.cyan('2) Hosts file / administrator')
|
|
46
|
+
+ chalk.gray(
|
|
47
|
+
' — use when the hostname does not resolve and your organisation does not publish DNS for it. '
|
|
48
|
+
+ 'Run in an elevated terminal so the hosts file can be updated, or add the entry manually:'
|
|
49
|
+
)
|
|
50
|
+
);
|
|
51
|
+
if (hostsIp) {
|
|
52
|
+
logger.log(` ${baseInit} --add-hosts --hosts-ip ${hostsIp}`);
|
|
53
|
+
} else {
|
|
54
|
+
logger.log(` ${baseInit} --add-hosts --hosts-ip <server-LAN-IPv4>`);
|
|
55
|
+
logger.log(
|
|
56
|
+
chalk.gray(
|
|
57
|
+
` Replace <server-LAN-IPv4> with the Builder Server IPv4, or re-run: aifabrix dev pin ${id} --hosts-ip <ip>`
|
|
58
|
+
)
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Log copy-paste dev init commands for the developer (standard vs hosts-file).
|
|
65
|
+
* @param {Object} p
|
|
66
|
+
* @param {string} p.id - Developer ID
|
|
67
|
+
* @param {string} p.serverUrl - Builder Server base URL
|
|
68
|
+
* @param {string} p.pin - One-time PIN
|
|
69
|
+
* @param {string} p.expiresAt - PIN expiry (API string)
|
|
70
|
+
* @param {string} [p.hostsIp] - Optional IPv4 for the hosts variant
|
|
71
|
+
* @returns {void}
|
|
72
|
+
*/
|
|
73
|
+
function logDevPinShareInstructions(p) {
|
|
74
|
+
const { id, serverUrl, pin, expiresAt, hostsIp } = p;
|
|
75
|
+
const baseInit = `aifabrix dev init --developer-id ${id} --server ${serverUrl} --pin ${pin}`;
|
|
76
|
+
const pinOnly = `aifabrix dev init --pin ${pin}`;
|
|
77
|
+
logger.log(formatSuccessLine(`PIN created for ${id}, expires ${expiresAt}.`));
|
|
78
|
+
logger.log('');
|
|
79
|
+
logger.log(
|
|
80
|
+
chalk.bold('Share with the developer — prerequisites and onboarding (PIN is one-time):')
|
|
81
|
+
);
|
|
82
|
+
logger.log('');
|
|
83
|
+
logDevPinPrerequisites();
|
|
84
|
+
logger.log('');
|
|
85
|
+
logger.log(chalk.bold('Then run one command to connect (choose the variant that fits):'));
|
|
86
|
+
logger.log('');
|
|
87
|
+
logger.log(
|
|
88
|
+
chalk.cyan('1) Standard')
|
|
89
|
+
+ chalk.gray(' — use when this machine can resolve the server hostname (DNS or hosts already set):')
|
|
90
|
+
);
|
|
91
|
+
logger.log(` ${baseInit}`);
|
|
92
|
+
logger.log('');
|
|
93
|
+
logPinHostsVariantLines(baseInit, id, hostsIp);
|
|
94
|
+
logger.log('');
|
|
95
|
+
logger.log(
|
|
96
|
+
chalk.cyan('3) Config already has remote-server + developer-id')
|
|
97
|
+
+ chalk.gray(
|
|
98
|
+
' — e.g. second machine / SSH session after settings were merged; same onboarding, PIN only:'
|
|
99
|
+
)
|
|
100
|
+
);
|
|
101
|
+
logger.log(` ${pinOnly}`);
|
|
102
|
+
logger.log('');
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
module.exports = {
|
|
106
|
+
BUILDER_INSTALL_CMD,
|
|
107
|
+
NODE_INSTALL_URL,
|
|
108
|
+
logDevPinPrerequisites,
|
|
109
|
+
logDevPinShareInstructions
|
|
110
|
+
};
|
|
@@ -8,7 +8,6 @@
|
|
|
8
8
|
|
|
9
9
|
'use strict';
|
|
10
10
|
|
|
11
|
-
const https = require('https');
|
|
12
11
|
const config = require('../core/config');
|
|
13
12
|
const { isLocalhostPublicSchemeHostname } = require('./localhost-public-host');
|
|
14
13
|
|
|
@@ -68,65 +67,6 @@ async function shouldAllowInsecureDevPlatformTls(url) {
|
|
|
68
67
|
}
|
|
69
68
|
}
|
|
70
69
|
|
|
71
|
-
/**
|
|
72
|
-
* Minimal fetch for self-signed dev platform HTTPS (Node global fetch cannot set rejectUnauthorized).
|
|
73
|
-
*
|
|
74
|
-
* @param {string} url
|
|
75
|
-
* @param {Object} options
|
|
76
|
-
* @returns {Promise<{ status: number, statusText: string, headers: { get: Function }, text: Function, json: Function }>}
|
|
77
|
-
*/
|
|
78
|
-
function nodeHttpsFetchInsecure(url, options = {}) {
|
|
79
|
-
return new Promise((resolve, reject) => {
|
|
80
|
-
const u = new URL(url);
|
|
81
|
-
const method = String(options.method || 'GET').toUpperCase();
|
|
82
|
-
const headers = { ...(options.headers || {}) };
|
|
83
|
-
const body = options.body;
|
|
84
|
-
const reqOpts = {
|
|
85
|
-
hostname: u.hostname,
|
|
86
|
-
port: u.port || 443,
|
|
87
|
-
path: `${u.pathname}${u.search}`,
|
|
88
|
-
method,
|
|
89
|
-
headers,
|
|
90
|
-
rejectUnauthorized: false
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
const req = https.request(reqOpts, (res) => {
|
|
94
|
-
const chunks = [];
|
|
95
|
-
res.on('data', (chunk) => chunks.push(chunk));
|
|
96
|
-
res.on('end', () => {
|
|
97
|
-
const raw = Buffer.concat(chunks).toString('utf8');
|
|
98
|
-
const status = res.statusCode || 0;
|
|
99
|
-
resolve({
|
|
100
|
-
ok: status >= 200 && status < 300,
|
|
101
|
-
status,
|
|
102
|
-
statusText: res.statusMessage || '',
|
|
103
|
-
headers: {
|
|
104
|
-
get: (name) => res.headers[String(name || '').toLowerCase()] || null
|
|
105
|
-
},
|
|
106
|
-
text: async() => raw,
|
|
107
|
-
json: async() => JSON.parse(raw)
|
|
108
|
-
});
|
|
109
|
-
});
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
req.on('error', reject);
|
|
113
|
-
if (options.signal) {
|
|
114
|
-
const onAbort = () => {
|
|
115
|
-
req.destroy(new Error('The operation was aborted'));
|
|
116
|
-
};
|
|
117
|
-
if (options.signal.aborted) {
|
|
118
|
-
onAbort();
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
options.signal.addEventListener('abort', onAbort, { once: true });
|
|
122
|
-
}
|
|
123
|
-
if (body !== undefined && body !== null) {
|
|
124
|
-
req.write(typeof body === 'string' ? body : String(body));
|
|
125
|
-
}
|
|
126
|
-
req.end();
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
|
|
130
70
|
/**
|
|
131
71
|
* @async
|
|
132
72
|
* @param {string} url
|
|
@@ -134,9 +74,6 @@ function nodeHttpsFetchInsecure(url, options = {}) {
|
|
|
134
74
|
* @returns {Promise<Response>}
|
|
135
75
|
*/
|
|
136
76
|
async function fetchWithOptionalDevPlatformTls(url, options = {}) {
|
|
137
|
-
if (await shouldAllowInsecureDevPlatformTls(url)) {
|
|
138
|
-
return nodeHttpsFetchInsecure(url, options);
|
|
139
|
-
}
|
|
140
77
|
return fetch(url, options);
|
|
141
78
|
}
|
|
142
79
|
|