@aifabrix/builder 2.43.0 → 2.44.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/rules/anchor-docs.mdc +15 -0
- package/README.md +1 -1
- package/anchor-docs/README.md +10 -0
- package/anchor-docs/_TEMPLATE +24 -0
- package/bin/aifabrix.js +13 -4
- package/integration/hubspot-test/README.md +31 -0
- package/integration/hubspot-test/create-hubspot.js +5 -5
- package/integration/hubspot-test/hubspot-test-datasource-company.json +58 -462
- package/integration/hubspot-test/hubspot-test-datasource-contact.json +61 -555
- package/integration/hubspot-test/hubspot-test-datasource-deal.json +63 -506
- package/integration/hubspot-test/hubspot-test-datasource-users.json +42 -83
- package/integration/hubspot-test/hubspot-test-deploy.json +3 -3
- package/integration/hubspot-test/test-dataplane-down-tests.js +1 -7
- package/integration/hubspot-test/test-dataplane-down.js +3 -3
- package/integration/hubspot-test/test.js +35 -43
- package/integration/hubspot-test/wizard-hubspot-test-headless.yaml +23 -0
- package/integration/roundtrip-test-local/README.md +144 -0
- package/integration/roundtrip-test-local/application.yaml +13 -0
- package/integration/roundtrip-test-local/env.template +15 -0
- package/integration/roundtrip-test-local/roundtrip-test-local-datasource-roundtrip-test-company.yaml +14 -0
- package/integration/roundtrip-test-local/roundtrip-test-local-deploy.json +61 -0
- package/integration/roundtrip-test-local/roundtrip-test-local-system.yaml +25 -0
- package/integration/roundtrip-test-local2/README.md +144 -0
- package/integration/roundtrip-test-local2/application.yaml +13 -0
- package/integration/roundtrip-test-local2/env.template +15 -0
- package/integration/roundtrip-test-local2/roundtrip-test-local2-datasource-company.yaml +31 -0
- package/integration/roundtrip-test-local2/roundtrip-test-local2-deploy.json +86 -0
- package/integration/roundtrip-test-local2/roundtrip-test-local2-system.yaml +25 -0
- package/integration/test/wizard.yaml +8 -0
- package/jest.config.default.js +10 -0
- package/jest.config.integration.fixtures.js +22 -0
- package/jest.config.integration.js +21 -18
- package/jest.config.isolated.js +10 -0
- package/jest.projects.js +288 -0
- package/lib/api/datasources-core.api.js +3 -3
- package/lib/api/dev-mtls-request.js +110 -0
- package/lib/api/dev-server-https.js +145 -0
- package/lib/api/dev.api.js +133 -144
- package/lib/api/index.js +0 -1
- package/lib/api/pipeline.api.js +67 -20
- package/lib/api/types/dev.types.js +4 -3
- package/lib/api/types/pipeline.types.js +8 -5
- package/lib/api/types/validation-run.types.js +56 -0
- package/lib/api/validation-run.api.js +99 -0
- package/lib/api/validation-runner.js +99 -0
- package/lib/app/config.js +1 -1
- package/lib/app/deploy-status-display.js +2 -2
- package/lib/app/deploy.js +7 -6
- package/lib/app/display.js +2 -1
- package/lib/app/dockerfile.js +3 -2
- package/lib/app/down.js +2 -1
- package/lib/app/helpers.js +6 -5
- package/lib/app/index.js +27 -8
- package/lib/app/list.js +7 -6
- package/lib/app/push.js +4 -3
- package/lib/app/register.js +16 -7
- package/lib/app/rotate-secret.js +14 -13
- package/lib/app/run-container-start.js +184 -0
- package/lib/app/run-docker-fallback.js +108 -0
- package/lib/app/run-env-compose.js +30 -42
- package/lib/app/run-helpers.js +49 -126
- package/lib/app/run-infra-requirements.js +30 -0
- package/lib/app/run-resolve-image.js +21 -0
- package/lib/app/run.js +74 -21
- package/lib/app/show-display.js +1 -1
- package/lib/app/show.js +1 -1
- package/lib/build/index.js +13 -10
- package/lib/cli/index.js +2 -0
- package/lib/cli/setup-app.help.js +67 -0
- package/lib/cli/setup-app.js +57 -121
- package/lib/cli/setup-app.test-commands.js +179 -0
- package/lib/cli/setup-auth.js +19 -5
- package/lib/cli/setup-credential-deployment.js +22 -8
- package/lib/cli/setup-dev-path-commands.js +124 -0
- package/lib/cli/setup-dev.js +170 -113
- package/lib/cli/setup-environment.js +7 -1
- package/lib/cli/setup-external-system.js +62 -22
- package/lib/cli/setup-infra.js +126 -47
- package/lib/cli/setup-parameters.js +32 -0
- package/lib/cli/setup-secrets.js +106 -8
- package/lib/cli/setup-service-user.js +1 -1
- package/lib/cli/setup-utility.js +36 -20
- package/lib/commands/app-down.js +5 -7
- package/lib/commands/app-install.js +14 -7
- package/lib/commands/app-logs.js +13 -10
- package/lib/commands/app-shell.js +4 -1
- package/lib/commands/app-test.js +25 -19
- package/lib/commands/app.js +22 -10
- package/lib/commands/auth-config.js +6 -6
- package/lib/commands/auth-status.js +4 -3
- package/lib/commands/credential-env.js +4 -3
- package/lib/commands/credential-list.js +5 -4
- package/lib/commands/credential-push.js +4 -3
- package/lib/commands/datasource-unified-test-cli.js +495 -0
- package/lib/commands/datasource-unified-test-cli.options.js +149 -0
- package/lib/commands/datasource-validation-cli.js +129 -0
- package/lib/commands/datasource.js +105 -98
- package/lib/commands/deployment-list.js +6 -5
- package/lib/commands/dev-cli-handlers.js +122 -18
- package/lib/commands/dev-down.js +4 -3
- package/lib/commands/dev-init.js +231 -116
- package/lib/commands/dev-show-display.js +473 -0
- package/lib/commands/login-credentials.js +3 -2
- package/lib/commands/login-device.js +4 -3
- package/lib/commands/login.js +5 -4
- package/lib/commands/logout.js +8 -7
- package/lib/commands/parameters-validate.js +54 -0
- package/lib/commands/repair-datasource.js +314 -68
- package/lib/commands/repair-env-template.js +2 -2
- package/lib/commands/repair.js +21 -3
- package/lib/commands/secrets-list.js +23 -12
- package/lib/commands/secrets-remove-all.js +220 -0
- package/lib/commands/secrets-remove.js +21 -12
- package/lib/commands/secrets-set.js +21 -12
- package/lib/commands/secrets-validate.js +4 -4
- package/lib/commands/secure.js +10 -9
- package/lib/commands/service-user.js +26 -25
- package/lib/commands/test-e2e-external.js +27 -1
- package/lib/commands/up-common.js +3 -2
- package/lib/commands/up-dataplane.js +29 -16
- package/lib/commands/up-miso.js +19 -29
- package/lib/commands/upload.js +138 -39
- package/lib/commands/wizard-core-helpers.js +1 -1
- package/lib/commands/wizard-dataplane.js +4 -3
- package/lib/commands/wizard-helpers.js +3 -3
- package/lib/commands/wizard.js +2 -2
- package/lib/core/admin-secrets.js +14 -5
- package/lib/core/audit-logger.js +12 -4
- package/lib/core/config-attach-extensions.js +46 -0
- package/lib/core/config-runtime-paths.js +29 -0
- package/lib/core/config.js +55 -56
- package/lib/core/diff.js +3 -2
- package/lib/core/ensure-encryption-key.js +1 -1
- package/lib/core/secrets-ensure-infra.js +77 -0
- package/lib/core/secrets-ensure.js +120 -64
- package/lib/core/secrets-env-write.js +35 -7
- package/lib/core/secrets-infra-placeholder-sync.js +61 -0
- package/lib/core/secrets.js +200 -37
- package/lib/core/templates-env.js +4 -3
- package/lib/datasource/abac-validator.js +1 -10
- package/lib/datasource/deploy.js +75 -53
- package/lib/datasource/field-reference-validator.js +9 -6
- package/lib/datasource/integration-context.js +63 -0
- package/lib/datasource/list.js +8 -7
- package/lib/datasource/log-viewer.js +84 -53
- package/lib/datasource/resolve-app.js +4 -4
- package/lib/datasource/test-e2e.js +95 -146
- package/lib/datasource/test-integration.js +114 -122
- package/lib/datasource/unified-validation-run-body.js +65 -0
- package/lib/datasource/unified-validation-run-post.js +23 -0
- package/lib/datasource/unified-validation-run-resolve.js +43 -0
- package/lib/datasource/unified-validation-run.js +92 -0
- package/lib/datasource/validate.js +157 -13
- package/lib/deployment/deployer.js +4 -3
- package/lib/deployment/environment.js +7 -6
- package/lib/deployment/push.js +17 -8
- package/lib/external-system/delete.js +4 -3
- package/lib/external-system/deploy.js +131 -53
- package/lib/external-system/download-helpers.js +1 -1
- package/lib/external-system/download.js +7 -6
- package/lib/external-system/generator.js +92 -6
- package/lib/external-system/integration-test-dispatch.js +26 -0
- package/lib/external-system/test-execution.js +5 -1
- package/lib/external-system/test-helpers.js +0 -4
- package/lib/external-system/test-system-level-helpers.js +110 -0
- package/lib/external-system/test-system-level.js +83 -44
- package/lib/external-system/test.js +59 -8
- package/lib/generator/builders.js +23 -11
- package/lib/generator/deploy-manifest-azure-kv.js +81 -0
- package/lib/generator/external.js +16 -4
- package/lib/generator/helpers.js +58 -3
- package/lib/generator/index.js +4 -0
- package/lib/generator/split-readme.js +12 -7
- package/lib/generator/split-variables.js +2 -1
- package/lib/generator/split.js +1 -1
- package/lib/generator/wizard-readme.js +3 -3
- package/lib/generator/wizard.js +8 -8
- package/lib/infrastructure/compose.js +60 -6
- package/lib/infrastructure/helpers.js +201 -29
- package/lib/infrastructure/index.js +28 -17
- package/lib/infrastructure/services.js +21 -15
- package/lib/internal/fs-real-sync.js +104 -0
- package/lib/internal/node-fs.js +98 -0
- package/lib/parameters/database-secret-values.js +173 -0
- package/lib/parameters/infra-kv-discovery.js +121 -0
- package/lib/parameters/infra-parameter-catalog.js +458 -0
- package/lib/parameters/infra-parameter-validate.js +64 -0
- package/lib/schema/application-schema.json +37 -17
- package/lib/schema/datasource-test-run.schema.json +493 -0
- package/lib/schema/deployment-rules.yaml +102 -63
- package/lib/schema/external-datasource.schema.json +1200 -442
- package/lib/schema/external-system.schema.json +181 -5
- package/lib/schema/flag-map-validation-run.json +31 -0
- package/lib/schema/infra-parameter.schema.json +106 -0
- package/lib/schema/infra.parameter.yaml +421 -0
- package/lib/schema/type/credential-auth-templates.json +40 -0
- package/lib/schema/type/document-storage.json +213 -0
- package/lib/schema/type/message-service.json +123 -0
- package/lib/schema/type/vector-store.json +88 -0
- package/lib/utils/aifabrix-runtime-config-dir.js +132 -0
- package/lib/utils/api-error-handler.js +2 -2
- package/lib/utils/api.js +49 -14
- package/lib/utils/app-register-api.js +3 -2
- package/lib/utils/app-register-auth.js +1 -1
- package/lib/utils/app-register-config.js +4 -4
- package/lib/utils/app-register-display.js +3 -2
- package/lib/utils/app-register-validator.js +3 -2
- package/lib/utils/app-run-containers.js +26 -22
- package/lib/utils/app-scoped-config.js +31 -0
- package/lib/utils/app-service-env-from-builder.js +164 -0
- package/lib/utils/build-copy.js +1 -1
- package/lib/utils/build-helpers.js +20 -20
- package/lib/utils/build-resolve-image.js +165 -0
- package/lib/utils/cli-layout-chalk.js +8 -0
- package/lib/utils/cli-test-layout-chalk.js +267 -0
- package/lib/utils/cli-utils.js +88 -11
- package/lib/utils/compose-db-passwords.js +138 -0
- package/lib/utils/compose-generate-docker-compose.js +216 -0
- package/lib/utils/compose-generator.js +197 -291
- package/lib/utils/compose-miso-env.js +18 -0
- package/lib/utils/compose-traefik-ingress-base.js +158 -0
- package/lib/utils/config-paths.js +166 -7
- package/lib/utils/config-scoped-resources-preference.js +41 -0
- package/lib/utils/controller-deployment-outcome.js +68 -0
- package/lib/utils/credential-display.js +2 -2
- package/lib/utils/dataplane-pipeline-warning.js +4 -3
- package/lib/utils/datasource-test-run-capability-scope.js +43 -0
- package/lib/utils/datasource-test-run-debug-display.js +137 -0
- package/lib/utils/datasource-test-run-debug-slice.js +93 -0
- package/lib/utils/datasource-test-run-display.js +442 -0
- package/lib/utils/datasource-test-run-exit.js +58 -0
- package/lib/utils/datasource-test-run-legacy-adapter.js +93 -0
- package/lib/utils/datasource-test-run-report-version.js +51 -0
- package/lib/utils/datasource-test-run-schema-sync.js +59 -0
- package/lib/utils/datasource-test-run-tty-log.js +81 -0
- package/lib/utils/datasource-validation-watch.js +266 -0
- package/lib/utils/declarative-url-ports.js +47 -0
- package/lib/utils/derive-env-key-from-client-id.js +41 -0
- package/lib/utils/dev-ca-install.js +185 -23
- package/lib/utils/dev-cert-helper.js +266 -17
- package/lib/utils/dev-hosts-helper.js +307 -0
- package/lib/utils/dev-init-cert-hints.js +37 -0
- package/lib/utils/dev-init-health-messages.js +52 -0
- package/lib/utils/dev-init-resolve.js +86 -0
- package/lib/utils/dev-init-ssh-merge.js +65 -0
- package/lib/utils/dev-ssh-config-helper.js +196 -0
- package/lib/utils/dev-user-groups.js +93 -0
- package/lib/utils/docker-build.js +42 -17
- package/lib/utils/docker-exec.js +28 -0
- package/lib/utils/docker-manifest-public-port.js +116 -0
- package/lib/utils/docker-not-running-hint.js +52 -0
- package/lib/utils/docker.js +98 -11
- package/lib/utils/ensure-dev-certs-for-remote-docker.js +192 -0
- package/lib/utils/env-config-loader.js +10 -91
- package/lib/utils/env-copy.js +19 -10
- package/lib/utils/env-map.js +35 -8
- package/lib/utils/env-template.js +2 -2
- package/lib/utils/environment-scoped-resources.js +144 -0
- package/lib/utils/error-formatter.js +92 -13
- package/lib/utils/error-formatters/http-status-errors.js +6 -5
- package/lib/utils/error-formatters/network-errors.js +2 -1
- package/lib/utils/error-formatters/permission-errors.js +2 -1
- package/lib/utils/error-formatters/validation-errors.js +2 -1
- package/lib/utils/external-readme.js +8 -1
- package/lib/utils/external-system-display.js +234 -136
- package/lib/utils/external-system-local-test-tty.js +389 -0
- package/lib/utils/external-system-readiness-core.js +377 -0
- package/lib/utils/external-system-readiness-deploy-display.js +270 -0
- package/lib/utils/external-system-readiness-display-internals.js +150 -0
- package/lib/utils/external-system-readiness-display.js +186 -0
- package/lib/utils/external-system-test-helpers.js +24 -6
- package/lib/utils/external-system-validators.js +30 -12
- package/lib/utils/health-check-url.js +119 -0
- package/lib/utils/health-check.js +59 -25
- package/lib/utils/help-builder.js +11 -8
- package/lib/utils/image-version.js +4 -8
- package/lib/utils/infra-containers.js +4 -7
- package/lib/utils/infra-env-defaults.js +162 -0
- package/lib/utils/infra-status-display.js +167 -0
- package/lib/utils/infra-status.js +16 -8
- package/lib/utils/local-secrets.js +3 -4
- package/lib/utils/paths.js +134 -47
- package/lib/utils/port-resolver.js +10 -23
- package/lib/utils/redis-env-scope.js +62 -0
- package/lib/utils/register-aifabrix-shell-env.js +204 -0
- package/lib/utils/remote-builder-validation.js +99 -0
- package/lib/utils/remote-dev-auth.js +117 -21
- package/lib/utils/remote-docker-env.js +67 -15
- package/lib/utils/remote-secrets-loader.js +13 -4
- package/lib/utils/resolve-docker-image-ref.js +124 -0
- package/lib/utils/schema-loader.js +22 -9
- package/lib/utils/secrets-bash-kv.js +25 -0
- package/lib/utils/secrets-generator.js +169 -49
- package/lib/utils/secrets-helpers.js +70 -59
- package/lib/utils/secrets-kv-scope.js +60 -0
- package/lib/utils/secrets-utils.js +32 -38
- package/lib/utils/secrets-validation.js +3 -1
- package/lib/utils/secrets-yaml-preserve.js +109 -0
- package/lib/utils/ssh-key-helper.js +4 -2
- package/lib/utils/template-helpers.js +2 -2
- package/lib/utils/test-log-writer.js +3 -3
- package/lib/utils/token-manager.js +1 -2
- package/lib/utils/url-declarative-public-base.js +188 -0
- package/lib/utils/url-declarative-resolve-build.js +493 -0
- package/lib/utils/url-declarative-resolve-load-doc.js +51 -0
- package/lib/utils/url-declarative-resolve.js +220 -0
- package/lib/utils/url-declarative-token-parse.js +74 -0
- package/lib/utils/url-declarative-url-flags.js +50 -0
- package/lib/utils/url-declarative-vdir-inactive-env.js +99 -0
- package/lib/utils/url-public-path-prefix.js +34 -0
- package/lib/utils/urls-local-registry.js +220 -0
- package/lib/utils/validation-report-tty-kit.js +77 -0
- package/lib/utils/validation-run-poll.js +89 -0
- package/lib/utils/validation-run-post-retry.js +73 -0
- package/lib/utils/validation-run-request.js +98 -0
- package/lib/utils/variable-transformer.js +21 -4
- package/lib/utils/yaml-preserve.js +33 -14
- package/lib/validation/datasource-warnings.js +56 -0
- package/lib/validation/env-template-auth.js +1 -1
- package/lib/validation/external-manifest-validator.js +27 -7
- package/lib/validation/validate-display.js +37 -31
- package/lib/validation/validate.js +4 -13
- package/lib/validation/validator-unresolved-placeholders.js +98 -0
- package/lib/validation/validator.js +22 -65
- package/lib/validation/wizard-config-validator.js +2 -1
- package/package.json +7 -3
- package/scripts/check-datasource-test-run-schema-sync.js +34 -0
- package/scripts/diagnose-cli.js +150 -0
- package/scripts/install-local.js +304 -55
- package/templates/README.md +15 -2
- package/templates/applications/dataplane/application.yaml +52 -2
- package/templates/applications/dataplane/env.template +75 -17
- package/templates/applications/dataplane/rbac.yaml +8 -0
- package/templates/applications/keycloak/application.yaml +9 -1
- package/templates/applications/keycloak/env.template +15 -6
- package/templates/applications/miso-controller/application.yaml +10 -2
- package/templates/applications/miso-controller/env.template +42 -12
- package/templates/applications/miso-controller/rbac.yaml +5 -0
- package/templates/external-system/README.md.hbs +20 -7
- package/templates/external-system/deploy.js.hbs +5 -5
- package/templates/external-system/external-datasource.yaml.hbs +197 -118
- package/templates/infra/compose.yaml.hbs +20 -4
- package/templates/python/docker-compose.hbs +16 -0
- package/templates/typescript/docker-compose.hbs +16 -0
- package/lib/api/external-test.api.js +0 -111
- package/lib/schema/env-config.yaml +0 -60
package/lib/core/audit-logger.js
CHANGED
|
@@ -16,12 +16,12 @@ const path = require('path');
|
|
|
16
16
|
const os = require('os');
|
|
17
17
|
const paths = require('../utils/paths');
|
|
18
18
|
|
|
19
|
-
// Audit log file path (
|
|
19
|
+
// Audit log file path (beside config.yaml / CLI system dir for compliance)
|
|
20
20
|
let auditLogPath = null;
|
|
21
21
|
|
|
22
22
|
/**
|
|
23
23
|
* Gets the audit log file path
|
|
24
|
-
* Creates
|
|
24
|
+
* Creates config / system directory if it doesn't exist
|
|
25
25
|
* @returns {Promise<string>} Path to audit log file
|
|
26
26
|
*/
|
|
27
27
|
async function getAuditLogPath() {
|
|
@@ -29,7 +29,7 @@ async function getAuditLogPath() {
|
|
|
29
29
|
return auditLogPath;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
const aifabrixDir = paths.
|
|
32
|
+
const aifabrixDir = paths.getAifabrixSystemDir();
|
|
33
33
|
|
|
34
34
|
try {
|
|
35
35
|
await fs.mkdir(aifabrixDir, { recursive: true });
|
|
@@ -336,6 +336,13 @@ function extractPathFromUrl(url) {
|
|
|
336
336
|
}
|
|
337
337
|
}
|
|
338
338
|
|
|
339
|
+
/**
|
|
340
|
+
* Clears cached audit log path (for tests that vary getAifabrixSystemDir between calls).
|
|
341
|
+
*/
|
|
342
|
+
function resetAuditLogPathCache() {
|
|
343
|
+
auditLogPath = null;
|
|
344
|
+
}
|
|
345
|
+
|
|
339
346
|
module.exports = {
|
|
340
347
|
auditLog,
|
|
341
348
|
logDeploymentAttempt,
|
|
@@ -345,6 +352,7 @@ module.exports = {
|
|
|
345
352
|
logApplicationCreation,
|
|
346
353
|
logApiCall,
|
|
347
354
|
maskSensitiveData,
|
|
348
|
-
createAuditEntry
|
|
355
|
+
createAuditEntry,
|
|
356
|
+
resetAuditLogPathCache
|
|
349
357
|
};
|
|
350
358
|
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Attach token, path, format, and scoped-resources helpers to config exports.
|
|
3
|
+
*
|
|
4
|
+
* @fileoverview Keeps lib/core/config.js under max-lines
|
|
5
|
+
* @author AI Fabrix Team
|
|
6
|
+
* @version 1.0.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @param {object} exportsObj - Module exports object to mutate
|
|
13
|
+
* @param {object} deps
|
|
14
|
+
* @param {Function} deps.getConfig
|
|
15
|
+
* @param {Function} deps.saveConfig
|
|
16
|
+
* @param {Function} deps.getSecretsEncryptionKey
|
|
17
|
+
* @param {Function} deps.encryptTokenValue
|
|
18
|
+
* @param {Function} deps.decryptTokenValue
|
|
19
|
+
*/
|
|
20
|
+
function attachConfigExtensions(exportsObj, deps) {
|
|
21
|
+
const { getConfig, saveConfig, getSecretsEncryptionKey, encryptTokenValue, decryptTokenValue } = deps;
|
|
22
|
+
|
|
23
|
+
const { createTokenManagementFunctions } = require('../utils/config-tokens');
|
|
24
|
+
Object.assign(
|
|
25
|
+
exportsObj,
|
|
26
|
+
createTokenManagementFunctions({
|
|
27
|
+
getConfigFn: getConfig,
|
|
28
|
+
saveConfigFn: saveConfig,
|
|
29
|
+
getSecretsEncryptionKeyFn: getSecretsEncryptionKey,
|
|
30
|
+
encryptTokenValueFn: encryptTokenValue,
|
|
31
|
+
decryptTokenValueFn: decryptTokenValue,
|
|
32
|
+
isTokenEncryptedFn: require('../utils/token-encryption').isTokenEncrypted
|
|
33
|
+
})
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
const { createPathConfigFunctions } = require('../utils/config-paths');
|
|
37
|
+
Object.assign(exportsObj, createPathConfigFunctions(getConfig, saveConfig));
|
|
38
|
+
|
|
39
|
+
const { createFormatFunctions } = require('../utils/config-format-preference');
|
|
40
|
+
Object.assign(exportsObj, createFormatFunctions(getConfig, saveConfig));
|
|
41
|
+
|
|
42
|
+
const { createScopedResourcesPreferenceFunctions } = require('../utils/config-scoped-resources-preference');
|
|
43
|
+
Object.assign(exportsObj, createScopedResourcesPreferenceFunctions(getConfig, saveConfig));
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
module.exports = { attachConfigExtensions };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolves config.yaml directory/file on each access (aligned with paths.getConfigDirForPaths).
|
|
3
|
+
* Split from config.js for max-lines compliance.
|
|
4
|
+
*
|
|
5
|
+
* @fileoverview Dynamic CONFIG_DIR / CONFIG_FILE for lib/core/config.js
|
|
6
|
+
* @author AI Fabrix Team
|
|
7
|
+
* @version 2.0.0
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
'use strict';
|
|
11
|
+
|
|
12
|
+
const path = require('path');
|
|
13
|
+
const { getAifabrixRuntimeConfigDir } = require('../utils/aifabrix-runtime-config-dir');
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @returns {string}
|
|
17
|
+
*/
|
|
18
|
+
function getRuntimeConfigDir() {
|
|
19
|
+
return getAifabrixRuntimeConfigDir();
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* @returns {string}
|
|
24
|
+
*/
|
|
25
|
+
function getRuntimeConfigFile() {
|
|
26
|
+
return path.join(getRuntimeConfigDir(), 'config.yaml');
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
module.exports = { getRuntimeConfigDir, getRuntimeConfigFile };
|
package/lib/core/config.js
CHANGED
|
@@ -14,31 +14,9 @@ const yaml = require('js-yaml');
|
|
|
14
14
|
const os = require('os');
|
|
15
15
|
const { encryptToken, decryptToken, isTokenEncrypted } = require('../utils/token-encryption');
|
|
16
16
|
const { ensureSecureFilePermissions, ensureSecureDirPermissions } = require('../utils/secure-file-permissions');
|
|
17
|
-
|
|
18
|
-
//
|
|
19
|
-
//
|
|
20
|
-
// 2. AIFABRIX_HOME env = directory containing config.yaml
|
|
21
|
-
// 3. ~/.aifabrix
|
|
22
|
-
// Set AIFABRIX_HOME=/workspace/.aifabrix or AIFABRIX_CONFIG=/workspace/.aifabrix/config.yaml when config is not in default home.
|
|
23
|
-
|
|
24
|
-
function getConfigDir() {
|
|
25
|
-
const configFile = process.env.AIFABRIX_CONFIG && typeof process.env.AIFABRIX_CONFIG === 'string';
|
|
26
|
-
if (configFile) {
|
|
27
|
-
return path.dirname(path.resolve(process.env.AIFABRIX_CONFIG.trim()));
|
|
28
|
-
}
|
|
29
|
-
if (process.env.AIFABRIX_HOME && typeof process.env.AIFABRIX_HOME === 'string') {
|
|
30
|
-
return path.resolve(process.env.AIFABRIX_HOME.trim());
|
|
31
|
-
}
|
|
32
|
-
return path.join(os.homedir(), '.aifabrix');
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
// Runtime config directory and file (respect AIFABRIX_HOME)
|
|
36
|
-
const RUNTIME_CONFIG_DIR = getConfigDir();
|
|
37
|
-
const RUNTIME_CONFIG_FILE = path.join(RUNTIME_CONFIG_DIR, 'config.yaml');
|
|
38
|
-
|
|
39
|
-
// Legacy exports (same as runtime when module loads)
|
|
40
|
-
const CONFIG_DIR = RUNTIME_CONFIG_DIR;
|
|
41
|
-
const CONFIG_FILE = RUNTIME_CONFIG_FILE;
|
|
17
|
+
const { getRuntimeConfigDir, getRuntimeConfigFile } = require('./config-runtime-paths');
|
|
18
|
+
// Avoid importing paths.js here to prevent circular dependency; use shared runtime config dir helper.
|
|
19
|
+
// Config location: AIFABRIX_CONFIG dirname → AIFABRIX_HOME (with ~/.aifabrix fallback when config lives there) → ~/.aifabrix
|
|
42
20
|
|
|
43
21
|
// Cache for developer ID - loaded when getConfig() is first called
|
|
44
22
|
let cachedDeveloperId = null;
|
|
@@ -111,6 +89,9 @@ function applyConfigDefaults(config) {
|
|
|
111
89
|
if (typeof config.device !== 'object' || config.device === null) {
|
|
112
90
|
config.device = {};
|
|
113
91
|
}
|
|
92
|
+
if (typeof config.useEnvironmentScopedResources === 'undefined') {
|
|
93
|
+
config.useEnvironmentScopedResources = false;
|
|
94
|
+
}
|
|
114
95
|
// Ensure controller field exists (but don't set defaults)
|
|
115
96
|
// It will be set by login or auth --set-controller
|
|
116
97
|
return config;
|
|
@@ -128,15 +109,18 @@ function getDefaultConfig() {
|
|
|
128
109
|
controller: undefined,
|
|
129
110
|
environments: {},
|
|
130
111
|
device: {},
|
|
131
|
-
format: undefined
|
|
112
|
+
format: undefined,
|
|
113
|
+
useEnvironmentScopedResources: false
|
|
132
114
|
};
|
|
133
115
|
}
|
|
134
116
|
|
|
135
117
|
async function getConfig() {
|
|
136
118
|
try {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
119
|
+
const dir = getRuntimeConfigDir();
|
|
120
|
+
const file = getRuntimeConfigFile();
|
|
121
|
+
ensureSecureDirPermissions(dir);
|
|
122
|
+
ensureSecureFilePermissions(file);
|
|
123
|
+
const configContent = await fs.readFile(file, 'utf8');
|
|
140
124
|
let config = yaml.load(configContent);
|
|
141
125
|
|
|
142
126
|
// Handle empty file or null/undefined result from yaml.load
|
|
@@ -168,20 +152,22 @@ async function getConfig() {
|
|
|
168
152
|
*/
|
|
169
153
|
async function saveConfig(data) {
|
|
170
154
|
try {
|
|
155
|
+
const dir = getRuntimeConfigDir();
|
|
156
|
+
const file = getRuntimeConfigFile();
|
|
171
157
|
// Create directory if it doesn't exist
|
|
172
|
-
await fs.mkdir(
|
|
158
|
+
await fs.mkdir(dir, { recursive: true });
|
|
173
159
|
|
|
174
160
|
// Set secure permissions
|
|
175
161
|
// Force quotes to ensure numeric-like strings (e.g., "01") remain strings in YAML
|
|
176
162
|
const configContent = yaml.dump(data, { forceQuotes: true });
|
|
177
163
|
// Write file first
|
|
178
|
-
await fs.writeFile(
|
|
164
|
+
await fs.writeFile(file, configContent, {
|
|
179
165
|
mode: 0o600,
|
|
180
166
|
flag: 'w'
|
|
181
167
|
});
|
|
182
168
|
// Open file descriptor and fsync to ensure write is flushed to disk
|
|
183
169
|
// This is critical on Windows where file writes may be cached
|
|
184
|
-
const fd = await fs.open(
|
|
170
|
+
const fd = await fs.open(file, 'r+');
|
|
185
171
|
try {
|
|
186
172
|
await fd.sync();
|
|
187
173
|
} finally {
|
|
@@ -198,7 +184,7 @@ async function saveConfig(data) {
|
|
|
198
184
|
*/
|
|
199
185
|
async function clearConfig() {
|
|
200
186
|
try {
|
|
201
|
-
await fs.unlink(
|
|
187
|
+
await fs.unlink(getRuntimeConfigFile());
|
|
202
188
|
} catch (error) {
|
|
203
189
|
if (error.code !== 'ENOENT') {
|
|
204
190
|
throw new Error(`Failed to clear config: ${error.message}`);
|
|
@@ -236,8 +222,9 @@ async function getDeveloperId() {
|
|
|
236
222
|
*/
|
|
237
223
|
async function verifyDeveloperIdSaved(devIdString) {
|
|
238
224
|
await new Promise(resolve => setTimeout(resolve, 100));
|
|
239
|
-
|
|
240
|
-
|
|
225
|
+
const file = getRuntimeConfigFile();
|
|
226
|
+
ensureSecureFilePermissions(file);
|
|
227
|
+
const savedContent = await fs.readFile(file, 'utf8');
|
|
241
228
|
const savedConfig = yaml.load(savedContent);
|
|
242
229
|
const savedDevIdString = String(savedConfig['developer-id']);
|
|
243
230
|
if (savedDevIdString !== devIdString) {
|
|
@@ -262,6 +249,24 @@ async function getCurrentEnvironment() {
|
|
|
262
249
|
return config.environment || 'dev';
|
|
263
250
|
}
|
|
264
251
|
|
|
252
|
+
/**
|
|
253
|
+
* Whether infra TLS mode is enabled (`tlsEnabled: true` in config.yaml; e.g. after `up-infra --tls`).
|
|
254
|
+
* @returns {Promise<boolean>}
|
|
255
|
+
*/
|
|
256
|
+
async function getTlsEnabled() {
|
|
257
|
+
const cfg = await getConfig();
|
|
258
|
+
return cfg.tlsEnabled === true;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* Whether Traefik is enabled (`traefik: true` in config; infra compose includes the proxy).
|
|
263
|
+
* @returns {Promise<boolean>}
|
|
264
|
+
*/
|
|
265
|
+
async function getTraefikEnabled() {
|
|
266
|
+
const cfg = await getConfig();
|
|
267
|
+
return cfg.traefik === true;
|
|
268
|
+
}
|
|
269
|
+
|
|
265
270
|
/**
|
|
266
271
|
* Resolve environment from configuration
|
|
267
272
|
* Uses config.environment, defaults to 'dev'
|
|
@@ -448,6 +453,8 @@ const exportsObj = {
|
|
|
448
453
|
setDeveloperId,
|
|
449
454
|
loadDeveloperId,
|
|
450
455
|
getCurrentEnvironment,
|
|
456
|
+
getTlsEnabled,
|
|
457
|
+
getTraefikEnabled,
|
|
451
458
|
setCurrentEnvironment,
|
|
452
459
|
resolveEnvironment,
|
|
453
460
|
isTokenExpired,
|
|
@@ -462,8 +469,12 @@ const exportsObj = {
|
|
|
462
469
|
normalizeControllerUrl,
|
|
463
470
|
setControllerUrl,
|
|
464
471
|
getControllerUrl,
|
|
465
|
-
CONFIG_DIR
|
|
466
|
-
|
|
472
|
+
get CONFIG_DIR() {
|
|
473
|
+
return getRuntimeConfigDir();
|
|
474
|
+
},
|
|
475
|
+
get CONFIG_FILE() {
|
|
476
|
+
return getRuntimeConfigFile();
|
|
477
|
+
}
|
|
467
478
|
};
|
|
468
479
|
|
|
469
480
|
// Add developerId as a property getter for direct access
|
|
@@ -477,24 +488,12 @@ Object.defineProperty(exportsObj, 'developerId', {
|
|
|
477
488
|
configurable: true
|
|
478
489
|
});
|
|
479
490
|
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
decryptTokenValueFn: decryptTokenValue,
|
|
488
|
-
isTokenEncryptedFn: require('../utils/token-encryption').isTokenEncrypted
|
|
491
|
+
const { attachConfigExtensions } = require('./config-attach-extensions');
|
|
492
|
+
attachConfigExtensions(exportsObj, {
|
|
493
|
+
getConfig,
|
|
494
|
+
saveConfig,
|
|
495
|
+
getSecretsEncryptionKey,
|
|
496
|
+
encryptTokenValue,
|
|
497
|
+
decryptTokenValue
|
|
489
498
|
});
|
|
490
|
-
Object.assign(exportsObj, tokenFunctions);
|
|
491
|
-
|
|
492
|
-
// Path configuration functions - created after getConfig/saveConfig are defined
|
|
493
|
-
const { createPathConfigFunctions } = require('../utils/config-paths');
|
|
494
|
-
const pathConfigFunctions = createPathConfigFunctions(getConfig, saveConfig);
|
|
495
|
-
Object.assign(exportsObj, pathConfigFunctions);
|
|
496
|
-
// Format preference functions
|
|
497
|
-
const { createFormatFunctions } = require('../utils/config-format-preference');
|
|
498
|
-
const formatFunctions = createFormatFunctions(getConfig, saveConfig);
|
|
499
|
-
Object.assign(exportsObj, formatFunctions);
|
|
500
499
|
module.exports = exportsObj;
|
package/lib/core/diff.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
const { formatSuccessParagraph } = require('../utils/cli-test-layout-chalk');
|
|
1
2
|
/**
|
|
2
3
|
* File Comparison Utilities
|
|
3
4
|
*
|
|
@@ -377,7 +378,7 @@ function displayVersionInfo(diffResult) {
|
|
|
377
378
|
*/
|
|
378
379
|
function displayBreakingChanges(breakingChanges) {
|
|
379
380
|
if (breakingChanges.length > 0) {
|
|
380
|
-
logger.log(chalk.red('\n
|
|
381
|
+
logger.log(chalk.red('\n⚠ Breaking Changes:'));
|
|
381
382
|
breakingChanges.forEach(change => {
|
|
382
383
|
logger.log(chalk.red(` • ${change.description}`));
|
|
383
384
|
});
|
|
@@ -445,7 +446,7 @@ function formatDiffOutput(diffResult) {
|
|
|
445
446
|
logger.log(chalk.blue(`\nComparing: ${diffResult.file1} ↔ ${diffResult.file2}`));
|
|
446
447
|
|
|
447
448
|
if (diffResult.identical) {
|
|
448
|
-
logger.log(
|
|
449
|
+
logger.log(formatSuccessParagraph('Files are identical'));
|
|
449
450
|
return;
|
|
450
451
|
}
|
|
451
452
|
|
|
@@ -37,7 +37,7 @@ async function ensureSecretsEncryptionKey(config) {
|
|
|
37
37
|
const existing = await config.getSecretsEncryptionKey();
|
|
38
38
|
if (existing) return;
|
|
39
39
|
|
|
40
|
-
const userSecretsPath =
|
|
40
|
+
const userSecretsPath = pathsUtil.getPrimaryUserSecretsLocalPath();
|
|
41
41
|
const projectSecretsPath = await config.getSecretsPath();
|
|
42
42
|
|
|
43
43
|
let key = readKeyFromFile(userSecretsPath);
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Infra catalog helpers for secrets-ensure (placeholder context, empty-allowed keys, up-infra key list).
|
|
3
|
+
* @fileoverview Split from secrets-ensure.js for max-lines compliance
|
|
4
|
+
*/
|
|
5
|
+
'use strict';
|
|
6
|
+
|
|
7
|
+
const path = require('path');
|
|
8
|
+
const logger = require('../utils/logger');
|
|
9
|
+
const pathsUtil = require('../utils/paths');
|
|
10
|
+
const { getAllInfraEnsureKeys } = require('../parameters/infra-kv-discovery');
|
|
11
|
+
|
|
12
|
+
/** Shipped infra.parameter.yaml (matches infra-parameter-catalog DEFAULT_CATALOG_PATH). Local join so partial Jest mocks cannot omit DEFAULT_CATALOG_PATH. */
|
|
13
|
+
const BUNDLED_INFRA_PARAMETER_YAML = path.join(__dirname, '..', 'schema', 'infra.parameter.yaml');
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Lazy require so Jest mocks of infra-parameter-catalog apply when this module loads after mocks.
|
|
17
|
+
* @returns {typeof import('../parameters/infra-parameter-catalog')}
|
|
18
|
+
*/
|
|
19
|
+
function infraParameterCatalogModule() {
|
|
20
|
+
return require('../parameters/infra-parameter-catalog');
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Merge infra.parameter.yaml defaults with up-infra CLI options for {{placeholder}} expansion.
|
|
25
|
+
* @param {Object} [options]
|
|
26
|
+
* @returns {Record<string, string>}
|
|
27
|
+
*/
|
|
28
|
+
function buildInfraPlaceholderContext(options) {
|
|
29
|
+
const cat = infraParameterCatalogModule();
|
|
30
|
+
try {
|
|
31
|
+
return cat.mergeInfraParameterDefaultsForCli(cat.getInfraParameterCatalog().data, options || {});
|
|
32
|
+
} catch {
|
|
33
|
+
return cat.mergeInfraParameterDefaultsForCli({}, options || {});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Keys that may stay empty without backfill (catalog generator emptyAllowed).
|
|
39
|
+
* @param {string} key - Secret key
|
|
40
|
+
* @returns {boolean}
|
|
41
|
+
*/
|
|
42
|
+
function isSecretKeyAllowedEmpty(key) {
|
|
43
|
+
const cat = infraParameterCatalogModule();
|
|
44
|
+
try {
|
|
45
|
+
return cat.getInfraParameterCatalog().isKeyAllowedEmpty(key);
|
|
46
|
+
} catch {
|
|
47
|
+
const emptyAllowed = cat.readRelaxedEmptyAllowedKeySet(BUNDLED_INFRA_PARAMETER_YAML);
|
|
48
|
+
return Boolean(emptyAllowed && emptyAllowed.has(key));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Infra secret keys for up-infra: catalog (ensureOn upInfra) + workspace DB/template discovery
|
|
54
|
+
* + standard miso-controller multi-DB keys.
|
|
55
|
+
* @returns {string[]}
|
|
56
|
+
*/
|
|
57
|
+
function getInfraSecretKeysForUpInfra() {
|
|
58
|
+
const cat = infraParameterCatalogModule();
|
|
59
|
+
try {
|
|
60
|
+
const catalog = cat.getInfraParameterCatalog();
|
|
61
|
+
return getAllInfraEnsureKeys(catalog, pathsUtil);
|
|
62
|
+
} catch (err) {
|
|
63
|
+
logger.warn(`Could not build infra secret key list from catalog (${err.message}); using relaxed YAML read.`);
|
|
64
|
+
const relaxed = cat.readRelaxedUpInfraEnsureKeyList(BUNDLED_INFRA_PARAMETER_YAML);
|
|
65
|
+
if (relaxed && relaxed.length > 0) {
|
|
66
|
+
return relaxed;
|
|
67
|
+
}
|
|
68
|
+
logger.warn('Relaxed read of infra.parameter.yaml produced no keys; up-infra may skip secret backfill.');
|
|
69
|
+
return [];
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
module.exports = {
|
|
74
|
+
buildInfraPlaceholderContext,
|
|
75
|
+
isSecretKeyAllowedEmpty,
|
|
76
|
+
getInfraSecretKeysForUpInfra
|
|
77
|
+
};
|