@aifabrix/builder 2.49.2 → 2.50.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 (409) hide show
  1. package/.cursor/rules/deploy-rules/docker-image-ip-policy.mdc +49 -0
  2. package/.cursor/rules/plan-rules/application-lifecycle.mdc +30 -0
  3. package/.cursor/rules/plan-rules/plan-frontmatter.mdc +35 -0
  4. package/.cursor/rules/plan-rules/plan-lifecycle.mdc +31 -0
  5. package/.cursor/rules/plan-rules/plan-validation-gate.mdc +34 -0
  6. package/.cursor/skills/README.md +1 -0
  7. package/.dockerignore +52 -0
  8. package/.eslintignore +22 -0
  9. package/README.md +2 -0
  10. package/bin/builder-api-cleanup.js +26 -0
  11. package/bin/builder-api-nest.js +10 -0
  12. package/bin/builder-api-spike.js +19 -0
  13. package/enterprise-knowledge/README.md +50 -0
  14. package/enterprise-knowledge/enterprise-integration-lifecycle/README.md +22 -0
  15. package/enterprise-knowledge/enterprise-integration-lifecycle/application.json +15 -0
  16. package/enterprise-knowledge/enterprise-integration-lifecycle/deploy.js +69 -0
  17. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-deploy.json +52 -0
  18. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-system.json +29 -0
  19. package/enterprise-knowledge/enterprise-integration-lifecycle/env.template +2 -0
  20. package/integration/README.md +81 -0
  21. package/integration/github/README.md +53 -0
  22. package/integration/github/application.json +21 -0
  23. package/integration/github/deploy.js +72 -0
  24. package/integration/github/env.template +11 -0
  25. package/integration/github/github-datasource-issue-comments.json +239 -0
  26. package/integration/github/github-datasource-issues.json +399 -0
  27. package/integration/github/github-datasource-repository.json +354 -0
  28. package/integration/github/github-deploy.json +1202 -0
  29. package/integration/github/github-system.json +82 -0
  30. package/integration/hubspot-test/README.md +1 -1
  31. package/jest.isolated-projects.js +31 -1
  32. package/jest.projects.js +87 -1
  33. package/lib/api/dev-server-https.js +1 -1
  34. package/lib/api/enterprise-knowledge.api.js +63 -0
  35. package/lib/api/evidence.api.js +172 -0
  36. package/lib/api/external-systems.api.js +8 -2
  37. package/lib/api/resource-types.api.js +1 -0
  38. package/lib/api/types/enterprise-knowledge.types.js +46 -0
  39. package/lib/api/types/evidence.types.js +67 -0
  40. package/lib/api/types/resource-types.types.js +2 -0
  41. package/lib/app/controller-application-filter.js +36 -0
  42. package/lib/app/deploy.js +1 -1
  43. package/lib/app/list-external-systems.js +130 -0
  44. package/lib/app/list.js +20 -8
  45. package/lib/app/run.js +3 -1
  46. package/lib/app/show-display.js +8 -3
  47. package/lib/app/show-online.js +178 -0
  48. package/lib/app/show.js +37 -88
  49. package/lib/build/builder-api-docker-staging.js +47 -0
  50. package/lib/build/miso-controller-npm-sdk-guard.js +2 -2
  51. package/lib/build/standard-docker-build.js +2 -0
  52. package/lib/certification/post-unified-cert-sync.js +4 -31
  53. package/lib/certification/sync-after-external-command.js +0 -1
  54. package/lib/certification/sync-system-certification.js +0 -3
  55. package/lib/channels/add-channel.js +40 -34
  56. package/lib/channels/approval-guides/chatgpt.js +33 -0
  57. package/lib/channels/approval-guides/credential-portal.js +38 -0
  58. package/lib/channels/approval-guides/index.js +110 -0
  59. package/lib/channels/approval-guides/microsoft-copilot.js +34 -0
  60. package/lib/channels/approval-guides/slack.js +34 -0
  61. package/lib/channels/approval-guides/teams-bot.js +35 -0
  62. package/lib/channels/approval-guides/web-embed.js +32 -0
  63. package/lib/channels/channel-approval-guide.js +11 -0
  64. package/lib/channels/channel-artifact-generator.js +16 -4
  65. package/lib/channels/channel-audit.js +3 -0
  66. package/lib/channels/channel-auth-context.js +1 -1
  67. package/lib/channels/channel-description.js +59 -0
  68. package/lib/channels/channel-integration-generator.js +13 -230
  69. package/lib/channels/channel-integration-template.js +94 -0
  70. package/lib/channels/channel-runtime-resolver.js +43 -3
  71. package/lib/channels/channel-status-display.js +66 -26
  72. package/lib/channels/channel-targets.js +3 -3
  73. package/lib/cli/index.js +27 -3
  74. package/lib/cli/infra-guided.js +5 -1
  75. package/lib/cli/setup-app-external-create.js +111 -0
  76. package/lib/cli/setup-app.help.js +1 -1
  77. package/lib/cli/setup-app.js +38 -125
  78. package/lib/cli/setup-app.test-commands.js +26 -52
  79. package/lib/cli/setup-certification-commands.js +4 -4
  80. package/lib/cli/setup-certification.help.js +9 -9
  81. package/lib/cli/setup-dev.js +7 -2
  82. package/lib/cli/setup-external-system-help.js +4 -6
  83. package/lib/cli/setup-external-system.js +58 -52
  84. package/lib/cli/setup-infra-up-builder-api-action.js +64 -0
  85. package/lib/cli/setup-infra-up-platform-action.js +3 -1
  86. package/lib/cli/setup-infra.js +15 -0
  87. package/lib/cli/setup-list.js +43 -0
  88. package/lib/cli/setup-utility-repair.js +26 -7
  89. package/lib/cli/setup-utility.js +5 -3
  90. package/lib/commands/app.js +15 -43
  91. package/lib/commands/channel-add-setup.js +110 -0
  92. package/lib/commands/channel.js +42 -8
  93. package/lib/commands/datasource-sync-display.js +96 -0
  94. package/lib/commands/datasource-sync-policy.js +210 -0
  95. package/lib/commands/datasource-test-trust-cli.js +6 -6
  96. package/lib/commands/datasource-unified-test-cli.js +2 -1
  97. package/lib/commands/datasource-unified-test-cli.options.js +33 -23
  98. package/lib/commands/deploy-gate-failure-details.js +163 -0
  99. package/lib/commands/deploy-gate-orchestrator.js +322 -0
  100. package/lib/commands/dev-cli-handlers.js +1 -59
  101. package/lib/commands/dev-host-ops-params.js +91 -0
  102. package/lib/commands/dev-host-ops-poll.js +111 -0
  103. package/lib/commands/dev-host-ops.js +107 -94
  104. package/lib/commands/dev-init.js +3 -1
  105. package/lib/commands/enterprise-knowledge.js +284 -0
  106. package/lib/commands/evidence-cli-leaves.js +250 -0
  107. package/lib/commands/evidence.js +51 -0
  108. package/lib/commands/governance-cli-shared.js +2 -2
  109. package/lib/commands/governance-command-action.js +2 -2
  110. package/lib/commands/governance-fixture-subjects.js +85 -0
  111. package/lib/commands/governance.js +1 -1
  112. package/lib/commands/lifecycle-command-action.js +2 -2
  113. package/lib/commands/lifecycle-external.js +3 -3
  114. package/lib/commands/manifest-cli-auth.js +29 -0
  115. package/lib/commands/manifest-cli-commands.js +170 -0
  116. package/lib/commands/manifest-cli-integration-path.js +63 -0
  117. package/lib/commands/manifest.js +21 -0
  118. package/lib/commands/protection-cli-leaves.js +3 -3
  119. package/lib/commands/repair-auth-apply.js +15 -1
  120. package/lib/commands/repair-authentications-454.js +169 -0
  121. package/lib/commands/repair-capability-openapi-warnings.js +126 -0
  122. package/lib/commands/repair-datasource-apply.js +135 -0
  123. package/lib/commands/repair-datasource-auto-rbac.js +62 -1
  124. package/lib/commands/repair-datasource-http-service-contract.js +239 -0
  125. package/lib/commands/repair-datasource-operation-security.js +180 -0
  126. package/lib/commands/repair-datasource-run.js +7 -2
  127. package/lib/commands/repair-datasource-sync-operations.js +177 -0
  128. package/lib/commands/repair-datasource-webhooks-sync-bridge.js +133 -0
  129. package/lib/commands/repair-datasource.js +12 -68
  130. package/lib/commands/repair-env-template.js +11 -1
  131. package/lib/commands/repair-external-run.js +121 -31
  132. package/lib/commands/repair-internal.js +1 -1
  133. package/lib/commands/repair-openapi-export.js +156 -0
  134. package/lib/commands/repair-openapi-sync.js +19 -2
  135. package/lib/commands/repair-orchestration-datasource-split.js +259 -0
  136. package/lib/commands/repair-persist.js +22 -1
  137. package/lib/commands/repair-rbac-platform-preset.js +204 -0
  138. package/lib/commands/repair-rbac-reader-roles.js +191 -0
  139. package/lib/commands/repair-rbac.js +163 -86
  140. package/lib/commands/repair-steps.js +83 -18
  141. package/lib/commands/repair-system-permissions.js +1 -0
  142. package/lib/commands/repair.js +1 -1
  143. package/lib/commands/resource-type.js +65 -26
  144. package/lib/commands/run-post-publish-data-sync.js +68 -0
  145. package/lib/commands/setup-modes.js +1 -1
  146. package/lib/commands/test-e2e-external.js +21 -8
  147. package/lib/commands/test-governance-cli-options.js +2 -2
  148. package/lib/commands/test-trust-cli-options.js +2 -2
  149. package/lib/commands/up-builder-api-bootstrap.js +71 -0
  150. package/lib/commands/up-builder-api-provision.js +241 -0
  151. package/lib/commands/up-builder-api.js +88 -0
  152. package/lib/commands/up-common.js +25 -1
  153. package/lib/commands/upload-credential-push-log.js +117 -0
  154. package/lib/commands/upload-data-sync-finalize.js +60 -0
  155. package/lib/commands/upload-probe.js +66 -0
  156. package/lib/commands/upload-publish-context.js +4 -1
  157. package/lib/commands/upload-sidecar-followups.js +55 -27
  158. package/lib/commands/upload.js +116 -157
  159. package/lib/commands/verify-governance-combined-external.js +1 -1
  160. package/lib/commands/verify-governance-db.js +2 -2
  161. package/lib/commands/verify-operations-command-action.js +2 -2
  162. package/lib/commands/verify-operations-step-plan.js +2 -2
  163. package/lib/commands/verify-operations-steps.js +2 -2
  164. package/lib/commands/verify-trust-command-action.js +1 -1
  165. package/lib/commands/wizard-core.js +1 -1
  166. package/lib/commands/wizard-headless.js +2 -1
  167. package/lib/core/admin-secrets.js +2 -6
  168. package/lib/core/secrets-env-content.js +10 -4
  169. package/lib/core/secrets-env-write.js +2 -13
  170. package/lib/datasource/agent-trust-run.js +3 -3
  171. package/lib/datasource/deploy.js +3 -1
  172. package/lib/datasource/test-e2e.js +6 -1
  173. package/lib/datasource/unified-validation-run-body.js +4 -1
  174. package/lib/datasource/unified-validation-run.js +1 -1
  175. package/lib/deployment/deploy-poll-ui.js +73 -12
  176. package/lib/deployment/deployer-poll-run.js +113 -0
  177. package/lib/deployment/deployer.js +17 -87
  178. package/lib/evidence/dataplane-context.js +21 -0
  179. package/lib/evidence/evidence-display.js +78 -0
  180. package/lib/evidence/evidence-service.js +392 -0
  181. package/lib/external-system/deploy.js +290 -112
  182. package/lib/external-system/download.js +7 -3
  183. package/lib/external-system/test-execution.js +1 -1
  184. package/lib/external-system/test-system-level.js +8 -10
  185. package/lib/external-system/test.js +12 -6
  186. package/lib/generator/deploy-script.js +73 -0
  187. package/lib/generator/external.js +2 -1
  188. package/lib/generator/index.js +17 -2
  189. package/lib/generator/wizard.js +3 -36
  190. package/lib/internal/fs-real-sync.js +22 -1
  191. package/lib/internal/node-fs.js +2 -0
  192. package/lib/lifecycle/lifecycle-governance-options.js +1 -1
  193. package/lib/lifecycle/verify-step-progress.js +1 -1
  194. package/lib/programmatic/access-log.js +26 -0
  195. package/lib/programmatic/auth-config.js +44 -0
  196. package/lib/programmatic/bearer-auth.js +176 -0
  197. package/lib/programmatic/builder-api-request.js +175 -0
  198. package/lib/programmatic/builder-api-route-dispatch.js +82 -0
  199. package/lib/programmatic/builder-api-runtime-config.js +42 -0
  200. package/lib/programmatic/builder-api-server.js +230 -0
  201. package/lib/programmatic/builder-help-authentication-catalog.js +282 -0
  202. package/lib/programmatic/builder-help-connected-system-ui.js +266 -0
  203. package/lib/programmatic/builder-help-enterprise-sync-fabrix.js +60 -0
  204. package/lib/programmatic/builder-help-envelope.js +36 -0
  205. package/lib/programmatic/builder-help-fixtures.js +200 -0
  206. package/lib/programmatic/builder-help-governance.js +172 -0
  207. package/lib/programmatic/builder-help-schema-catalog.js +92 -0
  208. package/lib/programmatic/builder-help.js +361 -0
  209. package/lib/programmatic/capability-registry.js +77 -0
  210. package/lib/programmatic/command-options.js +32 -0
  211. package/lib/programmatic/enterprise-mcp-client.js +98 -0
  212. package/lib/programmatic/http-problem-details.js +99 -0
  213. package/lib/programmatic/http-route-match.js +40 -0
  214. package/lib/programmatic/idempotency-cache.js +69 -0
  215. package/lib/programmatic/index.js +53 -0
  216. package/lib/programmatic/integration-path-scope.js +39 -0
  217. package/lib/programmatic/log-redaction.js +66 -0
  218. package/lib/programmatic/manifest-get-section.js +146 -0
  219. package/lib/programmatic/manifest-patch-section.js +252 -0
  220. package/lib/programmatic/manifest-repair.js +122 -0
  221. package/lib/programmatic/manifest-section-dependency-graph.js +160 -0
  222. package/lib/programmatic/manifest-section-io.js +225 -0
  223. package/lib/programmatic/manifest-section-quality.js +171 -0
  224. package/lib/programmatic/manifest-section-registry-data.js +269 -0
  225. package/lib/programmatic/manifest-section-registry.js +205 -0
  226. package/lib/programmatic/nest-http-bridge.js +34 -0
  227. package/lib/programmatic/openapi-component-schemas.js +68 -0
  228. package/lib/programmatic/openapi-description-enricher.js +117 -0
  229. package/lib/programmatic/openapi-descriptions.js +190 -0
  230. package/lib/programmatic/openapi-docs-serving.js +123 -0
  231. package/lib/programmatic/openapi-help-schemas.js +63 -0
  232. package/lib/programmatic/openapi-manifest-schemas.js +141 -0
  233. package/lib/programmatic/openapi-operation-bindings.js +274 -0
  234. package/lib/programmatic/openapi-request-schemas.js +155 -0
  235. package/lib/programmatic/openapi-result-schemas.js +476 -0
  236. package/lib/programmatic/openapi-schema-descriptions-certify.js +139 -0
  237. package/lib/programmatic/openapi-schema-descriptions-core.js +159 -0
  238. package/lib/programmatic/openapi-schema-descriptions-help.js +40 -0
  239. package/lib/programmatic/openapi-schema-descriptions-manifest.js +143 -0
  240. package/lib/programmatic/openapi-schema-descriptions-mcp.js +118 -0
  241. package/lib/programmatic/openapi-schema-descriptions-operations.js +281 -0
  242. package/lib/programmatic/openapi-schema-helpers.js +93 -0
  243. package/lib/programmatic/openapi-spec.js +203 -0
  244. package/lib/programmatic/orchestration-openapi-meta.js +159 -0
  245. package/lib/programmatic/platform-rbac-catalog.js +90 -0
  246. package/lib/programmatic/request-timeout.js +53 -0
  247. package/lib/programmatic/route-handler-map.js +143 -0
  248. package/lib/programmatic/route-handlers-context.js +29 -0
  249. package/lib/programmatic/route-handlers.js +33 -0
  250. package/lib/programmatic/run-certify.js +57 -0
  251. package/lib/programmatic/run-enterprise-mcp.js +32 -0
  252. package/lib/programmatic/run-lifecycle.js +29 -0
  253. package/lib/programmatic/run-repair.js +41 -0
  254. package/lib/programmatic/run-repository-emcp.js +54 -0
  255. package/lib/programmatic/run-template-workspace.js +61 -0
  256. package/lib/programmatic/run-test.js +49 -0
  257. package/lib/programmatic/run-upload.js +63 -0
  258. package/lib/programmatic/run-validate.js +53 -0
  259. package/lib/programmatic/run-wizard.js +40 -0
  260. package/lib/programmatic/system-key.js +48 -0
  261. package/lib/programmatic/wizard-config-normalize.js +118 -0
  262. package/lib/programmatic/workspace-cleanup.js +128 -0
  263. package/lib/programmatic/workspace-context.js +145 -0
  264. package/lib/programmatic/workspace-lock.js +75 -0
  265. package/lib/programmatic/workspace-meta.js +64 -0
  266. package/lib/programmatic/workspace-ops.js +149 -0
  267. package/lib/protection/run-commands-upload-sync.js +35 -0
  268. package/lib/protection/run-commands.js +2 -20
  269. package/lib/protection/upload-batch.js +11 -7
  270. package/lib/resolvers/resource-type-file.js +22 -0
  271. package/lib/schema/external-datasource.schema.json +161 -1
  272. package/lib/schema/external-system.schema.json +244 -118
  273. package/lib/schema/flag-map-validation-run.json +3 -0
  274. package/lib/schema/type/credential-field-registry.json +2 -2
  275. package/lib/schema/type/document-storage.json +9 -0
  276. package/lib/utils/agent-trust-run-display.js +1 -1
  277. package/lib/utils/app-path-resolve.js +168 -0
  278. package/lib/utils/authentication-env-template.js +222 -0
  279. package/lib/utils/cli-sync-options.js +7 -11
  280. package/lib/utils/cli-utils.js +4 -0
  281. package/lib/utils/cli-workspace-options.js +29 -0
  282. package/lib/utils/compose-generate-docker-compose.js +102 -0
  283. package/lib/utils/configuration-env-resolver.js +203 -27
  284. package/lib/utils/datasource-test-run-certificate-tty.js +28 -2
  285. package/lib/utils/datasource-test-run-certification-debug.js +130 -0
  286. package/lib/utils/datasource-test-run-debug-display.js +2 -0
  287. package/lib/utils/datasource-test-run-debug-slice.js +7 -0
  288. package/lib/utils/datasource-test-run-display.js +2 -1
  289. package/lib/utils/dev-init-ssh-merge.js +165 -23
  290. package/lib/utils/dev-pin-share-instructions.js +110 -0
  291. package/lib/utils/dev-ssh-config-helper.js +177 -33
  292. package/lib/utils/enterprise-knowledge-paths.js +142 -0
  293. package/lib/utils/env-copy.js +2 -1
  294. package/lib/utils/env-dotenv-format.js +103 -0
  295. package/lib/utils/external-env-template.js +4 -1
  296. package/lib/utils/external-system-display.js +5 -1
  297. package/lib/utils/external-system-readiness-compact-blocks.js +221 -0
  298. package/lib/utils/external-system-readiness-compact-display.js +324 -0
  299. package/lib/utils/external-system-readiness-core.js +16 -0
  300. package/lib/utils/external-system-readiness-deploy-display.js +29 -11
  301. package/lib/utils/external-system-readiness-display-internals.js +3 -1
  302. package/lib/utils/external-system-readiness-display.js +20 -30
  303. package/lib/utils/external-system-system-test-tty-certification.js +135 -0
  304. package/lib/utils/external-system-system-test-tty.js +5 -41
  305. package/lib/utils/help-builder.js +6 -1
  306. package/lib/utils/host-ops-job-labels.js +236 -0
  307. package/lib/utils/host-ops-job-result.js +61 -0
  308. package/lib/utils/host-ops-poll-ui.js +163 -0
  309. package/lib/utils/integration-path-resolve.js +112 -0
  310. package/lib/utils/paths-reload-source.js +148 -0
  311. package/lib/utils/paths-system-builder-keys.js +25 -0
  312. package/lib/utils/paths.js +151 -26
  313. package/lib/utils/runtime-configuration-values.js +64 -2
  314. package/lib/utils/secrets-helpers.js +5 -1
  315. package/lib/utils/ssh-known-hosts.js +130 -0
  316. package/lib/utils/test-target-cli-options.js +75 -0
  317. package/lib/utils/upload-sync-options.js +4 -0
  318. package/lib/utils/validation-run-request.js +11 -2
  319. package/lib/validation/external-manifest-validator.js +11 -1
  320. package/lib/validation/openapi-contract-surface-validator.js +426 -0
  321. package/lib/validation/openapi-contract-vendor-validation.js +238 -0
  322. package/lib/validation/validate-external-file.js +160 -0
  323. package/lib/validation/validate.js +6 -117
  324. package/package.json +46 -29
  325. package/packages/builder-api/README.md +120 -0
  326. package/packages/builder-api/package.json +30 -0
  327. package/packages/builder-api/src/app.module.ts +7 -0
  328. package/packages/builder-api/src/auth/auth.module.ts +5 -0
  329. package/packages/builder-api/src/external-system/external-system.module.ts +5 -0
  330. package/packages/builder-api/src/main.ts +16 -0
  331. package/packages/builder-api/tsconfig.json +15 -0
  332. package/scripts/check-builder-api-architecture-grep.js +79 -0
  333. package/scripts/docker_image_content_gate.js +47 -0
  334. package/scripts/docker_image_content_gate.sh +5 -0
  335. package/scripts/export-builder-api-evidence.js +262 -0
  336. package/scripts/lib/builder-api-docker-staging-copy.js +60 -0
  337. package/scripts/lib/builder-api-docker-staging-core.js +183 -0
  338. package/scripts/lib/docker-image-content-gate-core.js +166 -0
  339. package/scripts/lib/plan-actor.js +109 -0
  340. package/scripts/lib/plan-config.js +20 -0
  341. package/scripts/lib/plan-gates.js +154 -0
  342. package/scripts/lib/plan-meta.js +104 -0
  343. package/scripts/lib/plan-parse.js +162 -0
  344. package/scripts/lib/plan-prevalidate-gates.js +326 -0
  345. package/scripts/lib/plan-run-core.js +125 -0
  346. package/scripts/lib/plan-run-report.js +108 -0
  347. package/scripts/plan-approve.js +24 -0
  348. package/scripts/plan-archive.js +49 -0
  349. package/scripts/plan-run.js +13 -0
  350. package/scripts/plan-set-actor.js +21 -0
  351. package/scripts/plan-validate.js +80 -0
  352. package/scripts/pnpm/af.mjs +110 -0
  353. package/scripts/pnpm/check-quiet.mjs +32 -0
  354. package/scripts/pnpm/dev-install.mjs +29 -0
  355. package/scripts/pnpm/dev-reload.mjs +18 -0
  356. package/scripts/pnpm/help.mjs +55 -0
  357. package/scripts/pnpm/lib/dev-reload-core.mjs +189 -0
  358. package/scripts/pnpm/lib/dev-reload-log-capture.mjs +67 -0
  359. package/scripts/pnpm/lib/dev-reload-log-utils.mjs +32 -0
  360. package/scripts/pnpm/lib/resolve-aifabrix-bin.mjs +124 -0
  361. package/scripts/pnpm/lib/resolve-app-url.mjs +183 -0
  362. package/scripts/pnpm/lib/spinner.mjs +42 -0
  363. package/scripts/stage_builder_api_for_docker.js +65 -0
  364. package/scripts/sync-builder-api-template.js +44 -0
  365. package/templates/README.md +3 -0
  366. package/templates/applications/builder-api/Dockerfile +38 -0
  367. package/templates/applications/builder-api/application.yaml +75 -0
  368. package/templates/applications/builder-api/env.template +48 -0
  369. package/templates/applications/dataplane/application.yaml +1 -1
  370. package/templates/applications/dataplane/env.template +10 -6
  371. package/templates/applications/dataplane/rbac.yaml +21 -1
  372. package/templates/applications/miso-controller/application.yaml +1 -1
  373. package/templates/applications/miso-controller/env.template +1 -3
  374. package/templates/channels/README.md +18 -0
  375. package/templates/channels/ai-fabrix-icon.jpg +0 -0
  376. package/templates/channels/chatgpt/install.template.md.hbs +21 -24
  377. package/templates/channels/chatgpt/integration/README.md +11 -0
  378. package/templates/channels/chatgpt/integration/application.json +15 -0
  379. package/templates/channels/chatgpt/integration/chatgpt-system.json +29 -0
  380. package/templates/channels/chatgpt/integration/env.template +4 -0
  381. package/templates/channels/microsoft-copilot/install.template.md.hbs +20 -25
  382. package/templates/channels/microsoft-copilot/integration/README.md +11 -0
  383. package/templates/channels/microsoft-copilot/integration/application.json +15 -0
  384. package/templates/channels/microsoft-copilot/integration/env.template +6 -0
  385. package/templates/channels/microsoft-copilot/integration/microsoft-copilot-system.json +34 -0
  386. package/templates/channels/slack/install.template.md.hbs +48 -18
  387. package/templates/channels/slack/integration/README.md +38 -0
  388. package/templates/channels/slack/integration/application.json +18 -0
  389. package/templates/channels/slack/integration/env.template +29 -0
  390. package/templates/channels/slack/integration/slack-datasource-conversations.json +226 -0
  391. package/templates/channels/slack/integration/slack-datasource-messages.json +269 -0
  392. package/templates/channels/slack/integration/slack-system.json +86 -0
  393. package/templates/channels/slack/manifest.template.json.hbs +20 -10
  394. package/templates/channels/teams-bot/install.template.md.hbs +31 -17
  395. package/templates/channels/teams-bot/integration/README.md +18 -0
  396. package/templates/channels/teams-bot/integration/application.json +17 -0
  397. package/templates/channels/teams-bot/integration/env.template +5 -0
  398. package/templates/channels/teams-bot/integration/teams-bot-system.json +55 -0
  399. package/templates/channels/teams-bot/manifest.template.json.hbs +27 -0
  400. package/templates/channels/web-embed/install.template.md.hbs +16 -26
  401. package/templates/channels/web-embed/integration/README.md +11 -0
  402. package/templates/channels/web-embed/integration/application.json +15 -0
  403. package/templates/channels/web-embed/integration/env.template +4 -0
  404. package/templates/channels/web-embed/integration/web-embed-system.json +29 -0
  405. package/templates/openapi/redoc_page.html +86 -0
  406. package/templates/python/docker-compose.hbs +11 -0
  407. package/templates/python/requirements.txt +1 -1
  408. package/templates/typescript/docker-compose.hbs +11 -0
  409. package/lib/certification/cli-cert-sync-skip.js +0 -21
@@ -28,6 +28,7 @@
28
28
  * @property {ResourceTypeCategory} [category] - Catalog category
29
29
  * @property {ResourceTypeRiskLevel} [defaultRiskLevel] - Default risk level
30
30
  * @property {ResourceTypeStatus} [status] - Lifecycle status
31
+ * @property {string} domain - Enterprise domain (static dimension catalog)
31
32
  */
32
33
 
33
34
  /**
@@ -40,6 +41,7 @@
40
41
  * @property {ResourceTypeCategory} category - Category
41
42
  * @property {ResourceTypeRiskLevel} defaultRiskLevel - Default risk
42
43
  * @property {ResourceTypeStatus} status - Status
44
+ * @property {string} domain - Enterprise domain
43
45
  */
44
46
 
45
47
  module.exports = {};
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Distinguish controller pipeline applications from connected-system (external) registry rows.
3
+ *
4
+ * @fileoverview Filter helpers for aifabrix app list vs connected systems list
5
+ * @author AI Fabrix Team
6
+ * @version 2.0.0
7
+ */
8
+
9
+ /**
10
+ * @param {Object} app - Controller application row
11
+ * @returns {boolean} True when the row represents a connected system, not a runnable app
12
+ */
13
+ function isControllerExternalApplication(app) {
14
+ if (!app || typeof app !== 'object') return false;
15
+ const cfg = app.configuration && typeof app.configuration === 'object' ? app.configuration : {};
16
+ const appType = app.type ?? cfg.type;
17
+ return String(appType || '').toLowerCase() === 'external';
18
+ }
19
+
20
+ /**
21
+ * @param {Array<Object>} applications - Controller application rows
22
+ * @returns {{ applications: Array<Object>, excludedCount: number }}
23
+ */
24
+ function filterControllerApplications(applications) {
25
+ const list = Array.isArray(applications) ? applications : [];
26
+ const excludedCount = list.filter(isControllerExternalApplication).length;
27
+ return {
28
+ applications: list.filter((app) => !isControllerExternalApplication(app)),
29
+ excludedCount
30
+ };
31
+ }
32
+
33
+ module.exports = {
34
+ isControllerExternalApplication,
35
+ filterControllerApplications
36
+ };
package/lib/app/deploy.js CHANGED
@@ -255,7 +255,7 @@ function displayDeploymentResults(result) {
255
255
  * @returns {Promise<Object|null>} Deployment result if external, null otherwise
256
256
  */
257
257
  async function handleExternalDeployment(appName, options) {
258
- const { isExternal } = await detectAppType(appName);
258
+ const { isExternal } = await detectAppType(appName, options);
259
259
  if (isExternal) {
260
260
  const externalDeploy = require('../external-system/deploy');
261
261
  await externalDeploy.deployExternalSystem(appName, options);
@@ -0,0 +1,130 @@
1
+ /**
2
+ * List connected systems published on the dataplane.
3
+ *
4
+ * @fileoverview aifabrix list command — dataplane GET /api/v1/external/systems
5
+ * @author AI Fabrix Team
6
+ * @version 2.0.0
7
+ */
8
+
9
+ const chalk = require('chalk');
10
+ const { formatBlockingError } = require('../utils/cli-test-layout-chalk');
11
+ const { getConfig, resolveEnvironment } = require('../core/config');
12
+ const { resolveControllerUrl } = require('../utils/controller-url');
13
+ const { resolveDataplaneUrl } = require('../utils/dataplane-resolver');
14
+ const { listExternalSystems } = require('../api/external-systems.api');
15
+ const { formatApiError } = require('../utils/api-error-handler');
16
+ const { getListAuthToken } = require('./list');
17
+ const logger = require('../utils/logger');
18
+
19
+ /**
20
+ * Normalize list response shapes from the dataplane API client.
21
+ * @param {Object} response - API client response
22
+ * @returns {Array<Object>}
23
+ */
24
+ function extractExternalSystems(response) {
25
+ const apiResponse = response?.data;
26
+ if (Array.isArray(apiResponse)) return apiResponse;
27
+ if (apiResponse && Array.isArray(apiResponse.items)) return apiResponse.items;
28
+ if (apiResponse && Array.isArray(apiResponse.data)) return apiResponse.data;
29
+ if (apiResponse && apiResponse.data && Array.isArray(apiResponse.data.items)) {
30
+ return apiResponse.data.items;
31
+ }
32
+ return [];
33
+ }
34
+
35
+ /**
36
+ * @param {Array<Object>} systems
37
+ * @param {string} environment
38
+ * @param {string} dataplaneUrl
39
+ * @param {boolean} json
40
+ */
41
+ function displayExternalSystems(systems, environment, dataplaneUrl, json) {
42
+ if (json) {
43
+ logger.log(JSON.stringify({ environment, dataplaneUrl, systems }, null, 2));
44
+ return;
45
+ }
46
+
47
+ const environmentName = environment || 'miso';
48
+ const header = `Connected systems in ${environmentName} (${dataplaneUrl})`;
49
+ if (systems.length === 0) {
50
+ logger.log(chalk.bold(`\n🔗 ${header}:\n`));
51
+ logger.log(chalk.gray(' No connected systems found on the dataplane.\n'));
52
+ return;
53
+ }
54
+
55
+ logger.log(chalk.bold(`\n🔗 ${header}:\n`));
56
+ systems.forEach((system) => {
57
+ const key = system.key || system.systemKey || system.id || '—';
58
+ const displayName = system.displayName || key;
59
+ const status = system.status || 'unknown';
60
+ logger.log(`✔ ${chalk.cyan(key)} - ${displayName} (${status})`);
61
+ });
62
+ logger.log(chalk.gray(' To show details: aifabrix show <systemKey> --online\n'));
63
+ }
64
+
65
+ /**
66
+ * @param {Object} [options]
67
+ * @returns {Promise<{ environment: string, authConfig: Object, dataplaneUrl: string }|null>}
68
+ */
69
+ async function resolveDataplaneListContext(options = {}) {
70
+ const controllerUrl = options.controller || (await resolveControllerUrl());
71
+ if (!controllerUrl) {
72
+ logger.error(formatBlockingError('Controller URL is required. Run "aifabrix login".'));
73
+ process.exit(1);
74
+ return null;
75
+ }
76
+
77
+ const environment = options.environment || (await resolveEnvironment());
78
+ const config = await getConfig();
79
+ const { token, actualControllerUrl } = await getListAuthToken(controllerUrl, config);
80
+ if (!token || !actualControllerUrl) {
81
+ return null;
82
+ }
83
+
84
+ const authConfig = { type: 'bearer', token };
85
+ try {
86
+ const dataplaneUrl = await resolveDataplaneUrl(actualControllerUrl, environment, authConfig);
87
+ return { environment, authConfig, dataplaneUrl };
88
+ } catch (error) {
89
+ logger.error(formatBlockingError(`Failed to resolve dataplane URL: ${error.message}`));
90
+ process.exit(1);
91
+ return null;
92
+ }
93
+ }
94
+
95
+ /**
96
+ * List connected systems on the dataplane for the current environment.
97
+ * @async
98
+ * @param {Object} [options]
99
+ * @param {string} [options.controller]
100
+ * @param {string} [options.environment]
101
+ * @param {boolean} [options.json]
102
+ */
103
+ async function listExternalSystemsOnDataplane(options = {}) {
104
+ const ctx = await resolveDataplaneListContext(options);
105
+ if (!ctx) {
106
+ return;
107
+ }
108
+
109
+ try {
110
+ const response = await listExternalSystems(ctx.dataplaneUrl, ctx.authConfig, { pageSize: 100 });
111
+ if (!response.success) {
112
+ const formatted = response.formattedError || formatApiError(response, ctx.dataplaneUrl);
113
+ logger.error(formatted);
114
+ process.exit(1);
115
+ return;
116
+ }
117
+ const systems = extractExternalSystems(response);
118
+ displayExternalSystems(systems, ctx.environment, ctx.dataplaneUrl, Boolean(options.json));
119
+ } catch (error) {
120
+ logger.error(formatBlockingError(`Failed to list connected systems from dataplane: ${ctx.dataplaneUrl}`));
121
+ logger.error(chalk.gray(`Error: ${error.message}`));
122
+ process.exit(1);
123
+ }
124
+ }
125
+
126
+ module.exports = {
127
+ listExternalSystemsOnDataplane,
128
+ extractExternalSystems,
129
+ displayExternalSystems
130
+ };
package/lib/app/list.js CHANGED
@@ -16,6 +16,7 @@ const { listEnvironmentApplications } = require('../api/environments.api');
16
16
  const { formatApiError } = require('../utils/api-error-handler');
17
17
  const { formatAuthenticationError } = require('../utils/error-formatters/http-status-errors');
18
18
  const logger = require('../utils/logger');
19
+ const { filterControllerApplications } = require('./controller-application-filter');
19
20
 
20
21
  /**
21
22
  * Extract wrapped array format: { success: true, data: { success: true, data: [...] } }
@@ -153,24 +154,30 @@ function formatUrlAndPort(app) {
153
154
  * @param {string} environment - Environment name or key
154
155
  * @param {string} controllerUrl - Controller URL
155
156
  */
156
- function displayApplications(applications, environment, controllerUrl) {
157
+ function displayApplications(applications, environment, controllerUrl, excludedCount = 0) {
157
158
  const environmentName = environment || 'miso';
158
159
  const header = `Applications in ${environmentName} environment (${controllerUrl})`;
159
160
 
160
161
  if (applications.length === 0) {
161
162
  logger.log(chalk.bold(`\n📱 ${header}:\n`));
163
+ if (excludedCount > 0) {
164
+ logger.log(chalk.gray(` No controller applications found (${excludedCount} connected system(s) hidden).`));
165
+ logger.log(chalk.gray(' List connected systems: aifabrix list\n'));
166
+ return;
167
+ }
162
168
  logger.log(chalk.gray(' No applications found in this environment.\n'));
163
169
  return;
164
170
  }
165
171
 
166
172
  logger.log(chalk.bold(`\n📱 ${header}:\n`));
167
173
  applications.forEach((app) => {
168
- const isExternal = app.configuration?.type === 'external';
169
- const externalIcon = isExternal ? '🔗 ' : '';
170
174
  const hasPipeline = app.configuration?.pipeline?.isActive ? '✔' : '✖';
171
175
  const urlAndPort = formatUrlAndPort(app);
172
- logger.log(`${externalIcon}${hasPipeline} ${chalk.cyan(app.key)} - ${app.displayName} (${app.status || 'unknown'})${urlAndPort}`);
176
+ logger.log(`${hasPipeline} ${chalk.cyan(app.key)} - ${app.displayName} (${app.status || 'unknown'})${urlAndPort}`);
173
177
  });
178
+ if (excludedCount > 0) {
179
+ logger.log(chalk.gray(` (${excludedCount} connected system(s) omitted — use: aifabrix list)`));
180
+ }
174
181
  logger.log(chalk.gray(' To show details for an app: aifabrix app show <app>\n'));
175
182
  }
176
183
 
@@ -295,6 +302,13 @@ function handleListResponse(response, actualControllerUrl) {
295
302
  * @param {Object} [_options] - Command options (reserved)
296
303
  * @throws {Error} If listing fails
297
304
  */
305
+ async function fetchAndDisplayApplications(actualControllerUrl, environment, authConfig) {
306
+ const response = await listEnvironmentApplications(actualControllerUrl, environment, authConfig);
307
+ const applications = handleListResponse(response, actualControllerUrl);
308
+ const { applications: controllerApps, excludedCount } = filterControllerApplications(applications);
309
+ displayApplications(controllerApps, environment, actualControllerUrl, excludedCount);
310
+ }
311
+
298
312
  async function listApplications(options = {}) {
299
313
  const { resolveControllerUrl } = require('../utils/controller-url');
300
314
  const { resolveEnvironment } = require('../core/config');
@@ -318,9 +332,7 @@ async function listApplications(options = {}) {
318
332
  // Use centralized API client
319
333
  const authConfig = { type: 'bearer', token: token };
320
334
  try {
321
- const response = await listEnvironmentApplications(actualControllerUrl, environment, authConfig);
322
- const applications = handleListResponse(response, actualControllerUrl);
323
- displayApplications(applications, environment, actualControllerUrl);
335
+ await fetchAndDisplayApplications(actualControllerUrl, environment, authConfig);
324
336
  } catch (error) {
325
337
  logger.error(formatBlockingError(`Failed to list applications from controller: ${actualControllerUrl}`));
326
338
  logger.error(chalk.gray(`Error: ${error.message}`));
@@ -328,5 +340,5 @@ async function listApplications(options = {}) {
328
340
  }
329
341
  }
330
342
 
331
- module.exports = { listApplications };
343
+ module.exports = { listApplications, getListAuthToken };
332
344
 
package/lib/app/run.js CHANGED
@@ -229,7 +229,9 @@ async function resolveRunOptions(appName, appConfig, options, envKey, debug, eff
229
229
  effectiveEnvironmentScopedResources: Boolean(effectiveEnvironmentScopedResources)
230
230
  };
231
231
  const builderPath = pathsUtil.getBuilderPath(appName);
232
- const codePath = pathsUtil.resolveBuildContext(builderPath, appConfig.build?.context || '.');
232
+ const buildContext = appConfig.build?.context || '.';
233
+ const { resolveSystemAppReloadSourceRoot } = require('../utils/paths-reload-source');
234
+ const codePath = resolveSystemAppReloadSourceRoot(appName, builderPath, buildContext);
233
235
  if (options.reload && envKey === 'dev') {
234
236
  const remoteSyncPath = appConfig.build?.remoteSyncPath;
235
237
  const reloadSummary = await ensureReloadSync(appName, appConfig.developerId, debug, codePath, remoteSyncPath);
@@ -14,9 +14,14 @@ const logger = require('../utils/logger');
14
14
 
15
15
  function logSourceAndHeader(summary) {
16
16
  const isOffline = summary.source === 'offline';
17
- const sourceLabel = isOffline
18
- ? `🔴 Source: offline (${summary.path || '—'})`
19
- : `🟢 Source: online (${summary.controllerUrl || '—'})`;
17
+ let sourceLabel;
18
+ if (isOffline) {
19
+ sourceLabel = `🔴 Source: offline (${summary.path || '—'})`;
20
+ } else if (summary.externalOnly && summary.dataplaneUrl) {
21
+ sourceLabel = `🟢 Source: online (dataplane ${summary.dataplaneUrl})`;
22
+ } else {
23
+ sourceLabel = `🟢 Source: online (${summary.controllerUrl || '—'})`;
24
+ }
20
25
  logger.log(sourceLabel);
21
26
  logger.log('');
22
27
  }
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Online show resolution: controller applications vs dataplane connected systems.
3
+ *
4
+ * @fileoverview aifabrix show --online and app show routing
5
+ * @author AI Fabrix Team
6
+ * @version 2.0.0
7
+ */
8
+
9
+ const logger = require('../utils/logger');
10
+ const { getConfig } = require('../core/config');
11
+ const { resolveControllerUrl } = require('../utils/controller-url');
12
+ const { resolveEnvironment } = require('../core/config');
13
+ const { getApplication } = require('../api/applications.api');
14
+ const { resolveDataplaneUrl } = require('../utils/dataplane-resolver');
15
+ const { formatApiError } = require('../utils/api-error-handler');
16
+ const { isControllerExternalApplication } = require('./controller-application-filter');
17
+ const {
18
+ getShowAuthToken,
19
+ buildOnlineSummary,
20
+ fetchExternalSystemFromDataplane,
21
+ enrichExternalShowSummary,
22
+ attachRunDefaultsFromUserConfig,
23
+ attachDeclarativeUrlsToShowApplication,
24
+ outputOnlineJson,
25
+ tryGetLocalManifestSourceForJson
26
+ } = require('./show');
27
+
28
+ async function resolveOnlineAuth(controllerUrl) {
29
+ const config = await getConfig();
30
+ const authResult = await getShowAuthToken(controllerUrl, config);
31
+ return { authConfig: { type: 'bearer', token: authResult.token }, authResult };
32
+ }
33
+
34
+ function ensureControllerApplicationResponse(response, appKey, authResult, appsOnly) {
35
+ if (response.success) {
36
+ const app = response.data?.data || response.data || response;
37
+ if (appsOnly && isControllerExternalApplication(app)) {
38
+ throw new Error(
39
+ `"${appKey}" is a connected system, not a controller application. Use: aifabrix show ${appKey} --online`
40
+ );
41
+ }
42
+ return response.data || response;
43
+ }
44
+ if (response.status === 404) {
45
+ if (appsOnly) {
46
+ throw new Error(`Application "${appKey}" not found on controller.`);
47
+ }
48
+ return null;
49
+ }
50
+ const formatted = response.formattedError || formatApiError(response, authResult.actualControllerUrl);
51
+ logger.error(formatted);
52
+ throw new Error('Failed to get application from controller.');
53
+ }
54
+
55
+ function buildOnlineSummaryFromDataplane(appKey, controllerUrl, dataplaneUrl, externalSystem) {
56
+ const es = externalSystem && !externalSystem.error ? externalSystem : null;
57
+ const application = {
58
+ key: appKey,
59
+ displayName: es?.displayName || appKey,
60
+ description: es?.application?.description || '—',
61
+ type: 'external',
62
+ status: es?.status || es?.dataplaneStatus || '—',
63
+ version: es?.version || '—',
64
+ deploymentKey: '—',
65
+ image: '—',
66
+ registryMode: '—',
67
+ port: '—',
68
+ healthCheck: '—',
69
+ build: '—',
70
+ roles: es?.application?.roles,
71
+ permissions: es?.application?.permissions
72
+ };
73
+ return {
74
+ source: 'online',
75
+ controllerUrl,
76
+ dataplaneUrl,
77
+ appKey,
78
+ application,
79
+ roles: es?.application?.roles || [],
80
+ permissions: es?.application?.permissions || [],
81
+ authentication: null,
82
+ portalInputConfigurations: [],
83
+ databases: [],
84
+ isExternal: true,
85
+ externalOnly: true,
86
+ externalSystem: es || externalSystem
87
+ };
88
+ }
89
+
90
+ async function finishOnlineShow(summary, appKey, json, permissionsOnly, verifyCert, authBundle) {
91
+ await enrichExternalShowSummary(summary, appKey, verifyCert, authBundle);
92
+ attachRunDefaultsFromUserConfig(summary, appKey, await getConfig());
93
+ await attachDeclarativeUrlsToShowApplication(summary, appKey);
94
+ if (json) {
95
+ const manifestSource = await tryGetLocalManifestSourceForJson(appKey);
96
+ outputOnlineJson(summary, permissionsOnly, manifestSource);
97
+ return;
98
+ }
99
+ const { display: displayShow } = require('./show-display');
100
+ displayShow(summary, { permissionsOnly: !!permissionsOnly });
101
+ }
102
+
103
+ async function runOnlineFromDataplane(appKey, json, permissionsOnly, verifyCert, authConfig, authResult) {
104
+ const environment = await resolveEnvironment();
105
+ const dataplaneUrl = await resolveDataplaneUrl(authResult.actualControllerUrl, environment, authConfig);
106
+ const externalSystem = await fetchExternalSystemFromDataplane(dataplaneUrl, appKey, authConfig);
107
+ if (!externalSystem || externalSystem.error) {
108
+ throw new Error(
109
+ `"${appKey}" was not found as a controller application or connected system on the dataplane.`
110
+ );
111
+ }
112
+ const summary = buildOnlineSummaryFromDataplane(
113
+ appKey,
114
+ authResult.actualControllerUrl,
115
+ dataplaneUrl,
116
+ externalSystem
117
+ );
118
+ await finishOnlineShow(summary, appKey, json, permissionsOnly, verifyCert, {
119
+ token: authConfig.token,
120
+ controllerUrl: authResult.actualControllerUrl
121
+ });
122
+ }
123
+
124
+ /**
125
+ * @param {string} appKey
126
+ * @param {Object} appData
127
+ * @param {Object} authConfig
128
+ * @param {Object} authResult
129
+ * @returns {Promise<Object|null>}
130
+ */
131
+ async function loadExternalSystemForOnlineShow(appKey, appData, authConfig, authResult) {
132
+ const cfg = appData.configuration && typeof appData.configuration === 'object' ? appData.configuration : {};
133
+ const isExternalApp = appData.type === 'external' || cfg.type === 'external';
134
+ if (!isExternalApp) {
135
+ return null;
136
+ }
137
+ const environment = await resolveEnvironment();
138
+ const dataplaneUrl = await resolveDataplaneUrl(authResult.actualControllerUrl, environment, authConfig);
139
+ return fetchExternalSystemFromDataplane(dataplaneUrl, appKey, authConfig);
140
+ }
141
+
142
+ /**
143
+ * @param {string} appKey
144
+ * @param {{ json?: boolean, permissionsOnly?: boolean, verifyCert?: boolean, appsOnly?: boolean }} options
145
+ */
146
+ async function runOnlineShow(appKey, options = {}) {
147
+ const controllerUrl = await resolveControllerUrl();
148
+ if (!controllerUrl) {
149
+ throw new Error('Controller URL is required for --online. Run aifabrix login to set the controller URL in config.yaml.');
150
+ }
151
+
152
+ const json = Boolean(options.json);
153
+ const permissionsOnly = Boolean(options.permissionsOnly);
154
+ const verifyCert = Boolean(options.verifyCert);
155
+ const appsOnly = Boolean(options.appsOnly);
156
+
157
+ const { authConfig, authResult } = await resolveOnlineAuth(controllerUrl);
158
+ const response = await getApplication(controllerUrl, appKey, authConfig);
159
+ const apiApp = ensureControllerApplicationResponse(response, appKey, authResult, appsOnly);
160
+ if (!apiApp) {
161
+ await runOnlineFromDataplane(appKey, json, permissionsOnly, verifyCert, authConfig, authResult);
162
+ return;
163
+ }
164
+
165
+ const appData = apiApp.data || apiApp;
166
+ const externalSystem = await loadExternalSystemForOnlineShow(appKey, appData, authConfig, authResult);
167
+ const summary = buildOnlineSummary(apiApp, authResult.actualControllerUrl, externalSystem);
168
+ await finishOnlineShow(summary, appKey, json, permissionsOnly, verifyCert, {
169
+ token: authConfig.token,
170
+ controllerUrl: authResult.actualControllerUrl
171
+ });
172
+ }
173
+
174
+ module.exports = {
175
+ runOnlineShow,
176
+ buildOnlineSummaryFromDataplane,
177
+ ensureControllerApplicationResponse
178
+ };
package/lib/app/show.js CHANGED
@@ -20,16 +20,12 @@ const generator = require('../generator');
20
20
  const { getConfig, normalizeControllerUrl } = require('../core/config');
21
21
  const { getOrRefreshDeviceToken } = require('../utils/token-manager');
22
22
  const { resolveControllerUrl } = require('../utils/controller-url');
23
- const { resolveEnvironment } = require('../core/config');
24
- const { getApplication } = require('../api/applications.api');
25
23
  const {
26
24
  getExternalSystem,
27
25
  getExternalSystemConfig,
28
26
  listOpenAPIFiles,
29
27
  listOpenAPIEndpoints
30
28
  } = require('../api/external-systems.api');
31
- const { resolveDataplaneUrl } = require('../utils/dataplane-resolver');
32
- const { formatApiError } = require('../utils/api-error-handler');
33
29
  const { formatAuthenticationError } = require('../utils/error-formatters/http-status-errors');
34
30
  const { display: displayShow } = require('./show-display');
35
31
  const {
@@ -790,31 +786,27 @@ async function runOffline(appKey, json, permissionsOnly, verifyCert = false) {
790
786
  displayShow(summary, { permissionsOnly: !!permissionsOnly });
791
787
  }
792
788
 
793
- async function resolveOnlineAuth(controllerUrl) {
794
- const config = await getConfig();
795
- const authResult = await getShowAuthToken(controllerUrl, config);
796
- return { authConfig: { type: 'bearer', token: authResult.token }, authResult };
797
- }
798
-
799
- function ensureApplicationResponse(response, appKey, authResult) {
800
- if (!response.success) {
801
- if (response.status === 404) {
802
- throw new Error(`Application "${appKey}" not found on controller.`);
803
- }
804
- const formatted = response.formattedError || formatApiError(response, authResult.actualControllerUrl);
805
- logger.error(formatted);
806
- throw new Error('Failed to get application from controller.');
789
+ async function showApp(appKey, options = {}) {
790
+ if (!appKey || typeof appKey !== 'string') {
791
+ throw new Error('appKey is required');
807
792
  }
808
- return response.data || response;
809
- }
810
793
 
811
- async function fetchExternalSystemForOnline(controllerUrl, appKey, authConfig) {
812
- try {
813
- const environment = await resolveEnvironment();
814
- const dataplaneUrl = await resolveDataplaneUrl(controllerUrl, environment, authConfig);
815
- return await fetchExternalSystemFromDataplane(dataplaneUrl, appKey, authConfig);
816
- } catch (err) {
817
- return { error: err.message || 'dataplane unreachable or not found' };
794
+ const online = Boolean(options.online);
795
+ const json = Boolean(options.json);
796
+ const permissions = Boolean(options.permissions);
797
+ const verifyCert = Boolean(options.verifyCert);
798
+ const appsOnly = Boolean(options.appsOnly);
799
+
800
+ if (online) {
801
+ const { runOnlineShow } = require('./show-online');
802
+ await runOnlineShow(appKey, {
803
+ json,
804
+ permissionsOnly: permissions,
805
+ verifyCert,
806
+ appsOnly
807
+ });
808
+ } else {
809
+ await runOffline(appKey, json, permissions, verifyCert);
818
810
  }
819
811
  }
820
812
 
@@ -861,6 +853,12 @@ function outputOnlineJson(summary, permissionsOnly, manifestSource) {
861
853
  if (summary.localRunProfile) {
862
854
  out.localRunProfile = summary.localRunProfile;
863
855
  }
856
+ if (summary.dataplaneUrl) {
857
+ out.dataplaneUrl = summary.dataplaneUrl;
858
+ }
859
+ if (summary.externalOnly) {
860
+ out.externalOnly = true;
861
+ }
864
862
  if (summary.externalSystem !== undefined && summary.externalSystem !== null) {
865
863
  out.externalSystem = summary.externalSystem && summary.externalSystem.error
866
864
  ? { error: summary.externalSystem.error }
@@ -872,67 +870,11 @@ function outputOnlineJson(summary, permissionsOnly, manifestSource) {
872
870
 
873
871
  /**
874
872
  * Run show in online mode: getApplication, optionally dataplane for external, display or JSON.
875
- * @param {string} appKey - Application key
876
- * @param {boolean} json - Output as JSON
877
- * @param {boolean} [permissionsOnly] - When true, output only permissions
878
- * @param {boolean} [verifyCert] - When true, attempt dataplane verify for external apps
879
- * @throws {Error} On auth failure, 404, or API error
873
+ * @deprecated Use ./show-online runOnlineShow
880
874
  */
881
- async function runOnline(appKey, json, permissionsOnly, verifyCert = false) {
882
- const controllerUrl = await resolveControllerUrl();
883
- if (!controllerUrl) {
884
- throw new Error('Controller URL is required for --online. Run aifabrix login to set the controller URL in config.yaml.');
885
- }
886
- const { authConfig, authResult } = await resolveOnlineAuth(controllerUrl);
887
- const response = await getApplication(controllerUrl, appKey, authConfig);
888
- const apiApp = ensureApplicationResponse(response, appKey, authResult);
889
- const appData = apiApp.data || apiApp;
890
- const cfg = appData.configuration && typeof appData.configuration === 'object' ? appData.configuration : {};
891
- const isExternalApp = appData.type === 'external' || cfg.type === 'external';
892
- const externalSystem = isExternalApp
893
- ? await fetchExternalSystemForOnline(controllerUrl, appKey, authConfig)
894
- : null;
895
- const summary = buildOnlineSummary(apiApp, authResult.actualControllerUrl, externalSystem);
896
- await enrichExternalShowSummary(summary, appKey, verifyCert, {
897
- token: authConfig.token,
898
- controllerUrl: authResult.actualControllerUrl
899
- });
900
- attachRunDefaultsFromUserConfig(summary, appKey, await getConfig());
901
- await attachDeclarativeUrlsToShowApplication(summary, appKey);
902
- if (json) {
903
- const manifestSource = await tryGetLocalManifestSourceForJson(appKey);
904
- outputOnlineJson(summary, permissionsOnly, manifestSource);
905
- return;
906
- }
907
- displayShow(summary, { permissionsOnly: !!permissionsOnly });
908
- }
909
-
910
- /**
911
- * Show application info (offline by default, or from controller with --online).
912
- * @async
913
- * @param {string} appKey - Application key
914
- * @param {Object} options - Options
915
- * @param {boolean} [options.online] - Fetch from controller
916
- * @param {boolean} [options.json] - Output as JSON
917
- * @param {boolean} [options.permissions] - When true, output only permissions (app show --permissions)
918
- * @param {boolean} [options.verifyCert] - When true, attach dataplane certificate verify rows (external)
919
- * @throws {Error} If file missing/invalid (offline) or API/auth error (online)
920
- */
921
- async function showApp(appKey, options = {}) {
922
- if (!appKey || typeof appKey !== 'string') {
923
- throw new Error('appKey is required');
924
- }
925
-
926
- const online = Boolean(options.online);
927
- const json = Boolean(options.json);
928
- const permissions = Boolean(options.permissions);
929
- const verifyCert = Boolean(options.verifyCert);
930
-
931
- if (online) {
932
- await runOnline(appKey, json, permissions, verifyCert);
933
- } else {
934
- await runOffline(appKey, json, permissions, verifyCert);
935
- }
875
+ async function runOnline(appKey, json, permissionsOnly, verifyCert = false, appsOnly = false) {
876
+ const { runOnlineShow } = require('./show-online');
877
+ await runOnlineShow(appKey, { json, permissionsOnly, verifyCert, appsOnly });
936
878
  }
937
879
 
938
880
  module.exports = {
@@ -944,5 +886,12 @@ module.exports = {
944
886
  buildOnlineSummary,
945
887
  formatHealthCheckForDisplay,
946
888
  formatBuildForDisplay,
947
- getShowAuthToken
889
+ getShowAuthToken,
890
+ fetchExternalSystemFromDataplane,
891
+ enrichExternalShowSummary,
892
+ attachRunDefaultsFromUserConfig,
893
+ attachDeclarativeUrlsToShowApplication,
894
+ outputOnlineJson,
895
+ tryGetLocalManifestSourceForJson,
896
+ runOnline
948
897
  };