@aifabrix/builder 2.49.1 → 2.50.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.
Files changed (413) hide show
  1. package/.cursor/process/README.md +9 -0
  2. package/.cursor/rules/deploy-rules/docker-image-ip-policy.mdc +49 -0
  3. package/.cursor/rules/plan-rules/application-lifecycle.mdc +30 -0
  4. package/.cursor/rules/plan-rules/plan-frontmatter.mdc +35 -0
  5. package/.cursor/rules/plan-rules/plan-lifecycle.mdc +31 -0
  6. package/.cursor/rules/plan-rules/plan-validation-gate.mdc +34 -0
  7. package/.cursor/skills/README.md +1 -0
  8. package/.dockerignore +52 -0
  9. package/.eslintignore +22 -0
  10. package/README.md +2 -0
  11. package/bin/builder-api-cleanup.js +26 -0
  12. package/bin/builder-api-nest.js +10 -0
  13. package/bin/builder-api-spike.js +19 -0
  14. package/enterprise-knowledge/README.md +50 -0
  15. package/enterprise-knowledge/enterprise-integration-lifecycle/README.md +22 -0
  16. package/enterprise-knowledge/enterprise-integration-lifecycle/application.json +15 -0
  17. package/enterprise-knowledge/enterprise-integration-lifecycle/deploy.js +69 -0
  18. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-deploy.json +52 -0
  19. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-system.json +29 -0
  20. package/enterprise-knowledge/enterprise-integration-lifecycle/env.template +2 -0
  21. package/integration/README.md +81 -0
  22. package/integration/github/README.md +53 -0
  23. package/integration/github/application.json +21 -0
  24. package/integration/github/deploy.js +72 -0
  25. package/integration/github/env.template +11 -0
  26. package/integration/github/github-datasource-issue-comments.json +239 -0
  27. package/integration/github/github-datasource-issues.json +399 -0
  28. package/integration/github/github-datasource-repository.json +354 -0
  29. package/integration/github/github-deploy.json +1202 -0
  30. package/integration/github/github-system.json +82 -0
  31. package/integration/hubspot-test/README.md +1 -1
  32. package/jest.isolated-projects.js +31 -1
  33. package/jest.projects.js +87 -1
  34. package/lib/api/dev-server-https.js +1 -1
  35. package/lib/api/dev.api.js +1 -0
  36. package/lib/api/enterprise-knowledge.api.js +63 -0
  37. package/lib/api/evidence.api.js +172 -0
  38. package/lib/api/external-systems.api.js +8 -2
  39. package/lib/api/host-ops.api.js +69 -0
  40. package/lib/api/resource-types.api.js +1 -0
  41. package/lib/api/types/enterprise-knowledge.types.js +46 -0
  42. package/lib/api/types/evidence.types.js +67 -0
  43. package/lib/api/types/resource-types.types.js +2 -0
  44. package/lib/app/controller-application-filter.js +36 -0
  45. package/lib/app/deploy.js +1 -1
  46. package/lib/app/list-external-systems.js +130 -0
  47. package/lib/app/list.js +20 -8
  48. package/lib/app/run.js +3 -1
  49. package/lib/app/show-display.js +8 -3
  50. package/lib/app/show-online.js +178 -0
  51. package/lib/app/show.js +37 -88
  52. package/lib/build/builder-api-docker-staging.js +47 -0
  53. package/lib/build/miso-controller-npm-sdk-guard.js +2 -2
  54. package/lib/build/standard-docker-build.js +2 -0
  55. package/lib/certification/post-unified-cert-sync.js +4 -31
  56. package/lib/certification/sync-after-external-command.js +0 -1
  57. package/lib/certification/sync-system-certification.js +0 -3
  58. package/lib/channels/add-channel.js +40 -34
  59. package/lib/channels/approval-guides/chatgpt.js +33 -0
  60. package/lib/channels/approval-guides/credential-portal.js +38 -0
  61. package/lib/channels/approval-guides/index.js +110 -0
  62. package/lib/channels/approval-guides/microsoft-copilot.js +34 -0
  63. package/lib/channels/approval-guides/slack.js +34 -0
  64. package/lib/channels/approval-guides/teams-bot.js +35 -0
  65. package/lib/channels/approval-guides/web-embed.js +32 -0
  66. package/lib/channels/channel-approval-guide.js +11 -0
  67. package/lib/channels/channel-artifact-generator.js +16 -4
  68. package/lib/channels/channel-audit.js +3 -0
  69. package/lib/channels/channel-auth-context.js +1 -1
  70. package/lib/channels/channel-description.js +59 -0
  71. package/lib/channels/channel-integration-generator.js +13 -230
  72. package/lib/channels/channel-integration-template.js +94 -0
  73. package/lib/channels/channel-runtime-resolver.js +43 -3
  74. package/lib/channels/channel-status-display.js +66 -26
  75. package/lib/channels/channel-targets.js +3 -3
  76. package/lib/cli/index.js +27 -3
  77. package/lib/cli/infra-guided.js +5 -1
  78. package/lib/cli/setup-app-external-create.js +111 -0
  79. package/lib/cli/setup-app.help.js +1 -1
  80. package/lib/cli/setup-app.js +38 -125
  81. package/lib/cli/setup-app.test-commands.js +26 -52
  82. package/lib/cli/setup-certification-commands.js +4 -4
  83. package/lib/cli/setup-certification.help.js +9 -9
  84. package/lib/cli/setup-dev-path-commands.js +24 -0
  85. package/lib/cli/setup-dev.js +115 -16
  86. package/lib/cli/setup-external-system-help.js +4 -6
  87. package/lib/cli/setup-external-system.js +58 -52
  88. package/lib/cli/setup-infra-up-builder-api-action.js +64 -0
  89. package/lib/cli/setup-infra-up-platform-action.js +3 -1
  90. package/lib/cli/setup-infra.js +15 -0
  91. package/lib/cli/setup-list.js +43 -0
  92. package/lib/cli/setup-utility-repair.js +26 -7
  93. package/lib/cli/setup-utility.js +5 -3
  94. package/lib/commands/app.js +15 -43
  95. package/lib/commands/channel-add-setup.js +110 -0
  96. package/lib/commands/channel.js +42 -8
  97. package/lib/commands/datasource-sync-display.js +96 -0
  98. package/lib/commands/datasource-sync-policy.js +210 -0
  99. package/lib/commands/datasource-test-trust-cli.js +6 -6
  100. package/lib/commands/datasource-unified-test-cli.js +2 -1
  101. package/lib/commands/datasource-unified-test-cli.options.js +33 -23
  102. package/lib/commands/deploy-gate-failure-details.js +163 -0
  103. package/lib/commands/deploy-gate-orchestrator.js +322 -0
  104. package/lib/commands/dev-cli-handlers.js +64 -61
  105. package/lib/commands/dev-host-ops-params.js +91 -0
  106. package/lib/commands/dev-host-ops-poll.js +111 -0
  107. package/lib/commands/dev-host-ops.js +252 -0
  108. package/lib/commands/dev-init.js +3 -1
  109. package/lib/commands/enterprise-knowledge.js +284 -0
  110. package/lib/commands/evidence-cli-leaves.js +250 -0
  111. package/lib/commands/evidence.js +51 -0
  112. package/lib/commands/governance-cli-shared.js +2 -2
  113. package/lib/commands/governance-command-action.js +2 -2
  114. package/lib/commands/governance-fixture-subjects.js +85 -0
  115. package/lib/commands/governance.js +1 -1
  116. package/lib/commands/lifecycle-command-action.js +2 -2
  117. package/lib/commands/lifecycle-external.js +3 -3
  118. package/lib/commands/manifest-cli-auth.js +29 -0
  119. package/lib/commands/manifest-cli-commands.js +170 -0
  120. package/lib/commands/manifest-cli-integration-path.js +63 -0
  121. package/lib/commands/manifest.js +21 -0
  122. package/lib/commands/protection-cli-leaves.js +3 -3
  123. package/lib/commands/repair-auth-apply.js +15 -1
  124. package/lib/commands/repair-authentications-454.js +169 -0
  125. package/lib/commands/repair-capability-openapi-warnings.js +126 -0
  126. package/lib/commands/repair-datasource-apply.js +135 -0
  127. package/lib/commands/repair-datasource-auto-rbac.js +62 -1
  128. package/lib/commands/repair-datasource-http-service-contract.js +239 -0
  129. package/lib/commands/repair-datasource-operation-security.js +180 -0
  130. package/lib/commands/repair-datasource-run.js +7 -2
  131. package/lib/commands/repair-datasource-sync-operations.js +177 -0
  132. package/lib/commands/repair-datasource-webhooks-sync-bridge.js +133 -0
  133. package/lib/commands/repair-datasource.js +12 -68
  134. package/lib/commands/repair-env-template.js +11 -1
  135. package/lib/commands/repair-external-run.js +121 -31
  136. package/lib/commands/repair-internal.js +1 -1
  137. package/lib/commands/repair-openapi-export.js +156 -0
  138. package/lib/commands/repair-openapi-sync.js +19 -2
  139. package/lib/commands/repair-orchestration-datasource-split.js +259 -0
  140. package/lib/commands/repair-persist.js +22 -1
  141. package/lib/commands/repair-rbac-platform-preset.js +204 -0
  142. package/lib/commands/repair-rbac-reader-roles.js +191 -0
  143. package/lib/commands/repair-rbac.js +163 -86
  144. package/lib/commands/repair-steps.js +83 -18
  145. package/lib/commands/repair-system-permissions.js +1 -0
  146. package/lib/commands/repair.js +1 -1
  147. package/lib/commands/resource-type.js +65 -26
  148. package/lib/commands/run-post-publish-data-sync.js +68 -0
  149. package/lib/commands/setup-modes.js +1 -1
  150. package/lib/commands/test-e2e-external.js +21 -8
  151. package/lib/commands/test-governance-cli-options.js +2 -2
  152. package/lib/commands/test-trust-cli-options.js +2 -2
  153. package/lib/commands/up-builder-api-bootstrap.js +71 -0
  154. package/lib/commands/up-builder-api-provision.js +241 -0
  155. package/lib/commands/up-builder-api.js +88 -0
  156. package/lib/commands/up-common.js +25 -1
  157. package/lib/commands/upload-credential-push-log.js +117 -0
  158. package/lib/commands/upload-data-sync-finalize.js +60 -0
  159. package/lib/commands/upload-probe.js +66 -0
  160. package/lib/commands/upload-publish-context.js +4 -1
  161. package/lib/commands/upload-sidecar-followups.js +55 -27
  162. package/lib/commands/upload.js +116 -157
  163. package/lib/commands/verify-governance-combined-external.js +1 -1
  164. package/lib/commands/verify-governance-db.js +2 -2
  165. package/lib/commands/verify-operations-command-action.js +2 -2
  166. package/lib/commands/verify-operations-step-plan.js +2 -2
  167. package/lib/commands/verify-operations-steps.js +2 -2
  168. package/lib/commands/verify-trust-command-action.js +1 -1
  169. package/lib/commands/wizard-core.js +1 -1
  170. package/lib/commands/wizard-headless.js +2 -1
  171. package/lib/core/admin-secrets.js +2 -6
  172. package/lib/core/secrets-env-content.js +10 -4
  173. package/lib/core/secrets-env-write.js +2 -13
  174. package/lib/datasource/agent-trust-run.js +3 -3
  175. package/lib/datasource/deploy.js +3 -1
  176. package/lib/datasource/test-e2e.js +6 -1
  177. package/lib/datasource/unified-validation-run-body.js +4 -1
  178. package/lib/datasource/unified-validation-run.js +1 -1
  179. package/lib/deployment/deploy-poll-ui.js +73 -12
  180. package/lib/deployment/deployer-poll-run.js +113 -0
  181. package/lib/deployment/deployer.js +17 -87
  182. package/lib/evidence/dataplane-context.js +21 -0
  183. package/lib/evidence/evidence-display.js +78 -0
  184. package/lib/evidence/evidence-service.js +392 -0
  185. package/lib/external-system/deploy.js +290 -112
  186. package/lib/external-system/download.js +7 -3
  187. package/lib/external-system/test-execution.js +1 -1
  188. package/lib/external-system/test-system-level.js +8 -10
  189. package/lib/external-system/test.js +12 -6
  190. package/lib/generator/deploy-script.js +73 -0
  191. package/lib/generator/external.js +2 -1
  192. package/lib/generator/index.js +17 -2
  193. package/lib/generator/wizard.js +3 -36
  194. package/lib/internal/fs-real-sync.js +22 -1
  195. package/lib/internal/node-fs.js +2 -0
  196. package/lib/lifecycle/lifecycle-governance-options.js +1 -1
  197. package/lib/lifecycle/verify-step-progress.js +1 -1
  198. package/lib/programmatic/access-log.js +26 -0
  199. package/lib/programmatic/auth-config.js +44 -0
  200. package/lib/programmatic/bearer-auth.js +176 -0
  201. package/lib/programmatic/builder-api-request.js +175 -0
  202. package/lib/programmatic/builder-api-route-dispatch.js +82 -0
  203. package/lib/programmatic/builder-api-runtime-config.js +42 -0
  204. package/lib/programmatic/builder-api-server.js +230 -0
  205. package/lib/programmatic/builder-help-authentication-catalog.js +282 -0
  206. package/lib/programmatic/builder-help-connected-system-ui.js +266 -0
  207. package/lib/programmatic/builder-help-enterprise-sync-fabrix.js +60 -0
  208. package/lib/programmatic/builder-help-envelope.js +36 -0
  209. package/lib/programmatic/builder-help-fixtures.js +200 -0
  210. package/lib/programmatic/builder-help-governance.js +172 -0
  211. package/lib/programmatic/builder-help-schema-catalog.js +92 -0
  212. package/lib/programmatic/builder-help.js +361 -0
  213. package/lib/programmatic/capability-registry.js +77 -0
  214. package/lib/programmatic/command-options.js +32 -0
  215. package/lib/programmatic/enterprise-mcp-client.js +98 -0
  216. package/lib/programmatic/http-problem-details.js +99 -0
  217. package/lib/programmatic/http-route-match.js +40 -0
  218. package/lib/programmatic/idempotency-cache.js +69 -0
  219. package/lib/programmatic/index.js +53 -0
  220. package/lib/programmatic/integration-path-scope.js +39 -0
  221. package/lib/programmatic/log-redaction.js +66 -0
  222. package/lib/programmatic/manifest-get-section.js +146 -0
  223. package/lib/programmatic/manifest-patch-section.js +252 -0
  224. package/lib/programmatic/manifest-repair.js +122 -0
  225. package/lib/programmatic/manifest-section-dependency-graph.js +160 -0
  226. package/lib/programmatic/manifest-section-io.js +225 -0
  227. package/lib/programmatic/manifest-section-quality.js +171 -0
  228. package/lib/programmatic/manifest-section-registry-data.js +269 -0
  229. package/lib/programmatic/manifest-section-registry.js +205 -0
  230. package/lib/programmatic/nest-http-bridge.js +34 -0
  231. package/lib/programmatic/openapi-component-schemas.js +68 -0
  232. package/lib/programmatic/openapi-description-enricher.js +117 -0
  233. package/lib/programmatic/openapi-descriptions.js +190 -0
  234. package/lib/programmatic/openapi-docs-serving.js +123 -0
  235. package/lib/programmatic/openapi-help-schemas.js +63 -0
  236. package/lib/programmatic/openapi-manifest-schemas.js +141 -0
  237. package/lib/programmatic/openapi-operation-bindings.js +274 -0
  238. package/lib/programmatic/openapi-request-schemas.js +155 -0
  239. package/lib/programmatic/openapi-result-schemas.js +476 -0
  240. package/lib/programmatic/openapi-schema-descriptions-certify.js +139 -0
  241. package/lib/programmatic/openapi-schema-descriptions-core.js +159 -0
  242. package/lib/programmatic/openapi-schema-descriptions-help.js +40 -0
  243. package/lib/programmatic/openapi-schema-descriptions-manifest.js +143 -0
  244. package/lib/programmatic/openapi-schema-descriptions-mcp.js +118 -0
  245. package/lib/programmatic/openapi-schema-descriptions-operations.js +281 -0
  246. package/lib/programmatic/openapi-schema-helpers.js +93 -0
  247. package/lib/programmatic/openapi-spec.js +203 -0
  248. package/lib/programmatic/orchestration-openapi-meta.js +159 -0
  249. package/lib/programmatic/platform-rbac-catalog.js +90 -0
  250. package/lib/programmatic/request-timeout.js +53 -0
  251. package/lib/programmatic/route-handler-map.js +143 -0
  252. package/lib/programmatic/route-handlers-context.js +29 -0
  253. package/lib/programmatic/route-handlers.js +33 -0
  254. package/lib/programmatic/run-certify.js +57 -0
  255. package/lib/programmatic/run-enterprise-mcp.js +32 -0
  256. package/lib/programmatic/run-lifecycle.js +29 -0
  257. package/lib/programmatic/run-repair.js +41 -0
  258. package/lib/programmatic/run-repository-emcp.js +54 -0
  259. package/lib/programmatic/run-template-workspace.js +61 -0
  260. package/lib/programmatic/run-test.js +49 -0
  261. package/lib/programmatic/run-upload.js +63 -0
  262. package/lib/programmatic/run-validate.js +53 -0
  263. package/lib/programmatic/run-wizard.js +40 -0
  264. package/lib/programmatic/system-key.js +48 -0
  265. package/lib/programmatic/wizard-config-normalize.js +118 -0
  266. package/lib/programmatic/workspace-cleanup.js +128 -0
  267. package/lib/programmatic/workspace-context.js +145 -0
  268. package/lib/programmatic/workspace-lock.js +75 -0
  269. package/lib/programmatic/workspace-meta.js +64 -0
  270. package/lib/programmatic/workspace-ops.js +149 -0
  271. package/lib/protection/run-commands-upload-sync.js +35 -0
  272. package/lib/protection/run-commands.js +2 -20
  273. package/lib/protection/upload-batch.js +11 -7
  274. package/lib/resolvers/resource-type-file.js +22 -0
  275. package/lib/schema/external-datasource.schema.json +161 -1
  276. package/lib/schema/external-system.schema.json +242 -4
  277. package/lib/schema/flag-map-validation-run.json +3 -0
  278. package/lib/schema/type/credential-field-registry.json +2 -2
  279. package/lib/schema/type/document-storage.json +9 -0
  280. package/lib/utils/agent-trust-run-display.js +1 -1
  281. package/lib/utils/app-path-resolve.js +168 -0
  282. package/lib/utils/authentication-env-template.js +222 -0
  283. package/lib/utils/cli-sync-options.js +7 -11
  284. package/lib/utils/cli-utils.js +4 -0
  285. package/lib/utils/cli-workspace-options.js +29 -0
  286. package/lib/utils/compose-generate-docker-compose.js +102 -0
  287. package/lib/utils/configuration-env-resolver.js +203 -27
  288. package/lib/utils/datasource-test-run-certificate-tty.js +28 -2
  289. package/lib/utils/datasource-test-run-certification-debug.js +130 -0
  290. package/lib/utils/datasource-test-run-debug-display.js +2 -0
  291. package/lib/utils/datasource-test-run-debug-slice.js +7 -0
  292. package/lib/utils/datasource-test-run-display.js +2 -1
  293. package/lib/utils/dev-init-ssh-merge.js +165 -23
  294. package/lib/utils/dev-pin-share-instructions.js +110 -0
  295. package/lib/utils/dev-ssh-config-helper.js +177 -33
  296. package/lib/utils/enterprise-knowledge-paths.js +142 -0
  297. package/lib/utils/env-copy.js +2 -1
  298. package/lib/utils/env-dotenv-format.js +103 -0
  299. package/lib/utils/external-env-template.js +4 -1
  300. package/lib/utils/external-system-display.js +5 -1
  301. package/lib/utils/external-system-readiness-compact-blocks.js +221 -0
  302. package/lib/utils/external-system-readiness-compact-display.js +324 -0
  303. package/lib/utils/external-system-readiness-core.js +16 -0
  304. package/lib/utils/external-system-readiness-deploy-display.js +29 -11
  305. package/lib/utils/external-system-readiness-display-internals.js +3 -1
  306. package/lib/utils/external-system-readiness-display.js +20 -30
  307. package/lib/utils/external-system-system-test-tty-certification.js +135 -0
  308. package/lib/utils/external-system-system-test-tty.js +5 -41
  309. package/lib/utils/help-builder.js +6 -1
  310. package/lib/utils/host-ops-job-labels.js +236 -0
  311. package/lib/utils/host-ops-job-result.js +61 -0
  312. package/lib/utils/host-ops-poll-ui.js +163 -0
  313. package/lib/utils/integration-path-resolve.js +112 -0
  314. package/lib/utils/paths-reload-source.js +148 -0
  315. package/lib/utils/paths-system-builder-keys.js +25 -0
  316. package/lib/utils/paths.js +151 -26
  317. package/lib/utils/runtime-configuration-values.js +64 -2
  318. package/lib/utils/secrets-helpers.js +5 -1
  319. package/lib/utils/ssh-known-hosts.js +130 -0
  320. package/lib/utils/test-target-cli-options.js +75 -0
  321. package/lib/utils/upload-sync-options.js +4 -0
  322. package/lib/utils/validation-run-request.js +11 -2
  323. package/lib/validation/external-manifest-validator.js +11 -1
  324. package/lib/validation/openapi-contract-surface-validator.js +426 -0
  325. package/lib/validation/openapi-contract-vendor-validation.js +238 -0
  326. package/lib/validation/validate-external-file.js +160 -0
  327. package/lib/validation/validate.js +6 -117
  328. package/package.json +46 -29
  329. package/packages/builder-api/README.md +120 -0
  330. package/packages/builder-api/package.json +30 -0
  331. package/packages/builder-api/src/app.module.ts +7 -0
  332. package/packages/builder-api/src/auth/auth.module.ts +5 -0
  333. package/packages/builder-api/src/external-system/external-system.module.ts +5 -0
  334. package/packages/builder-api/src/main.ts +16 -0
  335. package/packages/builder-api/tsconfig.json +15 -0
  336. package/scripts/check-builder-api-architecture-grep.js +79 -0
  337. package/scripts/docker_image_content_gate.js +47 -0
  338. package/scripts/docker_image_content_gate.sh +5 -0
  339. package/scripts/export-builder-api-evidence.js +262 -0
  340. package/scripts/lib/builder-api-docker-staging-copy.js +60 -0
  341. package/scripts/lib/builder-api-docker-staging-core.js +183 -0
  342. package/scripts/lib/docker-image-content-gate-core.js +166 -0
  343. package/scripts/lib/plan-actor.js +109 -0
  344. package/scripts/lib/plan-config.js +20 -0
  345. package/scripts/lib/plan-gates.js +154 -0
  346. package/scripts/lib/plan-meta.js +104 -0
  347. package/scripts/lib/plan-parse.js +162 -0
  348. package/scripts/lib/plan-prevalidate-gates.js +326 -0
  349. package/scripts/lib/plan-run-core.js +125 -0
  350. package/scripts/lib/plan-run-report.js +108 -0
  351. package/scripts/plan-approve.js +24 -0
  352. package/scripts/plan-archive.js +49 -0
  353. package/scripts/plan-run.js +13 -0
  354. package/scripts/plan-set-actor.js +21 -0
  355. package/scripts/plan-validate.js +80 -0
  356. package/scripts/pnpm/af.mjs +110 -0
  357. package/scripts/pnpm/check-quiet.mjs +32 -0
  358. package/scripts/pnpm/dev-install.mjs +29 -0
  359. package/scripts/pnpm/dev-reload.mjs +18 -0
  360. package/scripts/pnpm/help.mjs +55 -0
  361. package/scripts/pnpm/lib/dev-reload-core.mjs +189 -0
  362. package/scripts/pnpm/lib/dev-reload-log-capture.mjs +67 -0
  363. package/scripts/pnpm/lib/dev-reload-log-utils.mjs +32 -0
  364. package/scripts/pnpm/lib/resolve-aifabrix-bin.mjs +124 -0
  365. package/scripts/pnpm/lib/resolve-app-url.mjs +183 -0
  366. package/scripts/pnpm/lib/spinner.mjs +42 -0
  367. package/scripts/stage_builder_api_for_docker.js +65 -0
  368. package/scripts/sync-builder-api-template.js +44 -0
  369. package/templates/README.md +3 -0
  370. package/templates/applications/builder-api/Dockerfile +38 -0
  371. package/templates/applications/builder-api/application.yaml +75 -0
  372. package/templates/applications/builder-api/env.template +48 -0
  373. package/templates/applications/dataplane/application.yaml +1 -1
  374. package/templates/applications/dataplane/env.template +10 -6
  375. package/templates/applications/dataplane/rbac.yaml +21 -1
  376. package/templates/applications/miso-controller/application.yaml +1 -1
  377. package/templates/applications/miso-controller/env.template +1 -3
  378. package/templates/channels/README.md +18 -0
  379. package/templates/channels/ai-fabrix-icon.jpg +0 -0
  380. package/templates/channels/chatgpt/install.template.md.hbs +21 -24
  381. package/templates/channels/chatgpt/integration/README.md +11 -0
  382. package/templates/channels/chatgpt/integration/application.json +15 -0
  383. package/templates/channels/chatgpt/integration/chatgpt-system.json +29 -0
  384. package/templates/channels/chatgpt/integration/env.template +4 -0
  385. package/templates/channels/microsoft-copilot/install.template.md.hbs +20 -25
  386. package/templates/channels/microsoft-copilot/integration/README.md +11 -0
  387. package/templates/channels/microsoft-copilot/integration/application.json +15 -0
  388. package/templates/channels/microsoft-copilot/integration/env.template +6 -0
  389. package/templates/channels/microsoft-copilot/integration/microsoft-copilot-system.json +34 -0
  390. package/templates/channels/slack/install.template.md.hbs +48 -18
  391. package/templates/channels/slack/integration/README.md +38 -0
  392. package/templates/channels/slack/integration/application.json +18 -0
  393. package/templates/channels/slack/integration/env.template +29 -0
  394. package/templates/channels/slack/integration/slack-datasource-conversations.json +226 -0
  395. package/templates/channels/slack/integration/slack-datasource-messages.json +269 -0
  396. package/templates/channels/slack/integration/slack-system.json +86 -0
  397. package/templates/channels/slack/manifest.template.json.hbs +20 -10
  398. package/templates/channels/teams-bot/install.template.md.hbs +31 -17
  399. package/templates/channels/teams-bot/integration/README.md +18 -0
  400. package/templates/channels/teams-bot/integration/application.json +17 -0
  401. package/templates/channels/teams-bot/integration/env.template +5 -0
  402. package/templates/channels/teams-bot/integration/teams-bot-system.json +55 -0
  403. package/templates/channels/teams-bot/manifest.template.json.hbs +27 -0
  404. package/templates/channels/web-embed/install.template.md.hbs +16 -26
  405. package/templates/channels/web-embed/integration/README.md +11 -0
  406. package/templates/channels/web-embed/integration/application.json +15 -0
  407. package/templates/channels/web-embed/integration/env.template +4 -0
  408. package/templates/channels/web-embed/integration/web-embed-system.json +29 -0
  409. package/templates/openapi/redoc_page.html +86 -0
  410. package/templates/python/docker-compose.hbs +11 -0
  411. package/templates/python/requirements.txt +1 -1
  412. package/templates/typescript/docker-compose.hbs +11 -0
  413. package/lib/certification/cli-cert-sync-skip.js +0 -21
@@ -0,0 +1,324 @@
1
+ /**
2
+ * Compact TTY status card for external system upload/deploy (plan 156.0).
3
+ *
4
+ * @fileoverview Shared formatters + log helpers for compact readiness output
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const chalk = require('chalk');
12
+ const logger = require('./logger');
13
+ const {
14
+ formatSuccessLine,
15
+ formatBlockingError,
16
+ formatWarningLine
17
+ } = require('./cli-test-layout-chalk');
18
+ const { VERDICT } = require('../lifecycle/product-model');
19
+ const {
20
+ summarizeProbeResults,
21
+ coerceProbeRunToResultRows,
22
+ connectivityCheckFailed
23
+ } = require('./external-system-readiness-core');
24
+ const { getAuthMethodFromAuthentication } = require('./authentication-shape');
25
+
26
+ const PILLAR_LABELS = Object.freeze({
27
+ operations: 'Operations',
28
+ trust: 'AI Trust',
29
+ governance: 'Governance'
30
+ });
31
+
32
+ /**
33
+ * @param {string|null|undefined} status
34
+ * @returns {string}
35
+ */
36
+ function formatLifecycleLabel(status) {
37
+ const raw = String(status || 'unknown').trim().toLowerCase();
38
+ if (!raw || raw === 'unknown') return 'Unknown';
39
+ return raw.charAt(0).toUpperCase() + raw.slice(1);
40
+ }
41
+
42
+ /**
43
+ * @param {string[]} keys
44
+ * @param {number} [maxShow]
45
+ * @returns {string}
46
+ */
47
+ function truncateKeyList(keys, maxShow = 3) {
48
+ if (!Array.isArray(keys) || keys.length === 0) return '';
49
+ if (keys.length <= maxShow + 1) return keys.join(', ');
50
+ const shown = keys.slice(0, maxShow);
51
+ return `${shown.join(', ')}, +${keys.length - maxShow} more`;
52
+ }
53
+
54
+ /**
55
+ * @param {{ pushed?: number, keys?: string[], maxKeys?: number }} opts
56
+ * @returns {string|null}
57
+ */
58
+ function formatCredentialPushLine(opts = {}) {
59
+ const pushed = opts.pushed || 0;
60
+ if (pushed <= 0) return null;
61
+ const keys = truncateKeyList(opts.keys || [], opts.maxKeys ?? 3);
62
+ const suffix = keys ? ` (${keys})` : '';
63
+ return formatSuccessLine(`Credentials: ${pushed} secret(s) pushed${suffix}`);
64
+ }
65
+
66
+ /**
67
+ * @param {{ count?: number, names?: string[] }} opts
68
+ * @returns {string|null}
69
+ */
70
+ function formatConfigResolveLine(opts = {}) {
71
+ const count = opts.count || 0;
72
+ if (count <= 0) return null;
73
+ const names = (opts.names || []).join(', ');
74
+ const suffix = names ? ` (${names})` : '';
75
+ return formatSuccessLine(`Config: ${count} parameter(s) stored${suffix}`);
76
+ }
77
+
78
+ /**
79
+ * @param {{ method?: string }} opts
80
+ * @returns {string}
81
+ */
82
+ function formatAuthenticationSummary(opts = {}) {
83
+ const method = opts.method && String(opts.method).trim() ? String(opts.method) : 'unknown';
84
+ return `Authentication: ${method}`;
85
+ }
86
+
87
+ /**
88
+ * Resolves method from a single auth block, authentications[] row, or legacy flat shape.
89
+ * @param {Object|Array|null|undefined} authBlock
90
+ * @returns {string}
91
+ */
92
+ function resolveAuthMethodFromBlock(authBlock) {
93
+ if (!authBlock) {
94
+ return '';
95
+ }
96
+ if (Array.isArray(authBlock)) {
97
+ const primary =
98
+ authBlock.find((row) => row && (row.usage === 'api' || row.key === 'default')) ||
99
+ authBlock[0];
100
+ return resolveAuthMethodFromBlock(primary);
101
+ }
102
+ if (typeof authBlock !== 'object') {
103
+ return '';
104
+ }
105
+ if (authBlock.authType === 'none') {
106
+ return 'none';
107
+ }
108
+ if (authBlock.authType === 'apiProvider') {
109
+ return 'apiprovider';
110
+ }
111
+ return getAuthMethodFromAuthentication(authBlock);
112
+ }
113
+
114
+ /**
115
+ * True when the argument is an auth block, not a full manifest.system object.
116
+ * @param {Object} value
117
+ * @returns {boolean}
118
+ */
119
+ function looksLikeAuthBlock(value) {
120
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
121
+ return Array.isArray(value);
122
+ }
123
+ if (value.authType !== undefined || value.credential !== undefined) {
124
+ return true;
125
+ }
126
+ return value.method !== undefined && value.displayName === undefined && value.key === undefined;
127
+ }
128
+
129
+ /**
130
+ * @param {Object|null|undefined} systemCfg - manifest.system (or legacy auth block)
131
+ * @returns {string}
132
+ */
133
+ function resolveManifestAuthMethod(systemCfg) {
134
+ if (!systemCfg || typeof systemCfg !== 'object') {
135
+ return 'unknown';
136
+ }
137
+ if (looksLikeAuthBlock(systemCfg)) {
138
+ const method = resolveAuthMethodFromBlock(systemCfg);
139
+ return method || 'unknown';
140
+ }
141
+ const fromLegacy = resolveAuthMethodFromBlock(systemCfg.authentication);
142
+ if (fromLegacy) {
143
+ return fromLegacy;
144
+ }
145
+ const slots = systemCfg.authentications;
146
+ if (Array.isArray(slots) && slots.length > 0) {
147
+ const apiSlot =
148
+ slots.find((row) => row && (row.usage === 'api' || row.key === 'default')) || slots[0];
149
+ const fromSlot = resolveAuthMethodFromBlock(apiSlot);
150
+ if (fromSlot) {
151
+ return fromSlot;
152
+ }
153
+ }
154
+ return 'unknown';
155
+ }
156
+
157
+ /**
158
+ * @param {{ status?: string, systemFromDataplane?: Object, publication?: Object }} opts
159
+ * @returns {string}
160
+ */
161
+ function resolveConnectedSystemStatus(opts = {}) {
162
+ const fromPub = opts.publication?.system?.status;
163
+ const fromGet = opts.systemFromDataplane?.status;
164
+ return formatLifecycleLabel(fromGet || fromPub || opts.status);
165
+ }
166
+
167
+ /**
168
+ * @param {{ ready?: number, partial?: number, failed?: number, mcp?: boolean }} opts
169
+ * @returns {string}
170
+ */
171
+ function formatDatasourceAggregateLine(opts = {}) {
172
+ const ready = opts.ready ?? 0;
173
+ const partial = opts.partial ?? 0;
174
+ const failed = opts.failed ?? 0;
175
+ const mcpSuffix = opts.mcp === false ? '' : ' (MCP)';
176
+ let line = `Datasources: ${ready} ready`;
177
+ if (partial > 0) line += ` · ${partial} partial`;
178
+ if (failed > 0) line += ` · ${failed} failed`;
179
+ return line + mcpSuffix;
180
+ }
181
+
182
+ /**
183
+ * @param {{ failed?: number, partial?: number }} summary
184
+ * @returns {'passed'|'partial'|'failed'}
185
+ */
186
+ function runtimeVerdictFromProbeSummary(summary) {
187
+ if ((summary.failed || 0) > 0) return 'failed';
188
+ if ((summary.partial || 0) > 0) return 'partial';
189
+ return 'passed';
190
+ }
191
+
192
+ /**
193
+ * @param {{ probeData?: Object }} opts
194
+ * @returns {{ runtimeVerdict: string, connectivityPassed: boolean, summary: Object, results: Object[] }|null}
195
+ */
196
+ function buildProbeCompactContext(opts = {}) {
197
+ if (!opts.probeData) return null;
198
+ const results = coerceProbeRunToResultRows(opts.probeData);
199
+ const summary = summarizeProbeResults(results);
200
+ return {
201
+ runtimeVerdict: runtimeVerdictFromProbeSummary(summary),
202
+ connectivityPassed: !connectivityCheckFailed(results),
203
+ summary,
204
+ results
205
+ };
206
+ }
207
+
208
+ /**
209
+ * @param {{ issues?: Array<{ key: string, lines: string[] }>, maxKeys?: number }} opts
210
+ * @returns {string[]}
211
+ */
212
+ function formatRuntimeDatasourceIssues(opts = {}) {
213
+ const issues = opts.issues || [];
214
+ const max = opts.maxKeys ?? 3;
215
+ const lines = [];
216
+ for (let i = 0; i < issues.length && i < max; i += 1) {
217
+ const item = issues[i];
218
+ const tier = item.tier || 'Partial';
219
+ const msg = item.lines?.[0] || 'check failed';
220
+ lines.push(`${tier}: ${item.key} — ${msg}`);
221
+ }
222
+ if (issues.length > max) {
223
+ lines.push(`+${issues.length - max} more datasource issue(s) — use -v`);
224
+ }
225
+ return lines;
226
+ }
227
+
228
+ /**
229
+ * @param {{ pillar?: string, verdict?: string, percent?: number, scenariosPassed?: number, scenariosTotal?: number }} opts
230
+ * @returns {string}
231
+ */
232
+ function formatGatePillarLine(opts = {}) {
233
+ const label = PILLAR_LABELS[opts.pillar] || opts.pillar || 'Gate';
234
+ const verdict = opts.verdict || VERDICT.NOT_VERIFIED;
235
+ let suffix = '';
236
+ if (typeof opts.percent === 'number' && Number.isFinite(opts.percent)) {
237
+ suffix = ` (${Math.round(opts.percent)}%)`;
238
+ } else if (
239
+ typeof opts.scenariosPassed === 'number'
240
+ && typeof opts.scenariosTotal === 'number'
241
+ && opts.scenariosTotal > 0
242
+ ) {
243
+ suffix = ` (${opts.scenariosPassed}/${opts.scenariosTotal} scenarios)`;
244
+ }
245
+ if (verdict === VERDICT.VERIFIED) {
246
+ return formatSuccessLine(`${label} · VERIFIED${suffix}`);
247
+ }
248
+ if (verdict === VERDICT.FAILED) {
249
+ return formatBlockingError(`${label} · FAILED${suffix}`);
250
+ }
251
+ return formatWarningLine(`${label} · NOT VERIFIED${suffix}`);
252
+ }
253
+
254
+ /**
255
+ * @param {{ unitPassed?: boolean, integrationPassed?: boolean }} opts
256
+ * @returns {string|null}
257
+ */
258
+ function formatPreflightLine(opts = {}) {
259
+ if (opts.unitPassed === false || opts.integrationPassed === false) {
260
+ return formatBlockingError('Preflight: unit or integration failed');
261
+ }
262
+ if (opts.unitPassed !== false && opts.integrationPassed !== false) {
263
+ return formatSuccessLine('Preflight: unit + integration');
264
+ }
265
+ return null;
266
+ }
267
+
268
+ /**
269
+ * @param {{ command: 'upload'|'deploy', systemKey: string, environment?: string, dataplaneUrl?: string }} opts
270
+ */
271
+ function logCompactHeader(opts) {
272
+ const host = opts.dataplaneUrl
273
+ ? String(opts.dataplaneUrl).replace(/^https?:\/\//, '').replace(/\/+$/, '')
274
+ : '(unknown)';
275
+ const env = opts.environment || 'dev';
276
+ const label = String(opts.command || 'upload').toUpperCase();
277
+ logger.log('');
278
+ logger.log(chalk.bold(` ${label} ${opts.systemKey} → ${env} @ ${host}`));
279
+ logger.log('');
280
+ }
281
+
282
+ /**
283
+ * @param {{ dataplaneUrl?: string, systemKey: string }} opts
284
+ */
285
+ function logCompactPortalLinks(opts) {
286
+ const base = opts.dataplaneUrl ? String(opts.dataplaneUrl).replace(/\/+$/, '') : '';
287
+ if (!base) return;
288
+ logger.log(` Portal: ${base}/connected-systems/${encodeURIComponent(opts.systemKey)}`);
289
+ logger.log(
290
+ ` MCP: ${base}/api/v1/mcp/servers/tools?filter=systemKey:eq:${encodeURIComponent(opts.systemKey)}`
291
+ );
292
+ }
293
+
294
+ /**
295
+ * @param {{ systemKey: string, command: 'upload'|'deploy', probed?: boolean }} opts
296
+ */
297
+ function logCompactTip(opts) {
298
+ const cmd = opts.command === 'deploy' ? 'deploy' : 'upload';
299
+ const probeHint = opts.probed
300
+ ? ''
301
+ : `af ${cmd} ${opts.systemKey} --probe for runtime check · `;
302
+ logger.log(` Tip: ${probeHint}-v for full report`);
303
+ }
304
+
305
+ module.exports = {
306
+ PILLAR_LABELS,
307
+ formatLifecycleLabel,
308
+ truncateKeyList,
309
+ formatCredentialPushLine,
310
+ formatConfigResolveLine,
311
+ formatAuthenticationSummary,
312
+ resolveManifestAuthMethod,
313
+ resolveAuthMethodFromBlock,
314
+ resolveConnectedSystemStatus,
315
+ formatDatasourceAggregateLine,
316
+ formatGatePillarLine,
317
+ formatPreflightLine,
318
+ formatRuntimeDatasourceIssues,
319
+ runtimeVerdictFromProbeSummary,
320
+ buildProbeCompactContext,
321
+ logCompactHeader,
322
+ logCompactPortalLinks,
323
+ logCompactTip
324
+ };
@@ -116,6 +116,9 @@ function summarizeDatasourceTiersA(datasources, generateMcpContract) {
116
116
  if (detail.tier === 'partial' && detail.partialReason) {
117
117
  row.partialReason = detail.partialReason;
118
118
  }
119
+ if (detail.tier === 'ready' && generateMcpContract === true && ds.mcpContract) {
120
+ row.mcpReady = true;
121
+ }
119
122
  rows.push(row);
120
123
  if (detail.tier === 'ready') ready += 1;
121
124
  else if (detail.tier === 'partial') partial += 1;
@@ -317,6 +320,18 @@ function coerceProbeRunToResultRows(probeRaw) {
317
320
  return [];
318
321
  }
319
322
 
323
+ /**
324
+ * @param {Object[]} results - Probe result rows
325
+ * @returns {boolean}
326
+ */
327
+ function connectivityCheckFailed(results) {
328
+ return (results || []).some(
329
+ row =>
330
+ row?.endpointTestResults?.success === false
331
+ || row?.endpointTestResults?.endpointReachable === false
332
+ );
333
+ }
334
+
320
335
  /**
321
336
  * @param {Array<Object>} results - ExternalSystemTestResponse.results
322
337
  * @returns {{ rows: Array<{ key: string, tier: string }>, ready: number, partial: number, failed: number, issues: Array<{ key: string, lines: string[] }> }}
@@ -448,6 +463,7 @@ module.exports = {
448
463
  summarizeDatasourceTiersA,
449
464
  aggregateVerdictFromCounts,
450
465
  classifyDatasourceTierB,
466
+ connectivityCheckFailed,
451
467
  summarizeProbeResults,
452
468
  coerceProbeRunToResultRows,
453
469
  isDatasourceTestRunEnvelope,
@@ -28,6 +28,8 @@ const {
28
28
  logDocsBlock,
29
29
  logNextActions
30
30
  } = require('./external-system-readiness-display-internals');
31
+ const { logDeployReadinessSummaryCompact } = require('./external-system-readiness-compact-blocks');
32
+ const { resolveManifestAuthMethod } = require('./external-system-readiness-compact-display');
31
33
 
32
34
  /**
33
35
  * @param {Array<Object>|undefined} dsFromCtx
@@ -179,7 +181,7 @@ function logDeployConfigDeploymentRuntime(systemCfg, deploymentOk, probeData, su
179
181
  logger.log(verdictLine(verdict));
180
182
  logSectionTitle('Config:');
181
183
  logger.log(formatSuccessLine('Manifest valid'));
182
- const method = systemCfg.authentication?.method || 'unknown';
184
+ const method = resolveManifestAuthMethod(systemCfg);
183
185
  logger.log(formatSuccessLine(`Authentication configured (${method})`));
184
186
  logDeployDeploymentSubsection(deploymentOk, deploymentDetail);
185
187
  logSectionTitle('Runtime:');
@@ -215,17 +217,8 @@ function logDeployIdentityAndCredentialBlocks(systemCfg, withProbe) {
215
217
 
216
218
  /**
217
219
  * @param {Object} ctx
218
- * @param {string} ctx.environment
219
- * @param {string} ctx.dataplaneUrl
220
- * @param {Object} ctx.manifest
221
- * @param {Array<Object>} [ctx.datasources]
222
- * @param {Object|null} ctx.systemFromDataplane
223
- * @param {Error|null} ctx.fetchError
224
- * @param {boolean} ctx.deploymentOk
225
- * @param {Object|null} [ctx.deploymentDetail]
226
- * @param {Object|null} ctx.probeData
227
220
  */
228
- function logDeployReadinessSummary(ctx) {
221
+ function logDeployReadinessSummaryVerbose(ctx) {
229
222
  const {
230
223
  environment,
231
224
  dataplaneUrl,
@@ -264,6 +257,31 @@ function logDeployReadinessSummary(ctx) {
264
257
  logDeployNextActionsSection(systemKey, probeData, summary, genMcp);
265
258
  }
266
259
 
260
+ /**
261
+ * @param {Object} ctx
262
+ * @param {string} ctx.environment
263
+ * @param {string} ctx.dataplaneUrl
264
+ * @param {Object} ctx.manifest
265
+ * @param {Array<Object>} [ctx.datasources]
266
+ * @param {Object|null} ctx.systemFromDataplane
267
+ * @param {Error|null} ctx.fetchError
268
+ * @param {boolean} ctx.deploymentOk
269
+ * @param {Object|null} [ctx.deploymentDetail]
270
+ * @param {Object|null} ctx.probeData
271
+ * @param {boolean} [ctx.verbose] - Expanded summary when true
272
+ * @param {Object} [ctx.gateOutcomes] - Preflight + optional gate results for compact card
273
+ * @param {Object} [ctx.credentialPush]
274
+ * @param {Object} [ctx.configPush]
275
+ * @param {string|null} [ctx.draftDeploymentId]
276
+ */
277
+ function logDeployReadinessSummary(ctx) {
278
+ if (ctx.verbose !== true) {
279
+ logDeployReadinessSummaryCompact(ctx);
280
+ return;
281
+ }
282
+ logDeployReadinessSummaryVerbose(ctx);
283
+ }
284
+
267
285
  module.exports = {
268
286
  logDeployReadinessSummary
269
287
  };
@@ -63,7 +63,9 @@ function logDatasourceTable(rows, counts, title) {
63
63
  const hint =
64
64
  r.tier === 'partial' && r.partialReason
65
65
  ? chalk.gray(` — ${formatTierAPartialHint(r.partialReason)}`)
66
- : '';
66
+ : r.mcpReady === true
67
+ ? chalk.gray(' — MCP ready')
68
+ : '';
67
69
  logger.log(
68
70
  `${tierGlyph(r.tier)} ${r.key.padEnd(14, ' ')} ${chalk.gray('(' + statusLabel + ')')}${hint}`
69
71
  );
@@ -14,8 +14,10 @@ const {
14
14
  summarizeDatasourceTiersA,
15
15
  summarizeProbeResults,
16
16
  buildNextActionsTierA,
17
- coerceProbeRunToResultRows
17
+ coerceProbeRunToResultRows,
18
+ connectivityCheckFailed
18
19
  } = require('./external-system-readiness-core');
20
+ const { logUploadReadinessSummaryCompact } = require('./external-system-readiness-compact-blocks');
19
21
  const {
20
22
  logSeparator,
21
23
  logSectionTitle,
@@ -56,20 +58,6 @@ function logPublishResultBlock(publication) {
56
58
  }
57
59
  }
58
60
 
59
- /**
60
- * @param {string} systemKey
61
- * @param {{ ready: number, partial: number, failed: number }} summary
62
- * @param {boolean} willProbe
63
- */
64
- function logUploadReadinessSummaryMinimal(systemKey, summary, willProbe) {
65
- logger.log(chalk.green(`\nUpload complete: ${systemKey}`));
66
- logger.log(
67
- chalk.gray('Summary:') +
68
- ` ${chalk.green('Ready: ' + summary.ready)} · ${chalk.yellow('Partial: ' + summary.partial)} · ${chalk.red('Failed: ' + summary.failed)}`
69
- );
70
- if (!willProbe) logger.log(chalk.gray('Use --probe for runtime verification'));
71
- }
72
-
73
61
  /**
74
62
  * @param {string} systemKey
75
63
  * @param {Object} publication
@@ -101,15 +89,29 @@ function logUploadReadinessSummaryExpanded(systemKey, publication, manifest, sum
101
89
  * @param {string} ctx.systemKey
102
90
  * @param {Object} ctx.publication - PublicationResult
103
91
  * @param {Object} ctx.manifest
104
- * @param {boolean} [ctx.minimal] - One-line summary + probe hint only
92
+ * @param {boolean} [ctx.minimal] - Compact status card (default when not verbose)
105
93
  * @param {boolean} [ctx.willProbe] - True when caller will run --probe immediately after this summary
94
+ * @param {Object|null} [ctx.probeData] - Probe payload when already run (compact path)
95
+ * @param {Object} [ctx.credentialPush] - Credential push summary for compact card
96
+ * @param {Object} [ctx.configPush] - Config store summary for compact card
97
+ * @param {boolean} [ctx.forcePublish] - Show forced publish warning in compact card
106
98
  */
107
99
  function logUploadReadinessSummary(ctx) {
108
- const { systemKey, publication, manifest, minimal, willProbe } = ctx;
100
+ const { systemKey, publication, manifest, minimal, willProbe, environment, dataplaneUrl } = ctx;
109
101
  const genMcp = publication.generateMcpContract === true;
110
102
  const summary = summarizeDatasourceTiersA(publication.datasources || [], genMcp);
111
103
  if (minimal) {
112
- logUploadReadinessSummaryMinimal(systemKey, summary, willProbe);
104
+ logUploadReadinessSummaryCompact({
105
+ systemKey,
106
+ environment,
107
+ dataplaneUrl,
108
+ publication,
109
+ manifest,
110
+ credentialPush: ctx.credentialPush,
111
+ configPush: ctx.configPush,
112
+ forcePublish: ctx.forcePublish === true,
113
+ probeData: ctx.probeData || null
114
+ });
113
115
  return;
114
116
  }
115
117
  logUploadReadinessSummaryExpanded(systemKey, publication, manifest, summary, genMcp, willProbe);
@@ -128,18 +130,6 @@ function logServerValidationWarnings(validationBody) {
128
130
  }
129
131
  }
130
132
 
131
- /**
132
- * @param {Object[]} results - Probe result rows
133
- * @returns {boolean}
134
- */
135
- function connectivityCheckFailed(results) {
136
- return results.some(
137
- row =>
138
- row?.endpointTestResults?.success === false
139
- || row?.endpointTestResults?.endpointReachable === false
140
- );
141
- }
142
-
143
133
  /**
144
134
  * @param {Object} results - Probe result rows
145
135
  * @param {Object} summary - summarizeProbeResults output
@@ -0,0 +1,135 @@
1
+ /**
2
+ * @fileoverview Plan §17 certification TTY block (split for file-size limits).
3
+ */
4
+
5
+ 'use strict';
6
+
7
+ const chalk = require('chalk');
8
+ const logger = require('./logger');
9
+ const { SEP } = require('./datasource-test-run-display');
10
+ const { sectionTitle, metadata: metaGray } = require('./cli-test-layout-chalk');
11
+ const { certificationOutputFromEnvelope } = require('./datasource-test-run-certification-debug');
12
+
13
+ function certificateBucket(env) {
14
+ const cert = env && env.certificate;
15
+ if (!cert || typeof cert !== 'object') return { status: null, level: null };
16
+ return {
17
+ status: cert.status ? String(cert.status) : null,
18
+ level: cert.level ? String(cert.level) : null
19
+ };
20
+ }
21
+
22
+ function systemCertStatus(rows) {
23
+ const certs = rows
24
+ .map(r => (r && r.datasourceTestRun ? certificateBucket(r.datasourceTestRun) : { status: null, level: null }))
25
+ .filter(c => c.status !== null);
26
+ if (certs.length === 0) return null;
27
+ if (certs.some(c => c.status === 'not_passed')) return 'not_passed';
28
+ return 'passed';
29
+ }
30
+
31
+ function filterIssuanceFailureRows(rows) {
32
+ return rows.filter(r => {
33
+ const ci = r && r.datasourceTestRun && r.datasourceTestRun.certificateIssuance;
34
+ return ci && typeof ci === 'object' && String(ci.status || '') === 'failed';
35
+ });
36
+ }
37
+
38
+ function filterCertificationOutputRows(rows) {
39
+ return rows.filter(r => {
40
+ const out = certificationOutputFromEnvelope(r && r.datasourceTestRun);
41
+ return out && typeof out === 'object';
42
+ });
43
+ }
44
+
45
+ function logCertificationBreakdown(rows) {
46
+ logger.log('');
47
+ logger.log(chalk.white('Breakdown:'));
48
+ for (const r of rows) {
49
+ const env = r && r.datasourceTestRun;
50
+ if (!env) continue;
51
+ const cert = certificateBucket(env);
52
+ if (!cert.status) continue;
53
+ const g = cert.status === 'passed' ? '✔' : '✖';
54
+ const tier = cert.level ? cert.level : '(no level)';
55
+ logger.log(chalk.white(`- ${env.datasourceKey}: ${g} ${tier}`));
56
+ }
57
+ }
58
+
59
+ function logIssuanceFailures(issuanceRows) {
60
+ logger.log('');
61
+ logger.log(chalk.white('Certificate issuance failures:'));
62
+ for (const r of issuanceRows) {
63
+ const env = r.datasourceTestRun;
64
+ const ci = env.certificateIssuance;
65
+ const reason = ci.reasonCode ? ` (${ci.reasonCode})` : '';
66
+ logger.log(chalk.white(`- ${env.datasourceKey}: ✖ ${ci.status || 'failed'}${reason}`));
67
+ if (ci.message) logger.log(chalk.yellow(` ${String(ci.message)}`));
68
+ }
69
+ }
70
+
71
+ function logBlockers(out) {
72
+ const blockers = Array.isArray(out.blockers) ? out.blockers : [];
73
+ const cap = Math.min(3, blockers.length);
74
+ for (let i = 0; i < cap; i += 1) {
75
+ const b = blockers[i];
76
+ const code = b && b.code ? String(b.code) : '';
77
+ const msg = b && b.message ? String(b.message) : '';
78
+ const tail = [code, msg].filter(Boolean).join(' — ');
79
+ if (tail) logger.log(chalk.yellow(` • ${tail}`));
80
+ }
81
+ }
82
+
83
+ function logEngineDebugRow(env, out) {
84
+ const passed = out.passed === true;
85
+ const level = out.level ? String(out.level) : '';
86
+ const glyph = passed ? '✔' : '✖';
87
+ logger.log(
88
+ chalk.white(`- ${env.datasourceKey}: ${glyph} ${passed ? 'passed' : 'not passed'}${level ? ` (${level})` : ''}`)
89
+ );
90
+ logBlockers(out);
91
+ }
92
+
93
+ function logCertificationEngineDebug(outputRows) {
94
+ logger.log('');
95
+ logger.log(chalk.white('Certification engine (debug):'));
96
+ for (const r of outputRows) {
97
+ const env = r.datasourceTestRun;
98
+ const out = certificationOutputFromEnvelope(env);
99
+ if (!out) continue;
100
+ logEngineDebugRow(env, out);
101
+ }
102
+ }
103
+
104
+ function logCertificationSection(rows, opts = {}) {
105
+ const certSt = systemCertStatus(rows);
106
+ const showIssuance = Boolean(opts.debug) || Boolean(opts.verbose);
107
+ const issuanceRows = filterIssuanceFailureRows(rows);
108
+ const outputRows = filterCertificationOutputRows(rows);
109
+ if (!certSt && issuanceRows.length === 0 && outputRows.length === 0) return;
110
+
111
+ logger.log('');
112
+ logger.log(metaGray(SEP));
113
+ logger.log('');
114
+ logger.log(sectionTitle('Certification:'));
115
+
116
+ if (certSt) {
117
+ logger.log('');
118
+ logger.log(chalk.white(`System level: ${certSt === 'passed' ? '✔ Achieved' : '✖ Not achieved'}`));
119
+ logCertificationBreakdown(rows);
120
+ }
121
+
122
+ if (showIssuance && issuanceRows.length > 0) {
123
+ logIssuanceFailures(issuanceRows);
124
+ }
125
+
126
+ if (showIssuance && outputRows.length > 0) {
127
+ logCertificationEngineDebug(outputRows);
128
+ }
129
+ }
130
+
131
+ module.exports = {
132
+ certificateBucket,
133
+ systemCertStatus,
134
+ logCertificationSection
135
+ };