@aifabrix/builder 2.43.0 → 2.44.1

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 (371) hide show
  1. package/.cursor/rules/anchor-docs.mdc +15 -0
  2. package/.cursor/rules/cli-layout.mdc +75 -0
  3. package/.cursor/rules/project-rules.mdc +8 -0
  4. package/.npmrc.token +1 -0
  5. package/.nyc_output/55e9d034-ddab-4579-a706-e02a91d75c91.json +1 -0
  6. package/.nyc_output/processinfo/55e9d034-ddab-4579-a706-e02a91d75c91.json +1 -0
  7. package/.nyc_output/processinfo/index.json +1 -0
  8. package/README.md +1 -1
  9. package/anchor-docs/README.md +10 -0
  10. package/anchor-docs/_TEMPLATE +24 -0
  11. package/bin/aifabrix.js +13 -4
  12. package/integration/hubspot-test/README.md +31 -0
  13. package/integration/hubspot-test/create-hubspot.js +5 -5
  14. package/integration/hubspot-test/hubspot-test-datasource-company.json +58 -462
  15. package/integration/hubspot-test/hubspot-test-datasource-contact.json +61 -555
  16. package/integration/hubspot-test/hubspot-test-datasource-deal.json +63 -506
  17. package/integration/hubspot-test/hubspot-test-datasource-users.json +42 -83
  18. package/integration/hubspot-test/hubspot-test-deploy.json +3 -3
  19. package/integration/hubspot-test/test-dataplane-down-tests.js +1 -7
  20. package/integration/hubspot-test/test-dataplane-down.js +3 -3
  21. package/integration/hubspot-test/test.js +35 -43
  22. package/integration/hubspot-test/wizard-hubspot-test-headless.yaml +23 -0
  23. package/integration/roundtrip-test-local/README.md +144 -0
  24. package/integration/roundtrip-test-local/application.yaml +13 -0
  25. package/integration/roundtrip-test-local/env.template +15 -0
  26. package/integration/roundtrip-test-local/roundtrip-test-local-datasource-roundtrip-test-company.yaml +14 -0
  27. package/integration/roundtrip-test-local/roundtrip-test-local-deploy.json +61 -0
  28. package/integration/roundtrip-test-local/roundtrip-test-local-system.yaml +25 -0
  29. package/integration/roundtrip-test-local2/README.md +144 -0
  30. package/integration/roundtrip-test-local2/application.yaml +13 -0
  31. package/integration/roundtrip-test-local2/env.template +15 -0
  32. package/integration/roundtrip-test-local2/roundtrip-test-local2-datasource-company.yaml +31 -0
  33. package/integration/roundtrip-test-local2/roundtrip-test-local2-deploy.json +86 -0
  34. package/integration/roundtrip-test-local2/roundtrip-test-local2-system.yaml +25 -0
  35. package/integration/test/wizard.yaml +8 -0
  36. package/jest.config.default.js +10 -0
  37. package/jest.config.integration.fixtures.js +22 -0
  38. package/jest.config.integration.js +21 -18
  39. package/jest.config.isolated.js +10 -0
  40. package/jest.projects.js +301 -0
  41. package/lib/api/certificates.api.js +62 -0
  42. package/lib/api/datasources-core.api.js +3 -3
  43. package/lib/api/dev-mtls-request.js +110 -0
  44. package/lib/api/dev-server-https.js +145 -0
  45. package/lib/api/dev.api.js +133 -144
  46. package/lib/api/index.js +11 -3
  47. package/lib/api/pipeline.api.js +67 -20
  48. package/lib/api/types/certificates.types.js +48 -0
  49. package/lib/api/types/dev.types.js +4 -3
  50. package/lib/api/types/pipeline.types.js +8 -5
  51. package/lib/api/types/validation-run.types.js +56 -0
  52. package/lib/api/validation-run.api.js +111 -0
  53. package/lib/api/validation-runner.js +109 -0
  54. package/lib/app/certification-show-enrich.js +129 -0
  55. package/lib/app/certification-verify-rows.js +60 -0
  56. package/lib/app/config.js +1 -1
  57. package/lib/app/deploy-status-display.js +2 -2
  58. package/lib/app/deploy.js +7 -6
  59. package/lib/app/display.js +2 -1
  60. package/lib/app/dockerfile.js +3 -2
  61. package/lib/app/down.js +2 -1
  62. package/lib/app/helpers.js +6 -5
  63. package/lib/app/index.js +27 -8
  64. package/lib/app/list.js +7 -6
  65. package/lib/app/push.js +4 -3
  66. package/lib/app/register.js +16 -7
  67. package/lib/app/rotate-secret.js +14 -13
  68. package/lib/app/run-container-start.js +184 -0
  69. package/lib/app/run-docker-fallback.js +108 -0
  70. package/lib/app/run-env-compose.js +30 -42
  71. package/lib/app/run-helpers.js +49 -126
  72. package/lib/app/run-infra-requirements.js +30 -0
  73. package/lib/app/run-resolve-image.js +21 -0
  74. package/lib/app/run.js +74 -21
  75. package/lib/app/show-display.js +44 -1
  76. package/lib/app/show.js +93 -9
  77. package/lib/build/index.js +13 -10
  78. package/lib/certification/cli-cert-sync-skip.js +21 -0
  79. package/lib/certification/merge-certification-from-artifact.js +185 -0
  80. package/lib/certification/post-unified-cert-sync.js +33 -0
  81. package/lib/certification/sync-after-external-command.js +52 -0
  82. package/lib/certification/sync-system-certification.js +197 -0
  83. package/lib/cli/index.js +2 -0
  84. package/lib/cli/setup-app.help.js +67 -0
  85. package/lib/cli/setup-app.js +61 -121
  86. package/lib/cli/setup-app.test-commands.js +195 -0
  87. package/lib/cli/setup-auth.js +19 -5
  88. package/lib/cli/setup-credential-deployment.js +22 -8
  89. package/lib/cli/setup-dev-path-commands.js +124 -0
  90. package/lib/cli/setup-dev.js +170 -113
  91. package/lib/cli/setup-environment.js +7 -1
  92. package/lib/cli/setup-external-system.js +84 -23
  93. package/lib/cli/setup-infra.js +126 -47
  94. package/lib/cli/setup-parameters.js +32 -0
  95. package/lib/cli/setup-secrets.js +137 -18
  96. package/lib/cli/setup-service-user.js +1 -1
  97. package/lib/cli/setup-utility.js +54 -22
  98. package/lib/commands/app-down.js +5 -7
  99. package/lib/commands/app-install.js +14 -7
  100. package/lib/commands/app-logs.js +13 -10
  101. package/lib/commands/app-shell.js +4 -1
  102. package/lib/commands/app-test.js +25 -19
  103. package/lib/commands/app.js +32 -11
  104. package/lib/commands/auth-config.js +6 -6
  105. package/lib/commands/auth-status.js +4 -3
  106. package/lib/commands/credential-env.js +4 -3
  107. package/lib/commands/credential-list.js +5 -4
  108. package/lib/commands/credential-push.js +4 -3
  109. package/lib/commands/datasource-unified-test-cli.js +428 -0
  110. package/lib/commands/datasource-unified-test-cli.options.js +191 -0
  111. package/lib/commands/datasource-unified-test-e2e-cli-helpers.js +106 -0
  112. package/lib/commands/datasource-validation-cli.js +143 -0
  113. package/lib/commands/datasource.js +125 -95
  114. package/lib/commands/deployment-list.js +6 -5
  115. package/lib/commands/dev-cli-handlers.js +122 -18
  116. package/lib/commands/dev-down.js +4 -3
  117. package/lib/commands/dev-init.js +231 -116
  118. package/lib/commands/dev-show-display.js +473 -0
  119. package/lib/commands/login-credentials.js +3 -2
  120. package/lib/commands/login-device.js +4 -3
  121. package/lib/commands/login.js +5 -4
  122. package/lib/commands/logout.js +8 -7
  123. package/lib/commands/parameters-validate.js +54 -0
  124. package/lib/commands/repair-datasource.js +314 -68
  125. package/lib/commands/repair-env-template.js +2 -2
  126. package/lib/commands/repair.js +21 -3
  127. package/lib/commands/secrets-list.js +23 -12
  128. package/lib/commands/secrets-remove-all.js +220 -0
  129. package/lib/commands/secrets-remove.js +21 -12
  130. package/lib/commands/secrets-set.js +21 -12
  131. package/lib/commands/secrets-validate.js +4 -4
  132. package/lib/commands/secure.js +10 -9
  133. package/lib/commands/service-user.js +26 -25
  134. package/lib/commands/test-e2e-external.js +27 -1
  135. package/lib/commands/up-common.js +3 -2
  136. package/lib/commands/up-dataplane.js +29 -16
  137. package/lib/commands/up-miso.js +19 -29
  138. package/lib/commands/upload.js +149 -39
  139. package/lib/commands/wizard-core-helpers.js +1 -1
  140. package/lib/commands/wizard-dataplane.js +4 -3
  141. package/lib/commands/wizard-helpers.js +3 -3
  142. package/lib/commands/wizard.js +2 -2
  143. package/lib/core/admin-secrets.js +14 -5
  144. package/lib/core/audit-logger.js +12 -4
  145. package/lib/core/config-attach-extensions.js +46 -0
  146. package/lib/core/config-runtime-paths.js +29 -0
  147. package/lib/core/config.js +55 -56
  148. package/lib/core/diff.js +3 -2
  149. package/lib/core/ensure-encryption-key.js +1 -1
  150. package/lib/core/secrets-ensure-infra.js +77 -0
  151. package/lib/core/secrets-ensure.js +120 -64
  152. package/lib/core/secrets-env-write.js +35 -7
  153. package/lib/core/secrets-infra-placeholder-sync.js +61 -0
  154. package/lib/core/secrets.js +200 -37
  155. package/lib/core/templates-env.js +4 -3
  156. package/lib/datasource/abac-validator.js +1 -10
  157. package/lib/datasource/deploy.js +75 -53
  158. package/lib/datasource/field-reference-validator.js +9 -6
  159. package/lib/datasource/integration-context.js +63 -0
  160. package/lib/datasource/list.js +8 -7
  161. package/lib/datasource/log-viewer.js +189 -67
  162. package/lib/datasource/resolve-app.js +4 -4
  163. package/lib/datasource/test-e2e.js +113 -146
  164. package/lib/datasource/test-integration.js +114 -122
  165. package/lib/datasource/unified-validation-run-body.js +68 -0
  166. package/lib/datasource/unified-validation-run-post.js +23 -0
  167. package/lib/datasource/unified-validation-run-resolve.js +43 -0
  168. package/lib/datasource/unified-validation-run.js +93 -0
  169. package/lib/datasource/validate.js +157 -13
  170. package/lib/deployment/deployer.js +4 -3
  171. package/lib/deployment/environment.js +7 -6
  172. package/lib/deployment/push.js +17 -8
  173. package/lib/external-system/delete.js +4 -3
  174. package/lib/external-system/deploy.js +166 -53
  175. package/lib/external-system/download-helpers.js +1 -1
  176. package/lib/external-system/download.js +7 -6
  177. package/lib/external-system/generator.js +92 -6
  178. package/lib/external-system/integration-test-dispatch.js +26 -0
  179. package/lib/external-system/test-execution.js +5 -1
  180. package/lib/external-system/test-helpers.js +0 -4
  181. package/lib/external-system/test-system-level-helpers.js +110 -0
  182. package/lib/external-system/test-system-level.js +83 -44
  183. package/lib/external-system/test.js +59 -8
  184. package/lib/generator/builders.js +23 -11
  185. package/lib/generator/deploy-manifest-azure-kv.js +81 -0
  186. package/lib/generator/external.js +16 -4
  187. package/lib/generator/helpers.js +58 -3
  188. package/lib/generator/index.js +4 -0
  189. package/lib/generator/split-readme.js +12 -7
  190. package/lib/generator/split-variables.js +2 -1
  191. package/lib/generator/split.js +1 -1
  192. package/lib/generator/wizard-readme.js +3 -3
  193. package/lib/generator/wizard.js +8 -8
  194. package/lib/infrastructure/compose.js +70 -7
  195. package/lib/infrastructure/helpers-docker-check.js +67 -0
  196. package/lib/infrastructure/helpers.js +203 -42
  197. package/lib/infrastructure/index.js +31 -18
  198. package/lib/infrastructure/services.js +21 -67
  199. package/lib/internal/fs-real-sync.js +104 -0
  200. package/lib/internal/node-fs.js +98 -0
  201. package/lib/parameters/database-secret-values.js +173 -0
  202. package/lib/parameters/infra-kv-discovery.js +121 -0
  203. package/lib/parameters/infra-parameter-catalog.js +458 -0
  204. package/lib/parameters/infra-parameter-validate.js +64 -0
  205. package/lib/schema/application-schema.json +37 -17
  206. package/lib/schema/datasource-test-run.schema.json +493 -0
  207. package/lib/schema/deployment-rules.yaml +102 -63
  208. package/lib/schema/external-datasource.schema.json +1200 -442
  209. package/lib/schema/external-system.schema.json +203 -5
  210. package/lib/schema/flag-map-validation-run.json +31 -0
  211. package/lib/schema/infra-parameter.schema.json +106 -0
  212. package/lib/schema/infra.parameter.yaml +421 -0
  213. package/lib/schema/type/credential-auth-templates.json +40 -0
  214. package/lib/schema/type/document-storage.json +226 -0
  215. package/lib/schema/type/message-service.json +123 -0
  216. package/lib/schema/type/vector-store.json +88 -0
  217. package/lib/utils/aifabrix-runtime-config-dir.js +132 -0
  218. package/lib/utils/api-error-handler.js +2 -2
  219. package/lib/utils/api.js +77 -17
  220. package/lib/utils/app-register-api.js +3 -2
  221. package/lib/utils/app-register-auth.js +1 -1
  222. package/lib/utils/app-register-config.js +4 -4
  223. package/lib/utils/app-register-display.js +3 -2
  224. package/lib/utils/app-register-validator.js +3 -2
  225. package/lib/utils/app-run-containers.js +26 -22
  226. package/lib/utils/app-scoped-config.js +31 -0
  227. package/lib/utils/app-service-env-from-builder.js +164 -0
  228. package/lib/utils/build-copy.js +1 -1
  229. package/lib/utils/build-helpers.js +20 -20
  230. package/lib/utils/build-resolve-image.js +165 -0
  231. package/lib/utils/cli-layout-chalk.js +8 -0
  232. package/lib/utils/cli-test-layout-chalk.js +267 -0
  233. package/lib/utils/cli-utils.js +88 -11
  234. package/lib/utils/compose-db-passwords.js +138 -0
  235. package/lib/utils/compose-generate-docker-compose.js +216 -0
  236. package/lib/utils/compose-generator.js +197 -291
  237. package/lib/utils/compose-miso-env.js +18 -0
  238. package/lib/utils/compose-traefik-ingress-base.js +158 -0
  239. package/lib/utils/config-paths.js +166 -7
  240. package/lib/utils/config-scoped-resources-preference.js +41 -0
  241. package/lib/utils/configuration-env-resolver.js +11 -8
  242. package/lib/utils/controller-deployment-outcome.js +68 -0
  243. package/lib/utils/credential-display.js +2 -2
  244. package/lib/utils/credential-secrets-env.js +5 -5
  245. package/lib/utils/dataplane-pipeline-warning.js +4 -3
  246. package/lib/utils/datasource-test-run-capability-scope.js +43 -0
  247. package/lib/utils/datasource-test-run-certificate-tty.js +82 -0
  248. package/lib/utils/datasource-test-run-debug-display.js +137 -0
  249. package/lib/utils/datasource-test-run-debug-slice.js +93 -0
  250. package/lib/utils/datasource-test-run-display.js +459 -0
  251. package/lib/utils/datasource-test-run-exit.js +83 -0
  252. package/lib/utils/datasource-test-run-legacy-adapter.js +93 -0
  253. package/lib/utils/datasource-test-run-report-version.js +51 -0
  254. package/lib/utils/datasource-test-run-schema-sync.js +59 -0
  255. package/lib/utils/datasource-test-run-tty-log.js +81 -0
  256. package/lib/utils/datasource-validation-watch.js +266 -0
  257. package/lib/utils/declarative-url-ports.js +47 -0
  258. package/lib/utils/derive-env-key-from-client-id.js +41 -0
  259. package/lib/utils/dev-ca-install.js +185 -23
  260. package/lib/utils/dev-cert-helper.js +266 -17
  261. package/lib/utils/dev-hosts-helper.js +307 -0
  262. package/lib/utils/dev-init-cert-hints.js +37 -0
  263. package/lib/utils/dev-init-health-messages.js +52 -0
  264. package/lib/utils/dev-init-resolve.js +86 -0
  265. package/lib/utils/dev-init-ssh-merge.js +65 -0
  266. package/lib/utils/dev-ssh-config-helper.js +196 -0
  267. package/lib/utils/dev-user-groups.js +93 -0
  268. package/lib/utils/docker-build.js +42 -17
  269. package/lib/utils/docker-exec.js +28 -0
  270. package/lib/utils/docker-manifest-public-port.js +116 -0
  271. package/lib/utils/docker-not-running-hint.js +52 -0
  272. package/lib/utils/docker.js +98 -11
  273. package/lib/utils/ensure-dev-certs-for-remote-docker.js +192 -0
  274. package/lib/utils/env-config-loader.js +10 -91
  275. package/lib/utils/env-copy.js +19 -10
  276. package/lib/utils/env-map.js +35 -8
  277. package/lib/utils/env-template.js +2 -2
  278. package/lib/utils/environment-scoped-resources.js +144 -0
  279. package/lib/utils/error-formatter.js +92 -13
  280. package/lib/utils/error-formatters/http-status-errors.js +6 -5
  281. package/lib/utils/error-formatters/network-errors.js +2 -1
  282. package/lib/utils/error-formatters/permission-errors.js +2 -1
  283. package/lib/utils/error-formatters/validation-errors.js +2 -1
  284. package/lib/utils/external-readme.js +8 -1
  285. package/lib/utils/external-system-display.js +242 -136
  286. package/lib/utils/external-system-local-test-tty.js +389 -0
  287. package/lib/utils/external-system-readiness-core.js +377 -0
  288. package/lib/utils/external-system-readiness-deploy-display.js +270 -0
  289. package/lib/utils/external-system-readiness-display-internals.js +150 -0
  290. package/lib/utils/external-system-readiness-display.js +186 -0
  291. package/lib/utils/external-system-system-test-tty-overview.js +120 -0
  292. package/lib/utils/external-system-system-test-tty.js +417 -0
  293. package/lib/utils/external-system-test-helpers.js +24 -6
  294. package/lib/utils/external-system-validators.js +30 -12
  295. package/lib/utils/health-check-url.js +119 -0
  296. package/lib/utils/health-check.js +59 -25
  297. package/lib/utils/help-builder.js +11 -8
  298. package/lib/utils/image-version.js +4 -8
  299. package/lib/utils/infra-containers.js +4 -7
  300. package/lib/utils/infra-env-defaults.js +162 -0
  301. package/lib/utils/infra-status-display.js +167 -0
  302. package/lib/utils/infra-status.js +16 -8
  303. package/lib/utils/local-secrets.js +3 -4
  304. package/lib/utils/paths.js +148 -47
  305. package/lib/utils/port-resolver.js +10 -23
  306. package/lib/utils/redis-env-scope.js +62 -0
  307. package/lib/utils/register-aifabrix-shell-env.js +204 -0
  308. package/lib/utils/remote-builder-validation.js +99 -0
  309. package/lib/utils/remote-dev-auth.js +117 -21
  310. package/lib/utils/remote-docker-env.js +67 -15
  311. package/lib/utils/remote-secrets-loader.js +13 -4
  312. package/lib/utils/resolve-docker-image-ref.js +124 -0
  313. package/lib/utils/schema-loader.js +22 -9
  314. package/lib/utils/secrets-bash-kv.js +25 -0
  315. package/lib/utils/secrets-generator.js +169 -49
  316. package/lib/utils/secrets-helpers.js +70 -59
  317. package/lib/utils/secrets-kv-scope.js +60 -0
  318. package/lib/utils/secrets-utils.js +32 -38
  319. package/lib/utils/secrets-validation.js +3 -1
  320. package/lib/utils/secrets-yaml-preserve.js +109 -0
  321. package/lib/utils/ssh-key-helper.js +4 -2
  322. package/lib/utils/template-helpers.js +2 -2
  323. package/lib/utils/test-log-writer.js +3 -3
  324. package/lib/utils/token-manager.js +1 -2
  325. package/lib/utils/url-declarative-public-base.js +188 -0
  326. package/lib/utils/url-declarative-resolve-build.js +493 -0
  327. package/lib/utils/url-declarative-resolve-load-doc.js +51 -0
  328. package/lib/utils/url-declarative-resolve.js +220 -0
  329. package/lib/utils/url-declarative-token-parse.js +74 -0
  330. package/lib/utils/url-declarative-url-flags.js +50 -0
  331. package/lib/utils/url-declarative-vdir-inactive-env.js +99 -0
  332. package/lib/utils/url-public-path-prefix.js +34 -0
  333. package/lib/utils/urls-local-registry.js +220 -0
  334. package/lib/utils/validation-report-tty-kit.js +77 -0
  335. package/lib/utils/validation-run-poll.js +112 -0
  336. package/lib/utils/validation-run-post-retry.js +85 -0
  337. package/lib/utils/validation-run-request.js +116 -0
  338. package/lib/utils/variable-transformer.js +21 -4
  339. package/lib/utils/yaml-preserve.js +33 -14
  340. package/lib/validation/datasource-warnings.js +56 -0
  341. package/lib/validation/env-template-auth.js +1 -1
  342. package/lib/validation/external-manifest-validator.js +27 -7
  343. package/lib/validation/validate-display.js +37 -31
  344. package/lib/validation/validate-external-cert-sync.js +23 -0
  345. package/lib/validation/validate.js +8 -14
  346. package/lib/validation/validator-unresolved-placeholders.js +98 -0
  347. package/lib/validation/validator.js +22 -65
  348. package/lib/validation/wizard-config-validator.js +2 -1
  349. package/package.json +9 -4
  350. package/scripts/check-datasource-test-run-schema-sync.js +34 -0
  351. package/scripts/diagnose-cli.js +150 -0
  352. package/scripts/install-local.js +307 -55
  353. package/scripts/pnpm-global-remove.js +48 -0
  354. package/templates/README.md +15 -2
  355. package/templates/applications/dataplane/application.yaml +52 -2
  356. package/templates/applications/dataplane/env.template +79 -17
  357. package/templates/applications/dataplane/rbac.yaml +8 -0
  358. package/templates/applications/keycloak/application.yaml +9 -1
  359. package/templates/applications/keycloak/env.template +15 -6
  360. package/templates/applications/miso-controller/application.yaml +10 -2
  361. package/templates/applications/miso-controller/env.template +42 -12
  362. package/templates/applications/miso-controller/rbac.yaml +5 -0
  363. package/templates/external-system/README.md.hbs +20 -7
  364. package/templates/external-system/deploy.js.hbs +5 -5
  365. package/templates/external-system/external-datasource.yaml.hbs +197 -118
  366. package/templates/infra/compose.yaml.hbs +33 -16
  367. package/templates/infra/servers.json.hbs +3 -1
  368. package/templates/python/docker-compose.hbs +16 -0
  369. package/templates/typescript/docker-compose.hbs +16 -0
  370. package/lib/api/external-test.api.js +0 -111
  371. package/lib/schema/env-config.yaml +0 -60
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Shared chalk helpers for external system readiness CLI blocks.
3
+ *
4
+ * @fileoverview Internals for upload and deploy readiness display
5
+ * @author AI Fabrix Team
6
+ * @version 2.0.0
7
+ */
8
+
9
+ const chalk = require('chalk');
10
+ const { failureGlyph, successGlyph } = require('./cli-test-layout-chalk');
11
+ const logger = require('./logger');
12
+ const { extractIdentitySummary, resolveCredentialTestEndpointDisplay } = require('./external-system-readiness-core');
13
+
14
+ const SEP = chalk.gray('────────────────────────────────');
15
+
16
+ /**
17
+ * @param {string} title
18
+ */
19
+ function logSectionTitle(title) {
20
+ logger.log('');
21
+ logger.log(chalk.bold(title));
22
+ }
23
+
24
+ function logSeparator() {
25
+ logger.log('');
26
+ logger.log(SEP);
27
+ }
28
+
29
+ /**
30
+ * @param {'ready'|'partial'|'failed'} tier
31
+ * @returns {string}
32
+ */
33
+ function tierGlyph(tier) {
34
+ if (tier === 'ready') return successGlyph();
35
+ if (tier === 'failed') return failureGlyph();
36
+ return chalk.yellow('⚠');
37
+ }
38
+
39
+ /**
40
+ * @param {'READY'|'PARTIAL'|'FAILED'} v
41
+ * @returns {string}
42
+ */
43
+ function verdictLine(v) {
44
+ const label = chalk.bold('System Readiness: ');
45
+ if (v === 'READY') return label + chalk.green('READY');
46
+ if (v === 'FAILED') return label + chalk.red('FAILED');
47
+ return label + chalk.yellow('PARTIAL');
48
+ }
49
+
50
+ /**
51
+ * @param {Array<{ key: string, tier: string }>} rows
52
+ * @param {{ ready: number, partial: number, failed: number }} counts
53
+ */
54
+ function logDatasourceTable(rows, counts) {
55
+ logSectionTitle('Datasources:');
56
+ for (const r of rows) {
57
+ const statusLabel = r.tier === 'ready' ? 'Ready' : r.tier === 'failed' ? 'Failed' : 'Partial';
58
+ logger.log(
59
+ `${tierGlyph(r.tier)} ${r.key.padEnd(14, ' ')} ${chalk.gray('(' + statusLabel + ')')}`
60
+ );
61
+ }
62
+ logger.log('');
63
+ logger.log(
64
+ chalk.gray('Summary:') +
65
+ ` ${chalk.green('Ready: ' + counts.ready)} · ${chalk.yellow('Partial: ' + counts.partial)} · ${chalk.red('Failed: ' + counts.failed)}`
66
+ );
67
+ }
68
+
69
+ /**
70
+ * @param {Object} system - manifest.system
71
+ */
72
+ function logIdentityBlock(system) {
73
+ const { mode, attribution, tokenBroker } = extractIdentitySummary(system || {});
74
+ logSectionTitle('Identity:');
75
+ logger.log(`${chalk.gray('Mode:')} ${mode}`);
76
+ const attrColor = attribution === 'enabled' ? chalk.white : chalk.yellow;
77
+ logger.log(`${chalk.gray('Attribution:')} ${attrColor(attribution)}`);
78
+ logger.log(`${chalk.gray('Token broker:')} ${tokenBroker === 'configured' ? chalk.white(tokenBroker) : chalk.gray(tokenBroker)}`);
79
+ }
80
+
81
+ /**
82
+ * @param {Object} system - manifest.system
83
+ * @param {boolean} probed
84
+ * @param {boolean} [willProbe] - True when caller will run --probe immediately after this block
85
+ */
86
+ function logCredentialIntentBlock(system, probed, willProbe = false) {
87
+ const url = resolveCredentialTestEndpointDisplay(system || {});
88
+ logSectionTitle('Credential (intent):');
89
+ if (url) {
90
+ logger.log(chalk.gray('Test endpoint:'));
91
+ logger.log(chalk.cyan(`GET ${url}`));
92
+ } else {
93
+ logger.log(chalk.gray('Test endpoint: (not configured — defaults may apply on server)'));
94
+ }
95
+ if (!probed) {
96
+ if (willProbe) {
97
+ logger.log(chalk.gray('⏳ Connectivity will be tested next (--probe)'));
98
+ } else {
99
+ logger.log(chalk.yellow('⚠ Connectivity not tested (use --probe)'));
100
+ }
101
+ }
102
+ }
103
+
104
+ /**
105
+ * @param {string[]} actions
106
+ * @param {string} [extraLine]
107
+ */
108
+ function logNextActions(actions, extraLine) {
109
+ logSectionTitle('Next actions:');
110
+ for (const a of actions) {
111
+ if (a.startsWith('Run:')) {
112
+ logger.log(chalk.cyan('- ') + chalk.white(a));
113
+ } else {
114
+ logger.log(chalk.cyan('- ') + a);
115
+ }
116
+ }
117
+ if (extraLine) {
118
+ logger.log(chalk.cyan('- ') + chalk.white(extraLine));
119
+ }
120
+ }
121
+
122
+ /**
123
+ * @param {Object} sys - ExternalSystemResponse
124
+ */
125
+ function logDocsBlock(sys) {
126
+ if (!sys) return;
127
+ const urls = [];
128
+ if (sys.openApiDocsPageUrl) urls.push({ label: 'OpenAPI Docs Page', url: sys.openApiDocsPageUrl });
129
+ if (sys.apiDocumentUrl) urls.push({ label: 'API Docs', url: sys.apiDocumentUrl });
130
+ if (sys.mcpServerUrl) urls.push({ label: 'MCP Server', url: sys.mcpServerUrl });
131
+ if (urls.length === 0) return;
132
+ logSeparator();
133
+ logSectionTitle('Docs:');
134
+ for (const { label, url } of urls) {
135
+ logger.log(`${chalk.gray(label + ':')} ${chalk.cyan(url)}`);
136
+ }
137
+ }
138
+
139
+ module.exports = {
140
+ SEP,
141
+ logSeparator,
142
+ logSectionTitle,
143
+ tierGlyph,
144
+ verdictLine,
145
+ logDatasourceTable,
146
+ logIdentityBlock,
147
+ logCredentialIntentBlock,
148
+ logNextActions,
149
+ logDocsBlock
150
+ };
@@ -0,0 +1,186 @@
1
+ const { formatBlockingError, formatSuccessLine } = require('./cli-test-layout-chalk');
2
+ /**
3
+ * Chalk-based CLI output for external system upload readiness (+ upload-time probe).
4
+ * Deploy summary lives in external-system-readiness-deploy-display.js.
5
+ *
6
+ * @fileoverview Readiness display for upload and optional probe after upload
7
+ * @author AI Fabrix Team
8
+ * @version 2.0.0
9
+ */
10
+
11
+ const chalk = require('chalk');
12
+ const logger = require('./logger');
13
+ const {
14
+ summarizeDatasourceTiersA,
15
+ summarizeProbeResults,
16
+ buildNextActionsTierA,
17
+ coerceProbeRunToResultRows
18
+ } = require('./external-system-readiness-core');
19
+ const {
20
+ logSeparator,
21
+ logSectionTitle,
22
+ logDatasourceTable,
23
+ logIdentityBlock,
24
+ logCredentialIntentBlock,
25
+ logNextActions,
26
+ logDocsBlock,
27
+ verdictLine,
28
+ SEP
29
+ } = require('./external-system-readiness-display-internals');
30
+
31
+ /**
32
+ * @param {Object} publication - PublicationResult
33
+ */
34
+ function logPublishResultBlock(publication) {
35
+ const genMcp = publication.generateMcpContract === true;
36
+ logSectionTitle('Publish Result:');
37
+ logger.log(formatSuccessLine('System registered (controller + dataplane)'));
38
+ if (publication.uploadId) {
39
+ logger.log(`${chalk.gray('Upload ID:')} ${chalk.cyan(String(publication.uploadId))}`);
40
+ }
41
+ const sys = publication.system || {};
42
+ if (sys.status) {
43
+ logger.log(`${chalk.gray('System status:')} ${sys.status}`);
44
+ }
45
+ logSeparator();
46
+ logSectionTitle('MCP Contract:');
47
+ logger.log(genMcp ? formatSuccessLine('Generated') : chalk.gray('○ Not requested (generateMcpContract false)'));
48
+ }
49
+
50
+ /**
51
+ * @param {string} systemKey
52
+ * @param {{ ready: number, partial: number, failed: number }} summary
53
+ * @param {boolean} willProbe
54
+ */
55
+ function logUploadReadinessSummaryMinimal(systemKey, summary, willProbe) {
56
+ logger.log(chalk.green(`\nUpload complete: ${systemKey}`));
57
+ logger.log(
58
+ chalk.gray('Summary:') +
59
+ ` ${chalk.green('Ready: ' + summary.ready)} · ${chalk.yellow('Partial: ' + summary.partial)} · ${chalk.red('Failed: ' + summary.failed)}`
60
+ );
61
+ if (!willProbe) logger.log(chalk.gray('Use --probe for runtime verification'));
62
+ }
63
+
64
+ /**
65
+ * @param {string} systemKey
66
+ * @param {Object} publication
67
+ * @param {Object} manifest
68
+ * @param {{ rows: Array<{ key: string, tier: string }>, ready: number, partial: number, failed: number }} summary
69
+ * @param {boolean} genMcp
70
+ * @param {boolean} willProbe
71
+ */
72
+ function logUploadReadinessSummaryExpanded(systemKey, publication, manifest, summary, genMcp, willProbe) {
73
+ const systemCfg = manifest.system || {};
74
+ logSeparator();
75
+ logPublishResultBlock(publication);
76
+ logSeparator();
77
+ logDatasourceTable(summary.rows, summary);
78
+ logSeparator();
79
+ logIdentityBlock(systemCfg);
80
+ logSeparator();
81
+ logCredentialIntentBlock(systemCfg, false, !!willProbe);
82
+ logSeparator();
83
+ let hints = buildNextActionsTierA(systemKey, summary, genMcp);
84
+ if (willProbe) {
85
+ hints = hints.filter(h => !h.includes(`Run: aifabrix upload ${systemKey} --probe`));
86
+ }
87
+ logNextActions(hints);
88
+ }
89
+
90
+ /**
91
+ * @param {Object} ctx
92
+ * @param {string} ctx.systemKey
93
+ * @param {Object} ctx.publication - PublicationResult
94
+ * @param {Object} ctx.manifest
95
+ * @param {boolean} [ctx.minimal] - One-line summary + probe hint only
96
+ * @param {boolean} [ctx.willProbe] - True when caller will run --probe immediately after this summary
97
+ */
98
+ function logUploadReadinessSummary(ctx) {
99
+ const { systemKey, publication, manifest, minimal, willProbe } = ctx;
100
+ const genMcp = publication.generateMcpContract === true;
101
+ const summary = summarizeDatasourceTiersA(publication.datasources || [], genMcp);
102
+ if (minimal) {
103
+ logUploadReadinessSummaryMinimal(systemKey, summary, willProbe);
104
+ return;
105
+ }
106
+ logUploadReadinessSummaryExpanded(systemKey, publication, manifest, summary, genMcp, willProbe);
107
+ }
108
+
109
+ /**
110
+ * @param {Object} validationBody - Unwrapped pipeline/validate response
111
+ */
112
+ function logServerValidationWarnings(validationBody) {
113
+ const warnings = validationBody?.warnings;
114
+ if (!Array.isArray(warnings) || warnings.length === 0) return;
115
+ logSeparator();
116
+ logSectionTitle('Server validation:');
117
+ for (const w of warnings) {
118
+ logger.log(chalk.yellow(`⚠ Warning: ${typeof w === 'string' ? w : JSON.stringify(w)}`));
119
+ }
120
+ }
121
+
122
+ /**
123
+ * @param {Object} results - Probe result rows
124
+ * @param {Object} summary - summarizeProbeResults output
125
+ */
126
+ function logProbeCredentialLine(results, summary) {
127
+ logSeparator();
128
+ logSectionTitle('Credential Test:');
129
+ const anyEndpointFail = results.some(row => row?.endpointTestResults?.success === false);
130
+ if (anyEndpointFail) {
131
+ logger.log(formatBlockingError('Failed (see Key Issues / endpoint test)'));
132
+ } else if (summary.failed > 0) {
133
+ logger.log(formatBlockingError('Some datasource checks failed'));
134
+ } else if (summary.partial > 0) {
135
+ logger.log(chalk.yellow('⚠ Completed with warnings'));
136
+ } else {
137
+ logger.log(formatSuccessLine('Passed'));
138
+ }
139
+ }
140
+
141
+ /**
142
+ * @param {Object} probeRaw - Unwrapped POST /validation/run body
143
+ * @param {string} systemKey
144
+ */
145
+ function logProbeRuntimeBlock(probeRaw, systemKey) {
146
+ const results = coerceProbeRunToResultRows(probeRaw);
147
+ const summary = summarizeProbeResults(results);
148
+ logSeparator();
149
+ logger.log(chalk.bold('Runtime Readiness:'));
150
+ if (results.length === 0) {
151
+ logger.log(chalk.yellow('⚠ No runtime datasource results were returned by the dataplane probe.'));
152
+ logger.log(chalk.gray(' Endpoint credential test may still pass even if datasource checks were not reported.'));
153
+ }
154
+ logDatasourceTable(summary.rows, summary);
155
+ if (summary.issues.length > 0) {
156
+ logSeparator();
157
+ logSectionTitle('Key Issues:');
158
+ for (const { key, lines } of summary.issues) {
159
+ logger.log(chalk.white(key));
160
+ for (const line of lines) {
161
+ logger.log(chalk.red(`- ${line}`));
162
+ }
163
+ }
164
+ }
165
+ logProbeCredentialLine(results, summary);
166
+ logSeparator();
167
+ logNextActions(
168
+ ['Fix API credentials or permissions if endpoint tests failed'],
169
+ `Run: aifabrix datasource test-e2e <datasourceKey> --app ${systemKey}`
170
+ );
171
+ }
172
+
173
+ module.exports = {
174
+ logUploadReadinessSummary,
175
+ logServerValidationWarnings,
176
+ logProbeRuntimeBlock,
177
+ SEP,
178
+ logSeparator,
179
+ logSectionTitle,
180
+ logDatasourceTable,
181
+ logIdentityBlock,
182
+ logCredentialIntentBlock,
183
+ logNextActions,
184
+ logDocsBlock,
185
+ verdictLine
186
+ };
@@ -0,0 +1,120 @@
1
+ /**
2
+ * @fileoverview Plan §17 blocks: capabilities overview and integration health (split for file-size limits).
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ /**
8
+ * @param {Object|null|undefined} env
9
+ * @returns {'ok'|'warn'|'fail'}
10
+ */
11
+ function integrationRollupStatus(env) {
12
+ const integ = env && env.integration;
13
+ if (!integ || typeof integ !== 'object') return 'ok';
14
+ if (typeof integ.status === 'string') {
15
+ const s = integ.status.toLowerCase();
16
+ if (s === 'fail' || s === 'failed' || s === 'error') return 'fail';
17
+ if (s === 'warn' || s === 'warning') return 'warn';
18
+ if (s === 'ok' || s === 'passed' || s === 'success') return 'ok';
19
+ }
20
+ const steps = Array.isArray(integ.stepResults) ? integ.stepResults : [];
21
+ if (steps.some(s => s && (s.success === false || s.error))) return 'fail';
22
+ return 'ok';
23
+ }
24
+
25
+ function buildCapabilityBlocks(rows, statusGlyph) {
26
+ const blocks = [];
27
+ for (const r of rows) {
28
+ if (r && r.skipped) continue;
29
+ const env = r && r.datasourceTestRun;
30
+ if (!env || !Array.isArray(env.capabilities) || env.capabilities.length === 0) continue;
31
+ const dkey = env.datasourceKey || r.key || 'datasource';
32
+ const caps = [...env.capabilities]
33
+ .filter(c => c && c.key)
34
+ .sort((a, b) => String(a.key).localeCompare(String(b.key)))
35
+ .slice(0, 4);
36
+ const parts = caps.map(c => `${statusGlyph(c.status)} ${c.key}`);
37
+ if (parts.length === 0) continue;
38
+ blocks.push({ dkey: String(dkey), line: parts.join(' ') });
39
+ }
40
+ return blocks;
41
+ }
42
+
43
+ function emitSectionHeader(io, title) {
44
+ const { log, metaGray, sectionTitle, SEP } = io;
45
+ log('');
46
+ log(metaGray(SEP));
47
+ log('');
48
+ log(sectionTitle(title));
49
+ log('');
50
+ }
51
+
52
+ /**
53
+ * @param {Array} rows
54
+ * @param {{ log: Function, chalk: object, metaGray: Function, sectionTitle: Function, statusGlyph: Function, SEP: string }} io
55
+ * @returns {boolean}
56
+ */
57
+ function logCapabilitiesOverview(rows, io) {
58
+ const blocks = buildCapabilityBlocks(rows, io.statusGlyph);
59
+ if (blocks.length === 0) return false;
60
+ emitSectionHeader(io, 'Capabilities overview:');
61
+ for (const b of blocks) {
62
+ io.log(io.chalk.white(`${b.dkey}:`));
63
+ io.log(io.chalk.white(` ${b.line}`));
64
+ }
65
+ return true;
66
+ }
67
+
68
+ function badIntegrationSteps(integ) {
69
+ if (!integ || !Array.isArray(integ.stepResults)) return [];
70
+ return integ.stepResults.filter(s => s && (s.success === false || s.error)).slice(0, 2);
71
+ }
72
+
73
+ function buildIntegrationBlocks(rows) {
74
+ const blocks = [];
75
+ for (const r of rows) {
76
+ if (r && r.skipped) continue;
77
+ const env = r && r.datasourceTestRun;
78
+ if (!env) continue;
79
+ const dkey = env.datasourceKey || r.key || 'datasource';
80
+ const st = integrationRollupStatus(env);
81
+ const integ = env.integration && typeof env.integration === 'object' ? env.integration : null;
82
+ blocks.push({ dkey: String(dkey), st, badSteps: badIntegrationSteps(integ) });
83
+ }
84
+ return blocks;
85
+ }
86
+
87
+ function emitFailedSteps(block, io) {
88
+ if (block.st !== 'fail' && block.st !== 'warn') return;
89
+ const { log, chalk, statusGlyph } = io;
90
+ for (const stp of block.badSteps) {
91
+ const nm = stp.name || stp.step || 'step';
92
+ const hint = stp.error || stp.message || '';
93
+ log(chalk.white(` ${statusGlyph('fail')} ${nm}${hint ? `: ${hint}` : ''}`));
94
+ }
95
+ }
96
+
97
+ /**
98
+ * @param {Array} rows
99
+ * @param {'integration'|'e2e'} runType
100
+ * @param {{ log: Function, chalk: object, metaGray: Function, sectionTitle: Function, statusGlyph: Function, SEP: string }} io
101
+ * @returns {boolean}
102
+ */
103
+ function logIntegrationHealthSection(rows, runType, io) {
104
+ if (runType !== 'integration') return false;
105
+ const blocks = buildIntegrationBlocks(rows);
106
+ if (blocks.length === 0) return false;
107
+ emitSectionHeader(io, 'Integration health:');
108
+ const { log, chalk, statusGlyph } = io;
109
+ for (const b of blocks) {
110
+ log(chalk.white(`${b.dkey}: ${statusGlyph(b.st)} ${b.st}`));
111
+ emitFailedSteps(b, io);
112
+ }
113
+ return true;
114
+ }
115
+
116
+ module.exports = {
117
+ integrationRollupStatus,
118
+ logCapabilitiesOverview,
119
+ logIntegrationHealthSection
120
+ };