@aifabrix/builder 2.49.2 → 2.51.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (459) hide show
  1. package/.cursor/plans/157.1-security-quality-violations-by-type.csv +374 -0
  2. package/.cursor/rules/assistant-driven-integration-build.mdc +40 -0
  3. package/.cursor/rules/deploy-rules/docker-image-ip-policy.mdc +49 -0
  4. package/.cursor/rules/plan-rules/application-lifecycle.mdc +30 -0
  5. package/.cursor/rules/plan-rules/plan-frontmatter.mdc +35 -0
  6. package/.cursor/rules/plan-rules/plan-lifecycle.mdc +31 -0
  7. package/.cursor/rules/plan-rules/plan-validation-gate.mdc +34 -0
  8. package/.cursor/skills/README.md +1 -0
  9. package/.dockerignore +52 -0
  10. package/.eslintignore +22 -0
  11. package/README.md +2 -0
  12. package/bin/builder-api-cleanup.js +26 -0
  13. package/bin/builder-api-nest.js +10 -0
  14. package/bin/builder-api-spike.js +19 -0
  15. package/enterprise-knowledge/README.md +50 -0
  16. package/enterprise-knowledge/enterprise-integration-lifecycle/README.md +22 -0
  17. package/enterprise-knowledge/enterprise-integration-lifecycle/application.json +15 -0
  18. package/enterprise-knowledge/enterprise-integration-lifecycle/deploy.js +69 -0
  19. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-deploy.json +52 -0
  20. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-system.json +29 -0
  21. package/enterprise-knowledge/enterprise-integration-lifecycle/env.template +2 -0
  22. package/integration/README.md +81 -0
  23. package/integration/github/README.md +53 -0
  24. package/integration/github/application.json +21 -0
  25. package/integration/github/deploy.js +72 -0
  26. package/integration/github/env.template +11 -0
  27. package/integration/github/github-datasource-issue-comments.json +239 -0
  28. package/integration/github/github-datasource-issues.json +399 -0
  29. package/integration/github/github-datasource-repository.json +354 -0
  30. package/integration/github/github-deploy.json +1202 -0
  31. package/integration/github/github-system.json +82 -0
  32. package/integration/hubspot-test/README.md +1 -1
  33. package/integration/hubspot-test/create-hubspot.js +1 -16
  34. package/jest.isolated-projects.js +31 -1
  35. package/jest.projects.js +87 -1
  36. package/lib/api/dev-server-https.js +1 -1
  37. package/lib/api/enterprise-knowledge.api.js +63 -0
  38. package/lib/api/evidence-kinds.api.js +128 -0
  39. package/lib/api/evidence.api.js +172 -0
  40. package/lib/api/external-systems.api.js +8 -2
  41. package/lib/api/pipeline.api.js +5 -1
  42. package/lib/api/resource-types.api.js +5 -4
  43. package/lib/api/roles.api.js +121 -0
  44. package/lib/api/types/enterprise-knowledge.types.js +46 -0
  45. package/lib/api/types/evidence-kinds.types.js +42 -0
  46. package/lib/api/types/evidence.types.js +67 -0
  47. package/lib/api/types/resource-types.types.js +2 -0
  48. package/lib/api/types/roles.types.js +36 -0
  49. package/lib/app/certification-verify-rows.js +1 -1
  50. package/lib/app/controller-application-filter.js +36 -0
  51. package/lib/app/deploy.js +1 -1
  52. package/lib/app/list-external-systems.js +130 -0
  53. package/lib/app/list.js +20 -8
  54. package/lib/app/run.js +3 -1
  55. package/lib/app/show-display.js +8 -3
  56. package/lib/app/show-online.js +178 -0
  57. package/lib/app/show.js +39 -90
  58. package/lib/build/builder-api-docker-staging.js +47 -0
  59. package/lib/build/miso-controller-npm-sdk-guard.js +2 -2
  60. package/lib/build/standard-docker-build.js +2 -0
  61. package/lib/certification/merge-certification-from-artifact.js +1 -1
  62. package/lib/certification/post-unified-cert-sync.js +4 -31
  63. package/lib/certification/sync-after-external-command.js +0 -1
  64. package/lib/certification/sync-system-certification.js +0 -3
  65. package/lib/channels/add-channel.js +40 -34
  66. package/lib/channels/approval-guides/chatgpt.js +33 -0
  67. package/lib/channels/approval-guides/credential-portal.js +38 -0
  68. package/lib/channels/approval-guides/index.js +110 -0
  69. package/lib/channels/approval-guides/microsoft-copilot.js +34 -0
  70. package/lib/channels/approval-guides/slack.js +34 -0
  71. package/lib/channels/approval-guides/teams-bot.js +35 -0
  72. package/lib/channels/approval-guides/web-embed.js +32 -0
  73. package/lib/channels/channel-approval-guide.js +11 -0
  74. package/lib/channels/channel-artifact-generator.js +18 -5
  75. package/lib/channels/channel-audit.js +3 -0
  76. package/lib/channels/channel-auth-context.js +1 -1
  77. package/lib/channels/channel-description.js +59 -0
  78. package/lib/channels/channel-integration-generator.js +13 -230
  79. package/lib/channels/channel-integration-template.js +94 -0
  80. package/lib/channels/channel-runtime-resolver.js +43 -3
  81. package/lib/channels/channel-status-display.js +66 -26
  82. package/lib/channels/channel-targets.js +3 -3
  83. package/lib/cli/index.js +31 -3
  84. package/lib/cli/infra-guided.js +5 -1
  85. package/lib/cli/setup-app-external-create.js +111 -0
  86. package/lib/cli/setup-app.help.js +1 -1
  87. package/lib/cli/setup-app.js +60 -130
  88. package/lib/cli/setup-app.test-commands.js +26 -52
  89. package/lib/cli/setup-certification-commands.js +4 -4
  90. package/lib/cli/setup-certification.help.js +9 -9
  91. package/lib/cli/setup-dev.js +30 -9
  92. package/lib/cli/setup-external-system-help.js +4 -6
  93. package/lib/cli/setup-external-system.js +58 -52
  94. package/lib/cli/setup-infra-up-builder-api-action.js +64 -0
  95. package/lib/cli/setup-infra-up-platform-action.js +3 -1
  96. package/lib/cli/setup-infra.js +15 -0
  97. package/lib/cli/setup-list.js +43 -0
  98. package/lib/cli/setup-utility-help-after.js +12 -0
  99. package/lib/cli/setup-utility-repair.js +26 -7
  100. package/lib/cli/setup-utility-validate.js +41 -2
  101. package/lib/cli/setup-utility.js +5 -3
  102. package/lib/commands/app.js +15 -43
  103. package/lib/commands/channel-add-setup.js +110 -0
  104. package/lib/commands/channel.js +42 -8
  105. package/lib/commands/datasource-sync-display.js +96 -0
  106. package/lib/commands/datasource-sync-policy.js +210 -0
  107. package/lib/commands/datasource-test-trust-cli.js +6 -6
  108. package/lib/commands/datasource-unified-test-cli.js +2 -1
  109. package/lib/commands/datasource-unified-test-cli.options.js +33 -23
  110. package/lib/commands/deploy-gate-failure-details.js +184 -0
  111. package/lib/commands/deploy-gate-orchestrator.js +368 -0
  112. package/lib/commands/dev-cli-handlers.js +7 -62
  113. package/lib/commands/dev-host-ops-params.js +91 -0
  114. package/lib/commands/dev-host-ops-poll.js +111 -0
  115. package/lib/commands/dev-host-ops.js +107 -94
  116. package/lib/commands/dev-init.js +6 -106
  117. package/lib/commands/dev-refresh.js +197 -0
  118. package/lib/commands/enterprise-knowledge.js +284 -0
  119. package/lib/commands/evidence-cli-leaves.js +250 -0
  120. package/lib/commands/evidence-kind.js +428 -0
  121. package/lib/commands/evidence.js +51 -0
  122. package/lib/commands/governance-cli-shared.js +2 -2
  123. package/lib/commands/governance-command-action.js +5 -3
  124. package/lib/commands/governance-fixture-subjects.js +85 -0
  125. package/lib/commands/governance.js +1 -1
  126. package/lib/commands/lifecycle-command-action.js +2 -2
  127. package/lib/commands/lifecycle-external.js +3 -3
  128. package/lib/commands/manifest-cli-auth.js +29 -0
  129. package/lib/commands/manifest-cli-commands.js +170 -0
  130. package/lib/commands/manifest-cli-integration-path.js +63 -0
  131. package/lib/commands/manifest.js +21 -0
  132. package/lib/commands/protection-cli-leaves.js +3 -3
  133. package/lib/commands/repair-auth-apply.js +15 -1
  134. package/lib/commands/repair-authentications-454.js +169 -0
  135. package/lib/commands/repair-capability-openapi-warnings.js +126 -0
  136. package/lib/commands/repair-datasource-apply.js +135 -0
  137. package/lib/commands/repair-datasource-auto-rbac.js +62 -1
  138. package/lib/commands/repair-datasource-http-service-contract.js +239 -0
  139. package/lib/commands/repair-datasource-operation-security.js +180 -0
  140. package/lib/commands/repair-datasource-run.js +7 -2
  141. package/lib/commands/repair-datasource-sync-operations.js +177 -0
  142. package/lib/commands/repair-datasource-webhooks-sync-bridge.js +133 -0
  143. package/lib/commands/repair-datasource.js +12 -68
  144. package/lib/commands/repair-env-template.js +11 -1
  145. package/lib/commands/repair-external-run.js +121 -31
  146. package/lib/commands/repair-internal.js +1 -1
  147. package/lib/commands/repair-openapi-export.js +156 -0
  148. package/lib/commands/repair-openapi-sync.js +33 -8
  149. package/lib/commands/repair-orchestration-datasource-split.js +259 -0
  150. package/lib/commands/repair-persist.js +22 -1
  151. package/lib/commands/repair-rbac-platform-preset.js +204 -0
  152. package/lib/commands/repair-rbac-reader-roles.js +191 -0
  153. package/lib/commands/repair-rbac.js +163 -86
  154. package/lib/commands/repair-steps.js +83 -18
  155. package/lib/commands/repair-system-permissions.js +1 -0
  156. package/lib/commands/repair.js +1 -1
  157. package/lib/commands/resource-type.js +166 -44
  158. package/lib/commands/role.js +452 -0
  159. package/lib/commands/run-post-publish-data-sync.js +68 -0
  160. package/lib/commands/setup-modes.js +1 -1
  161. package/lib/commands/setup.js +1 -1
  162. package/lib/commands/test-e2e-external.js +21 -8
  163. package/lib/commands/test-governance-cli-options.js +2 -2
  164. package/lib/commands/test-trust-cli-options.js +2 -2
  165. package/lib/commands/up-builder-api-bootstrap.js +71 -0
  166. package/lib/commands/up-builder-api-provision.js +241 -0
  167. package/lib/commands/up-builder-api.js +88 -0
  168. package/lib/commands/up-common.js +25 -1
  169. package/lib/commands/upload-credential-push-log.js +117 -0
  170. package/lib/commands/upload-data-sync-finalize.js +60 -0
  171. package/lib/commands/upload-probe.js +66 -0
  172. package/lib/commands/upload-publish-context.js +4 -1
  173. package/lib/commands/upload-sidecar-followups.js +55 -27
  174. package/lib/commands/upload.js +116 -157
  175. package/lib/commands/validate-json.js +230 -0
  176. package/lib/commands/verify-governance-combined-external.js +1 -1
  177. package/lib/commands/verify-governance-db.js +2 -2
  178. package/lib/commands/verify-operations-command-action.js +2 -2
  179. package/lib/commands/verify-operations-step-plan.js +79 -41
  180. package/lib/commands/verify-operations-steps.js +2 -2
  181. package/lib/commands/verify-trust-command-action.js +1 -1
  182. package/lib/commands/wizard-core.js +1 -1
  183. package/lib/commands/wizard-headless.js +2 -1
  184. package/lib/core/admin-secrets.js +2 -6
  185. package/lib/core/audit-logger.js +1 -1
  186. package/lib/core/secrets-env-content.js +10 -4
  187. package/lib/core/secrets-env-write.js +2 -13
  188. package/lib/core/secrets-load.js +1 -3
  189. package/lib/datasource/agent-trust-run.js +3 -3
  190. package/lib/datasource/capability/relate-operations.js +1 -1
  191. package/lib/datasource/deploy.js +3 -1
  192. package/lib/datasource/test-e2e.js +6 -1
  193. package/lib/datasource/unified-validation-run-body.js +4 -1
  194. package/lib/datasource/unified-validation-run.js +1 -1
  195. package/lib/deployment/deploy-poll-ui.js +73 -12
  196. package/lib/deployment/deployer-poll-run.js +113 -0
  197. package/lib/deployment/deployer.js +17 -87
  198. package/lib/evidence/dataplane-context.js +21 -0
  199. package/lib/evidence/evidence-display.js +78 -0
  200. package/lib/evidence/evidence-service.js +392 -0
  201. package/lib/external-system/deploy.js +290 -112
  202. package/lib/external-system/download.js +7 -3
  203. package/lib/external-system/test-execution.js +1 -1
  204. package/lib/external-system/test-system-level.js +8 -10
  205. package/lib/external-system/test.js +12 -6
  206. package/lib/generator/deploy-script.js +73 -0
  207. package/lib/generator/external.js +2 -1
  208. package/lib/generator/helpers.js +13 -5
  209. package/lib/generator/index.js +17 -2
  210. package/lib/generator/split-variables.js +9 -3
  211. package/lib/generator/wizard.js +3 -36
  212. package/lib/infrastructure/helpers-docker-check.js +6 -0
  213. package/lib/infrastructure/helpers.js +1 -1
  214. package/lib/internal/fs-real-sync.js +22 -1
  215. package/lib/internal/node-fs.js +2 -0
  216. package/lib/lifecycle/lifecycle-governance-options.js +1 -1
  217. package/lib/lifecycle/verify-step-progress.js +1 -1
  218. package/lib/programmatic/access-log.js +26 -0
  219. package/lib/programmatic/auth-config.js +45 -0
  220. package/lib/programmatic/bearer-auth.js +176 -0
  221. package/lib/programmatic/builder-api-request.js +175 -0
  222. package/lib/programmatic/builder-api-route-dispatch.js +82 -0
  223. package/lib/programmatic/builder-api-runtime-config.js +42 -0
  224. package/lib/programmatic/builder-api-server.js +230 -0
  225. package/lib/programmatic/builder-help-authentication-catalog.js +282 -0
  226. package/lib/programmatic/builder-help-connected-system-ui.js +266 -0
  227. package/lib/programmatic/builder-help-enterprise-sync-fabrix.js +60 -0
  228. package/lib/programmatic/builder-help-envelope.js +36 -0
  229. package/lib/programmatic/builder-help-fixtures.js +200 -0
  230. package/lib/programmatic/builder-help-governance.js +172 -0
  231. package/lib/programmatic/builder-help-schema-catalog.js +92 -0
  232. package/lib/programmatic/builder-help.js +361 -0
  233. package/lib/programmatic/capability-registry.js +77 -0
  234. package/lib/programmatic/command-options.js +32 -0
  235. package/lib/programmatic/enterprise-mcp-client.js +114 -0
  236. package/lib/programmatic/http-problem-details.js +99 -0
  237. package/lib/programmatic/http-route-match.js +40 -0
  238. package/lib/programmatic/idempotency-cache.js +69 -0
  239. package/lib/programmatic/index.js +53 -0
  240. package/lib/programmatic/integration-path-scope.js +39 -0
  241. package/lib/programmatic/log-redaction.js +66 -0
  242. package/lib/programmatic/manifest-get-section.js +146 -0
  243. package/lib/programmatic/manifest-patch-section.js +252 -0
  244. package/lib/programmatic/manifest-repair.js +122 -0
  245. package/lib/programmatic/manifest-section-dependency-graph.js +160 -0
  246. package/lib/programmatic/manifest-section-io.js +225 -0
  247. package/lib/programmatic/manifest-section-quality.js +171 -0
  248. package/lib/programmatic/manifest-section-registry-data.js +269 -0
  249. package/lib/programmatic/manifest-section-registry.js +222 -0
  250. package/lib/programmatic/nest-http-bridge.js +34 -0
  251. package/lib/programmatic/openapi-component-schemas.js +68 -0
  252. package/lib/programmatic/openapi-description-enricher.js +117 -0
  253. package/lib/programmatic/openapi-descriptions.js +190 -0
  254. package/lib/programmatic/openapi-docs-serving.js +123 -0
  255. package/lib/programmatic/openapi-help-schemas.js +63 -0
  256. package/lib/programmatic/openapi-manifest-schemas.js +141 -0
  257. package/lib/programmatic/openapi-operation-bindings.js +274 -0
  258. package/lib/programmatic/openapi-request-schemas.js +155 -0
  259. package/lib/programmatic/openapi-result-schemas.js +493 -0
  260. package/lib/programmatic/openapi-schema-descriptions-certify.js +139 -0
  261. package/lib/programmatic/openapi-schema-descriptions-core.js +162 -0
  262. package/lib/programmatic/openapi-schema-descriptions-help.js +40 -0
  263. package/lib/programmatic/openapi-schema-descriptions-manifest.js +143 -0
  264. package/lib/programmatic/openapi-schema-descriptions-mcp.js +118 -0
  265. package/lib/programmatic/openapi-schema-descriptions-operations.js +281 -0
  266. package/lib/programmatic/openapi-schema-helpers.js +108 -0
  267. package/lib/programmatic/openapi-spec.js +203 -0
  268. package/lib/programmatic/orchestration-openapi-meta.js +159 -0
  269. package/lib/programmatic/platform-rbac-catalog.js +90 -0
  270. package/lib/programmatic/request-timeout.js +53 -0
  271. package/lib/programmatic/route-handler-map.js +143 -0
  272. package/lib/programmatic/route-handlers-context.js +29 -0
  273. package/lib/programmatic/route-handlers.js +33 -0
  274. package/lib/programmatic/run-certify.js +57 -0
  275. package/lib/programmatic/run-enterprise-mcp.js +32 -0
  276. package/lib/programmatic/run-lifecycle.js +29 -0
  277. package/lib/programmatic/run-repair.js +41 -0
  278. package/lib/programmatic/run-repository-emcp.js +62 -0
  279. package/lib/programmatic/run-template-workspace.js +74 -0
  280. package/lib/programmatic/run-test.js +49 -0
  281. package/lib/programmatic/run-upload.js +63 -0
  282. package/lib/programmatic/run-validate.js +53 -0
  283. package/lib/programmatic/run-wizard.js +40 -0
  284. package/lib/programmatic/system-key.js +48 -0
  285. package/lib/programmatic/wizard-config-normalize.js +118 -0
  286. package/lib/programmatic/workspace-cleanup.js +128 -0
  287. package/lib/programmatic/workspace-context.js +145 -0
  288. package/lib/programmatic/workspace-lock.js +75 -0
  289. package/lib/programmatic/workspace-meta.js +64 -0
  290. package/lib/programmatic/workspace-ops.js +149 -0
  291. package/lib/protection/run-commands-upload-sync.js +35 -0
  292. package/lib/protection/run-commands.js +2 -20
  293. package/lib/protection/upload-batch.js +11 -7
  294. package/lib/resolvers/evidence-kind-file.js +230 -0
  295. package/lib/resolvers/resource-type-file.js +58 -1
  296. package/lib/resolvers/role-file.js +227 -0
  297. package/lib/schema/application-schema.json +22 -2
  298. package/lib/schema/external-datasource.schema.json +245 -2
  299. package/lib/schema/external-system.schema.json +259 -119
  300. package/lib/schema/flag-map-validation-run.json +3 -0
  301. package/lib/schema/infra.parameter.yaml +25 -1
  302. package/lib/schema/type/credential-field-registry.json +21 -5
  303. package/lib/schema/type/document-storage.json +9 -0
  304. package/lib/utils/agent-trust-run-display.js +1 -1
  305. package/lib/utils/api.js +8 -2
  306. package/lib/utils/app-path-resolve.js +168 -0
  307. package/lib/utils/app-register-config.js +4 -3
  308. package/lib/utils/authentication-env-template.js +222 -0
  309. package/lib/utils/cli-sync-options.js +62 -10
  310. package/lib/utils/cli-utils.js +15 -3
  311. package/lib/utils/cli-workspace-options.js +29 -0
  312. package/lib/utils/compose-generate-docker-compose.js +102 -0
  313. package/lib/utils/configuration-env-resolver.js +203 -27
  314. package/lib/utils/datasource-test-run-certificate-tty.js +28 -2
  315. package/lib/utils/datasource-test-run-certification-debug.js +130 -0
  316. package/lib/utils/datasource-test-run-debug-display.js +2 -0
  317. package/lib/utils/datasource-test-run-debug-slice.js +7 -0
  318. package/lib/utils/datasource-test-run-display.js +2 -1
  319. package/lib/utils/dev-ca-install.js +5 -6
  320. package/lib/utils/dev-config.js +2 -2
  321. package/lib/utils/dev-init-ssh-merge.js +165 -23
  322. package/lib/utils/dev-list-sort.js +145 -0
  323. package/lib/utils/dev-pin-share-instructions.js +110 -0
  324. package/lib/utils/dev-platform-tls.js +0 -63
  325. package/lib/utils/dev-ssh-config-helper.js +177 -33
  326. package/lib/utils/docker-build.js +46 -27
  327. package/lib/utils/docker-daemon-tls-ca.js +1 -1
  328. package/lib/utils/docker-exec.js +91 -6
  329. package/lib/utils/enterprise-knowledge-paths.js +142 -0
  330. package/lib/utils/env-copy.js +3 -4
  331. package/lib/utils/env-dotenv-format.js +103 -0
  332. package/lib/utils/error-formatters/error-parser.js +0 -3
  333. package/lib/utils/external-env-template.js +5 -2
  334. package/lib/utils/external-system-display.js +5 -1
  335. package/lib/utils/external-system-readiness-compact-blocks.js +248 -0
  336. package/lib/utils/external-system-readiness-compact-display.js +324 -0
  337. package/lib/utils/external-system-readiness-core.js +16 -0
  338. package/lib/utils/external-system-readiness-deploy-display.js +29 -11
  339. package/lib/utils/external-system-readiness-display-internals.js +3 -1
  340. package/lib/utils/external-system-readiness-display.js +20 -30
  341. package/lib/utils/external-system-system-test-tty-certification.js +135 -0
  342. package/lib/utils/external-system-system-test-tty.js +5 -41
  343. package/lib/utils/health-check-request.js +2 -3
  344. package/lib/utils/help-builder.js +9 -1
  345. package/lib/utils/host-ops-job-labels.js +236 -0
  346. package/lib/utils/host-ops-job-result.js +61 -0
  347. package/lib/utils/host-ops-poll-ui.js +163 -0
  348. package/lib/utils/image-name.js +22 -4
  349. package/lib/utils/integration-path-resolve.js +112 -0
  350. package/lib/utils/logger.js +37 -4
  351. package/lib/utils/manifest-source-emit.js +1 -1
  352. package/lib/utils/paths-reload-source.js +148 -0
  353. package/lib/utils/paths-system-builder-keys.js +25 -0
  354. package/lib/utils/paths.js +183 -30
  355. package/lib/utils/pipeline-upload-auth-retry.js +4 -0
  356. package/lib/utils/postgres-platform-bootstrap.js +24 -17
  357. package/lib/utils/postgres-wipe.js +5 -2
  358. package/lib/utils/remote-dev-auth.js +39 -4
  359. package/lib/utils/resolve-docker-image-ref.js +36 -6
  360. package/lib/utils/runtime-configuration-values.js +64 -2
  361. package/lib/utils/secrets-helpers.js +5 -1
  362. package/lib/utils/ssh-known-hosts.js +130 -0
  363. package/lib/utils/test-target-cli-options.js +75 -0
  364. package/lib/utils/token-manager.js +16 -0
  365. package/lib/utils/upload-sync-options.js +20 -2
  366. package/lib/utils/validation-run-request.js +11 -2
  367. package/lib/validation/external-manifest-validator.js +11 -1
  368. package/lib/validation/openapi-contract-surface-validator.js +430 -0
  369. package/lib/validation/openapi-contract-vendor-validation.js +238 -0
  370. package/lib/validation/validate-external-file.js +160 -0
  371. package/lib/validation/validate.js +6 -117
  372. package/lib/validation/validator.js +6 -5
  373. package/package.json +76 -37
  374. package/packages/builder-api/README.md +120 -0
  375. package/packages/builder-api/package.json +30 -0
  376. package/packages/builder-api/src/app.module.ts +7 -0
  377. package/packages/builder-api/src/auth/auth.module.ts +5 -0
  378. package/packages/builder-api/src/external-system/external-system.module.ts +5 -0
  379. package/packages/builder-api/src/main.ts +16 -0
  380. package/packages/builder-api/tsconfig.json +15 -0
  381. package/scripts/check-builder-api-architecture-grep.js +79 -0
  382. package/scripts/docker_image_content_gate.js +47 -0
  383. package/scripts/docker_image_content_gate.sh +5 -0
  384. package/scripts/export-builder-api-evidence.js +262 -0
  385. package/scripts/lib/builder-api-docker-staging-copy.js +60 -0
  386. package/scripts/lib/builder-api-docker-staging-core.js +183 -0
  387. package/scripts/lib/docker-image-content-gate-core.js +166 -0
  388. package/scripts/lib/plan-actor.js +109 -0
  389. package/scripts/lib/plan-config.js +20 -0
  390. package/scripts/lib/plan-gates.js +154 -0
  391. package/scripts/lib/plan-meta.js +104 -0
  392. package/scripts/lib/plan-parse.js +162 -0
  393. package/scripts/lib/plan-prevalidate-gates.js +337 -0
  394. package/scripts/lib/plan-run-core.js +125 -0
  395. package/scripts/lib/plan-run-report.js +119 -0
  396. package/scripts/plan-approve.js +24 -0
  397. package/scripts/plan-archive.js +49 -0
  398. package/scripts/plan-run.js +13 -0
  399. package/scripts/plan-set-actor.js +21 -0
  400. package/scripts/plan-validate.js +80 -0
  401. package/scripts/pnpm/af.mjs +110 -0
  402. package/scripts/pnpm/check-quiet.mjs +32 -0
  403. package/scripts/pnpm/dev-install.mjs +29 -0
  404. package/scripts/pnpm/dev-reload.mjs +18 -0
  405. package/scripts/pnpm/help.mjs +55 -0
  406. package/scripts/pnpm/lib/dev-reload-core.mjs +189 -0
  407. package/scripts/pnpm/lib/dev-reload-log-capture.mjs +67 -0
  408. package/scripts/pnpm/lib/dev-reload-log-utils.mjs +32 -0
  409. package/scripts/pnpm/lib/resolve-aifabrix-bin.mjs +124 -0
  410. package/scripts/pnpm/lib/resolve-app-url.mjs +183 -0
  411. package/scripts/pnpm/lib/spinner.mjs +42 -0
  412. package/scripts/stage_builder_api_for_docker.js +65 -0
  413. package/scripts/sync-builder-api-template.js +44 -0
  414. package/templates/README.md +3 -0
  415. package/templates/applications/builder-api/Dockerfile +38 -0
  416. package/templates/applications/builder-api/application.yaml +75 -0
  417. package/templates/applications/builder-api/env.template +48 -0
  418. package/templates/applications/dataplane/application.yaml +27 -5
  419. package/templates/applications/dataplane/env.template +38 -15
  420. package/templates/applications/dataplane/rbac.yaml +85 -3
  421. package/templates/applications/miso-controller/application.yaml +10 -1
  422. package/templates/applications/miso-controller/env.template +11 -10
  423. package/templates/applications/miso-controller/rbac.yaml +72 -0
  424. package/templates/channels/README.md +18 -0
  425. package/templates/channels/ai-fabrix-icon.jpg +0 -0
  426. package/templates/channels/chatgpt/install.template.md.hbs +21 -24
  427. package/templates/channels/chatgpt/integration/README.md +11 -0
  428. package/templates/channels/chatgpt/integration/application.json +15 -0
  429. package/templates/channels/chatgpt/integration/chatgpt-system.json +29 -0
  430. package/templates/channels/chatgpt/integration/env.template +4 -0
  431. package/templates/channels/microsoft-copilot/install.template.md.hbs +20 -25
  432. package/templates/channels/microsoft-copilot/integration/README.md +11 -0
  433. package/templates/channels/microsoft-copilot/integration/application.json +15 -0
  434. package/templates/channels/microsoft-copilot/integration/env.template +6 -0
  435. package/templates/channels/microsoft-copilot/integration/microsoft-copilot-system.json +34 -0
  436. package/templates/channels/slack/install.template.md.hbs +48 -18
  437. package/templates/channels/slack/integration/README.md +38 -0
  438. package/templates/channels/slack/integration/application.json +18 -0
  439. package/templates/channels/slack/integration/env.template +29 -0
  440. package/templates/channels/slack/integration/slack-datasource-conversations.json +226 -0
  441. package/templates/channels/slack/integration/slack-datasource-messages.json +269 -0
  442. package/templates/channels/slack/integration/slack-system.json +144 -0
  443. package/templates/channels/slack/manifest.template.json.hbs +20 -10
  444. package/templates/channels/teams-bot/install.template.md.hbs +31 -17
  445. package/templates/channels/teams-bot/integration/README.md +18 -0
  446. package/templates/channels/teams-bot/integration/application.json +17 -0
  447. package/templates/channels/teams-bot/integration/env.template +5 -0
  448. package/templates/channels/teams-bot/integration/teams-bot-system.json +55 -0
  449. package/templates/channels/teams-bot/manifest.template.json.hbs +27 -0
  450. package/templates/channels/web-embed/install.template.md.hbs +16 -26
  451. package/templates/channels/web-embed/integration/README.md +11 -0
  452. package/templates/channels/web-embed/integration/application.json +15 -0
  453. package/templates/channels/web-embed/integration/env.template +4 -0
  454. package/templates/channels/web-embed/integration/web-embed-system.json +29 -0
  455. package/templates/openapi/redoc_page.html +86 -0
  456. package/templates/python/docker-compose.hbs +11 -0
  457. package/templates/python/requirements.txt +2 -2
  458. package/templates/typescript/docker-compose.hbs +11 -0
  459. package/lib/certification/cli-cert-sync-skip.js +0 -21
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Dev CA Install – SSL untrusted detection, fetch CA from Builder Server, install into OS trust store.
3
- * Used by `aifabrix dev init` when the server certificate is self-signed. Only /install-ca uses
4
- * rejectUnauthorized: false; all other requests use default TLS verification.
3
+ * Used by `aifabrix dev init` when the server certificate is self-signed.
4
+ * Requests keep TLS verification enabled by default.
5
5
  *
6
6
  * @fileoverview CA install utilities for development Builder Server
7
7
  * @author AI Fabrix Team
@@ -163,7 +163,7 @@ function finalizeInstallCaResponse(res, absoluteUrl, chunks, resolve, reject) {
163
163
  }
164
164
 
165
165
  /**
166
- * GET absolute install-ca URL with insecure TLS; follow redirects (resolve relative Location).
166
+ * GET absolute install-ca URL with TLS verification enabled; follow redirects.
167
167
  * @param {string} absoluteUrl - Full https URL
168
168
  * @param {number} redirectCount - Redirect depth
169
169
  * @returns {Promise<Buffer>} CA PEM
@@ -179,10 +179,9 @@ function fetchInstallCaAbsolute(absoluteUrl, redirectCount) {
179
179
  reject(new Error('install-ca requires https URL'));
180
180
  return;
181
181
  }
182
- const agent = new https.Agent({ rejectUnauthorized: false });
183
182
  const req = https.get(
184
183
  absoluteUrl,
185
- { agent },
184
+ {},
186
185
  (res) => {
187
186
  if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {
188
187
  res.destroy();
@@ -208,7 +207,7 @@ function fetchInstallCaAbsolute(absoluteUrl, redirectCount) {
208
207
 
209
208
  /**
210
209
  * Fetch CA PEM from Builder Server via GET {baseUrl}/install-ca.
211
- * Uses rejectUnauthorized: false only for this endpoint (dev setup).
210
+ * Uses default TLS verification for this endpoint.
212
211
  * @param {string} baseUrl - Builder Server base URL (no trailing slash)
213
212
  * @returns {Promise<Buffer>} CA certificate PEM
214
213
  */
@@ -44,8 +44,8 @@ function getDevPorts(developerId) {
44
44
  throw new Error('Developer ID must be a positive number');
45
45
  }
46
46
 
47
- // Handle invalids
48
- if (developerId === undefined || developerId === null || Number.isNaN(developerId)) {
47
+ // Handle invalid numeric values
48
+ if (Number.isNaN(developerId)) {
49
49
  throw new Error('Developer ID must be a positive number');
50
50
  }
51
51
  if (developerId < 0 || !Number.isInteger(developerId)) {
@@ -2,10 +2,17 @@
2
2
  * @fileoverview After dev init: merge SSH config Host alias from sync settings / server URL.
3
3
  */
4
4
 
5
+ const path = require('path');
5
6
  const chalk = require('chalk');
6
7
  const config = require('../core/config');
7
8
  const logger = require('./logger');
8
- const { ensureDevSshConfigBlock } = require('./dev-ssh-config-helper');
9
+ const { ensureDevSshConfigBlock, listHostAliasesForUserHost } = require('./dev-ssh-config-helper');
10
+ const { ensureSshDir } = require('./ssh-key-helper');
11
+ const { nodeFs } = require('../internal/node-fs');
12
+ const {
13
+ collectDevSshKnownHostCandidates,
14
+ refreshDevSshKnownHosts
15
+ } = require('./ssh-known-hosts');
9
16
  const { successGlyph } = require('./cli-layout-chalk');
10
17
 
11
18
  /**
@@ -24,6 +31,134 @@ function hostnameFromBaseUrl(baseUrl) {
24
31
  }
25
32
  }
26
33
 
34
+ /**
35
+ * @param {string} sshDir
36
+ * @returns {Promise<string>}
37
+ */
38
+ async function readSshConfigContent(sshDir) {
39
+ const configPath = path.join(ensureSshDir(sshDir), 'config');
40
+ try {
41
+ return await nodeFs().promises.readFile(configPath, 'utf8');
42
+ } catch (e) {
43
+ if (e.code === 'ENOENT') {
44
+ return '';
45
+ }
46
+ throw e;
47
+ }
48
+ }
49
+
50
+ /**
51
+ * @param {Object} p
52
+ * @param {string} p.baseUrl
53
+ * @param {string} p.syncHost
54
+ * @param {string} p.syncUser
55
+ * @param {string} p.hostAlias
56
+ * @param {string} p.existingSshConfig
57
+ * @param {string|number} [p.developerId]
58
+ * @param {string} [p.developerRootDomain]
59
+ * @returns {Promise<void>}
60
+ */
61
+ async function refreshKnownHostsForDevSsh(p) {
62
+ const legacyHostAliases = listHostAliasesForUserHost(
63
+ p.existingSshConfig,
64
+ p.syncHost,
65
+ p.syncUser
66
+ );
67
+ const candidates = collectDevSshKnownHostCandidates({
68
+ syncHost: p.syncHost,
69
+ syncUser: p.syncUser,
70
+ hostAlias: p.hostAlias,
71
+ baseUrl: p.baseUrl,
72
+ developerId: p.developerId,
73
+ developerRootDomain: p.developerRootDomain,
74
+ legacyHostAliases
75
+ });
76
+ const { cleared, failed } = await refreshDevSshKnownHosts(candidates);
77
+ if (cleared.length > 0) {
78
+ logger.log(
79
+ `${chalk.green(' ')}${successGlyph()}${chalk.green(' Cleared stale SSH host keys for ')}` +
80
+ chalk.cyan(cleared.join(', ')) +
81
+ chalk.gray(' (accept the new key on first connect if prompted).')
82
+ );
83
+ }
84
+ if (failed.some((row) => row.error === 'ssh-keygen not found')) {
85
+ logger.log(
86
+ chalk.yellow(
87
+ ' ⚠ ssh-keygen not found; if SSH reports "REMOTE HOST IDENTIFICATION HAS CHANGED", ' +
88
+ `run: ssh-keygen -R ${p.syncHost}`
89
+ )
90
+ );
91
+ }
92
+ }
93
+
94
+ /**
95
+ * @param {string|undefined} developerRootDomain
96
+ * @returns {string|undefined}
97
+ */
98
+ function trimDeveloperRootDomain(developerRootDomain) {
99
+ const trimmed = developerRootDomain && String(developerRootDomain).trim();
100
+ return trimmed || undefined;
101
+ }
102
+
103
+ /**
104
+ * @param {Object} res
105
+ * @param {string} syncUser
106
+ * @param {string} syncHost
107
+ * @returns {void}
108
+ */
109
+ function logSshConfigMergeResult(res, syncUser, syncHost) {
110
+ if (res.skippedDuplicate) {
111
+ logger.log(
112
+ chalk.gray(' SSH config already has ') +
113
+ chalk.cyan(`${syncUser}@${syncHost}`) +
114
+ chalk.gray(` (Host ${res.hostAlias}); left unchanged.`)
115
+ );
116
+ return;
117
+ }
118
+ const prefix =
119
+ `${chalk.green(' ')}${successGlyph()}${chalk.green(' SSH config updated: ')}` +
120
+ chalk.cyan(`Host ${res.hostAlias}`);
121
+ const suffix = res.migratedFrom
122
+ ? chalk.gray(` (was ${res.migratedFrom}) → ${res.configPath}`)
123
+ : chalk.gray(` → ${res.configPath}`);
124
+ logger.log(prefix + suffix);
125
+ }
126
+
127
+ /**
128
+ * @param {Object} p
129
+ * @param {string} p.baseUrl
130
+ * @param {string} p.devId
131
+ * @param {string} p.syncUser
132
+ * @param {string} p.syncHost
133
+ * @param {string|undefined} p.rootTrimmed
134
+ * @returns {Promise<{ hostAlias: string|null, syncUser: string, syncHost: string }>}
135
+ */
136
+ async function mergeDevSshConfigBlock(p) {
137
+ const sshDir = ensureSshDir();
138
+ const existingSshConfig = await readSshConfigContent(sshDir);
139
+ const res = await ensureDevSshConfigBlock(p.syncUser, p.syncHost, sshDir, {
140
+ developerId: p.devId,
141
+ developerRootDomain: p.rootTrimmed
142
+ });
143
+ if (!res.ok || !res.configPath || !res.hostAlias) {
144
+ if (!res.ok && res.error) {
145
+ logger.log(chalk.yellow(` ⚠ Could not update SSH config: ${res.error}`));
146
+ }
147
+ return { hostAlias: null, syncUser: p.syncUser, syncHost: p.syncHost };
148
+ }
149
+ await refreshKnownHostsForDevSsh({
150
+ baseUrl: p.baseUrl,
151
+ syncHost: p.syncHost,
152
+ syncUser: p.syncUser,
153
+ hostAlias: res.hostAlias,
154
+ existingSshConfig,
155
+ developerId: p.devId,
156
+ developerRootDomain: p.rootTrimmed
157
+ });
158
+ logSshConfigMergeResult(res, p.syncUser, p.syncHost);
159
+ return { hostAlias: res.hostAlias, syncUser: p.syncUser, syncHost: p.syncHost };
160
+ }
161
+
27
162
  /**
28
163
  * Update ~/.ssh/config with Host <user>.<host> for interactive SSH; log result.
29
164
  * @param {string} baseUrl - Builder Server base URL
@@ -37,30 +172,37 @@ async function mergeDevSshConfigAfterInit(baseUrl, devId) {
37
172
  return { hostAlias: null, syncUser, syncHost: null };
38
173
  }
39
174
  try {
40
- const res = await ensureDevSshConfigBlock(syncUser, syncHost);
41
- if (res.ok && res.configPath && res.hostAlias) {
42
- if (res.skippedDuplicate) {
43
- logger.log(
44
- chalk.gray(' SSH config already has ') +
45
- chalk.cyan(`${syncUser}@${syncHost}`) +
46
- chalk.gray(` (Host ${res.hostAlias}); left unchanged.`)
47
- );
48
- } else {
49
- logger.log(
50
- `${chalk.green(' ')}${successGlyph()}${chalk.green(' SSH config updated: ')}` +
51
- chalk.cyan(`Host ${res.hostAlias}`) +
52
- chalk.gray(` → ${res.configPath}`)
53
- );
54
- }
55
- return { hostAlias: res.hostAlias, syncUser, syncHost };
56
- }
57
- if (!res.ok && res.error) {
58
- logger.log(chalk.yellow(` ⚠ Could not update SSH config: ${res.error}`));
59
- }
175
+ const rootTrimmed = trimDeveloperRootDomain(await config.getDeveloperRootDomain());
176
+ return await mergeDevSshConfigBlock({
177
+ baseUrl,
178
+ devId,
179
+ syncUser,
180
+ syncHost,
181
+ rootTrimmed
182
+ });
60
183
  } catch (e) {
61
184
  logger.log(chalk.yellow(` ⚠ Could not update SSH config: ${e.message || e}`));
185
+ return { hostAlias: null, syncUser, syncHost };
186
+ }
187
+ }
188
+
189
+ /**
190
+ * @param {{ hostAlias: string|null }} sshInfo
191
+ * @returns {void}
192
+ */
193
+ function logDevSshConnectHint(sshInfo) {
194
+ if (!sshInfo || !sshInfo.hostAlias) {
195
+ return;
62
196
  }
63
- return { hostAlias: null, syncUser, syncHost };
197
+ logger.log(
198
+ chalk.gray(' SSH: ') +
199
+ chalk.cyan(`ssh ${sshInfo.hostAlias}`) +
200
+ chalk.gray(' (host keys refreshed if the server was reprovisioned).')
201
+ );
64
202
  }
65
203
 
66
- module.exports = { mergeDevSshConfigAfterInit, hostnameFromBaseUrl };
204
+ module.exports = {
205
+ mergeDevSshConfigAfterInit,
206
+ logDevSshConnectHint,
207
+ hostnameFromBaseUrl
208
+ };
@@ -0,0 +1,145 @@
1
+ /**
2
+ * @fileoverview Client-side sort for aifabrix dev list (--sort field / -field).
3
+ * @author AI Fabrix Team
4
+ * @version 2.0.0
5
+ */
6
+
7
+ const ALLOWED_SORT_FIELDS = Object.freeze(['id', 'name', 'email', 'until']);
8
+
9
+ /**
10
+ * @param {unknown} id
11
+ * @returns {string}
12
+ */
13
+ function normalizeIdKey(id) {
14
+ const trimmed = String(id ?? '').trim();
15
+ if (!/^\d+$/.test(trimmed)) {
16
+ return trimmed;
17
+ }
18
+ return String(parseInt(trimmed, 10)).padStart(2, '0');
19
+ }
20
+
21
+ /**
22
+ * @param {unknown} a
23
+ * @param {unknown} b
24
+ * @returns {number}
25
+ */
26
+ function compareIds(a, b) {
27
+ const sa = String(a ?? '').trim();
28
+ const sb = String(b ?? '').trim();
29
+ if (/^\d+$/.test(sa) && /^\d+$/.test(sb)) {
30
+ return parseInt(sa, 10) - parseInt(sb, 10);
31
+ }
32
+ return normalizeIdKey(sa).localeCompare(normalizeIdKey(sb), undefined, { sensitivity: 'base' });
33
+ }
34
+
35
+ /**
36
+ * @param {string} a
37
+ * @param {string} b
38
+ * @returns {number}
39
+ */
40
+ function compareText(a, b) {
41
+ return a.localeCompare(b, undefined, { sensitivity: 'base' });
42
+ }
43
+
44
+ /**
45
+ * @param {Object} user
46
+ * @returns {string}
47
+ */
48
+ function untilValue(user) {
49
+ const raw = user && user.certificateValidNotAfter;
50
+ return typeof raw === 'string' ? raw.trim() : '';
51
+ }
52
+
53
+ /**
54
+ * Parse --sort option. Default: name ascending.
55
+ * @param {string|undefined|null} sortOption
56
+ * @returns {{ field: string, descending: boolean }}
57
+ * @throws {Error} When field is empty or not allowed
58
+ */
59
+ function parseSortSpec(sortOption) {
60
+ if (sortOption === undefined || sortOption === null) {
61
+ return { field: 'name', descending: false };
62
+ }
63
+ const trimmed = String(sortOption).trim();
64
+ if (!trimmed) {
65
+ throw new Error(
66
+ 'Invalid --sort value "". Allowed: id, name, email, until (prefix - for descending).'
67
+ );
68
+ }
69
+ let descending = false;
70
+ let fieldPart = trimmed;
71
+ if (fieldPart.startsWith('-')) {
72
+ descending = true;
73
+ fieldPart = fieldPart.slice(1).trim();
74
+ }
75
+ if (!fieldPart) {
76
+ throw new Error(
77
+ 'Invalid --sort value "-". Allowed: id, name, email, until (prefix - for descending).'
78
+ );
79
+ }
80
+ const field = fieldPart.toLowerCase();
81
+ if (!ALLOWED_SORT_FIELDS.includes(field)) {
82
+ throw new Error(
83
+ `Invalid --sort value "${trimmed}". Allowed: id, name, email, until (prefix - for descending).`
84
+ );
85
+ }
86
+ return { field, descending };
87
+ }
88
+
89
+ /**
90
+ * @param {Object} a
91
+ * @param {Object} b
92
+ * @param {string} field
93
+ * @returns {number}
94
+ */
95
+ function compareByField(a, b, field) {
96
+ if (field === 'id') {
97
+ return compareIds(a.id, b.id);
98
+ }
99
+ if (field === 'name') {
100
+ return compareText(String(a.name || ''), String(b.name || ''));
101
+ }
102
+ if (field === 'email') {
103
+ return compareText(String(a.email || ''), String(b.email || ''));
104
+ }
105
+ const ua = untilValue(a);
106
+ const ub = untilValue(b);
107
+ if (!ua && !ub) {
108
+ return 0;
109
+ }
110
+ if (!ua) {
111
+ return 1;
112
+ }
113
+ if (!ub) {
114
+ return -1;
115
+ }
116
+ return compareText(ua, ub);
117
+ }
118
+
119
+ /**
120
+ * Sort developer users without mutating the input array.
121
+ * @param {Object[]} users
122
+ * @param {string|undefined|null} sortOption
123
+ * @returns {Object[]}
124
+ */
125
+ function sortDevUsers(users, sortOption) {
126
+ const { field, descending } = parseSortSpec(sortOption);
127
+ const list = Array.isArray(users) ? [...users] : [];
128
+ list.sort((a, b) => {
129
+ let cmp = compareByField(a, b, field);
130
+ if (descending) {
131
+ cmp = -cmp;
132
+ }
133
+ if (cmp !== 0) {
134
+ return cmp;
135
+ }
136
+ return compareIds(a.id, b.id);
137
+ });
138
+ return list;
139
+ }
140
+
141
+ module.exports = {
142
+ ALLOWED_SORT_FIELDS,
143
+ parseSortSpec,
144
+ sortDevUsers
145
+ };
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Copy-paste onboarding block for `aifabrix dev pin` (admin → developer).
3
+ *
4
+ * @fileoverview Dev PIN share instructions with platform prerequisites
5
+ * @author AI Fabrix Team
6
+ * @version 1.0.0
7
+ */
8
+
9
+ 'use strict';
10
+
11
+ const chalk = require('chalk');
12
+ const logger = require('./logger');
13
+ const { formatSuccessLine } = require('./cli-test-layout-chalk');
14
+
15
+ const NODE_INSTALL_URL = 'https://nodejs.org/';
16
+ const BUILDER_INSTALL_CMD = 'npm install -g @aifabrix/builder';
17
+
18
+ /**
19
+ * @returns {void}
20
+ */
21
+ function logDevPinPrerequisites() {
22
+ logger.log(chalk.bold('Prerequisites (once per machine):'));
23
+ logger.log('');
24
+ logger.log(chalk.cyan('Windows'));
25
+ logger.log(chalk.gray(` 1. Install Node.js 18+ from ${NODE_INSTALL_URL}`));
26
+ logger.log(` 2. ${BUILDER_INSTALL_CMD}`);
27
+ logger.log('');
28
+ logger.log(chalk.cyan('Linux & macOS'));
29
+ logger.log(
30
+ chalk.gray(` 1. Install Node.js 18+ (${NODE_INSTALL_URL} or your package manager)`)
31
+ );
32
+ logger.log(` 2. ${BUILDER_INSTALL_CMD}`);
33
+ logger.log('');
34
+ logger.log(chalk.gray(' After install, `af` is a shortcut for `aifabrix`.'));
35
+ }
36
+
37
+ /**
38
+ * @param {string} baseInit
39
+ * @param {string} id
40
+ * @param {string} [hostsIp]
41
+ * @returns {void}
42
+ */
43
+ function logPinHostsVariantLines(baseInit, id, hostsIp) {
44
+ logger.log(
45
+ chalk.cyan('2) Hosts file / administrator')
46
+ + chalk.gray(
47
+ ' — use when the hostname does not resolve and your organisation does not publish DNS for it. '
48
+ + 'Run in an elevated terminal so the hosts file can be updated, or add the entry manually:'
49
+ )
50
+ );
51
+ if (hostsIp) {
52
+ logger.log(` ${baseInit} --add-hosts --hosts-ip ${hostsIp}`);
53
+ } else {
54
+ logger.log(` ${baseInit} --add-hosts --hosts-ip <server-LAN-IPv4>`);
55
+ logger.log(
56
+ chalk.gray(
57
+ ` Replace <server-LAN-IPv4> with the Builder Server IPv4, or re-run: aifabrix dev pin ${id} --hosts-ip <ip>`
58
+ )
59
+ );
60
+ }
61
+ }
62
+
63
+ /**
64
+ * Log copy-paste dev init commands for the developer (standard vs hosts-file).
65
+ * @param {Object} p
66
+ * @param {string} p.id - Developer ID
67
+ * @param {string} p.serverUrl - Builder Server base URL
68
+ * @param {string} p.pin - One-time PIN
69
+ * @param {string} p.expiresAt - PIN expiry (API string)
70
+ * @param {string} [p.hostsIp] - Optional IPv4 for the hosts variant
71
+ * @returns {void}
72
+ */
73
+ function logDevPinShareInstructions(p) {
74
+ const { id, serverUrl, pin, expiresAt, hostsIp } = p;
75
+ const baseInit = `aifabrix dev init --developer-id ${id} --server ${serverUrl} --pin ${pin}`;
76
+ const pinOnly = `aifabrix dev init --pin ${pin}`;
77
+ logger.log(formatSuccessLine(`PIN created for ${id}, expires ${expiresAt}.`));
78
+ logger.log('');
79
+ logger.log(
80
+ chalk.bold('Share with the developer — prerequisites and onboarding (PIN is one-time):')
81
+ );
82
+ logger.log('');
83
+ logDevPinPrerequisites();
84
+ logger.log('');
85
+ logger.log(chalk.bold('Then run one command to connect (choose the variant that fits):'));
86
+ logger.log('');
87
+ logger.log(
88
+ chalk.cyan('1) Standard')
89
+ + chalk.gray(' — use when this machine can resolve the server hostname (DNS or hosts already set):')
90
+ );
91
+ logger.log(` ${baseInit}`);
92
+ logger.log('');
93
+ logPinHostsVariantLines(baseInit, id, hostsIp);
94
+ logger.log('');
95
+ logger.log(
96
+ chalk.cyan('3) Config already has remote-server + developer-id')
97
+ + chalk.gray(
98
+ ' — e.g. second machine / SSH session after settings were merged; same onboarding, PIN only:'
99
+ )
100
+ );
101
+ logger.log(` ${pinOnly}`);
102
+ logger.log('');
103
+ }
104
+
105
+ module.exports = {
106
+ BUILDER_INSTALL_CMD,
107
+ NODE_INSTALL_URL,
108
+ logDevPinPrerequisites,
109
+ logDevPinShareInstructions
110
+ };
@@ -8,7 +8,6 @@
8
8
 
9
9
  'use strict';
10
10
 
11
- const https = require('https');
12
11
  const config = require('../core/config');
13
12
  const { isLocalhostPublicSchemeHostname } = require('./localhost-public-host');
14
13
 
@@ -68,65 +67,6 @@ async function shouldAllowInsecureDevPlatformTls(url) {
68
67
  }
69
68
  }
70
69
 
71
- /**
72
- * Minimal fetch for self-signed dev platform HTTPS (Node global fetch cannot set rejectUnauthorized).
73
- *
74
- * @param {string} url
75
- * @param {Object} options
76
- * @returns {Promise<{ status: number, statusText: string, headers: { get: Function }, text: Function, json: Function }>}
77
- */
78
- function nodeHttpsFetchInsecure(url, options = {}) {
79
- return new Promise((resolve, reject) => {
80
- const u = new URL(url);
81
- const method = String(options.method || 'GET').toUpperCase();
82
- const headers = { ...(options.headers || {}) };
83
- const body = options.body;
84
- const reqOpts = {
85
- hostname: u.hostname,
86
- port: u.port || 443,
87
- path: `${u.pathname}${u.search}`,
88
- method,
89
- headers,
90
- rejectUnauthorized: false
91
- };
92
-
93
- const req = https.request(reqOpts, (res) => {
94
- const chunks = [];
95
- res.on('data', (chunk) => chunks.push(chunk));
96
- res.on('end', () => {
97
- const raw = Buffer.concat(chunks).toString('utf8');
98
- const status = res.statusCode || 0;
99
- resolve({
100
- ok: status >= 200 && status < 300,
101
- status,
102
- statusText: res.statusMessage || '',
103
- headers: {
104
- get: (name) => res.headers[String(name || '').toLowerCase()] || null
105
- },
106
- text: async() => raw,
107
- json: async() => JSON.parse(raw)
108
- });
109
- });
110
- });
111
-
112
- req.on('error', reject);
113
- if (options.signal) {
114
- const onAbort = () => {
115
- req.destroy(new Error('The operation was aborted'));
116
- };
117
- if (options.signal.aborted) {
118
- onAbort();
119
- return;
120
- }
121
- options.signal.addEventListener('abort', onAbort, { once: true });
122
- }
123
- if (body !== undefined && body !== null) {
124
- req.write(typeof body === 'string' ? body : String(body));
125
- }
126
- req.end();
127
- });
128
- }
129
-
130
70
  /**
131
71
  * @async
132
72
  * @param {string} url
@@ -134,9 +74,6 @@ function nodeHttpsFetchInsecure(url, options = {}) {
134
74
  * @returns {Promise<Response>}
135
75
  */
136
76
  async function fetchWithOptionalDevPlatformTls(url, options = {}) {
137
- if (await shouldAllowInsecureDevPlatformTls(url)) {
138
- return nodeHttpsFetchInsecure(url, options);
139
- }
140
77
  return fetch(url, options);
141
78
  }
142
79