@aifabrix/builder 2.52.0 → 2.53.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 (310) hide show
  1. package/lib/api/datasources-extended.api.js +8 -8
  2. package/lib/api/keycloak.api.js +92 -0
  3. package/lib/api/token-providers.api.js +77 -0
  4. package/lib/api/types/keycloak.types.js +23 -0
  5. package/lib/api/types/token-providers.types.js +65 -0
  6. package/lib/app/deploy-config.js +3 -2
  7. package/lib/app/down.js +16 -1
  8. package/lib/channels/add-channel.js +134 -57
  9. package/lib/channels/approval-guides/chatgpt.js +1 -1
  10. package/lib/channels/approval-guides/index.js +3 -0
  11. package/lib/channels/approval-guides/microsoft-copilot.js +27 -14
  12. package/lib/channels/channel-add-ensure.js +128 -0
  13. package/lib/channels/channel-add-existing.js +72 -0
  14. package/lib/channels/channel-artifact-generator.js +11 -1
  15. package/lib/channels/channel-branding.js +94 -0
  16. package/lib/channels/channel-credential.js +8 -0
  17. package/lib/channels/channel-discovery.js +330 -0
  18. package/lib/channels/channel-external-system.js +1 -1
  19. package/lib/channels/channel-runtime-resolver.js +107 -14
  20. package/lib/channels/channel-status-display.js +36 -3
  21. package/lib/channels/microsoft-copilot-channel-add.js +138 -0
  22. package/lib/channels/microsoft-copilot-entra-sso-form.js +251 -0
  23. package/lib/channels/microsoft-copilot-entra-sso.js +285 -0
  24. package/lib/channels/microsoft-copilot-icons.js +74 -0
  25. package/lib/channels/microsoft-copilot-limits.js +103 -0
  26. package/lib/channels/microsoft-copilot-package.js +178 -52
  27. package/lib/channels/microsoft-copilot-validate.js +227 -0
  28. package/lib/cli/attach-default-help-examples.js +102 -0
  29. package/lib/cli/index.js +4 -0
  30. package/lib/cli/infra-guided.js +13 -6
  31. package/lib/cli/setup-credential-deployment.js +7 -5
  32. package/lib/cli/setup-infra.js +31 -4
  33. package/lib/cli/setup-utility-validate.js +1 -0
  34. package/lib/commands/channel-add-setup.js +28 -9
  35. package/lib/commands/channel.js +14 -10
  36. package/lib/commands/credential-push.js +37 -5
  37. package/lib/commands/integration-definition.js +158 -0
  38. package/lib/commands/package-score.js +72 -0
  39. package/lib/commands/repair-auth-apply.js +19 -5
  40. package/lib/commands/repair-datasource-sync-operations.js +4 -1
  41. package/lib/commands/role-assistant-test-output.js +200 -0
  42. package/lib/commands/role-assistant.js +163 -166
  43. package/lib/datasource/capability/capability-resolve.js +15 -5
  44. package/lib/datasource/capability/copy-operations.js +14 -4
  45. package/lib/deployment/deployer-poll-run.js +2 -2
  46. package/lib/deployment/deployer.js +1 -1
  47. package/lib/deployment/environment.js +2 -2
  48. package/lib/external-system/deploy.js +11 -21
  49. package/lib/infrastructure/index.js +19 -4
  50. package/lib/integration-definition/apply.js +476 -0
  51. package/lib/integration-definition/canonical-json.js +51 -0
  52. package/lib/integration-definition/emit-suite-bid.js +94 -0
  53. package/lib/integration-definition/enrich-crm-field-mappings.js +240 -0
  54. package/lib/integration-definition/enrich-openapi-operations.js +433 -0
  55. package/lib/integration-definition/from-discovery.js +339 -0
  56. package/lib/integration-definition/hash.js +37 -0
  57. package/lib/integration-definition/index.js +37 -0
  58. package/lib/integration-definition/resource-type-catalog.js +59 -0
  59. package/lib/integration-definition/system-kind-enum.js +40 -0
  60. package/lib/integration-definition/validate.js +148 -0
  61. package/lib/lab/package-parity-score.js +417 -0
  62. package/lib/programmatic/builder-api-request.js +5 -1
  63. package/lib/programmatic/builder-help-governance.js +3 -2
  64. package/lib/programmatic/capability-registry.js +20 -0
  65. package/lib/programmatic/help-content/channel-onboarding.md +35 -0
  66. package/lib/programmatic/help-content/cip-overview.md +27 -0
  67. package/lib/programmatic/help-content/connected-system-ui.md +70 -0
  68. package/lib/programmatic/help-content/dimensions-guide.md +23 -0
  69. package/lib/programmatic/help-content/enterprise-sync-fabrix.md +123 -0
  70. package/lib/programmatic/help-content/overview.md +25 -0
  71. package/lib/programmatic/help-content/subscription-guide.md +27 -0
  72. package/lib/programmatic/help-content/workflow.md +50 -0
  73. package/lib/programmatic/openapi-component-schemas.js +7 -1
  74. package/lib/programmatic/openapi-descriptions.js +46 -0
  75. package/lib/programmatic/openapi-envelope-examples.js +280 -0
  76. package/lib/programmatic/openapi-operation-bindings.js +50 -0
  77. package/lib/programmatic/openapi-request-schemas.js +40 -0
  78. package/lib/programmatic/openapi-result-schemas-overflow.js +101 -0
  79. package/lib/programmatic/openapi-result-schemas.js +76 -99
  80. package/lib/programmatic/openapi-schema-descriptions-core.js +25 -4
  81. package/lib/programmatic/openapi-schema-descriptions-help.js +1 -1
  82. package/lib/programmatic/openapi-schema-descriptions-operations.js +43 -0
  83. package/lib/programmatic/openapi-schema-helpers.js +9 -9
  84. package/lib/programmatic/openapi-spec.js +11 -1
  85. package/lib/programmatic/orchestration-openapi-meta.js +10 -0
  86. package/lib/programmatic/persist-supplied-openapi.js +180 -0
  87. package/lib/programmatic/route-handler-map.js +35 -1
  88. package/lib/programmatic/run-channel-package.js +236 -0
  89. package/lib/programmatic/run-integration-definition.js +77 -0
  90. package/lib/role-assistant/evidence-sync.js +55 -7
  91. package/lib/role-assistant/knowledge-sync-logging.js +58 -0
  92. package/lib/role-assistant/knowledge-sync.js +88 -93
  93. package/lib/role-assistant/test-cases-bid.js +155 -0
  94. package/lib/role-assistant/test-cases-evaluate.js +9 -1
  95. package/lib/role-assistant/test-cases-honesty.js +24 -10
  96. package/lib/role-assistant/test-cases.js +28 -0
  97. package/lib/role-assistant/test-runner-attachments.js +118 -0
  98. package/lib/role-assistant/test-runner-bid-apply.js +201 -0
  99. package/lib/role-assistant/test-runner-bid-document.js +278 -0
  100. package/lib/role-assistant/test-runner-start-payload.js +96 -0
  101. package/lib/role-assistant/test-runner-workhub-answers.js +249 -20
  102. package/lib/role-assistant/test-runner-workhub-helpers.js +100 -0
  103. package/lib/role-assistant/test-runner-workhub-soft.js +86 -0
  104. package/lib/role-assistant/test-runner-workhub.js +152 -107
  105. package/lib/role-assistant/test-runner.js +5 -63
  106. package/lib/role-assistant/test-suite.js +112 -0
  107. package/lib/schema/application-schema.json +56 -6
  108. package/lib/schema/external-datasource.schema.json +103 -17
  109. package/lib/schema/external-system.schema.json +54 -3
  110. package/lib/schema/integration-definition.schema.json +195 -0
  111. package/lib/utils/authentication-shape.js +6 -0
  112. package/lib/utils/compose-generator.js +10 -1
  113. package/lib/utils/compose-traefik-extra-routes.js +107 -0
  114. package/lib/utils/docker-build.js +2 -2
  115. package/lib/utils/help-builder.js +3 -1
  116. package/lib/utils/promote-dev-docker-image.js +102 -18
  117. package/lib/utils/transient-developer-id.js +28 -0
  118. package/package.json +14 -16
  119. package/templates/README.md +12 -1
  120. package/templates/applications/dataplane/application.yaml +10 -2
  121. package/templates/applications/dataplane/env.template +7 -6
  122. package/templates/applications/miso-controller/application.yaml +23 -8
  123. package/templates/applications/miso-controller/env.template +8 -2
  124. package/templates/applications/miso-controller/rbac.yaml +1 -0
  125. package/templates/channels/README.md +11 -1
  126. package/templates/channels/brand/color-192.png +0 -0
  127. package/templates/channels/brand/dark/128.png +0 -0
  128. package/templates/channels/brand/dark/192.png +0 -0
  129. package/templates/channels/brand/dark/256.png +0 -0
  130. package/templates/channels/brand/dark/32.png +0 -0
  131. package/templates/channels/brand/dark/512.png +0 -0
  132. package/templates/channels/brand/dark/64.png +0 -0
  133. package/templates/channels/brand/light/128.png +0 -0
  134. package/templates/channels/brand/light/192.png +0 -0
  135. package/templates/channels/brand/light/256.png +0 -0
  136. package/templates/channels/brand/light/32.png +0 -0
  137. package/templates/channels/brand/light/512.png +0 -0
  138. package/templates/channels/brand/light/64.png +0 -0
  139. package/templates/channels/brand/mono-white/128.png +0 -0
  140. package/templates/channels/brand/mono-white/192.png +0 -0
  141. package/templates/channels/brand/mono-white/256.png +0 -0
  142. package/templates/channels/brand/mono-white/32.png +0 -0
  143. package/templates/channels/brand/mono-white/512.png +0 -0
  144. package/templates/channels/brand/mono-white/64.png +0 -0
  145. package/templates/channels/brand/outline-32.png +0 -0
  146. package/templates/channels/chatgpt/install.template.md.hbs +6 -4
  147. package/templates/channels/chatgpt/integration/README.md +4 -5
  148. package/templates/channels/chatgpt/integration/chatgpt-system.json +1 -16
  149. package/templates/channels/microsoft-copilot/ai-plugin.template.json.hbs +14 -16
  150. package/templates/channels/microsoft-copilot/declarative-agent.template.json.hbs +5 -3
  151. package/templates/channels/microsoft-copilot/entra-sso-registration.template.md.hbs +30 -0
  152. package/templates/channels/microsoft-copilot/fi-fi.template.json.hbs +7 -0
  153. package/templates/channels/microsoft-copilot/install.template.md.hbs +93 -22
  154. package/templates/channels/microsoft-copilot/integration/README.md +2 -3
  155. package/templates/channels/microsoft-copilot/integration/microsoft-copilot-system.json +1 -22
  156. package/templates/channels/microsoft-copilot/manifest.template.json.hbs +34 -19
  157. package/templates/channels/microsoft-copilot/oauth-plugin-vault-required.template.md.hbs +15 -0
  158. package/templates/channels/slack/integration/README.md +2 -4
  159. package/templates/channels/teams-bot/install.template.md.hbs +4 -0
  160. package/templates/channels/teams-bot/integration/README.md +3 -5
  161. package/templates/channels/web-embed/integration/web-embed-system.json +1 -16
  162. package/templates/python/docker-compose.hbs +36 -0
  163. package/templates/typescript/docker-compose.hbs +36 -0
  164. package/.cursor/plans/Done/157.1-security-quality-violations-by-type.csv +0 -374
  165. package/.cursor/process/README.md +0 -9
  166. package/.cursor/rules/anchor-docs.mdc +0 -15
  167. package/.cursor/rules/assistant-driven-integration-build.mdc +0 -40
  168. package/.cursor/rules/cli-layout.mdc +0 -81
  169. package/.cursor/rules/cli-product-neutral.mdc +0 -43
  170. package/.cursor/rules/deploy-rules/docker-image-ip-policy.mdc +0 -49
  171. package/.cursor/rules/docs-rules.mdc +0 -32
  172. package/.cursor/rules/plan-rules/application-lifecycle.mdc +0 -30
  173. package/.cursor/rules/plan-rules/plan-frontmatter.mdc +0 -35
  174. package/.cursor/rules/plan-rules/plan-lifecycle.mdc +0 -31
  175. package/.cursor/rules/plan-rules/plan-validation-gate.mdc +0 -34
  176. package/.cursor/rules/project-rules.mdc +0 -913
  177. package/.cursor/skills/README.md +0 -15
  178. package/.dockerignore +0 -52
  179. package/.eslintignore +0 -22
  180. package/.markdownlint.json +0 -14
  181. package/anchor-docs/README.md +0 -10
  182. package/anchor-docs/_TEMPLATE +0 -24
  183. package/babel.config.js +0 -6
  184. package/bin/builder-api-cleanup.js +0 -26
  185. package/bin/builder-api-nest.js +0 -10
  186. package/bin/builder-api-spike.js +0 -19
  187. package/enterprise-knowledge/README.md +0 -50
  188. package/enterprise-knowledge/enterprise-integration-lifecycle/README.md +0 -22
  189. package/enterprise-knowledge/enterprise-integration-lifecycle/application.json +0 -15
  190. package/enterprise-knowledge/enterprise-integration-lifecycle/deploy.js +0 -69
  191. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-deploy.json +0 -52
  192. package/enterprise-knowledge/enterprise-integration-lifecycle/enterprise-integration-lifecycle-system.json +0 -29
  193. package/enterprise-knowledge/enterprise-integration-lifecycle/env.template +0 -2
  194. package/integration/README.md +0 -81
  195. package/integration/github/README.md +0 -53
  196. package/integration/github/application.json +0 -21
  197. package/integration/github/deploy.js +0 -72
  198. package/integration/github/env.template +0 -11
  199. package/integration/github/github-datasource-issue-comments.json +0 -239
  200. package/integration/github/github-datasource-issues.json +0 -399
  201. package/integration/github/github-datasource-repository.json +0 -354
  202. package/integration/github/github-deploy.json +0 -1202
  203. package/integration/github/github-system.json +0 -82
  204. package/integration/hubspot-test/README.md +0 -159
  205. package/integration/hubspot-test/application.json +0 -54
  206. package/integration/hubspot-test/companies.json +0 -2048
  207. package/integration/hubspot-test/create-hubspot.js +0 -523
  208. package/integration/hubspot-test/env.template +0 -4
  209. package/integration/hubspot-test/hubspot-test-datasource-company.json +0 -138
  210. package/integration/hubspot-test/hubspot-test-datasource-contact.json +0 -146
  211. package/integration/hubspot-test/hubspot-test-datasource-deal.json +0 -146
  212. package/integration/hubspot-test/hubspot-test-datasource-users.json +0 -76
  213. package/integration/hubspot-test/hubspot-test-deploy.json +0 -2160
  214. package/integration/hubspot-test/hubspot-test-system.json +0 -74
  215. package/integration/hubspot-test/rbac.json +0 -166
  216. package/integration/hubspot-test/test-artifacts/wizard-hubspot-credential-real.yaml +0 -20
  217. package/integration/hubspot-test/test-artifacts/wizard-hubspot-env-vars.yaml +0 -9
  218. package/integration/hubspot-test/test-artifacts/wizard-invalid-add-datasource.yaml +0 -5
  219. package/integration/hubspot-test/test-artifacts/wizard-invalid-app-name.yaml +0 -5
  220. package/integration/hubspot-test/test-artifacts/wizard-invalid-credential-create.yaml +0 -7
  221. package/integration/hubspot-test/test-artifacts/wizard-invalid-credential-select.yaml +0 -7
  222. package/integration/hubspot-test/test-artifacts/wizard-invalid-known-platform.yaml +0 -4
  223. package/integration/hubspot-test/test-artifacts/wizard-invalid-missing-app.yaml +0 -4
  224. package/integration/hubspot-test/test-artifacts/wizard-invalid-missing-source.yaml +0 -2
  225. package/integration/hubspot-test/test-artifacts/wizard-invalid-mode.yaml +0 -5
  226. package/integration/hubspot-test/test-artifacts/wizard-invalid-openapi-file.yaml +0 -5
  227. package/integration/hubspot-test/test-artifacts/wizard-invalid-openapi-url.yaml +0 -4
  228. package/integration/hubspot-test/test-artifacts/wizard-invalid-source.yaml +0 -4
  229. package/integration/hubspot-test/test-artifacts/wizard-valid-for-dimension-array-test.yaml +0 -5
  230. package/integration/hubspot-test/test-artifacts/wizard-valid-for-dimension-key-test.yaml +0 -5
  231. package/integration/hubspot-test/test-artifacts/wizard-valid-for-dimension-path-test.yaml +0 -5
  232. package/integration/hubspot-test/test-artifacts/wizard-valid-for-dimension-test.yaml +0 -5
  233. package/integration/hubspot-test/test-artifacts/wizard-valid-for-rbac-test.yaml +0 -5
  234. package/integration/hubspot-test/test-artifacts/wizard-valid-for-rbac-yaml-test.yaml +0 -5
  235. package/integration/hubspot-test/test-dataplane-down-helpers.js +0 -249
  236. package/integration/hubspot-test/test-dataplane-down-tests.js +0 -386
  237. package/integration/hubspot-test/test-dataplane-down.js +0 -209
  238. package/integration/hubspot-test/test.js +0 -1588
  239. package/integration/hubspot-test/wizard-hubspot-e2e.yaml +0 -16
  240. package/integration/hubspot-test/wizard-hubspot-platform.yaml +0 -8
  241. package/integration/hubspot-test/wizard-hubspot-test-headless.yaml +0 -23
  242. package/integration/roundtrip-test-local/README.md +0 -143
  243. package/integration/roundtrip-test-local/application.yaml +0 -13
  244. package/integration/roundtrip-test-local/env.template +0 -15
  245. package/integration/roundtrip-test-local/roundtrip-test-local-datasource-roundtrip-test-company.yaml +0 -14
  246. package/integration/roundtrip-test-local/roundtrip-test-local-deploy.json +0 -61
  247. package/integration/roundtrip-test-local/roundtrip-test-local-system.yaml +0 -25
  248. package/integration/roundtrip-test-local2/README.md +0 -143
  249. package/integration/roundtrip-test-local2/application.yaml +0 -13
  250. package/integration/roundtrip-test-local2/env.template +0 -15
  251. package/integration/roundtrip-test-local2/roundtrip-test-local2-datasource-company.yaml +0 -31
  252. package/integration/roundtrip-test-local2/roundtrip-test-local2-deploy.json +0 -86
  253. package/integration/roundtrip-test-local2/roundtrip-test-local2-system.yaml +0 -25
  254. package/integration/test/wizard.yaml +0 -8
  255. package/jest.config.coverage.js +0 -37
  256. package/jest.config.default.js +0 -11
  257. package/jest.config.integration.fixtures.js +0 -22
  258. package/jest.config.integration.js +0 -33
  259. package/jest.config.isolated.js +0 -11
  260. package/jest.config.manual.js +0 -30
  261. package/jest.global-live-fabrix-hooks.js +0 -36
  262. package/jest.isolated-projects.js +0 -260
  263. package/jest.projects.js +0 -76
  264. package/packages/builder-api/README.md +0 -120
  265. package/packages/builder-api/package.json +0 -30
  266. package/packages/builder-api/src/app.module.ts +0 -7
  267. package/packages/builder-api/src/auth/auth.module.ts +0 -5
  268. package/packages/builder-api/src/external-system/external-system.module.ts +0 -5
  269. package/packages/builder-api/src/main.ts +0 -16
  270. package/packages/builder-api/tsconfig.json +0 -15
  271. package/scripts/check-builder-api-architecture-grep.js +0 -79
  272. package/scripts/check-datasource-test-run-schema-sync.js +0 -34
  273. package/scripts/ci-fix.sh +0 -19
  274. package/scripts/ci-simulate.sh +0 -19
  275. package/scripts/diagnose-cli.js +0 -150
  276. package/scripts/docker_image_content_gate.js +0 -47
  277. package/scripts/docker_image_content_gate.sh +0 -5
  278. package/scripts/export-builder-api-evidence.js +0 -262
  279. package/scripts/install-local.js +0 -490
  280. package/scripts/lib/builder-api-docker-staging-copy.js +0 -60
  281. package/scripts/lib/builder-api-docker-staging-core.js +0 -183
  282. package/scripts/lib/docker-image-content-gate-core.js +0 -166
  283. package/scripts/lib/plan-actor.js +0 -109
  284. package/scripts/lib/plan-config.js +0 -20
  285. package/scripts/lib/plan-gates.js +0 -154
  286. package/scripts/lib/plan-meta.js +0 -104
  287. package/scripts/lib/plan-parse.js +0 -162
  288. package/scripts/lib/plan-prevalidate-gates.js +0 -337
  289. package/scripts/lib/plan-run-core.js +0 -125
  290. package/scripts/lib/plan-run-report.js +0 -119
  291. package/scripts/plan-approve.js +0 -24
  292. package/scripts/plan-archive.js +0 -49
  293. package/scripts/plan-run.js +0 -13
  294. package/scripts/plan-set-actor.js +0 -21
  295. package/scripts/plan-validate.js +0 -80
  296. package/scripts/pnpm/af.mjs +0 -110
  297. package/scripts/pnpm/check-quiet.mjs +0 -32
  298. package/scripts/pnpm/dev-install.mjs +0 -29
  299. package/scripts/pnpm/dev-reload.mjs +0 -18
  300. package/scripts/pnpm/help.mjs +0 -55
  301. package/scripts/pnpm/lib/dev-reload-core.mjs +0 -189
  302. package/scripts/pnpm/lib/dev-reload-log-capture.mjs +0 -67
  303. package/scripts/pnpm/lib/dev-reload-log-utils.mjs +0 -32
  304. package/scripts/pnpm/lib/resolve-aifabrix-bin.mjs +0 -124
  305. package/scripts/pnpm/lib/resolve-app-url.mjs +0 -183
  306. package/scripts/pnpm/lib/spinner.mjs +0 -42
  307. package/scripts/pnpm-global-remove.js +0 -48
  308. package/scripts/stage_builder_api_for_docker.js +0 -65
  309. package/scripts/sync-builder-api-template.js +0 -44
  310. package/scripts/test-dataplane-bootstrap.js +0 -331
@@ -1,65 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Stage builder-api runtime files for Docker image build (plan 154.3).
4
- *
5
- * @fileoverview Host-side staging before `docker build`
6
- * @author AI Fabrix Team
7
- * @version 1.0.0
8
- */
9
-
10
- 'use strict';
11
-
12
- const fs = require('fs');
13
- const path = require('path');
14
- const {
15
- discoverRuntimeFiles,
16
- findManifestViolations
17
- } = require('./lib/builder-api-docker-staging-core');
18
- const { stageFiles } = require('./lib/builder-api-docker-staging-copy');
19
-
20
- const REPO_ROOT = path.resolve(__dirname, '..');
21
-
22
- /**
23
- * @param {string[]} argv
24
- * @returns {number}
25
- */
26
- function main(argv) {
27
- const args = argv.slice(2);
28
- let destination = path.join(REPO_ROOT, 'docker-builder-api-staging');
29
- let manifestPath = '';
30
-
31
- for (let i = 0; i < args.length; i += 1) {
32
- if (args[i] === '--destination' && args[i + 1]) {
33
- destination = path.resolve(args[i + 1]);
34
- i += 1;
35
- } else if (args[i] === '--manifest' && args[i + 1]) {
36
- manifestPath = path.resolve(args[i + 1]);
37
- i += 1;
38
- }
39
- }
40
-
41
- const manifest = discoverRuntimeFiles(REPO_ROOT);
42
- const violations = findManifestViolations(manifest);
43
- if (violations.length > 0) {
44
- console.error('Staging manifest contains forbidden paths:');
45
- for (const item of violations) {
46
- console.error(` - ${item}`);
47
- }
48
- return 1;
49
- }
50
-
51
- const staged = stageFiles(REPO_ROOT, destination, manifest);
52
- if (manifestPath) {
53
- fs.mkdirSync(path.dirname(manifestPath), { recursive: true });
54
- fs.writeFileSync(manifestPath, `${JSON.stringify(staged, null, 2)}\n`, 'utf8');
55
- }
56
-
57
- console.log(`OK: staged ${staged.length} files → ${destination}`);
58
- return 0;
59
- }
60
-
61
- if (require.main === module) {
62
- process.exit(main(process.argv));
63
- }
64
-
65
- module.exports = { main };
@@ -1,44 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Publish builder/builder-api/ SSOT → templates/applications/builder-api/
4
- * (manifest files only — no README; use builder/builder-api/README.md and packages/builder-api/README.md)
5
- *
6
- * @fileoverview sync-json for builder-api platform app (plan 154.2)
7
- * @author AI Fabrix Team
8
- * @version 1.0.0
9
- */
10
-
11
- 'use strict';
12
-
13
- const fs = require('fs');
14
- const path = require('path');
15
-
16
- const REPO_ROOT = path.resolve(__dirname, '..');
17
- const SSOT_DIR = path.join(REPO_ROOT, 'builder', 'builder-api');
18
- const TEMPLATE_DIR = path.join(REPO_ROOT, 'templates', 'applications', 'builder-api');
19
-
20
- const SYNC_FILES = ['application.yaml', 'Dockerfile', 'env.template'];
21
-
22
- /**
23
- * Publish builder/builder-api/ SSOT → templates/applications/builder-api/
24
- * @returns {void}
25
- */
26
- function main() {
27
- if (!fs.existsSync(SSOT_DIR)) {
28
- console.error(`Missing SSOT directory: ${SSOT_DIR}`);
29
- process.exit(1);
30
- }
31
- fs.mkdirSync(TEMPLATE_DIR, { recursive: true });
32
- for (const name of SYNC_FILES) {
33
- const src = path.join(SSOT_DIR, name);
34
- const dest = path.join(TEMPLATE_DIR, name);
35
- if (!fs.existsSync(src)) {
36
- console.error(`Missing SSOT file: ${src}`);
37
- process.exit(1);
38
- }
39
- fs.copyFileSync(src, dest);
40
- console.log(`sync-json: ${path.relative(REPO_ROOT, src)} → ${path.relative(REPO_ROOT, dest)}`);
41
- }
42
- }
43
-
44
- main();
@@ -1,331 +0,0 @@
1
- #!/usr/bin/env node
2
- /* eslint-disable no-console, require-jsdoc, max-lines-per-function, max-statements */
3
-
4
- /**
5
- * Diagnose and optionally exercise dataplane bootstrap provisioning (plan 197.0).
6
- *
7
- * @fileoverview Manual test / diagnostic for dataplane bootstrap API
8
- *
9
- * Usage (from aifabrix-builder repo root):
10
- * node scripts/test-dataplane-bootstrap.js
11
- * node scripts/test-dataplane-bootstrap.js --probe-api
12
- * node scripts/test-dataplane-bootstrap.js --call-bootstrap
13
- * node scripts/test-dataplane-bootstrap.js --controller-url http://localhost:3100 --probe-api
14
- */
15
-
16
- 'use strict';
17
-
18
- const path = require('path');
19
-
20
- const ROOT = path.join(__dirname, '..');
21
-
22
- function parseArgs(argv) {
23
- const out = {
24
- controllerUrl: null,
25
- envKey: 'dev',
26
- probeApi: false,
27
- callBootstrap: false,
28
- help: false
29
- };
30
- for (let i = 2; i < argv.length; i += 1) {
31
- const arg = argv[i];
32
- if (arg === '--help' || arg === '-h') {
33
- out.help = true;
34
- } else if (arg === '--probe-api') {
35
- out.probeApi = true;
36
- } else if (arg === '--call-bootstrap') {
37
- out.callBootstrap = true;
38
- out.probeApi = true;
39
- } else if (arg === '--controller-url' && argv[i + 1]) {
40
- out.controllerUrl = String(argv[++i]).trim();
41
- } else if (arg === '--env-key' && argv[i + 1]) {
42
- out.envKey = String(argv[++i]).trim().toLowerCase();
43
- } else {
44
- throw new Error(`Unknown argument: ${arg}`);
45
- }
46
- }
47
- return out;
48
- }
49
-
50
- function printHelp() {
51
- console.log(`\
52
- Dataplane bootstrap diagnostic
53
-
54
- node scripts/test-dataplane-bootstrap.js [options]
55
-
56
- Options:
57
- --controller-url <url> Override controller base URL (default: ~/.aifabrix/config.yaml)
58
- --env-key <key> Environment for bootstrap (default: dev)
59
- --probe-api POST .../applications/bootstrap (idempotent register/check)
60
- --call-bootstrap Same as --probe-api + save credentials locally (up-dataplane path)
61
- -h, --help Show this help
62
-
63
- Default (no flags): read-only gate checks — no API mutation.
64
-
65
- Bootstrap avoids device login when ALL are true:
66
- - environment is dev
67
- - Docker CLI + Compose on this machine
68
- - merged secrets have miso-controller-secrets-encryptionKeyVault (= controller ENCRYPTION_KEY)
69
- - controller /health OK
70
- `);
71
- }
72
-
73
- function line(label, value, ok) {
74
- const mark = ok === true ? 'OK' : ok === false ? 'FAIL' : '—';
75
- console.log(` [${mark}] ${label}: ${value}`);
76
- }
77
-
78
- function loadBuilderModules() {
79
- return {
80
- config: require(path.join(ROOT, 'lib/core/config')),
81
- docker: require(path.join(ROOT, 'lib/utils/docker')),
82
- loadSecrets: require(path.join(ROOT, 'lib/core/secrets-load')).loadSecrets,
83
- checkHealthEndpoint: require(path.join(ROOT, 'lib/utils/health-check-request')).checkHealthEndpoint,
84
- resolveControllerUrl: require(path.join(ROOT, 'lib/utils/controller-url')).resolveControllerUrl,
85
- canUseBootstrapProvision: require(path.join(ROOT, 'lib/commands/up-dataplane-bootstrap'))
86
- .canUseBootstrapProvision,
87
- resolveBootstrapEncryptionKey: require(path.join(ROOT, 'lib/commands/up-dataplane-bootstrap'))
88
- .resolveBootstrapEncryptionKey,
89
- bootstrapDataplaneApplication: require(path.join(ROOT, 'lib/commands/up-dataplane-bootstrap'))
90
- .bootstrapDataplaneApplication,
91
- buildDataplaneImageRef: require(path.join(ROOT, 'lib/commands/up-dataplane')).buildDataplaneImageRef,
92
- bootstrapApplication: require(path.join(ROOT, 'lib/api/applications.api')).bootstrapApplication,
93
- loadVariablesYaml: require(path.join(ROOT, 'lib/utils/app-register-config')).loadVariablesYaml,
94
- extractAppConfiguration: require(path.join(ROOT, 'lib/utils/app-register-config')).extractAppConfiguration,
95
- buildRegistrationData: require(path.join(ROOT, 'lib/app/register')).buildRegistrationData,
96
- applyLocalhostPortAdjustment: require(path.join(ROOT, 'lib/app/register')).applyLocalhostPortAdjustment
97
- };
98
- }
99
-
100
- async function runGateChecks(mods, controllerOverride) {
101
- console.log('Prerequisites (canUseBootstrapProvision gates):');
102
- const gates = {
103
- devEnv: await checkEnvironmentGate(mods.config),
104
- docker: await checkDockerGate(mods.docker),
105
- encryptionKey: await checkEncryptionKeyGate(
106
- mods.resolveBootstrapEncryptionKey,
107
- mods.loadSecrets
108
- )
109
- };
110
-
111
- const controllerUrl = await resolveControllerBaseUrl(
112
- mods.config,
113
- mods.resolveControllerUrl,
114
- controllerOverride
115
- );
116
- line('controller URL', controllerUrl, null);
117
- gates.controllerHealthy = await checkControllerHealth(controllerUrl, mods.checkHealthEndpoint);
118
-
119
- const eligible = await mods.canUseBootstrapProvision({ skipInfraCheck: true });
120
- console.log('');
121
- line('canUseBootstrapProvision', eligible ? 'true' : 'false', eligible);
122
- printDeviceLoginReasons(gates);
123
-
124
- return { gates, controllerUrl, eligible };
125
- }
126
-
127
- async function checkEnvironmentGate(config) {
128
- const cfg = await config.getConfig();
129
- const env = cfg && cfg.environment ? String(cfg.environment) : 'dev';
130
- const ok = env === 'dev';
131
- line('config environment', env, ok);
132
- if (!ok) {
133
- console.log(' → Bootstrap only runs in dev. Set: aifabrix auth --set-environment dev');
134
- }
135
- return ok;
136
- }
137
-
138
- async function checkDockerGate(docker) {
139
- try {
140
- await docker.ensureDockerAndCompose();
141
- line('Docker CLI + Compose', 'available', true);
142
- return true;
143
- } catch (err) {
144
- line('Docker CLI + Compose', err.message || 'unavailable', false);
145
- console.log(' → Bootstrap requires local Docker (same machine as aifabrix run dataplane).');
146
- return false;
147
- }
148
- }
149
-
150
- async function checkEncryptionKeyGate(resolveBootstrapEncryptionKey, loadSecrets) {
151
- const key = await resolveBootstrapEncryptionKey();
152
- const ok = Boolean(key && String(key).trim());
153
- line(
154
- 'bootstrap ENCRYPTION_KEY (merged secrets)',
155
- ok ? `present (${String(key).length} chars, not shown)` : 'missing',
156
- ok
157
- );
158
- if (!ok) {
159
- const secrets = await loadSecrets(undefined);
160
- const keys = secrets && typeof secrets === 'object' ? Object.keys(secrets) : [];
161
- const hints = keys.filter((k) => /encryption/i.test(k));
162
- console.log(
163
- ' → Need miso-controller-secrets-encryptionKeyVault in secrets (after up-miso resolve).'
164
- );
165
- if (hints.length) {
166
- console.log(` → Secret keys containing "encryption": ${hints.join(', ')}`);
167
- }
168
- console.log(
169
- ' → config.yaml secrets-encryption is CLI file crypto only — not the bootstrap header key.'
170
- );
171
- }
172
- return ok;
173
- }
174
-
175
- async function resolveControllerBaseUrl(config, resolveControllerUrl, override) {
176
- if (override) {
177
- return override.replace(/\/+$/, '');
178
- }
179
- const cfg = await config.getConfig();
180
- const platform = cfg.platformController || cfg.controller;
181
- if (platform && String(platform).trim()) {
182
- return String(platform).trim().replace(/\/+$/, '');
183
- }
184
- return (await resolveControllerUrl()).replace(/\/+$/, '');
185
- }
186
-
187
- async function checkControllerHealth(controllerUrl, checkHealthEndpoint) {
188
- const healthUrl = `${controllerUrl}/health`;
189
- try {
190
- const ok = await checkHealthEndpoint(healthUrl, false);
191
- line('controller health', healthUrl, ok);
192
- if (!ok) {
193
- console.log(' → Start platform: aifabrix up-infra && aifabrix up-miso (or af setup).');
194
- }
195
- return ok;
196
- } catch (err) {
197
- line('controller health', `${healthUrl} (${err.message})`, false);
198
- return false;
199
- }
200
- }
201
-
202
- async function buildRegistrationPayload(mods, controllerUrl, envKey) {
203
- const { variables } = await mods.loadVariablesYaml('dataplane');
204
- const appConfig = await mods.extractAppConfiguration(variables, 'dataplane', {});
205
- await mods.applyLocalhostPortAdjustment(appConfig, controllerUrl, {});
206
- const imageOverride = mods.buildDataplaneImageRef({});
207
- return mods.buildRegistrationData(appConfig, {
208
- imageOverride,
209
- image: imageOverride,
210
- envKey
211
- });
212
- }
213
-
214
- async function probeBootstrapApi(controllerUrl, encryptionKey, envKey, mods) {
215
- const pathSuffix = `/api/v1/environments/${envKey}/applications/bootstrap`;
216
- console.log('');
217
- console.log('Bootstrap API probe (--probe-api):');
218
- line('endpoint', `${controllerUrl}${pathSuffix}`, null);
219
-
220
- const registrationData = await buildRegistrationPayload(mods, controllerUrl, envKey);
221
- const response = await mods.bootstrapApplication(
222
- controllerUrl,
223
- envKey,
224
- encryptionKey,
225
- registrationData
226
- );
227
-
228
- if (!response.success) {
229
- return reportBootstrapFailure(response);
230
- }
231
-
232
- const data = response.data?.data || response.data;
233
- const status = data?.status || (data?.application ? 'created' : 'ok');
234
- const appKey = data?.application?.key || registrationData.key;
235
- line('bootstrap API', `OK (${status}, app: ${appKey})`, true);
236
- return true;
237
- }
238
-
239
- function reportBootstrapFailure(response) {
240
- const msg = response.formattedError || response.error || 'request failed';
241
- if (/401|403|encryption|Unauthorized/i.test(String(msg))) {
242
- line('x-encryption-key', 'rejected by controller', false);
243
- console.log(' → Controller ENCRYPTION_KEY does not match merged secrets vault key.');
244
- return false;
245
- }
246
- if (/503|not configured/i.test(String(msg))) {
247
- line('bootstrap on controller', 'disabled (ENCRYPTION_KEY unset on controller)', false);
248
- return false;
249
- }
250
- line('bootstrap API', msg, false);
251
- return false;
252
- }
253
-
254
- function printDeviceLoginReasons(gates) {
255
- console.log('');
256
- console.log('Why setup may ask for device login instead of bootstrap:');
257
- if (!gates.devEnv) console.log(' • environment is not dev');
258
- if (!gates.docker) console.log(' • Docker/Compose not available on this host');
259
- if (!gates.encryptionKey) console.log(' • bootstrap encryption key missing from merged secrets');
260
- if (!gates.controllerHealthy) {
261
- console.log(' • controller not healthy (setup may still run auth before dataplane step)');
262
- }
263
- if (gates.devEnv && gates.docker && gates.encryptionKey && gates.controllerHealthy) {
264
- console.log(' • All bootstrap gates pass — setup should show "Bootstrap provision (no device login)"');
265
- console.log(' • If dataplane still missing, check setup logs after "Starting Dataplane..."');
266
- }
267
- }
268
-
269
- async function main() {
270
- const args = parseArgs(process.argv);
271
- if (args.help) {
272
- printHelp();
273
- process.exit(0);
274
- }
275
-
276
- console.log('Dataplane bootstrap diagnostic');
277
- console.log('================================');
278
- console.log('');
279
-
280
- const mods = loadBuilderModules();
281
- await mods.config.ensureSecretsEncryptionKey();
282
-
283
- const { gates, controllerUrl, eligible } = await runGateChecks(mods, args.controllerUrl);
284
-
285
- if (!gates.controllerHealthy || !gates.encryptionKey) {
286
- console.log('');
287
- console.log('Fix failing gates above, then re-run with --probe-api.');
288
- process.exit(1);
289
- }
290
-
291
- if (!args.probeApi) {
292
- console.log('');
293
- console.log('Read-only checks done. To exercise bootstrap API:');
294
- console.log(' node scripts/test-dataplane-bootstrap.js --probe-api');
295
- process.exit(eligible ? 0 : 1);
296
- }
297
-
298
- const encryptionKey = await mods.resolveBootstrapEncryptionKey();
299
- const apiOk = await probeBootstrapApi(controllerUrl, encryptionKey, args.envKey, mods);
300
- if (!apiOk) {
301
- process.exit(1);
302
- }
303
-
304
- if (!args.callBootstrap) {
305
- process.exit(0);
306
- }
307
-
308
- if (!eligible) {
309
- console.error('');
310
- console.error('Refusing --call-bootstrap: canUseBootstrapProvision is false.');
311
- process.exit(1);
312
- }
313
-
314
- console.log('');
315
- console.log('Saving credentials via bootstrapDataplaneApplication...');
316
- await mods.bootstrapDataplaneApplication(
317
- { skipInfraCheck: true },
318
- controllerUrl,
319
- args.envKey,
320
- mods.buildDataplaneImageRef
321
- );
322
- console.log('');
323
- console.log('Done. Next: aifabrix deploy dataplane --local or aifabrix run dataplane');
324
- process.exit(0);
325
- }
326
-
327
- main().catch((err) => {
328
- console.error('');
329
- console.error(`Error: ${err.message}`);
330
- process.exit(1);
331
- });