@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,83 @@
1
+ /**
2
+ * Installed Agent Kit state file.
3
+ * @fileoverview Read/write .aifabrix/agent-kit.yaml
4
+ */
5
+
6
+ 'use strict';
7
+
8
+ const path = require('path');
9
+ const yaml = require('js-yaml');
10
+ const fs = require('../internal/fs-real-sync');
11
+ const { STATE_RELATIVE, SECTION_ID } = require('./constants');
12
+
13
+ /**
14
+ * @param {string} repoRoot
15
+ * @returns {string}
16
+ */
17
+ function statePath(repoRoot) {
18
+ return path.join(repoRoot, STATE_RELATIVE);
19
+ }
20
+
21
+ /**
22
+ * @param {string} repoRoot
23
+ * @returns {object|null}
24
+ */
25
+ function loadState(repoRoot) {
26
+ const filePath = statePath(repoRoot);
27
+ if (!fs.existsSync(filePath)) {
28
+ return null;
29
+ }
30
+ const parsed = yaml.load(fs.readFileSync(filePath, 'utf8'));
31
+ if (!parsed || typeof parsed !== 'object') {
32
+ return null;
33
+ }
34
+ return parsed;
35
+ }
36
+
37
+ /**
38
+ * @param {object} kit
39
+ * @param {string[]} hosts
40
+ * @param {object[]} ops
41
+ * @param {string} builderVersion
42
+ * @returns {object}
43
+ */
44
+ function buildStateDocument(kit, hosts, ops, builderVersion) {
45
+ const managedFiles = [];
46
+ for (const op of ops) {
47
+ if (op.action === 'delete' || op.action === 'retain' || op.action === 'conflict') {
48
+ continue;
49
+ }
50
+ if (op.action === 'skip' && op.fileState === 'MISSING') {
51
+ continue;
52
+ }
53
+ if (!op.targetRel || op.mode === 'obsolete' || op.mode === 'if-missing') {
54
+ continue;
55
+ }
56
+ const row = { path: op.targetRel, sha256: op.sourceHash };
57
+ if (op.mode === 'managed-section') {
58
+ row.section = SECTION_ID;
59
+ }
60
+ managedFiles.push(row);
61
+ }
62
+ return {
63
+ schemaVersion: '1',
64
+ kitVersion: kit.manifest.kitVersion,
65
+ builderVersion,
66
+ installedAt: new Date().toISOString(),
67
+ hosts,
68
+ managedFiles
69
+ };
70
+ }
71
+
72
+ /**
73
+ * @param {string} repoRoot
74
+ * @param {object} doc
75
+ * @returns {void}
76
+ */
77
+ function writeState(repoRoot, doc) {
78
+ const filePath = statePath(repoRoot);
79
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
80
+ fs.writeFileSync(filePath, yaml.dump(doc, { lineWidth: 120, noRefs: true, sortKeys: false }), 'utf8');
81
+ }
82
+
83
+ module.exports = { statePath, loadState, buildStateDocument, writeState };
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Agent Kit status.
3
+ * @fileoverview Classify installed files without writing
4
+ */
5
+
6
+ 'use strict';
7
+
8
+ const { getCliVersion } = require('../utils/installation-log-core');
9
+ const { resolveGitRoot } = require('./repo-guard');
10
+ const { loadKitPackage } = require('./package-load');
11
+ const { listManagedTargets } = require('./file-list');
12
+ const { classifyItems } = require('./classify');
13
+ const { detectV1, listObsoleteV1Items } = require('./v1-detect');
14
+ const { loadState } = require('./state-file');
15
+ const { ACTION } = require('./constants');
16
+ const { kitStateName, buildJsonReport } = require('./report');
17
+ const { ALL_HOSTS } = require('./hosts');
18
+
19
+ /**
20
+ * @param {object} options
21
+ * @returns {object}
22
+ */
23
+ function runStatus(options) {
24
+ const repoRoot = resolveGitRoot(options.cwd || process.cwd());
25
+ const kit = loadKitPackage();
26
+ const state = loadState(repoRoot);
27
+ const includeShims = detectV1(repoRoot);
28
+ const hosts = (state && state.hosts) || ALL_HOSTS.slice();
29
+ const includeClaude = hosts.includes('claude');
30
+ const items = listManagedTargets(kit, repoRoot, {
31
+ includeShims: includeShims && hosts.includes('cursor'),
32
+ includeClaude
33
+ });
34
+ classifyItems(items, state, hosts);
35
+ items.push(...listObsoleteV1Items(kit, repoRoot, new Set(items.map((item) => item.targetRel))));
36
+ const ops = items.map((item) => ({ ...item, action: ACTION.SKIP }));
37
+ const kitState = kitStateName(state, kit, ops);
38
+ return buildJsonReport({
39
+ command: 'status',
40
+ kit,
41
+ state,
42
+ hosts,
43
+ ops,
44
+ dryRun: true,
45
+ builderVersion: getCliVersion(),
46
+ kitState
47
+ });
48
+ }
49
+
50
+ module.exports = { runStatus };
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Detect v1 Agent Kit files in a customer repository.
3
+ * @fileoverview Name + hash detection for migration
4
+ */
5
+
6
+ 'use strict';
7
+
8
+ const path = require('path');
9
+ const fs = require('../internal/fs-real-sync');
10
+ const { V1_MARKERS, FILE_STATE } = require('./constants');
11
+ const { sha256File } = require('./checksums');
12
+
13
+ /**
14
+ * @param {string} repoRoot
15
+ * @returns {boolean}
16
+ */
17
+ function detectV1(repoRoot) {
18
+ return V1_MARKERS.some((rel) => fs.existsSync(path.join(repoRoot, rel)));
19
+ }
20
+
21
+ /**
22
+ * @param {object} kit
23
+ * @param {string} repoRoot
24
+ * @param {Set<string>} managedRels
25
+ * @returns {object[]}
26
+ */
27
+ function listObsoleteV1Items(kit, repoRoot, managedRels) {
28
+ const rows = (kit.inventory && kit.inventory.v1Files) || [];
29
+ const items = [];
30
+ for (const row of rows) {
31
+ if (row.disposition === 'shim' || !row.installedPath) {
32
+ continue;
33
+ }
34
+ if (managedRels.has(row.installedPath)) {
35
+ continue;
36
+ }
37
+ const targetAbs = path.join(repoRoot, row.installedPath);
38
+ if (!fs.existsSync(targetAbs)) {
39
+ continue;
40
+ }
41
+ const hash = sha256File(targetAbs);
42
+ const unchanged = hash === row.sha256;
43
+ items.push({
44
+ sourceAbs: null,
45
+ targetRel: row.installedPath,
46
+ targetAbs,
47
+ mode: 'obsolete',
48
+ sourceHash: row.sha256,
49
+ currentHash: hash,
50
+ fileState: unchanged
51
+ ? FILE_STATE.OBSOLETE_UNCHANGED_MANAGED
52
+ : FILE_STATE.OBSOLETE_MODIFIED_MANAGED,
53
+ v1Owner: row.owner
54
+ });
55
+ }
56
+ return items;
57
+ }
58
+
59
+ /**
60
+ * Replace unmodified v1 command files with thin shims on install.
61
+ * @param {object[]} items
62
+ * @param {object} kit
63
+ * @returns {void}
64
+ */
65
+ function markV1ShimReplacements(items, kit) {
66
+ const byPath = new Map();
67
+ for (const row of (kit.inventory && kit.inventory.v1Files) || []) {
68
+ byPath.set(row.installedPath, row);
69
+ }
70
+ for (const item of items) {
71
+ if (!item.optional || !item.currentHash) {
72
+ continue;
73
+ }
74
+ const row = byPath.get(item.targetRel);
75
+ if (row && row.disposition === 'shim' && item.currentHash === row.sha256) {
76
+ item.replaceOnInstall = true;
77
+ }
78
+ }
79
+ }
80
+
81
+ module.exports = { detectV1, listObsoleteV1Items, markV1ShimReplacements };
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Validate bundled Agent Kit package and optional install.
3
+ * @fileoverview Schema, paths, skill names, installed conflicts
4
+ */
5
+
6
+ 'use strict';
7
+
8
+ const path = require('path');
9
+ const fs = require('../internal/fs-real-sync');
10
+ const { loadKitPackage } = require('./package-load');
11
+ const { listTreeFiles } = require('./file-list');
12
+ const { runStatus } = require('./status');
13
+ const { KIT_STATE } = require('./constants');
14
+
15
+ const FORBIDDEN_RE = /@[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}|kv:\/\/[^\s]+\/[A-Za-z0-9+/]{12,}|\/home\/[a-z0-9]+\/(?!dev)/i;
16
+
17
+ /**
18
+ * @param {object} kit
19
+ * @returns {string[]}
20
+ */
21
+ function collectPackageErrors(kit) {
22
+ const errors = [];
23
+ const names = kit.manifest.skills || [];
24
+ if (new Set(names).size !== names.length) {
25
+ errors.push('Duplicate skill name in agent-kit.yaml.');
26
+ }
27
+ for (const name of names) {
28
+ const skillMd = path.join(kit.root, 'skills', name, 'SKILL.md');
29
+ if (!fs.existsSync(skillMd)) {
30
+ errors.push(`Missing SKILL.md for ${name}.`);
31
+ }
32
+ }
33
+ for (const spec of [...(kit.manifest.managed || []), ...(kit.manifest.optional || [])]) {
34
+ const sourceAbs = path.join(kit.root, spec.source);
35
+ if (!fs.existsSync(sourceAbs)) {
36
+ errors.push(`Managed source missing: ${spec.source}`);
37
+ }
38
+ }
39
+ return errors;
40
+ }
41
+
42
+ /**
43
+ * @param {object} kit
44
+ * @returns {string[]}
45
+ */
46
+ function collectContentErrors(kit) {
47
+ const errors = [];
48
+ for (const file of listTreeFiles(kit.root, '')) {
49
+ if (file.rel === 'parity-inventory.yaml') {
50
+ continue;
51
+ }
52
+ const text = fs.readFileSync(file.abs, 'utf8');
53
+ if (FORBIDDEN_RE.test(text)) {
54
+ errors.push(`Forbidden customer/secret pattern in ${file.rel}`);
55
+ }
56
+ }
57
+ return errors;
58
+ }
59
+
60
+ /**
61
+ * @param {object} [options]
62
+ * @returns {object}
63
+ */
64
+ function runValidate(options = {}) {
65
+ const kit = loadKitPackage();
66
+ const errors = [...collectPackageErrors(kit), ...collectContentErrors(kit)];
67
+ let install = null;
68
+ try {
69
+ install = runStatus(options);
70
+ } catch (error) {
71
+ if (!String(error.message || '').includes('git repository')) {
72
+ throw error;
73
+ }
74
+ }
75
+ if (install && install.state === KIT_STATE.CONFLICTS) {
76
+ errors.push(`Install conflicts: ${install.conflicts.join(', ')}`);
77
+ }
78
+ return {
79
+ success: errors.length === 0,
80
+ command: 'validate',
81
+ kitVersion: kit.manifest.kitVersion,
82
+ errors,
83
+ install
84
+ };
85
+ }
86
+
87
+ module.exports = { runValidate, collectPackageErrors, collectContentErrors };
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Resolve workspace directory name for agent-kit init.
3
+ * @fileoverview Name authority — never rewrite cust-* to aif-*
4
+ */
5
+
6
+ 'use strict';
7
+
8
+ const path = require('path');
9
+
10
+ /**
11
+ * @param {string|undefined} nameOrPath
12
+ * @param {string} cwd
13
+ * @returns {{ targetAbs: string, workspaceName: string }}
14
+ */
15
+ function resolveWorkspaceTarget(nameOrPath, cwd) {
16
+ const base = path.resolve(cwd || process.cwd());
17
+ if (!nameOrPath || !String(nameOrPath).trim()) {
18
+ throw new Error('Workspace name or path is required. Example: aifabrix agent-kit init cust-demo');
19
+ }
20
+ const raw = String(nameOrPath).trim();
21
+ const looksLikePath =
22
+ path.isAbsolute(raw) || raw.includes('/') || raw.includes('\\') || raw === '.' || raw.startsWith('.');
23
+ const targetAbs = looksLikePath ? path.resolve(base, raw) : path.join(base, raw);
24
+ const workspaceName = path.basename(targetAbs);
25
+ if (!workspaceName || workspaceName === '.' || workspaceName === '..') {
26
+ throw new Error('Could not derive a workspace name from the path.');
27
+ }
28
+ return { targetAbs, workspaceName };
29
+ }
30
+
31
+ /**
32
+ * Preserve user-supplied names; never rewrite cust-* prefixes.
33
+ * @param {string} name
34
+ * @returns {string}
35
+ */
36
+ function assertNameUnchanged(name) {
37
+ return name;
38
+ }
39
+
40
+ module.exports = { resolveWorkspaceTarget, assertNameUnchanged };
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Copy product-neutral workspace skeleton for agent-kit init.
3
+ * @fileoverview templates/agent-kit/workspace → target
4
+ */
5
+
6
+ 'use strict';
7
+
8
+ const path = require('path');
9
+ const fs = require('../internal/fs-real-sync');
10
+ const { getKitRoot } = require('./kit-root');
11
+
12
+ /**
13
+ * @returns {string}
14
+ */
15
+ function getWorkspaceTemplateRoot() {
16
+ return path.join(getKitRoot(), 'workspace');
17
+ }
18
+
19
+ /**
20
+ * @param {string} text
21
+ * @param {{ workspaceName: string, year?: number, copyrightHolder?: string }} vars
22
+ * @returns {string}
23
+ */
24
+ function applyPlaceholders(text, vars) {
25
+ return String(text)
26
+ .replace(/\{\{workspaceName\}\}/g, vars.workspaceName)
27
+ .replace(/\{\{year\}\}/g, String(vars.year || new Date().getFullYear()))
28
+ .replace(/\{\{copyrightHolder\}\}/g, vars.copyrightHolder || 'Copyright Holder');
29
+ }
30
+
31
+ /**
32
+ * @param {string} absDir
33
+ * @param {string} relPrefix
34
+ * @returns {{ rel: string, abs: string }[]}
35
+ */
36
+ function listTemplateFiles(absDir, relPrefix) {
37
+ if (!fs.existsSync(absDir)) {
38
+ return [];
39
+ }
40
+ const out = [];
41
+ for (const ent of fs.readdirSync(absDir, { withFileTypes: true })) {
42
+ const rel = relPrefix ? `${relPrefix}/${ent.name}` : ent.name;
43
+ const abs = path.join(absDir, ent.name);
44
+ if (ent.isDirectory()) {
45
+ out.push(...listTemplateFiles(abs, rel));
46
+ } else if (ent.name !== 'LICENSE.mit') {
47
+ out.push({ rel, abs });
48
+ }
49
+ }
50
+ return out;
51
+ }
52
+
53
+ /**
54
+ * @param {string} targetAbs
55
+ * @param {{ workspaceName: string, license?: string, dryRun?: boolean }} options
56
+ * @returns {string[]} written relative paths
57
+ */
58
+ function writeWorkspaceSkeleton(targetAbs, options) {
59
+ const written = [];
60
+ const vars = { workspaceName: options.workspaceName };
61
+ const root = getWorkspaceTemplateRoot();
62
+ for (const file of listTemplateFiles(root, '')) {
63
+ const dest = path.join(targetAbs, file.rel);
64
+ if (!options.dryRun) {
65
+ fs.mkdirSync(path.dirname(dest), { recursive: true });
66
+ const body = applyPlaceholders(fs.readFileSync(file.abs, 'utf8'), vars);
67
+ fs.writeFileSync(dest, body, 'utf8');
68
+ }
69
+ written.push(file.rel);
70
+ }
71
+ if (options.license === 'mit') {
72
+ const src = path.join(root, 'LICENSE.mit');
73
+ const dest = path.join(targetAbs, 'LICENSE');
74
+ if (!options.dryRun && fs.existsSync(src)) {
75
+ fs.writeFileSync(dest, applyPlaceholders(fs.readFileSync(src, 'utf8'), vars), 'utf8');
76
+ }
77
+ written.push('LICENSE');
78
+ }
79
+ if (!options.dryRun) {
80
+ fs.mkdirSync(path.join(targetAbs, 'integration'), { recursive: true });
81
+ fs.mkdirSync(path.join(targetAbs, 'role-assistant'), { recursive: true });
82
+ }
83
+ return written;
84
+ }
85
+
86
+ /**
87
+ * @param {string} targetAbs
88
+ * @returns {boolean}
89
+ */
90
+ function isNonEmptyDirectory(targetAbs) {
91
+ if (!fs.existsSync(targetAbs)) {
92
+ return false;
93
+ }
94
+ const entries = fs.readdirSync(targetAbs).filter((name) => name !== '.git');
95
+ return entries.length > 0;
96
+ }
97
+
98
+ module.exports = {
99
+ getWorkspaceTemplateRoot,
100
+ applyPlaceholders,
101
+ writeWorkspaceSkeleton,
102
+ isNonEmptyDirectory
103
+ };
@@ -8,20 +8,23 @@
8
8
 
9
9
  const { createDataplaneApiClient } = require('./index');
10
10
 
11
+ function encodeAssistantPathKey(assistantKey) {
12
+ return encodeURIComponent(String(assistantKey || '').trim());
13
+ }
14
+
11
15
  /**
12
16
  * GET /api/v1/admin/assistants/{assistantKey}
13
17
  * @async
14
18
  * @function getAssistantDetails
15
19
  * @param {string} dataplaneUrl - Dataplane base URL
16
- * @param {string} assistantKey - Role Assistant / digital worker key
20
+ * @param {string} assistantKey - Digital worker system key (exact; never rewritten)
17
21
  * @param {Object} authConfig - Auth config for dataplane client
18
22
  * @returns {Promise<Object>} API response
19
23
  * @requiresPermission {Dataplane} worker:read
20
24
  */
21
25
  async function getAssistantDetails(dataplaneUrl, assistantKey, authConfig) {
22
26
  const client = createDataplaneApiClient(dataplaneUrl, authConfig);
23
- const key = encodeURIComponent(String(assistantKey || '').trim());
24
- return await client.get(`/api/v1/admin/assistants/${key}`);
27
+ return await client.get(`/api/v1/admin/assistants/${encodeAssistantPathKey(assistantKey)}`);
25
28
  }
26
29
 
27
30
  /**
@@ -29,7 +32,7 @@ async function getAssistantDetails(dataplaneUrl, assistantKey, authConfig) {
29
32
  * @async
30
33
  * @function updateAssistantSettings
31
34
  * @param {string} dataplaneUrl
32
- * @param {string} assistantKey
35
+ * @param {string} assistantKey - Digital worker system key (exact; never rewritten)
33
36
  * @param {Object} authConfig
34
37
  * @param {Object} body - AssistantSettingsUpdate fields
35
38
  * @returns {Promise<Object>}
@@ -37,7 +40,7 @@ async function getAssistantDetails(dataplaneUrl, assistantKey, authConfig) {
37
40
  */
38
41
  async function updateAssistantSettings(dataplaneUrl, assistantKey, authConfig, body) {
39
42
  const client = createDataplaneApiClient(dataplaneUrl, authConfig);
40
- const key = encodeURIComponent(String(assistantKey || '').trim());
43
+ const key = encodeAssistantPathKey(assistantKey);
41
44
  return await client.patch(`/api/v1/admin/assistants/${key}/settings`, { body });
42
45
  }
43
46
 
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Dataplane channel identity mapping API.
3
+ *
4
+ * @fileoverview Admin batch upsert for Slack/Teams → platform user ids
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const { createDataplaneApiClient } = require('./index');
10
+
11
+ const MAPPINGS_ENDPOINT = '/api/v1/assistant/channel-identity/mappings';
12
+
13
+ /**
14
+ * Upsert channel_user_identity rows (matched pairs only).
15
+ * @requiresPermission {Dataplane} worker:update
16
+ * @async
17
+ * @param {string} dataplaneUrl
18
+ * @param {Object} authConfig
19
+ * @param {{ sourceChannel: string, items: Array<{ externalUserId: string, platformUserId: string }> }} body
20
+ * @returns {Promise<{ sourceChannel?: string, linked?: number }>}
21
+ */
22
+ async function upsertChannelIdentityMappings(dataplaneUrl, authConfig, body) {
23
+ if (!dataplaneUrl || typeof dataplaneUrl !== 'string') {
24
+ throw new Error('dataplaneUrl is required and must be a string');
25
+ }
26
+ const items = body && Array.isArray(body.items) ? body.items : [];
27
+ if (items.length === 0) {
28
+ return { sourceChannel: body && body.sourceChannel, linked: 0 };
29
+ }
30
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
31
+ return await client.post(MAPPINGS_ENDPOINT, {
32
+ body: {
33
+ sourceChannel: body.sourceChannel,
34
+ items
35
+ }
36
+ });
37
+ }
38
+
39
+ module.exports = {
40
+ upsertChannelIdentityMappings
41
+ };
@@ -10,6 +10,7 @@ const { createDataplaneApiClient } = require('./index');
10
10
  const { listEvidenceKinds } = require('./evidence-kinds.api');
11
11
  const { listResourceTypes } = require('./resource-types.api');
12
12
  const { getAssistantDetails } = require('./assistants.api');
13
+ const { roleAssistantSystemKey } = require('../utils/role-assistant-paths');
13
14
  const {
14
15
  listEvidence,
15
16
  loadEvidenceBulk,
@@ -191,8 +192,11 @@ async function getEvidenceMetadata(dataplaneUrl, authConfig, roleKey, options =
191
192
  throw new Error('controllerUrl is required for evidence.metadata');
192
193
  }
193
194
 
195
+ // Evidence.roleKey is the business role. Assistant HTTP uses the digital-worker
196
+ // system key (ra-{roleKey}), which is a different resource than a connected system.
197
+ const assistantKey = roleAssistantSystemKey(normalizedRoleKey) || normalizedRoleKey;
194
198
  const [assistantDetails, evidenceKindsRes, resourceTypesRes, evidenceRows] = await Promise.all([
195
- getAssistantDetails(dataplaneUrl, normalizedRoleKey, authConfig),
199
+ getAssistantDetails(dataplaneUrl, assistantKey, authConfig),
196
200
  listEvidenceKinds(options.controllerUrl, authConfig, { page: 1, pageSize: 500 }),
197
201
  listResourceTypes(options.controllerUrl, authConfig, { page: 1, pageSize: 500 }),
198
202
  listEvidence(dataplaneUrl, authConfig, { roleKey: normalizedRoleKey }, options)
@@ -62,6 +62,8 @@ async function listEvidence(dataplaneUrl, authConfig, params = {}, options = {})
62
62
  if (params.roleKey) query.roleKey = params.roleKey;
63
63
  if (params.genericOnly === true) query.genericOnly = true;
64
64
  if (params.status) query.status = params.status;
65
+ if (params.page) query.page = params.page;
66
+ if (params.pageSize) query.pageSize = params.pageSize;
65
67
  const res = assertApiSuccess(
66
68
  await client.get(BASE, { params: query }),
67
69
  'List evidence'
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Dataplane Role Assistant test pack CRUD + case status.
3
+ *
4
+ * @fileoverview PUT/GET pack and PATCH case status
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const { createDataplaneApiClient } = require('./index');
12
+ const { throwIfApiFailed } = require('./api-response-errors');
13
+ const { unwrapApiData } = require('../utils/external-system-readiness-core');
14
+
15
+ function packEndpoint(dataplaneUrl, systemIdOrKey, suffix) {
16
+ const base = String(dataplaneUrl || '').replace(/\/$/, '');
17
+ const key = encodeURIComponent(systemIdOrKey);
18
+ return `${base}/api/v1/external/systems/${key}/role-assistant-tests${suffix || ''}`;
19
+ }
20
+
21
+ function packPath(systemIdOrKey, suffix) {
22
+ const key = encodeURIComponent(systemIdOrKey);
23
+ return `/api/v1/external/systems/${key}/role-assistant-tests${suffix || ''}`;
24
+ }
25
+
26
+ function isMissingPackResponse(res) {
27
+ return Boolean(res && res.success === false && Number(res.status) === 404);
28
+ }
29
+
30
+ /**
31
+ * PUT /api/v1/external/systems/{systemIdOrKey}/role-assistant-tests
32
+ * @requiresPermission {Dataplane} external-system:update
33
+ * @async
34
+ */
35
+ async function upsertRoleAssistantTestPack(dataplaneUrl, authConfig, systemIdOrKey, pack) {
36
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
37
+ const res = await client.put(packPath(systemIdOrKey), { body: { pack } });
38
+ throwIfApiFailed(res, {
39
+ endpointUrl: packEndpoint(dataplaneUrl, systemIdOrKey, '')
40
+ });
41
+ return unwrapApiData(res);
42
+ }
43
+
44
+ /**
45
+ * GET /api/v1/external/systems/{systemIdOrKey}/role-assistant-tests
46
+ * @requiresPermission {Dataplane} external-system:read
47
+ * @async
48
+ */
49
+ async function getRoleAssistantTestPack(dataplaneUrl, authConfig, systemIdOrKey, options = {}) {
50
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
51
+ const res = await client.get(packPath(systemIdOrKey));
52
+ if (options.allowMissing === true && isMissingPackResponse(res)) {
53
+ return null;
54
+ }
55
+ throwIfApiFailed(res, {
56
+ endpointUrl: packEndpoint(dataplaneUrl, systemIdOrKey, '')
57
+ });
58
+ return unwrapApiData(res);
59
+ }
60
+
61
+ /**
62
+ * PATCH /api/v1/external/systems/{systemIdOrKey}/role-assistant-tests/cases/{caseId}/status
63
+ * @requiresPermission {Dataplane} external-system:update
64
+ * @async
65
+ */
66
+ async function patchRoleAssistantTestCaseStatus(
67
+ dataplaneUrl,
68
+ authConfig,
69
+ systemIdOrKey,
70
+ caseId,
71
+ body
72
+ ) {
73
+ const suffix = `/cases/${encodeURIComponent(caseId)}/status`;
74
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
75
+ const res = await client.patch(packPath(systemIdOrKey, suffix), { body });
76
+ throwIfApiFailed(res, {
77
+ endpointUrl: packEndpoint(dataplaneUrl, systemIdOrKey, suffix)
78
+ });
79
+ return unwrapApiData(res);
80
+ }
81
+
82
+ module.exports = {
83
+ upsertRoleAssistantTestPack,
84
+ getRoleAssistantTestPack,
85
+ patchRoleAssistantTestCaseStatus
86
+ };
@@ -111,6 +111,8 @@
111
111
  * @property {string} [search]
112
112
  * @property {number} [limit]
113
113
  * @property {number} [offset]
114
+ * @property {number} [page]
115
+ * @property {number} [pageSize]
114
116
  */
115
117
 
116
118
  /**