@aifabrix/builder 2.49.2 → 2.51.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 (459) hide show
  1. package/.cursor/plans/157.1-security-quality-violations-by-type.csv +374 -0
  2. package/.cursor/rules/assistant-driven-integration-build.mdc +40 -0
  3. package/.cursor/rules/deploy-rules/docker-image-ip-policy.mdc +49 -0
  4. package/.cursor/rules/plan-rules/application-lifecycle.mdc +30 -0
  5. package/.cursor/rules/plan-rules/plan-frontmatter.mdc +35 -0
  6. package/.cursor/rules/plan-rules/plan-lifecycle.mdc +31 -0
  7. package/.cursor/rules/plan-rules/plan-validation-gate.mdc +34 -0
  8. package/.cursor/skills/README.md +1 -0
  9. package/.dockerignore +52 -0
  10. package/.eslintignore +22 -0
  11. package/README.md +2 -0
  12. package/bin/builder-api-cleanup.js +26 -0
  13. package/bin/builder-api-nest.js +10 -0
  14. package/bin/builder-api-spike.js +19 -0
  15. package/enterprise-knowledge/README.md +50 -0
  16. package/enterprise-knowledge/enterprise-integration-lifecycle/README.md +22 -0
  17. package/enterprise-knowledge/enterprise-integration-lifecycle/application.json +15 -0
  18. package/enterprise-knowledge/enterprise-integration-lifecycle/deploy.js +69 -0
  19. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-deploy.json +52 -0
  20. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-system.json +29 -0
  21. package/enterprise-knowledge/enterprise-integration-lifecycle/env.template +2 -0
  22. package/integration/README.md +81 -0
  23. package/integration/github/README.md +53 -0
  24. package/integration/github/application.json +21 -0
  25. package/integration/github/deploy.js +72 -0
  26. package/integration/github/env.template +11 -0
  27. package/integration/github/github-datasource-issue-comments.json +239 -0
  28. package/integration/github/github-datasource-issues.json +399 -0
  29. package/integration/github/github-datasource-repository.json +354 -0
  30. package/integration/github/github-deploy.json +1202 -0
  31. package/integration/github/github-system.json +82 -0
  32. package/integration/hubspot-test/README.md +1 -1
  33. package/integration/hubspot-test/create-hubspot.js +1 -16
  34. package/jest.isolated-projects.js +31 -1
  35. package/jest.projects.js +87 -1
  36. package/lib/api/dev-server-https.js +1 -1
  37. package/lib/api/enterprise-knowledge.api.js +63 -0
  38. package/lib/api/evidence-kinds.api.js +128 -0
  39. package/lib/api/evidence.api.js +172 -0
  40. package/lib/api/external-systems.api.js +8 -2
  41. package/lib/api/pipeline.api.js +5 -1
  42. package/lib/api/resource-types.api.js +5 -4
  43. package/lib/api/roles.api.js +121 -0
  44. package/lib/api/types/enterprise-knowledge.types.js +46 -0
  45. package/lib/api/types/evidence-kinds.types.js +42 -0
  46. package/lib/api/types/evidence.types.js +67 -0
  47. package/lib/api/types/resource-types.types.js +2 -0
  48. package/lib/api/types/roles.types.js +36 -0
  49. package/lib/app/certification-verify-rows.js +1 -1
  50. package/lib/app/controller-application-filter.js +36 -0
  51. package/lib/app/deploy.js +1 -1
  52. package/lib/app/list-external-systems.js +130 -0
  53. package/lib/app/list.js +20 -8
  54. package/lib/app/run.js +3 -1
  55. package/lib/app/show-display.js +8 -3
  56. package/lib/app/show-online.js +178 -0
  57. package/lib/app/show.js +39 -90
  58. package/lib/build/builder-api-docker-staging.js +47 -0
  59. package/lib/build/miso-controller-npm-sdk-guard.js +2 -2
  60. package/lib/build/standard-docker-build.js +2 -0
  61. package/lib/certification/merge-certification-from-artifact.js +1 -1
  62. package/lib/certification/post-unified-cert-sync.js +4 -31
  63. package/lib/certification/sync-after-external-command.js +0 -1
  64. package/lib/certification/sync-system-certification.js +0 -3
  65. package/lib/channels/add-channel.js +40 -34
  66. package/lib/channels/approval-guides/chatgpt.js +33 -0
  67. package/lib/channels/approval-guides/credential-portal.js +38 -0
  68. package/lib/channels/approval-guides/index.js +110 -0
  69. package/lib/channels/approval-guides/microsoft-copilot.js +34 -0
  70. package/lib/channels/approval-guides/slack.js +34 -0
  71. package/lib/channels/approval-guides/teams-bot.js +35 -0
  72. package/lib/channels/approval-guides/web-embed.js +32 -0
  73. package/lib/channels/channel-approval-guide.js +11 -0
  74. package/lib/channels/channel-artifact-generator.js +18 -5
  75. package/lib/channels/channel-audit.js +3 -0
  76. package/lib/channels/channel-auth-context.js +1 -1
  77. package/lib/channels/channel-description.js +59 -0
  78. package/lib/channels/channel-integration-generator.js +13 -230
  79. package/lib/channels/channel-integration-template.js +94 -0
  80. package/lib/channels/channel-runtime-resolver.js +43 -3
  81. package/lib/channels/channel-status-display.js +66 -26
  82. package/lib/channels/channel-targets.js +3 -3
  83. package/lib/cli/index.js +31 -3
  84. package/lib/cli/infra-guided.js +5 -1
  85. package/lib/cli/setup-app-external-create.js +111 -0
  86. package/lib/cli/setup-app.help.js +1 -1
  87. package/lib/cli/setup-app.js +60 -130
  88. package/lib/cli/setup-app.test-commands.js +26 -52
  89. package/lib/cli/setup-certification-commands.js +4 -4
  90. package/lib/cli/setup-certification.help.js +9 -9
  91. package/lib/cli/setup-dev.js +30 -9
  92. package/lib/cli/setup-external-system-help.js +4 -6
  93. package/lib/cli/setup-external-system.js +58 -52
  94. package/lib/cli/setup-infra-up-builder-api-action.js +64 -0
  95. package/lib/cli/setup-infra-up-platform-action.js +3 -1
  96. package/lib/cli/setup-infra.js +15 -0
  97. package/lib/cli/setup-list.js +43 -0
  98. package/lib/cli/setup-utility-help-after.js +12 -0
  99. package/lib/cli/setup-utility-repair.js +26 -7
  100. package/lib/cli/setup-utility-validate.js +41 -2
  101. package/lib/cli/setup-utility.js +5 -3
  102. package/lib/commands/app.js +15 -43
  103. package/lib/commands/channel-add-setup.js +110 -0
  104. package/lib/commands/channel.js +42 -8
  105. package/lib/commands/datasource-sync-display.js +96 -0
  106. package/lib/commands/datasource-sync-policy.js +210 -0
  107. package/lib/commands/datasource-test-trust-cli.js +6 -6
  108. package/lib/commands/datasource-unified-test-cli.js +2 -1
  109. package/lib/commands/datasource-unified-test-cli.options.js +33 -23
  110. package/lib/commands/deploy-gate-failure-details.js +184 -0
  111. package/lib/commands/deploy-gate-orchestrator.js +368 -0
  112. package/lib/commands/dev-cli-handlers.js +7 -62
  113. package/lib/commands/dev-host-ops-params.js +91 -0
  114. package/lib/commands/dev-host-ops-poll.js +111 -0
  115. package/lib/commands/dev-host-ops.js +107 -94
  116. package/lib/commands/dev-init.js +6 -106
  117. package/lib/commands/dev-refresh.js +197 -0
  118. package/lib/commands/enterprise-knowledge.js +284 -0
  119. package/lib/commands/evidence-cli-leaves.js +250 -0
  120. package/lib/commands/evidence-kind.js +428 -0
  121. package/lib/commands/evidence.js +51 -0
  122. package/lib/commands/governance-cli-shared.js +2 -2
  123. package/lib/commands/governance-command-action.js +5 -3
  124. package/lib/commands/governance-fixture-subjects.js +85 -0
  125. package/lib/commands/governance.js +1 -1
  126. package/lib/commands/lifecycle-command-action.js +2 -2
  127. package/lib/commands/lifecycle-external.js +3 -3
  128. package/lib/commands/manifest-cli-auth.js +29 -0
  129. package/lib/commands/manifest-cli-commands.js +170 -0
  130. package/lib/commands/manifest-cli-integration-path.js +63 -0
  131. package/lib/commands/manifest.js +21 -0
  132. package/lib/commands/protection-cli-leaves.js +3 -3
  133. package/lib/commands/repair-auth-apply.js +15 -1
  134. package/lib/commands/repair-authentications-454.js +169 -0
  135. package/lib/commands/repair-capability-openapi-warnings.js +126 -0
  136. package/lib/commands/repair-datasource-apply.js +135 -0
  137. package/lib/commands/repair-datasource-auto-rbac.js +62 -1
  138. package/lib/commands/repair-datasource-http-service-contract.js +239 -0
  139. package/lib/commands/repair-datasource-operation-security.js +180 -0
  140. package/lib/commands/repair-datasource-run.js +7 -2
  141. package/lib/commands/repair-datasource-sync-operations.js +177 -0
  142. package/lib/commands/repair-datasource-webhooks-sync-bridge.js +133 -0
  143. package/lib/commands/repair-datasource.js +12 -68
  144. package/lib/commands/repair-env-template.js +11 -1
  145. package/lib/commands/repair-external-run.js +121 -31
  146. package/lib/commands/repair-internal.js +1 -1
  147. package/lib/commands/repair-openapi-export.js +156 -0
  148. package/lib/commands/repair-openapi-sync.js +33 -8
  149. package/lib/commands/repair-orchestration-datasource-split.js +259 -0
  150. package/lib/commands/repair-persist.js +22 -1
  151. package/lib/commands/repair-rbac-platform-preset.js +204 -0
  152. package/lib/commands/repair-rbac-reader-roles.js +191 -0
  153. package/lib/commands/repair-rbac.js +163 -86
  154. package/lib/commands/repair-steps.js +83 -18
  155. package/lib/commands/repair-system-permissions.js +1 -0
  156. package/lib/commands/repair.js +1 -1
  157. package/lib/commands/resource-type.js +166 -44
  158. package/lib/commands/role.js +452 -0
  159. package/lib/commands/run-post-publish-data-sync.js +68 -0
  160. package/lib/commands/setup-modes.js +1 -1
  161. package/lib/commands/setup.js +1 -1
  162. package/lib/commands/test-e2e-external.js +21 -8
  163. package/lib/commands/test-governance-cli-options.js +2 -2
  164. package/lib/commands/test-trust-cli-options.js +2 -2
  165. package/lib/commands/up-builder-api-bootstrap.js +71 -0
  166. package/lib/commands/up-builder-api-provision.js +241 -0
  167. package/lib/commands/up-builder-api.js +88 -0
  168. package/lib/commands/up-common.js +25 -1
  169. package/lib/commands/upload-credential-push-log.js +117 -0
  170. package/lib/commands/upload-data-sync-finalize.js +60 -0
  171. package/lib/commands/upload-probe.js +66 -0
  172. package/lib/commands/upload-publish-context.js +4 -1
  173. package/lib/commands/upload-sidecar-followups.js +55 -27
  174. package/lib/commands/upload.js +116 -157
  175. package/lib/commands/validate-json.js +230 -0
  176. package/lib/commands/verify-governance-combined-external.js +1 -1
  177. package/lib/commands/verify-governance-db.js +2 -2
  178. package/lib/commands/verify-operations-command-action.js +2 -2
  179. package/lib/commands/verify-operations-step-plan.js +79 -41
  180. package/lib/commands/verify-operations-steps.js +2 -2
  181. package/lib/commands/verify-trust-command-action.js +1 -1
  182. package/lib/commands/wizard-core.js +1 -1
  183. package/lib/commands/wizard-headless.js +2 -1
  184. package/lib/core/admin-secrets.js +2 -6
  185. package/lib/core/audit-logger.js +1 -1
  186. package/lib/core/secrets-env-content.js +10 -4
  187. package/lib/core/secrets-env-write.js +2 -13
  188. package/lib/core/secrets-load.js +1 -3
  189. package/lib/datasource/agent-trust-run.js +3 -3
  190. package/lib/datasource/capability/relate-operations.js +1 -1
  191. package/lib/datasource/deploy.js +3 -1
  192. package/lib/datasource/test-e2e.js +6 -1
  193. package/lib/datasource/unified-validation-run-body.js +4 -1
  194. package/lib/datasource/unified-validation-run.js +1 -1
  195. package/lib/deployment/deploy-poll-ui.js +73 -12
  196. package/lib/deployment/deployer-poll-run.js +113 -0
  197. package/lib/deployment/deployer.js +17 -87
  198. package/lib/evidence/dataplane-context.js +21 -0
  199. package/lib/evidence/evidence-display.js +78 -0
  200. package/lib/evidence/evidence-service.js +392 -0
  201. package/lib/external-system/deploy.js +290 -112
  202. package/lib/external-system/download.js +7 -3
  203. package/lib/external-system/test-execution.js +1 -1
  204. package/lib/external-system/test-system-level.js +8 -10
  205. package/lib/external-system/test.js +12 -6
  206. package/lib/generator/deploy-script.js +73 -0
  207. package/lib/generator/external.js +2 -1
  208. package/lib/generator/helpers.js +13 -5
  209. package/lib/generator/index.js +17 -2
  210. package/lib/generator/split-variables.js +9 -3
  211. package/lib/generator/wizard.js +3 -36
  212. package/lib/infrastructure/helpers-docker-check.js +6 -0
  213. package/lib/infrastructure/helpers.js +1 -1
  214. package/lib/internal/fs-real-sync.js +22 -1
  215. package/lib/internal/node-fs.js +2 -0
  216. package/lib/lifecycle/lifecycle-governance-options.js +1 -1
  217. package/lib/lifecycle/verify-step-progress.js +1 -1
  218. package/lib/programmatic/access-log.js +26 -0
  219. package/lib/programmatic/auth-config.js +45 -0
  220. package/lib/programmatic/bearer-auth.js +176 -0
  221. package/lib/programmatic/builder-api-request.js +175 -0
  222. package/lib/programmatic/builder-api-route-dispatch.js +82 -0
  223. package/lib/programmatic/builder-api-runtime-config.js +42 -0
  224. package/lib/programmatic/builder-api-server.js +230 -0
  225. package/lib/programmatic/builder-help-authentication-catalog.js +282 -0
  226. package/lib/programmatic/builder-help-connected-system-ui.js +266 -0
  227. package/lib/programmatic/builder-help-enterprise-sync-fabrix.js +60 -0
  228. package/lib/programmatic/builder-help-envelope.js +36 -0
  229. package/lib/programmatic/builder-help-fixtures.js +200 -0
  230. package/lib/programmatic/builder-help-governance.js +172 -0
  231. package/lib/programmatic/builder-help-schema-catalog.js +92 -0
  232. package/lib/programmatic/builder-help.js +361 -0
  233. package/lib/programmatic/capability-registry.js +77 -0
  234. package/lib/programmatic/command-options.js +32 -0
  235. package/lib/programmatic/enterprise-mcp-client.js +114 -0
  236. package/lib/programmatic/http-problem-details.js +99 -0
  237. package/lib/programmatic/http-route-match.js +40 -0
  238. package/lib/programmatic/idempotency-cache.js +69 -0
  239. package/lib/programmatic/index.js +53 -0
  240. package/lib/programmatic/integration-path-scope.js +39 -0
  241. package/lib/programmatic/log-redaction.js +66 -0
  242. package/lib/programmatic/manifest-get-section.js +146 -0
  243. package/lib/programmatic/manifest-patch-section.js +252 -0
  244. package/lib/programmatic/manifest-repair.js +122 -0
  245. package/lib/programmatic/manifest-section-dependency-graph.js +160 -0
  246. package/lib/programmatic/manifest-section-io.js +225 -0
  247. package/lib/programmatic/manifest-section-quality.js +171 -0
  248. package/lib/programmatic/manifest-section-registry-data.js +269 -0
  249. package/lib/programmatic/manifest-section-registry.js +222 -0
  250. package/lib/programmatic/nest-http-bridge.js +34 -0
  251. package/lib/programmatic/openapi-component-schemas.js +68 -0
  252. package/lib/programmatic/openapi-description-enricher.js +117 -0
  253. package/lib/programmatic/openapi-descriptions.js +190 -0
  254. package/lib/programmatic/openapi-docs-serving.js +123 -0
  255. package/lib/programmatic/openapi-help-schemas.js +63 -0
  256. package/lib/programmatic/openapi-manifest-schemas.js +141 -0
  257. package/lib/programmatic/openapi-operation-bindings.js +274 -0
  258. package/lib/programmatic/openapi-request-schemas.js +155 -0
  259. package/lib/programmatic/openapi-result-schemas.js +493 -0
  260. package/lib/programmatic/openapi-schema-descriptions-certify.js +139 -0
  261. package/lib/programmatic/openapi-schema-descriptions-core.js +162 -0
  262. package/lib/programmatic/openapi-schema-descriptions-help.js +40 -0
  263. package/lib/programmatic/openapi-schema-descriptions-manifest.js +143 -0
  264. package/lib/programmatic/openapi-schema-descriptions-mcp.js +118 -0
  265. package/lib/programmatic/openapi-schema-descriptions-operations.js +281 -0
  266. package/lib/programmatic/openapi-schema-helpers.js +108 -0
  267. package/lib/programmatic/openapi-spec.js +203 -0
  268. package/lib/programmatic/orchestration-openapi-meta.js +159 -0
  269. package/lib/programmatic/platform-rbac-catalog.js +90 -0
  270. package/lib/programmatic/request-timeout.js +53 -0
  271. package/lib/programmatic/route-handler-map.js +143 -0
  272. package/lib/programmatic/route-handlers-context.js +29 -0
  273. package/lib/programmatic/route-handlers.js +33 -0
  274. package/lib/programmatic/run-certify.js +57 -0
  275. package/lib/programmatic/run-enterprise-mcp.js +32 -0
  276. package/lib/programmatic/run-lifecycle.js +29 -0
  277. package/lib/programmatic/run-repair.js +41 -0
  278. package/lib/programmatic/run-repository-emcp.js +62 -0
  279. package/lib/programmatic/run-template-workspace.js +74 -0
  280. package/lib/programmatic/run-test.js +49 -0
  281. package/lib/programmatic/run-upload.js +63 -0
  282. package/lib/programmatic/run-validate.js +53 -0
  283. package/lib/programmatic/run-wizard.js +40 -0
  284. package/lib/programmatic/system-key.js +48 -0
  285. package/lib/programmatic/wizard-config-normalize.js +118 -0
  286. package/lib/programmatic/workspace-cleanup.js +128 -0
  287. package/lib/programmatic/workspace-context.js +145 -0
  288. package/lib/programmatic/workspace-lock.js +75 -0
  289. package/lib/programmatic/workspace-meta.js +64 -0
  290. package/lib/programmatic/workspace-ops.js +149 -0
  291. package/lib/protection/run-commands-upload-sync.js +35 -0
  292. package/lib/protection/run-commands.js +2 -20
  293. package/lib/protection/upload-batch.js +11 -7
  294. package/lib/resolvers/evidence-kind-file.js +230 -0
  295. package/lib/resolvers/resource-type-file.js +58 -1
  296. package/lib/resolvers/role-file.js +227 -0
  297. package/lib/schema/application-schema.json +22 -2
  298. package/lib/schema/external-datasource.schema.json +245 -2
  299. package/lib/schema/external-system.schema.json +259 -119
  300. package/lib/schema/flag-map-validation-run.json +3 -0
  301. package/lib/schema/infra.parameter.yaml +25 -1
  302. package/lib/schema/type/credential-field-registry.json +21 -5
  303. package/lib/schema/type/document-storage.json +9 -0
  304. package/lib/utils/agent-trust-run-display.js +1 -1
  305. package/lib/utils/api.js +8 -2
  306. package/lib/utils/app-path-resolve.js +168 -0
  307. package/lib/utils/app-register-config.js +4 -3
  308. package/lib/utils/authentication-env-template.js +222 -0
  309. package/lib/utils/cli-sync-options.js +62 -10
  310. package/lib/utils/cli-utils.js +15 -3
  311. package/lib/utils/cli-workspace-options.js +29 -0
  312. package/lib/utils/compose-generate-docker-compose.js +102 -0
  313. package/lib/utils/configuration-env-resolver.js +203 -27
  314. package/lib/utils/datasource-test-run-certificate-tty.js +28 -2
  315. package/lib/utils/datasource-test-run-certification-debug.js +130 -0
  316. package/lib/utils/datasource-test-run-debug-display.js +2 -0
  317. package/lib/utils/datasource-test-run-debug-slice.js +7 -0
  318. package/lib/utils/datasource-test-run-display.js +2 -1
  319. package/lib/utils/dev-ca-install.js +5 -6
  320. package/lib/utils/dev-config.js +2 -2
  321. package/lib/utils/dev-init-ssh-merge.js +165 -23
  322. package/lib/utils/dev-list-sort.js +145 -0
  323. package/lib/utils/dev-pin-share-instructions.js +110 -0
  324. package/lib/utils/dev-platform-tls.js +0 -63
  325. package/lib/utils/dev-ssh-config-helper.js +177 -33
  326. package/lib/utils/docker-build.js +46 -27
  327. package/lib/utils/docker-daemon-tls-ca.js +1 -1
  328. package/lib/utils/docker-exec.js +91 -6
  329. package/lib/utils/enterprise-knowledge-paths.js +142 -0
  330. package/lib/utils/env-copy.js +3 -4
  331. package/lib/utils/env-dotenv-format.js +103 -0
  332. package/lib/utils/error-formatters/error-parser.js +0 -3
  333. package/lib/utils/external-env-template.js +5 -2
  334. package/lib/utils/external-system-display.js +5 -1
  335. package/lib/utils/external-system-readiness-compact-blocks.js +248 -0
  336. package/lib/utils/external-system-readiness-compact-display.js +324 -0
  337. package/lib/utils/external-system-readiness-core.js +16 -0
  338. package/lib/utils/external-system-readiness-deploy-display.js +29 -11
  339. package/lib/utils/external-system-readiness-display-internals.js +3 -1
  340. package/lib/utils/external-system-readiness-display.js +20 -30
  341. package/lib/utils/external-system-system-test-tty-certification.js +135 -0
  342. package/lib/utils/external-system-system-test-tty.js +5 -41
  343. package/lib/utils/health-check-request.js +2 -3
  344. package/lib/utils/help-builder.js +9 -1
  345. package/lib/utils/host-ops-job-labels.js +236 -0
  346. package/lib/utils/host-ops-job-result.js +61 -0
  347. package/lib/utils/host-ops-poll-ui.js +163 -0
  348. package/lib/utils/image-name.js +22 -4
  349. package/lib/utils/integration-path-resolve.js +112 -0
  350. package/lib/utils/logger.js +37 -4
  351. package/lib/utils/manifest-source-emit.js +1 -1
  352. package/lib/utils/paths-reload-source.js +148 -0
  353. package/lib/utils/paths-system-builder-keys.js +25 -0
  354. package/lib/utils/paths.js +183 -30
  355. package/lib/utils/pipeline-upload-auth-retry.js +4 -0
  356. package/lib/utils/postgres-platform-bootstrap.js +24 -17
  357. package/lib/utils/postgres-wipe.js +5 -2
  358. package/lib/utils/remote-dev-auth.js +39 -4
  359. package/lib/utils/resolve-docker-image-ref.js +36 -6
  360. package/lib/utils/runtime-configuration-values.js +64 -2
  361. package/lib/utils/secrets-helpers.js +5 -1
  362. package/lib/utils/ssh-known-hosts.js +130 -0
  363. package/lib/utils/test-target-cli-options.js +75 -0
  364. package/lib/utils/token-manager.js +16 -0
  365. package/lib/utils/upload-sync-options.js +20 -2
  366. package/lib/utils/validation-run-request.js +11 -2
  367. package/lib/validation/external-manifest-validator.js +11 -1
  368. package/lib/validation/openapi-contract-surface-validator.js +430 -0
  369. package/lib/validation/openapi-contract-vendor-validation.js +238 -0
  370. package/lib/validation/validate-external-file.js +160 -0
  371. package/lib/validation/validate.js +6 -117
  372. package/lib/validation/validator.js +6 -5
  373. package/package.json +76 -37
  374. package/packages/builder-api/README.md +120 -0
  375. package/packages/builder-api/package.json +30 -0
  376. package/packages/builder-api/src/app.module.ts +7 -0
  377. package/packages/builder-api/src/auth/auth.module.ts +5 -0
  378. package/packages/builder-api/src/external-system/external-system.module.ts +5 -0
  379. package/packages/builder-api/src/main.ts +16 -0
  380. package/packages/builder-api/tsconfig.json +15 -0
  381. package/scripts/check-builder-api-architecture-grep.js +79 -0
  382. package/scripts/docker_image_content_gate.js +47 -0
  383. package/scripts/docker_image_content_gate.sh +5 -0
  384. package/scripts/export-builder-api-evidence.js +262 -0
  385. package/scripts/lib/builder-api-docker-staging-copy.js +60 -0
  386. package/scripts/lib/builder-api-docker-staging-core.js +183 -0
  387. package/scripts/lib/docker-image-content-gate-core.js +166 -0
  388. package/scripts/lib/plan-actor.js +109 -0
  389. package/scripts/lib/plan-config.js +20 -0
  390. package/scripts/lib/plan-gates.js +154 -0
  391. package/scripts/lib/plan-meta.js +104 -0
  392. package/scripts/lib/plan-parse.js +162 -0
  393. package/scripts/lib/plan-prevalidate-gates.js +337 -0
  394. package/scripts/lib/plan-run-core.js +125 -0
  395. package/scripts/lib/plan-run-report.js +119 -0
  396. package/scripts/plan-approve.js +24 -0
  397. package/scripts/plan-archive.js +49 -0
  398. package/scripts/plan-run.js +13 -0
  399. package/scripts/plan-set-actor.js +21 -0
  400. package/scripts/plan-validate.js +80 -0
  401. package/scripts/pnpm/af.mjs +110 -0
  402. package/scripts/pnpm/check-quiet.mjs +32 -0
  403. package/scripts/pnpm/dev-install.mjs +29 -0
  404. package/scripts/pnpm/dev-reload.mjs +18 -0
  405. package/scripts/pnpm/help.mjs +55 -0
  406. package/scripts/pnpm/lib/dev-reload-core.mjs +189 -0
  407. package/scripts/pnpm/lib/dev-reload-log-capture.mjs +67 -0
  408. package/scripts/pnpm/lib/dev-reload-log-utils.mjs +32 -0
  409. package/scripts/pnpm/lib/resolve-aifabrix-bin.mjs +124 -0
  410. package/scripts/pnpm/lib/resolve-app-url.mjs +183 -0
  411. package/scripts/pnpm/lib/spinner.mjs +42 -0
  412. package/scripts/stage_builder_api_for_docker.js +65 -0
  413. package/scripts/sync-builder-api-template.js +44 -0
  414. package/templates/README.md +3 -0
  415. package/templates/applications/builder-api/Dockerfile +38 -0
  416. package/templates/applications/builder-api/application.yaml +75 -0
  417. package/templates/applications/builder-api/env.template +48 -0
  418. package/templates/applications/dataplane/application.yaml +27 -5
  419. package/templates/applications/dataplane/env.template +38 -15
  420. package/templates/applications/dataplane/rbac.yaml +85 -3
  421. package/templates/applications/miso-controller/application.yaml +10 -1
  422. package/templates/applications/miso-controller/env.template +11 -10
  423. package/templates/applications/miso-controller/rbac.yaml +72 -0
  424. package/templates/channels/README.md +18 -0
  425. package/templates/channels/ai-fabrix-icon.jpg +0 -0
  426. package/templates/channels/chatgpt/install.template.md.hbs +21 -24
  427. package/templates/channels/chatgpt/integration/README.md +11 -0
  428. package/templates/channels/chatgpt/integration/application.json +15 -0
  429. package/templates/channels/chatgpt/integration/chatgpt-system.json +29 -0
  430. package/templates/channels/chatgpt/integration/env.template +4 -0
  431. package/templates/channels/microsoft-copilot/install.template.md.hbs +20 -25
  432. package/templates/channels/microsoft-copilot/integration/README.md +11 -0
  433. package/templates/channels/microsoft-copilot/integration/application.json +15 -0
  434. package/templates/channels/microsoft-copilot/integration/env.template +6 -0
  435. package/templates/channels/microsoft-copilot/integration/microsoft-copilot-system.json +34 -0
  436. package/templates/channels/slack/install.template.md.hbs +48 -18
  437. package/templates/channels/slack/integration/README.md +38 -0
  438. package/templates/channels/slack/integration/application.json +18 -0
  439. package/templates/channels/slack/integration/env.template +29 -0
  440. package/templates/channels/slack/integration/slack-datasource-conversations.json +226 -0
  441. package/templates/channels/slack/integration/slack-datasource-messages.json +269 -0
  442. package/templates/channels/slack/integration/slack-system.json +144 -0
  443. package/templates/channels/slack/manifest.template.json.hbs +20 -10
  444. package/templates/channels/teams-bot/install.template.md.hbs +31 -17
  445. package/templates/channels/teams-bot/integration/README.md +18 -0
  446. package/templates/channels/teams-bot/integration/application.json +17 -0
  447. package/templates/channels/teams-bot/integration/env.template +5 -0
  448. package/templates/channels/teams-bot/integration/teams-bot-system.json +55 -0
  449. package/templates/channels/teams-bot/manifest.template.json.hbs +27 -0
  450. package/templates/channels/web-embed/install.template.md.hbs +16 -26
  451. package/templates/channels/web-embed/integration/README.md +11 -0
  452. package/templates/channels/web-embed/integration/application.json +15 -0
  453. package/templates/channels/web-embed/integration/env.template +4 -0
  454. package/templates/channels/web-embed/integration/web-embed-system.json +29 -0
  455. package/templates/openapi/redoc_page.html +86 -0
  456. package/templates/python/docker-compose.hbs +11 -0
  457. package/templates/python/requirements.txt +2 -2
  458. package/templates/typescript/docker-compose.hbs +11 -0
  459. package/lib/certification/cli-cert-sync-skip.js +0 -21
@@ -0,0 +1,282 @@
1
+ /**
2
+ * Authentication catalog for builder-api LLM help (external-system.schema.json).
3
+ *
4
+ * @fileoverview authType modes and credential.method templates for UI handoff guidance
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const fs = require('fs');
12
+ const path = require('path');
13
+
14
+ const SCHEMA_DIR = path.join(__dirname, '..', 'schema');
15
+ const SYSTEM_SCHEMA_PATH = path.join(SCHEMA_DIR, 'external-system.schema.json');
16
+ const CREDENTIAL_REGISTRY_PATH = path.join(SCHEMA_DIR, 'type', 'credential-field-registry.json');
17
+
18
+ /** @type {Object|null} */
19
+ let cachedCatalog = null;
20
+
21
+ /** @type {Readonly<Record<string, string>>} */
22
+ const METHOD_UI_LABELS = Object.freeze({
23
+ oauth2: 'OAuth 2.0',
24
+ aad: 'Azure AD (aad)',
25
+ apikey: 'API Key',
26
+ bearerToken: 'Bearer token',
27
+ basic: 'Basic Auth',
28
+ queryParam: 'Query parameter',
29
+ oidc: 'OpenID Connect (OIDC)',
30
+ hmac: 'HMAC',
31
+ none: 'None'
32
+ });
33
+
34
+ /** @type {Readonly<Record<string, string>>} */
35
+ const METHOD_REGISTRY_KEY = Object.freeze({
36
+ oauth2: 'oauth2',
37
+ aad: 'oauth2',
38
+ apikey: 'apiKey',
39
+ bearerToken: 'bearerToken',
40
+ basic: 'basicAuth',
41
+ queryParam: 'queryParam',
42
+ oidc: 'oidc',
43
+ hmac: 'hmac',
44
+ none: 'none'
45
+ });
46
+
47
+ /** @type {Readonly<Object>} */
48
+ const MANIFEST_AUTH_SPLIT = Object.freeze({
49
+ variables: {
50
+ manifestPath: 'authentication.credential.variables',
51
+ purpose:
52
+ 'Non-secret configuration (baseUrl, tokenUrl, headerName, prefix, testEndpoint, and similar). Set in the manifest authentication section before upload.',
53
+ publishedBehavior:
54
+ 'Upload publishes variables to dataplane. They appear pre-filled in Connected Systems Authentication — the user does not re-enter them.',
55
+ agentRule:
56
+ 'Ensure variables are complete in the manifest during editing. After upload, do not ask the user to supply non-secret variable values again.'
57
+ },
58
+ security: {
59
+ manifestPath: 'authentication.credential.security',
60
+ purpose:
61
+ 'Secret placeholders only. Manifest values must be kv:// references (unresolved in Builder API scope).',
62
+ publishedBehavior:
63
+ 'Upload creates the credential template. The user adds live secret values in Authentication UI — typically only the token or apiKey.',
64
+ agentRule:
65
+ 'After upload, ask the user only for requiredSecretKeys. This is the minimum post-upload handoff.'
66
+ }
67
+ });
68
+
69
+ /** @type {Readonly<Record<string, string>>} */
70
+ const METHOD_USER_HANDOFF = Object.freeze({
71
+ oauth2:
72
+ 'User adds clientSecret (and clientId if empty). baseUrl, tokenUrl, grantType, and scope are already published from manifest variables.',
73
+ aad:
74
+ 'User adds clientSecret (and clientId if empty). baseUrl, tokenUrl, tenantId, and grantType are already published from manifest variables.',
75
+ apikey:
76
+ 'User adds only the API key token. baseUrl, headerName, prefix, and testEndpoint are already published from manifest variables.',
77
+ bearerToken:
78
+ 'User adds only the bearer token. baseUrl, headerName, prefix, and testEndpoint are already published from manifest variables.',
79
+ basic:
80
+ 'User adds username and password. baseUrl and testEndpoint are already published from manifest variables.',
81
+ queryParam:
82
+ 'User adds only the paramValue secret. baseUrl, paramName, and testEndpoint are already published from manifest variables.',
83
+ oidc:
84
+ 'openIdConfigUrl and clientId are already published from manifest variables. User confirms or completes any remaining OIDC fields shown in UI.',
85
+ hmac:
86
+ 'User adds signingSecret. Algorithm and signature header settings are already published from manifest variables.',
87
+ none: 'No credential secrets required for this method.'
88
+ });
89
+
90
+ /** @type {ReadonlyArray<Object>} */
91
+ const AUTH_TYPES = Object.freeze([
92
+ {
93
+ authType: 'credential',
94
+ manifestPath: 'authentication.credential',
95
+ uiTab: 'authentication',
96
+ description:
97
+ 'Local credential template from external-system.schema.json. Non-secret variables are published on upload; user adds live secrets in Authentication UI only.',
98
+ userAction:
99
+ 'Open Authentication tab. Non-secret fields are already pre-filled from manifest variables. User adds only the required secret values (for example apiKey token, clientSecret).',
100
+ builderApiScope:
101
+ 'Set authentication.credential.variables in the manifest before upload. Keep kv:// placeholders in security; upload does not resolve secrets. User replaces placeholders with live values in the UI.'
102
+ },
103
+ {
104
+ authType: 'apiProvider',
105
+ manifestPath: 'authentication.apiProvider.apiProviderKey',
106
+ uiTab: 'authentication',
107
+ description:
108
+ 'Delegated authentication via a Miso API Provider — no dataplane-local vendor secrets.',
109
+ userAction:
110
+ 'Open Authentication tab and link or select the API Provider referenced by apiProviderKey in the manifest.',
111
+ builderApiScope:
112
+ 'Upload publishes the apiProviderKey reference only. User completes provider binding in the UI.'
113
+ },
114
+ {
115
+ authType: 'none',
116
+ manifestPath: 'authentication.authType',
117
+ uiTab: null,
118
+ description: 'No authentication block secrets. System does not use a local credential template.',
119
+ userAction:
120
+ 'Skip credential entry unless the integration still needs network-level auth configured elsewhere.',
121
+ builderApiScope: 'No post-upload secret handoff for authType none unless live tests fail for other reasons.'
122
+ }
123
+ ]);
124
+
125
+ /**
126
+ * @returns {Object}
127
+ */
128
+ function loadSystemSchema() {
129
+ return JSON.parse(fs.readFileSync(SYSTEM_SCHEMA_PATH, 'utf8'));
130
+ }
131
+
132
+ /**
133
+ * @returns {Object}
134
+ */
135
+ function loadCredentialRegistry() {
136
+ return JSON.parse(fs.readFileSync(CREDENTIAL_REGISTRY_PATH, 'utf8'));
137
+ }
138
+
139
+ /**
140
+ * @param {string|null|undefined} text
141
+ * @returns {string|null}
142
+ */
143
+ function sanitizeHelpText(text) {
144
+ if (!text) {
145
+ return null;
146
+ }
147
+ const cleaned = String(text)
148
+ .replace(/https?:\/\/[^\s)]+/gi, '')
149
+ .replace(/\s{2,}/g, ' ')
150
+ .trim();
151
+ return cleaned || null;
152
+ }
153
+
154
+ /**
155
+ * @param {string} method
156
+ * @param {Object} registry
157
+ * @returns {string}
158
+ */
159
+ function resolveUiLabel(method, registry) {
160
+ if (METHOD_UI_LABELS[method]) {
161
+ return METHOD_UI_LABELS[method];
162
+ }
163
+ const registryKey = METHOD_REGISTRY_KEY[method];
164
+ const entry = registryKey ? registry.credentialTypes?.[registryKey] : null;
165
+ if (entry?.display?.label) {
166
+ return entry.display.label;
167
+ }
168
+ return method;
169
+ }
170
+
171
+ /**
172
+ * @param {string} method
173
+ * @param {Object} methodDef
174
+ * @returns {Object}
175
+ */
176
+ function summarizeMethodFields(method, methodDef) {
177
+ const variables = (methodDef.variables || []).map((item) => ({
178
+ key: item.key,
179
+ required: item.required === true,
180
+ description: sanitizeHelpText(item.description)
181
+ }));
182
+ const security = (methodDef.security || []).map((item) => ({
183
+ key: item.key,
184
+ required: item.required === true,
185
+ encrypted: true
186
+ }));
187
+ return {
188
+ method,
189
+ uiLabel: METHOD_UI_LABELS[method] || method,
190
+ variableKeys: variables.map((item) => item.key),
191
+ requiredVariableKeys: variables.filter((item) => item.required).map((item) => item.key),
192
+ secretKeys: security.map((item) => item.key),
193
+ requiredSecretKeys: security.filter((item) => item.required).map((item) => item.key),
194
+ variables,
195
+ security,
196
+ userHandoff: METHOD_USER_HANDOFF[method] || 'User completes secret fields shown for this method in Authentication.',
197
+ manifestPath: 'authentication.credential.method',
198
+ schemaDefKey: 'authenticationVariablesByMethod'
199
+ };
200
+ }
201
+
202
+ /**
203
+ * @returns {Object}
204
+ */
205
+ function buildAuthenticationCatalog() {
206
+ if (cachedCatalog) {
207
+ return cachedCatalog;
208
+ }
209
+ const schema = loadSystemSchema();
210
+ const registry = loadCredentialRegistry();
211
+ const methodsByDef = schema.$defs?.authenticationVariablesByMethod || {};
212
+ const methodEnum =
213
+ schema.$defs?.credentialTemplate?.properties?.method?.enum ||
214
+ Object.keys(methodsByDef).sort();
215
+
216
+ const credentialMethods = methodEnum
217
+ .filter((method) => methodsByDef[method])
218
+ .map((method) => {
219
+ const summary = summarizeMethodFields(method, methodsByDef[method]);
220
+ summary.uiLabel = resolveUiLabel(method, registry);
221
+ return summary;
222
+ });
223
+
224
+ cachedCatalog = {
225
+ schemaSource: 'external-system.schema.json',
226
+ manifestSectionKey: 'system.authentication',
227
+ datasourceNote:
228
+ 'Authentication is declared on the external system manifest (system.authentication), not on individual datasource manifests. Datasources inherit the linked system credential during sync and CIP execution.',
229
+ manifestAuthSplit: MANIFEST_AUTH_SPLIT,
230
+ authTypes: AUTH_TYPES,
231
+ credentialMethods,
232
+ agentHandoffSteps: [
233
+ 'Read workspace section system.authentication (or the published system manifest) before prompting the user.',
234
+ 'Identify authentication.authType: credential, apiProvider, or none.',
235
+ 'When authType is credential, ensure authentication.credential.variables holds all non-secret config before upload (baseUrl, headerName, tokenUrl, and similar).',
236
+ 'Upload publishes variables pre-filled in Authentication UI. Ask the user only for requiredSecretKeys — not for variables already in the manifest.',
237
+ 'When authType is apiProvider, direct the user to link apiProviderKey in Authentication — do not ask for vendor API keys in Builder API scope.',
238
+ 'When authType is none, skip secret handoff unless E2E still fails for unrelated configuration.',
239
+ 'Provide the Connected Systems Authentication URL using connectedSystemUi urlTemplates plus the published systemKey.'
240
+ ]
241
+ };
242
+ return cachedCatalog;
243
+ }
244
+
245
+ /**
246
+ * @param {Object} query
247
+ * @returns {Object|null}
248
+ */
249
+ function buildAuthenticationHandoffForManifest(query) {
250
+ const authType = query.authType ? String(query.authType) : null;
251
+ const method = query.credentialMethod ? String(query.credentialMethod) : null;
252
+ if (!authType && !method) {
253
+ return null;
254
+ }
255
+ const catalog = buildAuthenticationCatalog();
256
+ const authTypeEntry = authType ? catalog.authTypes.find((entry) => entry.authType === authType) : null;
257
+ const methodEntry = method
258
+ ? catalog.credentialMethods.find((entry) => entry.method === method)
259
+ : null;
260
+ if (!authTypeEntry && !methodEntry) {
261
+ return null;
262
+ }
263
+ return {
264
+ authType: authTypeEntry || null,
265
+ credentialMethod: methodEntry || null,
266
+ promptHints: [
267
+ authTypeEntry ? authTypeEntry.userAction : null,
268
+ 'Non-secret authentication.credential.variables are already published and pre-filled in the UI.',
269
+ methodEntry ? methodEntry.userHandoff : null,
270
+ methodEntry && methodEntry.requiredSecretKeys.length
271
+ ? `User adds only these secret fields: ${methodEntry.requiredSecretKeys.join(', ')}`
272
+ : null
273
+ ].filter(Boolean)
274
+ };
275
+ }
276
+
277
+ module.exports = {
278
+ AUTH_TYPES,
279
+ METHOD_UI_LABELS,
280
+ buildAuthenticationCatalog,
281
+ buildAuthenticationHandoffForManifest
282
+ };
@@ -0,0 +1,266 @@
1
+ /**
2
+ * Connected Systems UI URL catalog for builder-api LLM help (plan 154.6).
3
+ *
4
+ * @fileoverview Structured paths and tab aliases for post-upload authentication handoff
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const { buildHelpEnvelope } = require('./builder-help-envelope');
12
+ const {
13
+ buildAuthenticationCatalog,
14
+ buildAuthenticationHandoffForManifest
15
+ } = require('./builder-help-authentication-catalog');
16
+
17
+ /** @type {ReadonlyArray<Object>} */
18
+ const SYSTEM_TABS = Object.freeze([
19
+ { uiLabel: 'Overview', urlTab: null, aliases: ['overview'], omitTabParam: true },
20
+ { uiLabel: 'Technical readiness', urlTab: 'technical-readiness', aliases: [] },
21
+ { uiLabel: 'Business Entities', urlTab: 'datasources', aliases: ['business-entities'] },
22
+ { uiLabel: 'Business Policies', urlTab: 'rules', aliases: ['business-policies'] },
23
+ { uiLabel: 'Authentication', urlTab: 'authentication', aliases: ['Authentication'] },
24
+ { uiLabel: 'Configuration', urlTab: 'configuration', aliases: [] },
25
+ { uiLabel: 'AI Interfaces', urlTab: 'openapi', aliases: ['ai-interfaces'] },
26
+ { uiLabel: 'Policies & Security', urlTab: 'policies', aliases: [], note: 'When policy management is enabled in dataplane.' },
27
+ { uiLabel: 'Audit & History', urlTab: 'audit', aliases: ['audit-history'] }
28
+ ]);
29
+
30
+ /** @type {ReadonlyArray<Object>} */
31
+ const DATASOURCE_TABS = Object.freeze([
32
+ {
33
+ uiLabel: 'Overview',
34
+ urlTab: 'business-context',
35
+ aliases: ['business-overview'],
36
+ omitTabParam: true,
37
+ note: 'First tab id is business-context. URL value overview opens Technical readiness.'
38
+ },
39
+ { uiLabel: 'Technical readiness', urlTab: 'overview', aliases: ['technical-readiness'] },
40
+ { uiLabel: 'Data Flow', urlTab: 'cip', aliases: ['data-flow', 'Data Flow'] },
41
+ { uiLabel: 'Business Vocabulary', urlTab: 'mappings', aliases: ['business-vocabulary'] },
42
+ { uiLabel: 'AI Contract', urlTab: 'exposure', aliases: ['ai-contract'] },
43
+ { uiLabel: 'Business Policies', urlTab: 'abac', aliases: ['business-policies'] },
44
+ { uiLabel: 'Quality', urlTab: 'quality', aliases: [] },
45
+ { uiLabel: 'Sync', urlTab: 'sync', aliases: [] },
46
+ { uiLabel: 'Doc Processing', urlTab: 'document-processing', aliases: ['doc-processing'] },
47
+ { uiLabel: 'Operations', urlTab: 'openapi', aliases: ['operations'] },
48
+ { uiLabel: 'Configuration', urlTab: 'configuration', aliases: [] },
49
+ { uiLabel: 'YAML', urlTab: 'yaml', aliases: [] },
50
+ { uiLabel: 'Logs', urlTab: 'logs', aliases: ['audit-logs', 'execution-logs'] }
51
+ ]);
52
+
53
+ /** @type {Readonly<Object>} */
54
+ const URL_TEMPLATES = Object.freeze({
55
+ dataplanePublicBasePlaceholder: '{dataplanePublicBase}',
56
+ systemPath: '/connected-systems/{systemKey}',
57
+ systemPathWithTab: '/connected-systems/{systemKey}?tab={tab}',
58
+ datasourcePath: '/connected-systems/{systemKey}/datasources/{datasourceKey}',
59
+ datasourcePathWithTab: '/connected-systems/{systemKey}/datasources/{datasourceKey}?tab={tab}',
60
+ composedSystemUrl: '{dataplanePublicBase}/connected-systems/{systemKey}?tab={tab}',
61
+ composedDatasourceUrl:
62
+ '{dataplanePublicBase}/connected-systems/{systemKey}/datasources/{datasourceKey}?tab={tab}',
63
+ routeHelper:
64
+ 'Dataplane UI route helper: CONNECTED_SYSTEM_ROUTES.DATASOURCE_TAB(systemKey, datasourceKey, tab).'
65
+ });
66
+
67
+ /** @type {ReadonlyArray<string>} */
68
+ const AGENT_RULES = Object.freeze([
69
+ 'Run validate, test, test-integration, and upload without requiring resolved integration secrets in Builder API scope.',
70
+ 'Upload publishes manifest authentication.credential.variables (non-secrets) pre-filled in the UI; kv:// security placeholders stay unresolved until the user adds live secrets.',
71
+ 'Before post-upload handoff, read system.authentications[] (or legacy authentication) and identify authType, usage (api, webhookInbound, syncExecution), and credential.method when applicable.',
72
+ 'Set all non-secret auth config in credential.variables during manifest editing — do not ask the user to re-enter baseUrl, headerName, tokenUrl, or similar after upload.',
73
+ 'After upload succeeds, ask the user to open Connected Systems Authentication and add only requiredSecretKeys (for example apiKey token, webhookInbound signingSecret) — not variables already published.',
74
+ 'When webhook.enabled or syncBridge is active, direct the user to datasource Sync tab (tab=sync) for webhook activation markdown and syncBridge read-only status.',
75
+ 'Combine the user dataplane public base (origin including /data) with paths from urlTemplates.',
76
+ 'Do not ask the user to paste vendor tokens into Builder API requests or workspace files when UI authentication is the intended path.',
77
+ 'Tab query values are case-insensitive; aliases in systemTabs and datasourceTabs are accepted on load.'
78
+ ]);
79
+
80
+ /** @type {ReadonlyArray<Object>} */
81
+ const POST_UPLOAD_AUTH_WORKFLOW = Object.freeze([
82
+ { order: 1, capability: 'validate', goal: 'Confirm workspace manifest structure before publish.' },
83
+ { order: 2, capability: 'test', goal: 'Run local manifest tests without live vendor credentials.' },
84
+ {
85
+ order: 3,
86
+ capability: 'test-integration',
87
+ goal: 'Exercise pipeline integration tests; credential gaps may remain until UI auth is set.'
88
+ },
89
+ {
90
+ order: 4,
91
+ capability: 'upload',
92
+ goal: 'Publish external system draft without embedding resolved secrets in the workspace.'
93
+ },
94
+ {
95
+ order: 5,
96
+ capability: 'ui-authentication-handoff',
97
+ goal:
98
+ 'Read authentications[] usage slots and credential.method from manifest; provide Authentication URL and method-specific secret field guidance from authentication catalog. Include webhookInbound and syncExecution when configured.'
99
+ },
100
+ {
101
+ order: 6,
102
+ capability: 'ui-sync-fabrix-handoff',
103
+ goal:
104
+ 'When webhook or syncBridge is enabled, provide datasource Sync tab URL (tab=sync) for activation guide and read-only fabrix status.'
105
+ },
106
+ { order: 7, capability: 'test-e2e', goal: 'After UI auth is configured, user or agent re-runs E2E against live vendor APIs.' }
107
+ ]);
108
+
109
+ /**
110
+ * @param {string} input
111
+ * @param {ReadonlyArray<Object>} catalog
112
+ * @returns {string|null}
113
+ */
114
+ function resolveTabFromCatalog(input, catalog) {
115
+ if (!input) {
116
+ return null;
117
+ }
118
+ const normalized = String(input).toLowerCase();
119
+ for (const entry of catalog) {
120
+ if (entry.urlTab && entry.urlTab.toLowerCase() === normalized) {
121
+ return entry.urlTab;
122
+ }
123
+ for (const alias of entry.aliases || []) {
124
+ if (String(alias).toLowerCase() === normalized) {
125
+ return entry.urlTab;
126
+ }
127
+ }
128
+ if (entry.omitTabParam && normalized === 'overview') {
129
+ return null;
130
+ }
131
+ }
132
+ return String(input);
133
+ }
134
+
135
+ /**
136
+ * @param {string} systemKey
137
+ * @param {string|null|undefined} tabInput
138
+ * @returns {string}
139
+ */
140
+ function buildSystemRelativePath(systemKey, tabInput) {
141
+ const encodedKey = encodeURIComponent(systemKey);
142
+ const tab = resolveTabFromCatalog(tabInput, SYSTEM_TABS);
143
+ const base = `/connected-systems/${encodedKey}`;
144
+ if (!tab) {
145
+ return base;
146
+ }
147
+ return `${base}?tab=${encodeURIComponent(tab)}`;
148
+ }
149
+
150
+ /**
151
+ * @param {string} systemKey
152
+ * @param {string} datasourceKey
153
+ * @param {string|null|undefined} tabInput
154
+ * @returns {string}
155
+ */
156
+ function buildDatasourceRelativePath(systemKey, datasourceKey, tabInput) {
157
+ const tab = resolveTabFromCatalog(tabInput, DATASOURCE_TABS);
158
+ const base = `/connected-systems/${encodeURIComponent(systemKey)}/datasources/${encodeURIComponent(datasourceKey)}`;
159
+ if (!tab) {
160
+ return base;
161
+ }
162
+ return `${base}?tab=${encodeURIComponent(tab)}`;
163
+ }
164
+
165
+ /**
166
+ * @param {string} publicBase
167
+ * @param {string} relativePath
168
+ * @returns {string}
169
+ */
170
+ function composePublicUrl(publicBase, relativePath) {
171
+ const trimmedBase = String(publicBase).replace(/\/$/, '');
172
+ const trimmedPath = relativePath.startsWith('/') ? relativePath : `/${relativePath}`;
173
+ return `${trimmedBase}${trimmedPath}`;
174
+ }
175
+
176
+ /**
177
+ * @param {Object} data
178
+ * @param {Object} params
179
+ * @returns {void}
180
+ */
181
+ function attachConnectedSystemResolvedPaths(data, params) {
182
+ const { systemKey, tab, datasourceKey, datasourceTab, publicBase } = params;
183
+ const authenticationPath = buildSystemRelativePath(systemKey, 'authentication');
184
+ const requestedSystemPath = buildSystemRelativePath(systemKey, tab);
185
+ data.resolved = {
186
+ systemKey,
187
+ authenticationPath,
188
+ requestedSystemPath
189
+ };
190
+ if (publicBase) {
191
+ data.resolved.authenticationUrl = composePublicUrl(publicBase, authenticationPath);
192
+ data.resolved.requestedSystemUrl = composePublicUrl(publicBase, requestedSystemPath);
193
+ }
194
+ if (datasourceKey) {
195
+ const datasourcePath = buildDatasourceRelativePath(systemKey, datasourceKey, datasourceTab);
196
+ data.resolved.datasourceKey = datasourceKey;
197
+ data.resolved.datasourcePath = datasourcePath;
198
+ if (publicBase) {
199
+ data.resolved.datasourceUrl = composePublicUrl(publicBase, datasourcePath);
200
+ }
201
+ }
202
+ }
203
+
204
+ /**
205
+ * @param {Object} query
206
+ * @returns {Object}
207
+ */
208
+ function buildConnectedSystemUiTopic(query) {
209
+ const systemKey = query.systemKey ? String(query.systemKey) : null;
210
+ const datasourceKey = query.datasourceKey ? String(query.datasourceKey) : null;
211
+ const tab = query.tab || 'authentication';
212
+ const datasourceTab = query.datasourceTab || null;
213
+ const publicBase = query.dataplanePublicBase ? String(query.dataplanePublicBase) : null;
214
+
215
+ /** @type {Object} */
216
+ const data = {
217
+ urlTemplates: URL_TEMPLATES,
218
+ systemTabs: SYSTEM_TABS,
219
+ datasourceTabs: DATASOURCE_TABS,
220
+ authentication: buildAuthenticationCatalog(),
221
+ agentRules: AGENT_RULES,
222
+ postUploadAuthWorkflow: POST_UPLOAD_AUTH_WORKFLOW,
223
+ behavior: {
224
+ tabQuerySelectsTabOnLoad: true,
225
+ tabSwitchUpdatesUrl: true,
226
+ navigationClearsStaleTabState: true,
227
+ staticUiRebuildNote: 'Rebuild dataplane static UI after UI route changes when using Docker dev-reload (make ui-build).'
228
+ }
229
+ };
230
+
231
+ const manifestHandoff = buildAuthenticationHandoffForManifest(query);
232
+ if (manifestHandoff) {
233
+ data.manifestHandoff = manifestHandoff;
234
+ }
235
+
236
+ if (systemKey) {
237
+ attachConnectedSystemResolvedPaths(data, {
238
+ systemKey,
239
+ tab,
240
+ datasourceKey,
241
+ datasourceTab,
242
+ publicBase
243
+ });
244
+ }
245
+
246
+ return buildHelpEnvelope({
247
+ topic: 'connectedSystemUi',
248
+ key: systemKey || 'connectedSystemUi',
249
+ title: 'Connected Systems UI navigation',
250
+ summary:
251
+ 'Shareable dataplane UI paths, tab aliases, and external-system authentication catalog for post-upload handoff without Builder API secrets.',
252
+ data,
253
+ related: ['workflow', 'subscriptionGuide', 'evidencePatterns'],
254
+ recommendedNext: ['workflow', 'evidencePatterns']
255
+ });
256
+ }
257
+
258
+ module.exports = {
259
+ SYSTEM_TABS,
260
+ DATASOURCE_TABS,
261
+ URL_TEMPLATES,
262
+ buildSystemRelativePath,
263
+ buildDatasourceRelativePath,
264
+ composePublicUrl,
265
+ buildConnectedSystemUiTopic
266
+ };
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Enterprise Synchronization Fabrix help topic (webhooks + syncBridge).
3
+ *
4
+ * @fileoverview Builder-api LLM help for webhook activation and syncBridge
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const fs = require('fs');
10
+ const path = require('path');
11
+ const { buildHelpEnvelope } = require('./builder-help-envelope');
12
+
13
+ const HELP_MD_DIR = path.join(__dirname, 'help-content');
14
+
15
+ /** @type {ReadonlyArray<string>} */
16
+ const REPAIR_COMMANDS = Object.freeze([
17
+ 'aifabrix repair <systemKey>',
18
+ 'aifabrix repair <systemKey> --auth <method>',
19
+ 'aifabrix repair <systemKey> --auth-webhook',
20
+ 'aifabrix repair <systemKey> --auth-sync',
21
+ 'aifabrix validate <app>',
22
+ 'aifabrix upload <app>'
23
+ ]);
24
+
25
+ /**
26
+ * @param {Object} query
27
+ * @returns {Object}
28
+ */
29
+ function buildEnterpriseSyncFabrixTopic(query) {
30
+ const raw = fs.readFileSync(
31
+ path.join(HELP_MD_DIR, 'enterprise-sync-fabrix.md'),
32
+ 'utf8'
33
+ );
34
+ const systemKey = query.systemKey ? String(query.systemKey) : '';
35
+ return buildHelpEnvelope({
36
+ topic: 'enterpriseSyncFabrix',
37
+ key: systemKey || 'enterpriseSyncFabrix',
38
+ title: 'Enterprise Synchronization Fabrix',
39
+ summary:
40
+ 'Webhook change signals, syncBridge propagation, authentications[] usage slots, and activation workflow.',
41
+ data: {
42
+ authenticationsUsageSlots: ['api', 'webhookInbound', 'syncExecution'],
43
+ syncBridgeModes: ['disabled', 'master', 'bidirectional'],
44
+ webhookEndpointModes: ['system', 'datasource', 'event'],
45
+ repairCommands: [...REPAIR_COMMANDS],
46
+ postUploadTabs: {
47
+ systemAuthentication: 'authentication',
48
+ datasourceSync: 'sync',
49
+ datasourceLogs: 'logs'
50
+ },
51
+ bodyText: raw.replace(/\s{2,}/g, ' ').trim()
52
+ },
53
+ related: ['connectedSystemUi', 'workflow', 'schemaCatalog'],
54
+ recommendedNext: ['connectedSystemUi', 'workflow']
55
+ });
56
+ }
57
+
58
+ module.exports = {
59
+ buildEnterpriseSyncFabrixTopic
60
+ };
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Help response envelope builder (plan 154.5).
3
+ *
4
+ * @fileoverview Shared constants and envelope shape for builder-api help
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const HELP_CONTENT_VERSION = '154.7';
12
+ const HELP_SCHEMA_VERSION = '1.0.0';
13
+
14
+ /**
15
+ * @param {Object} input
16
+ * @returns {Object}
17
+ */
18
+ function buildHelpEnvelope(input) {
19
+ return {
20
+ version: HELP_CONTENT_VERSION,
21
+ schemaVersion: HELP_SCHEMA_VERSION,
22
+ topic: input.topic,
23
+ key: input.key,
24
+ title: input.title,
25
+ summary: input.summary,
26
+ data: input.data || {},
27
+ related: input.related || [],
28
+ recommendedNext: input.recommendedNext || []
29
+ };
30
+ }
31
+
32
+ module.exports = {
33
+ HELP_CONTENT_VERSION,
34
+ HELP_SCHEMA_VERSION,
35
+ buildHelpEnvelope
36
+ };