@aifabrix/builder 2.49.1 → 2.50.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (413) hide show
  1. package/.cursor/process/README.md +9 -0
  2. package/.cursor/rules/deploy-rules/docker-image-ip-policy.mdc +49 -0
  3. package/.cursor/rules/plan-rules/application-lifecycle.mdc +30 -0
  4. package/.cursor/rules/plan-rules/plan-frontmatter.mdc +35 -0
  5. package/.cursor/rules/plan-rules/plan-lifecycle.mdc +31 -0
  6. package/.cursor/rules/plan-rules/plan-validation-gate.mdc +34 -0
  7. package/.cursor/skills/README.md +1 -0
  8. package/.dockerignore +52 -0
  9. package/.eslintignore +22 -0
  10. package/README.md +2 -0
  11. package/bin/builder-api-cleanup.js +26 -0
  12. package/bin/builder-api-nest.js +10 -0
  13. package/bin/builder-api-spike.js +19 -0
  14. package/enterprise-knowledge/README.md +50 -0
  15. package/enterprise-knowledge/enterprise-integration-lifecycle/README.md +22 -0
  16. package/enterprise-knowledge/enterprise-integration-lifecycle/application.json +15 -0
  17. package/enterprise-knowledge/enterprise-integration-lifecycle/deploy.js +69 -0
  18. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-deploy.json +52 -0
  19. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-system.json +29 -0
  20. package/enterprise-knowledge/enterprise-integration-lifecycle/env.template +2 -0
  21. package/integration/README.md +81 -0
  22. package/integration/github/README.md +53 -0
  23. package/integration/github/application.json +21 -0
  24. package/integration/github/deploy.js +72 -0
  25. package/integration/github/env.template +11 -0
  26. package/integration/github/github-datasource-issue-comments.json +239 -0
  27. package/integration/github/github-datasource-issues.json +399 -0
  28. package/integration/github/github-datasource-repository.json +354 -0
  29. package/integration/github/github-deploy.json +1202 -0
  30. package/integration/github/github-system.json +82 -0
  31. package/integration/hubspot-test/README.md +1 -1
  32. package/jest.isolated-projects.js +31 -1
  33. package/jest.projects.js +87 -1
  34. package/lib/api/dev-server-https.js +1 -1
  35. package/lib/api/dev.api.js +1 -0
  36. package/lib/api/enterprise-knowledge.api.js +63 -0
  37. package/lib/api/evidence.api.js +172 -0
  38. package/lib/api/external-systems.api.js +8 -2
  39. package/lib/api/host-ops.api.js +69 -0
  40. package/lib/api/resource-types.api.js +1 -0
  41. package/lib/api/types/enterprise-knowledge.types.js +46 -0
  42. package/lib/api/types/evidence.types.js +67 -0
  43. package/lib/api/types/resource-types.types.js +2 -0
  44. package/lib/app/controller-application-filter.js +36 -0
  45. package/lib/app/deploy.js +1 -1
  46. package/lib/app/list-external-systems.js +130 -0
  47. package/lib/app/list.js +20 -8
  48. package/lib/app/run.js +3 -1
  49. package/lib/app/show-display.js +8 -3
  50. package/lib/app/show-online.js +178 -0
  51. package/lib/app/show.js +37 -88
  52. package/lib/build/builder-api-docker-staging.js +47 -0
  53. package/lib/build/miso-controller-npm-sdk-guard.js +2 -2
  54. package/lib/build/standard-docker-build.js +2 -0
  55. package/lib/certification/post-unified-cert-sync.js +4 -31
  56. package/lib/certification/sync-after-external-command.js +0 -1
  57. package/lib/certification/sync-system-certification.js +0 -3
  58. package/lib/channels/add-channel.js +40 -34
  59. package/lib/channels/approval-guides/chatgpt.js +33 -0
  60. package/lib/channels/approval-guides/credential-portal.js +38 -0
  61. package/lib/channels/approval-guides/index.js +110 -0
  62. package/lib/channels/approval-guides/microsoft-copilot.js +34 -0
  63. package/lib/channels/approval-guides/slack.js +34 -0
  64. package/lib/channels/approval-guides/teams-bot.js +35 -0
  65. package/lib/channels/approval-guides/web-embed.js +32 -0
  66. package/lib/channels/channel-approval-guide.js +11 -0
  67. package/lib/channels/channel-artifact-generator.js +16 -4
  68. package/lib/channels/channel-audit.js +3 -0
  69. package/lib/channels/channel-auth-context.js +1 -1
  70. package/lib/channels/channel-description.js +59 -0
  71. package/lib/channels/channel-integration-generator.js +13 -230
  72. package/lib/channels/channel-integration-template.js +94 -0
  73. package/lib/channels/channel-runtime-resolver.js +43 -3
  74. package/lib/channels/channel-status-display.js +66 -26
  75. package/lib/channels/channel-targets.js +3 -3
  76. package/lib/cli/index.js +27 -3
  77. package/lib/cli/infra-guided.js +5 -1
  78. package/lib/cli/setup-app-external-create.js +111 -0
  79. package/lib/cli/setup-app.help.js +1 -1
  80. package/lib/cli/setup-app.js +38 -125
  81. package/lib/cli/setup-app.test-commands.js +26 -52
  82. package/lib/cli/setup-certification-commands.js +4 -4
  83. package/lib/cli/setup-certification.help.js +9 -9
  84. package/lib/cli/setup-dev-path-commands.js +24 -0
  85. package/lib/cli/setup-dev.js +115 -16
  86. package/lib/cli/setup-external-system-help.js +4 -6
  87. package/lib/cli/setup-external-system.js +58 -52
  88. package/lib/cli/setup-infra-up-builder-api-action.js +64 -0
  89. package/lib/cli/setup-infra-up-platform-action.js +3 -1
  90. package/lib/cli/setup-infra.js +15 -0
  91. package/lib/cli/setup-list.js +43 -0
  92. package/lib/cli/setup-utility-repair.js +26 -7
  93. package/lib/cli/setup-utility.js +5 -3
  94. package/lib/commands/app.js +15 -43
  95. package/lib/commands/channel-add-setup.js +110 -0
  96. package/lib/commands/channel.js +42 -8
  97. package/lib/commands/datasource-sync-display.js +96 -0
  98. package/lib/commands/datasource-sync-policy.js +210 -0
  99. package/lib/commands/datasource-test-trust-cli.js +6 -6
  100. package/lib/commands/datasource-unified-test-cli.js +2 -1
  101. package/lib/commands/datasource-unified-test-cli.options.js +33 -23
  102. package/lib/commands/deploy-gate-failure-details.js +163 -0
  103. package/lib/commands/deploy-gate-orchestrator.js +322 -0
  104. package/lib/commands/dev-cli-handlers.js +64 -61
  105. package/lib/commands/dev-host-ops-params.js +91 -0
  106. package/lib/commands/dev-host-ops-poll.js +111 -0
  107. package/lib/commands/dev-host-ops.js +252 -0
  108. package/lib/commands/dev-init.js +3 -1
  109. package/lib/commands/enterprise-knowledge.js +284 -0
  110. package/lib/commands/evidence-cli-leaves.js +250 -0
  111. package/lib/commands/evidence.js +51 -0
  112. package/lib/commands/governance-cli-shared.js +2 -2
  113. package/lib/commands/governance-command-action.js +2 -2
  114. package/lib/commands/governance-fixture-subjects.js +85 -0
  115. package/lib/commands/governance.js +1 -1
  116. package/lib/commands/lifecycle-command-action.js +2 -2
  117. package/lib/commands/lifecycle-external.js +3 -3
  118. package/lib/commands/manifest-cli-auth.js +29 -0
  119. package/lib/commands/manifest-cli-commands.js +170 -0
  120. package/lib/commands/manifest-cli-integration-path.js +63 -0
  121. package/lib/commands/manifest.js +21 -0
  122. package/lib/commands/protection-cli-leaves.js +3 -3
  123. package/lib/commands/repair-auth-apply.js +15 -1
  124. package/lib/commands/repair-authentications-454.js +169 -0
  125. package/lib/commands/repair-capability-openapi-warnings.js +126 -0
  126. package/lib/commands/repair-datasource-apply.js +135 -0
  127. package/lib/commands/repair-datasource-auto-rbac.js +62 -1
  128. package/lib/commands/repair-datasource-http-service-contract.js +239 -0
  129. package/lib/commands/repair-datasource-operation-security.js +180 -0
  130. package/lib/commands/repair-datasource-run.js +7 -2
  131. package/lib/commands/repair-datasource-sync-operations.js +177 -0
  132. package/lib/commands/repair-datasource-webhooks-sync-bridge.js +133 -0
  133. package/lib/commands/repair-datasource.js +12 -68
  134. package/lib/commands/repair-env-template.js +11 -1
  135. package/lib/commands/repair-external-run.js +121 -31
  136. package/lib/commands/repair-internal.js +1 -1
  137. package/lib/commands/repair-openapi-export.js +156 -0
  138. package/lib/commands/repair-openapi-sync.js +19 -2
  139. package/lib/commands/repair-orchestration-datasource-split.js +259 -0
  140. package/lib/commands/repair-persist.js +22 -1
  141. package/lib/commands/repair-rbac-platform-preset.js +204 -0
  142. package/lib/commands/repair-rbac-reader-roles.js +191 -0
  143. package/lib/commands/repair-rbac.js +163 -86
  144. package/lib/commands/repair-steps.js +83 -18
  145. package/lib/commands/repair-system-permissions.js +1 -0
  146. package/lib/commands/repair.js +1 -1
  147. package/lib/commands/resource-type.js +65 -26
  148. package/lib/commands/run-post-publish-data-sync.js +68 -0
  149. package/lib/commands/setup-modes.js +1 -1
  150. package/lib/commands/test-e2e-external.js +21 -8
  151. package/lib/commands/test-governance-cli-options.js +2 -2
  152. package/lib/commands/test-trust-cli-options.js +2 -2
  153. package/lib/commands/up-builder-api-bootstrap.js +71 -0
  154. package/lib/commands/up-builder-api-provision.js +241 -0
  155. package/lib/commands/up-builder-api.js +88 -0
  156. package/lib/commands/up-common.js +25 -1
  157. package/lib/commands/upload-credential-push-log.js +117 -0
  158. package/lib/commands/upload-data-sync-finalize.js +60 -0
  159. package/lib/commands/upload-probe.js +66 -0
  160. package/lib/commands/upload-publish-context.js +4 -1
  161. package/lib/commands/upload-sidecar-followups.js +55 -27
  162. package/lib/commands/upload.js +116 -157
  163. package/lib/commands/verify-governance-combined-external.js +1 -1
  164. package/lib/commands/verify-governance-db.js +2 -2
  165. package/lib/commands/verify-operations-command-action.js +2 -2
  166. package/lib/commands/verify-operations-step-plan.js +2 -2
  167. package/lib/commands/verify-operations-steps.js +2 -2
  168. package/lib/commands/verify-trust-command-action.js +1 -1
  169. package/lib/commands/wizard-core.js +1 -1
  170. package/lib/commands/wizard-headless.js +2 -1
  171. package/lib/core/admin-secrets.js +2 -6
  172. package/lib/core/secrets-env-content.js +10 -4
  173. package/lib/core/secrets-env-write.js +2 -13
  174. package/lib/datasource/agent-trust-run.js +3 -3
  175. package/lib/datasource/deploy.js +3 -1
  176. package/lib/datasource/test-e2e.js +6 -1
  177. package/lib/datasource/unified-validation-run-body.js +4 -1
  178. package/lib/datasource/unified-validation-run.js +1 -1
  179. package/lib/deployment/deploy-poll-ui.js +73 -12
  180. package/lib/deployment/deployer-poll-run.js +113 -0
  181. package/lib/deployment/deployer.js +17 -87
  182. package/lib/evidence/dataplane-context.js +21 -0
  183. package/lib/evidence/evidence-display.js +78 -0
  184. package/lib/evidence/evidence-service.js +392 -0
  185. package/lib/external-system/deploy.js +290 -112
  186. package/lib/external-system/download.js +7 -3
  187. package/lib/external-system/test-execution.js +1 -1
  188. package/lib/external-system/test-system-level.js +8 -10
  189. package/lib/external-system/test.js +12 -6
  190. package/lib/generator/deploy-script.js +73 -0
  191. package/lib/generator/external.js +2 -1
  192. package/lib/generator/index.js +17 -2
  193. package/lib/generator/wizard.js +3 -36
  194. package/lib/internal/fs-real-sync.js +22 -1
  195. package/lib/internal/node-fs.js +2 -0
  196. package/lib/lifecycle/lifecycle-governance-options.js +1 -1
  197. package/lib/lifecycle/verify-step-progress.js +1 -1
  198. package/lib/programmatic/access-log.js +26 -0
  199. package/lib/programmatic/auth-config.js +44 -0
  200. package/lib/programmatic/bearer-auth.js +176 -0
  201. package/lib/programmatic/builder-api-request.js +175 -0
  202. package/lib/programmatic/builder-api-route-dispatch.js +82 -0
  203. package/lib/programmatic/builder-api-runtime-config.js +42 -0
  204. package/lib/programmatic/builder-api-server.js +230 -0
  205. package/lib/programmatic/builder-help-authentication-catalog.js +282 -0
  206. package/lib/programmatic/builder-help-connected-system-ui.js +266 -0
  207. package/lib/programmatic/builder-help-enterprise-sync-fabrix.js +60 -0
  208. package/lib/programmatic/builder-help-envelope.js +36 -0
  209. package/lib/programmatic/builder-help-fixtures.js +200 -0
  210. package/lib/programmatic/builder-help-governance.js +172 -0
  211. package/lib/programmatic/builder-help-schema-catalog.js +92 -0
  212. package/lib/programmatic/builder-help.js +361 -0
  213. package/lib/programmatic/capability-registry.js +77 -0
  214. package/lib/programmatic/command-options.js +32 -0
  215. package/lib/programmatic/enterprise-mcp-client.js +98 -0
  216. package/lib/programmatic/http-problem-details.js +99 -0
  217. package/lib/programmatic/http-route-match.js +40 -0
  218. package/lib/programmatic/idempotency-cache.js +69 -0
  219. package/lib/programmatic/index.js +53 -0
  220. package/lib/programmatic/integration-path-scope.js +39 -0
  221. package/lib/programmatic/log-redaction.js +66 -0
  222. package/lib/programmatic/manifest-get-section.js +146 -0
  223. package/lib/programmatic/manifest-patch-section.js +252 -0
  224. package/lib/programmatic/manifest-repair.js +122 -0
  225. package/lib/programmatic/manifest-section-dependency-graph.js +160 -0
  226. package/lib/programmatic/manifest-section-io.js +225 -0
  227. package/lib/programmatic/manifest-section-quality.js +171 -0
  228. package/lib/programmatic/manifest-section-registry-data.js +269 -0
  229. package/lib/programmatic/manifest-section-registry.js +205 -0
  230. package/lib/programmatic/nest-http-bridge.js +34 -0
  231. package/lib/programmatic/openapi-component-schemas.js +68 -0
  232. package/lib/programmatic/openapi-description-enricher.js +117 -0
  233. package/lib/programmatic/openapi-descriptions.js +190 -0
  234. package/lib/programmatic/openapi-docs-serving.js +123 -0
  235. package/lib/programmatic/openapi-help-schemas.js +63 -0
  236. package/lib/programmatic/openapi-manifest-schemas.js +141 -0
  237. package/lib/programmatic/openapi-operation-bindings.js +274 -0
  238. package/lib/programmatic/openapi-request-schemas.js +155 -0
  239. package/lib/programmatic/openapi-result-schemas.js +476 -0
  240. package/lib/programmatic/openapi-schema-descriptions-certify.js +139 -0
  241. package/lib/programmatic/openapi-schema-descriptions-core.js +159 -0
  242. package/lib/programmatic/openapi-schema-descriptions-help.js +40 -0
  243. package/lib/programmatic/openapi-schema-descriptions-manifest.js +143 -0
  244. package/lib/programmatic/openapi-schema-descriptions-mcp.js +118 -0
  245. package/lib/programmatic/openapi-schema-descriptions-operations.js +281 -0
  246. package/lib/programmatic/openapi-schema-helpers.js +93 -0
  247. package/lib/programmatic/openapi-spec.js +203 -0
  248. package/lib/programmatic/orchestration-openapi-meta.js +159 -0
  249. package/lib/programmatic/platform-rbac-catalog.js +90 -0
  250. package/lib/programmatic/request-timeout.js +53 -0
  251. package/lib/programmatic/route-handler-map.js +143 -0
  252. package/lib/programmatic/route-handlers-context.js +29 -0
  253. package/lib/programmatic/route-handlers.js +33 -0
  254. package/lib/programmatic/run-certify.js +57 -0
  255. package/lib/programmatic/run-enterprise-mcp.js +32 -0
  256. package/lib/programmatic/run-lifecycle.js +29 -0
  257. package/lib/programmatic/run-repair.js +41 -0
  258. package/lib/programmatic/run-repository-emcp.js +54 -0
  259. package/lib/programmatic/run-template-workspace.js +61 -0
  260. package/lib/programmatic/run-test.js +49 -0
  261. package/lib/programmatic/run-upload.js +63 -0
  262. package/lib/programmatic/run-validate.js +53 -0
  263. package/lib/programmatic/run-wizard.js +40 -0
  264. package/lib/programmatic/system-key.js +48 -0
  265. package/lib/programmatic/wizard-config-normalize.js +118 -0
  266. package/lib/programmatic/workspace-cleanup.js +128 -0
  267. package/lib/programmatic/workspace-context.js +145 -0
  268. package/lib/programmatic/workspace-lock.js +75 -0
  269. package/lib/programmatic/workspace-meta.js +64 -0
  270. package/lib/programmatic/workspace-ops.js +149 -0
  271. package/lib/protection/run-commands-upload-sync.js +35 -0
  272. package/lib/protection/run-commands.js +2 -20
  273. package/lib/protection/upload-batch.js +11 -7
  274. package/lib/resolvers/resource-type-file.js +22 -0
  275. package/lib/schema/external-datasource.schema.json +161 -1
  276. package/lib/schema/external-system.schema.json +242 -4
  277. package/lib/schema/flag-map-validation-run.json +3 -0
  278. package/lib/schema/type/credential-field-registry.json +2 -2
  279. package/lib/schema/type/document-storage.json +9 -0
  280. package/lib/utils/agent-trust-run-display.js +1 -1
  281. package/lib/utils/app-path-resolve.js +168 -0
  282. package/lib/utils/authentication-env-template.js +222 -0
  283. package/lib/utils/cli-sync-options.js +7 -11
  284. package/lib/utils/cli-utils.js +4 -0
  285. package/lib/utils/cli-workspace-options.js +29 -0
  286. package/lib/utils/compose-generate-docker-compose.js +102 -0
  287. package/lib/utils/configuration-env-resolver.js +203 -27
  288. package/lib/utils/datasource-test-run-certificate-tty.js +28 -2
  289. package/lib/utils/datasource-test-run-certification-debug.js +130 -0
  290. package/lib/utils/datasource-test-run-debug-display.js +2 -0
  291. package/lib/utils/datasource-test-run-debug-slice.js +7 -0
  292. package/lib/utils/datasource-test-run-display.js +2 -1
  293. package/lib/utils/dev-init-ssh-merge.js +165 -23
  294. package/lib/utils/dev-pin-share-instructions.js +110 -0
  295. package/lib/utils/dev-ssh-config-helper.js +177 -33
  296. package/lib/utils/enterprise-knowledge-paths.js +142 -0
  297. package/lib/utils/env-copy.js +2 -1
  298. package/lib/utils/env-dotenv-format.js +103 -0
  299. package/lib/utils/external-env-template.js +4 -1
  300. package/lib/utils/external-system-display.js +5 -1
  301. package/lib/utils/external-system-readiness-compact-blocks.js +221 -0
  302. package/lib/utils/external-system-readiness-compact-display.js +324 -0
  303. package/lib/utils/external-system-readiness-core.js +16 -0
  304. package/lib/utils/external-system-readiness-deploy-display.js +29 -11
  305. package/lib/utils/external-system-readiness-display-internals.js +3 -1
  306. package/lib/utils/external-system-readiness-display.js +20 -30
  307. package/lib/utils/external-system-system-test-tty-certification.js +135 -0
  308. package/lib/utils/external-system-system-test-tty.js +5 -41
  309. package/lib/utils/help-builder.js +6 -1
  310. package/lib/utils/host-ops-job-labels.js +236 -0
  311. package/lib/utils/host-ops-job-result.js +61 -0
  312. package/lib/utils/host-ops-poll-ui.js +163 -0
  313. package/lib/utils/integration-path-resolve.js +112 -0
  314. package/lib/utils/paths-reload-source.js +148 -0
  315. package/lib/utils/paths-system-builder-keys.js +25 -0
  316. package/lib/utils/paths.js +151 -26
  317. package/lib/utils/runtime-configuration-values.js +64 -2
  318. package/lib/utils/secrets-helpers.js +5 -1
  319. package/lib/utils/ssh-known-hosts.js +130 -0
  320. package/lib/utils/test-target-cli-options.js +75 -0
  321. package/lib/utils/upload-sync-options.js +4 -0
  322. package/lib/utils/validation-run-request.js +11 -2
  323. package/lib/validation/external-manifest-validator.js +11 -1
  324. package/lib/validation/openapi-contract-surface-validator.js +426 -0
  325. package/lib/validation/openapi-contract-vendor-validation.js +238 -0
  326. package/lib/validation/validate-external-file.js +160 -0
  327. package/lib/validation/validate.js +6 -117
  328. package/package.json +46 -29
  329. package/packages/builder-api/README.md +120 -0
  330. package/packages/builder-api/package.json +30 -0
  331. package/packages/builder-api/src/app.module.ts +7 -0
  332. package/packages/builder-api/src/auth/auth.module.ts +5 -0
  333. package/packages/builder-api/src/external-system/external-system.module.ts +5 -0
  334. package/packages/builder-api/src/main.ts +16 -0
  335. package/packages/builder-api/tsconfig.json +15 -0
  336. package/scripts/check-builder-api-architecture-grep.js +79 -0
  337. package/scripts/docker_image_content_gate.js +47 -0
  338. package/scripts/docker_image_content_gate.sh +5 -0
  339. package/scripts/export-builder-api-evidence.js +262 -0
  340. package/scripts/lib/builder-api-docker-staging-copy.js +60 -0
  341. package/scripts/lib/builder-api-docker-staging-core.js +183 -0
  342. package/scripts/lib/docker-image-content-gate-core.js +166 -0
  343. package/scripts/lib/plan-actor.js +109 -0
  344. package/scripts/lib/plan-config.js +20 -0
  345. package/scripts/lib/plan-gates.js +154 -0
  346. package/scripts/lib/plan-meta.js +104 -0
  347. package/scripts/lib/plan-parse.js +162 -0
  348. package/scripts/lib/plan-prevalidate-gates.js +326 -0
  349. package/scripts/lib/plan-run-core.js +125 -0
  350. package/scripts/lib/plan-run-report.js +108 -0
  351. package/scripts/plan-approve.js +24 -0
  352. package/scripts/plan-archive.js +49 -0
  353. package/scripts/plan-run.js +13 -0
  354. package/scripts/plan-set-actor.js +21 -0
  355. package/scripts/plan-validate.js +80 -0
  356. package/scripts/pnpm/af.mjs +110 -0
  357. package/scripts/pnpm/check-quiet.mjs +32 -0
  358. package/scripts/pnpm/dev-install.mjs +29 -0
  359. package/scripts/pnpm/dev-reload.mjs +18 -0
  360. package/scripts/pnpm/help.mjs +55 -0
  361. package/scripts/pnpm/lib/dev-reload-core.mjs +189 -0
  362. package/scripts/pnpm/lib/dev-reload-log-capture.mjs +67 -0
  363. package/scripts/pnpm/lib/dev-reload-log-utils.mjs +32 -0
  364. package/scripts/pnpm/lib/resolve-aifabrix-bin.mjs +124 -0
  365. package/scripts/pnpm/lib/resolve-app-url.mjs +183 -0
  366. package/scripts/pnpm/lib/spinner.mjs +42 -0
  367. package/scripts/stage_builder_api_for_docker.js +65 -0
  368. package/scripts/sync-builder-api-template.js +44 -0
  369. package/templates/README.md +3 -0
  370. package/templates/applications/builder-api/Dockerfile +38 -0
  371. package/templates/applications/builder-api/application.yaml +75 -0
  372. package/templates/applications/builder-api/env.template +48 -0
  373. package/templates/applications/dataplane/application.yaml +1 -1
  374. package/templates/applications/dataplane/env.template +10 -6
  375. package/templates/applications/dataplane/rbac.yaml +21 -1
  376. package/templates/applications/miso-controller/application.yaml +1 -1
  377. package/templates/applications/miso-controller/env.template +1 -3
  378. package/templates/channels/README.md +18 -0
  379. package/templates/channels/ai-fabrix-icon.jpg +0 -0
  380. package/templates/channels/chatgpt/install.template.md.hbs +21 -24
  381. package/templates/channels/chatgpt/integration/README.md +11 -0
  382. package/templates/channels/chatgpt/integration/application.json +15 -0
  383. package/templates/channels/chatgpt/integration/chatgpt-system.json +29 -0
  384. package/templates/channels/chatgpt/integration/env.template +4 -0
  385. package/templates/channels/microsoft-copilot/install.template.md.hbs +20 -25
  386. package/templates/channels/microsoft-copilot/integration/README.md +11 -0
  387. package/templates/channels/microsoft-copilot/integration/application.json +15 -0
  388. package/templates/channels/microsoft-copilot/integration/env.template +6 -0
  389. package/templates/channels/microsoft-copilot/integration/microsoft-copilot-system.json +34 -0
  390. package/templates/channels/slack/install.template.md.hbs +48 -18
  391. package/templates/channels/slack/integration/README.md +38 -0
  392. package/templates/channels/slack/integration/application.json +18 -0
  393. package/templates/channels/slack/integration/env.template +29 -0
  394. package/templates/channels/slack/integration/slack-datasource-conversations.json +226 -0
  395. package/templates/channels/slack/integration/slack-datasource-messages.json +269 -0
  396. package/templates/channels/slack/integration/slack-system.json +86 -0
  397. package/templates/channels/slack/manifest.template.json.hbs +20 -10
  398. package/templates/channels/teams-bot/install.template.md.hbs +31 -17
  399. package/templates/channels/teams-bot/integration/README.md +18 -0
  400. package/templates/channels/teams-bot/integration/application.json +17 -0
  401. package/templates/channels/teams-bot/integration/env.template +5 -0
  402. package/templates/channels/teams-bot/integration/teams-bot-system.json +55 -0
  403. package/templates/channels/teams-bot/manifest.template.json.hbs +27 -0
  404. package/templates/channels/web-embed/install.template.md.hbs +16 -26
  405. package/templates/channels/web-embed/integration/README.md +11 -0
  406. package/templates/channels/web-embed/integration/application.json +15 -0
  407. package/templates/channels/web-embed/integration/env.template +4 -0
  408. package/templates/channels/web-embed/integration/web-embed-system.json +29 -0
  409. package/templates/openapi/redoc_page.html +86 -0
  410. package/templates/python/docker-compose.hbs +11 -0
  411. package/templates/python/requirements.txt +1 -1
  412. package/templates/typescript/docker-compose.hbs +11 -0
  413. package/lib/certification/cli-cert-sync-skip.js +0 -21
@@ -0,0 +1,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');
@@ -13,6 +13,7 @@ const fs = require('fs');
13
13
  const path = require('path');
14
14
  const Handlebars = require('handlebars');
15
15
  const { getChannelTarget } = require('./channel-targets');
16
+ const { BUILDER_ROOT } = require('./channel-integration-template');
16
17
 
17
18
  const SECRET_PATTERNS = [/xoxb-/i, /xoxp-/i, /client_secret/i, /signing_secret/i, /Bearer\s+/i];
18
19
 
@@ -32,13 +33,23 @@ function assertNoSecretsInArtifact(content) {
32
33
  }
33
34
 
34
35
  /**
35
- * @param {string} projectRoot
36
+ * Handlebars templates ship with @aifabrix/builder (not the caller's cwd).
36
37
  * @param {string} channelTarget
37
38
  * @returns {string}
38
39
  */
39
- function getTemplatesDir(projectRoot, channelTarget) {
40
+ function getChannelTemplatesDir(channelTarget) {
40
41
  const target = getChannelTarget(channelTarget);
41
- return path.join(projectRoot, 'templates', 'channels', target.templateDir);
42
+ return path.join(BUILDER_ROOT, 'templates', 'channels', target.templateDir);
43
+ }
44
+
45
+ /**
46
+ * @param {string} _projectRoot
47
+ * @param {string} channelTarget
48
+ * @returns {string}
49
+ * @deprecated Use getChannelTemplatesDir — templates are package-rooted.
50
+ */
51
+ function getTemplatesDir(_projectRoot, channelTarget) {
52
+ return getChannelTemplatesDir(channelTarget);
42
53
  }
43
54
 
44
55
  /**
@@ -102,7 +113,7 @@ function renderInstallGuideIfPresent(templatesDir, runtimeValues, outputDir, dry
102
113
  * @returns {{ outputPath: string, artifactHash: string, content: string, installPath?: string }}
103
114
  */
104
115
  function generateChannelArtifact(params) {
105
- const templatesDir = getTemplatesDir(params.projectRoot, params.channelTarget);
116
+ const templatesDir = getChannelTemplatesDir(params.channelTarget);
106
117
  const manifestTemplate = path.join(templatesDir, 'manifest.template.json.hbs');
107
118
  const content = renderTemplateFile(manifestTemplate, params.runtimeValues);
108
119
  assertNoSecretsInArtifact(content);
@@ -133,6 +144,7 @@ function generateChannelArtifact(params) {
133
144
 
134
145
  module.exports = {
135
146
  assertNoSecretsInArtifact,
147
+ getChannelTemplatesDir,
136
148
  getTemplatesDir,
137
149
  getArtifactOutputPath,
138
150
  renderTemplateFile,
@@ -15,6 +15,9 @@ const logger = require('../utils/logger');
15
15
  * @param {Object} payload
16
16
  */
17
17
  function emitChannelAuditEvent(eventName, payload) {
18
+ if (process.env.AIFABRIX_CHANNEL_AUDIT !== '1') {
19
+ return;
20
+ }
18
21
  logger.log(
19
22
  JSON.stringify({
20
23
  event: eventName,
@@ -21,7 +21,7 @@ const { resolveDataplaneUrl } = require('../utils/dataplane-resolver');
21
21
  */
22
22
  async function resolveChannelAuthContext(channelTarget, opts = {}) {
23
23
  const controllerUrl = await resolveControllerUrl();
24
- const environment = (await config.getEnvironment()) || 'dev';
24
+ const environment = (await config.resolveEnvironment()) || 'dev';
25
25
  const authConfig = await getDeploymentAuth(controllerUrl, environment, channelTarget);
26
26
  if (!authConfig) {
27
27
  throw new Error('Authentication required. Run "aifabrix login" first.');
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Slack manifest description limits (plan 152).
3
+ *
4
+ * @fileoverview Enforce Slack display_information.description max length
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ /** Slack manifest `display_information.description` max (api.slack.com/reference/manifests). */
12
+ const SLACK_APP_DESCRIPTION_MAX_LENGTH = 140;
13
+
14
+ /**
15
+ * @param {string} description
16
+ * @returns {string}
17
+ */
18
+ function normalizeSlackAppDescription(description) {
19
+ const text = String(description ?? '').trim();
20
+ if (!text || text.length <= SLACK_APP_DESCRIPTION_MAX_LENGTH) {
21
+ return text;
22
+ }
23
+ return `${text.slice(0, SLACK_APP_DESCRIPTION_MAX_LENGTH - 1)}…`;
24
+ }
25
+
26
+ /**
27
+ * @param {string} description
28
+ * @returns {string}
29
+ * @throws {Error}
30
+ */
31
+ function assertSlackAppDescription(description) {
32
+ const text = String(description ?? '').trim();
33
+ if (text.length > SLACK_APP_DESCRIPTION_MAX_LENGTH) {
34
+ throw new Error(
35
+ `Slack app description must be at most ${SLACK_APP_DESCRIPTION_MAX_LENGTH} characters (got ${text.length}). Provide a shorter --description.`
36
+ );
37
+ }
38
+ return text;
39
+ }
40
+
41
+ /**
42
+ * @param {string} channelTarget
43
+ * @param {string} description
44
+ * @returns {string}
45
+ */
46
+ function resolveAppDescription(channelTarget, description) {
47
+ const text = String(description ?? '').trim();
48
+ if (channelTarget === 'slack') {
49
+ return assertSlackAppDescription(text);
50
+ }
51
+ return text;
52
+ }
53
+
54
+ module.exports = {
55
+ SLACK_APP_DESCRIPTION_MAX_LENGTH,
56
+ normalizeSlackAppDescription,
57
+ assertSlackAppDescription,
58
+ resolveAppDescription
59
+ };
@@ -1,9 +1,11 @@
1
1
  /**
2
- * Generate integration/<channelTarget>/ for communication external systems (plan 152).
2
+ * Scaffold integration/<channelTarget>/ from published templates (plan 152).
3
+ * Manifest SSOT: dataplane integration/ (slack via make sync-json) → templates/channels/{target}/integration/.
4
+ * Builder generates only *-deploy.json at scaffold time.
3
5
  *
4
- * @fileoverview Builder generator for channel deploy step 1 scaffolds
6
+ * @fileoverview Channel integration scaffold — template copy + deploy JSON
5
7
  * @author AI Fabrix Team
6
- * @version 1.0.0
8
+ * @version 2.0.0
7
9
  */
8
10
 
9
11
  'use strict';
@@ -12,201 +14,8 @@ const fs = require('fs');
12
14
  const path = require('path');
13
15
  const { getChannelTarget } = require('./channel-targets');
14
16
  const { getIntegrationPath } = require('../utils/paths');
15
-
16
- /** @type {Record<string, Object>} */
17
- const AUTH_BLOCKS = {
18
- slack: {
19
- authType: 'credential',
20
- credential: {
21
- credentialKey: 'slack-app',
22
- displayName: 'Slack assistant channel',
23
- method: 'hmac',
24
- variables: {},
25
- security: {
26
- signingSecret: 'kv://slack/signingSecret',
27
- clientId: 'kv://slack/clientId',
28
- clientSecret: 'kv://slack/clientSecret'
29
- },
30
- writeOnce: true
31
- }
32
- },
33
- 'teams-bot': {
34
- authType: 'credential',
35
- credential: {
36
- credentialKey: 'teams-bot',
37
- displayName: 'Microsoft Teams assistant bot',
38
- method: 'oidc',
39
- variables: {
40
- openIdConfigUrl: 'https://login.botframework.com/v1/.well-known/openid_configuration',
41
- clientId: 'kv://teams-bot/botAppId',
42
- expectedIssuer: 'https://api.botframework.com'
43
- },
44
- security: {},
45
- writeOnce: true
46
- }
47
- },
48
- 'microsoft-copilot': {
49
- authType: 'credential',
50
- credential: {
51
- credentialKey: 'microsoft-copilot-channel',
52
- displayName: 'Microsoft Copilot assistant channel',
53
- method: 'oauth2',
54
- variables: {
55
- tokenUrl: 'https://login.microsoftonline.com/common/oauth2/v2.0/token',
56
- grantType: 'client_credentials'
57
- },
58
- security: {
59
- clientId: 'kv://microsoft-copilot/clientId',
60
- clientSecret: 'kv://microsoft-copilot/clientSecret'
61
- },
62
- writeOnce: true
63
- }
64
- },
65
- chatgpt: {
66
- authType: 'credential',
67
- credential: {
68
- credentialKey: 'chatgpt-channel',
69
- displayName: 'ChatGPT assistant channel',
70
- method: 'apikey',
71
- variables: {},
72
- security: {
73
- apiKey: 'kv://chatgpt/apiKey'
74
- },
75
- writeOnce: true
76
- }
77
- },
78
- 'web-embed': {
79
- authType: 'credential',
80
- credential: {
81
- credentialKey: 'web-embed-channel',
82
- displayName: 'Web embed assistant channel',
83
- method: 'apikey',
84
- variables: {},
85
- security: {
86
- apiKey: 'kv://web-embed/apiKey'
87
- },
88
- writeOnce: true
89
- }
90
- }
91
- };
92
-
93
- /**
94
- * @param {string} channelTarget
95
- * @param {typeof import('./channel-targets').CHANNEL_TARGETS[string]} target
96
- * @returns {Object}
97
- */
98
- function buildAuthenticationBlock(channelTarget, target) {
99
- const block = AUTH_BLOCKS[channelTarget];
100
- if (!block) {
101
- throw new Error(`No authentication block for channel target "${channelTarget}"`);
102
- }
103
- const auth = JSON.parse(JSON.stringify(block));
104
- auth.credential.credentialKey = target.credentialKey;
105
- return auth;
106
- }
107
-
108
- /**
109
- * @param {string} channelTarget
110
- * @returns {Object}
111
- */
112
- function buildSystemJson(channelTarget) {
113
- const target = getChannelTarget(channelTarget);
114
- const system = {
115
- key: channelTarget,
116
- displayName: 'Microsoft Teams assistant bot',
117
- description: 'Bot Framework assistant channel (not full Teams / Graph integration)',
118
- type: 'custom',
119
- systemKind: 'communication',
120
- enabled: true,
121
- authentication: buildAuthenticationBlock(channelTarget, target),
122
- configuration: [],
123
- dataSources: []
124
- };
125
-
126
- if (channelTarget === 'teams-bot') {
127
- system.displayName = 'Microsoft Teams assistant bot';
128
- system.endpoints = [
129
- {
130
- type: 'messages',
131
- path: '/messages',
132
- router: 'teams_bot_router',
133
- description: 'Bot Framework messaging endpoint',
134
- active: true
135
- },
136
- {
137
- type: 'notifications',
138
- path: '/notifications',
139
- router: 'teams_notifications_router',
140
- description: 'Proactive notification endpoint',
141
- active: true
142
- },
143
- {
144
- type: 'config',
145
- path: '/bot-config',
146
- router: 'teams_config_router',
147
- description: 'Bot configuration endpoint',
148
- active: true
149
- }
150
- ];
151
- system.endpointsActive = true;
152
- } else {
153
- system.displayName = `${target.key} assistant channel`;
154
- system.description = 'Communication external system for assistant channel install (plan 152)';
155
- }
156
-
157
- return system;
158
- }
159
-
160
- /**
161
- * @param {string} channelTarget
162
- * @returns {Object}
163
- */
164
- function buildApplicationJson(channelTarget) {
165
- const target = getChannelTarget(channelTarget);
166
- const systemFile = `${channelTarget}-system.json`;
167
- return {
168
- app: {
169
- key: channelTarget,
170
- displayName: `${target.key} assistant channel`,
171
- description: 'Assistant communication channel — deploy then app add-channel',
172
- type: 'external'
173
- },
174
- externalIntegration: {
175
- schemaBasePath: './',
176
- systems: [systemFile],
177
- dataSources: [],
178
- autopublish: true,
179
- version: '1.0.0'
180
- }
181
- };
182
- }
183
-
184
- /**
185
- * @param {string} channelTarget
186
- * @returns {string}
187
- */
188
- function buildEnvTemplate(channelTarget) {
189
- const kvPrefix = channelTarget === 'web-embed' ? 'web-embed' : channelTarget;
190
- const lines = [
191
- `# ${channelTarget} assistant channel — resolve secrets before deploy/add-channel`,
192
- '# kv:// paths are pushed via aifabrix credential push or add-channel secret sync',
193
- ''
194
- ];
195
- if (channelTarget === 'slack') {
196
- lines.push('KV_SLACK_SIGNINGSECRET=kv://slack/signingSecret');
197
- lines.push('KV_SLACK_CLIENTID=kv://slack/clientId');
198
- lines.push('KV_SLACK_CLIENTSECRET=kv://slack/clientSecret');
199
- } else if (channelTarget === 'teams-bot') {
200
- lines.push('KV_TEAMS_BOT_BOTAPPID=kv://teams-bot/botAppId');
201
- } else if (channelTarget === 'microsoft-copilot') {
202
- lines.push('KV_MICROSOFT_COPILOT_CLIENTID=kv://microsoft-copilot/clientId');
203
- lines.push('KV_MICROSOFT_COPILOT_CLIENTSECRET=kv://microsoft-copilot/clientSecret');
204
- } else {
205
- lines.push(`KV_${kvPrefix.toUpperCase().replace(/-/g, '_')}_APIKEY=kv://${kvPrefix}/apiKey`);
206
- }
207
- lines.push('');
208
- return lines.join('\n');
209
- }
17
+ const { copyChannelIntegrationTemplate } = require('./channel-integration-template');
18
+ const { generateDeployJson } = require('../generator/index');
210
19
 
211
20
  /**
212
21
  * @param {string} channelTarget
@@ -214,9 +23,9 @@ function buildEnvTemplate(channelTarget) {
214
23
  * @param {boolean} [options.force]
215
24
  * @param {boolean} [options.allowExperimental]
216
25
  * @param {string} [options.projectRoot]
217
- * @returns {{ integrationDir: string, files: string[] }}
26
+ * @returns {Promise<{ integrationDir: string, files: string[] }>}
218
27
  */
219
- function scaffoldChannelIntegration(channelTarget, options = {}) {
28
+ async function scaffoldChannelIntegration(channelTarget, options = {}) {
220
29
  const target = getChannelTarget(channelTarget);
221
30
  if (target.experimental && !options.allowExperimental) {
222
31
  throw new Error(
@@ -233,42 +42,16 @@ function scaffoldChannelIntegration(channelTarget, options = {}) {
233
42
  );
234
43
  }
235
44
 
236
- fs.mkdirSync(integrationDir, { recursive: true });
237
- const systemPath = path.join(integrationDir, `${channelTarget}-system.json`);
238
- const appPath = path.join(integrationDir, 'application.json');
239
- const envPath = path.join(integrationDir, 'env.template');
240
- const readmePath = path.join(integrationDir, 'README.md');
241
-
242
- fs.writeFileSync(systemPath, `${JSON.stringify(buildSystemJson(channelTarget), null, 2)}\n`, 'utf8');
243
- fs.writeFileSync(appPath, `${JSON.stringify(buildApplicationJson(channelTarget), null, 2)}\n`, 'utf8');
244
- fs.writeFileSync(envPath, buildEnvTemplate(channelTarget), 'utf8');
245
- fs.writeFileSync(
246
- readmePath,
247
- [
248
- `# ${channelTarget} assistant channel`,
249
- '',
250
- '## Two-step install',
251
- '',
252
- '```bash',
253
- `aifabrix deploy ${channelTarget}`,
254
- `aifabrix app add-channel ${channelTarget} --name "Your Assistant"`,
255
- '```',
256
- '',
257
- 'Generated by `aifabrix channel scaffold`. Secrets belong in kv:// env.template only.',
258
- ''
259
- ].join('\n'),
260
- 'utf8'
261
- );
45
+ const copied = copyChannelIntegrationTemplate(channelTarget, integrationDir);
46
+ const deployPath = await generateDeployJson(channelTarget, { appPath: integrationDir });
47
+ const files = [...copied, deployPath];
262
48
 
263
49
  return {
264
50
  integrationDir,
265
- files: [systemPath, appPath, envPath, readmePath]
51
+ files
266
52
  };
267
53
  }
268
54
 
269
55
  module.exports = {
270
- buildSystemJson,
271
- buildApplicationJson,
272
- buildEnvTemplate,
273
56
  scaffoldChannelIntegration
274
57
  };