@aifabrix/builder 2.44.6 → 2.45.5

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.
Files changed (257) hide show
  1. package/.cursor/rules/cli-layout.mdc +7 -3
  2. package/.cursor/rules/docs-rules.mdc +3 -1
  3. package/integration/hubspot-test/test-artifacts/wizard-hubspot-credential-real.yaml +1 -1
  4. package/integration/hubspot-test/test-artifacts/wizard-hubspot-env-vars.yaml +1 -1
  5. package/integration/hubspot-test/wizard-hubspot-e2e.yaml +1 -1
  6. package/jest.projects.js +100 -1
  7. package/lib/api/agent-metadata-validation.api.js +93 -0
  8. package/lib/api/audit-api-helpers.js +68 -0
  9. package/lib/api/audit.api.js +119 -0
  10. package/lib/api/auth-cache.api.js +44 -0
  11. package/lib/api/certificates.api.js +4 -4
  12. package/lib/api/credential.api.js +2 -2
  13. package/lib/api/dataplane-health.api.js +137 -0
  14. package/lib/api/dataplane-sync.api.js +27 -0
  15. package/lib/api/datasources-core.api.js +21 -18
  16. package/lib/api/datasources-extended.api.js +22 -22
  17. package/lib/api/dimensions.api.js +3 -0
  18. package/lib/api/external-systems.api.js +13 -13
  19. package/lib/api/governance-scenarios.api.js +39 -0
  20. package/lib/api/groups.api.js +79 -0
  21. package/lib/api/index.js +45 -2
  22. package/lib/api/pipeline.api.js +4 -4
  23. package/lib/api/protection.api.js +157 -0
  24. package/lib/api/records-bulk.api.js +30 -0
  25. package/lib/api/records-search-parse.js +49 -0
  26. package/lib/api/records-search.api.js +29 -0
  27. package/lib/api/types/agent-metadata-validation.types.js +67 -0
  28. package/lib/api/types/audit.types.js +72 -0
  29. package/lib/api/types/dataplane-health.types.js +27 -0
  30. package/lib/api/types/dimensions.types.js +2 -0
  31. package/lib/api/types/governance-scenarios.types.js +39 -0
  32. package/lib/api/types/protection.types.js +69 -0
  33. package/lib/api/types/records-bulk.types.js +35 -0
  34. package/lib/api/types/records-search.types.js +28 -0
  35. package/lib/api/user-groups.api.js +50 -0
  36. package/lib/api/users.api.js +95 -0
  37. package/lib/api/validation-run.api.js +3 -3
  38. package/lib/api/validation-runner.js +3 -3
  39. package/lib/api/wizard-platform.api.js +3 -3
  40. package/lib/api/wizard.api.js +21 -21
  41. package/lib/app/deploy.js +34 -19
  42. package/lib/app/helpers.js +3 -3
  43. package/lib/app/index.js +3 -3
  44. package/lib/app/register.js +7 -6
  45. package/lib/app/restart-display.js +52 -21
  46. package/lib/app/rotate-secret.js +7 -6
  47. package/lib/app/run-helpers.js +15 -8
  48. package/lib/app/run.js +57 -9
  49. package/lib/app/show-display.js +7 -0
  50. package/lib/app/show.js +87 -5
  51. package/lib/build/index.js +9 -5
  52. package/lib/cli/index.js +4 -2
  53. package/lib/cli/infra-guided.js +62 -28
  54. package/lib/cli/installation-log-command.js +73 -0
  55. package/lib/cli/setup-app.help.js +50 -2
  56. package/lib/cli/setup-app.js +44 -25
  57. package/lib/cli/setup-app.test-commands.js +80 -21
  58. package/lib/cli/setup-auth.js +124 -52
  59. package/lib/cli/setup-external-system.js +37 -3
  60. package/lib/cli/setup-infra-up-dataplane-action.js +111 -0
  61. package/lib/cli/setup-infra-up-platform-action.js +131 -0
  62. package/lib/cli/setup-infra.js +60 -119
  63. package/lib/cli/setup-platform.js +1 -1
  64. package/lib/cli/setup-utility-help-after.js +45 -0
  65. package/lib/cli/setup-utility-resolve.js +132 -0
  66. package/lib/cli/setup-utility.js +148 -116
  67. package/lib/commands/app-logs.js +81 -33
  68. package/lib/commands/auth-config.js +116 -18
  69. package/lib/commands/auth-status-dataplane-version.js +231 -0
  70. package/lib/commands/auth-status-display.js +94 -0
  71. package/lib/commands/auth-status.js +70 -6
  72. package/lib/commands/credential-push.js +10 -5
  73. package/lib/commands/datasource-load-export-cli.js +178 -0
  74. package/lib/commands/datasource-test-trust-cli.js +114 -0
  75. package/lib/commands/datasource-unified-test-cli.js +25 -17
  76. package/lib/commands/datasource-unified-test-cli.options.js +18 -3
  77. package/lib/commands/datasource-unified-test-e2e-cli-helpers.js +5 -5
  78. package/lib/commands/datasource-verify-audit-cli.js +96 -0
  79. package/lib/commands/datasource.js +68 -1
  80. package/lib/commands/dimension-value.js +43 -13
  81. package/lib/commands/dimension.js +38 -7
  82. package/lib/commands/identity-apply-sync.js +131 -0
  83. package/lib/commands/identity-group-cli.js +146 -0
  84. package/lib/commands/identity-membership-role-cache.js +175 -0
  85. package/lib/commands/identity-shared.js +94 -0
  86. package/lib/commands/identity-user-cli.js +158 -0
  87. package/lib/commands/identity.js +43 -0
  88. package/lib/commands/login.js +46 -16
  89. package/lib/commands/protection-cli-leaves.js +286 -0
  90. package/lib/commands/protection.js +50 -0
  91. package/lib/commands/repair.js +13 -3
  92. package/lib/commands/setup-modes.js +19 -6
  93. package/lib/commands/setup-prompts.js +41 -8
  94. package/lib/commands/setup.js +114 -9
  95. package/lib/commands/teardown.js +54 -5
  96. package/lib/commands/test-e2e-external.js +40 -9
  97. package/lib/commands/test-governance-cli-options.js +47 -0
  98. package/lib/commands/test-governance-command-action.js +55 -0
  99. package/lib/commands/test-governance-external.js +88 -0
  100. package/lib/commands/test-trust-cli-options.js +32 -0
  101. package/lib/commands/test-trust-command-action.js +118 -0
  102. package/lib/commands/test-trust-external.js +127 -0
  103. package/lib/commands/up-common.js +48 -14
  104. package/lib/commands/up-dataplane.js +21 -18
  105. package/lib/commands/up-miso.js +12 -8
  106. package/lib/commands/upload.js +38 -15
  107. package/lib/commands/wizard-core.js +3 -0
  108. package/lib/core/audit-logger.js +1 -34
  109. package/lib/core/config-admin-email.js +56 -0
  110. package/lib/core/config-device-dataplane.js +185 -0
  111. package/lib/core/config-normalize.js +60 -0
  112. package/lib/core/config-registered-controller-urls.js +54 -0
  113. package/lib/core/config.js +33 -50
  114. package/lib/core/secrets-ensure-infra.js +1 -1
  115. package/lib/core/secrets-env-content.js +86 -90
  116. package/lib/core/secrets-env-declarative-expand.js +170 -0
  117. package/lib/core/secrets-env-write.js +2 -0
  118. package/lib/core/secrets-load.js +106 -102
  119. package/lib/datasource/agent-trust-debug-log.js +45 -0
  120. package/lib/datasource/agent-trust-fetch.js +115 -0
  121. package/lib/datasource/agent-trust-map.js +101 -0
  122. package/lib/datasource/agent-trust-mock.js +44 -0
  123. package/lib/datasource/agent-trust-run.js +93 -0
  124. package/lib/datasource/agent-trust-timeout.js +25 -0
  125. package/lib/datasource/audit-evidence-display.js +80 -0
  126. package/lib/datasource/audit-evidence-extract-debug.js +103 -0
  127. package/lib/datasource/audit-evidence-extract.js +177 -0
  128. package/lib/datasource/audit-evidence-matrix-rows.js +158 -0
  129. package/lib/datasource/audit-evidence-operation-aliases.js +63 -0
  130. package/lib/datasource/audit-evidence-poll.js +109 -0
  131. package/lib/datasource/audit-evidence-run.js +177 -0
  132. package/lib/datasource/audit-evidence-verify-helpers.js +167 -0
  133. package/lib/datasource/audit-evidence-verify-matrix.js +177 -0
  134. package/lib/datasource/audit-evidence-verify.js +108 -0
  135. package/lib/datasource/bulk-loader-run-batches.js +88 -0
  136. package/lib/datasource/bulk-loader-service-retry.js +52 -0
  137. package/lib/datasource/bulk-loader-service.js +127 -0
  138. package/lib/datasource/capability/run-capability-dimension.js +2 -1
  139. package/lib/datasource/datasource-exporter-resolve.js +82 -0
  140. package/lib/datasource/datasource-exporter-service.js +144 -0
  141. package/lib/datasource/datasource-identifier.js +148 -0
  142. package/lib/datasource/datasource-load-export-context.js +92 -0
  143. package/lib/datasource/integration-context.js +6 -4
  144. package/lib/datasource/local-data-paths.js +145 -0
  145. package/lib/datasource/log-cleaner.js +241 -0
  146. package/lib/datasource/log-viewer.js +111 -6
  147. package/lib/datasource/record-file-parser.js +85 -0
  148. package/lib/datasource/record-mapper.js +129 -0
  149. package/lib/datasource/resolve-app.js +74 -55
  150. package/lib/datasource/test-e2e.js +26 -2
  151. package/lib/datasource/unified-validation-run-resolve.js +45 -12
  152. package/lib/datasource/unified-validation-run.js +43 -17
  153. package/lib/datasource/validate.js +37 -20
  154. package/lib/external-system/deploy.js +5 -1
  155. package/lib/external-system/test-system-level.js +25 -4
  156. package/lib/external-system/test.js +3 -1
  157. package/lib/governance/governance-pack-loader.js +70 -0
  158. package/lib/governance/governance-run-display.js +119 -0
  159. package/lib/identity/identity-apply-core.js +108 -0
  160. package/lib/identity/identity-apply-phases.js +244 -0
  161. package/lib/identity/identity-apply-service.js +77 -0
  162. package/lib/identity/identity-csv-parser.js +114 -0
  163. package/lib/internal/fs-real-sync.js +29 -1
  164. package/lib/internal/node-fs.js +2 -0
  165. package/lib/protection/auth-context.js +45 -0
  166. package/lib/protection/convert-batch.js +90 -0
  167. package/lib/protection/load.js +41 -0
  168. package/lib/protection/paths.js +158 -0
  169. package/lib/protection/preflight-datasource-ready.js +46 -0
  170. package/lib/protection/protection-create-probe-lines.js +142 -0
  171. package/lib/protection/protection-create-probes.js +95 -0
  172. package/lib/protection/protection-create-scaffold.js +281 -0
  173. package/lib/protection/protection-display-helpers.js +445 -0
  174. package/lib/protection/protection-display.js +215 -0
  175. package/lib/protection/protection-preset-registry.js +97 -0
  176. package/lib/protection/report-exit.js +62 -0
  177. package/lib/protection/resolve.js +202 -0
  178. package/lib/protection/run-commands-validate.js +130 -0
  179. package/lib/protection/run-commands.js +216 -0
  180. package/lib/protection/run-protection-create-helpers.js +134 -0
  181. package/lib/protection/run-protection-create-probes-flow.js +43 -0
  182. package/lib/protection/run-protection-create.js +191 -0
  183. package/lib/protection/scope.js +22 -0
  184. package/lib/protection/sync-after-upload.js +64 -0
  185. package/lib/protection/upload-batch.js +127 -0
  186. package/lib/protection/validate-batch.js +113 -0
  187. package/lib/protection/validate-local.js +65 -0
  188. package/lib/resolvers/dimension-file.js +29 -4
  189. package/lib/schema/application-schema.json +4 -0
  190. package/lib/schema/external-datasource.schema.json +47 -13
  191. package/lib/schema/flag-map-validation-run.json +2 -2
  192. package/lib/schema/infra.parameter.yaml +10 -0
  193. package/lib/schema/protection.schema.json +374 -0
  194. package/lib/schema/type/credential-field-registry.json +636 -0
  195. package/lib/schema/wizard-config.schema.json +1 -1
  196. package/lib/utils/agent-trust-run-display.js +231 -0
  197. package/lib/utils/agent-trust-run-exit.js +59 -0
  198. package/lib/utils/agent-trust-wait-ui.js +94 -0
  199. package/lib/utils/app-config-resolver.js +24 -1
  200. package/lib/utils/applications-config-defaults.js +206 -0
  201. package/lib/utils/auth-config-validator.js +2 -12
  202. package/lib/utils/bash-secret-env.js +1 -1
  203. package/lib/utils/cli-exit-codes.js +30 -0
  204. package/lib/utils/cli-sync-options.js +33 -0
  205. package/lib/utils/compose-generate-docker-compose.js +111 -6
  206. package/lib/utils/compose-generator.js +17 -8
  207. package/lib/utils/controller-url.js +50 -7
  208. package/lib/utils/credential-push-ui.js +90 -0
  209. package/lib/utils/dataplane-cli-version-gate.js +202 -0
  210. package/lib/utils/dataplane-cli-version-help.js +74 -0
  211. package/lib/utils/datasource-export-display.js +137 -0
  212. package/lib/utils/datasource-load-display.js +174 -0
  213. package/lib/utils/datasource-load-export-ui.js +120 -0
  214. package/lib/utils/datasource-test-run-capability-scope.js +3 -3
  215. package/lib/utils/datasource-test-run-display.js +3 -3
  216. package/lib/utils/datasource-test-run-tty-log.js +5 -1
  217. package/lib/utils/env-copy.js +99 -14
  218. package/lib/utils/env-template.js +5 -1
  219. package/lib/utils/health-check-url.js +18 -15
  220. package/lib/utils/health-check.js +7 -5
  221. package/lib/utils/help-builder.js +30 -24
  222. package/lib/utils/infra-optional-service-flags.js +69 -0
  223. package/lib/utils/installation-log-core.js +282 -0
  224. package/lib/utils/installation-log-record.js +237 -0
  225. package/lib/utils/installation-log.js +123 -0
  226. package/lib/utils/log-redaction.js +105 -0
  227. package/lib/utils/manifest-location.js +164 -0
  228. package/lib/utils/manifest-source-emit.js +184 -0
  229. package/lib/utils/paths.js +238 -89
  230. package/lib/utils/remote-secrets-loader.js +7 -1
  231. package/lib/utils/run-cli-flags.js +29 -0
  232. package/lib/utils/secrets-canonical.js +10 -3
  233. package/lib/utils/secrets-path.js +3 -4
  234. package/lib/utils/secrets-utils.js +20 -10
  235. package/lib/utils/semver-compare.js +127 -0
  236. package/lib/utils/system-builder-root.js +10 -2
  237. package/lib/utils/upload-pipeline-ui.js +91 -0
  238. package/lib/utils/url-declarative-public-base.js +80 -12
  239. package/lib/utils/url-declarative-resolve-build-urls.js +238 -0
  240. package/lib/utils/url-declarative-resolve-build.js +24 -393
  241. package/lib/utils/url-declarative-resolve-expand-token.js +189 -0
  242. package/lib/utils/url-declarative-resolve-load-doc.js +12 -3
  243. package/lib/utils/url-declarative-resolve-surface-state.js +102 -0
  244. package/lib/utils/url-declarative-resolve.js +47 -7
  245. package/lib/utils/url-declarative-runtime-base-path.js +21 -1
  246. package/lib/utils/urls-local-registry-scan.js +103 -0
  247. package/lib/utils/urls-local-registry.js +161 -90
  248. package/lib/utils/validation-poll-ui.js +14 -7
  249. package/lib/validation/wizard-config-validator.js +58 -19
  250. package/package.json +3 -1
  251. package/templates/applications/dataplane/application.yaml +4 -0
  252. package/templates/applications/dataplane/env.template +13 -1
  253. package/templates/applications/dataplane/rbac.yaml +4 -0
  254. package/templates/applications/miso-controller/application.yaml +2 -0
  255. package/templates/applications/miso-controller/env.template +27 -29
  256. package/templates/external-system/README.md.hbs +56 -8
  257. package/.npmrc.token +0 -1
@@ -12,7 +12,7 @@ When you touch **CLI surface** (`bin/aifabrix.js`, `lib/cli.js`, `lib/cli/**`, `
12
12
  | Document | Role |
13
13
  | -------- | ---- |
14
14
  | [layout.md](./layout.md) | Visual and semantic spec: colors, sections, glyphs, blocking vs warning, non-TTY/CI, helper map to `cli-test-layout-chalk.js`. |
15
- | [cli-output-command-matrix.md](./cli-output-command-matrix.md) | **One row per leaf command**: expected **output profile** (layout-blocks, tty-summary, stream-logs, json-opt, stdout-only, delegate). |
15
+ | [cli-output-command-matrix.md](./cli-output-command-matrix.md) | **One row per leaf command**: expected **output profile** (layout-blocks, tty-summary, stream-logs, json-opt, stdout-only, delegate) and **Manifest roots (141)** (when to emit gray manifest path line — see plan 141). |
16
16
 
17
17
  If implementation and `layout.md` disagree, **fix implementation** or **update docs** in the same change so they stay one story.
18
18
 
@@ -27,9 +27,13 @@ Use the matrix row for your command to decide UX:
27
27
  - **stdout-only** — Stable, script-friendly stdout; minimal chalk; often used for diffs or piping.
28
28
  - **delegate** — Output comes from delegated library (wizard, etc.); still avoid forbidden glyphs and spurious decoration in anything you add.
29
29
 
30
- **New leaf command:** add a row to [cli-output-command-matrix.md](./cli-output-command-matrix.md) with the correct profile combination.
30
+ **New leaf command:** add a row to [cli-output-command-matrix.md](./cli-output-command-matrix.md) with the correct profile combination and **Manifest roots (141)** code (`141`, `141+`, `int`, `cfg`, `—`).
31
31
 
32
- ## Glyphs and semantics (terminal only)
32
+ ## Manifest path visibility (plan 141)
33
+
34
+ When a command’s matrix cell is **141**, **141+**, or **int** and the implementation reads an `application.yaml` (or integration equivalent), print **one** gray metadata line for humans (e.g. `Manifest: cwd/builder — /abs/path/application.yaml`) using `metadata()` or a small helper from `cli-test-layout-chalk.js`. Do not spam per-substep. Follow [.cursor/plans/141-manifest-location.plan.md](../plans/141-manifest-location.plan.md).
35
+
36
+ **`aifabrix setup`:** destructive / conflict prompts that list folders to be replaced must use **resolved absolute paths** for every directory (plan § Guided setup — not only `builder/<app>/` under an otherwise absolute builder root).
33
37
 
34
38
  From [layout.md](./layout.md) contributor appendix:
35
39
 
@@ -5,10 +5,12 @@ alwaysApply: true
5
5
 
6
6
  ## Audience
7
7
 
8
- Documents under **docs/** (including **docs/commands/**) are **CLI developer / user documentation**. The audience is people who use the AI Fabrix Builder CLI or integrate it into workflows. They do not need to know how the CLI talks to the Controller or Dataplane over HTTP.
8
+ Documents under **docs/** (including **docs/commands/**) are **public CLI user documentation**. The audience is people who use the AI Fabrix Builder CLI or integrate it into workflows—they may **not** have access to private monorepos (dataplane, miso-controller, internal plans). They do not need to know how the CLI talks to the Controller or Dataplane over HTTP.
9
9
 
10
10
  ## Do Not Include in CLI User Docs
11
11
 
12
+ - **Links or paths into other product repos (FORBIDDEN)** – No markdown links, examples, or prerequisites that point at private/sibling repositories or their trees: `../../../aifabrix-dataplane/...`, `../../aifabrix-miso/...`, `packages/miso-controller/...`, `integration/<fixture>/README.md` in another repo, `.cursor/plans/` anywhere, `/workspace/...` monorepo layouts, or “see the dataplane/miso-controller repo”. **Only** cross-link within **`docs/`** and use on-disk paths the user owns (`integration/<systemKey>/...`, `builder/<appKey>/...`, `~/.aifabrix/...`).
13
+ - **Internal plan or ticket IDs** – No “Plan 407.1”, “plan section 2.3”, or similar; describe behavior in user terms.
12
14
  - **REST API details** – No HTTP methods, URL paths, or endpoint names (e.g. `GET /api/v1/...`, `POST .../pipeline/upload`).
13
15
  - **Request/response shapes** – No payload structures, status codes, or field names from backend APIs.
14
16
  - **Backend implementation terms** – Avoid referring to “pipeline config endpoint”, “upload endpoint”, or similar; describe what the **command** does from the user’s perspective.
@@ -2,7 +2,7 @@ appName: wizard-e2e-credential-real
2
2
  mode: create-system
3
3
  source:
4
4
  type: openapi-file
5
- filePath: /workspace/aifabrix-builder/integration/hubspot-test/companies.json
5
+ filePath: ./integration/hubspot-test/companies.json
6
6
  credential:
7
7
  action: create
8
8
  config:
@@ -2,7 +2,7 @@ appName: wizard-e2e-env-vars
2
2
  mode: create-system
3
3
  source:
4
4
  type: openapi-file
5
- filePath: /workspace/aifabrix-builder/integration/hubspot-test/companies.json
5
+ filePath: ./integration/hubspot-test/companies.json
6
6
  deployment:
7
7
  controller: ${CONTROLLER_URL}
8
8
  dataplane: ${DATAPLANE_URL}
@@ -2,7 +2,7 @@ appName: wizard-e2e-e2e
2
2
  mode: create-system
3
3
  source:
4
4
  type: openapi-file
5
- filePath: /workspace/aifabrix-builder/integration/hubspot-test/companies.json
5
+ filePath: ./integration/hubspot-test/companies.json
6
6
  credential:
7
7
  action: skip
8
8
  preferences:
package/jest.projects.js CHANGED
@@ -141,6 +141,34 @@ const defaultProject = {
141
141
  '\\\\tests\\\\lib\\\\utils\\\\url-declarative-vdir-inactive-env.test.js',
142
142
  'lib/utils/url-declarative-vdir-inactive-env.test.js',
143
143
  'url-declarative-vdir-inactive-env\\.test\\.js',
144
+ '/tests/lib/utils/url-declarative-user-cfg-per-app-proxy.test.js',
145
+ '\\\\tests\\\\lib\\\\utils\\\\url-declarative-user-cfg-per-app-proxy.test.js',
146
+ 'lib/utils/url-declarative-user-cfg-per-app-proxy.test.js',
147
+ 'url-declarative-user-cfg-per-app-proxy\\.test\\.js',
148
+ '/tests/lib/utils/url-declarative-expand-traefik-off-no-usercfg.test.js',
149
+ '\\\\tests\\\\lib\\\\utils\\\\url-declarative-expand-traefik-off-no-usercfg.test.js',
150
+ 'lib/utils/url-declarative-expand-traefik-off-no-usercfg.test.js',
151
+ 'url-declarative-expand-traefik-off-no-usercfg\\.test\\.js',
152
+ '/tests/lib/core/secrets-env-declarative-show-urls.test.js',
153
+ '\\\\tests\\\\lib\\\\core\\\\secrets-env-declarative-show-urls.test.js',
154
+ 'lib/core/secrets-env-declarative-show-urls.test.js',
155
+ 'secrets-env-declarative-show-urls\\.test\\.js',
156
+ '/tests/lib/utils/url-declarative-registry-internal-docker-origin.test.js',
157
+ '\\\\tests\\\\lib\\\\utils\\\\url-declarative-registry-internal-docker-origin.test.js',
158
+ 'lib/utils/url-declarative-registry-internal-docker-origin.test.js',
159
+ 'url-declarative-registry-internal-docker-origin\\.test\\.js',
160
+ '/tests/lib/commands/platform-urls-registry.validation.test.js',
161
+ '\\\\tests\\\\lib\\\\commands\\\\platform-urls-registry.validation.test.js',
162
+ 'lib/commands/platform-urls-registry.validation.test.js',
163
+ 'platform-urls-registry\\.validation\\.test\\.js',
164
+ '/tests/lib/utils/env-copy-resolve-output.test.js',
165
+ '\\\\tests\\\\lib\\\\utils\\\\env-copy-resolve-output.test.js',
166
+ 'lib/utils/env-copy-resolve-output.test.js',
167
+ 'env-copy-resolve-output\\.test\\.js',
168
+ '/tests/lib/utils/write-env-output-reload.test.js',
169
+ '\\\\tests\\\\lib\\\\utils\\\\write-env-output-reload.test.js',
170
+ 'lib/utils/write-env-output-reload.test.js',
171
+ 'write-env-output-reload\\.test\\.js',
144
172
  '/tests/lib/utils/app-service-env-from-builder.test.js',
145
173
  '\\\\tests\\\\lib\\\\utils\\\\app-service-env-from-builder.test.js',
146
174
  'lib/utils/app-service-env-from-builder.test.js',
@@ -165,6 +193,18 @@ const defaultProject = {
165
193
  '\\\\tests\\\\lib\\\\utils\\\\paths-system-builder-resolution.test.js',
166
194
  'lib/utils/paths-system-builder-resolution.test.js',
167
195
  'paths-system-builder-resolution\\.test\\.js',
196
+ '/tests/lib/utils/manifest-location.test.js',
197
+ '\\\\tests\\\\lib\\\\utils\\\\manifest-location.test.js',
198
+ 'lib/utils/manifest-location.test.js',
199
+ 'manifest-location\\.test\\.js',
200
+ '/tests/lib/utils/installation-log.test.js',
201
+ '\\\\tests\\\\lib\\\\utils\\\\installation-log.test.js',
202
+ 'lib/utils/installation-log.test.js',
203
+ 'installation-log\\.test\\.js',
204
+ '/tests/lib/utils/manifest-source-emit.test.js',
205
+ '\\\\tests\\\\lib\\\\utils\\\\manifest-source-emit.test.js',
206
+ 'lib/utils/manifest-source-emit.test.js',
207
+ 'manifest-source-emit\\.test\\.js',
168
208
  '/tests/lib/utils/secrets-ancestor-paths.test.js',
169
209
  '\\\\tests\\\\lib\\\\utils\\\\secrets-ancestor-paths.test.js',
170
210
  'lib/utils/secrets-ancestor-paths.test.js',
@@ -238,7 +278,35 @@ const defaultProject = {
238
278
  '/tests/lib/datasource/run-capability-remove.test.js',
239
279
  '\\\\tests\\\\lib\\\\datasource\\\\run-capability-remove.test.js',
240
280
  'lib/datasource/run-capability-remove.test.js',
241
- 'run-capability-remove\\.test\\.js'
281
+ 'run-capability-remove\\.test\\.js',
282
+ '/tests/lib/datasource/log-cleaner.test.js',
283
+ '\\\\tests\\\\lib\\\\datasource\\\\log-cleaner.test.js',
284
+ 'lib/datasource/log-cleaner.test.js',
285
+ 'log-cleaner\\.test\\.js',
286
+ '/tests/lib/datasource/datasource-exporter-service.test.js',
287
+ '\\\\tests\\\\lib\\\\datasource\\\\datasource-exporter-service.test.js',
288
+ 'lib/datasource/datasource-exporter-service.test.js',
289
+ 'datasource-exporter-service\\.test\\.js',
290
+ '/tests/lib/protection/paths.test.js',
291
+ '\\\\tests\\\\lib\\\\protection\\\\paths.test.js',
292
+ 'lib/protection/paths.test.js',
293
+ 'protection/paths\\.test\\.js',
294
+ '/tests/lib/protection/protection-resolve.test.js',
295
+ '\\\\tests\\\\lib\\\\protection\\\\protection-resolve.test.js',
296
+ 'lib/protection/protection-resolve.test.js',
297
+ 'protection-resolve\\.test\\.js',
298
+ '/tests/lib/protection/run-protection-create-helpers.test.js',
299
+ '\\\\tests\\\\lib\\\\protection\\\\run-protection-create-helpers.test.js',
300
+ 'lib/protection/run-protection-create-helpers.test.js',
301
+ 'run-protection-create-helpers\\.test\\.js',
302
+ '/tests/lib/governance/governance-pack-loader.test.js',
303
+ '\\\\tests\\\\lib\\\\governance\\\\governance-pack-loader.test.js',
304
+ 'lib/governance/governance-pack-loader.test.js',
305
+ 'governance-pack-loader\\.test\\.js',
306
+ '/tests/lib/protection/validate-batch.test.js',
307
+ '\\\\tests\\\\lib\\\\protection\\\\validate-batch.test.js',
308
+ 'lib/protection/validate-batch.test.js',
309
+ 'validate-batch\\.test\\.js'
242
310
  ];
243
311
  if (process.env.INCLUDE_LOCAL_TESTS !== 'true') {
244
312
  patterns.push('/tests/local/');
@@ -263,6 +331,8 @@ const isolatedProjects = [
263
331
  makeIsolatedProject('paths-system-builder-resolution', [
264
332
  '**/tests/lib/utils/paths-system-builder-resolution.test.js'
265
333
  ]),
334
+ makeIsolatedProject('manifest-location', ['**/tests/lib/utils/manifest-location.test.js']),
335
+ makeIsolatedProject('installation-log', ['**/tests/lib/utils/installation-log.test.js']),
266
336
  makeIsolatedProject('secrets-ancestor-paths', ['**/tests/lib/utils/secrets-ancestor-paths.test.js']),
267
337
  makeIsolatedProject('datasource-validation-watch', [
268
338
  '**/tests/lib/utils/datasource-validation-watch.test.js'
@@ -272,6 +342,7 @@ const isolatedProjects = [
272
342
  '**/tests/lib/datasource/log-viewer-structural.test.js',
273
343
  '**/tests/lib/datasource/log-viewer-run.test.js'
274
344
  ]),
345
+ makeIsolatedProject('manifest-source-emit', ['**/tests/lib/utils/manifest-source-emit.test.js']),
275
346
  makeIsolatedProject('register-aifabrix-shell-env', [
276
347
  '**/tests/lib/utils/register-aifabrix-shell-env.test.js'
277
348
  ]),
@@ -314,6 +385,19 @@ const isolatedProjects = [
314
385
  makeIsolatedProject('url-declarative-vdir-inactive-env', [
315
386
  '**/tests/lib/utils/url-declarative-vdir-inactive-env.test.js'
316
387
  ]),
388
+ makeIsolatedProject('url-declarative-user-cfg-per-app-proxy', [
389
+ '**/tests/lib/utils/url-declarative-user-cfg-per-app-proxy.test.js'
390
+ ]),
391
+ makeIsolatedProject('declarative-url-paths-spy-suites', [
392
+ '**/tests/lib/utils/url-declarative-expand-traefik-off-no-usercfg.test.js',
393
+ '**/tests/lib/core/secrets-env-declarative-show-urls.test.js',
394
+ '**/tests/lib/utils/url-declarative-registry-internal-docker-origin.test.js'
395
+ ]),
396
+ makeIsolatedProject('platform-urls-registry-validation', [
397
+ '**/tests/lib/commands/platform-urls-registry.validation.test.js'
398
+ ]),
399
+ makeIsolatedProject('env-copy-resolve-output', ['**/tests/lib/utils/env-copy-resolve-output.test.js']),
400
+ makeIsolatedProject('write-env-output-reload', ['**/tests/lib/utils/write-env-output-reload.test.js']),
317
401
  makeIsolatedProject('app-service-env-from-builder', [
318
402
  '**/tests/lib/utils/app-service-env-from-builder.test.js'
319
403
  ]),
@@ -348,6 +432,21 @@ const isolatedProjects = [
348
432
  '**/tests/lib/datasource/run-capability-diff.test.js',
349
433
  '**/tests/lib/datasource/run-capability-edit.test.js',
350
434
  '**/tests/lib/datasource/run-capability-remove.test.js'
435
+ ]),
436
+ makeIsolatedProject('log-cleaner', ['**/tests/lib/datasource/log-cleaner.test.js']),
437
+ makeIsolatedProject('datasource-exporter-service', [
438
+ '**/tests/lib/datasource/datasource-exporter-service.test.js'
439
+ ]),
440
+ makeIsolatedProject('protection-paths', ['**/tests/lib/protection/paths.test.js']),
441
+ makeIsolatedProject('protection-resolve', ['**/tests/lib/protection/protection-resolve.test.js']),
442
+ makeIsolatedProject('protection-create-helpers', [
443
+ '**/tests/lib/protection/run-protection-create-helpers.test.js'
444
+ ]),
445
+ makeIsolatedProject('governance-pack-loader', [
446
+ '**/tests/lib/governance/governance-pack-loader.test.js'
447
+ ]),
448
+ makeIsolatedProject('protection-validate-batch', [
449
+ '**/tests/lib/protection/validate-batch.test.js'
351
450
  ])
352
451
  ];
353
452
 
@@ -0,0 +1,93 @@
1
+ /**
2
+ * @fileoverview Agent metadata validation API (dataplane 404.5)
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ const { createDataplaneApiClient } = require('./index');
8
+
9
+ /**
10
+ * Run agent metadata validation for a datasource.
11
+ * POST /api/v1/external/{sourceIdOrKey}/agent-metadata-validation
12
+ * @requiresPermission {Dataplane} external-data-source:update
13
+ * @async
14
+ * @function runAgentMetadataValidation
15
+ * @param {string} dataplaneUrl - Dataplane base URL
16
+ * @param {string} sourceIdOrKey - Datasource key or ID
17
+ * @param {Object} authConfig - Authentication configuration
18
+ * @param {import('./types/agent-metadata-validation.types').AgentMetadataValidationRunRequest} [body]
19
+ * @returns {Promise<import('./types/agent-metadata-validation.types').AgentMetadataValidationRunResponse>}
20
+ */
21
+ async function runAgentMetadataValidation(
22
+ dataplaneUrl,
23
+ sourceIdOrKey,
24
+ authConfig,
25
+ body = {},
26
+ opts = {}
27
+ ) {
28
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
29
+ const requestOpts = { body };
30
+ if (opts.timeoutMs !== undefined && opts.timeoutMs !== null) {
31
+ requestOpts.timeoutMs = opts.timeoutMs;
32
+ }
33
+ return await client.post(
34
+ `/api/v1/external/${encodeURIComponent(sourceIdOrKey)}/agent-metadata-validation`,
35
+ requestOpts
36
+ );
37
+ }
38
+
39
+ /**
40
+ * Get latest agent metadata validation result.
41
+ * GET /api/v1/external/{sourceIdOrKey}/agent-validation
42
+ * @requiresPermission {Dataplane} external-data-source:read
43
+ * @async
44
+ * @function getLatestAgentMetadataValidation
45
+ * @param {string} dataplaneUrl - Dataplane base URL
46
+ * @param {string} sourceIdOrKey - Datasource key or ID
47
+ * @param {Object} authConfig - Authentication configuration
48
+ * @returns {Promise<import('./types/agent-metadata-validation.types').AgentMetadataValidationResult>}
49
+ */
50
+ async function getLatestAgentMetadataValidation(
51
+ dataplaneUrl,
52
+ sourceIdOrKey,
53
+ authConfig,
54
+ opts = {}
55
+ ) {
56
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
57
+ const requestOpts = {};
58
+ if (opts.timeoutMs !== undefined && opts.timeoutMs !== null) {
59
+ requestOpts.timeoutMs = opts.timeoutMs;
60
+ }
61
+ return await client.get(
62
+ `/api/v1/external/${encodeURIComponent(sourceIdOrKey)}/agent-validation`,
63
+ requestOpts
64
+ );
65
+ }
66
+
67
+ /**
68
+ * List agent metadata validation history.
69
+ * GET /api/v1/external/{sourceIdOrKey}/agent-validation/history
70
+ * @requiresPermission {Dataplane} external-data-source:read
71
+ * @async
72
+ * @function listAgentMetadataValidationHistory
73
+ * @param {string} dataplaneUrl - Dataplane base URL
74
+ * @param {string} sourceIdOrKey - Datasource key or ID
75
+ * @param {Object} authConfig - Authentication configuration
76
+ * @returns {Promise<import('./types/agent-metadata-validation.types').AgentMetadataValidationHistoryItem[]>}
77
+ */
78
+ async function listAgentMetadataValidationHistory(
79
+ dataplaneUrl,
80
+ sourceIdOrKey,
81
+ authConfig
82
+ ) {
83
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
84
+ return await client.get(
85
+ `/api/v1/external/${encodeURIComponent(sourceIdOrKey)}/agent-validation/history`
86
+ );
87
+ }
88
+
89
+ module.exports = {
90
+ runAgentMetadataValidation,
91
+ getLatestAgentMetadataValidation,
92
+ listAgentMetadataValidationHistory
93
+ };
@@ -0,0 +1,68 @@
1
+ /**
2
+ * @fileoverview Shared helpers for dataplane audit API responses
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const { unwrapApiData } = require('../utils/external-system-readiness-core');
10
+
11
+ /**
12
+ * @param {*} res
13
+ * @throws {Error}
14
+ */
15
+ function assertAuditApiSuccess(res) {
16
+ if (!res || typeof res !== 'object') {
17
+ throw new Error('Audit API returned an empty response');
18
+ }
19
+ if (res.success === false) {
20
+ const msg =
21
+ (res.error && (res.error.formattedError || res.error.error || res.error.message)) ||
22
+ res.formattedError ||
23
+ 'Audit API request failed';
24
+ const err = new Error(msg);
25
+ if (res.status) err.status = res.status;
26
+ throw err;
27
+ }
28
+ }
29
+
30
+ /**
31
+ * @param {*} res
32
+ * @returns {{ data: Array, meta: Object|null, raw: Object|null }}
33
+ */
34
+ function unwrapPaginatedAuditList(res) {
35
+ assertAuditApiSuccess(res);
36
+ const body = unwrapApiData(res);
37
+ if (!body || typeof body !== 'object') {
38
+ return { data: [], meta: null, raw: null };
39
+ }
40
+ const data = Array.isArray(body.data)
41
+ ? body.data
42
+ : Array.isArray(body.items)
43
+ ? body.items
44
+ : [];
45
+ const meta = body.meta && typeof body.meta === 'object' ? body.meta : null;
46
+ return { data, meta, raw: body };
47
+ }
48
+
49
+ /**
50
+ * Unwrap execution sub-resource envelope `{ root: T }`.
51
+ * @param {*} res
52
+ * @returns {*|null}
53
+ */
54
+ function unwrapExecutionSubresource(res) {
55
+ assertAuditApiSuccess(res);
56
+ const body = unwrapApiData(res);
57
+ if (body === null || body === undefined) return null;
58
+ if (typeof body === 'object' && Object.prototype.hasOwnProperty.call(body, 'root')) {
59
+ return body.root;
60
+ }
61
+ return body;
62
+ }
63
+
64
+ module.exports = {
65
+ assertAuditApiSuccess,
66
+ unwrapPaginatedAuditList,
67
+ unwrapExecutionSubresource
68
+ };
@@ -0,0 +1,119 @@
1
+ /**
2
+ * @fileoverview Dataplane audit read API (Plan 407.1 / 407.3 evidence matrix)
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const { createDataplaneApiClient } = require('./index');
10
+ const { unwrapPaginatedAuditList, unwrapExecutionSubresource } = require('./audit-api-helpers');
11
+
12
+ const AUDIT_BASE = '/api/v1/audit';
13
+ const DEFAULT_PAGE_SIZE = 100;
14
+
15
+ /**
16
+ * @param {string} dataplaneUrl
17
+ * @param {Object} authConfig
18
+ * @param {Object} [query]
19
+ * @returns {Promise<{ data: import('./types/audit.types').AuditExecutionListItem[], meta: import('./types/audit.types').AuditListMeta|null }>}
20
+ * @requiresPermission {Dataplane} audit:read
21
+ */
22
+ async function queryExecutions(dataplaneUrl, authConfig, query = {}) {
23
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
24
+ const res = await client.get(`${AUDIT_BASE}/executions`, {
25
+ params: {
26
+ page: 1,
27
+ pageSize: DEFAULT_PAGE_SIZE,
28
+ ...query
29
+ }
30
+ });
31
+ return unwrapPaginatedAuditList(res);
32
+ }
33
+
34
+ /**
35
+ * @requiresPermission {Dataplane} audit:read
36
+ */
37
+ async function queryRbacDecisions(dataplaneUrl, authConfig, query = {}) {
38
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
39
+ const res = await client.get(`${AUDIT_BASE}/rbac-decisions`, {
40
+ params: {
41
+ page: 1,
42
+ pageSize: DEFAULT_PAGE_SIZE,
43
+ sort: '-timestamp',
44
+ ...query
45
+ }
46
+ });
47
+ return unwrapPaginatedAuditList(res);
48
+ }
49
+
50
+ /**
51
+ * @requiresPermission {Dataplane} audit:read
52
+ */
53
+ async function queryAbacTraces(dataplaneUrl, authConfig, query = {}) {
54
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
55
+ const res = await client.get(`${AUDIT_BASE}/abac-traces`, {
56
+ params: {
57
+ page: 1,
58
+ pageSize: DEFAULT_PAGE_SIZE,
59
+ ...query
60
+ }
61
+ });
62
+ return unwrapPaginatedAuditList(res);
63
+ }
64
+
65
+ /**
66
+ * @requiresPermission {Dataplane} audit:read
67
+ */
68
+ async function getExecutionRbac(dataplaneUrl, authConfig, executionId) {
69
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
70
+ const res = await client.get(`${AUDIT_BASE}/executions/${executionId}/rbac`);
71
+ return unwrapExecutionSubresource(res);
72
+ }
73
+
74
+ /**
75
+ * @requiresPermission {Dataplane} audit:read
76
+ */
77
+ async function getExecutionAbac(dataplaneUrl, authConfig, executionId) {
78
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
79
+ const res = await client.get(`${AUDIT_BASE}/executions/${executionId}/abac`);
80
+ return unwrapExecutionSubresource(res);
81
+ }
82
+
83
+ /**
84
+ * @requiresPermission {Dataplane} audit:read
85
+ */
86
+ async function getExecutionTrace(dataplaneUrl, authConfig, executionId) {
87
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
88
+ const res = await client.get(`${AUDIT_BASE}/executions/${executionId}/trace`);
89
+ return unwrapExecutionSubresource(res);
90
+ }
91
+
92
+ /**
93
+ * @requiresPermission {Dataplane} audit:read
94
+ */
95
+ async function getExecutionSteps(dataplaneUrl, authConfig, executionId) {
96
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
97
+ const res = await client.get(`${AUDIT_BASE}/executions/${executionId}/steps`);
98
+ return unwrapExecutionSubresource(res);
99
+ }
100
+
101
+ /**
102
+ * @requiresPermission {Dataplane} audit:read
103
+ */
104
+ async function getExecutionErrors(dataplaneUrl, authConfig, executionId) {
105
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
106
+ const res = await client.get(`${AUDIT_BASE}/executions/${executionId}/errors`);
107
+ return unwrapExecutionSubresource(res);
108
+ }
109
+
110
+ module.exports = {
111
+ queryExecutions,
112
+ queryRbacDecisions,
113
+ queryAbacTraces,
114
+ getExecutionRbac,
115
+ getExecutionAbac,
116
+ getExecutionTrace,
117
+ getExecutionSteps,
118
+ getExecutionErrors
119
+ };
@@ -0,0 +1,44 @@
1
+ /**
2
+ * @fileoverview Controller auth/RBAC cache API
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const { ApiClient } = require('./index');
10
+
11
+ const CLEAR_PATH = '/api/v1/auth/cache/clear';
12
+ const INVALIDATE_PATH = '/api/v1/auth/cache/invalidate';
13
+
14
+ /**
15
+ * Clear all controller cache entries
16
+ * @requiresPermission {Controller} cache:admin
17
+ * @async
18
+ * @param {string} controllerUrl
19
+ * @param {Object} authConfig
20
+ * @returns {Promise<Object>}
21
+ */
22
+ async function clearAuthCache(controllerUrl, authConfig) {
23
+ const client = new ApiClient(controllerUrl, authConfig);
24
+ return await client.post(CLEAR_PATH);
25
+ }
26
+
27
+ /**
28
+ * Invalidate cache entries matching a pattern
29
+ * @requiresPermission {Controller} cache:admin
30
+ * @async
31
+ * @param {string} controllerUrl
32
+ * @param {Object} authConfig
33
+ * @param {string} pattern
34
+ * @returns {Promise<Object>}
35
+ */
36
+ async function invalidateAuthCache(controllerUrl, authConfig, pattern) {
37
+ const client = new ApiClient(controllerUrl, authConfig);
38
+ return await client.post(INVALIDATE_PATH, { body: { pattern } });
39
+ }
40
+
41
+ module.exports = {
42
+ clearAuthCache,
43
+ invalidateAuthCache
44
+ };
@@ -4,7 +4,7 @@
4
4
  * @version 2.0.0
5
5
  */
6
6
 
7
- const { ApiClient } = require('./index');
7
+ const { createDataplaneApiClient } = require('./index');
8
8
  const { normalizeDataplaneAuth } = require('./validation-run.api');
9
9
 
10
10
  /**
@@ -36,7 +36,7 @@ function dataplaneAuthForBearerGet(authConfig) {
36
36
  * @returns {Promise<Object>} API envelope `{ success, data?, status, ... }`
37
37
  */
38
38
  async function getActiveIntegrationCertificate(dataplaneUrl, authConfig, systemKey, datasourceKey) {
39
- const client = new ApiClient(dataplaneUrl, dataplaneAuthForBearerGet(authConfig));
39
+ const client = createDataplaneApiClient(dataplaneUrl, dataplaneAuthForBearerGet(authConfig));
40
40
  const path = `/api/v1/systems/${encodeURIComponent(systemKey)}/datasources/${encodeURIComponent(
41
41
  datasourceKey
42
42
  )}/certificates/active`;
@@ -54,7 +54,7 @@ async function getActiveIntegrationCertificate(dataplaneUrl, authConfig, systemK
54
54
  * @returns {Promise<Object>}
55
55
  */
56
56
  async function listIntegrationCertificates(dataplaneUrl, authConfig, params = {}) {
57
- const client = new ApiClient(dataplaneUrl, dataplaneAuthForBearerGet(authConfig));
57
+ const client = createDataplaneApiClient(dataplaneUrl, dataplaneAuthForBearerGet(authConfig));
58
58
  return await client.get('/api/v1/certificates', { params });
59
59
  }
60
60
 
@@ -69,7 +69,7 @@ async function listIntegrationCertificates(dataplaneUrl, authConfig, params = {}
69
69
  * @returns {Promise<Object>}
70
70
  */
71
71
  async function verifyIntegrationCertificate(dataplaneUrl, authConfig, body) {
72
- const client = new ApiClient(dataplaneUrl, dataplaneAuthForBearerGet(authConfig));
72
+ const client = createDataplaneApiClient(dataplaneUrl, dataplaneAuthForBearerGet(authConfig));
73
73
  return await client.post('/api/v1/certificates/verify', { body: body || {} });
74
74
  }
75
75
 
@@ -4,7 +4,7 @@
4
4
  * @version 2.0.0
5
5
  */
6
6
 
7
- const { ApiClient } = require('./index');
7
+ const { createDataplaneApiClient } = require('./index');
8
8
 
9
9
  const CREDENTIAL_SECRET_ENDPOINT = '/api/v1/credential/secret';
10
10
 
@@ -29,7 +29,7 @@ async function storeCredentialSecrets(dataplaneUrl, authConfig, items) {
29
29
  if (!items || !Array.isArray(items) || items.length === 0) {
30
30
  return { stored: 0 };
31
31
  }
32
- const client = new ApiClient(dataplaneUrl, authConfig);
32
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
33
33
  return await client.post(CREDENTIAL_SECRET_ENDPOINT, {
34
34
  body: items
35
35
  });