@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
@@ -53,6 +53,29 @@ const OPENAPI_REQUEST_SCHEMAS = {
53
53
  sync: { type: 'boolean' }
54
54
  }),
55
55
  CreateSystemRequest: frozenObject({ systemKey: schemaRef('SystemKey') }, ['systemKey']),
56
+ PersistSuppliedOpenApiDocument: frozenObject(
57
+ {
58
+ filename: { type: 'string' },
59
+ name: { type: 'string' },
60
+ mediaType: { type: 'string' },
61
+ digest: { type: 'string' },
62
+ body: {
63
+ description: 'Authorized OpenAPI document object or JSON string (Runtime-resolved).',
64
+ oneOf: [{ type: 'object', additionalProperties: true }, { type: 'string' }]
65
+ }
66
+ },
67
+ ['body']
68
+ ),
69
+ PersistSuppliedOpenApiRequest: frozenObject(
70
+ {
71
+ documents: {
72
+ type: 'array',
73
+ minItems: 1,
74
+ items: schemaRef('PersistSuppliedOpenApiDocument')
75
+ }
76
+ },
77
+ ['documents']
78
+ ),
56
79
  WizardConfigRequest: frozenObject(
57
80
  {
58
81
  appName: { type: 'string' },
@@ -66,6 +89,23 @@ const OPENAPI_REQUEST_SCHEMAS = {
66
89
  },
67
90
  ['appName', 'source']
68
91
  ),
92
+ IntegrationDefinitionApplyRequest: frozenObject(
93
+ {
94
+ integrationDefinition: {
95
+ type: 'object',
96
+ additionalProperties: true,
97
+ description: 'Builder Integration Definition (aifabrix.builder.integrationDefinition).'
98
+ },
99
+ bid: {
100
+ type: 'object',
101
+ additionalProperties: true,
102
+ description: 'Alias for integrationDefinition.'
103
+ },
104
+ force: { type: 'boolean' },
105
+ dryRun: { type: 'boolean' }
106
+ },
107
+ ['integrationDefinition']
108
+ ),
69
109
  RepairRequest: frozenObject({
70
110
  dryRun: { type: 'boolean' },
71
111
  auth: { type: 'string' },
@@ -0,0 +1,101 @@
1
+ 'use strict';
2
+
3
+ const { frozenObject, schemaRef } = require('./openapi-schema-helpers');
4
+
5
+ const OPENAPI_RESULT_SCHEMA_OVERFLOW = {
6
+ LifecycleRunStep: frozenObject(
7
+ {
8
+ pillar: { type: 'string' },
9
+ success: { type: 'boolean' },
10
+ error: { type: 'string' }
11
+ },
12
+ ['pillar', 'success']
13
+ ),
14
+ LifecycleRunReport: frozenObject(
15
+ {
16
+ systemKey: schemaRef('SystemKey'),
17
+ certification: schemaRef('CertificationSummary')
18
+ },
19
+ ['systemKey']
20
+ ),
21
+ CertifyLifecycleRunResultData: frozenObject(
22
+ {
23
+ report: schemaRef('LifecycleRunReport'),
24
+ stepsRun: { type: 'array', items: schemaRef('LifecycleRunStep') }
25
+ },
26
+ ['report']
27
+ ),
28
+ CertifyResultData: {
29
+ oneOf: [
30
+ schemaRef('CertifyOperationsResultData'),
31
+ schemaRef('CertifyTrustResultData'),
32
+ schemaRef('CertifyGovernanceResultData'),
33
+ schemaRef('CertifyLifecycleRunResultData')
34
+ ]
35
+ },
36
+ LifecycleReportData: frozenObject(
37
+ {
38
+ systemKey: schemaRef('SystemKey'),
39
+ certification: schemaRef('CertificationSummary'),
40
+ operationalReadinessPercent: { type: 'number' },
41
+ summary: { type: 'boolean' },
42
+ details: { type: 'boolean' }
43
+ },
44
+ ['systemKey']
45
+ ),
46
+ EnterpriseMcpToolOutput: frozenObject({
47
+ success: { type: 'boolean' },
48
+ status: { type: 'string' },
49
+ message: { type: 'string' },
50
+ branch: { type: 'string' },
51
+ pullRequestUrl: { type: 'string', format: 'uri' },
52
+ syncDirection: schemaRef('RepositorySyncDirection'),
53
+ commitSha: { type: 'string' },
54
+ workflowRunId: { type: 'string' }
55
+ }),
56
+ WorkspaceRemoteUnavailable: frozenObject(
57
+ {
58
+ unavailable: { type: 'boolean', enum: [true] },
59
+ message: { type: 'string' }
60
+ },
61
+ ['unavailable', 'message']
62
+ ),
63
+ WorkspaceRemoteStatus: {
64
+ oneOf: [
65
+ schemaRef('EnterpriseMcpToolOutput'),
66
+ schemaRef('WorkspaceRemoteUnavailable'),
67
+ { type: 'null' }
68
+ ]
69
+ },
70
+ EnterpriseMcpInvocationData: frozenObject(
71
+ {
72
+ capabilityKey: { type: 'string' },
73
+ result: schemaRef('EnterpriseMcpToolOutput')
74
+ },
75
+ ['capabilityKey', 'result']
76
+ ),
77
+ WorkspaceStatusData: frozenObject(
78
+ {
79
+ local: schemaRef('SystemManifestData'),
80
+ remote: schemaRef('WorkspaceRemoteStatus')
81
+ },
82
+ ['local', 'remote']
83
+ ),
84
+ RepositoryStatusData: frozenObject(
85
+ {
86
+ capabilityKey: { type: 'string', enum: ['repository.status'] },
87
+ result: schemaRef('EnterpriseMcpToolOutput')
88
+ },
89
+ ['capabilityKey', 'result']
90
+ ),
91
+ HealthData: frozenObject({ status: { type: 'string', enum: ['ok'] } }, ['status']),
92
+ ReadyData: frozenObject(
93
+ {
94
+ status: { type: 'string', enum: ['ready'] },
95
+ dataplaneUrl: { type: ['string', 'null'], format: 'uri' }
96
+ },
97
+ ['status']
98
+ )
99
+ };
100
+
101
+ module.exports = { OPENAPI_RESULT_SCHEMA_OVERFLOW };
@@ -9,6 +9,7 @@
9
9
  'use strict';
10
10
 
11
11
  const { frozenObject, schemaRef, stringArraySchema } = require('./openapi-schema-helpers');
12
+ const { OPENAPI_RESULT_SCHEMA_OVERFLOW } = require('./openapi-result-schemas-overflow');
12
13
 
13
14
  /** @type {Record<string, Object>} */
14
15
  const OPENAPI_RESULT_SCHEMAS = {
@@ -19,9 +20,9 @@ const OPENAPI_RESULT_SCHEMAS = {
19
20
  title: { type: 'string' },
20
21
  status: { type: 'integer', minimum: 100, maximum: 599 },
21
22
  detail: { type: 'string' },
22
- instance: { type: 'string' },
23
+ instance: { type: 'string', format: 'uri' },
23
24
  correlationId: { type: 'string' },
24
- errors: { type: 'array', items: schemaRef('ProblemValidationError') }
25
+ errors: { type: 'array', items: schemaRef('ValidationError') }
25
26
  },
26
27
  ['type', 'title', 'status', 'detail', 'correlationId', 'instance', 'errors']
27
28
  ),
@@ -31,9 +32,15 @@ const OPENAPI_RESULT_SCHEMAS = {
31
32
  title: 'Unauthorized',
32
33
  status: 401,
33
34
  detail: 'Missing or invalid Bearer token.',
34
- instance: '/api/v1/builder/workspaces/me/systems',
35
+ instance: 'https://api.example.com/api/v1/builder/workspaces/me/systems',
35
36
  correlationId: '00000000-0000-4000-8000-000000000003',
36
- errors: []
37
+ errors: [
38
+ {
39
+ field: 'authorization',
40
+ message: 'Missing or invalid Bearer token.',
41
+ value: null
42
+ }
43
+ ]
37
44
  }
38
45
  }
39
46
  ),
@@ -41,14 +48,27 @@ const OPENAPI_RESULT_SCHEMAS = {
41
48
  ProblemDetails: {
42
49
  allOf: [schemaRef('ProblemDetail')]
43
50
  },
44
- ProblemValidationError: frozenObject(
51
+ ValidationError: Object.assign(
52
+ frozenObject(
53
+ {
54
+ field: { type: 'string' },
55
+ message: { type: 'string' },
56
+ value: { type: ['string', 'null'] }
57
+ },
58
+ ['field', 'message', 'value']
59
+ ),
45
60
  {
46
- field: { type: 'string' },
47
- message: { type: 'string' },
48
- value: { type: 'string' }
49
- },
50
- ['message']
61
+ example: {
62
+ field: 'authorization',
63
+ message: 'Missing or invalid Bearer token.',
64
+ value: null
65
+ }
66
+ }
51
67
  ),
68
+ /** Legacy alias — published REST requires ValidationError (OAPI-249/608). */
69
+ ProblemValidationError: {
70
+ allOf: [schemaRef('ValidationError')]
71
+ },
52
72
  LifecycleVerdict: {
53
73
  type: 'string',
54
74
  enum: ['VERIFIED', 'FAILED', 'NOT_VERIFIED', 'NOT_APPLICABLE']
@@ -109,6 +129,36 @@ const OPENAPI_RESULT_SCHEMAS = {
109
129
  },
110
130
  ['systemKey', 'meta']
111
131
  ),
132
+ PersistSuppliedOpenApiAcceptedFile: frozenObject(
133
+ {
134
+ filename: { type: 'string' },
135
+ path: { type: 'string' },
136
+ digest: { type: 'string' }
137
+ },
138
+ ['filename', 'path', 'digest']
139
+ ),
140
+ PersistSuppliedOpenApiRejectedFile: frozenObject(
141
+ {
142
+ filename: { type: 'string' },
143
+ reason: { type: 'string' },
144
+ detail: { type: 'string' }
145
+ },
146
+ ['filename', 'reason']
147
+ ),
148
+ PersistSuppliedOpenApiData: frozenObject(
149
+ {
150
+ accepted: {
151
+ type: 'array',
152
+ items: schemaRef('PersistSuppliedOpenApiAcceptedFile')
153
+ },
154
+ rejected: {
155
+ type: 'array',
156
+ items: schemaRef('PersistSuppliedOpenApiRejectedFile')
157
+ },
158
+ workspaceRoot: { type: 'string' }
159
+ },
160
+ ['accepted', 'rejected', 'workspaceRoot']
161
+ ),
112
162
  SystemManifestData: frozenObject(
113
163
  {
114
164
  systemKey: schemaRef('SystemKey'),
@@ -131,6 +181,21 @@ const OPENAPI_RESULT_SCHEMAS = {
131
181
  },
132
182
  ['systemKey', 'status']
133
183
  ),
184
+ IntegrationDefinitionApplyData: frozenObject(
185
+ {
186
+ status: {
187
+ type: 'string',
188
+ enum: ['created', 'updated', 'idempotent', 'dryRun']
189
+ },
190
+ systemKey: schemaRef('SystemKey'),
191
+ outputDir: { type: 'string' },
192
+ definitionId: { type: 'string' },
193
+ definitionHash: { type: 'string' },
194
+ packageVersion: { type: 'string' },
195
+ files: stringArraySchema()
196
+ },
197
+ ['status', 'systemKey']
198
+ ),
134
199
  RepairResultData: frozenObject(
135
200
  {
136
201
  updated: { type: 'boolean' },
@@ -397,95 +462,7 @@ const OPENAPI_RESULT_SCHEMAS = {
397
462
  },
398
463
  ['command', 'systemKey', 'verdict', 'enforcementScenarios', 'datasourceRows']
399
464
  ),
400
- LifecycleRunStep: frozenObject(
401
- {
402
- pillar: { type: 'string' },
403
- success: { type: 'boolean' },
404
- error: { type: 'string' }
405
- },
406
- ['pillar', 'success']
407
- ),
408
- LifecycleRunReport: frozenObject(
409
- {
410
- systemKey: schemaRef('SystemKey'),
411
- certification: schemaRef('CertificationSummary')
412
- },
413
- ['systemKey']
414
- ),
415
- CertifyLifecycleRunResultData: frozenObject(
416
- {
417
- report: schemaRef('LifecycleRunReport'),
418
- stepsRun: { type: 'array', items: schemaRef('LifecycleRunStep') }
419
- },
420
- ['report']
421
- ),
422
- CertifyResultData: {
423
- oneOf: [
424
- schemaRef('CertifyOperationsResultData'),
425
- schemaRef('CertifyTrustResultData'),
426
- schemaRef('CertifyGovernanceResultData'),
427
- schemaRef('CertifyLifecycleRunResultData')
428
- ]
429
- },
430
- LifecycleReportData: frozenObject(
431
- {
432
- systemKey: schemaRef('SystemKey'),
433
- certification: schemaRef('CertificationSummary'),
434
- operationalReadinessPercent: { type: 'number' },
435
- summary: { type: 'boolean' },
436
- details: { type: 'boolean' }
437
- },
438
- ['systemKey']
439
- ),
440
- EnterpriseMcpToolOutput: frozenObject({
441
- success: { type: 'boolean' },
442
- status: { type: 'string' },
443
- message: { type: 'string' },
444
- branch: { type: 'string' },
445
- pullRequestUrl: { type: 'string', format: 'uri' },
446
- syncDirection: schemaRef('RepositorySyncDirection'),
447
- commitSha: { type: 'string' },
448
- workflowRunId: { type: 'string' }
449
- }),
450
- WorkspaceRemoteUnavailable: frozenObject(
451
- {
452
- unavailable: { type: 'boolean', enum: [true] },
453
- message: { type: 'string' }
454
- },
455
- ['unavailable', 'message']
456
- ),
457
- WorkspaceRemoteStatus: {
458
- oneOf: [schemaRef('EnterpriseMcpToolOutput'), schemaRef('WorkspaceRemoteUnavailable'), { type: 'null' }]
459
- },
460
- EnterpriseMcpInvocationData: frozenObject(
461
- {
462
- capabilityKey: { type: 'string' },
463
- result: schemaRef('EnterpriseMcpToolOutput')
464
- },
465
- ['capabilityKey', 'result']
466
- ),
467
- WorkspaceStatusData: frozenObject(
468
- {
469
- local: schemaRef('SystemManifestData'),
470
- remote: schemaRef('WorkspaceRemoteStatus')
471
- },
472
- ['local', 'remote']
473
- ),
474
- RepositoryStatusData: frozenObject(
475
- {
476
- capabilityKey: { type: 'string', enum: ['repository.status'] },
477
- result: schemaRef('EnterpriseMcpToolOutput')
478
- },
479
- ['capabilityKey', 'result']
480
- ),
481
- HealthData: frozenObject({ status: { type: 'string', enum: ['ok'] } }, ['status']),
482
- ReadyData: frozenObject(
483
- {
484
- status: { type: 'string', enum: ['ready'] },
485
- dataplaneUrl: { type: ['string', 'null'], format: 'uri' }
486
- },
487
- ['status']
488
- )
465
+ ...OPENAPI_RESULT_SCHEMA_OVERFLOW
489
466
  };
490
467
 
491
468
  module.exports = {
@@ -28,18 +28,21 @@ const CORE_SCHEMA_DESCRIPTIONS = {
28
28
  title: 'Short human-readable error title.',
29
29
  status: 'HTTP status code echoed in the body.',
30
30
  detail: 'Actionable error detail safe for operators and agents.',
31
- instance: 'Request path or instance identifier.',
31
+ instance: 'Request URL for this occurrence (URI).',
32
32
  correlationId: 'Correlation id for log lookup across services.',
33
- errors: 'Field-level validation errors when status is 400.'
33
+ errors: 'Field-level validation errors (non-empty when status is 400/422).'
34
34
  },
35
35
  ProblemDetails: {
36
36
  _schema: 'Alias of ProblemDetail (allOf) for backward-compatible $refs.'
37
37
  },
38
- ProblemValidationError: {
38
+ ValidationError: {
39
39
  _schema: 'Single field validation error inside ProblemDetail.errors.',
40
40
  field: 'JSON pointer or field name that failed validation.',
41
41
  message: 'Validation failure message.',
42
- value: 'Rejected value when safe to echo (may be omitted for secrets).'
42
+ value: 'Rejected value when safe to echo (null when omitted for secrets).'
43
+ },
44
+ ProblemValidationError: {
45
+ _schema: 'Legacy alias of ValidationError (allOf) for older $refs.'
43
46
  },
44
47
  LifecycleVerdict: {
45
48
  _schema: 'Lifecycle verification outcome: VERIFIED, FAILED, NOT_VERIFIED, or NOT_APPLICABLE.'
@@ -75,6 +78,24 @@ const CORE_SCHEMA_DESCRIPTIONS = {
75
78
  _schema: 'Payload for listSystems: integration keys under the authenticated user.',
76
79
  systems: 'Workspace summaries ordered by systemKey.'
77
80
  },
81
+ PersistSuppliedOpenApiData: {
82
+ _schema: 'Findings for persistSuppliedOpenApi (accepted and rejected files).',
83
+ accepted: 'Successfully validated and written OpenAPI files.',
84
+ rejected: 'Documents that failed validation (no success claim).',
85
+ workspaceRoot: 'Absolute workspace integration root for this user.'
86
+ },
87
+ PersistSuppliedOpenApiAcceptedFile: {
88
+ _schema: 'One accepted OpenAPI file written under the workspace.',
89
+ filename: 'Basename written under openapi/.',
90
+ path: 'Workspace-relative path including integration/<systemKey>/openapi/.',
91
+ digest: 'sha256 digest of the serialized JSON body.'
92
+ },
93
+ PersistSuppliedOpenApiRejectedFile: {
94
+ _schema: 'One rejected OpenAPI document (not written).',
95
+ filename: 'Requested basename when available.',
96
+ reason: 'Stable rejection reason code (openapi.invalid, …).',
97
+ detail: 'Human-readable validation detail.'
98
+ },
78
99
  CreateSystemData: {
79
100
  _schema: 'Payload after createSystem: new workspace folder and metadata.',
80
101
  systemKey: 'Created integration system key.',
@@ -12,7 +12,7 @@
12
12
  const HELP_SCHEMA_DESCRIPTIONS = Object.freeze({
13
13
  BuilderHelpTopic: {
14
14
  _schema:
15
- 'Help topic enum: overview, sections, section, dependencyGraph, repairRules, workflow, schemaCatalog, subscriptionGuide, cipOverview, goldenExamples, goldenExample, evidencePatterns, evidencePattern.'
15
+ 'Help topic enum including resourceTypeCatalog (taxonomy keys for BID datasources[].resourceType), overview, sections, schemaCatalog, platformRoles, dimensionsGuide, and related bootstrap topics.'
16
16
  },
17
17
  BuilderHelpData: {
18
18
  _schema: 'Deterministic LLM help payload for one topic (read-only product documentation).',
@@ -35,6 +35,25 @@ const OPERATIONS_SCHEMA_DESCRIPTIONS = {
35
35
  _schema: 'Request body to create an empty integration workspace folder.',
36
36
  systemKey: 'Unique integration system key for the new workspace.'
37
37
  },
38
+ PersistSuppliedOpenApiDocument: {
39
+ _schema: 'One Runtime-authorized OpenAPI document to persist.',
40
+ filename: 'Target basename under openapi/ (no path segments).',
41
+ name: 'Optional alias for filename.',
42
+ mediaType: 'Optional media type (application/json).',
43
+ digest: 'Optional sha256 digest of the serialized body for integrity check.',
44
+ body: 'OpenAPI document object or JSON string resolved by Runtime before CIP.'
45
+ },
46
+ PersistSuppliedOpenApiRequest: {
47
+ _schema: 'Request body for persistSuppliedOpenApi.',
48
+ documents: 'One or more authorized OpenAPI documents to validate and write.'
49
+ },
50
+ PersistSuppliedOpenApiResponse: {
51
+ _schema: '200 response envelope for persistSuppliedOpenApi.',
52
+ success: 'Always true for successful builder-api JSON responses.',
53
+ data: 'Typed payload; see PersistSuppliedOpenApiData.',
54
+ correlationId: 'UUID correlating logs for this request.',
55
+ requestId: 'Optional per-request UUID when emitted by the server.'
56
+ },
38
57
  WizardConfigRequest: {
39
58
  _schema: 'Headless wizard configuration to generate system and datasource JSON.',
40
59
  appName: 'Integration app folder name under the user workspace.',
@@ -46,6 +65,30 @@ const OPERATIONS_SCHEMA_DESCRIPTIONS = {
46
65
  preferences: 'Optional expose, RBAC, and sync generation flags.',
47
66
  debug: 'When true, enable verbose wizard logging (also available as query param).'
48
67
  },
68
+ IntegrationDefinitionApplyRequest: {
69
+ _schema: 'Apply a Builder Integration Definition (BID) into the workspace package.',
70
+ integrationDefinition: 'BID document (aifabrix.builder.integrationDefinition).',
71
+ bid: 'Alias for integrationDefinition.',
72
+ force: 'When true, rewrite package even if definitionHash matches stamp.',
73
+ dryRun: 'When true, return planned files without writing.'
74
+ },
75
+ IntegrationDefinitionApplyResponse: {
76
+ _schema: '200 response envelope for applyIntegrationDefinition.',
77
+ success: 'Always true for successful builder-api JSON responses.',
78
+ data: 'Typed payload; see IntegrationDefinitionApplyData.',
79
+ correlationId: 'UUID correlating logs for this request.',
80
+ requestId: 'Optional per-request UUID when emitted by the server.'
81
+ },
82
+ IntegrationDefinitionApplyData: {
83
+ _schema: 'Typed apply result payload.',
84
+ status: 'created, updated, unchanged, or dryRun.',
85
+ systemKey: 'Integration system key that was materialized.',
86
+ outputDir: 'Absolute workspace integration directory.',
87
+ definitionId: 'BID definitionId.',
88
+ definitionHash: 'Canonical definitionHash written to stamp.',
89
+ packageVersion: 'Package version from packageIdentity.',
90
+ files: 'Relative package file names written or planned.'
91
+ },
49
92
  RepairRequest: {
50
93
  _schema: 'Optional flags for workspace repair aligning manifest files with on-disk JSON.',
51
94
  dryRun: 'Preview repair actions without writing files.',
@@ -41,14 +41,14 @@ function stringArraySchema() {
41
41
  * @returns {Object}
42
42
  */
43
43
  function buildSuccessEnvelopeSchema(dataSchemaName) {
44
- const dataExamples = {
45
- HealthData: { status: 'ok' },
46
- ReadyData: { status: 'ready', dataplaneUrl: 'http://localhost:3601' },
47
- ListSystemsData: { systems: [] },
48
- EmptyResultData: {},
49
- WorkspaceStatusData: { status: 'ready' },
50
- RepositoryStatusData: { status: 'ready' }
51
- };
44
+ const { OPENAPI_ENVELOPE_DATA_EXAMPLES } = require('./openapi-envelope-examples');
45
+ const dataExample = OPENAPI_ENVELOPE_DATA_EXAMPLES[dataSchemaName];
46
+ if (dataExample === undefined) {
47
+ throw new Error(
48
+ `Missing OpenAPI envelope data example for ${dataSchemaName} (OAPI-136). ` +
49
+ 'Add it to lib/programmatic/openapi-envelope-examples.js'
50
+ );
51
+ }
52
52
  const schema = frozenObject(
53
53
  {
54
54
  success: { type: 'boolean', enum: [true] },
@@ -60,7 +60,7 @@ function buildSuccessEnvelopeSchema(dataSchemaName) {
60
60
  );
61
61
  schema.example = {
62
62
  success: true,
63
- data: dataExamples[dataSchemaName] || {},
63
+ data: dataExample,
64
64
  correlationId: '00000000-0000-4000-8000-000000000001',
65
65
  requestId: '00000000-0000-4000-8000-000000000002'
66
66
  };
@@ -73,7 +73,7 @@ function buildStandardErrorResponses() {
73
73
  * @returns {boolean}
74
74
  */
75
75
  function requiresBearerAuth(handlerId) {
76
- return handlerId !== 'health' && handlerId !== 'ready';
76
+ return handlerId !== 'health' && handlerId !== 'ready' && handlerId !== 'getBuilderHelp';
77
77
  }
78
78
 
79
79
  /**
@@ -149,10 +149,20 @@ function buildOpenApiTags() {
149
149
  { name: 'template', description: 'Enterprise MCP template.materializeWorkspace and workspace reset.' },
150
150
  { name: 'repository', description: 'Enterprise MCP repository.sync, createReview, status, dispatchPipeline.' },
151
151
  { name: 'infra', description: 'Liveness and readiness probes (no authentication).' },
152
+ {
153
+ name: 'help',
154
+ description:
155
+ 'Deterministic LLM help topics (resourceTypeCatalog, schemaCatalog, …). No authentication.'
156
+ },
152
157
  {
153
158
  name: 'evidence',
154
159
  description:
155
160
  'BTA-facing Evidence authoring: metadata, download, upload (validate+certify), and human-gated activate.'
161
+ },
162
+ {
163
+ name: 'channel',
164
+ description:
165
+ 'Discovery-driven channel packaging (Copilot, ChatGPT, Slack, Teams): build, summary, ZIP, branding.'
156
166
  }
157
167
  ];
158
168
  }
@@ -71,6 +71,16 @@ const ORCHESTRATION_TAG_CATALOG = Object.freeze({
71
71
  resourceType: 'role-evidence',
72
72
  permissionClass: 'evidence',
73
73
  displayName: 'Evidence'
74
+ },
75
+ channel: {
76
+ resourceType: 'channel',
77
+ permissionClass: 'channel',
78
+ displayName: 'Channel'
79
+ },
80
+ help: {
81
+ resourceType: 'document',
82
+ permissionClass: 'read',
83
+ displayName: 'Help'
74
84
  }
75
85
  });
76
86