@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,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
+ };
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Channel approval / go-live guide registry (plan 152).
3
+ *
4
+ * @fileoverview Per-target admin steps for channel add TTY output
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const path = require('path');
12
+ const { getArtifactOutputPath } = require('../channel-artifact-generator');
13
+ const { getChannelTarget } = require('../channel-targets');
14
+ const { buildSlackApprovalGuide } = require('./slack');
15
+ const { buildTeamsBotApprovalGuide } = require('./teams-bot');
16
+ const { buildMicrosoftCopilotApprovalGuide } = require('./microsoft-copilot');
17
+ const { buildChatGptApprovalGuide } = require('./chatgpt');
18
+ const { buildWebEmbedInstallGuide } = require('./web-embed');
19
+ const { buildCredentialPortalUrl } = require('./credential-portal');
20
+
21
+ /** @type {Record<string, (ctx: Object) => { portalUrl: string|null, steps: string[] }>} */
22
+ const GUIDE_BUILDERS = {
23
+ slack: buildSlackApprovalGuide,
24
+ 'teams-bot': buildTeamsBotApprovalGuide,
25
+ 'microsoft-copilot': buildMicrosoftCopilotApprovalGuide,
26
+ chatgpt: buildChatGptApprovalGuide,
27
+ 'web-embed': buildWebEmbedInstallGuide
28
+ };
29
+
30
+ /**
31
+ * @param {string} projectRoot
32
+ * @param {string} channelTarget
33
+ * @param {string} [artifactPath]
34
+ * @returns {string}
35
+ */
36
+ function resolveArtifactPath(projectRoot, channelTarget, artifactPath) {
37
+ if (artifactPath && String(artifactPath).trim()) {
38
+ return path.resolve(artifactPath);
39
+ }
40
+ return getArtifactOutputPath(projectRoot, channelTarget);
41
+ }
42
+
43
+ /**
44
+ * @param {string} channelTarget
45
+ * @param {string} name
46
+ * @returns {string}
47
+ */
48
+ function buildResumeCommand(channelTarget, name) {
49
+ return `aifabrix channel add ${channelTarget} --name "${name}"`;
50
+ }
51
+
52
+ /**
53
+ * @param {string} channelTarget
54
+ * @param {Object} [context]
55
+ * @returns {Object}
56
+ */
57
+ function buildChannelApprovalGuide(channelTarget, context = {}) {
58
+ const target = getChannelTarget(channelTarget);
59
+ const builder = GUIDE_BUILDERS[channelTarget];
60
+ if (!builder) {
61
+ throw new Error(`No approval guide for channel target "${channelTarget}"`);
62
+ }
63
+
64
+ const projectRoot = context.projectRoot || process.cwd();
65
+ const name = context.name || '';
66
+ const artifactPath = resolveArtifactPath(projectRoot, channelTarget, context.artifactPath);
67
+ const installGuidePath = path.join(path.dirname(artifactPath), 'INSTALL.md');
68
+ const resumeCommand = buildResumeCommand(channelTarget, name);
69
+ const credentialPortalUrl = context.dataplaneBaseUrl
70
+ ? buildCredentialPortalUrl(context.dataplaneBaseUrl, channelTarget)
71
+ : null;
72
+ const baseCtx = {
73
+ channelTarget,
74
+ artifactPath,
75
+ resumeCommand,
76
+ credentialKey: target.credentialKey,
77
+ credentialPortalUrl
78
+ };
79
+
80
+ const guide = builder(baseCtx);
81
+
82
+ return {
83
+ channelTarget,
84
+ portalUrl: guide.portalUrl,
85
+ artifactPath,
86
+ installGuidePath,
87
+ resumeCommand,
88
+ credentialKey: target.credentialKey,
89
+ credentialPortalUrl,
90
+ steps: guide.steps,
91
+ approvalRequired: target.approvalRequired === true
92
+ };
93
+ }
94
+
95
+ /**
96
+ * @param {string} channelTarget
97
+ * @param {Object} [context]
98
+ * @returns {string|null}
99
+ */
100
+ function resolveApprovalPortalUrl(channelTarget, context = {}) {
101
+ return buildChannelApprovalGuide(channelTarget, context).portalUrl;
102
+ }
103
+
104
+ module.exports = {
105
+ GUIDE_BUILDERS,
106
+ buildChannelApprovalGuide,
107
+ resolveApprovalPortalUrl,
108
+ resolveArtifactPath,
109
+ buildResumeCommand
110
+ };
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Microsoft Copilot channel admin approval steps (plan 152).
3
+ *
4
+ * @fileoverview Copilot Studio / M365 admin 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 buildMicrosoftCopilotApprovalGuide(ctx) {
18
+ return {
19
+ portalUrl: 'https://admin.cloud.microsoft.com/',
20
+ steps: [
21
+ 'Sign in to Microsoft 365 admin (https://admin.cloud.microsoft.com/) or Copilot Studio as a tenant admin.',
22
+ 'Create or open a Copilot extensibility project (declarative agent or API plugin).',
23
+ 'Import or configure using the generated manifest artifact (path shown below).',
24
+ 'Point the OpenAPI / action endpoints to the URLs in INSTALL.md (dataplane Copilot routes).',
25
+ 'Register OAuth client credentials for the API provider connection if the platform prompts for them.',
26
+ formatCredentialPortalStep(ctx, 'the OAuth client ID and client secret'),
27
+ 'Submit for M365 admin approval and publish to your organization when review completes.',
28
+ `After Copilot shows the extension as available, re-run: ${ctx.resumeCommand}`,
29
+ 'Optional: add --probe when dataplane Copilot runtime routes are live on your environment.'
30
+ ]
31
+ };
32
+ }
33
+
34
+ module.exports = { buildMicrosoftCopilotApprovalGuide };
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Slack channel admin approval steps (plan 152).
3
+ *
4
+ * @fileoverview Slack app manifest install 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 buildSlackApprovalGuide(ctx) {
18
+ return {
19
+ portalUrl: 'https://api.slack.com/apps',
20
+ steps: [
21
+ 'Open https://api.slack.com/apps and sign in as a Slack workspace admin.',
22
+ 'Click Create New App → From an app manifest.',
23
+ 'Select your workspace, then paste or upload the Slack app manifest (path shown below).',
24
+ 'Review callback URLs and OAuth scopes (pre-filled from AI Fabrix), then create the app.',
25
+ 'Open Install App → Install to Workspace and approve the installation.',
26
+ 'Copy the Bot User OAuth Token and Signing Secret from the Slack app settings.',
27
+ formatCredentialPortalStep(ctx, 'the Bot User OAuth Token and Signing Secret'),
28
+ `When Slack shows the app as installed, re-run: ${ctx.resumeCommand}`,
29
+ 'Optional: add --probe to verify callbacks and the assistant catalog.'
30
+ ]
31
+ };
32
+ }
33
+
34
+ module.exports = { buildSlackApprovalGuide };
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Microsoft Teams bot channel admin approval steps (plan 152).
3
+ *
4
+ * @fileoverview Teams Developer Portal + Azure Bot registration 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 buildTeamsBotApprovalGuide(ctx) {
18
+ return {
19
+ portalUrl: 'https://dev.teams.microsoft.com/',
20
+ steps: [
21
+ 'Open the Teams Developer Portal (https://dev.teams.microsoft.com/) as a Teams tenant admin.',
22
+ 'Create a new app or import the Bot Framework manifest JSON (path shown below).',
23
+ 'Set the bot messaging endpoint to the Bot messages URL in INSTALL.md (your dataplane /messages route).',
24
+ 'In Azure Portal, register or link the Azure Bot resource and copy the Microsoft App ID.',
25
+ 'Create a client secret (or upload certificate) for the bot app registration in Microsoft Entra.',
26
+ 'Enable the Microsoft Teams channel on the Azure Bot resource.',
27
+ formatCredentialPortalStep(ctx, 'the Microsoft App ID and client secret'),
28
+ 'Publish the app to your org (or sideload for lab) and complete tenant admin approval if prompted.',
29
+ `After the bot is live in Teams, re-run: ${ctx.resumeCommand}`,
30
+ 'Optional: add --probe to verify inbound JWT validation and the assistant catalog.'
31
+ ]
32
+ };
33
+ }
34
+
35
+ module.exports = { buildTeamsBotApprovalGuide };
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Web embed channel go-live steps (plan 152) — no platform admin approval.
3
+ *
4
+ * @fileoverview Customer-site embed configuration 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: null, steps: string[] }}
16
+ */
17
+ function buildWebEmbedInstallGuide(ctx) {
18
+ return {
19
+ portalUrl: null,
20
+ steps: [
21
+ 'Review the generated embed configuration JSON (path shown below).',
22
+ 'Confirm allowed origins and the embed config URL in INSTALL.md match your customer site.',
23
+ formatCredentialPortalStep(ctx, 'the embed API key'),
24
+ 'Add the embed snippet or widget loader to your web application (see INSTALL.md).',
25
+ 'No Slack/Teams-style admin approval is required — validate in your browser after deploy.',
26
+ `Re-run: ${ctx.resumeCommand}`,
27
+ 'Optional: add --probe to verify the config endpoint and assistant catalog.'
28
+ ]
29
+ };
30
+ }
31
+
32
+ module.exports = { buildWebEmbedInstallGuide };
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Re-export channel approval guides (plan 152).
3
+ *
4
+ * @fileoverview Back-compat shim — implementation in approval-guides/
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ module.exports = require('./approval-guides');