@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
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Spawn Teams Developer CLI (`teams`) without scattering argv.
3
+ *
4
+ * @fileoverview Documented CLI only; skipped under Jest unless deps allow it
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const { shouldSkipLiveToolkit, runAtk } = require('./cli');
10
+ const { findOrInstallTeamsBinary } = require('./install-teams');
11
+
12
+ /**
13
+ * @param {Object} [deps]
14
+ * @returns {boolean}
15
+ */
16
+ function shouldSkipLiveTeamsCli(deps = {}) {
17
+ return shouldSkipLiveToolkit(deps);
18
+ }
19
+
20
+ /**
21
+ * @param {Object} [deps]
22
+ * @returns {Promise<string|null>}
23
+ */
24
+ async function resolveTeamsBinary(deps = {}) {
25
+ if (typeof deps.teamsBinary === 'string' && deps.teamsBinary.trim()) {
26
+ return deps.teamsBinary.trim();
27
+ }
28
+ if (shouldSkipLiveTeamsCli(deps)) {
29
+ return null;
30
+ }
31
+ return findOrInstallTeamsBinary(deps);
32
+ }
33
+
34
+ /**
35
+ * @param {string} bin
36
+ * @param {string[]} args
37
+ * @param {Object} [opts]
38
+ * @param {Object} [deps]
39
+ * @returns {Promise<{ stdout: string, stderr: string }>}
40
+ */
41
+ async function runTeams(bin, args, opts = {}, deps = {}) {
42
+ return runAtk(bin, args, opts, deps);
43
+ }
44
+
45
+ /**
46
+ * @param {string} text
47
+ * @returns {boolean}
48
+ */
49
+ function teamsStatusLooksLoggedIn(text) {
50
+ const blob = String(text || '');
51
+ if (/not logged in/i.test(blob)) {
52
+ return false;
53
+ }
54
+ return /logged in as|sideloading:\s*enabled/i.test(blob);
55
+ }
56
+
57
+ /**
58
+ * @param {Object} [deps]
59
+ * @returns {Promise<boolean>}
60
+ */
61
+ async function isTeamsCliLoggedIn(deps = {}) {
62
+ const bin = await resolveTeamsBinary(deps);
63
+ if (!bin) {
64
+ return false;
65
+ }
66
+ try {
67
+ const result = await runTeams(bin, ['status'], { timeout: 20000 }, deps);
68
+ return teamsStatusLooksLoggedIn(`${result.stdout}\n${result.stderr}`);
69
+ } catch (error) {
70
+ const stdout = error && error.stdout ? String(error.stdout) : '';
71
+ const stderr = error && error.stderr ? String(error.stderr) : '';
72
+ return teamsStatusLooksLoggedIn(`${stdout}\n${stderr}`);
73
+ }
74
+ }
75
+
76
+ module.exports = {
77
+ shouldSkipLiveTeamsCli,
78
+ resolveTeamsBinary,
79
+ runTeams,
80
+ teamsStatusLooksLoggedIn,
81
+ isTeamsCliLoggedIn
82
+ };
@@ -108,9 +108,12 @@ function preferLayerBToolNames(names) {
108
108
  */
109
109
  async function fetchRuntimeLayerBToolNames(dataplaneUrl, authConfig, channelTarget) {
110
110
  const target = getChannelTarget(channelTarget);
111
- const routeSystemKey = target.routeSystemKey || target.key;
111
+ const runtimeKey =
112
+ (target.runtimeTarget && target.runtimeTarget.defaultSystemKey) ||
113
+ target.routeSystemKey ||
114
+ 'runtime-orchestration';
112
115
  const client = createDataplaneApiClient(dataplaneUrl, authConfig);
113
- const endpoints = buildToolCatalogEndpoints(routeSystemKey);
116
+ const endpoints = buildToolCatalogEndpoints(runtimeKey);
114
117
  for (const endpoint of endpoints) {
115
118
  try {
116
119
  const response = await client.get(endpoint, { timeoutMs: 10000 });
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Portal HTTP Slack auth: start ticket, return slash command, complete with challenge.
3
+ *
4
+ * @fileoverview Do not tell the browser user to install Slack CLI or re-run channel add
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const {
10
+ looksLikeSlackAccessToken,
11
+ slashCommandForTicket,
12
+ startSlackAuthTicket,
13
+ completeSlackAuthTicket
14
+ } = require('./slack-provisioning/auth-ticket');
15
+ const { SLACK_AUTH_HANDSHAKE_STEPS } = require('./channel-add-remaining');
16
+ const { redactSlackSecrets } = require('./slack-provisioning/errors');
17
+
18
+ /**
19
+ * @param {string} slashCommand
20
+ * @param {string} ticket
21
+ * @returns {{ waiting: true, result: Object }}
22
+ */
23
+ function handshakeWaiting(slashCommand, ticket) {
24
+ return {
25
+ waiting: true,
26
+ result: {
27
+ connected: false,
28
+ remaining: [...SLACK_AUTH_HANDSHAKE_STEPS],
29
+ slashCommand,
30
+ slackAuthTicket: ticket
31
+ }
32
+ };
33
+ }
34
+
35
+ /**
36
+ * @param {Error} error
37
+ * @returns {{ waiting: true, result: Object }}
38
+ */
39
+ function handshakeFailed(error) {
40
+ const code = error && error.code;
41
+ const remaining = code === 'SLACK_CLI_MISSING'
42
+ ? ['Slack authentication could not start on this host.']
43
+ : [redactSlackSecrets((error && error.message) || 'Slack authentication could not start.')];
44
+ return {
45
+ waiting: true,
46
+ result: {
47
+ connected: false,
48
+ remaining,
49
+ handshakeFailed: true
50
+ }
51
+ };
52
+ }
53
+
54
+ /**
55
+ * @param {string} ticket
56
+ * @param {Error} error
57
+ * @returns {{ waiting: true, result: Object }}
58
+ */
59
+ function handshakeRetry(ticket, error) {
60
+ const slashCommand = slashCommandForTicket(ticket);
61
+ if (!slashCommand) {
62
+ return handshakeFailed(error);
63
+ }
64
+ return handshakeWaiting(slashCommand, ticket);
65
+ }
66
+
67
+ /**
68
+ * @param {Error|Object|null} error
69
+ * @returns {boolean}
70
+ */
71
+ function isStaleSlackLoginError(error) {
72
+ const message = String((error && error.message) || '');
73
+ return /run the slack login command again|error handling your login/i.test(message);
74
+ }
75
+
76
+ /**
77
+ * @param {Object} [deps]
78
+ * @returns {Promise<{ waiting: true, result: Object }>}
79
+ */
80
+ async function startOrFailHandshake(deps = {}) {
81
+ try {
82
+ const started = await startSlackAuthTicket(deps);
83
+ return handshakeWaiting(started.slashCommand, started.ticket);
84
+ } catch (error) {
85
+ return handshakeFailed(error);
86
+ }
87
+ }
88
+
89
+ /**
90
+ * Quiet HTTP install: start or complete the Slack CLI ticket handshake.
91
+ * @param {Object} options
92
+ * @param {Object} deps
93
+ * @returns {Promise<{ waiting: boolean, result?: Object }>}
94
+ */
95
+ async function preparePortalSlackAuth(options = {}, deps = {}) {
96
+ if (options.retryLogin === true) {
97
+ return startOrFailHandshake(deps);
98
+ }
99
+ const submitted = typeof options.vendorSessionToken === 'string'
100
+ ? options.vendorSessionToken.trim()
101
+ : '';
102
+ const ticket = typeof options.slackAuthTicket === 'string'
103
+ ? options.slackAuthTicket.trim()
104
+ : '';
105
+ if (looksLikeSlackAccessToken(submitted)) {
106
+ deps.slackUserToken = submitted;
107
+ return { waiting: false };
108
+ }
109
+ if (submitted && ticket) {
110
+ try {
111
+ deps.slackUserToken = await completeSlackAuthTicket({ ticket, challenge: submitted }, deps);
112
+ return { waiting: false };
113
+ } catch (error) {
114
+ if (isStaleSlackLoginError(error)) {
115
+ return startOrFailHandshake(deps);
116
+ }
117
+ return handshakeRetry(ticket, error);
118
+ }
119
+ }
120
+ if (ticket) {
121
+ return handshakeWaiting(slashCommandForTicket(ticket), ticket);
122
+ }
123
+ return startOrFailHandshake(deps);
124
+ }
125
+
126
+ module.exports = {
127
+ preparePortalSlackAuth,
128
+ handshakeWaiting,
129
+ handshakeFailed
130
+ };
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Interactive Slack ticket handshake for `aifabrix channel add`.
3
+ *
4
+ * @fileoverview Print slash command, collect challenge, complete auth token
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const inquirer = require('inquirer');
10
+ const chalk = require('chalk');
11
+ const logger = require('../utils/logger');
12
+ const { printLabeledUrl } = require('./channel-add-tty');
13
+ const { isChannelAddInteractive } = require('./channel-add-wizard');
14
+ const { handshakeFailed, handshakeWaiting } = require('./slack-channel-add-portal');
15
+ const {
16
+ startSlackAuthTicket,
17
+ completeSlackAuthTicket
18
+ } = require('./slack-provisioning/auth-ticket');
19
+ const { slackProvisioningError } = require('./slack-provisioning/errors');
20
+
21
+ /**
22
+ * @param {Object} options
23
+ * @param {Object} deps
24
+ * @returns {boolean}
25
+ */
26
+ function canRefreshInteractive(options = {}, deps = {}) {
27
+ if (options.quiet === true) {
28
+ return false;
29
+ }
30
+ if (typeof deps.promptChallenge === 'function') {
31
+ return true;
32
+ }
33
+ return isChannelAddInteractive(options);
34
+ }
35
+
36
+ /**
37
+ * @param {Object} [deps]
38
+ * @returns {Promise<string>}
39
+ */
40
+ async function promptChallengeCode(deps = {}) {
41
+ if (typeof deps.promptChallenge === 'function') {
42
+ return String((await deps.promptChallenge()) || '').trim();
43
+ }
44
+ const answers = await inquirer.prompt([
45
+ {
46
+ type: 'input',
47
+ name: 'challenge',
48
+ message: 'Challenge code',
49
+ validate: (value) => Boolean(String(value || '').trim()) || 'Challenge code is required'
50
+ }
51
+ ]);
52
+ return String(answers.challenge || '').trim();
53
+ }
54
+
55
+ /**
56
+ * @param {Object} started
57
+ * @returns {void}
58
+ */
59
+ function printHandshakeCommand(started) {
60
+ printLabeledUrl('Run in Slack', started.slashCommand);
61
+ logger.log(chalk.white('Approve the permissions Slack shows, then paste the challenge code.'));
62
+ }
63
+
64
+ /**
65
+ * Start a new Slack ticket, prompt for the challenge, store the session token on deps.
66
+ * @param {Object} deps
67
+ * @returns {Promise<{ ok: boolean, result?: Object }>}
68
+ */
69
+ async function refreshInteractiveSlackAuth(deps = {}) {
70
+ let started = null;
71
+ try {
72
+ started = await startSlackAuthTicket(deps);
73
+ printHandshakeCommand(started);
74
+ const challenge = await promptChallengeCode(deps);
75
+ if (!challenge) {
76
+ throw slackProvisioningError('Challenge code is required.', 'SLACK_CLI');
77
+ }
78
+ deps.slackUserToken = await completeSlackAuthTicket({
79
+ ticket: started.ticket,
80
+ challenge
81
+ }, deps);
82
+ return { ok: true };
83
+ } catch (error) {
84
+ if (started && started.slashCommand) {
85
+ return { ok: false, result: handshakeWaiting(started.slashCommand, started.ticket).result };
86
+ }
87
+ return { ok: false, result: handshakeFailed(error).result };
88
+ }
89
+ }
90
+
91
+ module.exports = {
92
+ canRefreshInteractive,
93
+ promptChallengeCode,
94
+ refreshInteractiveSlackAuth
95
+ };
@@ -0,0 +1,311 @@
1
+ /**
2
+ * Slack channel-add provisioning hook (plan 176.0).
3
+ *
4
+ * @fileoverview Keep add-channel.js free of Slack CLI/HTTP
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const { provisionSlackChannel } = require('./slack-provisioning');
10
+ const { ensureSlackCliReady } = require('./slack-provisioning/offer-cli');
11
+ const { SLACK_CLI_DOCS_URL } = require('./slack-provisioning/constants');
12
+ const { redactSlackSecrets } = require('./slack-provisioning/errors');
13
+ const { isSlackAuthDeadError } = require('./slack-provisioning/auth-ticket');
14
+ const { preparePortalSlackAuth } = require('./slack-channel-add-portal');
15
+ const { canRefreshInteractive, refreshInteractiveSlackAuth } = require('./slack-channel-add-tty-auth');
16
+ const { SLACK_AUTH_HANDSHAKE_STEPS } = require('./channel-add-remaining');
17
+ const { readProvisioningState, hasProvenAppIdentity } = require('./slack-provisioning/persist');
18
+ const { slackConsentRemaining, slackConsentUrls } = require('./slack-provisioning/remaining-urls');
19
+ const { ensureChannelUploaded } = require('./channel-add-ensure');
20
+ const {
21
+ maybeOnboardSlackUsers,
22
+ unmatchedRemainingStep
23
+ } = require('./slack-provisioning/onboard');
24
+ const { registerSlackMcpCallback, slackMcpProfileUrl } = require('./slack-mcp-callback');
25
+
26
+ /**
27
+ * @param {Error} error
28
+ * @returns {string[]}
29
+ */
30
+ function remainingFromError(error) {
31
+ const code = error && error.code;
32
+ if (code === 'CALLBACKS') {
33
+ return [
34
+ 'Use a public HTTPS dataplane URL for Slack Events, Interactivity, and commands'
35
+ ];
36
+ }
37
+ if (code === 'UNPROVEN_IDENTITY' && error && error.message) {
38
+ return [error.message];
39
+ }
40
+ if (code === 'SLACK_CLI_MISSING') {
41
+ return [
42
+ `Install Slack CLI (${SLACK_CLI_DOCS_URL}) and run slack login`,
43
+ 'Re-run channel add to create the Slack app automatically',
44
+ 'Approve the workspace install if Slack asks'
45
+ ];
46
+ }
47
+ if (isSlackAuthDeadError(error)) {
48
+ return [...SLACK_AUTH_HANDSHAKE_STEPS];
49
+ }
50
+ const detail = redactSlackSecrets(
51
+ (error && error.message) || 'Slack app provisioning failed'
52
+ );
53
+ return [detail, 'Approve the workspace install if Slack asks'];
54
+ }
55
+
56
+ /**
57
+ * @param {Error} error
58
+ * @param {boolean} hasApp
59
+ * @returns {boolean}
60
+ */
61
+ function shouldUseConsentRemaining(error, hasApp) {
62
+ if (!hasApp) {
63
+ return false;
64
+ }
65
+ const code = error && error.code;
66
+ if (isSlackAuthDeadError(error)) {
67
+ return false;
68
+ }
69
+ return code !== 'CALLBACKS' && code !== 'SLACK_CLI_MISSING' && code !== 'UNPROVEN_IDENTITY';
70
+ }
71
+
72
+ /**
73
+ * Existing Slack app: print app + install-on-team URLs, not the generic apps list.
74
+ * @param {string} projectRoot
75
+ * @param {Error} error
76
+ * @returns {Object}
77
+ */
78
+ function recoveryFromExistingApp(projectRoot, error) {
79
+ const state = readProvisioningState(projectRoot);
80
+ const hasApp = hasProvenAppIdentity(state);
81
+ const urls = hasApp ? slackConsentUrls(state) : {};
82
+ return {
83
+ connected: false,
84
+ remaining: shouldUseConsentRemaining(error, hasApp)
85
+ ? slackConsentRemaining({ storedSigningSecret: Boolean(state && state.secretsStored) })
86
+ : remainingFromError(error),
87
+ recovery: true,
88
+ error: error && error.message ? error.message : String(error),
89
+ appId: hasApp ? state.appId : undefined,
90
+ ...urls
91
+ };
92
+ }
93
+
94
+ /**
95
+ * Prompt/run Slack email onboard and attach TTY counts (no member dump).
96
+ * @param {Object} ttyCtx
97
+ * @param {Object} options
98
+ * @returns {Promise<Object>}
99
+ */
100
+ async function applySlackOnboardToCtx(ttyCtx, options = {}) {
101
+ const deps = options.slackProvisioningDeps || {};
102
+ try {
103
+ const onboard = await maybeOnboardSlackUsers({ ctx: ttyCtx, options }, deps);
104
+ if (!onboard.ran) {
105
+ return ttyCtx;
106
+ }
107
+ const extra = unmatchedRemainingStep(onboard.unmatched);
108
+ return {
109
+ ...ttyCtx,
110
+ slackOnboarded: onboard.linked,
111
+ slackRemaining: [...(ttyCtx.slackRemaining || []), extra].filter(Boolean)
112
+ };
113
+ } catch {
114
+ return {
115
+ ...ttyCtx,
116
+ slackRemaining: [
117
+ ...(ttyCtx.slackRemaining || []),
118
+ 'Slack user onboard could not finish'
119
+ ]
120
+ };
121
+ }
122
+ }
123
+
124
+ /**
125
+ * Publish the Slack instance CS so webhookInbound and channel.definitionKey
126
+ * can be patched even when Slack CLI has not returned a bot token yet.
127
+ *
128
+ * @param {Object} result
129
+ * @param {Object} options
130
+ * @param {Object} deps
131
+ * @returns {Promise<void>}
132
+ */
133
+ async function publishSlackAfterSecrets(_result, options, deps) {
134
+ const publish = deps.ensureChannelUploaded || ensureChannelUploaded;
135
+ await publish('slack', {
136
+ ...options,
137
+ force: true,
138
+ suppressUploadedLine: true
139
+ });
140
+ }
141
+
142
+ /**
143
+ * Portal HTTP has no Slack CLI: still publish the instance CS, then remaining steps.
144
+ * @param {string} projectRoot
145
+ * @param {Error} error
146
+ * @param {Object} options
147
+ * @param {Object} deps
148
+ * @returns {Promise<Object>}
149
+ */
150
+ async function recoverSlackProvisionFailure(projectRoot, error, options, deps) {
151
+ if (error && error.code === 'MANIFEST') {
152
+ throw error;
153
+ }
154
+ await publishSlackAfterSecrets({ connected: false }, options, deps);
155
+ return recoveryFromExistingApp(projectRoot, error);
156
+ }
157
+
158
+ /**
159
+ * @param {Object} [options]
160
+ * @returns {Object}
161
+ */
162
+ function slackDepsFromOptions(options = {}) {
163
+ const deps = { ...(options.slackProvisioningDeps || {}) };
164
+ const token = typeof options.vendorSessionToken === 'string'
165
+ ? options.vendorSessionToken.trim()
166
+ : '';
167
+ if (token) {
168
+ deps.slackUserToken = token;
169
+ }
170
+ return deps;
171
+ }
172
+
173
+ /**
174
+ * @param {Object} params
175
+ * @returns {Promise<Object|null>}
176
+ */
177
+ async function provisionAndPublish(params, options, deps, ctx, projectRoot) {
178
+ const result = await provisionSlackChannel(
179
+ {
180
+ projectRoot,
181
+ runtimeValues: params.runtimeValues,
182
+ artifact: params.artifact,
183
+ ctx,
184
+ environment: ctx.environment,
185
+ expectedTeamId: options.expectedTeamId,
186
+ force: options.force === true,
187
+ quiet: options.quiet === true
188
+ },
189
+ deps
190
+ );
191
+ await publishSlackAfterSecrets(result, options, deps);
192
+ return result;
193
+ }
194
+
195
+ /**
196
+ * @param {Error} error
197
+ * @param {Object} params
198
+ * @param {Object} options
199
+ * @param {Object} deps
200
+ * @param {Object} ctx
201
+ * @param {string} projectRoot
202
+ * @returns {Promise<Object>}
203
+ */
204
+ async function recoverOrRefreshAuth(error, params, options, deps, ctx, projectRoot) {
205
+ if (error && error.code === 'MANIFEST') {
206
+ throw error;
207
+ }
208
+ if (isSlackAuthDeadError(error) && canRefreshInteractive(options, deps)) {
209
+ const refresh = await refreshInteractiveSlackAuth(deps);
210
+ if (refresh.ok) {
211
+ try {
212
+ return await provisionAndPublish(params, options, deps, ctx, projectRoot);
213
+ } catch (retryError) {
214
+ return recoverSlackProvisionFailure(projectRoot, retryError, options, deps);
215
+ }
216
+ }
217
+ await publishSlackAfterSecrets({ connected: false }, options, deps);
218
+ return refresh.result;
219
+ }
220
+ return recoverSlackProvisionFailure(projectRoot, error, options, deps);
221
+ }
222
+
223
+ /**
224
+ * @param {Object} params
225
+ * @returns {Promise<Object|null>}
226
+ */
227
+ async function maybeRegisterSlackMcpCallback(params) {
228
+ const runtime = params && params.runtimeValues;
229
+ const ctx = params && params.ctx;
230
+ if (!runtime || !runtime.enableMcpServer) {
231
+ return null;
232
+ }
233
+ if (!ctx || !ctx.controllerUrl || !ctx.authConfig) {
234
+ return {
235
+ ok: false,
236
+ fallback: true,
237
+ remaining: ['Open the OAuth2 profile and add the Slack MCP callback URL']
238
+ };
239
+ }
240
+ try {
241
+ const result = await registerSlackMcpCallback({ ctx, ...(params.slackMcpCallbackDeps || {}) });
242
+ if (result && result.fallback) {
243
+ const profileUrl = result.profileUrl || slackMcpProfileUrl(ctx);
244
+ return {
245
+ ok: false,
246
+ fallback: true,
247
+ remaining: [`Open ${profileUrl} and add the Slack MCP callback URL`]
248
+ };
249
+ }
250
+ return result;
251
+ } catch (error) {
252
+ return {
253
+ ok: false,
254
+ fallback: true,
255
+ remaining: [error && error.message ? error.message : 'Slack MCP callback could not be registered']
256
+ };
257
+ }
258
+ }
259
+
260
+ /**
261
+ * @param {Object} params
262
+ * @returns {Promise<Object|null>}
263
+ */
264
+ async function maybeProvisionSlackChannel(params) {
265
+ if (!params || params.channelTarget !== 'slack' || (params.options && params.options.dryRun === true)) {
266
+ return null;
267
+ }
268
+ const ctx = params.ctx || {};
269
+ const options = params.options || {};
270
+ const deps = slackDepsFromOptions(options);
271
+ const projectRoot = options.projectRoot || process.cwd();
272
+ const mcpCallback = await maybeRegisterSlackMcpCallback(params);
273
+ if (options.quiet === true) {
274
+ const portal = await preparePortalSlackAuth(options, deps);
275
+ if (portal.waiting) {
276
+ await publishSlackAfterSecrets({ connected: false }, options, deps);
277
+ return attachSlackMcpRemaining(portal.result, mcpCallback);
278
+ }
279
+ }
280
+ try {
281
+ if (options.quiet !== true) {
282
+ await ensureSlackCliReady(options, deps);
283
+ }
284
+ const result = await provisionAndPublish(params, options, deps, ctx, projectRoot);
285
+ return attachSlackMcpRemaining(result, mcpCallback);
286
+ } catch (error) {
287
+ const recovered = await recoverOrRefreshAuth(error, params, options, deps, ctx, projectRoot);
288
+ return attachSlackMcpRemaining(recovered, mcpCallback);
289
+ }
290
+ }
291
+
292
+ /**
293
+ * @param {Object|null} result
294
+ * @param {Object|null} mcpCallback
295
+ * @returns {Object|null}
296
+ */
297
+ function attachSlackMcpRemaining(result, mcpCallback) {
298
+ const extra = mcpCallback && Array.isArray(mcpCallback.remaining) ? mcpCallback.remaining : [];
299
+ if (extra.length === 0) {
300
+ return result;
301
+ }
302
+ const base = result && typeof result === 'object' ? result : {};
303
+ return { ...base, remaining: [...(base.remaining || []), ...extra] };
304
+ }
305
+
306
+ module.exports = {
307
+ maybeProvisionSlackChannel,
308
+ maybeRegisterSlackMcpCallback,
309
+ applySlackOnboardToCtx,
310
+ remainingFromError
311
+ };
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Allowlist Slack MCP OAuth callback on the existing customerOAuth client.
3
+ *
4
+ * @fileoverview Reuse ChatGPT Integration Client; never rotate the secret
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const {
10
+ registerChatGptCallbackUrls,
11
+ chatgptProfileUrl
12
+ } = require('./chatgpt-callback');
13
+ const {
14
+ CHATGPT_INTEGRATION_CLIENT_KEY,
15
+ CHATGPT_OAUTH2_PROFILE_ID,
16
+ CHATGPT_OAUTH2_PROFILE_PATH
17
+ } = require('./chatgpt-runtime-contract');
18
+ const { SLACK_MCP_CALLBACK_URI } = require('./slack-mcp-runtime');
19
+
20
+ const SLACK_MCP_CALLBACK_CONTRACT = {
21
+ integrationClientKey: CHATGPT_INTEGRATION_CLIENT_KEY,
22
+ oauth2ProfileId: CHATGPT_OAUTH2_PROFILE_ID,
23
+ oauth2ProfilePath: CHATGPT_OAUTH2_PROFILE_PATH,
24
+ vendorLabel: 'Slack MCP'
25
+ };
26
+
27
+ /**
28
+ * @param {Object} ctx
29
+ * @returns {string}
30
+ */
31
+ function slackMcpProfileUrl(ctx) {
32
+ return chatgptProfileUrl(ctx, SLACK_MCP_CALLBACK_CONTRACT);
33
+ }
34
+
35
+ /**
36
+ * @param {Object} params
37
+ * @returns {Promise<Object>}
38
+ */
39
+ async function registerSlackMcpCallback(params) {
40
+ return registerChatGptCallbackUrls({
41
+ ...params,
42
+ callbackUrls: [SLACK_MCP_CALLBACK_URI],
43
+ contract: SLACK_MCP_CALLBACK_CONTRACT
44
+ });
45
+ }
46
+
47
+ module.exports = {
48
+ SLACK_MCP_CALLBACK_CONTRACT,
49
+ slackMcpProfileUrl,
50
+ registerSlackMcpCallback
51
+ };