@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,156 @@
1
+ /**
2
+ * Slackbot MCP Client packaging (opt-in). Auth freeze: manual_auth.
3
+ *
4
+ * @fileoverview Slack MCP manifest fields from discovery; HMAC path stays default
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const SLACK_MCP_AUTH_TYPE = 'manual_auth';
10
+ const SLACK_MCP_AUTH_PROVIDER_KEY = 'mcp_aifabrix';
11
+ const SLACK_MCP_SERVER_KEY = 'runtime-orchestration';
12
+ const SLACK_MCP_CALLBACK_URI = 'https://oauth2.slack.com/external/auth/callback';
13
+ const SLACK_MCP_OAUTH_SCOPES = ['openid', 'profile', 'email', 'offline_access'];
14
+ const SLACK_MCP_CAPABILITY = 'customerOAuth';
15
+ const SLACK_MCP_MISSING_URL = 'Runtime MCP URL is missing.';
16
+
17
+ /**
18
+ * @param {string} [controllerUrl]
19
+ * @param {string} [mcpUrl]
20
+ * @param {string} [dataplaneBaseUrl]
21
+ * @returns {string}
22
+ */
23
+ function authorizationServerBase(controllerUrl, mcpUrl, dataplaneBaseUrl) {
24
+ const candidate = controllerUrl || mcpUrl || dataplaneBaseUrl;
25
+ try {
26
+ return `${new URL(candidate).origin}/auth/realms/aifabrix`;
27
+ } catch {
28
+ return '';
29
+ }
30
+ }
31
+
32
+ /**
33
+ * @param {string} asBase
34
+ * @returns {{ authorizationUrl: string, tokenUrl: string }}
35
+ */
36
+ function keycloakEndpoints(asBase) {
37
+ if (!asBase) {
38
+ return { authorizationUrl: '', tokenUrl: '' };
39
+ }
40
+ return {
41
+ authorizationUrl: `${asBase}/protocol/openid-connect/auth`,
42
+ tokenUrl: `${asBase}/protocol/openid-connect/token`
43
+ };
44
+ }
45
+
46
+ /**
47
+ * @param {Object} resolved
48
+ * @returns {void}
49
+ */
50
+ function clearSlackMcpPackaging(resolved) {
51
+ resolved.slackMcpAuthType = '';
52
+ resolved.slackMcpAuthProviderKey = '';
53
+ resolved.slackMcpCallbackUri = '';
54
+ resolved.slackMcpCapability = '';
55
+ resolved.slackMcpServersJson = '';
56
+ resolved.slackExternalAuthJson = '';
57
+ }
58
+
59
+ /**
60
+ * @param {Object} resolved
61
+ * @returns {boolean}
62
+ */
63
+ function selectsCustomerOAuth(resolved) {
64
+ const caps = resolved.discoveryAuthenticationCapabilities;
65
+ if (!Array.isArray(caps) || caps.length === 0) {
66
+ return true;
67
+ }
68
+ return caps.includes(SLACK_MCP_CAPABILITY);
69
+ }
70
+
71
+ /**
72
+ * @param {Object} resolved
73
+ * @param {Object} params
74
+ * @param {string} mcpUrl
75
+ * @returns {Object}
76
+ */
77
+ function buildExternalAuthProviders(resolved, params, mcpUrl) {
78
+ const asBase = authorizationServerBase(
79
+ params && params.controllerUrl,
80
+ mcpUrl,
81
+ resolved.dataplaneBaseUrl
82
+ );
83
+ const endpoints = keycloakEndpoints(asBase);
84
+ const provider = {
85
+ authorization_url: endpoints.authorizationUrl,
86
+ token_url: endpoints.tokenUrl,
87
+ scope: SLACK_MCP_OAUTH_SCOPES,
88
+ use_pkce: true,
89
+ identity_config: null
90
+ };
91
+ const clientId =
92
+ typeof resolved.slackMcpClientId === 'string' ? resolved.slackMcpClientId.trim() : '';
93
+ if (clientId) {
94
+ provider.client_id = clientId;
95
+ }
96
+ return { oauth2: { [SLACK_MCP_AUTH_PROVIDER_KEY]: provider } };
97
+ }
98
+
99
+ /**
100
+ * @param {Object} resolved
101
+ * @param {Object} [params]
102
+ * @returns {void}
103
+ */
104
+ function applySlackMcpRuntimeValues(resolved, params) {
105
+ if (!resolved.enableMcpServer) {
106
+ clearSlackMcpPackaging(resolved);
107
+ return;
108
+ }
109
+ const mcpUrl = typeof resolved.mcpUrl === 'string' ? resolved.mcpUrl.trim() : '';
110
+ if (!mcpUrl) {
111
+ throw new Error(SLACK_MCP_MISSING_URL);
112
+ }
113
+ if (!selectsCustomerOAuth(resolved)) {
114
+ throw new Error('Slack MCP requires customerOAuth on Runtime discovery.');
115
+ }
116
+ resolved.slackMcpAuthType = SLACK_MCP_AUTH_TYPE;
117
+ resolved.slackMcpAuthProviderKey = SLACK_MCP_AUTH_PROVIDER_KEY;
118
+ resolved.slackMcpCallbackUri = SLACK_MCP_CALLBACK_URI;
119
+ resolved.slackMcpCapability = SLACK_MCP_CAPABILITY;
120
+ resolved.slackMcpServersJson = JSON.stringify({
121
+ [SLACK_MCP_SERVER_KEY]: {
122
+ url: mcpUrl,
123
+ auth_type: SLACK_MCP_AUTH_TYPE,
124
+ auth_provider_key: SLACK_MCP_AUTH_PROVIDER_KEY
125
+ }
126
+ });
127
+ resolved.slackExternalAuthJson = JSON.stringify(
128
+ buildExternalAuthProviders(resolved, params || {}, mcpUrl)
129
+ );
130
+ }
131
+
132
+ /**
133
+ * @param {Object} [runtimeValues]
134
+ * @returns {string[]}
135
+ */
136
+ function slackMcpRemainingSteps(runtimeValues) {
137
+ if (!runtimeValues || !runtimeValues.enableMcpServer) {
138
+ return [];
139
+ }
140
+ return [
141
+ 'Connect the AI Fabrix MCP server in Slack',
142
+ 'Complete sign-in at AI Fabrix when Slack asks'
143
+ ];
144
+ }
145
+
146
+ module.exports = {
147
+ SLACK_MCP_AUTH_TYPE,
148
+ SLACK_MCP_AUTH_PROVIDER_KEY,
149
+ SLACK_MCP_SERVER_KEY,
150
+ SLACK_MCP_CALLBACK_URI,
151
+ SLACK_MCP_OAUTH_SCOPES,
152
+ SLACK_MCP_CAPABILITY,
153
+ SLACK_MCP_MISSING_URL,
154
+ applySlackMcpRuntimeValues,
155
+ slackMcpRemainingSteps
156
+ };
@@ -0,0 +1,181 @@
1
+ /**
2
+ * Slack Manifest API via documented `slack api` methods.
3
+ *
4
+ * @fileoverview create / update / validate — signing_secret only on create
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const { runSlackApi, runNativeAppInstall } = require('./cli');
10
+ const { slackProvisioningError } = require('./errors');
11
+ const { pickSlackClientId } = require('./remaining-urls');
12
+ const {
13
+ developerInstallApp,
14
+ pickInstalledSlackTokens
15
+ } = require('./developer-install');
16
+
17
+ /**
18
+ * @param {Object} body
19
+ * @returns {Object}
20
+ */
21
+ function requireOk(body) {
22
+ if (body && body.ok === true) {
23
+ return body;
24
+ }
25
+ const detail = body && body.error ? String(body.error) : 'unknown_error';
26
+ const notes = Array.isArray(body && body.errors)
27
+ ? body.errors.map((row) => row && row.message).filter(Boolean).join('; ')
28
+ : '';
29
+ const suffix = notes ? ` (${notes})` : '';
30
+ throw slackProvisioningError(`Slack Manifest API failed: ${detail}${suffix}`, 'SLACK_API');
31
+ }
32
+
33
+ /**
34
+ * @param {Object} manifest
35
+ * @returns {Object}
36
+ */
37
+ function manifestPayload(manifest) {
38
+ return { manifest: JSON.stringify(manifest) };
39
+ }
40
+
41
+ /**
42
+ * @param {Object} manifest
43
+ * @param {Object} [deps]
44
+ * @returns {Promise<Object>}
45
+ */
46
+ async function validateManifestRemote(manifest, deps = {}) {
47
+ const payload = manifestPayload(manifest);
48
+ if (typeof deps.appId === 'string' && deps.appId.trim()) {
49
+ payload.app_id = deps.appId.trim();
50
+ }
51
+ const body = await runSlackApi('apps.manifest.validate', payload, deps);
52
+ return requireOk(body);
53
+ }
54
+
55
+ /**
56
+ * @param {string} appId
57
+ * @param {Object} [deps]
58
+ * @returns {Promise<Object|null>}
59
+ */
60
+ async function exportManifestApp(appId, deps = {}) {
61
+ const result = await exportManifestLookup(appId, deps);
62
+ return result.manifest;
63
+ }
64
+
65
+ /**
66
+ * @param {string} appId
67
+ * @param {Object} [deps]
68
+ * @returns {Promise<{ missing: boolean, manifest: Object|null }>}
69
+ */
70
+ async function exportManifestLookup(appId, deps = {}) {
71
+ if (!appId) {
72
+ return { missing: true, manifest: null };
73
+ }
74
+ const body = await runSlackApi('apps.manifest.export', { app_id: appId }, deps);
75
+ if (body && body.ok === false && body.error === 'app_not_found') {
76
+ return { missing: true, manifest: null };
77
+ }
78
+ if (!body || body.ok === false) {
79
+ return { missing: false, manifest: null };
80
+ }
81
+ return { missing: false, manifest: body.manifest || null };
82
+ }
83
+
84
+ /**
85
+ * @param {Object} manifest
86
+ * @param {Object} [deps]
87
+ * @returns {Promise<Object>}
88
+ */
89
+ async function createManifestApp(manifest, deps = {}) {
90
+ const body = await runSlackApi('apps.manifest.create', manifestPayload(manifest), deps);
91
+ const created = requireOk(body);
92
+ const createdAppId = created.app_id || created.appId;
93
+ if (!createdAppId) {
94
+ throw slackProvisioningError('Slack create did not return an app id.', 'SLACK_API');
95
+ }
96
+ created.app_id = createdAppId;
97
+ return created;
98
+ }
99
+
100
+ /**
101
+ * @param {string} appId
102
+ * @param {Object} manifest
103
+ * @param {Object} [deps]
104
+ * @returns {Promise<Object>}
105
+ */
106
+ async function updateManifestApp(appId, manifest, deps = {}) {
107
+ const body = await runSlackApi(
108
+ 'apps.manifest.update',
109
+ { app_id: appId, ...manifestPayload(manifest) },
110
+ deps
111
+ );
112
+ return requireOk(body);
113
+ }
114
+
115
+ /**
116
+ * Recover public client id when create response omitted it.
117
+ * @param {Object} [captured]
118
+ * @param {Object} [deps]
119
+ * @returns {Promise<string>}
120
+ */
121
+ async function resolveSlackClientId(captured, deps = {}) {
122
+ const existing = pickSlackClientId(captured);
123
+ if (existing) {
124
+ return existing;
125
+ }
126
+ const appId = captured && (captured.appId || captured.app_id);
127
+ if (!appId) {
128
+ return '';
129
+ }
130
+ const exported = await runSlackApi('apps.manifest.export', { app_id: appId }, deps);
131
+ const fromExport = pickSlackClientId(exported);
132
+ if (fromExport) {
133
+ return fromExport;
134
+ }
135
+ const info = await runSlackApi('apps.info', { app: appId }, deps);
136
+ return pickSlackClientId(info && (info.app || info));
137
+ }
138
+
139
+ /**
140
+ * Native Slack CLI `app install` (TTY). Portal quiet mode must not call this.
141
+ * @param {string} appId
142
+ * @param {Object} [deps]
143
+ * @returns {Promise<{ botToken?: string, teamId?: string, botId?: string }>}
144
+ */
145
+ async function nativeInstallApp(appId, deps = {}) {
146
+ if (typeof deps.installApp === 'function') {
147
+ return deps.installApp(appId);
148
+ }
149
+ return pickInstalledSlackTokens(await runNativeAppInstall(appId, deps));
150
+ }
151
+
152
+ /**
153
+ * Workspace install. Prefer apps.developerInstall (HTTP, returns xoxb).
154
+ * @param {string} appId
155
+ * @param {Object} [deps]
156
+ * @returns {Promise<{ botToken?: string, teamId?: string, botId?: string }>}
157
+ */
158
+ async function installManifestApp(appId, deps = {}) {
159
+ const fromApi = await developerInstallApp(appId, deps);
160
+ if (fromApi.botToken) {
161
+ return fromApi;
162
+ }
163
+ if (deps.quiet === true) {
164
+ return fromApi;
165
+ }
166
+ try {
167
+ return (await nativeInstallApp(appId, deps)) || {};
168
+ } catch {
169
+ return {};
170
+ }
171
+ }
172
+
173
+ module.exports = {
174
+ validateManifestRemote,
175
+ exportManifestApp,
176
+ exportManifestLookup,
177
+ createManifestApp,
178
+ updateManifestApp,
179
+ installManifestApp,
180
+ resolveSlackClientId
181
+ };
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Slack CLI login store (`~/.slack/credentials.json`) and `auth list` text.
3
+ *
4
+ * @fileoverview Never log or return tokens from public auth lists
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const fs = require('fs');
10
+ const path = require('path');
11
+ const { slackCliHomeDir } = require('./install-cli');
12
+
13
+ /**
14
+ * @param {Object} [deps]
15
+ * @returns {string}
16
+ */
17
+ function slackCredentialsPath(deps = {}) {
18
+ return path.join(deps.homeDir || slackCliHomeDir(deps.env), '.slack', 'credentials.json');
19
+ }
20
+
21
+ /**
22
+ * @param {Object} data
23
+ * @returns {Object[]}
24
+ */
25
+ function entriesFromCredentialsObject(data) {
26
+ if (!data || typeof data !== 'object' || Array.isArray(data)) {
27
+ return [];
28
+ }
29
+ return Object.entries(data).map(([teamId, row]) => ({
30
+ team_id: String((row && (row.team_id || row.teamId)) || teamId),
31
+ team_domain: (row && (row.team_domain || row.teamDomain)) || undefined,
32
+ user_id: (row && (row.user_id || row.userId)) || undefined,
33
+ token: row && row.token ? String(row.token) : undefined
34
+ }));
35
+ }
36
+
37
+ /**
38
+ * @param {Object} [deps]
39
+ * @returns {Object[]}
40
+ */
41
+ function readSlackCredentialEntries(deps = {}) {
42
+ if (typeof deps.readCredentials === 'function') {
43
+ const listed = deps.readCredentials();
44
+ return Array.isArray(listed) ? listed : [];
45
+ }
46
+ const filePath = slackCredentialsPath(deps);
47
+ if (!fs.existsSync(filePath)) {
48
+ return [];
49
+ }
50
+ try {
51
+ return entriesFromCredentialsObject(JSON.parse(fs.readFileSync(filePath, 'utf8')));
52
+ } catch {
53
+ return [];
54
+ }
55
+ }
56
+
57
+ /**
58
+ * @param {Object[]} entries
59
+ * @returns {Object[]}
60
+ */
61
+ function publicSlackAuths(entries) {
62
+ return (Array.isArray(entries) ? entries : []).map((row) => ({
63
+ team_id: row.team_id,
64
+ team_domain: row.team_domain,
65
+ user_id: row.user_id
66
+ }));
67
+ }
68
+
69
+ /**
70
+ * @param {Object[]} entries
71
+ * @param {string} [teamId]
72
+ * @returns {string|null}
73
+ */
74
+ function slackUserTokenForTeam(entries, teamId) {
75
+ const rows = Array.isArray(entries) ? entries : [];
76
+ const match = teamId
77
+ ? rows.find((row) => String(row.team_id || '') === String(teamId))
78
+ : (rows.length === 1 ? rows[0] : null);
79
+ const token = match && match.token;
80
+ return typeof token === 'string' && token.trim() ? token.trim() : null;
81
+ }
82
+
83
+ /**
84
+ * Slack CLI 4.x `auth list` is human text, not JSON.
85
+ * @param {string} text
86
+ * @returns {Object[]}
87
+ */
88
+ function parseAuthListText(text) {
89
+ const source = String(text || '');
90
+ const auths = [];
91
+ const re = /([A-Za-z0-9._-]+)\s+\(Team ID:\s*(T[A-Z0-9]+)\)[\s\S]*?User ID:\s*(U[A-Z0-9]+)/gi;
92
+ let match = re.exec(source);
93
+ while (match) {
94
+ auths.push({
95
+ team_domain: match[1],
96
+ team_id: match[2],
97
+ user_id: match[3]
98
+ });
99
+ match = re.exec(source);
100
+ }
101
+ return auths;
102
+ }
103
+
104
+ module.exports = {
105
+ slackCredentialsPath,
106
+ readSlackCredentialEntries,
107
+ publicSlackAuths,
108
+ slackUserTokenForTeam,
109
+ parseAuthListText
110
+ };
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Slack CLI ticket handshake for portal channel install.
3
+ *
4
+ * @fileoverview Server runs `slack auth token --no-prompt`; user runs the slash command
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const { promisify } = require('util');
10
+ const execFileDefault = promisify(require('child_process').execFile);
11
+ const { slackProvisioningError, wrapSlackCliError } = require('./errors');
12
+ const { resolveSlackBinary, shouldSkipLiveSlackCli } = require('./cli');
13
+ const { withSlackCliPath, installOfficialSlackCli } = require('./install-cli');
14
+
15
+ const SLASH_RE = /\/slackauthticket\s+(\S+)/i;
16
+ const ACCESS_TOKEN_RE = /\b(xox[peba]-[A-Za-z0-9-]+)\b/i;
17
+ const TICKET_LINE_RE = /^[A-Za-z0-9._-]{16,}$/;
18
+ const AUTH_DEAD_RE = /token_revoked|token_expired|invalid_auth|not_authed|account_inactive/i;
19
+
20
+ /**
21
+ * @param {string} value
22
+ * @returns {boolean}
23
+ */
24
+ function looksLikeSlackAccessToken(value) {
25
+ return ACCESS_TOKEN_RE.test(String(value || '').trim());
26
+ }
27
+
28
+ /**
29
+ * @param {Error|Object|null} error
30
+ * @returns {boolean}
31
+ */
32
+ function isSlackAuthDeadError(error) {
33
+ const message = String((error && error.message) || '');
34
+ return AUTH_DEAD_RE.test(message);
35
+ }
36
+
37
+ /**
38
+ * @param {string} ticket
39
+ * @returns {string}
40
+ */
41
+ function slashCommandForTicket(ticket) {
42
+ const value = String(ticket || '').trim();
43
+ return value ? `/slackauthticket ${value}` : '';
44
+ }
45
+
46
+ /**
47
+ * @param {string} stdout
48
+ * @returns {{ ticket: string, slashCommand: string }}
49
+ */
50
+ function parseAuthTicketStart(stdout) {
51
+ const text = String(stdout || '');
52
+ const slash = text.match(SLASH_RE);
53
+ if (slash) {
54
+ return { ticket: slash[1], slashCommand: slashCommandForTicket(slash[1]) };
55
+ }
56
+ const ticket = firstTicketLine(text);
57
+ if (!ticket) {
58
+ throw slackProvisioningError('Slack CLI did not return an auth ticket.', 'SLACK_CLI');
59
+ }
60
+ return { ticket, slashCommand: slashCommandForTicket(ticket) };
61
+ }
62
+
63
+ /**
64
+ * @param {string} text
65
+ * @returns {string}
66
+ */
67
+ function firstTicketLine(text) {
68
+ for (const line of String(text || '').split(/\r?\n/)) {
69
+ const trimmed = line.trim();
70
+ if (!trimmed || trimmed.startsWith('/') || /challenge|enter|copy/i.test(trimmed)) {
71
+ continue;
72
+ }
73
+ if (TICKET_LINE_RE.test(trimmed) && !looksLikeSlackAccessToken(trimmed)) {
74
+ return trimmed;
75
+ }
76
+ }
77
+ return '';
78
+ }
79
+
80
+ /**
81
+ * @param {string} stdout
82
+ * @returns {string}
83
+ */
84
+ function parseAuthTicketComplete(stdout) {
85
+ const match = String(stdout || '').match(ACCESS_TOKEN_RE);
86
+ if (!match) {
87
+ throw slackProvisioningError('Slack CLI did not return a session token.', 'SLACK_CLI');
88
+ }
89
+ return match[1];
90
+ }
91
+
92
+ /**
93
+ * @param {Object} [deps]
94
+ * @returns {Promise<string>}
95
+ */
96
+ async function ensureSlackCliForTicket(deps = {}) {
97
+ const existing = await resolveSlackBinary(deps);
98
+ if (existing) {
99
+ return existing;
100
+ }
101
+ if (shouldSkipLiveSlackCli(deps)) {
102
+ throw slackProvisioningError(
103
+ 'Slack CLI (`slack`) is not installed or not on PATH.',
104
+ 'SLACK_CLI_MISSING'
105
+ );
106
+ }
107
+ await installOfficialSlackCli(deps);
108
+ const installed = await resolveSlackBinary(deps);
109
+ if (!installed) {
110
+ throw slackProvisioningError(
111
+ 'Slack CLI (`slack`) is not installed or not on PATH.',
112
+ 'SLACK_CLI_MISSING'
113
+ );
114
+ }
115
+ return installed;
116
+ }
117
+
118
+ /**
119
+ * @param {Object} [deps]
120
+ * @returns {Promise<{ ticket: string, slashCommand: string }>}
121
+ */
122
+ async function startSlackAuthTicket(deps = {}) {
123
+ if (typeof deps.startAuthTicket === 'function') {
124
+ return deps.startAuthTicket();
125
+ }
126
+ const bin = await ensureSlackCliForTicket(deps);
127
+ const execFileImpl = deps.execFile || execFileDefault;
128
+ try {
129
+ const result = await execFileImpl(bin, ['auth', 'token', '--no-prompt', '--no-color', '-s'], {
130
+ timeout: deps.timeout || 30000,
131
+ killSignal: 'SIGKILL',
132
+ maxBuffer: 1024 * 1024,
133
+ env: withSlackCliPath(deps.env || process.env)
134
+ });
135
+ return parseAuthTicketStart(result && result.stdout);
136
+ } catch (error) {
137
+ if (error && error.code === 'SLACK_CLI_MISSING') {
138
+ throw error;
139
+ }
140
+ throw wrapSlackCliError(error);
141
+ }
142
+ }
143
+
144
+ /**
145
+ * @param {{ ticket: string, challenge: string }} params
146
+ * @param {Object} [deps]
147
+ * @returns {Promise<string>}
148
+ */
149
+ async function completeSlackAuthTicket(params, deps = {}) {
150
+ if (typeof deps.completeAuthTicket === 'function') {
151
+ return deps.completeAuthTicket(params);
152
+ }
153
+ const ticket = String(params && params.ticket ? params.ticket : '').trim();
154
+ const challenge = String(params && params.challenge ? params.challenge : '').trim();
155
+ if (!ticket || !challenge) {
156
+ throw slackProvisioningError('Challenge code and auth ticket are required.', 'SLACK_CLI');
157
+ }
158
+ const bin = await ensureSlackCliForTicket(deps);
159
+ const execFileImpl = deps.execFile || execFileDefault;
160
+ try {
161
+ const result = await execFileImpl(
162
+ bin,
163
+ ['auth', 'token', '--no-prompt', '--challenge', challenge, '--ticket', ticket, '--no-color', '-s'],
164
+ {
165
+ timeout: deps.timeout || 45000,
166
+ killSignal: 'SIGKILL',
167
+ maxBuffer: 1024 * 1024,
168
+ env: withSlackCliPath(deps.env || process.env)
169
+ }
170
+ );
171
+ return parseAuthTicketComplete(result && result.stdout);
172
+ } catch (error) {
173
+ throw wrapSlackCliError(error);
174
+ }
175
+ }
176
+
177
+ module.exports = {
178
+ looksLikeSlackAccessToken,
179
+ isSlackAuthDeadError,
180
+ slashCommandForTicket,
181
+ parseAuthTicketStart,
182
+ parseAuthTicketComplete,
183
+ startSlackAuthTicket,
184
+ completeSlackAuthTicket
185
+ };