@aifabrix/builder 2.49.1 → 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 (413) hide show
  1. package/.cursor/process/README.md +9 -0
  2. package/.cursor/rules/deploy-rules/docker-image-ip-policy.mdc +49 -0
  3. package/.cursor/rules/plan-rules/application-lifecycle.mdc +30 -0
  4. package/.cursor/rules/plan-rules/plan-frontmatter.mdc +35 -0
  5. package/.cursor/rules/plan-rules/plan-lifecycle.mdc +31 -0
  6. package/.cursor/rules/plan-rules/plan-validation-gate.mdc +34 -0
  7. package/.cursor/skills/README.md +1 -0
  8. package/.dockerignore +52 -0
  9. package/.eslintignore +22 -0
  10. package/README.md +2 -0
  11. package/bin/builder-api-cleanup.js +26 -0
  12. package/bin/builder-api-nest.js +10 -0
  13. package/bin/builder-api-spike.js +19 -0
  14. package/enterprise-knowledge/README.md +50 -0
  15. package/enterprise-knowledge/enterprise-integration-lifecycle/README.md +22 -0
  16. package/enterprise-knowledge/enterprise-integration-lifecycle/application.json +15 -0
  17. package/enterprise-knowledge/enterprise-integration-lifecycle/deploy.js +69 -0
  18. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-deploy.json +52 -0
  19. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-system.json +29 -0
  20. package/enterprise-knowledge/enterprise-integration-lifecycle/env.template +2 -0
  21. package/integration/README.md +81 -0
  22. package/integration/github/README.md +53 -0
  23. package/integration/github/application.json +21 -0
  24. package/integration/github/deploy.js +72 -0
  25. package/integration/github/env.template +11 -0
  26. package/integration/github/github-datasource-issue-comments.json +239 -0
  27. package/integration/github/github-datasource-issues.json +399 -0
  28. package/integration/github/github-datasource-repository.json +354 -0
  29. package/integration/github/github-deploy.json +1202 -0
  30. package/integration/github/github-system.json +82 -0
  31. package/integration/hubspot-test/README.md +1 -1
  32. package/jest.isolated-projects.js +31 -1
  33. package/jest.projects.js +87 -1
  34. package/lib/api/dev-server-https.js +1 -1
  35. package/lib/api/dev.api.js +1 -0
  36. package/lib/api/enterprise-knowledge.api.js +63 -0
  37. package/lib/api/evidence.api.js +172 -0
  38. package/lib/api/external-systems.api.js +8 -2
  39. package/lib/api/host-ops.api.js +69 -0
  40. package/lib/api/resource-types.api.js +1 -0
  41. package/lib/api/types/enterprise-knowledge.types.js +46 -0
  42. package/lib/api/types/evidence.types.js +67 -0
  43. package/lib/api/types/resource-types.types.js +2 -0
  44. package/lib/app/controller-application-filter.js +36 -0
  45. package/lib/app/deploy.js +1 -1
  46. package/lib/app/list-external-systems.js +130 -0
  47. package/lib/app/list.js +20 -8
  48. package/lib/app/run.js +3 -1
  49. package/lib/app/show-display.js +8 -3
  50. package/lib/app/show-online.js +178 -0
  51. package/lib/app/show.js +37 -88
  52. package/lib/build/builder-api-docker-staging.js +47 -0
  53. package/lib/build/miso-controller-npm-sdk-guard.js +2 -2
  54. package/lib/build/standard-docker-build.js +2 -0
  55. package/lib/certification/post-unified-cert-sync.js +4 -31
  56. package/lib/certification/sync-after-external-command.js +0 -1
  57. package/lib/certification/sync-system-certification.js +0 -3
  58. package/lib/channels/add-channel.js +40 -34
  59. package/lib/channels/approval-guides/chatgpt.js +33 -0
  60. package/lib/channels/approval-guides/credential-portal.js +38 -0
  61. package/lib/channels/approval-guides/index.js +110 -0
  62. package/lib/channels/approval-guides/microsoft-copilot.js +34 -0
  63. package/lib/channels/approval-guides/slack.js +34 -0
  64. package/lib/channels/approval-guides/teams-bot.js +35 -0
  65. package/lib/channels/approval-guides/web-embed.js +32 -0
  66. package/lib/channels/channel-approval-guide.js +11 -0
  67. package/lib/channels/channel-artifact-generator.js +16 -4
  68. package/lib/channels/channel-audit.js +3 -0
  69. package/lib/channels/channel-auth-context.js +1 -1
  70. package/lib/channels/channel-description.js +59 -0
  71. package/lib/channels/channel-integration-generator.js +13 -230
  72. package/lib/channels/channel-integration-template.js +94 -0
  73. package/lib/channels/channel-runtime-resolver.js +43 -3
  74. package/lib/channels/channel-status-display.js +66 -26
  75. package/lib/channels/channel-targets.js +3 -3
  76. package/lib/cli/index.js +27 -3
  77. package/lib/cli/infra-guided.js +5 -1
  78. package/lib/cli/setup-app-external-create.js +111 -0
  79. package/lib/cli/setup-app.help.js +1 -1
  80. package/lib/cli/setup-app.js +38 -125
  81. package/lib/cli/setup-app.test-commands.js +26 -52
  82. package/lib/cli/setup-certification-commands.js +4 -4
  83. package/lib/cli/setup-certification.help.js +9 -9
  84. package/lib/cli/setup-dev-path-commands.js +24 -0
  85. package/lib/cli/setup-dev.js +115 -16
  86. package/lib/cli/setup-external-system-help.js +4 -6
  87. package/lib/cli/setup-external-system.js +58 -52
  88. package/lib/cli/setup-infra-up-builder-api-action.js +64 -0
  89. package/lib/cli/setup-infra-up-platform-action.js +3 -1
  90. package/lib/cli/setup-infra.js +15 -0
  91. package/lib/cli/setup-list.js +43 -0
  92. package/lib/cli/setup-utility-repair.js +26 -7
  93. package/lib/cli/setup-utility.js +5 -3
  94. package/lib/commands/app.js +15 -43
  95. package/lib/commands/channel-add-setup.js +110 -0
  96. package/lib/commands/channel.js +42 -8
  97. package/lib/commands/datasource-sync-display.js +96 -0
  98. package/lib/commands/datasource-sync-policy.js +210 -0
  99. package/lib/commands/datasource-test-trust-cli.js +6 -6
  100. package/lib/commands/datasource-unified-test-cli.js +2 -1
  101. package/lib/commands/datasource-unified-test-cli.options.js +33 -23
  102. package/lib/commands/deploy-gate-failure-details.js +163 -0
  103. package/lib/commands/deploy-gate-orchestrator.js +322 -0
  104. package/lib/commands/dev-cli-handlers.js +64 -61
  105. package/lib/commands/dev-host-ops-params.js +91 -0
  106. package/lib/commands/dev-host-ops-poll.js +111 -0
  107. package/lib/commands/dev-host-ops.js +252 -0
  108. package/lib/commands/dev-init.js +3 -1
  109. package/lib/commands/enterprise-knowledge.js +284 -0
  110. package/lib/commands/evidence-cli-leaves.js +250 -0
  111. package/lib/commands/evidence.js +51 -0
  112. package/lib/commands/governance-cli-shared.js +2 -2
  113. package/lib/commands/governance-command-action.js +2 -2
  114. package/lib/commands/governance-fixture-subjects.js +85 -0
  115. package/lib/commands/governance.js +1 -1
  116. package/lib/commands/lifecycle-command-action.js +2 -2
  117. package/lib/commands/lifecycle-external.js +3 -3
  118. package/lib/commands/manifest-cli-auth.js +29 -0
  119. package/lib/commands/manifest-cli-commands.js +170 -0
  120. package/lib/commands/manifest-cli-integration-path.js +63 -0
  121. package/lib/commands/manifest.js +21 -0
  122. package/lib/commands/protection-cli-leaves.js +3 -3
  123. package/lib/commands/repair-auth-apply.js +15 -1
  124. package/lib/commands/repair-authentications-454.js +169 -0
  125. package/lib/commands/repair-capability-openapi-warnings.js +126 -0
  126. package/lib/commands/repair-datasource-apply.js +135 -0
  127. package/lib/commands/repair-datasource-auto-rbac.js +62 -1
  128. package/lib/commands/repair-datasource-http-service-contract.js +239 -0
  129. package/lib/commands/repair-datasource-operation-security.js +180 -0
  130. package/lib/commands/repair-datasource-run.js +7 -2
  131. package/lib/commands/repair-datasource-sync-operations.js +177 -0
  132. package/lib/commands/repair-datasource-webhooks-sync-bridge.js +133 -0
  133. package/lib/commands/repair-datasource.js +12 -68
  134. package/lib/commands/repair-env-template.js +11 -1
  135. package/lib/commands/repair-external-run.js +121 -31
  136. package/lib/commands/repair-internal.js +1 -1
  137. package/lib/commands/repair-openapi-export.js +156 -0
  138. package/lib/commands/repair-openapi-sync.js +19 -2
  139. package/lib/commands/repair-orchestration-datasource-split.js +259 -0
  140. package/lib/commands/repair-persist.js +22 -1
  141. package/lib/commands/repair-rbac-platform-preset.js +204 -0
  142. package/lib/commands/repair-rbac-reader-roles.js +191 -0
  143. package/lib/commands/repair-rbac.js +163 -86
  144. package/lib/commands/repair-steps.js +83 -18
  145. package/lib/commands/repair-system-permissions.js +1 -0
  146. package/lib/commands/repair.js +1 -1
  147. package/lib/commands/resource-type.js +65 -26
  148. package/lib/commands/run-post-publish-data-sync.js +68 -0
  149. package/lib/commands/setup-modes.js +1 -1
  150. package/lib/commands/test-e2e-external.js +21 -8
  151. package/lib/commands/test-governance-cli-options.js +2 -2
  152. package/lib/commands/test-trust-cli-options.js +2 -2
  153. package/lib/commands/up-builder-api-bootstrap.js +71 -0
  154. package/lib/commands/up-builder-api-provision.js +241 -0
  155. package/lib/commands/up-builder-api.js +88 -0
  156. package/lib/commands/up-common.js +25 -1
  157. package/lib/commands/upload-credential-push-log.js +117 -0
  158. package/lib/commands/upload-data-sync-finalize.js +60 -0
  159. package/lib/commands/upload-probe.js +66 -0
  160. package/lib/commands/upload-publish-context.js +4 -1
  161. package/lib/commands/upload-sidecar-followups.js +55 -27
  162. package/lib/commands/upload.js +116 -157
  163. package/lib/commands/verify-governance-combined-external.js +1 -1
  164. package/lib/commands/verify-governance-db.js +2 -2
  165. package/lib/commands/verify-operations-command-action.js +2 -2
  166. package/lib/commands/verify-operations-step-plan.js +2 -2
  167. package/lib/commands/verify-operations-steps.js +2 -2
  168. package/lib/commands/verify-trust-command-action.js +1 -1
  169. package/lib/commands/wizard-core.js +1 -1
  170. package/lib/commands/wizard-headless.js +2 -1
  171. package/lib/core/admin-secrets.js +2 -6
  172. package/lib/core/secrets-env-content.js +10 -4
  173. package/lib/core/secrets-env-write.js +2 -13
  174. package/lib/datasource/agent-trust-run.js +3 -3
  175. package/lib/datasource/deploy.js +3 -1
  176. package/lib/datasource/test-e2e.js +6 -1
  177. package/lib/datasource/unified-validation-run-body.js +4 -1
  178. package/lib/datasource/unified-validation-run.js +1 -1
  179. package/lib/deployment/deploy-poll-ui.js +73 -12
  180. package/lib/deployment/deployer-poll-run.js +113 -0
  181. package/lib/deployment/deployer.js +17 -87
  182. package/lib/evidence/dataplane-context.js +21 -0
  183. package/lib/evidence/evidence-display.js +78 -0
  184. package/lib/evidence/evidence-service.js +392 -0
  185. package/lib/external-system/deploy.js +290 -112
  186. package/lib/external-system/download.js +7 -3
  187. package/lib/external-system/test-execution.js +1 -1
  188. package/lib/external-system/test-system-level.js +8 -10
  189. package/lib/external-system/test.js +12 -6
  190. package/lib/generator/deploy-script.js +73 -0
  191. package/lib/generator/external.js +2 -1
  192. package/lib/generator/index.js +17 -2
  193. package/lib/generator/wizard.js +3 -36
  194. package/lib/internal/fs-real-sync.js +22 -1
  195. package/lib/internal/node-fs.js +2 -0
  196. package/lib/lifecycle/lifecycle-governance-options.js +1 -1
  197. package/lib/lifecycle/verify-step-progress.js +1 -1
  198. package/lib/programmatic/access-log.js +26 -0
  199. package/lib/programmatic/auth-config.js +44 -0
  200. package/lib/programmatic/bearer-auth.js +176 -0
  201. package/lib/programmatic/builder-api-request.js +175 -0
  202. package/lib/programmatic/builder-api-route-dispatch.js +82 -0
  203. package/lib/programmatic/builder-api-runtime-config.js +42 -0
  204. package/lib/programmatic/builder-api-server.js +230 -0
  205. package/lib/programmatic/builder-help-authentication-catalog.js +282 -0
  206. package/lib/programmatic/builder-help-connected-system-ui.js +266 -0
  207. package/lib/programmatic/builder-help-enterprise-sync-fabrix.js +60 -0
  208. package/lib/programmatic/builder-help-envelope.js +36 -0
  209. package/lib/programmatic/builder-help-fixtures.js +200 -0
  210. package/lib/programmatic/builder-help-governance.js +172 -0
  211. package/lib/programmatic/builder-help-schema-catalog.js +92 -0
  212. package/lib/programmatic/builder-help.js +361 -0
  213. package/lib/programmatic/capability-registry.js +77 -0
  214. package/lib/programmatic/command-options.js +32 -0
  215. package/lib/programmatic/enterprise-mcp-client.js +98 -0
  216. package/lib/programmatic/http-problem-details.js +99 -0
  217. package/lib/programmatic/http-route-match.js +40 -0
  218. package/lib/programmatic/idempotency-cache.js +69 -0
  219. package/lib/programmatic/index.js +53 -0
  220. package/lib/programmatic/integration-path-scope.js +39 -0
  221. package/lib/programmatic/log-redaction.js +66 -0
  222. package/lib/programmatic/manifest-get-section.js +146 -0
  223. package/lib/programmatic/manifest-patch-section.js +252 -0
  224. package/lib/programmatic/manifest-repair.js +122 -0
  225. package/lib/programmatic/manifest-section-dependency-graph.js +160 -0
  226. package/lib/programmatic/manifest-section-io.js +225 -0
  227. package/lib/programmatic/manifest-section-quality.js +171 -0
  228. package/lib/programmatic/manifest-section-registry-data.js +269 -0
  229. package/lib/programmatic/manifest-section-registry.js +205 -0
  230. package/lib/programmatic/nest-http-bridge.js +34 -0
  231. package/lib/programmatic/openapi-component-schemas.js +68 -0
  232. package/lib/programmatic/openapi-description-enricher.js +117 -0
  233. package/lib/programmatic/openapi-descriptions.js +190 -0
  234. package/lib/programmatic/openapi-docs-serving.js +123 -0
  235. package/lib/programmatic/openapi-help-schemas.js +63 -0
  236. package/lib/programmatic/openapi-manifest-schemas.js +141 -0
  237. package/lib/programmatic/openapi-operation-bindings.js +274 -0
  238. package/lib/programmatic/openapi-request-schemas.js +155 -0
  239. package/lib/programmatic/openapi-result-schemas.js +476 -0
  240. package/lib/programmatic/openapi-schema-descriptions-certify.js +139 -0
  241. package/lib/programmatic/openapi-schema-descriptions-core.js +159 -0
  242. package/lib/programmatic/openapi-schema-descriptions-help.js +40 -0
  243. package/lib/programmatic/openapi-schema-descriptions-manifest.js +143 -0
  244. package/lib/programmatic/openapi-schema-descriptions-mcp.js +118 -0
  245. package/lib/programmatic/openapi-schema-descriptions-operations.js +281 -0
  246. package/lib/programmatic/openapi-schema-helpers.js +93 -0
  247. package/lib/programmatic/openapi-spec.js +203 -0
  248. package/lib/programmatic/orchestration-openapi-meta.js +159 -0
  249. package/lib/programmatic/platform-rbac-catalog.js +90 -0
  250. package/lib/programmatic/request-timeout.js +53 -0
  251. package/lib/programmatic/route-handler-map.js +143 -0
  252. package/lib/programmatic/route-handlers-context.js +29 -0
  253. package/lib/programmatic/route-handlers.js +33 -0
  254. package/lib/programmatic/run-certify.js +57 -0
  255. package/lib/programmatic/run-enterprise-mcp.js +32 -0
  256. package/lib/programmatic/run-lifecycle.js +29 -0
  257. package/lib/programmatic/run-repair.js +41 -0
  258. package/lib/programmatic/run-repository-emcp.js +54 -0
  259. package/lib/programmatic/run-template-workspace.js +61 -0
  260. package/lib/programmatic/run-test.js +49 -0
  261. package/lib/programmatic/run-upload.js +63 -0
  262. package/lib/programmatic/run-validate.js +53 -0
  263. package/lib/programmatic/run-wizard.js +40 -0
  264. package/lib/programmatic/system-key.js +48 -0
  265. package/lib/programmatic/wizard-config-normalize.js +118 -0
  266. package/lib/programmatic/workspace-cleanup.js +128 -0
  267. package/lib/programmatic/workspace-context.js +145 -0
  268. package/lib/programmatic/workspace-lock.js +75 -0
  269. package/lib/programmatic/workspace-meta.js +64 -0
  270. package/lib/programmatic/workspace-ops.js +149 -0
  271. package/lib/protection/run-commands-upload-sync.js +35 -0
  272. package/lib/protection/run-commands.js +2 -20
  273. package/lib/protection/upload-batch.js +11 -7
  274. package/lib/resolvers/resource-type-file.js +22 -0
  275. package/lib/schema/external-datasource.schema.json +161 -1
  276. package/lib/schema/external-system.schema.json +242 -4
  277. package/lib/schema/flag-map-validation-run.json +3 -0
  278. package/lib/schema/type/credential-field-registry.json +2 -2
  279. package/lib/schema/type/document-storage.json +9 -0
  280. package/lib/utils/agent-trust-run-display.js +1 -1
  281. package/lib/utils/app-path-resolve.js +168 -0
  282. package/lib/utils/authentication-env-template.js +222 -0
  283. package/lib/utils/cli-sync-options.js +7 -11
  284. package/lib/utils/cli-utils.js +4 -0
  285. package/lib/utils/cli-workspace-options.js +29 -0
  286. package/lib/utils/compose-generate-docker-compose.js +102 -0
  287. package/lib/utils/configuration-env-resolver.js +203 -27
  288. package/lib/utils/datasource-test-run-certificate-tty.js +28 -2
  289. package/lib/utils/datasource-test-run-certification-debug.js +130 -0
  290. package/lib/utils/datasource-test-run-debug-display.js +2 -0
  291. package/lib/utils/datasource-test-run-debug-slice.js +7 -0
  292. package/lib/utils/datasource-test-run-display.js +2 -1
  293. package/lib/utils/dev-init-ssh-merge.js +165 -23
  294. package/lib/utils/dev-pin-share-instructions.js +110 -0
  295. package/lib/utils/dev-ssh-config-helper.js +177 -33
  296. package/lib/utils/enterprise-knowledge-paths.js +142 -0
  297. package/lib/utils/env-copy.js +2 -1
  298. package/lib/utils/env-dotenv-format.js +103 -0
  299. package/lib/utils/external-env-template.js +4 -1
  300. package/lib/utils/external-system-display.js +5 -1
  301. package/lib/utils/external-system-readiness-compact-blocks.js +221 -0
  302. package/lib/utils/external-system-readiness-compact-display.js +324 -0
  303. package/lib/utils/external-system-readiness-core.js +16 -0
  304. package/lib/utils/external-system-readiness-deploy-display.js +29 -11
  305. package/lib/utils/external-system-readiness-display-internals.js +3 -1
  306. package/lib/utils/external-system-readiness-display.js +20 -30
  307. package/lib/utils/external-system-system-test-tty-certification.js +135 -0
  308. package/lib/utils/external-system-system-test-tty.js +5 -41
  309. package/lib/utils/help-builder.js +6 -1
  310. package/lib/utils/host-ops-job-labels.js +236 -0
  311. package/lib/utils/host-ops-job-result.js +61 -0
  312. package/lib/utils/host-ops-poll-ui.js +163 -0
  313. package/lib/utils/integration-path-resolve.js +112 -0
  314. package/lib/utils/paths-reload-source.js +148 -0
  315. package/lib/utils/paths-system-builder-keys.js +25 -0
  316. package/lib/utils/paths.js +151 -26
  317. package/lib/utils/runtime-configuration-values.js +64 -2
  318. package/lib/utils/secrets-helpers.js +5 -1
  319. package/lib/utils/ssh-known-hosts.js +130 -0
  320. package/lib/utils/test-target-cli-options.js +75 -0
  321. package/lib/utils/upload-sync-options.js +4 -0
  322. package/lib/utils/validation-run-request.js +11 -2
  323. package/lib/validation/external-manifest-validator.js +11 -1
  324. package/lib/validation/openapi-contract-surface-validator.js +426 -0
  325. package/lib/validation/openapi-contract-vendor-validation.js +238 -0
  326. package/lib/validation/validate-external-file.js +160 -0
  327. package/lib/validation/validate.js +6 -117
  328. package/package.json +46 -29
  329. package/packages/builder-api/README.md +120 -0
  330. package/packages/builder-api/package.json +30 -0
  331. package/packages/builder-api/src/app.module.ts +7 -0
  332. package/packages/builder-api/src/auth/auth.module.ts +5 -0
  333. package/packages/builder-api/src/external-system/external-system.module.ts +5 -0
  334. package/packages/builder-api/src/main.ts +16 -0
  335. package/packages/builder-api/tsconfig.json +15 -0
  336. package/scripts/check-builder-api-architecture-grep.js +79 -0
  337. package/scripts/docker_image_content_gate.js +47 -0
  338. package/scripts/docker_image_content_gate.sh +5 -0
  339. package/scripts/export-builder-api-evidence.js +262 -0
  340. package/scripts/lib/builder-api-docker-staging-copy.js +60 -0
  341. package/scripts/lib/builder-api-docker-staging-core.js +183 -0
  342. package/scripts/lib/docker-image-content-gate-core.js +166 -0
  343. package/scripts/lib/plan-actor.js +109 -0
  344. package/scripts/lib/plan-config.js +20 -0
  345. package/scripts/lib/plan-gates.js +154 -0
  346. package/scripts/lib/plan-meta.js +104 -0
  347. package/scripts/lib/plan-parse.js +162 -0
  348. package/scripts/lib/plan-prevalidate-gates.js +326 -0
  349. package/scripts/lib/plan-run-core.js +125 -0
  350. package/scripts/lib/plan-run-report.js +108 -0
  351. package/scripts/plan-approve.js +24 -0
  352. package/scripts/plan-archive.js +49 -0
  353. package/scripts/plan-run.js +13 -0
  354. package/scripts/plan-set-actor.js +21 -0
  355. package/scripts/plan-validate.js +80 -0
  356. package/scripts/pnpm/af.mjs +110 -0
  357. package/scripts/pnpm/check-quiet.mjs +32 -0
  358. package/scripts/pnpm/dev-install.mjs +29 -0
  359. package/scripts/pnpm/dev-reload.mjs +18 -0
  360. package/scripts/pnpm/help.mjs +55 -0
  361. package/scripts/pnpm/lib/dev-reload-core.mjs +189 -0
  362. package/scripts/pnpm/lib/dev-reload-log-capture.mjs +67 -0
  363. package/scripts/pnpm/lib/dev-reload-log-utils.mjs +32 -0
  364. package/scripts/pnpm/lib/resolve-aifabrix-bin.mjs +124 -0
  365. package/scripts/pnpm/lib/resolve-app-url.mjs +183 -0
  366. package/scripts/pnpm/lib/spinner.mjs +42 -0
  367. package/scripts/stage_builder_api_for_docker.js +65 -0
  368. package/scripts/sync-builder-api-template.js +44 -0
  369. package/templates/README.md +3 -0
  370. package/templates/applications/builder-api/Dockerfile +38 -0
  371. package/templates/applications/builder-api/application.yaml +75 -0
  372. package/templates/applications/builder-api/env.template +48 -0
  373. package/templates/applications/dataplane/application.yaml +1 -1
  374. package/templates/applications/dataplane/env.template +10 -6
  375. package/templates/applications/dataplane/rbac.yaml +21 -1
  376. package/templates/applications/miso-controller/application.yaml +1 -1
  377. package/templates/applications/miso-controller/env.template +1 -3
  378. package/templates/channels/README.md +18 -0
  379. package/templates/channels/ai-fabrix-icon.jpg +0 -0
  380. package/templates/channels/chatgpt/install.template.md.hbs +21 -24
  381. package/templates/channels/chatgpt/integration/README.md +11 -0
  382. package/templates/channels/chatgpt/integration/application.json +15 -0
  383. package/templates/channels/chatgpt/integration/chatgpt-system.json +29 -0
  384. package/templates/channels/chatgpt/integration/env.template +4 -0
  385. package/templates/channels/microsoft-copilot/install.template.md.hbs +20 -25
  386. package/templates/channels/microsoft-copilot/integration/README.md +11 -0
  387. package/templates/channels/microsoft-copilot/integration/application.json +15 -0
  388. package/templates/channels/microsoft-copilot/integration/env.template +6 -0
  389. package/templates/channels/microsoft-copilot/integration/microsoft-copilot-system.json +34 -0
  390. package/templates/channels/slack/install.template.md.hbs +48 -18
  391. package/templates/channels/slack/integration/README.md +38 -0
  392. package/templates/channels/slack/integration/application.json +18 -0
  393. package/templates/channels/slack/integration/env.template +29 -0
  394. package/templates/channels/slack/integration/slack-datasource-conversations.json +226 -0
  395. package/templates/channels/slack/integration/slack-datasource-messages.json +269 -0
  396. package/templates/channels/slack/integration/slack-system.json +86 -0
  397. package/templates/channels/slack/manifest.template.json.hbs +20 -10
  398. package/templates/channels/teams-bot/install.template.md.hbs +31 -17
  399. package/templates/channels/teams-bot/integration/README.md +18 -0
  400. package/templates/channels/teams-bot/integration/application.json +17 -0
  401. package/templates/channels/teams-bot/integration/env.template +5 -0
  402. package/templates/channels/teams-bot/integration/teams-bot-system.json +55 -0
  403. package/templates/channels/teams-bot/manifest.template.json.hbs +27 -0
  404. package/templates/channels/web-embed/install.template.md.hbs +16 -26
  405. package/templates/channels/web-embed/integration/README.md +11 -0
  406. package/templates/channels/web-embed/integration/application.json +15 -0
  407. package/templates/channels/web-embed/integration/env.template +4 -0
  408. package/templates/channels/web-embed/integration/web-embed-system.json +29 -0
  409. package/templates/openapi/redoc_page.html +86 -0
  410. package/templates/python/docker-compose.hbs +11 -0
  411. package/templates/python/requirements.txt +1 -1
  412. package/templates/typescript/docker-compose.hbs +11 -0
  413. package/lib/certification/cli-cert-sync-skip.js +0 -21
@@ -0,0 +1,46 @@
1
+ /**
2
+ * @fileoverview Enterprise Knowledge API type definitions
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ /**
8
+ * @typedef {Object} GenerateManifestSubscription
9
+ * @property {string} key
10
+ * @property {string} [event]
11
+ * @property {Object<string, *>} [filter]
12
+ * @property {Object<string, *>} [task]
13
+ */
14
+
15
+ /**
16
+ * @typedef {Object} GenerateManifestRequest
17
+ * @property {string} domain
18
+ * @property {string} ownerSystemKey
19
+ * @property {string} [displayName]
20
+ * @property {string} [description]
21
+ * @property {GenerateManifestSubscription[]} [subscriptions]
22
+ * @property {string[]} [sourceSystemKeys]
23
+ * @property {string} [version]
24
+ */
25
+
26
+ /**
27
+ * @typedef {Object} GenerateManifestFinding
28
+ * @property {string} code
29
+ * @property {string} severity
30
+ * @property {string} message
31
+ * @property {Object<string, *>} [context]
32
+ */
33
+
34
+ /**
35
+ * @typedef {Object} GenerateManifestResponse
36
+ * @property {boolean} previewOnly
37
+ * @property {string} ownerSystemKey
38
+ * @property {Object<string, *>} externalSystem
39
+ * @property {Object<string, *>[]} externalDataSources
40
+ * @property {string} version
41
+ * @property {GenerateManifestFinding[]} compilerFindings
42
+ * @property {GenerateManifestFinding[]} trustFindings
43
+ * @property {string} message
44
+ */
45
+
46
+ module.exports = {};
@@ -0,0 +1,67 @@
1
+ /**
2
+ * @fileoverview JSDoc types for Evidence Fabrix dataplane API.
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ /**
8
+ * @typedef {'active' | 'disabled'} EvidenceStatus
9
+ */
10
+
11
+ /**
12
+ * @typedef {'self' | 'role' | 'roleExceptSelf'} EvidenceApprover
13
+ */
14
+
15
+ /**
16
+ * @typedef {Object} EvidenceApprovalPolicy
17
+ * @property {boolean} required
18
+ * @property {EvidenceApprover} approver
19
+ * @property {string|null} [roleKey]
20
+ */
21
+
22
+ /**
23
+ * @typedef {Object} EvidenceRow
24
+ * @property {string} id
25
+ * @property {string} resourceType
26
+ * @property {string|null} [roleKey]
27
+ * @property {string} title
28
+ * @property {string|null} [description]
29
+ * @property {string} when
30
+ * @property {string} expectedBehavior
31
+ * @property {number} order
32
+ * @property {EvidenceStatus} status
33
+ * @property {number|null} [generationConfidence]
34
+ * @property {string|null} [suggestionExplanation]
35
+ * @property {EvidenceApprovalPolicy} approval
36
+ * @property {'human' | 'assistant'} createdByType
37
+ * @property {string} createdById
38
+ * @property {string} createdAt
39
+ * @property {string} updatedAt
40
+ */
41
+
42
+ /**
43
+ * @typedef {Object} EvidenceCreatePayload
44
+ * @property {string} resourceType
45
+ * @property {string|null} [roleKey]
46
+ * @property {string} title
47
+ * @property {string|null} [description]
48
+ * @property {string} when
49
+ * @property {string} expectedBehavior
50
+ * @property {number|null} [order]
51
+ * @property {EvidenceStatus} [status]
52
+ * @property {EvidenceApprovalPolicy} [approval]
53
+ */
54
+
55
+ /**
56
+ * @typedef {Partial<EvidenceCreatePayload>} EvidenceUpdatePayload
57
+ */
58
+
59
+ /**
60
+ * @typedef {Object} EvidenceListParams
61
+ * @property {string} [resourceType]
62
+ * @property {string} [roleKey]
63
+ * @property {boolean} [genericOnly]
64
+ * @property {EvidenceStatus} [status]
65
+ */
66
+
67
+ module.exports = {};
@@ -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
+ };