@aifabrix/builder 2.49.2 → 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 (409) hide show
  1. package/.cursor/rules/deploy-rules/docker-image-ip-policy.mdc +49 -0
  2. package/.cursor/rules/plan-rules/application-lifecycle.mdc +30 -0
  3. package/.cursor/rules/plan-rules/plan-frontmatter.mdc +35 -0
  4. package/.cursor/rules/plan-rules/plan-lifecycle.mdc +31 -0
  5. package/.cursor/rules/plan-rules/plan-validation-gate.mdc +34 -0
  6. package/.cursor/skills/README.md +1 -0
  7. package/.dockerignore +52 -0
  8. package/.eslintignore +22 -0
  9. package/README.md +2 -0
  10. package/bin/builder-api-cleanup.js +26 -0
  11. package/bin/builder-api-nest.js +10 -0
  12. package/bin/builder-api-spike.js +19 -0
  13. package/enterprise-knowledge/README.md +50 -0
  14. package/enterprise-knowledge/enterprise-integration-lifecycle/README.md +22 -0
  15. package/enterprise-knowledge/enterprise-integration-lifecycle/application.json +15 -0
  16. package/enterprise-knowledge/enterprise-integration-lifecycle/deploy.js +69 -0
  17. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-deploy.json +52 -0
  18. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-system.json +29 -0
  19. package/enterprise-knowledge/enterprise-integration-lifecycle/env.template +2 -0
  20. package/integration/README.md +81 -0
  21. package/integration/github/README.md +53 -0
  22. package/integration/github/application.json +21 -0
  23. package/integration/github/deploy.js +72 -0
  24. package/integration/github/env.template +11 -0
  25. package/integration/github/github-datasource-issue-comments.json +239 -0
  26. package/integration/github/github-datasource-issues.json +399 -0
  27. package/integration/github/github-datasource-repository.json +354 -0
  28. package/integration/github/github-deploy.json +1202 -0
  29. package/integration/github/github-system.json +82 -0
  30. package/integration/hubspot-test/README.md +1 -1
  31. package/jest.isolated-projects.js +31 -1
  32. package/jest.projects.js +87 -1
  33. package/lib/api/dev-server-https.js +1 -1
  34. package/lib/api/enterprise-knowledge.api.js +63 -0
  35. package/lib/api/evidence.api.js +172 -0
  36. package/lib/api/external-systems.api.js +8 -2
  37. package/lib/api/resource-types.api.js +1 -0
  38. package/lib/api/types/enterprise-knowledge.types.js +46 -0
  39. package/lib/api/types/evidence.types.js +67 -0
  40. package/lib/api/types/resource-types.types.js +2 -0
  41. package/lib/app/controller-application-filter.js +36 -0
  42. package/lib/app/deploy.js +1 -1
  43. package/lib/app/list-external-systems.js +130 -0
  44. package/lib/app/list.js +20 -8
  45. package/lib/app/run.js +3 -1
  46. package/lib/app/show-display.js +8 -3
  47. package/lib/app/show-online.js +178 -0
  48. package/lib/app/show.js +37 -88
  49. package/lib/build/builder-api-docker-staging.js +47 -0
  50. package/lib/build/miso-controller-npm-sdk-guard.js +2 -2
  51. package/lib/build/standard-docker-build.js +2 -0
  52. package/lib/certification/post-unified-cert-sync.js +4 -31
  53. package/lib/certification/sync-after-external-command.js +0 -1
  54. package/lib/certification/sync-system-certification.js +0 -3
  55. package/lib/channels/add-channel.js +40 -34
  56. package/lib/channels/approval-guides/chatgpt.js +33 -0
  57. package/lib/channels/approval-guides/credential-portal.js +38 -0
  58. package/lib/channels/approval-guides/index.js +110 -0
  59. package/lib/channels/approval-guides/microsoft-copilot.js +34 -0
  60. package/lib/channels/approval-guides/slack.js +34 -0
  61. package/lib/channels/approval-guides/teams-bot.js +35 -0
  62. package/lib/channels/approval-guides/web-embed.js +32 -0
  63. package/lib/channels/channel-approval-guide.js +11 -0
  64. package/lib/channels/channel-artifact-generator.js +16 -4
  65. package/lib/channels/channel-audit.js +3 -0
  66. package/lib/channels/channel-auth-context.js +1 -1
  67. package/lib/channels/channel-description.js +59 -0
  68. package/lib/channels/channel-integration-generator.js +13 -230
  69. package/lib/channels/channel-integration-template.js +94 -0
  70. package/lib/channels/channel-runtime-resolver.js +43 -3
  71. package/lib/channels/channel-status-display.js +66 -26
  72. package/lib/channels/channel-targets.js +3 -3
  73. package/lib/cli/index.js +27 -3
  74. package/lib/cli/infra-guided.js +5 -1
  75. package/lib/cli/setup-app-external-create.js +111 -0
  76. package/lib/cli/setup-app.help.js +1 -1
  77. package/lib/cli/setup-app.js +38 -125
  78. package/lib/cli/setup-app.test-commands.js +26 -52
  79. package/lib/cli/setup-certification-commands.js +4 -4
  80. package/lib/cli/setup-certification.help.js +9 -9
  81. package/lib/cli/setup-dev.js +7 -2
  82. package/lib/cli/setup-external-system-help.js +4 -6
  83. package/lib/cli/setup-external-system.js +58 -52
  84. package/lib/cli/setup-infra-up-builder-api-action.js +64 -0
  85. package/lib/cli/setup-infra-up-platform-action.js +3 -1
  86. package/lib/cli/setup-infra.js +15 -0
  87. package/lib/cli/setup-list.js +43 -0
  88. package/lib/cli/setup-utility-repair.js +26 -7
  89. package/lib/cli/setup-utility.js +5 -3
  90. package/lib/commands/app.js +15 -43
  91. package/lib/commands/channel-add-setup.js +110 -0
  92. package/lib/commands/channel.js +42 -8
  93. package/lib/commands/datasource-sync-display.js +96 -0
  94. package/lib/commands/datasource-sync-policy.js +210 -0
  95. package/lib/commands/datasource-test-trust-cli.js +6 -6
  96. package/lib/commands/datasource-unified-test-cli.js +2 -1
  97. package/lib/commands/datasource-unified-test-cli.options.js +33 -23
  98. package/lib/commands/deploy-gate-failure-details.js +163 -0
  99. package/lib/commands/deploy-gate-orchestrator.js +322 -0
  100. package/lib/commands/dev-cli-handlers.js +1 -59
  101. package/lib/commands/dev-host-ops-params.js +91 -0
  102. package/lib/commands/dev-host-ops-poll.js +111 -0
  103. package/lib/commands/dev-host-ops.js +107 -94
  104. package/lib/commands/dev-init.js +3 -1
  105. package/lib/commands/enterprise-knowledge.js +284 -0
  106. package/lib/commands/evidence-cli-leaves.js +250 -0
  107. package/lib/commands/evidence.js +51 -0
  108. package/lib/commands/governance-cli-shared.js +2 -2
  109. package/lib/commands/governance-command-action.js +2 -2
  110. package/lib/commands/governance-fixture-subjects.js +85 -0
  111. package/lib/commands/governance.js +1 -1
  112. package/lib/commands/lifecycle-command-action.js +2 -2
  113. package/lib/commands/lifecycle-external.js +3 -3
  114. package/lib/commands/manifest-cli-auth.js +29 -0
  115. package/lib/commands/manifest-cli-commands.js +170 -0
  116. package/lib/commands/manifest-cli-integration-path.js +63 -0
  117. package/lib/commands/manifest.js +21 -0
  118. package/lib/commands/protection-cli-leaves.js +3 -3
  119. package/lib/commands/repair-auth-apply.js +15 -1
  120. package/lib/commands/repair-authentications-454.js +169 -0
  121. package/lib/commands/repair-capability-openapi-warnings.js +126 -0
  122. package/lib/commands/repair-datasource-apply.js +135 -0
  123. package/lib/commands/repair-datasource-auto-rbac.js +62 -1
  124. package/lib/commands/repair-datasource-http-service-contract.js +239 -0
  125. package/lib/commands/repair-datasource-operation-security.js +180 -0
  126. package/lib/commands/repair-datasource-run.js +7 -2
  127. package/lib/commands/repair-datasource-sync-operations.js +177 -0
  128. package/lib/commands/repair-datasource-webhooks-sync-bridge.js +133 -0
  129. package/lib/commands/repair-datasource.js +12 -68
  130. package/lib/commands/repair-env-template.js +11 -1
  131. package/lib/commands/repair-external-run.js +121 -31
  132. package/lib/commands/repair-internal.js +1 -1
  133. package/lib/commands/repair-openapi-export.js +156 -0
  134. package/lib/commands/repair-openapi-sync.js +19 -2
  135. package/lib/commands/repair-orchestration-datasource-split.js +259 -0
  136. package/lib/commands/repair-persist.js +22 -1
  137. package/lib/commands/repair-rbac-platform-preset.js +204 -0
  138. package/lib/commands/repair-rbac-reader-roles.js +191 -0
  139. package/lib/commands/repair-rbac.js +163 -86
  140. package/lib/commands/repair-steps.js +83 -18
  141. package/lib/commands/repair-system-permissions.js +1 -0
  142. package/lib/commands/repair.js +1 -1
  143. package/lib/commands/resource-type.js +65 -26
  144. package/lib/commands/run-post-publish-data-sync.js +68 -0
  145. package/lib/commands/setup-modes.js +1 -1
  146. package/lib/commands/test-e2e-external.js +21 -8
  147. package/lib/commands/test-governance-cli-options.js +2 -2
  148. package/lib/commands/test-trust-cli-options.js +2 -2
  149. package/lib/commands/up-builder-api-bootstrap.js +71 -0
  150. package/lib/commands/up-builder-api-provision.js +241 -0
  151. package/lib/commands/up-builder-api.js +88 -0
  152. package/lib/commands/up-common.js +25 -1
  153. package/lib/commands/upload-credential-push-log.js +117 -0
  154. package/lib/commands/upload-data-sync-finalize.js +60 -0
  155. package/lib/commands/upload-probe.js +66 -0
  156. package/lib/commands/upload-publish-context.js +4 -1
  157. package/lib/commands/upload-sidecar-followups.js +55 -27
  158. package/lib/commands/upload.js +116 -157
  159. package/lib/commands/verify-governance-combined-external.js +1 -1
  160. package/lib/commands/verify-governance-db.js +2 -2
  161. package/lib/commands/verify-operations-command-action.js +2 -2
  162. package/lib/commands/verify-operations-step-plan.js +2 -2
  163. package/lib/commands/verify-operations-steps.js +2 -2
  164. package/lib/commands/verify-trust-command-action.js +1 -1
  165. package/lib/commands/wizard-core.js +1 -1
  166. package/lib/commands/wizard-headless.js +2 -1
  167. package/lib/core/admin-secrets.js +2 -6
  168. package/lib/core/secrets-env-content.js +10 -4
  169. package/lib/core/secrets-env-write.js +2 -13
  170. package/lib/datasource/agent-trust-run.js +3 -3
  171. package/lib/datasource/deploy.js +3 -1
  172. package/lib/datasource/test-e2e.js +6 -1
  173. package/lib/datasource/unified-validation-run-body.js +4 -1
  174. package/lib/datasource/unified-validation-run.js +1 -1
  175. package/lib/deployment/deploy-poll-ui.js +73 -12
  176. package/lib/deployment/deployer-poll-run.js +113 -0
  177. package/lib/deployment/deployer.js +17 -87
  178. package/lib/evidence/dataplane-context.js +21 -0
  179. package/lib/evidence/evidence-display.js +78 -0
  180. package/lib/evidence/evidence-service.js +392 -0
  181. package/lib/external-system/deploy.js +290 -112
  182. package/lib/external-system/download.js +7 -3
  183. package/lib/external-system/test-execution.js +1 -1
  184. package/lib/external-system/test-system-level.js +8 -10
  185. package/lib/external-system/test.js +12 -6
  186. package/lib/generator/deploy-script.js +73 -0
  187. package/lib/generator/external.js +2 -1
  188. package/lib/generator/index.js +17 -2
  189. package/lib/generator/wizard.js +3 -36
  190. package/lib/internal/fs-real-sync.js +22 -1
  191. package/lib/internal/node-fs.js +2 -0
  192. package/lib/lifecycle/lifecycle-governance-options.js +1 -1
  193. package/lib/lifecycle/verify-step-progress.js +1 -1
  194. package/lib/programmatic/access-log.js +26 -0
  195. package/lib/programmatic/auth-config.js +44 -0
  196. package/lib/programmatic/bearer-auth.js +176 -0
  197. package/lib/programmatic/builder-api-request.js +175 -0
  198. package/lib/programmatic/builder-api-route-dispatch.js +82 -0
  199. package/lib/programmatic/builder-api-runtime-config.js +42 -0
  200. package/lib/programmatic/builder-api-server.js +230 -0
  201. package/lib/programmatic/builder-help-authentication-catalog.js +282 -0
  202. package/lib/programmatic/builder-help-connected-system-ui.js +266 -0
  203. package/lib/programmatic/builder-help-enterprise-sync-fabrix.js +60 -0
  204. package/lib/programmatic/builder-help-envelope.js +36 -0
  205. package/lib/programmatic/builder-help-fixtures.js +200 -0
  206. package/lib/programmatic/builder-help-governance.js +172 -0
  207. package/lib/programmatic/builder-help-schema-catalog.js +92 -0
  208. package/lib/programmatic/builder-help.js +361 -0
  209. package/lib/programmatic/capability-registry.js +77 -0
  210. package/lib/programmatic/command-options.js +32 -0
  211. package/lib/programmatic/enterprise-mcp-client.js +98 -0
  212. package/lib/programmatic/http-problem-details.js +99 -0
  213. package/lib/programmatic/http-route-match.js +40 -0
  214. package/lib/programmatic/idempotency-cache.js +69 -0
  215. package/lib/programmatic/index.js +53 -0
  216. package/lib/programmatic/integration-path-scope.js +39 -0
  217. package/lib/programmatic/log-redaction.js +66 -0
  218. package/lib/programmatic/manifest-get-section.js +146 -0
  219. package/lib/programmatic/manifest-patch-section.js +252 -0
  220. package/lib/programmatic/manifest-repair.js +122 -0
  221. package/lib/programmatic/manifest-section-dependency-graph.js +160 -0
  222. package/lib/programmatic/manifest-section-io.js +225 -0
  223. package/lib/programmatic/manifest-section-quality.js +171 -0
  224. package/lib/programmatic/manifest-section-registry-data.js +269 -0
  225. package/lib/programmatic/manifest-section-registry.js +205 -0
  226. package/lib/programmatic/nest-http-bridge.js +34 -0
  227. package/lib/programmatic/openapi-component-schemas.js +68 -0
  228. package/lib/programmatic/openapi-description-enricher.js +117 -0
  229. package/lib/programmatic/openapi-descriptions.js +190 -0
  230. package/lib/programmatic/openapi-docs-serving.js +123 -0
  231. package/lib/programmatic/openapi-help-schemas.js +63 -0
  232. package/lib/programmatic/openapi-manifest-schemas.js +141 -0
  233. package/lib/programmatic/openapi-operation-bindings.js +274 -0
  234. package/lib/programmatic/openapi-request-schemas.js +155 -0
  235. package/lib/programmatic/openapi-result-schemas.js +476 -0
  236. package/lib/programmatic/openapi-schema-descriptions-certify.js +139 -0
  237. package/lib/programmatic/openapi-schema-descriptions-core.js +159 -0
  238. package/lib/programmatic/openapi-schema-descriptions-help.js +40 -0
  239. package/lib/programmatic/openapi-schema-descriptions-manifest.js +143 -0
  240. package/lib/programmatic/openapi-schema-descriptions-mcp.js +118 -0
  241. package/lib/programmatic/openapi-schema-descriptions-operations.js +281 -0
  242. package/lib/programmatic/openapi-schema-helpers.js +93 -0
  243. package/lib/programmatic/openapi-spec.js +203 -0
  244. package/lib/programmatic/orchestration-openapi-meta.js +159 -0
  245. package/lib/programmatic/platform-rbac-catalog.js +90 -0
  246. package/lib/programmatic/request-timeout.js +53 -0
  247. package/lib/programmatic/route-handler-map.js +143 -0
  248. package/lib/programmatic/route-handlers-context.js +29 -0
  249. package/lib/programmatic/route-handlers.js +33 -0
  250. package/lib/programmatic/run-certify.js +57 -0
  251. package/lib/programmatic/run-enterprise-mcp.js +32 -0
  252. package/lib/programmatic/run-lifecycle.js +29 -0
  253. package/lib/programmatic/run-repair.js +41 -0
  254. package/lib/programmatic/run-repository-emcp.js +54 -0
  255. package/lib/programmatic/run-template-workspace.js +61 -0
  256. package/lib/programmatic/run-test.js +49 -0
  257. package/lib/programmatic/run-upload.js +63 -0
  258. package/lib/programmatic/run-validate.js +53 -0
  259. package/lib/programmatic/run-wizard.js +40 -0
  260. package/lib/programmatic/system-key.js +48 -0
  261. package/lib/programmatic/wizard-config-normalize.js +118 -0
  262. package/lib/programmatic/workspace-cleanup.js +128 -0
  263. package/lib/programmatic/workspace-context.js +145 -0
  264. package/lib/programmatic/workspace-lock.js +75 -0
  265. package/lib/programmatic/workspace-meta.js +64 -0
  266. package/lib/programmatic/workspace-ops.js +149 -0
  267. package/lib/protection/run-commands-upload-sync.js +35 -0
  268. package/lib/protection/run-commands.js +2 -20
  269. package/lib/protection/upload-batch.js +11 -7
  270. package/lib/resolvers/resource-type-file.js +22 -0
  271. package/lib/schema/external-datasource.schema.json +161 -1
  272. package/lib/schema/external-system.schema.json +244 -118
  273. package/lib/schema/flag-map-validation-run.json +3 -0
  274. package/lib/schema/type/credential-field-registry.json +2 -2
  275. package/lib/schema/type/document-storage.json +9 -0
  276. package/lib/utils/agent-trust-run-display.js +1 -1
  277. package/lib/utils/app-path-resolve.js +168 -0
  278. package/lib/utils/authentication-env-template.js +222 -0
  279. package/lib/utils/cli-sync-options.js +7 -11
  280. package/lib/utils/cli-utils.js +4 -0
  281. package/lib/utils/cli-workspace-options.js +29 -0
  282. package/lib/utils/compose-generate-docker-compose.js +102 -0
  283. package/lib/utils/configuration-env-resolver.js +203 -27
  284. package/lib/utils/datasource-test-run-certificate-tty.js +28 -2
  285. package/lib/utils/datasource-test-run-certification-debug.js +130 -0
  286. package/lib/utils/datasource-test-run-debug-display.js +2 -0
  287. package/lib/utils/datasource-test-run-debug-slice.js +7 -0
  288. package/lib/utils/datasource-test-run-display.js +2 -1
  289. package/lib/utils/dev-init-ssh-merge.js +165 -23
  290. package/lib/utils/dev-pin-share-instructions.js +110 -0
  291. package/lib/utils/dev-ssh-config-helper.js +177 -33
  292. package/lib/utils/enterprise-knowledge-paths.js +142 -0
  293. package/lib/utils/env-copy.js +2 -1
  294. package/lib/utils/env-dotenv-format.js +103 -0
  295. package/lib/utils/external-env-template.js +4 -1
  296. package/lib/utils/external-system-display.js +5 -1
  297. package/lib/utils/external-system-readiness-compact-blocks.js +221 -0
  298. package/lib/utils/external-system-readiness-compact-display.js +324 -0
  299. package/lib/utils/external-system-readiness-core.js +16 -0
  300. package/lib/utils/external-system-readiness-deploy-display.js +29 -11
  301. package/lib/utils/external-system-readiness-display-internals.js +3 -1
  302. package/lib/utils/external-system-readiness-display.js +20 -30
  303. package/lib/utils/external-system-system-test-tty-certification.js +135 -0
  304. package/lib/utils/external-system-system-test-tty.js +5 -41
  305. package/lib/utils/help-builder.js +6 -1
  306. package/lib/utils/host-ops-job-labels.js +236 -0
  307. package/lib/utils/host-ops-job-result.js +61 -0
  308. package/lib/utils/host-ops-poll-ui.js +163 -0
  309. package/lib/utils/integration-path-resolve.js +112 -0
  310. package/lib/utils/paths-reload-source.js +148 -0
  311. package/lib/utils/paths-system-builder-keys.js +25 -0
  312. package/lib/utils/paths.js +151 -26
  313. package/lib/utils/runtime-configuration-values.js +64 -2
  314. package/lib/utils/secrets-helpers.js +5 -1
  315. package/lib/utils/ssh-known-hosts.js +130 -0
  316. package/lib/utils/test-target-cli-options.js +75 -0
  317. package/lib/utils/upload-sync-options.js +4 -0
  318. package/lib/utils/validation-run-request.js +11 -2
  319. package/lib/validation/external-manifest-validator.js +11 -1
  320. package/lib/validation/openapi-contract-surface-validator.js +426 -0
  321. package/lib/validation/openapi-contract-vendor-validation.js +238 -0
  322. package/lib/validation/validate-external-file.js +160 -0
  323. package/lib/validation/validate.js +6 -117
  324. package/package.json +46 -29
  325. package/packages/builder-api/README.md +120 -0
  326. package/packages/builder-api/package.json +30 -0
  327. package/packages/builder-api/src/app.module.ts +7 -0
  328. package/packages/builder-api/src/auth/auth.module.ts +5 -0
  329. package/packages/builder-api/src/external-system/external-system.module.ts +5 -0
  330. package/packages/builder-api/src/main.ts +16 -0
  331. package/packages/builder-api/tsconfig.json +15 -0
  332. package/scripts/check-builder-api-architecture-grep.js +79 -0
  333. package/scripts/docker_image_content_gate.js +47 -0
  334. package/scripts/docker_image_content_gate.sh +5 -0
  335. package/scripts/export-builder-api-evidence.js +262 -0
  336. package/scripts/lib/builder-api-docker-staging-copy.js +60 -0
  337. package/scripts/lib/builder-api-docker-staging-core.js +183 -0
  338. package/scripts/lib/docker-image-content-gate-core.js +166 -0
  339. package/scripts/lib/plan-actor.js +109 -0
  340. package/scripts/lib/plan-config.js +20 -0
  341. package/scripts/lib/plan-gates.js +154 -0
  342. package/scripts/lib/plan-meta.js +104 -0
  343. package/scripts/lib/plan-parse.js +162 -0
  344. package/scripts/lib/plan-prevalidate-gates.js +326 -0
  345. package/scripts/lib/plan-run-core.js +125 -0
  346. package/scripts/lib/plan-run-report.js +108 -0
  347. package/scripts/plan-approve.js +24 -0
  348. package/scripts/plan-archive.js +49 -0
  349. package/scripts/plan-run.js +13 -0
  350. package/scripts/plan-set-actor.js +21 -0
  351. package/scripts/plan-validate.js +80 -0
  352. package/scripts/pnpm/af.mjs +110 -0
  353. package/scripts/pnpm/check-quiet.mjs +32 -0
  354. package/scripts/pnpm/dev-install.mjs +29 -0
  355. package/scripts/pnpm/dev-reload.mjs +18 -0
  356. package/scripts/pnpm/help.mjs +55 -0
  357. package/scripts/pnpm/lib/dev-reload-core.mjs +189 -0
  358. package/scripts/pnpm/lib/dev-reload-log-capture.mjs +67 -0
  359. package/scripts/pnpm/lib/dev-reload-log-utils.mjs +32 -0
  360. package/scripts/pnpm/lib/resolve-aifabrix-bin.mjs +124 -0
  361. package/scripts/pnpm/lib/resolve-app-url.mjs +183 -0
  362. package/scripts/pnpm/lib/spinner.mjs +42 -0
  363. package/scripts/stage_builder_api_for_docker.js +65 -0
  364. package/scripts/sync-builder-api-template.js +44 -0
  365. package/templates/README.md +3 -0
  366. package/templates/applications/builder-api/Dockerfile +38 -0
  367. package/templates/applications/builder-api/application.yaml +75 -0
  368. package/templates/applications/builder-api/env.template +48 -0
  369. package/templates/applications/dataplane/application.yaml +1 -1
  370. package/templates/applications/dataplane/env.template +10 -6
  371. package/templates/applications/dataplane/rbac.yaml +21 -1
  372. package/templates/applications/miso-controller/application.yaml +1 -1
  373. package/templates/applications/miso-controller/env.template +1 -3
  374. package/templates/channels/README.md +18 -0
  375. package/templates/channels/ai-fabrix-icon.jpg +0 -0
  376. package/templates/channels/chatgpt/install.template.md.hbs +21 -24
  377. package/templates/channels/chatgpt/integration/README.md +11 -0
  378. package/templates/channels/chatgpt/integration/application.json +15 -0
  379. package/templates/channels/chatgpt/integration/chatgpt-system.json +29 -0
  380. package/templates/channels/chatgpt/integration/env.template +4 -0
  381. package/templates/channels/microsoft-copilot/install.template.md.hbs +20 -25
  382. package/templates/channels/microsoft-copilot/integration/README.md +11 -0
  383. package/templates/channels/microsoft-copilot/integration/application.json +15 -0
  384. package/templates/channels/microsoft-copilot/integration/env.template +6 -0
  385. package/templates/channels/microsoft-copilot/integration/microsoft-copilot-system.json +34 -0
  386. package/templates/channels/slack/install.template.md.hbs +48 -18
  387. package/templates/channels/slack/integration/README.md +38 -0
  388. package/templates/channels/slack/integration/application.json +18 -0
  389. package/templates/channels/slack/integration/env.template +29 -0
  390. package/templates/channels/slack/integration/slack-datasource-conversations.json +226 -0
  391. package/templates/channels/slack/integration/slack-datasource-messages.json +269 -0
  392. package/templates/channels/slack/integration/slack-system.json +86 -0
  393. package/templates/channels/slack/manifest.template.json.hbs +20 -10
  394. package/templates/channels/teams-bot/install.template.md.hbs +31 -17
  395. package/templates/channels/teams-bot/integration/README.md +18 -0
  396. package/templates/channels/teams-bot/integration/application.json +17 -0
  397. package/templates/channels/teams-bot/integration/env.template +5 -0
  398. package/templates/channels/teams-bot/integration/teams-bot-system.json +55 -0
  399. package/templates/channels/teams-bot/manifest.template.json.hbs +27 -0
  400. package/templates/channels/web-embed/install.template.md.hbs +16 -26
  401. package/templates/channels/web-embed/integration/README.md +11 -0
  402. package/templates/channels/web-embed/integration/application.json +15 -0
  403. package/templates/channels/web-embed/integration/env.template +4 -0
  404. package/templates/channels/web-embed/integration/web-embed-system.json +29 -0
  405. package/templates/openapi/redoc_page.html +86 -0
  406. package/templates/python/docker-compose.hbs +11 -0
  407. package/templates/python/requirements.txt +1 -1
  408. package/templates/typescript/docker-compose.hbs +11 -0
  409. package/lib/certification/cli-cert-sync-skip.js +0 -21
@@ -0,0 +1,142 @@
1
+ /**
2
+ * Enterprise Knowledge workspace path helpers (456.5).
3
+ *
4
+ * @fileoverview Paths under enterprise-knowledge/ for Enterprise Knowledge anchors
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const path = require('path');
12
+ const os = require('os');
13
+ const { nodeFs } = require('../internal/node-fs');
14
+
15
+ const WORKSPACE_ENTERPRISE_KNOWLEDGE = 'enterprise-knowledge';
16
+ const SYSTEM_KIND_ENTERPRISE_KNOWLEDGE = 'enterpriseKnowledge';
17
+
18
+ /**
19
+ * Materialization parent without importing paths.js (avoids circular deps in tests).
20
+ * @returns {string}
21
+ */
22
+ function getMaterializationParent() {
23
+ const work = process.env.AIFABRIX_WORK;
24
+ if (work && typeof work === 'string' && work.trim()) {
25
+ return path.resolve(work.trim());
26
+ }
27
+ if (process.env.AIFABRIX_HOME && typeof process.env.AIFABRIX_HOME === 'string') {
28
+ return path.resolve(process.env.AIFABRIX_HOME.trim());
29
+ }
30
+ return path.join(os.homedir(), '.aifabrix');
31
+ }
32
+
33
+ /**
34
+ * Absolute enterprise-knowledge/ next to process.cwd when present.
35
+ * @returns {string|null}
36
+ */
37
+ function getCwdEnterpriseKnowledgeRoot() {
38
+ const p = path.join(path.resolve(process.cwd()), WORKSPACE_ENTERPRISE_KNOWLEDGE);
39
+ try {
40
+ const disk = nodeFs();
41
+ if (disk.existsSync(p)) {
42
+ const st = disk.statSync(p);
43
+ if (st && typeof st.isDirectory === 'function' && st.isDirectory()) {
44
+ return p;
45
+ }
46
+ }
47
+ } catch {
48
+ // ignore
49
+ }
50
+ return null;
51
+ }
52
+
53
+ /**
54
+ * Default enterprise-knowledge root under materialization parent.
55
+ * @returns {string}
56
+ */
57
+ function getEnterpriseKnowledgeRoot() {
58
+ const cwdRoot = getCwdEnterpriseKnowledgeRoot();
59
+ if (cwdRoot) {
60
+ return cwdRoot;
61
+ }
62
+ return path.join(getMaterializationParent(), WORKSPACE_ENTERPRISE_KNOWLEDGE);
63
+ }
64
+
65
+ /**
66
+ * Resolves enterprise-knowledge/<anchorKey> (cwd-first, then materialization parent).
67
+ * @param {string} anchorKey - Enterprise Knowledge anchor key
68
+ * @returns {string}
69
+ */
70
+ function getEnterpriseKnowledgePath(anchorKey) {
71
+ if (!anchorKey || typeof anchorKey !== 'string') {
72
+ throw new Error('Anchor key is required and must be a string');
73
+ }
74
+ const cwdHit = path.join(path.resolve(process.cwd()), WORKSPACE_ENTERPRISE_KNOWLEDGE, anchorKey);
75
+ try {
76
+ const disk = nodeFs();
77
+ if (disk.existsSync(cwdHit)) {
78
+ const st = disk.statSync(cwdHit);
79
+ if (st && typeof st.isDirectory === 'function' && st.isDirectory()) {
80
+ return cwdHit;
81
+ }
82
+ }
83
+ } catch {
84
+ // ignore
85
+ }
86
+ return path.join(getMaterializationParent(), WORKSPACE_ENTERPRISE_KNOWLEDGE, anchorKey);
87
+ }
88
+
89
+ function isEnterpriseKnowledgeDirectory(disk, fullPath) {
90
+ try {
91
+ const child = disk.statSync(fullPath);
92
+ return Boolean(child && typeof child.isDirectory === 'function' && child.isDirectory());
93
+ } catch {
94
+ return false;
95
+ }
96
+ }
97
+
98
+ function collectAnchorNamesInRoot(disk, root, names) {
99
+ if (!root || !disk.existsSync(root) || !isEnterpriseKnowledgeDirectory(disk, root)) {
100
+ return;
101
+ }
102
+ let entries;
103
+ try {
104
+ entries = disk.readdirSync(root);
105
+ } catch {
106
+ return;
107
+ }
108
+ for (const name of entries) {
109
+ const full = path.join(root, name);
110
+ if (isEnterpriseKnowledgeDirectory(disk, full)) {
111
+ names.add(name);
112
+ }
113
+ }
114
+ }
115
+
116
+ /**
117
+ * Lists anchor folder names under enterprise-knowledge/.
118
+ * @returns {string[]}
119
+ */
120
+ function listEnterpriseKnowledgeAnchors() {
121
+ const disk = nodeFs();
122
+ const names = new Set();
123
+ const roots = new Set();
124
+ const cwdRoot = getCwdEnterpriseKnowledgeRoot();
125
+ if (cwdRoot) {
126
+ roots.add(path.resolve(cwdRoot));
127
+ }
128
+ roots.add(path.resolve(path.join(getMaterializationParent(), WORKSPACE_ENTERPRISE_KNOWLEDGE)));
129
+ for (const root of roots) {
130
+ collectAnchorNamesInRoot(disk, root, names);
131
+ }
132
+ return [...names].sort();
133
+ }
134
+
135
+ module.exports = {
136
+ WORKSPACE_ENTERPRISE_KNOWLEDGE,
137
+ SYSTEM_KIND_ENTERPRISE_KNOWLEDGE,
138
+ getCwdEnterpriseKnowledgeRoot,
139
+ getEnterpriseKnowledgeRoot,
140
+ getEnterpriseKnowledgePath,
141
+ listEnterpriseKnowledgeAnchors
142
+ };
@@ -123,7 +123,8 @@ async function writeEnvOutputForReload(outputPath, runEnvPath, appName) {
123
123
  } else {
124
124
  baseContent = runContent;
125
125
  }
126
- const toWrite = mergeEnvMapIntoContent(baseContent, runMap, { appendMissingFromNewMap: false });
126
+ let toWrite = mergeEnvMapIntoContent(baseContent, runMap, { appendMissingFromNewMap: false });
127
+ toWrite = substituteMntDataForLocal(toWrite, outputPath);
127
128
  await fsp.writeFile(outputPath, toWrite, { mode: 0o600 });
128
129
  logger.log(
129
130
  formatSuccessLine(
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Dotenv serialization for values that may contain PEM or other multiline secrets.
3
+ * Docker Compose env_file and Builder .env.run require single-line KEY=value rows.
4
+ *
5
+ * @fileoverview Shared dotenv quoting/escaping for resolve, run, and admin env writers
6
+ * @author AI Fabrix Team
7
+ * @version 1.0.0
8
+ */
9
+
10
+ 'use strict';
11
+
12
+ /**
13
+ * Whether a dotenv value should be double-quoted (spaces, #, =, commas, or multiline).
14
+ * @param {string} value
15
+ * @returns {boolean}
16
+ */
17
+ function valueNeedsDotenvQuoting(value) {
18
+ const s = String(value ?? '');
19
+ return /[\r\n]/.test(s) || /[,\s#=]/.test(s) || s !== s.trim();
20
+ }
21
+
22
+ /**
23
+ * Escape a logical string for placement inside double quotes in a .env file.
24
+ * @param {string} value
25
+ * @returns {string}
26
+ */
27
+ function escapeDotenvQuotedInner(value) {
28
+ return String(value ?? '')
29
+ .replace(/\r\n/g, '\n')
30
+ .replace(/\r/g, '\n')
31
+ .replace(/\\/g, '\\\\')
32
+ .replace(/"/g, '\\"')
33
+ .replace(/\n/g, '\\n');
34
+ }
35
+
36
+ /**
37
+ * Format the value portion of KEY=value (includes quotes when needed).
38
+ * Never emits raw newline characters.
39
+ *
40
+ * @param {string} value - Logical value (may contain real newlines)
41
+ * @returns {string}
42
+ */
43
+ function formatDotenvValuePart(value) {
44
+ const logical = String(value ?? '');
45
+ if (!valueNeedsDotenvQuoting(logical)) {
46
+ return logical;
47
+ }
48
+ return `"${escapeDotenvQuotedInner(logical)}"`;
49
+ }
50
+
51
+ /**
52
+ * Format a full KEY=value line without trailing newline.
53
+ * @param {string} key
54
+ * @param {string} value
55
+ * @returns {string}
56
+ */
57
+ function formatDotenvLine(key, value) {
58
+ return `${key}=${formatDotenvValuePart(value)}`;
59
+ }
60
+
61
+ /**
62
+ * Normalize kv:// substitution values so multiline PEM never splits .env rows.
63
+ * @param {string} value
64
+ * @returns {string}
65
+ */
66
+ function formatDotenvSubstitutionValue(value) {
67
+ const s = String(value ?? '');
68
+ if (/[\r\n]/.test(s)) {
69
+ return formatDotenvValuePart(s);
70
+ }
71
+ if (/\\n/.test(s) && /-----BEGIN [A-Z ]+-----/.test(s)) {
72
+ return formatDotenvValuePart(s.replace(/\\n/g, '\n'));
73
+ }
74
+ return s;
75
+ }
76
+
77
+ /**
78
+ * Parse a raw value segment from KEY=value (after first '=').
79
+ * @param {string} raw
80
+ * @returns {string}
81
+ */
82
+ function parseDotenvRawValue(raw) {
83
+ let value = raw ?? '';
84
+ if (value.length >= 2 && value.startsWith('"') && value.endsWith('"')) {
85
+ value = value
86
+ .slice(1, -1)
87
+ .replace(/\\n/g, '\n')
88
+ .replace(/\\"/g, '"')
89
+ .replace(/\\\\/g, '\\');
90
+ } else if (value.length >= 2 && value.startsWith('\'') && value.endsWith('\'')) {
91
+ value = value.slice(1, -1);
92
+ }
93
+ return value;
94
+ }
95
+
96
+ module.exports = {
97
+ valueNeedsDotenvQuoting,
98
+ escapeDotenvQuotedInner,
99
+ formatDotenvValuePart,
100
+ formatDotenvLine,
101
+ formatDotenvSubstitutionValue,
102
+ parseDotenvRawValue
103
+ };
@@ -14,6 +14,7 @@ const fs = require('fs');
14
14
  const Handlebars = require('handlebars');
15
15
  const { systemKeyToKvPrefix, kvEnvKeyToPath, securityKeyToVar } = require('./credential-secrets-env');
16
16
  const { getAuthCredentialTemplate } = require('./authentication-shape');
17
+ const { buildAuthSecureVarsFromAllSlots } = require('./authentication-env-template');
17
18
 
18
19
  /**
19
20
  * Builds hint string from portalInput (options → enum, validation → min-max or pattern).
@@ -154,7 +155,9 @@ function buildExternalEnvTemplateContext(system) {
154
155
  'apikey'
155
156
  ).toLowerCase();
156
157
  }
157
- const authSecureVars = buildAuthSecureVarsFromSystem(system);
158
+ const slotSecureVars = buildAuthSecureVarsFromAllSlots(system);
159
+ const authSecureVars =
160
+ slotSecureVars.length > 0 ? slotSecureVars : buildAuthSecureVarsFromSystem(system);
158
161
  const authVars =
159
162
  (credential?.variables && typeof credential.variables === 'object' ? credential.variables : null) ||
160
163
  (authBlock?.variables && typeof authBlock.variables === 'object' ? authBlock.variables : {});
@@ -273,7 +273,11 @@ function displayServerDatasourceTestRunResults(results, verbose, opts = {}) {
273
273
  // Plan §17: system-level overview for multi-datasource results (no full §16 dump per datasource by default).
274
274
  // Keep legacy per-datasource full envelope available only via datasource commands.
275
275
  if (integrationResultsHaveEnvelope(results)) {
276
- displaySystemAggregateDatasourceTestRuns(results, { runType, verbose: Boolean(verbose) });
276
+ displaySystemAggregateDatasourceTestRuns(results, {
277
+ runType,
278
+ verbose: Boolean(verbose),
279
+ debug: opts.debug
280
+ });
277
281
  return;
278
282
  }
279
283
 
@@ -0,0 +1,221 @@
1
+ /**
2
+ * Compact card section loggers (plan 156.0).
3
+ *
4
+ * @fileoverview Internal blocks for upload/deploy compact summaries
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const chalk = require('chalk');
12
+ const logger = require('./logger');
13
+ const { formatSuccessLine, formatBlockingError } = require('./cli-test-layout-chalk');
14
+ const { summarizeDatasourceTiersA } = require('./external-system-readiness-core');
15
+ const {
16
+ PILLAR_LABELS,
17
+ formatAuthenticationSummary,
18
+ formatDatasourceAggregateLine,
19
+ formatCredentialPushLine,
20
+ formatConfigResolveLine,
21
+ formatGatePillarLine,
22
+ formatPreflightLine,
23
+ formatRuntimeDatasourceIssues,
24
+ buildProbeCompactContext,
25
+ resolveConnectedSystemStatus,
26
+ resolveManifestAuthMethod,
27
+ logCompactHeader,
28
+ logCompactPortalLinks,
29
+ logCompactTip
30
+ } = require('./external-system-readiness-compact-display');
31
+
32
+ /**
33
+ * @param {Object|null|undefined} credentialPush
34
+ * @param {Object|null|undefined} configPush
35
+ */
36
+ function logCompactPushLines(credentialPush, configPush) {
37
+ const credLine = formatCredentialPushLine(credentialPush || {});
38
+ if (credLine) logger.log(` ${credLine}`);
39
+ const cfgLine = formatConfigResolveLine({
40
+ count: configPush?.pushed || configPush?.count,
41
+ names: configPush?.names
42
+ });
43
+ if (cfgLine) logger.log(` ${cfgLine}`);
44
+ }
45
+
46
+ /**
47
+ * @param {Object|null|undefined} probeData
48
+ */
49
+ function logCompactProbeSection(probeData) {
50
+ const probeCtx = buildProbeCompactContext({ probeData });
51
+ if (!probeCtx) return;
52
+ logger.log('');
53
+ const conn = probeCtx.connectivityPassed ? 'passed' : 'failed';
54
+ logger.log(` Runtime: ${probeCtx.runtimeVerdict} Connectivity: ${conn}`);
55
+ logger.log(
56
+ ` Runtime datasources: ${probeCtx.summary.ready} ready · ${probeCtx.summary.partial} partial · ${probeCtx.summary.failed} failed`
57
+ );
58
+ const issueLines = formatRuntimeDatasourceIssues({
59
+ issues: probeCtx.summary.issues.map(i => ({
60
+ key: i.key,
61
+ lines: i.lines,
62
+ tier: probeCtx.summary.rows.find(r => r.key === i.key)?.tier === 'failed' ? 'Failed' : 'Partial'
63
+ }))
64
+ });
65
+ for (const line of issueLines) {
66
+ logger.log(chalk.yellow(` ${line}`));
67
+ }
68
+ }
69
+
70
+ /**
71
+ * @param {Object} ctx
72
+ */
73
+ function logUploadReadinessSummaryCompact(ctx) {
74
+ const { systemKey, environment, dataplaneUrl, publication, manifest, forcePublish, probeData } = ctx;
75
+ const genMcp = publication?.generateMcpContract !== false;
76
+ const tierA = summarizeDatasourceTiersA(publication?.datasources || [], genMcp);
77
+ const systemCfg = manifest?.system || {};
78
+ const statusLabel = resolveConnectedSystemStatus({ publication });
79
+
80
+ logCompactHeader({ command: 'upload', systemKey, environment, dataplaneUrl });
81
+ if (forcePublish) {
82
+ logger.log(
83
+ chalk.yellow(
84
+ ' Warning: --force bypasses active-datasource schema replacement guards on publish.'
85
+ )
86
+ );
87
+ }
88
+ logCompactPushLines(ctx.credentialPush, ctx.configPush);
89
+ logger.log('');
90
+ let statusPart = `Status: ${statusLabel}`;
91
+ statusPart += ` ${formatAuthenticationSummary({ method: resolveManifestAuthMethod(systemCfg) })}`;
92
+ statusPart += ` ${formatDatasourceAggregateLine({
93
+ ready: tierA.ready,
94
+ partial: tierA.partial,
95
+ failed: tierA.failed,
96
+ mcp: genMcp
97
+ })}`;
98
+ if (forcePublish) statusPart += ' Publish mode: forced';
99
+ logger.log(` ${statusPart}`);
100
+ logCompactProbeSection(probeData);
101
+ logger.log('');
102
+ logCompactPortalLinks({ dataplaneUrl, systemKey });
103
+ logger.log('');
104
+ logCompactTip({ systemKey, command: 'upload', probed: !!probeData });
105
+ }
106
+
107
+ /**
108
+ * @param {Array<Object>|undefined} dsFromCtx
109
+ * @param {Object} manifest
110
+ * @returns {Object[]}
111
+ */
112
+ function resolveDeployCompactDatasources(dsFromCtx, manifest) {
113
+ if (Array.isArray(dsFromCtx) && dsFromCtx.length > 0) return dsFromCtx;
114
+ return (manifest.dataSources || []).map(d => ({
115
+ key: d.key,
116
+ status: d.status || 'published',
117
+ isActive: d.isActive !== false,
118
+ mcpContract: d.mcpContract
119
+ }));
120
+ }
121
+
122
+ /**
123
+ * @param {Object} ctx
124
+ */
125
+ function logDeployCompactPreflightAndGates(ctx) {
126
+ logger.log(` ${formatSuccessLine('Local validation')}`);
127
+ const preflight = ctx.gateOutcomes?.baseline;
128
+ if (preflight) {
129
+ const pf = formatPreflightLine(preflight);
130
+ if (pf) logger.log(` ${pf}`);
131
+ } else {
132
+ logger.log(` ${formatSuccessLine('Preflight: unit + integration')}`);
133
+ }
134
+ for (const gate of ctx.gateOutcomes?.gates || []) {
135
+ if (gate.failedDetail) {
136
+ logger.log(
137
+ ` ${formatBlockingError(`${PILLAR_LABELS[gate.pillar] || gate.pillar} · FAILED — ${gate.failedDetail}`)}`
138
+ );
139
+ } else {
140
+ logger.log(` ${formatGatePillarLine(gate)}`);
141
+ }
142
+ }
143
+ }
144
+
145
+ /**
146
+ * @param {Object} ctx
147
+ */
148
+ function logDeployCompactDeploymentSteps(ctx) {
149
+ logCompactPushLines(ctx.credentialPush, ctx.configPush);
150
+ if (!ctx.fetchError) {
151
+ logger.log(` ${formatSuccessLine('Dataplane validation')}`);
152
+ }
153
+ if (ctx.deploymentOk) {
154
+ const draftPart = ctx.draftDeploymentId
155
+ ? ` · Draft ID: ${String(ctx.draftDeploymentId).slice(0, 12)}…`
156
+ : '';
157
+ logger.log(` ${formatSuccessLine(`Controller deploy · polled · completed${draftPart}`)}`);
158
+ return;
159
+ }
160
+ logger.log(` ${formatBlockingError('Controller deploy failed')}`);
161
+ if (ctx.deploymentDetail?.error) {
162
+ logger.log(chalk.red(` Error: ${ctx.deploymentDetail.error}`));
163
+ }
164
+ }
165
+
166
+ /**
167
+ * @param {Object} ctx
168
+ * @param {Object} systemCfg
169
+ * @param {Object} tierA
170
+ * @param {boolean} genMcp
171
+ * @param {string} statusLabel
172
+ */
173
+ function logDeployCompactStatusRow(ctx, systemCfg, tierA, genMcp, statusLabel) {
174
+ const aggregate = formatDatasourceAggregateLine({
175
+ ready: tierA.ready,
176
+ partial: tierA.partial,
177
+ failed: tierA.failed,
178
+ mcp: genMcp
179
+ });
180
+ const auth = formatAuthenticationSummary({ method: resolveManifestAuthMethod(systemCfg) });
181
+ const isDraftAfterDeploy =
182
+ ctx.deploymentOk && String(ctx.systemFromDataplane?.status || '').toLowerCase() === 'draft';
183
+ if (isDraftAfterDeploy) {
184
+ logger.log(` ${formatBlockingError('Status: Draft (expected Published after deploy)')}`);
185
+ logger.log(` ${auth} ${aggregate}`);
186
+ return;
187
+ }
188
+ if (ctx.fetchError) {
189
+ logger.log(chalk.yellow(` Unable to fetch system status: ${ctx.fetchError.message}`));
190
+ return;
191
+ }
192
+ logger.log(` Status: ${statusLabel} ${auth} ${aggregate}`);
193
+ }
194
+
195
+ /**
196
+ * @param {Object} ctx
197
+ */
198
+ function logDeployReadinessSummaryCompact(ctx) {
199
+ const systemKey = ctx.manifest.key;
200
+ const systemCfg = ctx.manifest.system || {};
201
+ const genMcp = systemCfg.generateMcpContract !== false;
202
+ const datasources = resolveDeployCompactDatasources(ctx.datasources, ctx.manifest);
203
+ const tierA = summarizeDatasourceTiersA(datasources, genMcp);
204
+ const statusLabel = resolveConnectedSystemStatus({ systemFromDataplane: ctx.systemFromDataplane });
205
+
206
+ logCompactHeader({ command: 'deploy', systemKey, environment: ctx.environment, dataplaneUrl: ctx.dataplaneUrl });
207
+ logDeployCompactPreflightAndGates(ctx);
208
+ logDeployCompactDeploymentSteps(ctx);
209
+ logger.log('');
210
+ logDeployCompactStatusRow(ctx, systemCfg, tierA, genMcp, statusLabel);
211
+ logCompactProbeSection(ctx.probeData);
212
+ logger.log('');
213
+ logCompactPortalLinks({ dataplaneUrl: ctx.dataplaneUrl, systemKey });
214
+ logger.log('');
215
+ logCompactTip({ systemKey, command: 'deploy', probed: !!ctx.probeData });
216
+ }
217
+
218
+ module.exports = {
219
+ logUploadReadinessSummaryCompact,
220
+ logDeployReadinessSummaryCompact
221
+ };