@aifabrix/builder 2.53.0 → 2.54.1

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