@aifabrix/builder 2.53.1 → 2.55.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 (470) hide show
  1. package/README.md +8 -0
  2. package/bin/aifabrix.js +2 -2
  3. package/lib/agent-kit/apply-ops.js +82 -0
  4. package/lib/agent-kit/checksums.js +28 -0
  5. package/lib/agent-kit/classify.js +113 -0
  6. package/lib/agent-kit/claude-shim.js +61 -0
  7. package/lib/agent-kit/constants.js +55 -0
  8. package/lib/agent-kit/file-list.js +103 -0
  9. package/lib/agent-kit/host-approve.js +130 -0
  10. package/lib/agent-kit/hosting/github.js +63 -0
  11. package/lib/agent-kit/hosts.js +71 -0
  12. package/lib/agent-kit/init.js +319 -0
  13. package/lib/agent-kit/kit-root.js +17 -0
  14. package/lib/agent-kit/managed-section.js +79 -0
  15. package/lib/agent-kit/package-load.js +45 -0
  16. package/lib/agent-kit/plan-ops.js +69 -0
  17. package/lib/agent-kit/remote-prompts.js +239 -0
  18. package/lib/agent-kit/render-host-markdown.js +40 -0
  19. package/lib/agent-kit/repo-guard.js +47 -0
  20. package/lib/agent-kit/report.js +107 -0
  21. package/lib/agent-kit/run.js +82 -0
  22. package/lib/agent-kit/scm/git.js +122 -0
  23. package/lib/agent-kit/state-file.js +83 -0
  24. package/lib/agent-kit/status.js +50 -0
  25. package/lib/agent-kit/v1-detect.js +81 -0
  26. package/lib/agent-kit/validate-kit.js +87 -0
  27. package/lib/agent-kit/workspace-name.js +40 -0
  28. package/lib/agent-kit/workspace-skeleton.js +103 -0
  29. package/lib/api/assistants.api.js +8 -5
  30. package/lib/api/channel-identity.api.js +41 -0
  31. package/lib/api/evidence-authoring.api.js +5 -1
  32. package/lib/api/evidence.api.js +2 -0
  33. package/lib/api/role-assistant-test-pack.api.js +86 -0
  34. package/lib/api/types/evidence.types.js +2 -0
  35. package/lib/api/work-search.api.js +163 -0
  36. package/lib/api/work.api.js +19 -12
  37. package/lib/app/list-external-systems.js +2 -1
  38. package/lib/app/show-display.js +33 -6
  39. package/lib/app/show.js +25 -2
  40. package/lib/channels/add-channel.js +164 -126
  41. package/lib/channels/approval-guides/chatgpt.js +14 -18
  42. package/lib/channels/approval-guides/claude.js +29 -0
  43. package/lib/channels/approval-guides/index.js +88 -22
  44. package/lib/channels/approval-guides/mcp-client.js +27 -0
  45. package/lib/channels/approval-guides/microsoft-copilot.js +52 -3
  46. package/lib/channels/approval-guides/slack.js +10 -10
  47. package/lib/channels/approval-guides/teams-bot.js +8 -12
  48. package/lib/channels/channel-add-continuations.js +91 -0
  49. package/lib/channels/channel-add-ensure.js +124 -27
  50. package/lib/channels/channel-add-existing.js +160 -28
  51. package/lib/channels/channel-add-failure.js +61 -0
  52. package/lib/channels/channel-add-remaining.js +492 -0
  53. package/lib/channels/channel-add-tty.js +190 -0
  54. package/lib/channels/channel-add-wizard-config.js +138 -0
  55. package/lib/channels/channel-add-wizard.js +250 -0
  56. package/lib/channels/channel-artifact-generator.js +27 -13
  57. package/lib/channels/channel-cardinality.js +83 -0
  58. package/lib/channels/channel-catalog-icon.js +45 -0
  59. package/lib/channels/channel-cli-instructions.js +75 -0
  60. package/lib/channels/channel-configuration-map.js +213 -0
  61. package/lib/channels/channel-credential.js +11 -14
  62. package/lib/channels/channel-definition-project.js +101 -0
  63. package/lib/channels/channel-definition-registry.js +154 -0
  64. package/lib/channels/channel-definition-status.js +115 -0
  65. package/lib/channels/channel-description.js +60 -2
  66. package/lib/channels/channel-discovery.js +16 -2
  67. package/lib/channels/channel-external-system.js +86 -9
  68. package/lib/channels/channel-install-envelope-actions.js +88 -0
  69. package/lib/channels/channel-install-envelope-microsoft.js +155 -0
  70. package/lib/channels/channel-install-envelope.js +358 -0
  71. package/lib/channels/channel-install-help-md.js +172 -0
  72. package/lib/channels/channel-install-http-payload.js +62 -0
  73. package/lib/channels/channel-install-inventory.js +115 -0
  74. package/lib/channels/channel-install-profiles.js +90 -0
  75. package/lib/channels/channel-instance-collision.js +118 -0
  76. package/lib/channels/channel-instance-key.js +100 -0
  77. package/lib/channels/channel-instance-materialize.js +240 -0
  78. package/lib/channels/channel-integration-generator.js +18 -9
  79. package/lib/channels/channel-integration-template.js +101 -22
  80. package/lib/channels/channel-inventory-fetch.js +79 -0
  81. package/lib/channels/channel-oauth-preflight.js +104 -0
  82. package/lib/channels/channel-package-version.js +76 -0
  83. package/lib/channels/channel-predefined-client.js +154 -0
  84. package/lib/channels/channel-probe.js +7 -2
  85. package/lib/channels/channel-runtime-resolver.js +194 -72
  86. package/lib/channels/channel-status-display.js +86 -16
  87. package/lib/channels/channel-targets.js +132 -92
  88. package/lib/channels/chatgpt-callback.js +318 -0
  89. package/lib/channels/chatgpt-channel-add.js +229 -0
  90. package/lib/channels/chatgpt-preflight.js +396 -0
  91. package/lib/channels/chatgpt-runtime-contract.js +17 -0
  92. package/lib/channels/chatgpt-setup-values.js +124 -0
  93. package/lib/channels/claude-callback.js +67 -0
  94. package/lib/channels/claude-channel-add.js +254 -0
  95. package/lib/channels/claude-runtime-contract.js +40 -0
  96. package/lib/channels/claude-runtime.js +58 -0
  97. package/lib/channels/claude-setup-values.js +92 -0
  98. package/lib/channels/mcp-client/config-merge.js +148 -0
  99. package/lib/channels/mcp-client/ensure-client.js +231 -0
  100. package/lib/channels/mcp-client/paths.js +53 -0
  101. package/lib/channels/mcp-client/profiles.js +122 -0
  102. package/lib/channels/mcp-client/redirect-uris.js +99 -0
  103. package/lib/channels/mcp-client/runtime.js +59 -0
  104. package/lib/channels/mcp-client-channel-add.js +186 -0
  105. package/lib/channels/microsoft-copilot-channel-add.js +117 -7
  106. package/lib/channels/microsoft-copilot-entra-identifier-uris.js +187 -0
  107. package/lib/channels/microsoft-copilot-entra-sso-form.js +106 -18
  108. package/lib/channels/microsoft-copilot-entra-sso.js +31 -2
  109. package/lib/channels/microsoft-copilot-package-prior.js +107 -0
  110. package/lib/channels/microsoft-copilot-package.js +29 -28
  111. package/lib/channels/microsoft-provisioning/a365.js +80 -0
  112. package/lib/channels/microsoft-provisioning/auth-config.js +240 -0
  113. package/lib/channels/microsoft-provisioning/auth.js +179 -0
  114. package/lib/channels/microsoft-provisioning/cli.js +71 -0
  115. package/lib/channels/microsoft-provisioning/constants.js +75 -0
  116. package/lib/channels/microsoft-provisioning/errors.js +117 -0
  117. package/lib/channels/microsoft-provisioning/index.js +55 -0
  118. package/lib/channels/microsoft-provisioning/install-atk.js +158 -0
  119. package/lib/channels/microsoft-provisioning/install-teams.js +115 -0
  120. package/lib/channels/microsoft-provisioning/login-portal-device.js +236 -0
  121. package/lib/channels/microsoft-provisioning/login-portal-parse.js +71 -0
  122. package/lib/channels/microsoft-provisioning/login-portal-teams.js +193 -0
  123. package/lib/channels/microsoft-provisioning/login-portal.js +230 -0
  124. package/lib/channels/microsoft-provisioning/persist.js +110 -0
  125. package/lib/channels/microsoft-provisioning/teams-bot-args.js +119 -0
  126. package/lib/channels/microsoft-provisioning/teams-bot-controller.js +123 -0
  127. package/lib/channels/microsoft-provisioning/teams-bot-parse.js +134 -0
  128. package/lib/channels/microsoft-provisioning/teams-bot-persist.js +113 -0
  129. package/lib/channels/microsoft-provisioning/teams-bot-provision.js +234 -0
  130. package/lib/channels/microsoft-provisioning/teams-bot-secrets.js +45 -0
  131. package/lib/channels/microsoft-provisioning/teams-cli.js +82 -0
  132. package/lib/channels/runtime-tool-catalog.js +5 -2
  133. package/lib/channels/slack-channel-add-portal.js +130 -0
  134. package/lib/channels/slack-channel-add-tty-auth.js +95 -0
  135. package/lib/channels/slack-channel-add.js +311 -0
  136. package/lib/channels/slack-mcp-callback.js +51 -0
  137. package/lib/channels/slack-mcp-runtime.js +156 -0
  138. package/lib/channels/slack-provisioning/apps.js +181 -0
  139. package/lib/channels/slack-provisioning/auth-store.js +110 -0
  140. package/lib/channels/slack-provisioning/auth-ticket.js +185 -0
  141. package/lib/channels/slack-provisioning/auth.js +115 -0
  142. package/lib/channels/slack-provisioning/callbacks.js +41 -0
  143. package/lib/channels/slack-provisioning/cli.js +226 -0
  144. package/lib/channels/slack-provisioning/constants.js +37 -0
  145. package/lib/channels/slack-provisioning/credentials.js +169 -0
  146. package/lib/channels/slack-provisioning/curl-shim.js +132 -0
  147. package/lib/channels/slack-provisioning/developer-install.js +118 -0
  148. package/lib/channels/slack-provisioning/env-file.js +120 -0
  149. package/lib/channels/slack-provisioning/errors.js +47 -0
  150. package/lib/channels/slack-provisioning/go-ca-bundle.js +137 -0
  151. package/lib/channels/slack-provisioning/index.js +250 -0
  152. package/lib/channels/slack-provisioning/install-cli.js +335 -0
  153. package/lib/channels/slack-provisioning/manifest.js +89 -0
  154. package/lib/channels/slack-provisioning/oauth-lock.js +33 -0
  155. package/lib/channels/slack-provisioning/offer-cli.js +113 -0
  156. package/lib/channels/slack-provisioning/onboard-members.js +122 -0
  157. package/lib/channels/slack-provisioning/onboard.js +89 -0
  158. package/lib/channels/slack-provisioning/persist.js +95 -0
  159. package/lib/channels/slack-provisioning/remaining-urls.js +158 -0
  160. package/lib/channels/slack-provisioning/with-curl-on-path.js +53 -0
  161. package/lib/channels/teams-bot-channel-add.js +94 -0
  162. package/lib/channels/vendor-dataplane-url.js +249 -0
  163. package/lib/cli/index.js +4 -0
  164. package/lib/cli/setup-certification-commands.js +2 -2
  165. package/lib/cli/setup-certification.help.js +5 -1
  166. package/lib/cli/setup-external-system-help.js +2 -0
  167. package/lib/cli/setup-external-system.js +1 -1
  168. package/lib/commands/agent-kit-help.js +79 -0
  169. package/lib/commands/agent-kit.js +346 -0
  170. package/lib/commands/channel-add-help.js +366 -0
  171. package/lib/commands/channel-add-setup.js +162 -80
  172. package/lib/commands/channel-configure.js +118 -0
  173. package/lib/commands/channel.js +10 -1
  174. package/lib/commands/datasource-capability-relate-cli.js +5 -4
  175. package/lib/commands/governance-upload-external.js +6 -3
  176. package/lib/commands/lifecycle-command-action.js +2 -5
  177. package/lib/commands/lifecycle-external.js +93 -21
  178. package/lib/commands/repair-auth-apply.js +1 -1
  179. package/lib/commands/repair-datasource-key-skip.js +39 -0
  180. package/lib/commands/repair-datasource-keys.js +24 -12
  181. package/lib/commands/repair-datasource-test-payload.js +4 -2
  182. package/lib/commands/repair-datasource-webhooks-sync-bridge.js +23 -2
  183. package/lib/commands/repair-datasource.js +3 -0
  184. package/lib/commands/repair-external-run.js +59 -25
  185. package/lib/commands/repair-openapi-rest-runtime.js +127 -0
  186. package/lib/commands/repair-orchestration-tag-merge.js +339 -0
  187. package/lib/commands/repair-rbac-catalog-defaults.js +96 -0
  188. package/lib/commands/repair-rbac-platform-preset.js +26 -15
  189. package/lib/commands/repair-rbac-reader-roles.js +8 -21
  190. package/lib/commands/repair-rbac.js +26 -44
  191. package/lib/commands/repair-system-permissions.js +24 -22
  192. package/lib/commands/role-assistant-copy-output.js +61 -0
  193. package/lib/commands/role-assistant-copy.js +155 -0
  194. package/lib/commands/role-assistant-test-output.js +22 -9
  195. package/lib/commands/role-assistant-test-result-rows.js +42 -0
  196. package/lib/commands/role-assistant.js +150 -43
  197. package/lib/commands/search.js +143 -0
  198. package/lib/commands/test-e2e-external.js +148 -21
  199. package/lib/commands/test-trust-external.js +7 -5
  200. package/lib/commands/upload-credential-push-log.js +2 -1
  201. package/lib/commands/upload-publish-context.js +1 -1
  202. package/lib/commands/upload-role-assistant-shell.js +124 -0
  203. package/lib/commands/upload-sidecar-followups.js +10 -4
  204. package/lib/commands/upload.js +18 -3
  205. package/lib/commands/verify-operations-skip-e2e.js +131 -0
  206. package/lib/commands/verify-operations-step-plan.js +6 -33
  207. package/lib/commands/verify-operations-steps.js +3 -1
  208. package/lib/core/secrets-docker-env.js +4 -1
  209. package/lib/core/secrets-env-content.js +17 -3
  210. package/lib/datasource/capability/capability-manifest.js +0 -3
  211. package/lib/datasource/capability/copy-test-payload.js +3 -0
  212. package/lib/datasource/capability/relate-operations.js +28 -10
  213. package/lib/datasource/capability/run-capability-relate.js +48 -25
  214. package/lib/datasource/datasource-identifier.js +13 -5
  215. package/lib/deployment/deployer-poll-run.js +117 -35
  216. package/lib/external-system/deploy-dataplane-published.js +70 -0
  217. package/lib/external-system/deploy-helpers.js +26 -1
  218. package/lib/external-system/deploy.js +22 -8
  219. package/lib/external-system/download-helpers.js +29 -2
  220. package/lib/external-system/download-role-assistant.js +109 -4
  221. package/lib/external-system/download.js +46 -30
  222. package/lib/external-system/sync-deploy-manifest.js +3 -2
  223. package/lib/external-system/upload-identity.js +42 -0
  224. package/lib/generator/index.js +19 -15
  225. package/lib/generator/split.js +13 -2
  226. package/lib/generator/wizard-datasource-key.js +54 -0
  227. package/lib/generator/wizard.js +55 -54
  228. package/lib/integration-definition/apply-datasource-keys.js +75 -0
  229. package/lib/integration-definition/apply-relationships.js +195 -0
  230. package/lib/integration-definition/apply-static-enterprise.js +229 -0
  231. package/lib/integration-definition/apply-system-file.js +71 -0
  232. package/lib/integration-definition/apply-test-endpoint.js +89 -0
  233. package/lib/integration-definition/apply-viewpoint-defaults.js +157 -0
  234. package/lib/integration-definition/apply.js +78 -59
  235. package/lib/integration-definition/enrich-openapi-operations.js +36 -10
  236. package/lib/integration-definition/enrich-openapi-pick.js +87 -0
  237. package/lib/lifecycle/role-assistant-governance.js +181 -0
  238. package/lib/lifecycle/scenario-upload.js +181 -30
  239. package/lib/programmatic/builder-api-cors.js +143 -0
  240. package/lib/programmatic/builder-api-request.js +6 -0
  241. package/lib/programmatic/builder-api-route-dispatch.js +56 -42
  242. package/lib/programmatic/builder-api-server.js +8 -1
  243. package/lib/programmatic/capability-registry.js +55 -0
  244. package/lib/programmatic/channel-install-help-resolve.js +359 -0
  245. package/lib/programmatic/channel-install-session.js +218 -0
  246. package/lib/programmatic/help-content/channel-onboarding.md +2 -0
  247. package/lib/programmatic/help-content/cip-overview.md +3 -1
  248. package/lib/programmatic/http-raw-response.js +62 -0
  249. package/lib/programmatic/index.js +2 -0
  250. package/lib/programmatic/openapi-apply-result-schemas.js +8 -0
  251. package/lib/programmatic/openapi-channel-install-bindings.js +179 -0
  252. package/lib/programmatic/openapi-channel-install-schemas.js +289 -0
  253. package/lib/programmatic/openapi-component-schemas.js +19 -1
  254. package/lib/programmatic/openapi-description-enricher.js +3 -1
  255. package/lib/programmatic/openapi-descriptions.js +80 -3
  256. package/lib/programmatic/openapi-envelope-examples.js +124 -0
  257. package/lib/programmatic/openapi-operation-bindings.js +9 -1
  258. package/lib/programmatic/openapi-request-schemas.js +5 -0
  259. package/lib/programmatic/openapi-schema-descriptions-channel.js +319 -0
  260. package/lib/programmatic/openapi-schema-descriptions-operations.js +19 -0
  261. package/lib/programmatic/openapi-spec.js +13 -8
  262. package/lib/programmatic/platform-rbac-catalog.js +36 -18
  263. package/lib/programmatic/request-timeout.js +3 -0
  264. package/lib/programmatic/route-handler-map.js +58 -1
  265. package/lib/programmatic/route-handlers-context.js +2 -1
  266. package/lib/programmatic/run-auth-permissions.js +54 -0
  267. package/lib/programmatic/run-channel-catalog.js +238 -0
  268. package/lib/programmatic/run-channel-install-artifacts.js +137 -0
  269. package/lib/programmatic/run-channel-install-copilot.js +353 -0
  270. package/lib/programmatic/run-channel-install-options.js +236 -0
  271. package/lib/programmatic/run-channel-install-teams-bot.js +204 -0
  272. package/lib/programmatic/run-channel-install.js +346 -0
  273. package/lib/programmatic/run-channel-package.js +87 -7
  274. package/lib/programmatic/run-download.js +41 -0
  275. package/lib/programmatic/workspace-context.js +2 -0
  276. package/lib/protection/auth-context.js +3 -1
  277. package/lib/protection/protection-display.js +3 -2
  278. package/lib/protection/report-exit.js +50 -0
  279. package/lib/protection/run-commands.js +2 -0
  280. package/lib/role-assistant/evidence-sync.js +4 -2
  281. package/lib/role-assistant/evidence-validation-issues.js +51 -0
  282. package/lib/role-assistant/knowledge-sync.js +10 -4
  283. package/lib/role-assistant/package-validate.js +175 -0
  284. package/lib/role-assistant/settings.js +49 -2
  285. package/lib/role-assistant/test-case-assertion-row.js +36 -0
  286. package/lib/role-assistant/test-case-copy-bind.js +77 -0
  287. package/lib/role-assistant/test-case-copy-expected.js +127 -0
  288. package/lib/role-assistant/test-case-copy-from-work.js +90 -0
  289. package/lib/role-assistant/test-case-copy-interactions.js +67 -0
  290. package/lib/role-assistant/test-case-copy.js +119 -0
  291. package/lib/role-assistant/test-case-expected-catalog.js +135 -0
  292. package/lib/role-assistant/test-case-validate.js +88 -0
  293. package/lib/role-assistant/test-cases-bid.js +117 -4
  294. package/lib/role-assistant/test-cases-evaluate.js +159 -24
  295. package/lib/role-assistant/test-cases-evidence.js +175 -0
  296. package/lib/role-assistant/test-cases-honesty.js +155 -6
  297. package/lib/role-assistant/test-cases-lifecycle.js +291 -0
  298. package/lib/role-assistant/test-cases-search-graph.js +122 -0
  299. package/lib/role-assistant/test-cases-search.js +247 -0
  300. package/lib/role-assistant/test-cases.js +71 -172
  301. package/lib/role-assistant/test-pack-map.js +180 -0
  302. package/lib/role-assistant/test-pack-sync.js +187 -0
  303. package/lib/role-assistant/test-runner-debug.js +54 -0
  304. package/lib/role-assistant/test-runner-respond-body.js +36 -0
  305. package/lib/role-assistant/test-runner-search.js +164 -0
  306. package/lib/role-assistant/test-runner-start-payload.js +63 -10
  307. package/lib/role-assistant/test-runner-workhub-answers.js +45 -16
  308. package/lib/role-assistant/test-runner-workhub-helpers.js +40 -2
  309. package/lib/role-assistant/test-runner-workhub-soft.js +9 -3
  310. package/lib/role-assistant/test-runner-workhub.js +74 -32
  311. package/lib/role-assistant/test-runner.js +66 -11
  312. package/lib/schema/external-datasource.schema.json +146 -21
  313. package/lib/schema/external-system.schema.json +177 -2
  314. package/lib/schema/mcp-client-profile.schema.json +103 -0
  315. package/lib/schema/role-assistant-test-case.schema.json +408 -0
  316. package/lib/search/dataplane-context.js +23 -0
  317. package/lib/search/search-args.js +211 -0
  318. package/lib/search/search-display.js +238 -0
  319. package/lib/search/search-errors.js +50 -0
  320. package/lib/search/search-prompts.js +119 -0
  321. package/lib/search/search-roles.js +85 -0
  322. package/lib/search/search-run.js +241 -0
  323. package/lib/search/search-skills.js +198 -0
  324. package/lib/utils/app-path-resolve.js +4 -0
  325. package/lib/utils/authentication-env-template.js +44 -6
  326. package/lib/utils/authentication-slot-show.js +153 -0
  327. package/lib/utils/credential-display.js +43 -1
  328. package/lib/utils/credential-secrets-env.js +6 -1
  329. package/lib/utils/env-copy.js +19 -7
  330. package/lib/utils/external-env-template.js +20 -2
  331. package/lib/utils/external-system-readiness-compact-blocks.js +5 -1
  332. package/lib/utils/external-system-readiness-compact-display.js +30 -1
  333. package/lib/utils/external-system-validators.js +2 -1
  334. package/lib/utils/help-builder.js +3 -1
  335. package/lib/utils/paths.js +18 -1
  336. package/lib/utils/platform-shell-package.js +69 -0
  337. package/lib/utils/port-resolver.js +50 -1
  338. package/lib/utils/rewrite-name-flag.js +20 -0
  339. package/lib/utils/role-assistant-paths.js +13 -10
  340. package/lib/utils/schema-loader.js +37 -0
  341. package/lib/utils/schema-resolver.js +11 -1
  342. package/lib/utils/secrets-helpers.js +12 -21
  343. package/lib/utils/token-manager.js +10 -5
  344. package/lib/validation/validate-external-file.js +5 -1
  345. package/lib/validation/validate.js +41 -0
  346. package/package.json +1 -1
  347. package/templates/README.md +1 -1
  348. package/templates/agent-kit/adapters/claude/nested.CLAUDE.md +1 -0
  349. package/templates/agent-kit/adapters/claude/root.CLAUDE.md +5 -0
  350. package/templates/agent-kit/adapters/cursor/commands/cust-0-plan.md +5 -0
  351. package/templates/agent-kit/adapters/cursor/commands/cust-1-validate.md +5 -0
  352. package/templates/agent-kit/adapters/cursor/commands/cust-2-build.md +5 -0
  353. package/templates/agent-kit/adapters/cursor/commands/cust-3-push.md +5 -0
  354. package/templates/agent-kit/adapters/cursor/commands/cust-biz-1-validate.md +5 -0
  355. package/templates/agent-kit/adapters/cursor/commands/cust-biz-2-build.md +5 -0
  356. package/templates/agent-kit/adapters/cursor/commands/cust-biz-3-prove.md +5 -0
  357. package/templates/agent-kit/agent-kit.yaml +45 -0
  358. package/templates/agent-kit/instructions/AGENTKIT.md +83 -0
  359. package/templates/agent-kit/instructions/integration.AGENTS.md +25 -0
  360. package/templates/agent-kit/instructions/role-assistant.AGENTS.md +22 -0
  361. package/templates/agent-kit/instructions/root.AGENTS.md +37 -0
  362. package/templates/agent-kit/parity-inventory.yaml +188 -0
  363. package/templates/agent-kit/skills/aifabrix-connected-system/SKILL.md +58 -0
  364. package/templates/agent-kit/skills/aifabrix-connected-system/references/contract-checklist.md +40 -0
  365. package/templates/agent-kit/skills/aifabrix-connected-system/references/delivery-gates.md +54 -0
  366. package/templates/agent-kit/skills/aifabrix-connected-system/references/production-safety.md +35 -0
  367. package/templates/agent-kit/skills/aifabrix-connected-system/scripts/reserved-system-key.js +19 -0
  368. package/templates/agent-kit/skills/aifabrix-plan/SKILL.md +51 -0
  369. package/templates/agent-kit/skills/aifabrix-plan/references/challenge-checklist.md +108 -0
  370. package/templates/agent-kit/skills/aifabrix-plan/references/interaction.md +34 -0
  371. package/templates/agent-kit/skills/aifabrix-plan/references/plan-template.md +182 -0
  372. package/templates/agent-kit/skills/aifabrix-prove/SKILL.md +50 -0
  373. package/templates/agent-kit/skills/aifabrix-prove/references/demo-template.md +65 -0
  374. package/templates/agent-kit/skills/aifabrix-prove/references/evidence-lifecycle.md +68 -0
  375. package/templates/agent-kit/skills/aifabrix-prove/references/learning-template.md +66 -0
  376. package/templates/agent-kit/skills/aifabrix-role-assistant/SKILL.md +42 -0
  377. package/templates/agent-kit/skills/aifabrix-role-assistant/references/package-boundary.md +21 -0
  378. package/templates/agent-kit/skills/shared/hosts.md +78 -0
  379. package/templates/agent-kit/workspace/.cursor/plans/README.md +22 -0
  380. package/templates/agent-kit/workspace/LICENSE.mit +21 -0
  381. package/templates/agent-kit/workspace/README.md +89 -0
  382. package/templates/applications/builder-api/Dockerfile +3 -1
  383. package/templates/applications/builder-api/env.template +7 -0
  384. package/templates/applications/dataplane/application.yaml +6 -5
  385. package/templates/applications/dataplane/env.template +2 -2
  386. package/templates/applications/dataplane/rbac.yaml +35 -2
  387. package/templates/applications/keycloak/Dockerfile +30 -4
  388. package/templates/applications/keycloak/application.yaml +2 -2
  389. package/templates/applications/keycloak/cimd-lenient-parse/AbstractClientIdMetadataDocumentExecutor.java +896 -0
  390. package/templates/applications/keycloak/cimd-lenient-parse/SOURCE.md +19 -0
  391. package/templates/applications/keycloak/env.template +3 -0
  392. package/templates/applications/miso-controller/application.yaml +1 -2
  393. package/templates/applications/miso-controller/env.template +10 -9
  394. package/templates/channels/README.md +5 -5
  395. package/templates/channels/chatgpt/TROUBLESHOOTING.md +51 -0
  396. package/templates/channels/chatgpt/channel.json +59 -0
  397. package/templates/channels/chatgpt/icon.svg +1 -0
  398. package/templates/channels/chatgpt/install.template.md.hbs +20 -95
  399. package/templates/channels/chatgpt/integration/README.md +1 -1
  400. package/templates/channels/chatgpt/integration/application.json +2 -2
  401. package/templates/channels/chatgpt/integration/chatgpt-system.json +49 -4
  402. package/templates/channels/chatgpt/integration/env.template +2 -4
  403. package/templates/channels/chatgpt/integration/rbac.json +13 -0
  404. package/templates/channels/claude/TROUBLESHOOTING.md +44 -0
  405. package/templates/channels/claude/channel.json +59 -0
  406. package/templates/channels/claude/icon.svg +1 -0
  407. package/templates/channels/claude/install.template.md.hbs +22 -0
  408. package/templates/channels/claude/integration/README.md +14 -0
  409. package/templates/channels/claude/integration/application.json +15 -0
  410. package/templates/channels/claude/integration/claude-system.json +59 -0
  411. package/templates/channels/claude/integration/env.template +2 -0
  412. package/templates/channels/claude/integration/rbac.json +13 -0
  413. package/templates/channels/claude/manifest.template.json.hbs +40 -0
  414. package/templates/channels/mcp-client/channel.json +72 -0
  415. package/templates/channels/mcp-client/icon.svg +1 -0
  416. package/templates/channels/mcp-client/install.template.md.hbs +24 -0
  417. package/templates/channels/mcp-client/integration/README.md +13 -0
  418. package/templates/channels/mcp-client/integration/application.json +15 -0
  419. package/templates/channels/mcp-client/integration/env.template +2 -0
  420. package/templates/channels/mcp-client/integration/mcp-client-system.json +72 -0
  421. package/templates/channels/mcp-client/integration/rbac.json +13 -0
  422. package/templates/channels/mcp-client/manifest.template.json.hbs +41 -0
  423. package/templates/channels/mcp-client/profiles/cursor.json +26 -0
  424. package/templates/channels/mcp-client/profiles/github-copilot.json +29 -0
  425. package/templates/channels/mcp-client/profiles/vscode.json +29 -0
  426. package/templates/channels/microsoft-copilot/channel.json +73 -0
  427. package/templates/channels/microsoft-copilot/declarative-agent.template.json.hbs +8 -4
  428. package/templates/channels/microsoft-copilot/entra-sso-registration.template.md.hbs +65 -5
  429. package/templates/channels/microsoft-copilot/icon.svg +1 -0
  430. package/templates/channels/microsoft-copilot/install.template.md.hbs +9 -9
  431. package/templates/channels/microsoft-copilot/integration/README.md +1 -1
  432. package/templates/channels/microsoft-copilot/integration/application.json +2 -2
  433. package/templates/channels/microsoft-copilot/integration/env.template +3 -6
  434. package/templates/channels/microsoft-copilot/integration/microsoft-copilot-system.json +63 -4
  435. package/templates/channels/microsoft-copilot/integration/rbac.json +13 -0
  436. package/templates/channels/microsoft-copilot/oauth-plugin-vault-required.template.md.hbs +5 -5
  437. package/templates/channels/slack/channel.json +234 -0
  438. package/templates/channels/slack/icon.svg +1 -0
  439. package/templates/channels/slack/install.template.md.hbs +45 -28
  440. package/templates/channels/slack/integration/README.md +245 -22
  441. package/templates/channels/slack/integration/application.json +44 -7
  442. package/templates/channels/slack/integration/env.template +15 -6
  443. package/templates/channels/slack/integration/openapi/openapi.json +126 -0
  444. package/templates/channels/slack/integration/rbac.json +84 -0
  445. package/templates/channels/slack/integration/slack-datasource-commands.json +154 -0
  446. package/templates/channels/slack/integration/slack-datasource-conversations.json +28 -3
  447. package/templates/channels/slack/integration/slack-datasource-events.json +154 -0
  448. package/templates/channels/slack/integration/slack-datasource-interactive.json +154 -0
  449. package/templates/channels/slack/integration/slack-datasource-messages.json +40 -2
  450. package/templates/channels/slack/integration/slack-system.json +161 -72
  451. package/templates/channels/slack/manifest.template.json.hbs +10 -4
  452. package/templates/channels/teams-bot/channel.json +162 -0
  453. package/templates/channels/teams-bot/icon.svg +1 -0
  454. package/templates/channels/teams-bot/install.template.md.hbs +12 -13
  455. package/templates/channels/teams-bot/integration/README.md +5 -4
  456. package/templates/channels/teams-bot/integration/application.json +6 -4
  457. package/templates/channels/teams-bot/integration/env.template +5 -4
  458. package/templates/channels/teams-bot/integration/openapi/openapi.json +68 -0
  459. package/templates/channels/teams-bot/integration/rbac.json +21 -0
  460. package/templates/channels/teams-bot/integration/teams-bot-datasource-activities.json +154 -0
  461. package/templates/channels/teams-bot/integration/teams-bot-system.json +128 -23
  462. package/templates/channels/web-embed/channel.json +60 -0
  463. package/templates/channels/web-embed/install.template.md.hbs +1 -1
  464. package/templates/channels/web-embed/integration/README.md +2 -2
  465. package/templates/channels/web-embed/integration/application.json +2 -2
  466. package/templates/channels/web-embed/integration/env.template +1 -1
  467. package/templates/channels/web-embed/integration/rbac.json +13 -0
  468. package/templates/channels/web-embed/integration/web-embed-system.json +50 -4
  469. package/templates/python/docker-compose.hbs +14 -0
  470. package/templates/typescript/docker-compose.hbs +14 -0
@@ -10,11 +10,18 @@
10
10
 
11
11
  const crypto = require('crypto');
12
12
  const { getChannelTarget } = require('./channel-targets');
13
- const { normalizeSlackAppDescription } = require('./channel-description');
13
+ const {
14
+ normalizeSlackAppDescription,
15
+ normalizeSlackAppLongDescription
16
+ } = require('./channel-description');
14
17
  const {
15
18
  CHATGPT_RUNTIME_SYSTEM_KEY,
16
19
  CHATGPT_RUNTIME_TRANSPORT,
17
20
  CHATGPT_RUNTIME_AUTH_MODE,
21
+ CHATGPT_OAUTH2_PROFILE_ID,
22
+ CHATGPT_OAUTH2_PROFILE_PATH,
23
+ CHATGPT_CONNECTOR_DESCRIPTION,
24
+ CHATGPT_APPS_CREATE_URL,
18
25
  COPILOT_RUNTIME_SYSTEM_KEY,
19
26
  COPILOT_RUNTIME_TRANSPORT,
20
27
  COPILOT_RUNTIME_AUTH_MODE
@@ -25,8 +32,12 @@ const {
25
32
  evaluateCopilotEntraSsoReadiness
26
33
  } = require('./microsoft-copilot-entra-sso');
27
34
  const { applyCopilotEntraSsoFormFields } = require('./microsoft-copilot-entra-sso-form');
35
+ const { applyCopilotOauthProfile, applyCopilotRuntimeDomain } = require('./channel-predefined-client');
36
+ const { chatgptDiscoveryBlockerLabel } = require('./chatgpt-setup-values');
37
+ const { applyMcpClientRuntimeValues } = require('./mcp-client/runtime');
38
+ const { applyClaudeRuntimeValues } = require('./claude-runtime');
39
+ const { applySlackMcpRuntimeValues } = require('./slack-mcp-runtime');
28
40
 
29
- /** Default Slack slash prefix — matches dataplane `templates/slack/command_catalog.yaml`. */
30
41
  const DEFAULT_SLACK_COMMAND_PREFIX = 'af';
31
42
 
32
43
  /**
@@ -60,33 +71,75 @@ function externalSystemsPrefix(routeSystemKey) {
60
71
  }
61
72
 
62
73
  /**
63
- * Relative endpoint paths per channel target (under external/systems/{routeSystemKey}).
74
+ * Dataplane webhook receiver prefix for inbound vendor Request URLs.
75
+ * @param {string} systemKey
76
+ * @returns {string}
77
+ */
78
+ function webhooksPrefix(systemKey) {
79
+ return `/api/v1/webhooks/${systemKey}`;
80
+ }
81
+
82
+ /**
83
+ * Inbound vendor Request URLs under /api/v1/webhooks/{systemKey}/{datasourceKey}.
84
+ * Channel query/config FastAPI adapters are not published.
64
85
  * @param {string} channelTarget
65
- * @returns {Record<string, string>}
86
+ * @returns {{ inbound: Record<string, string>, systems: Record<string, string>, inboundSystemKey: string }}
66
87
  */
67
- function getEndpointPathSuffixes(channelTarget) {
88
+ function getChannelUrlParts(channelTarget) {
68
89
  const maps = {
69
90
  slack: {
70
- eventsUrl: '/events',
71
- interactionUrl: '/interactive',
72
- commandUrl: '/commands'
91
+ inboundSystemKey: 'slack',
92
+ inbound: {
93
+ eventsUrl: '/slack-events',
94
+ interactionUrl: '/slack-interactive',
95
+ commandUrl: '/slack-commands'
96
+ },
97
+ systems: {}
73
98
  },
74
99
  'teams-bot': {
75
- messagesUrl: '/messages',
76
- notificationsUrl: '/notifications',
77
- botConfigUrl: '/bot-config'
100
+ inboundSystemKey: 'teams-bot',
101
+ inbound: {
102
+ messagesUrl: '/teams-bot-activities'
103
+ },
104
+ systems: {}
78
105
  },
79
106
  'microsoft-copilot': {
80
- mcpUrl: '/mcp'
107
+ inboundSystemKey: 'microsoft-copilot',
108
+ inbound: {},
109
+ systems: { mcpUrl: '/mcp' }
81
110
  },
82
111
  chatgpt: {
83
- mcpUrl: '/mcp'
112
+ inboundSystemKey: 'chatgpt',
113
+ inbound: {},
114
+ systems: { mcpUrl: '/mcp' }
115
+ },
116
+ claude: {
117
+ inboundSystemKey: 'claude',
118
+ inbound: {},
119
+ systems: { mcpUrl: '/mcp' }
120
+ },
121
+ 'mcp-client': {
122
+ inboundSystemKey: 'mcp-client',
123
+ inbound: {},
124
+ systems: { mcpUrl: '/mcp' }
84
125
  },
85
126
  'web-embed': {
86
- configUrl: '/config'
127
+ inboundSystemKey: 'web-embed',
128
+ inbound: {},
129
+ systems: { configUrl: '/config' }
87
130
  }
88
131
  };
89
- return maps[channelTarget] || {};
132
+ return maps[channelTarget] || { inboundSystemKey: channelTarget, inbound: {}, systems: {} };
133
+ }
134
+
135
+ /**
136
+ * Relative endpoint paths per channel target (inbound + query/config suffixes).
137
+ * @param {string} channelTarget
138
+ * @returns {Record<string, string>}
139
+ */
140
+ function getEndpointPathSuffixes(channelTarget) {
141
+ const parts = getChannelUrlParts(channelTarget);
142
+ return { ...parts.systems, ...parts.inbound };
90
143
  }
91
144
 
92
145
  /**
@@ -104,29 +157,45 @@ function getLegacyApiPaths(channelTarget) {
104
157
  }
105
158
 
106
159
  /**
107
- * Slack token rotation requires OAuth redirect URLs (api.slack.com app manifest).
108
- * @param {string|undefined} oauthCallbackUrl
109
- * @returns {{ oauthCallbackUrl?: string, slackRedirectUrlsJson: string, slackTokenRotationEnabled: boolean }}
160
+ * Slack HMAC inbound does not use an OAuth redirect URL.
161
+ * @returns {{ slackRedirectUrlsJson: string, slackTokenRotationEnabled: boolean }}
110
162
  */
111
- function resolveSlackOAuthManifestFields(oauthCallbackUrl) {
112
- const url = typeof oauthCallbackUrl === 'string' ? oauthCallbackUrl.trim() : '';
113
- if (!url) {
114
- return {
115
- slackRedirectUrlsJson: '[]',
116
- slackTokenRotationEnabled: false
117
- };
118
- }
163
+ function resolveSlackOAuthManifestFields() {
119
164
  return {
120
- oauthCallbackUrl: url,
121
- slackRedirectUrlsJson: JSON.stringify([url]),
122
- slackTokenRotationEnabled: true
165
+ slackRedirectUrlsJson: '[]',
166
+ slackTokenRotationEnabled: false
123
167
  };
124
168
  }
125
169
 
126
170
  /**
127
- * @param {Object} resolved
128
- * @param {Object} params
171
+ * @param {string} [controllerUrl]
172
+ * @param {string} [dataplaneBaseUrl]
173
+ * @returns {string}
129
174
  */
175
+ function authorizationServerBaseFromUrls(controllerUrl, dataplaneBaseUrl) {
176
+ const candidate = controllerUrl || dataplaneBaseUrl;
177
+ try {
178
+ return `${new URL(candidate).origin}/auth/realms/aifabrix`;
179
+ } catch {
180
+ return '';
181
+ }
182
+ }
183
+
184
+ function applyChatGptOAuthUrls(resolved, params) {
185
+ const controllerUrl = typeof params.controllerUrl === 'string' ? params.controllerUrl.trim() : '';
186
+ resolved.oauth2ProfileId = CHATGPT_OAUTH2_PROFILE_ID;
187
+ resolved.oauth2ProfilePath = CHATGPT_OAUTH2_PROFILE_PATH;
188
+ resolved.chatgptConnectorDescription = CHATGPT_CONNECTOR_DESCRIPTION;
189
+ resolved.chatgptAppsCreateUrl = CHATGPT_APPS_CREATE_URL;
190
+ if (controllerUrl) {
191
+ resolved.oauth2ProfileUrl = joinUrl(controllerUrl, CHATGPT_OAUTH2_PROFILE_PATH);
192
+ }
193
+ resolved.authorizationServerBase = authorizationServerBaseFromUrls(
194
+ controllerUrl,
195
+ resolved.dataplaneBaseUrl
196
+ );
197
+ }
198
+
130
199
  function applyChatGptRuntimeValues(resolved, params) {
131
200
  resolved.runtimeSystemKey = CHATGPT_RUNTIME_SYSTEM_KEY;
132
201
  resolved.runtimeTransport = CHATGPT_RUNTIME_TRANSPORT;
@@ -134,6 +203,7 @@ function applyChatGptRuntimeValues(resolved, params) {
134
203
  resolved.layerBToolNames = Array.isArray(params.layerBToolNames) ? [...params.layerBToolNames] : [];
135
204
  resolved.scopes = Array.isArray(params.scopes) ? [...params.scopes] : [];
136
205
  resolved.scopesJson = JSON.stringify(resolved.scopes);
206
+ applyChatGptOAuthUrls(resolved, params);
137
207
  }
138
208
 
139
209
  /**
@@ -187,34 +257,18 @@ function applyDiscoveryPackageContext(resolved, packageContext) {
187
257
  resolved.discoveryAuthenticationCapabilities = packageContext.authenticationCapabilities || [];
188
258
  }
189
259
 
190
- /**
191
- * @param {Object} resolved
192
- * @returns {void}
193
- */
194
- function applyCopilotRuntimeDomain(resolved) {
195
- resolved.runtimeDomain = '';
196
- try {
197
- resolved.runtimeDomain = new URL(resolved.mcpUrl).hostname;
198
- } catch {
199
- try {
200
- resolved.runtimeDomain = new URL(resolved.dataplaneBaseUrl).hostname;
201
- } catch {
202
- resolved.runtimeDomain = '';
203
- }
204
- }
205
- }
206
-
207
- /**
208
- * @param {Object} resolved
209
- * @param {Object} params
210
- * @returns {void}
211
- */
212
260
  function applyCopilotPackageIdentity(resolved, params) {
213
261
  resolved.runtimeSystemKey = COPILOT_RUNTIME_SYSTEM_KEY;
214
262
  resolved.runtimeTransport = COPILOT_RUNTIME_TRANSPORT;
215
263
  resolved.runtimeAuthMode = COPILOT_RUNTIME_AUTH_MODE;
216
264
  resolved.layerBToolNames = Array.isArray(params.layerBToolNames) ? [...params.layerBToolNames] : [];
217
- resolved.packageVersion = typeof params.packageVersion === 'string' ? params.packageVersion : '1.0.0';
265
+ if (typeof params.packageVersion === 'string' && params.packageVersion.trim()) {
266
+ resolved.packageVersion = params.packageVersion.trim();
267
+ resolved.packageVersionExplicit = true;
268
+ } else {
269
+ resolved.packageVersion = '1.0.0';
270
+ resolved.packageVersionExplicit = false;
271
+ }
218
272
  resolved.packageAppId = buildDeterministicGuid(
219
273
  `${resolved.channelTarget}:${resolved.baseName}:${resolved.environment}:app`
220
274
  );
@@ -240,7 +294,8 @@ function applyMicrosoftCopilotRuntimeValues(resolved, params) {
240
294
  resolved.scopes = resolveCopilotEntraScopes({
241
295
  explicitScopes: params.scopes,
242
296
  packageContext: params.packageContext,
243
- entraProvider: params.entraProvider
297
+ entraProvider: params.entraProvider,
298
+ entraIdentityProvider: params.entraIdentityProvider
244
299
  });
245
300
  resolved.scopesJson = JSON.stringify(resolved.scopes);
246
301
  const readiness = evaluateCopilotEntraSsoReadiness({
@@ -264,6 +319,7 @@ function applyMicrosoftCopilotRuntimeValues(resolved, params) {
264
319
  applyCopilotRuntimeDomain(resolved);
265
320
  applyCopilotEntraSsoFormFields(resolved, params);
266
321
  applyMicrosoftCopilotDisplayLimits(resolved);
322
+ applyCopilotOauthProfile(resolved, params);
267
323
  }
268
324
 
269
325
  /**
@@ -289,18 +345,52 @@ function applyResolvedPaths(resolved, base, systemPrefix, suffixes, legacy) {
289
345
  * @param {Object} params
290
346
  */
291
347
  function applySlackRuntimeValues(resolved, params) {
292
- const oauthCallbackUrl = params.oauthCallbackUrl || resolved.oauthCallbackUrl;
293
- Object.assign(resolved, resolveSlackOAuthManifestFields(oauthCallbackUrl));
348
+ Object.assign(resolved, resolveSlackOAuthManifestFields());
349
+ delete resolved.oauthCallbackUrl;
350
+ resolved.commandPrefix = normalizeSlackCommandPrefix(params.commandPrefix);
351
+ resolved.enableMcpServer = isTrueLike(params.enableMcpServer);
352
+ resolved.packageVersion =
353
+ typeof params.packageVersion === 'string' && params.packageVersion.trim()
354
+ ? params.packageVersion.trim()
355
+ : '1.0.0';
356
+ const appLongDescription = normalizeSlackAppLongDescription(params.appDescription);
357
+ resolved.appLongDescription = appLongDescription;
358
+ resolved.appLongDescriptionJson = JSON.stringify(appLongDescription);
359
+ }
360
+
361
+ /**
362
+ * @param {unknown} value
363
+ * @returns {boolean}
364
+ */
365
+ function isTrueLike(value) {
366
+ if (value === true) {
367
+ return true;
368
+ }
369
+ return typeof value === 'string' && /^(true|1|yes|on)$/i.test(value.trim());
370
+ }
371
+
372
+ /**
373
+ * Slack slash alias prefix: letters then letters/digits, 1–16 chars.
374
+ * @param {unknown} raw
375
+ * @returns {string}
376
+ */
377
+ function normalizeSlackCommandPrefix(raw) {
294
378
  const prefix =
295
- typeof params.commandPrefix === 'string' && params.commandPrefix.trim()
296
- ? params.commandPrefix.trim()
379
+ typeof raw === 'string' && raw.trim()
380
+ ? raw.trim().toLowerCase()
297
381
  : DEFAULT_SLACK_COMMAND_PREFIX;
298
- resolved.commandPrefix = prefix;
382
+ if (!/^[a-z][a-z0-9]{0,15}$/.test(prefix)) {
383
+ throw new Error(
384
+ 'Invalid --command-prefix. Use 1–16 letters or digits starting with a letter (for example af6).'
385
+ );
386
+ }
387
+ return prefix;
299
388
  }
300
389
 
301
390
  /**
302
391
  * @param {Object} params
303
392
  * @param {string} params.dataplaneBaseUrl
393
+ * @param {string} [params.controllerUrl] Miso Controller base URL (ChatGPT OAuth2 profile link)
304
394
  * @param {string} params.channelTarget
305
395
  * @param {string} params.appName
306
396
  * @param {string} [params.baseName]
@@ -313,15 +403,19 @@ function applySlackRuntimeValues(resolved, params) {
313
403
  function resolveChannelRuntimeValues(params) {
314
404
  const target = getChannelTarget(params.channelTarget);
315
405
  const base = normalizeBaseUrl(params.dataplaneBaseUrl);
316
- const routeKey = target.routeSystemKey || target.key;
317
- const systemPrefix = externalSystemsPrefix(routeKey);
318
- const suffixes = getEndpointPathSuffixes(params.channelTarget);
406
+ const instanceKey = params.instanceSystemKey || params.channelTarget;
407
+ const runtimeKey =
408
+ (target.runtimeTarget && target.runtimeTarget.defaultSystemKey) || 'runtime-orchestration';
409
+ const systemPrefix = externalSystemsPrefix(runtimeKey);
410
+ const urlParts = getChannelUrlParts(params.channelTarget);
319
411
  const legacy = getLegacyApiPaths(params.channelTarget);
320
412
 
321
413
  const resolved = {
322
414
  dataplaneBaseUrl: base,
323
415
  channelTarget: params.channelTarget,
324
- routeSystemKey: routeKey,
416
+ routeSystemKey: runtimeKey,
417
+ instanceSystemKey: instanceKey,
418
+ runtimeSystemKey: runtimeKey,
325
419
  appName: params.appName,
326
420
  baseName: params.baseName || params.appName,
327
421
  environment: params.environment || 'dev',
@@ -331,46 +425,74 @@ function resolveChannelRuntimeValues(params) {
331
425
  : params.appDescription,
332
426
  icon: params.icon || '',
333
427
  credentialKey: target.credentialKey,
334
- credentialPortalUrl: joinUrl(base, `/connected-systems/${params.channelTarget}?tab=authentication`),
428
+ credentialPortalUrl: joinUrl(base, `/connected-systems/${instanceKey}?tab=authentication`),
335
429
  assistantCatalogUrl: joinUrl(base, '/api/v1/workers/available'),
336
430
  scopes: []
337
431
  };
338
432
 
339
- applyResolvedPaths(resolved, base, systemPrefix, suffixes, legacy);
433
+ applyResolvedPaths(resolved, base, systemPrefix, urlParts.systems, legacy);
434
+ applyResolvedPaths(
435
+ resolved,
436
+ base,
437
+ webhooksPrefix(instanceKey),
438
+ urlParts.inbound,
439
+ {}
440
+ );
441
+
442
+ applyChannelSpecificRuntime(resolved, params);
443
+ return resolved;
444
+ }
340
445
 
446
+ /**
447
+ * @param {Object} resolved
448
+ * @param {Object} params
449
+ */
450
+ function applyChannelSpecificRuntime(resolved, params) {
341
451
  if (params.channelTarget === 'slack') {
342
452
  applySlackRuntimeValues(resolved, params);
343
453
  applyDiscoveryPackageContext(resolved, params.packageContext);
454
+ applySlackMcpRuntimeValues(resolved, params);
344
455
  }
345
-
346
456
  if (params.channelTarget === 'microsoft-copilot') {
347
457
  applyMicrosoftCopilotRuntimeValues(resolved, params);
348
458
  }
349
-
350
459
  if (params.channelTarget === 'chatgpt') {
351
460
  applyChatGptRuntimeValues(resolved, params);
352
461
  applyDiscoveryPackageContext(resolved, params.packageContext);
462
+ resolved.discoveryBlockerLabel = chatgptDiscoveryBlockerLabel(resolved.discoveryBlocker);
463
+ }
464
+ if (params.channelTarget === 'claude') {
465
+ applyClaudeRuntimeValues(resolved, params);
466
+ applyDiscoveryPackageContext(resolved, params.packageContext);
467
+ resolved.discoveryBlockerLabel = chatgptDiscoveryBlockerLabel(resolved.discoveryBlocker);
468
+ }
469
+ if (params.channelTarget === 'mcp-client') {
470
+ applyMcpClientRuntimeValues(resolved, params);
471
+ applyDiscoveryPackageContext(resolved, params.packageContext);
472
+ resolved.discoveryBlockerLabel = chatgptDiscoveryBlockerLabel(resolved.discoveryBlocker);
353
473
  }
354
-
355
474
  if (params.channelTarget === 'teams-bot') {
356
475
  applyDiscoveryPackageContext(resolved, params.packageContext);
357
476
  }
358
-
359
- return resolved;
360
477
  }
361
478
 
362
479
  module.exports = {
363
480
  normalizeBaseUrl,
364
481
  joinUrl,
365
482
  externalSystemsPrefix,
483
+ webhooksPrefix,
366
484
  getEndpointPathSuffixes,
485
+ getChannelUrlParts,
367
486
  buildDeterministicGuid,
368
487
  applyResolvedPaths,
369
488
  applySlackRuntimeValues,
370
489
  applyMicrosoftCopilotRuntimeValues,
371
490
  applyChatGptRuntimeValues,
491
+ applyClaudeRuntimeValues,
492
+ applyMcpClientRuntimeValues,
372
493
  applyDiscoveryPackageContext,
373
494
  resolveSlackOAuthManifestFields,
374
495
  resolveChannelRuntimeValues,
375
- DEFAULT_SLACK_COMMAND_PREFIX
496
+ DEFAULT_SLACK_COMMAND_PREFIX,
497
+ normalizeSlackCommandPrefix
376
498
  };
@@ -17,6 +17,7 @@ const {
17
17
  sectionTitle,
18
18
  metadata
19
19
  } = require('../utils/cli-test-layout-chalk');
20
+ const { CHANNEL_TARGETS } = require('./channel-targets');
20
21
 
21
22
  /** @returns {string} */
22
23
  function separatorLine() {
@@ -46,17 +47,27 @@ function displayApprovalGuideOptionalLinks(approvalGuide) {
46
47
  }
47
48
  }
48
49
 
50
+ /**
51
+ * @param {Object} approvalGuide
52
+ * @returns {string}
53
+ */
54
+ function approvalGuideHeading(approvalGuide) {
55
+ if (approvalGuide.approvalRequired === false) {
56
+ return 'Go-live steps';
57
+ }
58
+ if (typeof approvalGuide.heading === 'string' && approvalGuide.heading.trim()) {
59
+ return approvalGuide.heading.trim();
60
+ }
61
+ return 'Workspace admin setup required';
62
+ }
63
+
49
64
  /**
50
65
  * @param {Object|null} approvalGuide
51
66
  */
52
67
  function displayApprovalGuideSection(approvalGuide) {
53
68
  if (!approvalGuide?.steps?.length) return;
54
69
  logger.log('');
55
- const heading =
56
- approvalGuide.approvalRequired === false
57
- ? 'Go-live steps'
58
- : 'Organisation publish / Teams admin approval required';
59
- logger.log(formatWarningLine(heading));
70
+ logger.log(formatWarningLine(approvalGuideHeading(approvalGuide)));
60
71
  if (approvalGuide.portalUrl) {
61
72
  logger.log(metadata('Developer Portal:'));
62
73
  logger.log(chalk.cyan(approvalGuide.portalUrl));
@@ -103,6 +114,31 @@ function displayExistingChannelStatus(params) {
103
114
  logger.log(separatorLine());
104
115
  }
105
116
 
117
+ /**
118
+ * @param {Object} result
119
+ */
120
+ function displayChannelPackagePaths(result) {
121
+ if (result.artifactPath) {
122
+ logger.log(metadata(`Artifact: ${result.artifactPath}`));
123
+ }
124
+ if (result.installGuidePath) {
125
+ logger.log(metadata(`Install guide (README): ${result.installGuidePath}`));
126
+ }
127
+ if (result.zipPath) {
128
+ logger.log(metadata(`Package ZIP: ${result.zipPath}`));
129
+ }
130
+ if (!result.packageVersion) {
131
+ return;
132
+ }
133
+ if (result.priorPackageVersion && result.priorPackageVersion !== result.packageVersion) {
134
+ logger.log(
135
+ metadata(`Package version: ${result.priorPackageVersion} → ${result.packageVersion}`)
136
+ );
137
+ return;
138
+ }
139
+ logger.log(metadata(`Package version: ${result.packageVersion}`));
140
+ }
141
+
106
142
  /**
107
143
  * @param {Object} result
108
144
  */
@@ -121,16 +157,26 @@ function displayChannelCoreFields(result) {
121
157
  logger.log(` - ${cap}`);
122
158
  }
123
159
  }
124
- if (result.artifactPath) {
125
- logger.log(metadata(`Artifact: ${result.artifactPath}`));
126
- }
127
- if (result.installGuidePath) {
128
- logger.log(metadata(`Install guide (README): ${result.installGuidePath}`));
160
+ displayChannelPackagePaths(result);
161
+ displayReadinessLines(result);
162
+ displayRemainingManualStep(result.channelTarget);
163
+ }
164
+
165
+ /**
166
+ * Concise remaining vendor-owned step from the channel registry.
167
+ * @param {string} channelTarget
168
+ * @returns {void}
169
+ */
170
+ function displayRemainingManualStep(channelTarget) {
171
+ if (channelTarget === 'chatgpt' || channelTarget === 'claude') {
172
+ return;
129
173
  }
130
- if (result.zipPath) {
131
- logger.log(metadata(`Package ZIP: ${result.zipPath}`));
174
+ const step = CHANNEL_TARGETS[channelTarget] && CHANNEL_TARGETS[channelTarget].remainingManualStep;
175
+ if (!step) {
176
+ return;
132
177
  }
133
- displayReadinessLines(result);
178
+ logger.log('');
179
+ logger.log(formatWarningLine(`Remaining vendor step: ${step}`));
134
180
  }
135
181
 
136
182
  /**
@@ -149,13 +195,16 @@ function displayReadinessLines(result) {
149
195
  } else if (result.installReady === false) {
150
196
  logger.log(metadata('Package / Runtime ready: no'));
151
197
  }
152
- if (result.microsoftPublicationPending === true) {
198
+ if (result.channelTarget === 'microsoft-copilot' && result.microsoftPublicationPending === true) {
153
199
  logger.log(
154
200
  metadata(
155
201
  'Microsoft publication: pending (Developer Portal import → Publish to your org → Teams admin approval)'
156
202
  )
157
203
  );
158
- } else if (result.microsoftPublicationPending === false) {
204
+ } else if (
205
+ result.channelTarget === 'microsoft-copilot' &&
206
+ result.microsoftPublicationPending === false
207
+ ) {
159
208
  logger.log(metadata('Microsoft publication: cleared'));
160
209
  } else if (result.installReady === false && result.blocker && !packageBlocker) {
161
210
  logger.log(metadata(`Install ready: no (${result.blocker})`));
@@ -231,9 +280,29 @@ function displayRuntimeChecks(runtimeChecks) {
231
280
  * @param {Object} result
232
281
  */
233
282
  function displayApprovalSection(result) {
283
+ if (result.channelTarget === 'chatgpt' || result.channelTarget === 'claude') {
284
+ return;
285
+ }
234
286
  displayApprovalGuideSection(result.approvalGuide);
235
287
  }
236
288
 
289
+ /**
290
+ * Microsoft org-publication is Copilot-only. ChatGPT must not inherit that flag.
291
+ * @param {string} channelTarget
292
+ * @param {Object} artifact
293
+ * @param {string} status
294
+ * @returns {boolean|undefined}
295
+ */
296
+ function microsoftPublicationPendingForDisplay(channelTarget, artifact, status) {
297
+ if (channelTarget !== 'microsoft-copilot') {
298
+ return undefined;
299
+ }
300
+ if (artifact.microsoftPublicationPending !== undefined) {
301
+ return artifact.microsoftPublicationPending;
302
+ }
303
+ return status === 'approvalRequired';
304
+ }
305
+
237
306
  /**
238
307
  * @param {Object} result
239
308
  */
@@ -254,5 +323,6 @@ function displayChannelError(message) {
254
323
  module.exports = {
255
324
  displayExistingChannelStatus,
256
325
  displayChannelInstallResult,
257
- displayChannelError
326
+ displayChannelError,
327
+ microsoftPublicationPendingForDisplay
258
328
  };