@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,112 @@
1
+ /**
2
+ * Find integration/<systemKey> under aifabrix-work (sibling repos).
3
+ *
4
+ * @fileoverview Worktree integration discovery for dev layouts (sibling repos under aifabrix-work)
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
+ const { getAifabrixWork } = require('./paths');
14
+ const { resolveApplicationConfigPath } = require('./app-config-resolver');
15
+ const { discoverIntegrationFiles } = require('../commands/repair-internal');
16
+
17
+ /**
18
+ * @param {string} appPath
19
+ * @returns {boolean}
20
+ */
21
+ function integrationFolderHasContent(appPath) {
22
+ if (!fs.existsSync(appPath)) {
23
+ return false;
24
+ }
25
+ try {
26
+ const st = fs.statSync(appPath);
27
+ if (!st.isDirectory()) {
28
+ return false;
29
+ }
30
+ } catch {
31
+ return false;
32
+ }
33
+ const { systemFiles, datasourceFiles } = discoverIntegrationFiles(appPath);
34
+ if (systemFiles.length > 0 || datasourceFiles.length > 0) {
35
+ return true;
36
+ }
37
+ try {
38
+ resolveApplicationConfigPath(appPath);
39
+ return true;
40
+ } catch {
41
+ return false;
42
+ }
43
+ }
44
+
45
+ /**
46
+ * @param {string} work
47
+ * @param {string} systemKey
48
+ * @returns {{ integrationPath: string, tier: string }[]}
49
+ */
50
+ function collectWorkRepoIntegrationHits(work, systemKey) {
51
+ /** @type {{ integrationPath: string, tier: string }[]} */
52
+ const hits = [];
53
+ let entries;
54
+ try {
55
+ entries = fs.readdirSync(work, { withFileTypes: true });
56
+ } catch {
57
+ return hits;
58
+ }
59
+ for (const ent of entries) {
60
+ if (!ent.isDirectory() || ent.name.startsWith('.')) {
61
+ continue;
62
+ }
63
+ const candidate = path.join(work, ent.name, 'integration', systemKey);
64
+ if (integrationFolderHasContent(candidate)) {
65
+ hits.push({ integrationPath: path.resolve(candidate), tier: 'work-repo-integration' });
66
+ }
67
+ }
68
+ return hits;
69
+ }
70
+
71
+ /**
72
+ * @param {{ integrationPath: string, tier: string }[]} hits
73
+ * @param {string} systemKey
74
+ * @returns {{ integrationPath: string, tier: string }|null}
75
+ */
76
+ function resolveUniqueIntegrationHit(hits, systemKey) {
77
+ if (hits.length === 1) {
78
+ return hits[0];
79
+ }
80
+ if (hits.length > 1) {
81
+ const err = new Error(
82
+ `Integration "${systemKey}" found in multiple repos under aifabrix-work: ${hits.map((h) => h.integrationPath).join(', ')}. ` +
83
+ 'Run from the target repo or narrow with cwd.'
84
+ );
85
+ err.statusCode = 409;
86
+ throw err;
87
+ }
88
+ return null;
89
+ }
90
+
91
+ /**
92
+ * @param {string} systemKey
93
+ * @returns {{ integrationPath: string, tier: string }|null}
94
+ */
95
+ function findIntegrationPathAcrossWorkTree(systemKey) {
96
+ const work = getAifabrixWork();
97
+ if (!work) {
98
+ return null;
99
+ }
100
+
101
+ const direct = path.join(work, 'integration', systemKey);
102
+ if (integrationFolderHasContent(direct)) {
103
+ return { integrationPath: path.resolve(direct), tier: 'work-integration' };
104
+ }
105
+
106
+ return resolveUniqueIntegrationHit(collectWorkRepoIntegrationHits(work, systemKey), systemKey);
107
+ }
108
+
109
+ module.exports = {
110
+ findIntegrationPathAcrossWorkTree,
111
+ integrationFolderHasContent
112
+ };
@@ -11,6 +11,39 @@
11
11
 
12
12
  /* eslint-disable no-console */
13
13
 
14
+ const SENSITIVE_KEY_RE = /(password|secret|token|apikey|apiKey|authorization|clientSecret|x-client-token)/i;
15
+ const BEARER_TOKEN_RE = /(Bearer\s+)[A-Za-z0-9._~-]+/gi;
16
+
17
+ function maskString(value) {
18
+ const asString = String(value);
19
+ return asString.replace(BEARER_TOKEN_RE, '$1[REDACTED]');
20
+ }
21
+
22
+ function sanitizeValue(value) {
23
+ if (value instanceof Error) {
24
+ return value;
25
+ }
26
+ if (typeof value === 'string') {
27
+ return maskString(value);
28
+ }
29
+ if (Array.isArray(value)) {
30
+ return value.map((item) => sanitizeValue(item));
31
+ }
32
+ if (value && typeof value === 'object') {
33
+ /** @type {Record<string, any>} */
34
+ const out = {};
35
+ for (const [key, entry] of Object.entries(value)) {
36
+ if (SENSITIVE_KEY_RE.test(key)) {
37
+ out[key] = '[REDACTED]';
38
+ } else {
39
+ out[key] = sanitizeValue(entry);
40
+ }
41
+ }
42
+ return out;
43
+ }
44
+ return value;
45
+ }
46
+
14
47
  /**
15
48
  * Logger utility that wraps console methods
16
49
  * All console statements should use this logger to avoid eslint warnings
@@ -21,7 +54,7 @@ const logger = {
21
54
  * @param {...any} args - Arguments to log
22
55
  */
23
56
  log: (...args) => {
24
- console.log(...args);
57
+ console.log(...args.map((arg) => sanitizeValue(arg)));
25
58
  },
26
59
 
27
60
  /**
@@ -29,7 +62,7 @@ const logger = {
29
62
  * @param {...any} args - Arguments to log
30
63
  */
31
64
  error: (...args) => {
32
- console.error(...args);
65
+ console.error(...args.map((arg) => sanitizeValue(arg)));
33
66
  },
34
67
 
35
68
  /**
@@ -37,7 +70,7 @@ const logger = {
37
70
  * @param {...any} args - Arguments to log
38
71
  */
39
72
  warn: (...args) => {
40
- console.warn(...args);
73
+ console.warn(...args.map((arg) => sanitizeValue(arg)));
41
74
  },
42
75
 
43
76
  /**
@@ -45,7 +78,7 @@ const logger = {
45
78
  * @param {...any} args - Arguments to log
46
79
  */
47
80
  info: (...args) => {
48
- console.log(...args);
81
+ console.log(...args.map((arg) => sanitizeValue(arg)));
49
82
  }
50
83
  };
51
84
 
@@ -74,7 +74,7 @@ function getManifestSourcePayload(appKey, appPath, opts = {}) {
74
74
  } catch {
75
75
  configPath = '';
76
76
  }
77
- let tier = 'resolved';
77
+ let tier;
78
78
  try {
79
79
  tier = computeTierForAppPath(key, dir, opts.cwd);
80
80
  } catch {
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Resolve product-repo source roots for platform app --reload bind mounts.
3
+ *
4
+ * @fileoverview When builder manifests live under aifabrix-work/builder/<app>, build.context
5
+ * ../.. may point at the work root instead of the product repo; reload mounts must target
6
+ * the repo that contains app/ or packages/.
7
+ * @author AI Fabrix Team
8
+ * @version 1.0.0
9
+ */
10
+
11
+ 'use strict';
12
+
13
+ const path = require('path');
14
+ const { isSystemBuilderAppName } = require('./paths-system-builder-keys');
15
+
16
+ const nodeFs = () => require('../internal/fs-real-sync');
17
+
18
+ /** @type {Readonly<Record<string, string[]>>} */
19
+ const SYSTEM_APP_SOURCE_REPO_DIR_NAMES = Object.freeze({
20
+ dataplane: ['aifabrix-dataplane'],
21
+ 'miso-controller': ['aifabrix-miso'],
22
+ 'builder-api': ['aifabrix-builder']
23
+ });
24
+
25
+ /** @type {Readonly<Record<string, string[]>>} */
26
+ const SYSTEM_APP_RELOAD_MARKERS = Object.freeze({
27
+ dataplane: ['app/main.py'],
28
+ 'miso-controller': ['packages/miso-controller/package.json'],
29
+ 'builder-api': ['lib/cli.js', 'bin/aifabrix.js']
30
+ });
31
+
32
+ /**
33
+ * @param {string} appName
34
+ * @param {string} rootPath
35
+ * @returns {boolean}
36
+ */
37
+ function isValidReloadSourceRoot(appName, rootPath) {
38
+ if (!rootPath || typeof rootPath !== 'string') {
39
+ return false;
40
+ }
41
+ const markers = SYSTEM_APP_RELOAD_MARKERS[appName];
42
+ if (!markers || markers.length === 0) {
43
+ return nodeFs().existsSync(rootPath);
44
+ }
45
+ return markers.some((rel) => nodeFs().existsSync(path.join(rootPath, rel)));
46
+ }
47
+
48
+ /**
49
+ * @param {string} builderPath
50
+ * @param {string} [buildContext]
51
+ * @returns {string}
52
+ */
53
+ function resolveBuildContextFromBuilder(builderPath, buildContext = '../..') {
54
+ const ctx = buildContext && typeof buildContext === 'string' ? buildContext : '.';
55
+ return path.resolve(builderPath, ctx);
56
+ }
57
+
58
+ /**
59
+ * @param {{ getAifabrixWork?: () => (string|null), getCwdBuilderAppPath?: (string) => (string|null) }} deps
60
+ * @returns {{ getWork: () => (string|null), getCwdBuilder: (string) => (string|null) }}
61
+ */
62
+ function resolveReloadDeps(deps) {
63
+ return {
64
+ getWork: deps.getAifabrixWork || (() => require('./paths').getAifabrixWork()),
65
+ getCwdBuilder: deps.getCwdBuilderAppPath || ((name) => require('./paths').getCwdBuilderAppPath(name))
66
+ };
67
+ }
68
+
69
+ /**
70
+ * @param {string} appName
71
+ * @param {string} builderPath
72
+ * @param {string} buildContext
73
+ * @param {{ getAifabrixWork?: () => (string|null), getCwdBuilderAppPath?: (string) => (string|null) }} deps
74
+ * @returns {string[]}
75
+ */
76
+ function collectReloadSourceCandidates(appName, builderPath, buildContext, deps) {
77
+ const { getWork, getCwdBuilder } = resolveReloadDeps(deps);
78
+ const candidates = [];
79
+ const cwdHit = getCwdBuilder(appName);
80
+ if (cwdHit) {
81
+ candidates.push(resolveBuildContextFromBuilder(cwdHit, buildContext));
82
+ }
83
+
84
+ const work = getWork();
85
+ if (!work) {
86
+ return candidates;
87
+ }
88
+
89
+ const repoNames = SYSTEM_APP_SOURCE_REPO_DIR_NAMES[appName] || [];
90
+ for (const repoName of repoNames) {
91
+ candidates.push(path.join(work, repoName));
92
+ }
93
+ try {
94
+ for (const entry of nodeFs().readdirSync(work)) {
95
+ if (!entry || entry.startsWith('.')) continue;
96
+ const builderSub = path.join(work, entry, 'builder', appName);
97
+ if (nodeFs().existsSync(builderSub)) {
98
+ candidates.push(resolveBuildContextFromBuilder(builderSub, buildContext));
99
+ }
100
+ }
101
+ } catch {
102
+ // ignore unreadable work root
103
+ }
104
+ return candidates;
105
+ }
106
+
107
+ /**
108
+ * @param {string} appName
109
+ * @param {string[]} candidates
110
+ * @param {string} fallback
111
+ * @returns {string}
112
+ */
113
+ function pickFirstValidReloadRoot(appName, candidates, fallback) {
114
+ for (const candidate of candidates) {
115
+ if (isValidReloadSourceRoot(appName, candidate)) {
116
+ return candidate;
117
+ }
118
+ }
119
+ return fallback;
120
+ }
121
+
122
+ /**
123
+ * Resolve bind-mount source for `--reload` on platform system apps.
124
+ *
125
+ * @param {string} appName
126
+ * @param {string} builderPath - builder/<app> directory used for run
127
+ * @param {string} [buildContext='../..'] - build.context from application.yaml
128
+ * @param {{ getAifabrixWork?: () => (string|null), getCwdBuilderAppPath?: (string) => (string|null) }} [deps]
129
+ * @returns {string}
130
+ */
131
+ function resolveSystemAppReloadSourceRoot(appName, builderPath, buildContext = '../..', deps = {}) {
132
+ const direct = resolveBuildContextFromBuilder(builderPath, buildContext);
133
+ if (!isSystemBuilderAppName(appName)) {
134
+ return direct;
135
+ }
136
+ if (isValidReloadSourceRoot(appName, direct)) {
137
+ return direct;
138
+ }
139
+ const candidates = collectReloadSourceCandidates(appName, builderPath, buildContext, deps);
140
+ return pickFirstValidReloadRoot(appName, candidates, direct);
141
+ }
142
+
143
+ module.exports = {
144
+ SYSTEM_APP_SOURCE_REPO_DIR_NAMES,
145
+ SYSTEM_APP_RELOAD_MARKERS,
146
+ isValidReloadSourceRoot,
147
+ resolveSystemAppReloadSourceRoot
148
+ };
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Platform system builder app keys (shared to avoid circular requires in paths.js).
3
+ *
4
+ * @fileoverview SYSTEM_BUILDER_APP_KEYS for dataplane, miso-controller, etc.
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const SYSTEM_BUILDER_APP_KEYS = Object.freeze(['keycloak', 'miso-controller', 'dataplane', 'builder-api']);
12
+
13
+ /**
14
+ * @param {string} appName
15
+ * @returns {boolean}
16
+ */
17
+ function isSystemBuilderAppName(appName) {
18
+ if (!appName || typeof appName !== 'string') return false;
19
+ return SYSTEM_BUILDER_APP_KEYS.includes(appName);
20
+ }
21
+
22
+ module.exports = {
23
+ SYSTEM_BUILDER_APP_KEYS,
24
+ isSystemBuilderAppName
25
+ };
@@ -447,7 +447,7 @@ function getBuilderRoot() {
447
447
  * {@link getSystemBuilderRoot} (= {@link getAppsMaterializationParent}`/builder`), never the global CLI package tree.
448
448
  * @readonly
449
449
  */
450
- const SYSTEM_BUILDER_APP_KEYS = Object.freeze(['keycloak', 'miso-controller', 'dataplane']);
450
+ const SYSTEM_BUILDER_APP_KEYS = Object.freeze(['keycloak', 'miso-controller', 'dataplane', 'builder-api']);
451
451
 
452
452
  /**
453
453
  * @param {string} appName
@@ -537,19 +537,45 @@ function isAppSubdirSync(root, name) {
537
537
  }
538
538
 
539
539
  /**
540
- * Lists app names (directories) under integration root. Excludes dot-prefixed entries.
540
+ * True when an integration/builder app directory has application config (yaml/json or legacy variables.yaml).
541
+ * Skips helper folders such as fixtures/ and wizard-configs/.
542
+ * @param {string} appDir - Absolute path to candidate app directory
543
+ * @returns {boolean}
544
+ */
545
+ function hasApplicationConfigSync(appDir) {
546
+ if (!appDir || typeof appDir !== 'string') return false;
547
+ const disk = nodeFs();
548
+ const names = [
549
+ 'application.yaml',
550
+ 'application.yml',
551
+ 'application.json',
552
+ 'variables.yaml'
553
+ ];
554
+ return names.some((name) => {
555
+ try {
556
+ return disk.existsSync(path.join(appDir, name));
557
+ } catch {
558
+ return false;
559
+ }
560
+ });
561
+ }
562
+
563
+ /**
564
+ * Lists app names (directories) under integration root. Excludes dot-prefixed entries
565
+ * and directories without application config (e.g. fixtures/, wizard-configs/).
541
566
  * Returns [] if root does not exist.
542
567
  * @returns {string[]} Sorted list of app directory names
543
568
  */
544
569
  function listIntegrationAppNames() {
545
570
  const disk = nodeFs();
546
571
  const names = new Set();
572
+ const withAppConfig = (root) => (name) => hasApplicationConfigSync(path.join(root, name));
547
573
  const cwdRoot = getCwdIntegrationRoot();
548
574
  if (cwdRoot) {
549
- addBuilderSubdirNamesToSet(disk, cwdRoot, names, null);
575
+ addBuilderSubdirNamesToSet(disk, cwdRoot, names, withAppConfig(cwdRoot));
550
576
  }
551
577
  const matInt = getIntegrationRoot();
552
- addBuilderSubdirNamesToSet(disk, matInt, names, null);
578
+ addBuilderSubdirNamesToSet(disk, matInt, names, withAppConfig(matInt));
553
579
  return [...names].sort();
554
580
  }
555
581
 
@@ -595,7 +621,9 @@ function listBuilderAppNames() {
595
621
  }
596
622
  roots.add(path.resolve(getSystemBuilderRoot()));
597
623
  for (const r of roots) {
598
- addBuilderSubdirNamesToSet(disk, r, names, null);
624
+ addBuilderSubdirNamesToSet(disk, r, names, (name) =>
625
+ hasApplicationConfigSync(path.join(r, name))
626
+ );
599
627
  }
600
628
  return [...names].sort();
601
629
  }
@@ -611,6 +639,15 @@ function getIntegrationPath(appName) {
611
639
  if (!appName || typeof appName !== 'string') {
612
640
  throw new Error('App name is required and must be a string');
613
641
  }
642
+ try {
643
+ const { getIntegrationPathScope } = require('../programmatic/integration-path-scope');
644
+ const scope = getIntegrationPathScope();
645
+ if (scope && typeof scope.resolveIntegrationPath === 'function') {
646
+ return scope.resolveIntegrationPath(appName);
647
+ }
648
+ } catch {
649
+ // programmatic module optional for CLI-only usage
650
+ }
614
651
  const cwdInt = path.join(path.resolve(process.cwd()), 'integration', appName);
615
652
  try {
616
653
  if (nodeFs().existsSync(cwdInt)) {
@@ -727,25 +764,81 @@ function isExternalAppType(variables) {
727
764
  * @param {string} appName - Application name
728
765
  * @returns {Object|null} App type info or null if no config found
729
766
  */
730
- function checkIntegrationFolder(appName) {
731
- const integrationPath = getIntegrationPath(appName);
732
- let variables;
767
+ function isScopedIntegrationPathActive() {
733
768
  try {
734
- const configPath = resolveApplicationConfigPath(integrationPath);
735
- variables = loadConfigFile(configPath);
769
+ const { getIntegrationPathScope } = require('../programmatic/integration-path-scope');
770
+ const scope = getIntegrationPathScope();
771
+ return Boolean(scope && typeof scope.resolveIntegrationPath === 'function');
772
+ } catch {
773
+ return false;
774
+ }
775
+ }
776
+
777
+ function externalIntegrationFolderResult(appPath, baseDir = 'integration') {
778
+ return {
779
+ isExternal: true,
780
+ appPath,
781
+ appType: 'external',
782
+ baseDir
783
+ };
784
+ }
785
+
786
+ function isExistingAppDirectory(dirPath) {
787
+ try {
788
+ return fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory();
736
789
  } catch {
790
+ return false;
791
+ }
792
+ }
793
+
794
+ function resolveExistingWorkspacePath(appName, options) {
795
+ const { resolveAppWorkspace } = require('./app-path-resolve');
796
+ const { appPath, baseDir } = resolveAppWorkspace(appName, options);
797
+ if (isExistingAppDirectory(appPath)) {
798
+ return { appPath, baseDir };
799
+ }
800
+ const altWorkspace =
801
+ baseDir === 'enterprise-knowledge' ? 'integration' : 'enterprise-knowledge';
802
+ const alt = resolveAppWorkspace(appName, { ...options, workspace: altWorkspace });
803
+ if (!isExistingAppDirectory(alt.appPath)) {
737
804
  return null;
738
805
  }
739
- if (variables) {
806
+ return { appPath: alt.appPath, baseDir: alt.baseDir };
807
+ }
808
+
809
+ function externalWorkspaceFolderFromConfig(appPath, baseDir, scopedWorkspace) {
810
+ try {
811
+ const configPath = resolveApplicationConfigPath(appPath);
812
+ const variables = loadConfigFile(configPath);
813
+ if (!variables) {
814
+ return null;
815
+ }
740
816
  const isExternal = isExternalAppType(variables);
741
817
  return {
742
818
  isExternal,
743
- appPath: integrationPath,
819
+ appPath,
744
820
  appType: isExternal ? 'external' : 'regular',
745
- baseDir: 'integration'
821
+ baseDir
746
822
  };
823
+ } catch {
824
+ if (scopedWorkspace && isExistingAppDirectory(appPath)) {
825
+ return externalIntegrationFolderResult(appPath, baseDir);
826
+ }
827
+ return null;
747
828
  }
748
- return null;
829
+ }
830
+
831
+ function checkExternalWorkspaceFolder(appName, options = {}) {
832
+ const located = resolveExistingWorkspacePath(appName, options);
833
+ if (!located) {
834
+ return null;
835
+ }
836
+ const { appPath, baseDir } = located;
837
+ const scopedWorkspace = isScopedIntegrationPathActive();
838
+ if (scopedWorkspace && !isExistingAppDirectory(appPath)) {
839
+ return null;
840
+ }
841
+ return externalWorkspaceFolderFromConfig(appPath, baseDir, scopedWorkspace);
749
842
  }
750
843
 
751
844
  /**
@@ -776,6 +869,41 @@ function checkBuilderFolder(appName) {
776
869
  }
777
870
  return null;
778
871
  }
872
+
873
+ /**
874
+ * When {@link getBuilderPath} has no application config but the CLI ships
875
+ * `templates/applications/<appName>/`, materialize `builder/<appName>/` (same as
876
+ * `ensureAppFromTemplate` for platform apps on `up-miso` / `up-dataplane`).
877
+ *
878
+ * @param {string} appName
879
+ * @returns {Promise<boolean>} True when template was copied
880
+ */
881
+ async function ensureShippedBuilderAppTemplate(appName) {
882
+ if (!appName || typeof appName !== 'string') {
883
+ return false;
884
+ }
885
+ if (isSystemBuilderAppName(appName)) {
886
+ return false;
887
+ }
888
+ const projectRoot = getProjectRoot();
889
+ const templateDir = path.join(projectRoot, 'templates', 'applications', appName);
890
+ if (!fs.existsSync(templateDir) || !fs.statSync(templateDir).isDirectory()) {
891
+ return false;
892
+ }
893
+ const builderPath = getBuilderPath(appName);
894
+ try {
895
+ resolveApplicationConfigPath(builderPath);
896
+ return false;
897
+ } catch {
898
+ // No application config under builder/<appName>; copy shipped template.
899
+ }
900
+ const { copyTemplateFiles } = require('../validation/template');
901
+ const { ensureReadmeForAppPath } = require('../app/readme');
902
+ await copyTemplateFiles(appName, builderPath);
903
+ await ensureReadmeForAppPath(builderPath, appName);
904
+ return true;
905
+ }
906
+
779
907
  /**
780
908
  * Detects if an app is external type by checking application config.
781
909
  * Resolution order: integration/ first, then builder/; if neither exists, throws.
@@ -786,15 +914,20 @@ function checkBuilderFolder(appName) {
786
914
  * @returns {Promise<{isExternal: boolean, appPath: string, appType: string, baseDir?: string}>}
787
915
  * @throws {Error} When app not found in integration/ or builder/
788
916
  */
789
- async function detectAppType(appName, _options = {}) {
917
+ async function detectAppType(appName, options = {}) {
790
918
  if (!appName || typeof appName !== 'string') {
791
919
  throw new Error('App name is required and must be a string');
792
920
  }
793
- const integrationResult = checkIntegrationFolder(appName);
794
- if (integrationResult) return integrationResult;
921
+ const externalResult = checkExternalWorkspaceFolder(appName, options);
922
+ if (externalResult) return externalResult;
795
923
  const builderResult = checkBuilderFolder(appName);
796
924
  if (builderResult) return builderResult;
797
- throw new Error(`App '${appName}' not found in integration/${appName} or builder/${appName}`);
925
+ await ensureShippedBuilderAppTemplate(appName);
926
+ const builderAfterTemplate = checkBuilderFolder(appName);
927
+ if (builderAfterTemplate) return builderAfterTemplate;
928
+ throw new Error(
929
+ `App '${appName}' not found in integration/${appName}, enterprise-knowledge/${appName}, or builder/${appName}`
930
+ );
798
931
  }
799
932
 
800
933
  /**
@@ -808,19 +941,32 @@ async function detectAppType(appName, _options = {}) {
808
941
  * @returns {Promise<{appPath: string, envOnly: boolean}>} appPath and envOnly (true when only env.template is used)
809
942
  * @throws {Error} When app not found in integration or builder
810
943
  */
811
- async function getResolveAppPath(appName) {
944
+ function tryResolveEnvOnlyPath(dirPath) {
945
+ const envTemplatePath = path.join(dirPath, 'env.template');
946
+ if (!fs.existsSync(dirPath) || !fs.existsSync(envTemplatePath)) {
947
+ return null;
948
+ }
949
+ try {
950
+ resolveApplicationConfigPath(dirPath);
951
+ return { appPath: dirPath, envOnly: false };
952
+ } catch {
953
+ return { appPath: dirPath, envOnly: true };
954
+ }
955
+ }
956
+
957
+ async function getResolveAppPath(appName, options = {}) {
812
958
  if (!appName || typeof appName !== 'string') {
813
959
  throw new Error('App name is required and must be a string');
814
960
  }
815
- const integrationPath = getIntegrationPath(appName);
816
- const envTemplatePath = path.join(integrationPath, 'env.template');
817
- if (fs.existsSync(integrationPath) && fs.existsSync(envTemplatePath)) {
818
- try {
819
- resolveApplicationConfigPath(integrationPath);
820
- return { appPath: integrationPath, envOnly: false };
821
- } catch {
822
- return { appPath: integrationPath, envOnly: true };
823
- }
961
+ const { resolveAppWorkspace } = require('./app-path-resolve');
962
+ const { appPath: workspacePath } = resolveAppWorkspace(appName, options);
963
+ const workspaceHit = tryResolveEnvOnlyPath(workspacePath);
964
+ if (workspaceHit) {
965
+ return workspaceHit;
966
+ }
967
+ const integrationHit = tryResolveEnvOnlyPath(getIntegrationPath(appName));
968
+ if (integrationHit) {
969
+ return integrationHit;
824
970
  }
825
971
  const { resolveApplicationManifestPathSync } = require('./manifest-location');
826
972
  const manifestHit = resolveApplicationManifestPathSync({
@@ -831,7 +977,7 @@ async function getResolveAppPath(appName) {
831
977
  if (manifestHit) {
832
978
  return { appPath: manifestHit.absolutePath, envOnly: false };
833
979
  }
834
- const result = await detectAppType(appName);
980
+ const result = await detectAppType(appName, options);
835
981
  return { appPath: result.appPath, envOnly: false };
836
982
  }
837
983
 
@@ -918,9 +1064,16 @@ module.exports = {
918
1064
  getDeployJsonPath,
919
1065
  resolveApplicationConfigPath,
920
1066
  resolveRbacPath,
1067
+ ensureShippedBuilderAppTemplate,
921
1068
  detectAppType,
922
1069
  getResolveAppPath,
923
1070
  resolveIntegrationAppKeyFromCwd,
924
- clearProjectRootCache
1071
+ clearProjectRootCache,
1072
+ resolveSystemAppReloadSourceRoot: require('./paths-reload-source').resolveSystemAppReloadSourceRoot,
1073
+ getEnterpriseKnowledgePath: require('./enterprise-knowledge-paths').getEnterpriseKnowledgePath,
1074
+ getEnterpriseKnowledgeRoot: require('./enterprise-knowledge-paths').getEnterpriseKnowledgeRoot,
1075
+ listEnterpriseKnowledgeAnchors: require('./enterprise-knowledge-paths').listEnterpriseKnowledgeAnchors,
1076
+ resolveAppWorkspace: require('./app-path-resolve').resolveAppWorkspace,
1077
+ resolveExternalSystemPath: require('./app-path-resolve').resolveExternalSystemPath
925
1078
  };
926
1079
 
@@ -64,6 +64,10 @@ async function uploadApplicationViaPipelineWithAuthRetry(dataplaneUrl, authConfi
64
64
  if (!isPipelineAuthFailure(first) || authConfig.type !== 'bearer') {
65
65
  return first;
66
66
  }
67
+ // Token-forward: do not swap the caller JWT for application client-token.
68
+ if (authConfig.preserveBearer) {
69
+ return first;
70
+ }
67
71
  const clientAuth = await resolveClientTokenAuthForPipelineRetry(systemKey);
68
72
  if (!clientAuth || clientAuth.type === 'bearer') {
69
73
  return first;