@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
package/lib/app/show.js CHANGED
@@ -20,16 +20,12 @@ const generator = require('../generator');
20
20
  const { getConfig, normalizeControllerUrl } = require('../core/config');
21
21
  const { getOrRefreshDeviceToken } = require('../utils/token-manager');
22
22
  const { resolveControllerUrl } = require('../utils/controller-url');
23
- const { resolveEnvironment } = require('../core/config');
24
- const { getApplication } = require('../api/applications.api');
25
23
  const {
26
24
  getExternalSystem,
27
25
  getExternalSystemConfig,
28
26
  listOpenAPIFiles,
29
27
  listOpenAPIEndpoints
30
28
  } = require('../api/external-systems.api');
31
- const { resolveDataplaneUrl } = require('../utils/dataplane-resolver');
32
- const { formatApiError } = require('../utils/api-error-handler');
33
29
  const { formatAuthenticationError } = require('../utils/error-formatters/http-status-errors');
34
30
  const { display: displayShow } = require('./show-display');
35
31
  const {
@@ -790,31 +786,27 @@ async function runOffline(appKey, json, permissionsOnly, verifyCert = false) {
790
786
  displayShow(summary, { permissionsOnly: !!permissionsOnly });
791
787
  }
792
788
 
793
- async function resolveOnlineAuth(controllerUrl) {
794
- const config = await getConfig();
795
- const authResult = await getShowAuthToken(controllerUrl, config);
796
- return { authConfig: { type: 'bearer', token: authResult.token }, authResult };
797
- }
798
-
799
- function ensureApplicationResponse(response, appKey, authResult) {
800
- if (!response.success) {
801
- if (response.status === 404) {
802
- throw new Error(`Application "${appKey}" not found on controller.`);
803
- }
804
- const formatted = response.formattedError || formatApiError(response, authResult.actualControllerUrl);
805
- logger.error(formatted);
806
- throw new Error('Failed to get application from controller.');
789
+ async function showApp(appKey, options = {}) {
790
+ if (!appKey || typeof appKey !== 'string') {
791
+ throw new Error('appKey is required');
807
792
  }
808
- return response.data || response;
809
- }
810
793
 
811
- async function fetchExternalSystemForOnline(controllerUrl, appKey, authConfig) {
812
- try {
813
- const environment = await resolveEnvironment();
814
- const dataplaneUrl = await resolveDataplaneUrl(controllerUrl, environment, authConfig);
815
- return await fetchExternalSystemFromDataplane(dataplaneUrl, appKey, authConfig);
816
- } catch (err) {
817
- return { error: err.message || 'dataplane unreachable or not found' };
794
+ const online = Boolean(options.online);
795
+ const json = Boolean(options.json);
796
+ const permissions = Boolean(options.permissions);
797
+ const verifyCert = Boolean(options.verifyCert);
798
+ const appsOnly = Boolean(options.appsOnly);
799
+
800
+ if (online) {
801
+ const { runOnlineShow } = require('./show-online');
802
+ await runOnlineShow(appKey, {
803
+ json,
804
+ permissionsOnly: permissions,
805
+ verifyCert,
806
+ appsOnly
807
+ });
808
+ } else {
809
+ await runOffline(appKey, json, permissions, verifyCert);
818
810
  }
819
811
  }
820
812
 
@@ -861,6 +853,12 @@ function outputOnlineJson(summary, permissionsOnly, manifestSource) {
861
853
  if (summary.localRunProfile) {
862
854
  out.localRunProfile = summary.localRunProfile;
863
855
  }
856
+ if (summary.dataplaneUrl) {
857
+ out.dataplaneUrl = summary.dataplaneUrl;
858
+ }
859
+ if (summary.externalOnly) {
860
+ out.externalOnly = true;
861
+ }
864
862
  if (summary.externalSystem !== undefined && summary.externalSystem !== null) {
865
863
  out.externalSystem = summary.externalSystem && summary.externalSystem.error
866
864
  ? { error: summary.externalSystem.error }
@@ -872,67 +870,11 @@ function outputOnlineJson(summary, permissionsOnly, manifestSource) {
872
870
 
873
871
  /**
874
872
  * Run show in online mode: getApplication, optionally dataplane for external, display or JSON.
875
- * @param {string} appKey - Application key
876
- * @param {boolean} json - Output as JSON
877
- * @param {boolean} [permissionsOnly] - When true, output only permissions
878
- * @param {boolean} [verifyCert] - When true, attempt dataplane verify for external apps
879
- * @throws {Error} On auth failure, 404, or API error
873
+ * @deprecated Use ./show-online runOnlineShow
880
874
  */
881
- async function runOnline(appKey, json, permissionsOnly, verifyCert = false) {
882
- const controllerUrl = await resolveControllerUrl();
883
- if (!controllerUrl) {
884
- throw new Error('Controller URL is required for --online. Run aifabrix login to set the controller URL in config.yaml.');
885
- }
886
- const { authConfig, authResult } = await resolveOnlineAuth(controllerUrl);
887
- const response = await getApplication(controllerUrl, appKey, authConfig);
888
- const apiApp = ensureApplicationResponse(response, appKey, authResult);
889
- const appData = apiApp.data || apiApp;
890
- const cfg = appData.configuration && typeof appData.configuration === 'object' ? appData.configuration : {};
891
- const isExternalApp = appData.type === 'external' || cfg.type === 'external';
892
- const externalSystem = isExternalApp
893
- ? await fetchExternalSystemForOnline(controllerUrl, appKey, authConfig)
894
- : null;
895
- const summary = buildOnlineSummary(apiApp, authResult.actualControllerUrl, externalSystem);
896
- await enrichExternalShowSummary(summary, appKey, verifyCert, {
897
- token: authConfig.token,
898
- controllerUrl: authResult.actualControllerUrl
899
- });
900
- attachRunDefaultsFromUserConfig(summary, appKey, await getConfig());
901
- await attachDeclarativeUrlsToShowApplication(summary, appKey);
902
- if (json) {
903
- const manifestSource = await tryGetLocalManifestSourceForJson(appKey);
904
- outputOnlineJson(summary, permissionsOnly, manifestSource);
905
- return;
906
- }
907
- displayShow(summary, { permissionsOnly: !!permissionsOnly });
908
- }
909
-
910
- /**
911
- * Show application info (offline by default, or from controller with --online).
912
- * @async
913
- * @param {string} appKey - Application key
914
- * @param {Object} options - Options
915
- * @param {boolean} [options.online] - Fetch from controller
916
- * @param {boolean} [options.json] - Output as JSON
917
- * @param {boolean} [options.permissions] - When true, output only permissions (app show --permissions)
918
- * @param {boolean} [options.verifyCert] - When true, attach dataplane certificate verify rows (external)
919
- * @throws {Error} If file missing/invalid (offline) or API/auth error (online)
920
- */
921
- async function showApp(appKey, options = {}) {
922
- if (!appKey || typeof appKey !== 'string') {
923
- throw new Error('appKey is required');
924
- }
925
-
926
- const online = Boolean(options.online);
927
- const json = Boolean(options.json);
928
- const permissions = Boolean(options.permissions);
929
- const verifyCert = Boolean(options.verifyCert);
930
-
931
- if (online) {
932
- await runOnline(appKey, json, permissions, verifyCert);
933
- } else {
934
- await runOffline(appKey, json, permissions, verifyCert);
935
- }
875
+ async function runOnline(appKey, json, permissionsOnly, verifyCert = false, appsOnly = false) {
876
+ const { runOnlineShow } = require('./show-online');
877
+ await runOnlineShow(appKey, { json, permissionsOnly, verifyCert, appsOnly });
936
878
  }
937
879
 
938
880
  module.exports = {
@@ -944,5 +886,12 @@ module.exports = {
944
886
  buildOnlineSummary,
945
887
  formatHealthCheckForDisplay,
946
888
  formatBuildForDisplay,
947
- getShowAuthToken
889
+ getShowAuthToken,
890
+ fetchExternalSystemFromDataplane,
891
+ enrichExternalShowSummary,
892
+ attachRunDefaultsFromUserConfig,
893
+ attachDeclarativeUrlsToShowApplication,
894
+ outputOnlineJson,
895
+ tryGetLocalManifestSourceForJson,
896
+ runOnline
948
897
  };
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Pre-build staging for builder-api Docker images.
3
+ * @fileoverview Runs scripts/stage_builder_api_for_docker.js before docker build
4
+ */
5
+
6
+ 'use strict';
7
+
8
+ const fsSync = require('fs');
9
+ const path = require('path');
10
+ const { spawnSync } = require('child_process');
11
+ const logger = require('../utils/logger');
12
+ const { formatProgress, formatSuccessLine } = require('../utils/cli-test-layout-chalk');
13
+
14
+ /**
15
+ * @param {string} contextPath
16
+ * @returns {void}
17
+ */
18
+ function runBuilderApiDockerStaging(contextPath) {
19
+ const scriptPath = path.join(contextPath, 'scripts/stage_builder_api_for_docker.js');
20
+ if (!fsSync.existsSync(scriptPath)) {
21
+ throw new Error(`Missing builder-api staging script: ${scriptPath}`);
22
+ }
23
+ logger.log(formatProgress('Staging builder-api runtime tree for Docker…'));
24
+ const result = spawnSync(process.execPath, [scriptPath], {
25
+ cwd: contextPath,
26
+ encoding: 'utf8'
27
+ });
28
+ if (result.status !== 0) {
29
+ const detail = (result.stderr || result.stdout || '').trim();
30
+ throw new Error(detail || 'builder-api Docker staging failed');
31
+ }
32
+ logger.log(formatSuccessLine('Builder-api runtime staging ready'));
33
+ }
34
+
35
+ /**
36
+ * @param {string} contextPath
37
+ * @param {string} appName
38
+ * @returns {Promise<void>}
39
+ */
40
+ async function maybeStageBuilderApiForDockerBuild(contextPath, appName) {
41
+ if (String(appName || '').trim() !== 'builder-api') {
42
+ return;
43
+ }
44
+ runBuilderApiDockerStaging(contextPath);
45
+ }
46
+
47
+ module.exports = { maybeStageBuilderApiForDockerBuild, runBuilderApiDockerStaging };
@@ -4,8 +4,8 @@
4
4
  */
5
5
 
6
6
  const { execFileSync } = require('child_process');
7
- const fs = require('fs');
8
7
  const path = require('path');
8
+ const { existsSync } = require('../internal/fs-real-sync');
9
9
 
10
10
  /**
11
11
  * @param {string} repoRoot - aifabrix-miso repo root (Docker build context)
@@ -16,7 +16,7 @@ function assertMisoControllerNpmSdkDeps(repoRoot) {
16
16
  repoRoot,
17
17
  'packages/miso-controller/scripts/assert-npm-sdk-deps.js'
18
18
  );
19
- if (!fs.existsSync(script)) {
19
+ if (!existsSync(script)) {
20
20
  throw new Error(`miso-controller SDK guard not found: ${script}`);
21
21
  }
22
22
  execFileSync('node', [script], { cwd: repoRoot, stdio: 'inherit' });
@@ -14,6 +14,7 @@ const { ensureRunSecretsForApp } = require('../app/run-env-compose');
14
14
  const { formatSuccessParagraph } = require('../utils/cli-test-layout-chalk');
15
15
  const { resolveDockerBuildArgsForApp } = require('./docker-build-args');
16
16
  const { maybeStageIntegrationForDockerBuild } = require('./integration-docker-staging');
17
+ const { maybeStageBuilderApiForDockerBuild } = require('./builder-api-docker-staging');
17
18
 
18
19
  /**
19
20
  * Lazy require breaks circular dependency with lib/build/index.js.
@@ -70,6 +71,7 @@ async function executeDockerImageBuild(appName, options, buildConfig) {
70
71
  );
71
72
  const contextPath = prepareBuildContext(buildConfig, devDir);
72
73
  await maybeStageIntegrationForDockerBuild(contextPath);
74
+ await maybeStageBuilderApiForDockerBuild(contextPath, appName);
73
75
  const dockerfilePath = await handleDockerfileGeneration(
74
76
  appName,
75
77
  { devDir, buildConfig, contextPath, appConfig },
@@ -1,44 +1,17 @@
1
1
  /**
2
- * @fileoverview After successful unified datasource validation, optionally sync system certification.
2
+ * @fileoverview Post-unified-test certification sync (removed — use validate --cert-sync).
3
3
  * @author AI Fabrix Team
4
4
  * @version 2.0.0
5
5
  */
6
6
 
7
7
  'use strict';
8
8
 
9
- const chalk = require('chalk');
10
- const logger = require('../utils/logger');
11
- const { trySyncCertificationFromDataplaneForExternalApp } = require('./sync-after-external-command');
12
- const { cliOptsSkipCertSync } = require('./cli-cert-sync-skip');
13
- const { resolveDebugDisplayMode } = require('../utils/datasource-test-run-debug-display');
14
-
15
9
  /**
16
- * @async
17
- * @param {number} exitCode
18
- * @param {string} datasourceKey
19
- * @param {Object} options - CLI flags (app, noCertSync)
20
- * @param {string} label - Log label
21
- * @param {Object|null} [envelope] - Last DatasourceTestRun (optional); used for certificateIssuance failed hint
10
+ * No-op: local certification block sync is opt-in via `aifabrix validate --cert-sync` only.
22
11
  * @returns {Promise<void>}
23
12
  */
24
- async function afterUnifiedValidationCertSync(exitCode, datasourceKey, options, label, envelope = null) {
25
- if (exitCode !== 0 || cliOptsSkipCertSync(options)) return;
26
- try {
27
- const { resolveAppKeyForDatasource } = require('../datasource/resolve-app');
28
- const { appKey } = await resolveAppKeyForDatasource(datasourceKey, options.app);
29
- let issuanceFailureHint = null;
30
- if (envelope && envelope.certificateIssuance && envelope.certificateIssuance.status === 'failed') {
31
- const ci = envelope.certificateIssuance;
32
- issuanceFailureHint = [ci.reasonCode, ci.message].filter(Boolean).join(': ');
33
- }
34
- const verboseCertHints = resolveDebugDisplayMode(options.debug) !== null;
35
- await trySyncCertificationFromDataplaneForExternalApp(appKey, label, {
36
- issuanceFailureHint,
37
- verboseCertHints
38
- });
39
- } catch (e) {
40
- logger.log(chalk.yellow(`⚠ Certification sync (${label}) skipped: ${e.message}`));
41
- }
13
+ async function afterUnifiedValidationCertSync() {
14
+ return undefined;
42
15
  }
43
16
 
44
17
  module.exports = { afterUnifiedValidationCertSync };
@@ -39,7 +39,6 @@ async function trySyncCertificationFromDataplaneForExternalApp(appKey, label, ex
39
39
  const dsKeys = (manifest.dataSources || []).map((ds) => ds && ds.key).filter(Boolean);
40
40
  await maybeSyncSystemCertificationFromDataplane({
41
41
  label,
42
- noCertSync: false,
43
42
  systemKey: manifest.key,
44
43
  dataplaneUrl,
45
44
  authConfig,
@@ -185,7 +185,6 @@ async function syncSystemCertificationFromDataplane(params) {
185
185
  * @async
186
186
  * @param {Object} params
187
187
  * @param {string} [params.label] - e.g. "upload"
188
- * @param {boolean} [params.noCertSync]
189
188
  * @returns {Promise<void>}
190
189
  */
191
190
  function logCertificationSyncNotWritten(r, label, verboseCertHints = false) {
@@ -205,7 +204,6 @@ function logCertificationSyncNotWritten(r, label, verboseCertHints = false) {
205
204
  async function maybeSyncSystemCertificationFromDataplane(params) {
206
205
  const {
207
206
  label,
208
- noCertSync,
209
207
  systemKey,
210
208
  dataplaneUrl,
211
209
  authConfig,
@@ -214,7 +212,6 @@ async function maybeSyncSystemCertificationFromDataplane(params) {
214
212
  verboseCertHints,
215
213
  silent
216
214
  } = params;
217
- if (noCertSync === true) return;
218
215
  try {
219
216
  const r = await syncSystemCertificationFromDataplane({
220
217
  systemKey,
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Orchestrate aifabrix app add-channel (plan 152).
2
+ * Orchestrate aifabrix channel add (plan 152).
3
3
  *
4
4
  * @fileoverview Channel install after communication external system deploy
5
5
  * @author AI Fabrix Team
@@ -9,6 +9,7 @@
9
9
  'use strict';
10
10
 
11
11
  const { getChannelTarget, getDefaultChannelDescription } = require('./channel-targets');
12
+ const { resolveAppDescription } = require('./channel-description');
12
13
  const { resolveChannelRuntimeValues } = require('./channel-runtime-resolver');
13
14
  const { generateChannelArtifact } = require('./channel-artifact-generator');
14
15
  const {
@@ -27,6 +28,10 @@ const {
27
28
  const { runChannelProbe } = require('./channel-probe');
28
29
  const { resolveChannelAuthContext } = require('./channel-auth-context');
29
30
  const { ensureChannelCredential } = require('./channel-credential');
31
+ const {
32
+ buildChannelApprovalGuide,
33
+ resolveApprovalPortalUrl
34
+ } = require('./channel-approval-guide');
30
35
  const {
31
36
  normalizeBaseChannelName,
32
37
  resolveChannelDisplayName
@@ -40,24 +45,6 @@ const {
40
45
  /**
41
46
  * @param {typeof import('./channel-targets').CHANNEL_TARGETS[string]} target
42
47
  * @param {Object} channelExt
43
- * @param {Object} [context]
44
- * @returns {string|null}
45
- */
46
- function resolveApprovalUrl(target, channelExt, context = {}) {
47
- if (!target.approvalRequired) return null;
48
- if (channelExt?.status === 'installed' || channelExt?.status === 'validated') return null;
49
- if (target.key === 'slack' && context.artifactPath) {
50
- return `https://api.slack.com/apps/new — upload manifest: ${context.artifactPath}`;
51
- }
52
- if (target.key === 'teams-bot') {
53
- return 'https://admin.teams.microsoft.com/ — configure Bot Channel Registration for this tenant';
54
- }
55
- return `https://platform-admin.example/configure/${target.key}`;
56
- }
57
-
58
- /**
59
- * @param {Object} target
60
- * @param {Object} channelExt
61
48
  * @param {boolean} dryRun
62
49
  * @returns {string}
63
50
  */
@@ -88,7 +75,7 @@ function toValidationDisplay(validation) {
88
75
  * @returns {Object|null}
89
76
  */
90
77
  function showExistingChannelStatus(params) {
91
- const { existing, options, target, channelTarget, name, baseName } = params;
78
+ const { existing, options, channelTarget, name, baseName, ctx } = params;
92
79
  if (!existing || options.force || options.dryRun) return null;
93
80
  const sameInstall =
94
81
  (existing.baseName && existing.baseName === baseName) ||
@@ -99,11 +86,21 @@ function showExistingChannelStatus(params) {
99
86
  `Use --force to replace with "${name}".`
100
87
  );
101
88
  }
89
+ const projectRoot = options.projectRoot || process.cwd();
90
+ const approvalGuide =
91
+ existing.status === 'approvalRequired'
92
+ ? buildChannelApprovalGuide(channelTarget, {
93
+ projectRoot,
94
+ name: existing.name || name,
95
+ baseName,
96
+ dataplaneBaseUrl: ctx?.dataplaneUrl
97
+ })
98
+ : null;
102
99
  displayExistingChannelStatus({
103
100
  channelTarget,
104
101
  name: existing.name || name,
105
102
  channelExt: existing,
106
- approvalUrl: resolveApprovalUrl(target, existing)
103
+ approvalGuide
107
104
  });
108
105
  return { skipped: true, channelExt: existing };
109
106
  }
@@ -183,16 +180,17 @@ async function prepareChannelContext(channelTarget, options) {
183
180
  );
184
181
  }
185
182
  if (!options.name || typeof options.name !== 'string' || !options.name.trim()) {
186
- throw new Error('--name is required for app add-channel');
183
+ throw new Error('--name is required for channel add');
187
184
  }
188
185
 
189
186
  const baseName = normalizeBaseChannelName(options.name);
190
187
  const ctx = await resolveChannelAuthContext(channelTarget, { silent: options.quiet });
191
188
  const name = resolveChannelDisplayName(baseName, ctx.environment);
192
- const description =
189
+ const rawDescription =
193
190
  options.description && String(options.description).trim()
194
191
  ? String(options.description).trim()
195
192
  : getDefaultChannelDescription();
193
+ const description = resolveAppDescription(channelTarget, rawDescription);
196
194
 
197
195
  const system = await fetchCommunicationSystem({
198
196
  dataplaneUrl: ctx.dataplaneUrl,
@@ -219,12 +217,19 @@ async function completeLiveInstall(params) {
219
217
 
220
218
  await patchConfigWithAudit(ctx, channelTarget, channelBlock, status, artifact.artifactHash);
221
219
 
222
- const approvalUrl =
220
+ const projectRoot = options.projectRoot || process.cwd();
221
+ const approvalGuide =
223
222
  status === 'approvalRequired'
224
- ? resolveApprovalUrl(target, channelBlock, { artifactPath: artifact.outputPath })
223
+ ? buildChannelApprovalGuide(channelTarget, {
224
+ projectRoot,
225
+ name,
226
+ baseName,
227
+ artifactPath: artifact.outputPath,
228
+ dataplaneBaseUrl: ctx.dataplaneUrl
229
+ })
225
230
  : null;
226
- if (approvalUrl) {
227
- auditApprovalRequired(channelTarget, { approvalUrl });
231
+ if (approvalGuide?.portalUrl) {
232
+ auditApprovalRequired(channelTarget, { approvalUrl: approvalGuide.portalUrl });
228
233
  }
229
234
 
230
235
  const validation = await maybeRunProbe(ctx, channelBlock, channelTarget, options.probe);
@@ -239,10 +244,10 @@ async function completeLiveInstall(params) {
239
244
  artifactPath: artifact.outputPath,
240
245
  installGuidePath: artifact.installPath,
241
246
  validation: toValidationDisplay(validation),
242
- approvalUrl
247
+ approvalGuide
243
248
  });
244
249
 
245
- return { channelBlock, artifact, validation, approvalUrl };
250
+ return { channelBlock, artifact, validation, approvalGuide };
246
251
  }
247
252
 
248
253
  /**
@@ -277,10 +282,10 @@ async function runAddChannel(channelTarget, options = {}) {
277
282
  const skipped = showExistingChannelStatus({
278
283
  existing,
279
284
  options,
280
- target,
281
285
  channelTarget,
282
286
  name,
283
- baseName
287
+ baseName,
288
+ ctx
284
289
  });
285
290
  if (skipped) return skipped;
286
291
 
@@ -291,7 +296,8 @@ async function runAddChannel(channelTarget, options = {}) {
291
296
  baseName,
292
297
  environment: ctx.environment,
293
298
  appDescription: description,
294
- icon: options.icon
299
+ icon: options.icon,
300
+ commandPrefix: options.commandPrefix
295
301
  });
296
302
 
297
303
  const projectRoot = options.projectRoot || process.cwd();
@@ -341,8 +347,8 @@ async function addChannelCommand(channelTarget, options = {}) {
341
347
  module.exports = {
342
348
  runAddChannel,
343
349
  addChannelCommand,
344
- resolveApprovalUrl,
345
350
  resolveInstallStatus,
346
351
  normalizeBaseChannelName,
347
- resolveChannelDisplayName
352
+ resolveChannelDisplayName,
353
+ resolveApprovalPortalUrl
348
354
  };
@@ -0,0 +1,33 @@
1
+ /**
2
+ * ChatGPT enterprise channel admin approval steps (plan 152).
3
+ *
4
+ * @fileoverview OpenAI Platform / workspace connector guide
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const { formatCredentialPortalStep } = require('./credential-portal');
12
+
13
+ /**
14
+ * @param {Object} ctx
15
+ * @returns {{ portalUrl: string, steps: string[] }}
16
+ */
17
+ function buildChatGptApprovalGuide(ctx) {
18
+ return {
19
+ portalUrl: 'https://platform.openai.com/',
20
+ steps: [
21
+ 'Sign in to OpenAI Platform (https://platform.openai.com/) or your ChatGPT Enterprise workspace admin console.',
22
+ 'Create a custom GPT, workspace connector, or MCP integration using the generated manifest (path shown below).',
23
+ 'Configure the OpenAPI specification URL and MCP endpoint from INSTALL.md (dataplane ChatGPT routes).',
24
+ 'Complete OAuth or API key setup as required by your ChatGPT deployment model.',
25
+ formatCredentialPortalStep(ctx, 'the API key or OAuth client credentials'),
26
+ 'Publish the connector to your workspace and complete admin approval if your org requires it.',
27
+ `After ChatGPT lists the connector as active, re-run: ${ctx.resumeCommand}`,
28
+ 'Optional: add --probe when dataplane ChatGPT runtime routes are live on your environment.'
29
+ ]
30
+ };
31
+ }
32
+
33
+ module.exports = { buildChatGptApprovalGuide };
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Dataplane Connected Systems authentication portal URLs (plan 152).
3
+ *
4
+ * @fileoverview Credential UI deep links for channel install guides
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const { joinUrl, normalizeBaseUrl } = require('../channel-runtime-resolver');
12
+
13
+ /**
14
+ * @param {string} dataplaneBaseUrl
15
+ * @param {string} channelTarget
16
+ * @returns {string}
17
+ */
18
+ function buildCredentialPortalUrl(dataplaneBaseUrl, channelTarget) {
19
+ const base = normalizeBaseUrl(dataplaneBaseUrl);
20
+ return joinUrl(base, `/connected-systems/${channelTarget}?tab=authentication`);
21
+ }
22
+
23
+ /**
24
+ * @param {Object} ctx
25
+ * @param {string} secretHint - e.g. "the Bot User OAuth Token and Signing Secret"
26
+ * @returns {string}
27
+ */
28
+ function formatCredentialPortalStep(ctx, secretHint) {
29
+ if (ctx.credentialPortalUrl) {
30
+ return `In AI Fabrix, open ${ctx.credentialPortalUrl} and save ${secretHint}.`;
31
+ }
32
+ return `In AI Fabrix, open Connected Systems → ${ctx.channelTarget} → Authentication and save ${secretHint}.`;
33
+ }
34
+
35
+ module.exports = {
36
+ buildCredentialPortalUrl,
37
+ formatCredentialPortalStep
38
+ };